Move build menu preference to objects themselves

This commit is contained in:
Gymnasiast 2020-06-17 20:01:22 +02:00
parent e2b187c24a
commit c77d500394
No known key found for this signature in database
GPG Key ID: DBFFF47AB2CA3EDD
5 changed files with 12 additions and 153 deletions

View File

@ -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))

View File

@ -50,7 +50,11 @@ void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream)
_legacyType.second_vehicle = stream->ReadValue<uint8_t>();
_legacyType.rear_vehicle = stream->ReadValue<uint8_t>();
_legacyType.third_vehicle = stream->ReadValue<uint8_t>();
_legacyType.pad_019 = stream->ReadValue<uint8_t>();
_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<uint32_t>(
properties,
{

View File

@ -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;

View File

@ -245,127 +245,3 @@ const RideGroup* RideGroupManager::RideGroupFind(const uint8_t rideType, const u
return nullptr;
}
}
const std::vector<const char*> RideGroupManager::GetPreferredRideEntryOrder(const uint8_t rideType)
{
// clang-format off
static const std::vector<const char *> 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<const char*> 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;
}

View File

@ -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<const char*> GetPreferredRideEntryOrder(const uint8_t rideType);
static int32_t VehiclePreferenceCompare(const uint8_t rideType, const char* a, const char* b);
};
enum RideGroupFlags : uint8_t