From f7d61c67e6bd84ba42cb289259b1bfd53abbc4be Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Sun, 26 Sep 2021 16:21:34 +0200 Subject: [PATCH] Fix arbitrary ride type cheat not working --- src/openrct2/actions/RideSetSettingAction.cpp | 1 + src/openrct2/ride/Ride.cpp | 26 +++++++++++++++++++ src/openrct2/ride/Ride.h | 5 ++++ 3 files changed, 32 insertions(+) diff --git a/src/openrct2/actions/RideSetSettingAction.cpp b/src/openrct2/actions/RideSetSettingAction.cpp index 37a4e6a572..64df3d3c0d 100644 --- a/src/openrct2/actions/RideSetSettingAction.cpp +++ b/src/openrct2/actions/RideSetSettingAction.cpp @@ -223,6 +223,7 @@ GameActions::Result::Ptr RideSetSettingAction::Execute() const break; case RideSetSetting::RideType: ride->type = _value; + ride->UpdateRideTypeForAllPieces(); gfx_invalidate_screen(); break; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 7465c4ff6e..63eaebdb7f 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -5734,3 +5734,29 @@ void Ride::IncreaseNumShelteredSections() num_sheltered_sections &= ~ShelteredSectionsBits::NumShelteredSectionsMask; num_sheltered_sections |= newNumShelteredSections; } + +void Ride::UpdateRideTypeForAllPieces() +{ + for (int32_t y = 0; y < MAXIMUM_MAP_SIZE_TECHNICAL; y++) + { + for (int32_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) + { + auto* tileElement = map_get_first_element_at(TileCoordsXY(x, y)); + if (tileElement == nullptr) + continue; + + do + { + if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK) + continue; + + auto* trackElement = tileElement->AsTrack(); + if (trackElement->GetRideIndex() != id) + continue; + + trackElement->SetRideType(type); + + } while (!(tileElement++)->IsLastForTile()); + } + } +} diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 6fa62d0c2e..b278ce19f8 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -468,6 +468,11 @@ public: void IncreaseNumShelteredSections(); void RemoveVehicles(); + /** + * Updates all pieces of the ride to match the internal ride type. (Track pieces can have different ride types from the ride + * they belong to, to enable “merging”.) + */ + void UpdateRideTypeForAllPieces(); }; #pragma pack(push, 1)