mirror of https://github.com/OpenRCT2/OpenRCT2.git
Move build menu preference to objects themselves
This commit is contained in:
parent
e2b187c24a
commit
c77d500394
|
@ -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))
|
||||
|
|
|
@ -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,
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue