diff --git a/CMakeLists.txt b/CMakeLists.txt
index d4c57bb2b9..bc9b9ea508 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -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")
diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj
index ec394a2f9b..be9e413636 100644
--- a/OpenRCT2.xcodeproj/project.pbxproj
+++ b/OpenRCT2.xcodeproj/project.pbxproj
@@ -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;
diff --git a/openrct2.proj b/openrct2.proj
index 89e6a3f233..9eba947523 100644
--- a/openrct2.proj
+++ b/openrct2.proj
@@ -46,8 +46,8 @@
058b9df80244c03f1633cb06e9f70471a29ebb8e
https://github.com/OpenRCT2/title-sequences/releases/download/v0.1.2c/title-sequences.zip
304d13a126c15bf2c86ff13b81a2f2cc1856ac8d
- https://github.com/OpenRCT2/objects/releases/download/v1.0.14/objects.zip
- 31a0ed0047b4bdb1428071044130192b3c0a30fa
+ https://github.com/OpenRCT2/objects/releases/download/v1.0.15/objects.zip
+ dfd5864cf7d0449c0fb280c5c6b902a24816df6c
https://github.com/OpenRCT2/replays/releases/download/v0.0.13/replays.zip
75598ff319fa18da782e38feb69b65d6d69d1458
diff --git a/shell.nix b/shell.nix
index 4c76dc53a2..d8353f7019 100644
--- a/shell.nix
+++ b/shell.nix
@@ -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 {
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/network/Network.cpp b/src/openrct2/network/Network.cpp
index 827dc14733..fcb2aad157 100644
--- a/src/openrct2/network/Network.cpp
+++ b/src/openrct2/network/Network.cpp
@@ -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;
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 b80392befa..3e3625580b 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