#21193: Move ParkEntrances to GameState_t

This commit is contained in:
Hielke Morsink 2024-01-25 12:52:56 +01:00
parent ce45cb3360
commit 74d61369be
13 changed files with 55 additions and 35 deletions

View File

@ -616,10 +616,12 @@ private:
if (page != WINDOW_PARK_PAGE_ENTRANCE) if (page != WINDOW_PARK_PAGE_ENTRANCE)
return; return;
const auto& gameState = GetGameState();
std::optional<Focus> newFocus = std::nullopt; std::optional<Focus> 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 }); newFocus = Focus(CoordsXYZ{ entrance.x + 16, entrance.y + 16, entrance.z + 32 });
} }

View File

@ -505,12 +505,13 @@ namespace Editor
return { false, STR_PARK_MUST_OWN_SOME_LAND }; 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 }; return { false, STR_NO_PARK_ENTRANCES };
} }
for (const auto& parkEntrance : gParkEntrances) for (const auto& parkEntrance : gameState.ParkEntrances)
{ {
int32_t direction = DirectionReverse(parkEntrance.direction); int32_t direction = DirectionReverse(parkEntrance.direction);

View File

@ -19,6 +19,7 @@
#include <chrono> #include <chrono>
#include <memory> #include <memory>
#include <unordered_map> #include <unordered_map>
#include <vector>
namespace OpenRCT2 namespace OpenRCT2
{ {
@ -30,6 +31,7 @@ namespace OpenRCT2
uint64_t ParkFlags; uint64_t ParkFlags;
uint16_t ParkRating; uint16_t ParkRating;
money64 ParkEntranceFee; money64 ParkEntranceFee;
std::vector<CoordsXYZD> ParkEntrances;
uint32_t ParkSize; uint32_t ParkSize;
ClimateType Climate; ClimateType Climate;
ClimateState ClimateCurrent; ClimateState ClimateCurrent;

View File

@ -10,6 +10,7 @@
#include "ParkEntrancePlaceAction.h" #include "ParkEntrancePlaceAction.h"
#include "../Cheats.h" #include "../Cheats.h"
#include "../GameState.h"
#include "../OpenRCT2.h" #include "../OpenRCT2.h"
#include "../core/MemoryStream.h" #include "../core/MemoryStream.h"
#include "../localisation/StringIds.h" #include "../localisation/StringIds.h"
@ -21,6 +22,8 @@
#include "../world/Park.h" #include "../world/Park.h"
#include "../world/Surface.h" #include "../world/Surface.h"
using namespace OpenRCT2;
ParkEntrancePlaceAction::ParkEntrancePlaceAction(const CoordsXYZD& location, ObjectEntryIndex pathType) ParkEntrancePlaceAction::ParkEntrancePlaceAction(const CoordsXYZD& location, ObjectEntryIndex pathType)
: _loc(location) : _loc(location)
, _pathType(pathType) , _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); 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( return GameActions::Result(
GameActions::Status::InvalidParameters, STR_CANT_BUILD_THIS_HERE, STR_ERR_TOO_MANY_PARK_ENTRANCES); 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(); uint32_t flags = GetFlags();
gParkEntrances.push_back(_loc); GetGameState().ParkEntrances.push_back(_loc);
auto zLow = _loc.z; auto zLow = _loc.z;
auto zHigh = zLow + ParkEntranceHeight; auto zHigh = zLow + ParkEntranceHeight;

View File

@ -13,6 +13,9 @@
#include "../management/Finance.h" #include "../management/Finance.h"
#include "../world/Entrance.h" #include "../world/Entrance.h"
#include "../world/Park.h" #include "../world/Park.h"
#include "../GameState.h"
using namespace OpenRCT2;
ParkEntranceRemoveAction::ParkEntranceRemoveAction(const CoordsXYZ& loc) ParkEntranceRemoveAction::ParkEntranceRemoveAction(const CoordsXYZ& loc)
: _loc(loc) : _loc(loc)
@ -71,7 +74,8 @@ GameActions::Result ParkEntranceRemoveAction::Execute() const
return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_NONE); 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) // Centre (sign)
ParkEntranceRemoveSegment(_loc); ParkEntranceRemoveSegment(_loc);
@ -84,7 +88,7 @@ GameActions::Result ParkEntranceRemoveAction::Execute() const
ParkEntranceRemoveSegment( ParkEntranceRemoveSegment(
{ _loc.x - CoordsDirectionDelta[direction].x, _loc.y - CoordsDirectionDelta[direction].y, _loc.z }); { _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; return res;
} }

View File

@ -11,6 +11,7 @@
#include "../Cheats.h" #include "../Cheats.h"
#include "../Context.h" #include "../Context.h"
#include "../GameState.h"
#include "../core/MemoryStream.h" #include "../core/MemoryStream.h"
#include "../drawing/Drawing.h" #include "../drawing/Drawing.h"
#include "../entity/EntityRegistry.h" #include "../entity/EntityRegistry.h"
@ -28,6 +29,8 @@
#include <set> #include <set>
using namespace OpenRCT2;
/* rct2: 0x009929FC */ /* rct2: 0x009929FC */
static constexpr PeepSpriteType spriteTypes[] = { static constexpr PeepSpriteType spriteTypes[] = {
PeepSpriteType::Handyman, PeepSpriteType::Handyman,
@ -288,10 +291,11 @@ void StaffHireNewAction::AutoPositionNewStaff(Peep* newPeep) const
else else
{ {
// No walking guests; pick random park entrance // No walking guests; pick random park entrance
if (!gParkEntrances.empty()) const auto& gameState = GetGameState();
if (!gameState.ParkEntrances.empty())
{ {
auto rand = ScenarioRandMax(static_cast<uint32_t>(gParkEntrances.size())); auto rand = ScenarioRandMax(static_cast<uint32_t>(gameState.ParkEntrances.size()));
const auto& entrance = gParkEntrances[rand]; const auto& entrance = gameState.ParkEntrances[rand];
auto dir = entrance.direction; auto dir = entrance.direction;
newLocation = entrance; newLocation = entrance;
// TODO: Replace with CoordsDirectionDelta // TODO: Replace with CoordsDirectionDelta

View File

@ -1885,8 +1885,8 @@ static bool PeepInteractWithEntrance(Peep* peep, const CoordsXYE& coords, uint8_
bool found = false; bool found = false;
auto entrance = std::find_if( auto entrance = std::find_if(
gParkEntrances.begin(), gParkEntrances.end(), [coords](const auto& e) { return coords.ToTileStart() == e; }); gameState.ParkEntrances.begin(), gameState.ParkEntrances.end(), [coords](const auto& e) { return coords.ToTileStart() == e; });
if (entrance != gParkEntrances.end()) if (entrance != gameState.ParkEntrances.end())
{ {
int16_t z = entrance->z / 8; int16_t z = entrance->z / 8;
entranceDirection = entrance->direction; entranceDirection = entrance->direction;

View File

@ -9,6 +9,7 @@
#include "GuestPathfinding.h" #include "GuestPathfinding.h"
#include "../GameState.h"
#include "../core/Guard.hpp" #include "../core/Guard.hpp"
#include "../entity/Guest.h" #include "../entity/Guest.h"
#include "../entity/Staff.h" #include "../entity/Staff.h"
@ -1643,7 +1644,7 @@ static std::optional<CoordsXYZ> GetNearestParkEntrance(const CoordsXY& loc)
{ {
std::optional<CoordsXYZ> chosenEntrance = std::nullopt; std::optional<CoordsXYZ> chosenEntrance = std::nullopt;
uint16_t nearestDist = 0xFFFF; 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); auto dist = abs(parkEntrance.x - loc.x) + abs(parkEntrance.y - loc.y);
if (dist < nearestDist) if (dist < nearestDist)

View File

@ -2410,10 +2410,11 @@ namespace RCT1
void FixEntrancePositions() void FixEntrancePositions()
{ {
gParkEntrances.clear(); auto& gameState = GetGameState();
gameState.ParkEntrances.clear();
TileElementIterator it; TileElementIterator it;
TileElementIteratorBegin(&it); TileElementIteratorBegin(&it);
while (TileElementIteratorNext(&it) && gParkEntrances.size() < Limits::MaxParkEntrances) while (TileElementIteratorNext(&it) && gameState.ParkEntrances.size() < Limits::MaxParkEntrances)
{ {
TileElement* element = it.element; TileElement* element = it.element;
@ -2425,7 +2426,7 @@ namespace RCT1
continue; continue;
CoordsXYZD entrance = { TileCoordsXY(it.x, it.y).ToCoordsXY(), element->GetBaseZ(), element->GetDirection() }; CoordsXYZD entrance = { TileCoordsXY(it.x, it.y).ToCoordsXY(), element->GetBaseZ(), element->GetDirection() };
gParkEntrances.push_back(entrance); gameState.ParkEntrances.push_back(entrance);
} }
} }

View File

@ -412,7 +412,7 @@ namespace RCT2
gBankLoanInterestRate = _s6.CurrentInterestRate; gBankLoanInterestRate = _s6.CurrentInterestRate;
// Pad0135934B // Pad0135934B
// Preserve compatibility with vanilla RCT2's save format. // Preserve compatibility with vanilla RCT2's save format.
gParkEntrances.clear(); gameState.ParkEntrances.clear();
for (uint8_t i = 0; i < Limits::MaxParkEntrances; i++) for (uint8_t i = 0; i < Limits::MaxParkEntrances; i++)
{ {
if (_s6.ParkEntranceX[i] != LOCATION_NULL) if (_s6.ParkEntranceX[i] != LOCATION_NULL)
@ -422,7 +422,7 @@ namespace RCT2
entrance.y = _s6.ParkEntranceY[i]; entrance.y = _s6.ParkEntranceY[i];
entrance.z = _s6.ParkEntranceZ[i]; entrance.z = _s6.ParkEntranceZ[i];
entrance.direction = _s6.ParkEntranceDirection[i]; entrance.direction = _s6.ParkEntranceDirection[i];
gParkEntrances.push_back(entrance); gameState.ParkEntrances.push_back(entrance);
} }
} }
if (_s6.Header.Type == S6_TYPE_SCENARIO) if (_s6.Header.Type == S6_TYPE_SCENARIO)

View File

@ -239,11 +239,12 @@ static void ScenarioCheckEntranceFeeTooHigh()
{ {
const auto max_fee = AddClamp_money64(gTotalRideValueForMoney, gTotalRideValueForMoney / 2); 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 x = entrance.x + 16;
auto y = entrance.y + 16; auto y = entrance.y + 16;

View File

@ -12,6 +12,7 @@
#include "../Cheats.h" #include "../Cheats.h"
#include "../Context.h" #include "../Context.h"
#include "../Game.h" #include "../Game.h"
#include "../GameState.h"
#include "../OpenRCT2.h" #include "../OpenRCT2.h"
#include "../actions/ParkEntranceRemoveAction.h" #include "../actions/ParkEntranceRemoveAction.h"
#include "../actions/RideEntranceExitPlaceAction.h" #include "../actions/RideEntranceExitPlaceAction.h"
@ -32,9 +33,10 @@
#include <algorithm> #include <algorithm>
using namespace OpenRCT2;
bool gParkEntranceGhostExists = false; bool gParkEntranceGhostExists = false;
CoordsXYZD gParkEntranceGhostPosition = { 0, 0, 0, 0 }; CoordsXYZD gParkEntranceGhostPosition = { 0, 0, 0, 0 };
std::vector<CoordsXYZD> gParkEntrances;
CoordsXYZD gRideEntranceExitGhostPosition; CoordsXYZD gRideEntranceExitGhostPosition;
StationIndex gRideEntranceExitGhostStationIndex; StationIndex gRideEntranceExitGhostStationIndex;
@ -68,7 +70,7 @@ void ParkEntranceRemoveGhost()
int32_t ParkEntranceGetIndex(const CoordsXYZ& entrancePos) int32_t ParkEntranceGetIndex(const CoordsXYZ& entrancePos)
{ {
int32_t i = 0; int32_t i = 0;
for (const auto& entrance : gParkEntrances) for (const auto& entrance : GetGameState().ParkEntrances)
{ {
if (entrancePos == entrance) if (entrancePos == entrance)
{ {
@ -81,7 +83,7 @@ int32_t ParkEntranceGetIndex(const CoordsXYZ& entrancePos)
void ParkEntranceReset() void ParkEntranceReset()
{ {
gParkEntrances.clear(); GetGameState().ParkEntrances.clear();
} }
void RideEntranceExitPlaceProvisionalGhost() void RideEntranceExitPlaceProvisionalGhost()
@ -210,17 +212,19 @@ void MazeEntranceHedgeRemoval(const CoordsXYE& entrance)
void ParkEntranceFixLocations(void) void ParkEntranceFixLocations(void)
{ {
// Fix gParkEntrance locations for which the tile_element no longer exists auto& gameState = GetGameState();
gParkEntrances.erase( // Fix ParkEntrance locations for which the tile_element no longer exists
gameState.ParkEntrances.erase(
std::remove_if( std::remove_if(
gParkEntrances.begin(), gParkEntrances.end(), gameState.ParkEntrances.begin(), gameState.ParkEntrances.end(),
[](const auto& entrance) { return MapGetParkEntranceElementAt(entrance, false) == nullptr; }), [](const auto& entrance) { return MapGetParkEntranceElementAt(entrance, false) == nullptr; }),
gParkEntrances.end()); gameState.ParkEntrances.end());
} }
void ParkEntranceUpdateLocations() void ParkEntranceUpdateLocations()
{ {
gParkEntrances.clear(); auto& gameState = GetGameState();
gameState.ParkEntrances.clear();
TileElementIterator it; TileElementIterator it;
TileElementIteratorBegin(&it); TileElementIteratorBegin(&it);
while (TileElementIteratorNext(&it)) while (TileElementIteratorNext(&it))
@ -230,7 +234,7 @@ void ParkEntranceUpdateLocations()
&& entranceElement->GetSequenceIndex() == 0 && !entranceElement->IsGhost()) && entranceElement->GetSequenceIndex() == 0 && !entranceElement->IsGhost())
{ {
auto entrance = TileCoordsXYZD(it.x, it.y, it.element->BaseHeight, it.element->GetDirection()).ToCoordsXYZD(); auto entrance = TileCoordsXYZD(it.x, it.y, it.element->BaseHeight, it.element->GetDirection()).ToCoordsXYZD();
gParkEntrances.push_back(entrance); gameState.ParkEntrances.push_back(entrance);
} }
} }
} }

View File

@ -14,8 +14,6 @@
#include "Location.hpp" #include "Location.hpp"
#include "Map.h" #include "Map.h"
#include <vector>
struct TileElement; struct TileElement;
enum enum
@ -39,8 +37,6 @@ extern CoordsXYZD gParkEntranceGhostPosition;
constexpr int32_t MaxRideEntranceOrExitHeight = 244 * COORDS_Z_STEP; constexpr int32_t MaxRideEntranceOrExitHeight = 244 * COORDS_Z_STEP;
extern std::vector<CoordsXYZD> gParkEntrances;
extern CoordsXYZD gRideEntranceExitGhostPosition; extern CoordsXYZD gRideEntranceExitGhostPosition;
extern StationIndex gRideEntranceExitGhostStationIndex; extern StationIndex gRideEntranceExitGhostStationIndex;