From 49ccc21d8445643c23f9e62b138ab542e1686441 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sat, 12 Feb 2022 20:12:12 +0100 Subject: [PATCH] Fix #16576: Cannot select vehicle types with entry index >= 256 --- src/openrct2-ui/windows/Ride.cpp | 2 +- src/openrct2/actions/RideSetVehicleAction.cpp | 5 +++-- src/openrct2/actions/RideSetVehicleAction.h | 6 ++++-- src/openrct2/ride/Ride.cpp | 6 +++--- src/openrct2/ride/Ride.h | 2 +- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 6717f8a503..e21d77ff37 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -926,7 +926,7 @@ static std::vector RideDropdownData; // Used for sorting the vehicle type dropdown. struct VehicleTypeLabel { - int32_t subtype_id; + ObjectEntryIndex subtype_id; rct_string_id label_id; const char* label_string; }; diff --git a/src/openrct2/actions/RideSetVehicleAction.cpp b/src/openrct2/actions/RideSetVehicleAction.cpp index 5a9b351ab8..d146d4d2d3 100644 --- a/src/openrct2/actions/RideSetVehicleAction.cpp +++ b/src/openrct2/actions/RideSetVehicleAction.cpp @@ -31,7 +31,7 @@ constexpr static rct_string_id SetVehicleTypeErrorTitle[] = { STR_RIDE_SET_VEHICLE_TYPE_FAIL, }; -RideSetVehicleAction::RideSetVehicleAction(RideId rideIndex, RideSetVehicleType type, uint8_t value, uint8_t colour) +RideSetVehicleAction::RideSetVehicleAction(RideId rideIndex, RideSetVehicleType type, uint16_t value, uint8_t colour) : _rideIndex(rideIndex) , _type(type) , _value(value) @@ -152,7 +152,8 @@ GameActions::Result RideSetVehicleAction::Execute() const log_warning("Invalid ride entry, ride->subtype = %d", ride->subtype); return GameActions::Result(GameActions::Status::InvalidParameters, errTitle, STR_NONE); } - auto clampValue = _value; + uint8_t clampValue = _value; + static_assert(sizeof(clampValue) == sizeof(ride->proposed_num_cars_per_train)); if (!gCheatsDisableTrainLengthLimit) { clampValue = std::clamp(clampValue, rideEntry->min_cars_in_train, rideEntry->max_cars_in_train); diff --git a/src/openrct2/actions/RideSetVehicleAction.h b/src/openrct2/actions/RideSetVehicleAction.h index 78278607f3..588679d142 100644 --- a/src/openrct2/actions/RideSetVehicleAction.h +++ b/src/openrct2/actions/RideSetVehicleAction.h @@ -24,12 +24,12 @@ class RideSetVehicleAction final : public GameActionBase= sizeof(ObjectEntryIndex)); }; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index d03c1aa8ad..7d5ed7b4a0 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -5146,10 +5146,10 @@ void Ride::UpdateNumberOfCircuits() } } -void Ride::SetRideEntry(int32_t rideEntry) +void Ride::SetRideEntry(ObjectEntryIndex entryIndex) { - auto colour = ride_get_unused_preset_vehicle_colour(rideEntry); - auto rideSetVehicleAction = RideSetVehicleAction(id, RideSetVehicleType::RideEntry, rideEntry, colour); + auto colour = ride_get_unused_preset_vehicle_colour(entryIndex); + auto rideSetVehicleAction = RideSetVehicleAction(id, RideSetVehicleType::RideEntry, entryIndex, colour); GameActions::Execute(&rideSetVehicleAction); } diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index b9a9a7a881..2159dfbdfe 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -298,7 +298,7 @@ public: void Delete(); void Crash(uint8_t vehicleIndex); void SetToDefaultInspectionInterval(); - void SetRideEntry(int32_t rideEntry); + void SetRideEntry(ObjectEntryIndex entryIndex); void SetNumVehicles(int32_t numVehicles); void SetNumCarsPerVehicle(int32_t numCarsPerVehicle);