Merge pull request #11976 from Gymnasiast/refactor/vehicle-preference

Move build menu preference to objects themselves
This commit is contained in:
Michael Steenbeek 2020-06-17 23:41:10 +02:00 committed by GitHub
commit 5e8a3a709d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 20 additions and 161 deletions

View File

@ -26,8 +26,8 @@ set(CMAKE_MACOSX_RPATH 1)
set(TITLE_SEQUENCE_URL "https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip")
set(TITLE_SEQUENCE_SHA1 "304d13a126c15bf2c86ff13b81a2f2cc1856ac8d")
set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v1.0.14/objects.zip")
set(OBJECTS_SHA1 "31a0ed0047b4bdb1428071044130192b3c0a30fa")
set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v1.0.15/objects.zip")
set(OBJECTS_SHA1 "dfd5864cf7d0449c0fb280c5c6b902a24816df6c")
set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v0.0.13/replays.zip")
set(REPLAYS_SHA1 "75598ff319fa18da782e38feb69b65d6d69d1458")

View File

@ -3858,7 +3858,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "version=\"1.0.14\"\nzipname=\"objects.zip\"\nliburl=\"https://github.com/OpenRCT2/objects/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/data/object\" || ! -e \"${SRCROOT}/objectsversion\" || $(head -n 1 \"${SRCROOT}/objectsversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/data/object\" ]]; then rm -r \"${SRCROOT}/data/object\"; fi\nmkdir -p \"${SRCROOT}/data/object\"\n\ncurl -L -o \"${SRCROOT}/data/object/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/data/object\" \"${SRCROOT}/data/object/$zipname\"\nrm \"${SRCROOT}/data/object/$zipname\"\n\necho $version > \"${SRCROOT}/objectsversion\"\nfi";
shellScript = "version=\"1.0.15\"\nzipname=\"objects.zip\"\nliburl=\"https://github.com/OpenRCT2/objects/releases/download/v$version/$zipname\"\n\n[[ ! -d \"${SRCROOT}/data/object\" || ! -e \"${SRCROOT}/objectsversion\" || $(head -n 1 \"${SRCROOT}/objectsversion\") != $version ]]\noutdated=$?\n\nif [[ $outdated -eq 0 ]]; then\nif [[ -d \"${SRCROOT}/data/object\" ]]; then rm -r \"${SRCROOT}/data/object\"; fi\nmkdir -p \"${SRCROOT}/data/object\"\n\ncurl -L -o \"${SRCROOT}/data/object/$zipname\" \"$liburl\"\nunzip -uaq -d \"${SRCROOT}/data/object\" \"${SRCROOT}/data/object/$zipname\"\nrm \"${SRCROOT}/data/object/$zipname\"\n\necho $version > \"${SRCROOT}/objectsversion\"\nfi";
};
C68B2D471EC790710020651C /* Download Libraries */ = {
isa = PBXShellScriptBuildPhase;

View File

@ -46,8 +46,8 @@
<GtestSha1>058b9df80244c03f1633cb06e9f70471a29ebb8e</GtestSha1>
<TitleSequencesUrl>https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip</TitleSequencesUrl>
<TitleSequencesSha1>304d13a126c15bf2c86ff13b81a2f2cc1856ac8d</TitleSequencesSha1>
<ObjectsUrl>https://github.com/OpenRCT2/objects/releases/download/v1.0.14/objects.zip</ObjectsUrl>
<ObjectsSha1>31a0ed0047b4bdb1428071044130192b3c0a30fa</ObjectsSha1>
<ObjectsUrl>https://github.com/OpenRCT2/objects/releases/download/v1.0.15/objects.zip</ObjectsUrl>
<ObjectsSha1>dfd5864cf7d0449c0fb280c5c6b902a24816df6c</ObjectsSha1>
<ReplaysUrl>https://github.com/OpenRCT2/replays/releases/download/v0.0.13/replays.zip</ReplaysUrl>
<ReplaysSha1>75598ff319fa18da782e38feb69b65d6d69d1458</ReplaysSha1>
</PropertyGroup>

View File

@ -15,8 +15,8 @@ let
objects-src = pkgs.fetchFromGitHub {
owner = "OpenRCT2";
repo = "objects";
rev = "v1.0.14";
sha256 = "574477ddcdfdd4d827ce1a0fbc4971cbb56df561dcfff7151c62a9878d3bbb54";
rev = "v1.0.15";
sha256 = "0171907a267c564071e587fc683bfe75f36b891a6769e0bd49a6fc46f2ae7ded";
};
title-sequences-src = pkgs.fetchFromGitHub {

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

@ -32,7 +32,7 @@
// This string specifies which version of network stream current build uses.
// It is used for making sure only compatible builds get connected, even within
// single OpenRCT2 version.
#define NETWORK_STREAM_VERSION "18"
#define NETWORK_STREAM_VERSION "19"
#define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION
static Peep* _pickup_peep = nullptr;

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