From c77d5003945e07a6c18d38fb3d263eb003cf45df Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Wed, 17 Jun 2020 20:01:22 +0200 Subject: [PATCH] Move build menu preference to objects themselves --- src/openrct2-ui/windows/NewRide.cpp | 29 +----- src/openrct2/object/RideObject.cpp | 7 +- src/openrct2/ride/Ride.h | 2 +- src/openrct2/ride/RideGroupManager.cpp | 124 ------------------------- src/openrct2/ride/RideGroupManager.h | 3 - 5 files changed, 12 insertions(+), 153 deletions(-) diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index 7669b6a230..628c1e1826 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -347,18 +347,13 @@ static RideSelection* window_new_ride_iterate_over_ride_group( bool buttonForRideTypeCreated = false; bool allowDrawingOverLastButton = false; - char preferredVehicleName[DAT_NAME_LENGTH + 1]; - safe_strcpy(preferredVehicleName, " ", sizeof(preferredVehicleName)); + uint8_t highestVehiclePriority = 0; // For each ride entry for this ride type auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); auto& rideEntries = objManager.GetAllRideEntries(rideType); for (auto rideEntryIndex : rideEntries) { - char rideEntryName[DAT_NAME_LENGTH + 1]; - std::memcpy(rideEntryName, object_entry_get_entry(OBJECT_TYPE_RIDE, rideEntryIndex)->name, 8); - rideEntryName[DAT_NAME_LENGTH] = 0; - // Skip if vehicle type is not invented yet if (!ride_entry_is_invented(rideEntryIndex) && !gCheatsIgnoreResearchStatus) continue; @@ -376,26 +371,12 @@ static RideSelection* window_new_ride_iterate_over_ride_group( } // Skip if the vehicle isn't the preferred vehicle for this generic track type - if (!RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) + if (!RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY) + && highestVehiclePriority > rideEntry->BuildMenuPriority) { - if (strcmp(preferredVehicleName, " \0") == 0) - { - safe_strcpy(preferredVehicleName, rideEntryName, sizeof(preferredVehicleName)); - preferredVehicleName[DAT_NAME_LENGTH] = 0; - } - else - { - if (RideGroupManager::VehiclePreferenceCompare(rideType, preferredVehicleName, rideEntryName) == 1) - { - safe_strcpy(preferredVehicleName, rideEntryName, sizeof(preferredVehicleName)); - preferredVehicleName[DAT_NAME_LENGTH] = 0; - } - else - { - continue; - } - } + continue; } + highestVehiclePriority = rideEntry->BuildMenuPriority; // Determines how and where to draw a button for this ride type/vehicle. if (RideTypeDescriptors[rideType].HasFlag(RIDE_TYPE_FLAG_LIST_VEHICLES_SEPARATELY)) diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 110d33ddf3..4828f424ed 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -50,7 +50,11 @@ void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream) _legacyType.second_vehicle = stream->ReadValue(); _legacyType.rear_vehicle = stream->ReadValue(); _legacyType.third_vehicle = stream->ReadValue(); - _legacyType.pad_019 = stream->ReadValue(); + + _legacyType.BuildMenuPriority = 0; + // Skip pad_019 + stream->Seek(1, STREAM_SEEK_CURRENT); + for (auto& vehicleEntry : _legacyType.vehicles) { ReadLegacyVehicle(context, stream, &vehicleEntry); @@ -621,6 +625,7 @@ void RideObject::ReadJson(IReadObjectContext* context, const json_t* root) auto availableTrackPieces = ObjectJsonHelpers::GetJsonStringArray(json_object_get(properties, "availableTrackPieces")); } + _legacyType.BuildMenuPriority = ObjectJsonHelpers::GetInteger(properties, "buildMenuPriority", 0); _legacyType.flags |= ObjectJsonHelpers::GetFlags( properties, { diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 05a2b0285a..aa0c1d87f1 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -117,7 +117,7 @@ struct rct_ride_entry uint8_t second_vehicle; uint8_t rear_vehicle; uint8_t third_vehicle; - uint8_t pad_019; + uint8_t BuildMenuPriority; rct_ride_entry_vehicle vehicles[RCT2_MAX_VEHICLES_PER_RIDE_ENTRY]; vehicle_colour_preset_list* vehicle_preset_list; int8_t excitement_multiplier; diff --git a/src/openrct2/ride/RideGroupManager.cpp b/src/openrct2/ride/RideGroupManager.cpp index 43c67ee5e0..57ea49d0c8 100644 --- a/src/openrct2/ride/RideGroupManager.cpp +++ b/src/openrct2/ride/RideGroupManager.cpp @@ -245,127 +245,3 @@ const RideGroup* RideGroupManager::RideGroupFind(const uint8_t rideType, const u return nullptr; } } - -const std::vector RideGroupManager::GetPreferredRideEntryOrder(const uint8_t rideType) -{ - // clang-format off - static const std::vector preferredRideEntryOrder[] = - { - { "SPDRCR " }, // RIDE_TYPE_SPIRAL_ROLLER_COASTER - { "TOGST " }, // RIDE_TYPE_STAND_UP_ROLLER_COASTER - { "ARRSW1 ", "VEKVAMP ", "ARRSW2 " }, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER - { "NEMT " }, // RIDE_TYPE_INVERTED_ROLLER_COASTER - { "ZLDB ", "ZLOG ", "ZPANDA " }, // RIDE_TYPE_JUNIOR_ROLLER_COASTER - { "NRL ", "NRL2 ", "AML1 ", "TRAM1 " }, // RIDE_TYPE_MINIATURE_RAILWAY - { "MONO1 ", "MONO2 ", "MONO3 " }, // RIDE_TYPE_MONORAIL - { "BATFL ", "SKYTR "}, // RIDE_TYPE_MINI_SUSPENDED_COASTER - { "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ", "JSKI " }, // RIDE_TYPE_BOAT_HIRE - { "WMOUSE ", "WMMINE "}, // RIDE_TYPE_WOODEN_WILD_MOUSE - { "STEEP1 ", "STEEP2 ", "SBOX " }, // RIDE_TYPE_STEEPLECHASE - { "SPCAR ", "RCR ", "TRUCK1 ", "VCR ", "CTCAR " }, // RIDE_TYPE_CAR_RIDE - { "SSC1 " }, // RIDE_TYPE_LAUNCHED_FREEFALL - { "BOB1 ", "INTBOB " }, // RIDE_TYPE_BOBSLEIGH_COASTER - { "OBS1 ", "OBS2 " }, // RIDE_TYPE_OBSERVATION_TOWER - { "SCHT1 " }, // RIDE_TYPE_LOOPING_ROLLER_COASTER - { "DING1 " }, // RIDE_TYPE_DINGHY_SLIDE - { "AMT1 " }, // RIDE_TYPE_MINE_TRAIN_COASTER - { "CLIFT1 ", "CLIFT2 " }, // RIDE_TYPE_CHAIRLIFT - { "ARRT1 ", "ARRT2 " }, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER - { }, // RIDE_TYPE_MAZE - { }, // RIDE_TYPE_SPIRAL_SLIDE - { "KART1 " }, // RIDE_TYPE_GO_KARTS - { "LFB1 " }, // RIDE_TYPE_LOG_FLUME - { "RAPBOAT " }, // RIDE_TYPE_RIVER_RAPIDS - { }, // RIDE_TYPE_DODGEMS - { }, // RIDE_TYPE_SWINGING_SHIP - { }, // RIDE_TYPE_SWINGING_INVERTER_SHIP - { }, // RIDE_TYPE_FOOD_STALL - { }, // RIDE_TYPE_1D - { }, // RIDE_TYPE_DRINK_STALL - { }, // RIDE_TYPE_1F - { }, // RIDE_TYPE_SHOP - { }, // RIDE_TYPE_MERRY_GO_ROUND - { }, // RIDE_TYPE_22 - { }, // RIDE_TYPE_INFORMATION_KIOSK - { }, // RIDE_TYPE_TOILETS - { }, // RIDE_TYPE_FERRIS_WHEEL - { }, // RIDE_TYPE_MOTION_SIMULATOR - { }, // RIDE_TYPE_3D_CINEMA - { }, // RIDE_TYPE_TOP_SPIN - { }, // RIDE_TYPE_SPACE_RINGS - { "REVF1 " }, // RIDE_TYPE_REVERSE_FREEFALL_COASTER - { "LIFT1 " }, // RIDE_TYPE_LIFT - { "BMVD " }, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER - { }, // RIDE_TYPE_CASH_MACHINE - { }, // RIDE_TYPE_TWIST - { }, // RIDE_TYPE_HAUNTED_HOUSE - { }, // RIDE_TYPE_FIRST_AID - { }, // RIDE_TYPE_CIRCUS - { "GTC ", "HMCAR " }, // RIDE_TYPE_GHOST_TRAIN - { "BMSD ", "BMSU ", "BMFL ", "BMRB ", "GOLTR " }, // RIDE_TYPE_TWISTER_ROLLER_COASTER - { "PTCT1 ", "MFT ", "PTCT2 " }, // RIDE_TYPE_WOODEN_ROLLER_COASTER - { "SFRIC1 " }, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER - { "SMC1 ", "SMC2 ", "WMSPIN " }, // RIDE_TYPE_STEEL_WILD_MOUSE - { "ARRX " }, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER - { }, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT - { "BMAIR " }, // RIDE_TYPE_FLYING_ROLLER_COASTER - { }, // RIDE_TYPE_FLYING_ROLLER_COASTER_ALT - { "VREEL " }, // RIDE_TYPE_VIRGINIA_REEL - { "SPBOAT " }, // RIDE_TYPE_SPLASH_BOATS - { "HELICAR " }, // RIDE_TYPE_MINI_HELICOPTERS - { "VEKST " }, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER - { "SMONO " }, // RIDE_TYPE_SUSPENDED_MONORAIL - { }, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT - { "REVCAR " }, // RIDE_TYPE_REVERSER_ROLLER_COASTER - { "UTCAR ", "UTCARR " }, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER - { }, // RIDE_TYPE_MINI_GOLF - { "INTST " }, // RIDE_TYPE_GIGA_COASTER - { "GDROP1 " }, // RIDE_TYPE_ROTO_DROP - { }, // RIDE_TYPE_FLYING_SAUCERS - { }, // RIDE_TYPE_CROOKED_HOUSE - { "MONBK " }, // RIDE_TYPE_MONORAIL_CYCLES - { "SLCT ", "SLCFO ", "VEKDV " }, // RIDE_TYPE_COMPACT_INVERTED_COASTER - { "CSTBOAT " }, // RIDE_TYPE_WATER_COASTER - { "THCAR " }, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER - { "IVMC1 " }, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER - { }, // RIDE_TYPE_MAGIC_CARPET - { "SUBMAR " }, // RIDE_TYPE_SUBMARINE_RIDE - { "RFTBOAT " }, // RIDE_TYPE_RIVER_RAFTS - { }, // RIDE_TYPE_50 - { }, // RIDE_TYPE_ENTERPRISE - { }, // RIDE_TYPE_52 - { }, // RIDE_TYPE_53 - { }, // RIDE_TYPE_54 - { }, // RIDE_TYPE_55 - { "INTINV " }, // RIDE_TYPE_INVERTED_IMPULSE_COASTER - { "WCATC ", "RCKC ", "JSTAR1 " }, // RIDE_TYPE_MINI_ROLLER_COASTER - { "PMT1 " }, // RIDE_TYPE_MINE_RIDE - { }, // RIDE_TYPE_59 - { "PREMT1 " }, // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER - }; - // clang-format on - return preferredRideEntryOrder[rideType]; -} - -/** - * This function keeps a list of the preferred vehicle for every generic track - * type, out of the available vehicle types in the current game. It determines - * which picture is shown on the new ride tab and which train type is selected - * by default. - */ -int32_t RideGroupManager::VehiclePreferenceCompare(const uint8_t rideType, const char* a, const char* b) -{ - std::vector rideEntryOrder = RideGroupManager::GetPreferredRideEntryOrder(rideType); - for (const char* object : rideEntryOrder) - { - if (String::Equals(object, a, true)) - { - return -1; - } - if (String::Equals(object, b, true)) - { - return 1; - } - } - return 0; -} diff --git a/src/openrct2/ride/RideGroupManager.h b/src/openrct2/ride/RideGroupManager.h index 386e756a4d..9b79cb3018 100644 --- a/src/openrct2/ride/RideGroupManager.h +++ b/src/openrct2/ride/RideGroupManager.h @@ -33,9 +33,6 @@ class RideGroupManager public: static const RideGroup* GetRideGroup(const uint8_t trackType, const rct_ride_entry* rideEntry); static const RideGroup* RideGroupFind(const uint8_t rideType, const uint8_t index); - - static const std::vector GetPreferredRideEntryOrder(const uint8_t rideType); - static int32_t VehiclePreferenceCompare(const uint8_t rideType, const char* a, const char* b); }; enum RideGroupFlags : uint8_t