From 74d61369bea432f3cef5f99c5d67f52d084666e6 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Thu, 25 Jan 2024 12:52:56 +0100 Subject: [PATCH 1/2] #21193: Move ParkEntrances to GameState_t --- src/openrct2-ui/windows/Park.cpp | 6 +++-- src/openrct2/Editor.cpp | 5 +++-- src/openrct2/GameState.h | 2 ++ .../actions/ParkEntrancePlaceAction.cpp | 8 +++++-- .../actions/ParkEntranceRemoveAction.cpp | 8 +++++-- src/openrct2/actions/StaffHireNewAction.cpp | 10 ++++++--- src/openrct2/entity/Peep.cpp | 4 ++-- src/openrct2/peep/GuestPathfinding.cpp | 3 ++- src/openrct2/rct1/S4Importer.cpp | 7 +++--- src/openrct2/rct2/S6Importer.cpp | 4 ++-- src/openrct2/scenario/Scenario.cpp | 7 +++--- src/openrct2/world/Entrance.cpp | 22 +++++++++++-------- src/openrct2/world/Entrance.h | 4 ---- 13 files changed, 55 insertions(+), 35 deletions(-) diff --git a/src/openrct2-ui/windows/Park.cpp b/src/openrct2-ui/windows/Park.cpp index c36224d4d4..e2461ad0a0 100644 --- a/src/openrct2-ui/windows/Park.cpp +++ b/src/openrct2-ui/windows/Park.cpp @@ -616,10 +616,12 @@ private: if (page != WINDOW_PARK_PAGE_ENTRANCE) return; + const auto& gameState = GetGameState(); + std::optional newFocus = std::nullopt; - if (!gParkEntrances.empty()) + if (!gameState.ParkEntrances.empty()) { - const auto& entrance = gParkEntrances[0]; + const auto& entrance = gameState.ParkEntrances[0]; newFocus = Focus(CoordsXYZ{ entrance.x + 16, entrance.y + 16, entrance.z + 32 }); } diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index 664452f4d4..4bb5118f7b 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -505,12 +505,13 @@ namespace Editor return { false, STR_PARK_MUST_OWN_SOME_LAND }; } - if (gParkEntrances.empty()) + const auto& gameState = GetGameState(); + if (gameState.ParkEntrances.empty()) { return { false, STR_NO_PARK_ENTRANCES }; } - for (const auto& parkEntrance : gParkEntrances) + for (const auto& parkEntrance : gameState.ParkEntrances) { int32_t direction = DirectionReverse(parkEntrance.direction); diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index abe661892d..d93f84637d 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -19,6 +19,7 @@ #include #include #include +#include namespace OpenRCT2 { @@ -30,6 +31,7 @@ namespace OpenRCT2 uint64_t ParkFlags; uint16_t ParkRating; money64 ParkEntranceFee; + std::vector ParkEntrances; uint32_t ParkSize; ClimateType Climate; ClimateState ClimateCurrent; diff --git a/src/openrct2/actions/ParkEntrancePlaceAction.cpp b/src/openrct2/actions/ParkEntrancePlaceAction.cpp index d955a85193..e5c73e0dd8 100644 --- a/src/openrct2/actions/ParkEntrancePlaceAction.cpp +++ b/src/openrct2/actions/ParkEntrancePlaceAction.cpp @@ -10,6 +10,7 @@ #include "ParkEntrancePlaceAction.h" #include "../Cheats.h" +#include "../GameState.h" #include "../OpenRCT2.h" #include "../core/MemoryStream.h" #include "../localisation/StringIds.h" @@ -21,6 +22,8 @@ #include "../world/Park.h" #include "../world/Surface.h" +using namespace OpenRCT2; + ParkEntrancePlaceAction::ParkEntrancePlaceAction(const CoordsXYZD& location, ObjectEntryIndex pathType) : _loc(location) , _pathType(pathType) @@ -71,7 +74,8 @@ GameActions::Result ParkEntrancePlaceAction::Query() const GameActions::Status::NoFreeElements, STR_CANT_BUILD_THIS_HERE, STR_ERR_LANDSCAPE_DATA_AREA_FULL); } - if (gParkEntrances.size() >= OpenRCT2::Limits::MaxParkEntrances) + const auto& gameState = GetGameState(); + if (gameState.ParkEntrances.size() >= OpenRCT2::Limits::MaxParkEntrances) { return GameActions::Result( GameActions::Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_TOO_MANY_PARK_ENTRANCES); @@ -117,7 +121,7 @@ GameActions::Result ParkEntrancePlaceAction::Execute() const uint32_t flags = GetFlags(); - gParkEntrances.push_back(_loc); + GetGameState().ParkEntrances.push_back(_loc); auto zLow = _loc.z; auto zHigh = zLow + ParkEntranceHeight; diff --git a/src/openrct2/actions/ParkEntranceRemoveAction.cpp b/src/openrct2/actions/ParkEntranceRemoveAction.cpp index 5f865d14d0..c19c6f884f 100644 --- a/src/openrct2/actions/ParkEntranceRemoveAction.cpp +++ b/src/openrct2/actions/ParkEntranceRemoveAction.cpp @@ -13,6 +13,9 @@ #include "../management/Finance.h" #include "../world/Entrance.h" #include "../world/Park.h" +#include "../GameState.h" + +using namespace OpenRCT2; ParkEntranceRemoveAction::ParkEntranceRemoveAction(const CoordsXYZ& loc) : _loc(loc) @@ -71,7 +74,8 @@ GameActions::Result ParkEntranceRemoveAction::Execute() const return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_NONE); } - auto direction = (gParkEntrances[entranceIndex].direction - 1) & 3; + auto& gameState = GetGameState(); + auto direction = (gameState.ParkEntrances[entranceIndex].direction - 1) & 3; // Centre (sign) ParkEntranceRemoveSegment(_loc); @@ -84,7 +88,7 @@ GameActions::Result ParkEntranceRemoveAction::Execute() const ParkEntranceRemoveSegment( { _loc.x - CoordsDirectionDelta[direction].x, _loc.y - CoordsDirectionDelta[direction].y, _loc.z }); - gParkEntrances.erase(gParkEntrances.begin() + entranceIndex); + gameState.ParkEntrances.erase(gameState.ParkEntrances.begin() + entranceIndex); return res; } diff --git a/src/openrct2/actions/StaffHireNewAction.cpp b/src/openrct2/actions/StaffHireNewAction.cpp index 6bc5c34bc0..a235dd3f21 100644 --- a/src/openrct2/actions/StaffHireNewAction.cpp +++ b/src/openrct2/actions/StaffHireNewAction.cpp @@ -11,6 +11,7 @@ #include "../Cheats.h" #include "../Context.h" +#include "../GameState.h" #include "../core/MemoryStream.h" #include "../drawing/Drawing.h" #include "../entity/EntityRegistry.h" @@ -28,6 +29,8 @@ #include +using namespace OpenRCT2; + /* rct2: 0x009929FC */ static constexpr PeepSpriteType spriteTypes[] = { PeepSpriteType::Handyman, @@ -288,10 +291,11 @@ void StaffHireNewAction::AutoPositionNewStaff(Peep* newPeep) const else { // No walking guests; pick random park entrance - if (!gParkEntrances.empty()) + const auto& gameState = GetGameState(); + if (!gameState.ParkEntrances.empty()) { - auto rand = ScenarioRandMax(static_cast(gParkEntrances.size())); - const auto& entrance = gParkEntrances[rand]; + auto rand = ScenarioRandMax(static_cast(gameState.ParkEntrances.size())); + const auto& entrance = gameState.ParkEntrances[rand]; auto dir = entrance.direction; newLocation = entrance; // TODO: Replace with CoordsDirectionDelta diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index d1ee319857..d97bc1f604 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -1885,8 +1885,8 @@ static bool PeepInteractWithEntrance(Peep* peep, const CoordsXYE& coords, uint8_ bool found = false; auto entrance = std::find_if( - gParkEntrances.begin(), gParkEntrances.end(), [coords](const auto& e) { return coords.ToTileStart() == e; }); - if (entrance != gParkEntrances.end()) + gameState.ParkEntrances.begin(), gameState.ParkEntrances.end(), [coords](const auto& e) { return coords.ToTileStart() == e; }); + if (entrance != gameState.ParkEntrances.end()) { int16_t z = entrance->z / 8; entranceDirection = entrance->direction; diff --git a/src/openrct2/peep/GuestPathfinding.cpp b/src/openrct2/peep/GuestPathfinding.cpp index b234831254..e61980fed3 100644 --- a/src/openrct2/peep/GuestPathfinding.cpp +++ b/src/openrct2/peep/GuestPathfinding.cpp @@ -9,6 +9,7 @@ #include "GuestPathfinding.h" +#include "../GameState.h" #include "../core/Guard.hpp" #include "../entity/Guest.h" #include "../entity/Staff.h" @@ -1643,7 +1644,7 @@ static std::optional GetNearestParkEntrance(const CoordsXY& loc) { std::optional chosenEntrance = std::nullopt; uint16_t nearestDist = 0xFFFF; - for (const auto& parkEntrance : gParkEntrances) + for (const auto& parkEntrance : GetGameState().ParkEntrances) { auto dist = abs(parkEntrance.x - loc.x) + abs(parkEntrance.y - loc.y); if (dist < nearestDist) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 8740cb3fba..6e8ac067f7 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2410,10 +2410,11 @@ namespace RCT1 void FixEntrancePositions() { - gParkEntrances.clear(); + auto& gameState = GetGameState(); + gameState.ParkEntrances.clear(); TileElementIterator it; TileElementIteratorBegin(&it); - while (TileElementIteratorNext(&it) && gParkEntrances.size() < Limits::MaxParkEntrances) + while (TileElementIteratorNext(&it) && gameState.ParkEntrances.size() < Limits::MaxParkEntrances) { TileElement* element = it.element; @@ -2425,7 +2426,7 @@ namespace RCT1 continue; CoordsXYZD entrance = { TileCoordsXY(it.x, it.y).ToCoordsXY(), element->GetBaseZ(), element->GetDirection() }; - gParkEntrances.push_back(entrance); + gameState.ParkEntrances.push_back(entrance); } } diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index fbcc3db637..461fd15e71 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -412,7 +412,7 @@ namespace RCT2 gBankLoanInterestRate = _s6.CurrentInterestRate; // Pad0135934B // Preserve compatibility with vanilla RCT2's save format. - gParkEntrances.clear(); + gameState.ParkEntrances.clear(); for (uint8_t i = 0; i < Limits::MaxParkEntrances; i++) { if (_s6.ParkEntranceX[i] != LOCATION_NULL) @@ -422,7 +422,7 @@ namespace RCT2 entrance.y = _s6.ParkEntranceY[i]; entrance.z = _s6.ParkEntranceZ[i]; entrance.direction = _s6.ParkEntranceDirection[i]; - gParkEntrances.push_back(entrance); + gameState.ParkEntrances.push_back(entrance); } } if (_s6.Header.Type == S6_TYPE_SCENARIO) diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index cdfb1178c4..79918a3982 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -239,11 +239,12 @@ static void ScenarioCheckEntranceFeeTooHigh() { const auto max_fee = AddClamp_money64(gTotalRideValueForMoney, gTotalRideValueForMoney / 2); - if ((GetGameState().ParkFlags & PARK_FLAGS_PARK_OPEN) && ParkGetEntranceFee() > max_fee) + const auto& gameState = GetGameState(); + if ((gameState.ParkFlags & PARK_FLAGS_PARK_OPEN) && ParkGetEntranceFee() > max_fee) { - if (!gParkEntrances.empty()) + if (!gameState.ParkEntrances.empty()) { - const auto& entrance = gParkEntrances[0]; + const auto& entrance = gameState.ParkEntrances[0]; auto x = entrance.x + 16; auto y = entrance.y + 16; diff --git a/src/openrct2/world/Entrance.cpp b/src/openrct2/world/Entrance.cpp index 435a673bc6..05e01ef85e 100644 --- a/src/openrct2/world/Entrance.cpp +++ b/src/openrct2/world/Entrance.cpp @@ -12,6 +12,7 @@ #include "../Cheats.h" #include "../Context.h" #include "../Game.h" +#include "../GameState.h" #include "../OpenRCT2.h" #include "../actions/ParkEntranceRemoveAction.h" #include "../actions/RideEntranceExitPlaceAction.h" @@ -32,9 +33,10 @@ #include +using namespace OpenRCT2; + bool gParkEntranceGhostExists = false; CoordsXYZD gParkEntranceGhostPosition = { 0, 0, 0, 0 }; -std::vector gParkEntrances; CoordsXYZD gRideEntranceExitGhostPosition; StationIndex gRideEntranceExitGhostStationIndex; @@ -68,7 +70,7 @@ void ParkEntranceRemoveGhost() int32_t ParkEntranceGetIndex(const CoordsXYZ& entrancePos) { int32_t i = 0; - for (const auto& entrance : gParkEntrances) + for (const auto& entrance : GetGameState().ParkEntrances) { if (entrancePos == entrance) { @@ -81,7 +83,7 @@ int32_t ParkEntranceGetIndex(const CoordsXYZ& entrancePos) void ParkEntranceReset() { - gParkEntrances.clear(); + GetGameState().ParkEntrances.clear(); } void RideEntranceExitPlaceProvisionalGhost() @@ -210,17 +212,19 @@ void MazeEntranceHedgeRemoval(const CoordsXYE& entrance) void ParkEntranceFixLocations(void) { - // Fix gParkEntrance locations for which the tile_element no longer exists - gParkEntrances.erase( + auto& gameState = GetGameState(); + // Fix ParkEntrance locations for which the tile_element no longer exists + gameState.ParkEntrances.erase( std::remove_if( - gParkEntrances.begin(), gParkEntrances.end(), + gameState.ParkEntrances.begin(), gameState.ParkEntrances.end(), [](const auto& entrance) { return MapGetParkEntranceElementAt(entrance, false) == nullptr; }), - gParkEntrances.end()); + gameState.ParkEntrances.end()); } void ParkEntranceUpdateLocations() { - gParkEntrances.clear(); + auto& gameState = GetGameState(); + gameState.ParkEntrances.clear(); TileElementIterator it; TileElementIteratorBegin(&it); while (TileElementIteratorNext(&it)) @@ -230,7 +234,7 @@ void ParkEntranceUpdateLocations() && entranceElement->GetSequenceIndex() == 0 && !entranceElement->IsGhost()) { auto entrance = TileCoordsXYZD(it.x, it.y, it.element->BaseHeight, it.element->GetDirection()).ToCoordsXYZD(); - gParkEntrances.push_back(entrance); + gameState.ParkEntrances.push_back(entrance); } } } diff --git a/src/openrct2/world/Entrance.h b/src/openrct2/world/Entrance.h index 1af30235a9..d89ae0dc38 100644 --- a/src/openrct2/world/Entrance.h +++ b/src/openrct2/world/Entrance.h @@ -14,8 +14,6 @@ #include "Location.hpp" #include "Map.h" -#include - struct TileElement; enum @@ -39,8 +37,6 @@ extern CoordsXYZD gParkEntranceGhostPosition; constexpr int32_t MaxRideEntranceOrExitHeight = 244 * COORDS_Z_STEP; -extern std::vector gParkEntrances; - extern CoordsXYZD gRideEntranceExitGhostPosition; extern StationIndex gRideEntranceExitGhostStationIndex; From ad4bc0dd10d2291d4a6258544ac810ceff7e1e41 Mon Sep 17 00:00:00 2001 From: Hielke Morsink Date: Thu, 25 Jan 2024 14:27:40 +0100 Subject: [PATCH 2/2] Fix formatting --- src/openrct2/actions/ParkEntranceRemoveAction.cpp | 2 +- src/openrct2/entity/Peep.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/openrct2/actions/ParkEntranceRemoveAction.cpp b/src/openrct2/actions/ParkEntranceRemoveAction.cpp index c19c6f884f..d5c3c232c0 100644 --- a/src/openrct2/actions/ParkEntranceRemoveAction.cpp +++ b/src/openrct2/actions/ParkEntranceRemoveAction.cpp @@ -9,11 +9,11 @@ #include "ParkEntranceRemoveAction.h" +#include "../GameState.h" #include "../OpenRCT2.h" #include "../management/Finance.h" #include "../world/Entrance.h" #include "../world/Park.h" -#include "../GameState.h" using namespace OpenRCT2; diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index d97bc1f604..41ff9b50b4 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -1884,8 +1884,9 @@ static bool PeepInteractWithEntrance(Peep* peep, const CoordsXYE& coords, uint8_ } bool found = false; - auto entrance = std::find_if( - gameState.ParkEntrances.begin(), gameState.ParkEntrances.end(), [coords](const auto& e) { return coords.ToTileStart() == e; }); + auto entrance = std::find_if(gameState.ParkEntrances.begin(), gameState.ParkEntrances.end(), [coords](const auto& e) { + return coords.ToTileStart() == e; + }); if (entrance != gameState.ParkEntrances.end()) { int16_t z = entrance->z / 8;