diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 90286c4dd6..e4d32cb571 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -32,6 +32,7 @@ - Fix: [#17261] Hand cursor position is incorrect when dragging items in the Inventions List window. - Fix: [#17292] Rows in shortcut key list stay highlighted when cursor leaves list. - Fix: [#17295] Pause status not cleared when loading a scenario made from a converted paused save. +- Fix: [#17310] Reversed reversible vehicles not imported properly when loading RCT1 parks. 0.4.0 (2022-04-25) ------------------------------------------------------------------------ diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index ff668aaea0..c67f1fe4db 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -1200,6 +1200,9 @@ namespace RCT1 MINE_TRAIN_CARRIAGE = 36, CORKSCREW_RC_FRONT = 38, CORKSCREW_RC_CARRIAGE = 39, + LOG_FLUME_BOAT = 45, + + LOG_FLUME_BOAT_REVERSED = 61, GHOST_TRAIN_CAR = 63, TWISTER_RC_SPOILER = 64, TWISTER_RC_CARRIAGE = 65, @@ -1214,6 +1217,11 @@ namespace RCT1 MINIGOLF_BALL = 82, SPLASH_BOAT = 83, SPLASH_BOAT_INVISIBLE = 84, + HEARTLINE_TWISTER_FORWARDS = 88, // Used for both regular cars and “starting reversed“ cars that have been reversed + // again. + HEARTLINE_TWISTER_BACKWARDS = 89, // Used for both regular cars that went through a reverser, as well as reversed cars + // in the starting position. + REVERSER_RC_CAR_REVERSED = 95, HYPERCOASTER_FRONT = 96, HYPERCOASTER_CARRIAGE = 97, INVERTED_4_ACROSS_CARRIAGE = 98, diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 4cc85eba06..7a49a0cade 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2706,7 +2706,8 @@ namespace RCT1 if (ride == nullptr) return; - uint8_t vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(src->vehicle_type); + const auto& rct1Ride = _s4.rides[src->ride]; + uint8_t vehicleEntryIndex = RCT1::GetVehicleSubEntryIndex(rct1Ride.vehicle_type, src->vehicle_type); dst->ride = RideId::FromUnderlying(src->ride); dst->ride_subtype = RCTEntryIndexToOpenRCT2EntryIndex(ride->subtype); diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 46332963a7..8299e8ab19 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -422,7 +422,7 @@ namespace RCT1 return pathAdditionType; } - uint8_t GetVehicleSubEntryIndex(uint8_t vehicleSubEntry) + uint8_t GetVehicleSubEntryIndex(uint8_t rct1VehicleType, uint8_t vehicleSubEntry) { static constexpr const uint8_t map[] = { @@ -471,6 +471,7 @@ namespace RCT1 0, 0, 0, + 0, // LOG_FLUME_BOAT 0, 0, 0, @@ -486,8 +487,7 @@ namespace RCT1 0, 0, 0, - 0, - 0, + 1, // LOG_FLUME_BOAT_REVERSED 0, 0, // GHOST_TRAIN_CAR 1, // TWISTER_RC_SPOILER @@ -514,14 +514,14 @@ namespace RCT1 0, 0, 0, + 0, // HEARTLINE_TWISTER_FORWARDS + 0, // HEARTLINE_TWISTER_BACKWARDS 0, 0, 0, 0, 0, - 0, - 0, - 0, + 1, // REVERSER_RC_CAR_REVERSED 0, // HYPERCOASTER_FRONT 1, // HYPERCOASTER_CARRIAGE 0, // INVERTED_4_ACROSS_CARRIAGE @@ -683,6 +683,16 @@ namespace RCT1 0, 0, }; + + if (rct1VehicleType == RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS) + { + return vehicleSubEntry == HEARTLINE_TWISTER_FORWARDS ? 0 : 1; + } + if (rct1VehicleType == RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS_REVERSED) + { + return vehicleSubEntry == HEARTLINE_TWISTER_BACKWARDS ? 0 : 1; + } + return map[vehicleSubEntry]; } diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index 9ebc228419..d5ab10785e 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -32,7 +32,7 @@ namespace RCT1 bool RideTypeUsesVehicles(RideType rideType); bool PathIsQueue(uint8_t pathType); uint8_t NormalisePathAddition(uint8_t pathAdditionType); - uint8_t GetVehicleSubEntryIndex(uint8_t vehicleSubEntry); + uint8_t GetVehicleSubEntryIndex(uint8_t rct1VehicleType, uint8_t vehicleSubEntry); std::string_view GetRideTypeObject(RideType rideType); std::string_view GetVehicleObject(uint8_t vehicleType);