1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Prefer using passed game state in save import classes (#22682)

* Wrap global game state in a unique_ptr

* Make ImportTileElements, SetTileElements use game state passed

* Make ImportParkName, ImportSavedView use game state passed

* Make ImportPeepSpawns use game state passed

* Make FixEntrancePositions use game state passed
This commit is contained in:
Aaron van Geffen
2024-09-06 23:04:14 +02:00
committed by GitHub
parent 125ae170b2
commit 960bea7aae
8 changed files with 50 additions and 34 deletions

View File

@@ -33,11 +33,16 @@ using namespace OpenRCT2::Scripting;
namespace OpenRCT2
{
static GameState_t _gameState{};
static auto _gameState = std::make_unique<GameState_t>();
GameState_t& GetGameState()
{
return _gameState;
return *_gameState;
}
void SwapGameState(std::unique_ptr<GameState_t>& otherState)
{
_gameState.swap(otherState);
}
/**

View File

@@ -149,6 +149,7 @@ namespace OpenRCT2
};
GameState_t& GetGameState();
void SwapGameState(std::unique_ptr<GameState_t>& otherState);
void gameStateInitAll(GameState_t& gameState, const TileCoordsXY& mapSize);
void gameStateTick();

View File

@@ -1071,7 +1071,7 @@ namespace OpenRCT2
std::vector<TileElement> tileElements;
tileElements.resize(numElements);
cs.Read(tileElements.data(), tileElements.size() * sizeof(TileElement));
SetTileElements(std::move(tileElements));
SetTileElements(gameState, std::move(tileElements));
{
TileElementIterator it;
TileElementIteratorBegin(&it);

View File

@@ -182,16 +182,16 @@ namespace OpenRCT2::RCT1
ImportRides();
ImportRideMeasurements();
ImportEntities();
ImportTileElements();
ImportPeepSpawns();
ImportTileElements(gameState);
ImportPeepSpawns(gameState);
ImportFinance(gameState);
ImportResearch(gameState);
ImportParkName();
ImportParkName(gameState);
ImportParkFlags(gameState);
ImportClimate(gameState);
ImportScenarioNameDetails(gameState);
ImportScenarioObjective(gameState);
ImportSavedView();
ImportSavedView(gameState);
RCT12::FetchAndApplyScenarioPatch(_s4Path, _isScenario);
FixNextGuestNumber(gameState);
@@ -1405,9 +1405,8 @@ namespace OpenRCT2::RCT1
dst->z = src->z;
}
void ImportPeepSpawns()
void ImportPeepSpawns(GameState_t& gameState)
{
auto& gameState = GetGameState();
gameState.PeepSpawns.clear();
for (size_t i = 0; i < Limits::kMaxPeepSpawns; i++)
{
@@ -1517,7 +1516,7 @@ namespace OpenRCT2::RCT1
return result;
}
void ImportTileElements()
void ImportTileElements(GameState_t& gameState)
{
// Build tile pointer cache (needed to get the first element at a certain location)
auto tilePointerIndex = TilePointerIndex<RCT12TileElement>(
@@ -1565,8 +1564,8 @@ namespace OpenRCT2::RCT1
}
}
SetTileElements(std::move(tileElements));
FixEntrancePositions();
SetTileElements(gameState, std::move(tileElements));
FixEntrancePositions(gameState);
}
size_t ImportTileElement(TileElement* dst, const RCT12TileElement* src)
@@ -2121,7 +2120,7 @@ namespace OpenRCT2::RCT1
}
}
void ImportParkName()
void ImportParkName(GameState_t& gameState)
{
std::string parkName = std::string(_s4.ScenarioName);
if (IsUserStringID(static_cast<StringId>(_s4.ParkNameStringIndex)))
@@ -2133,7 +2132,7 @@ namespace OpenRCT2::RCT1
}
}
auto& park = GetGameState().Park;
auto& park = gameState.Park;
park.Name = std::move(parkName);
}
@@ -2371,9 +2370,8 @@ namespace OpenRCT2::RCT1
gameState.ScenarioObjective.RideId = GetBuildTheBestRideId();
}
void ImportSavedView()
void ImportSavedView(GameState_t& gameState)
{
auto& gameState = GetGameState();
gameState.SavedView = ScreenCoordsXY{ _s4.ViewX, _s4.ViewY };
gameState.SavedViewZoom = ZoomLevel{ static_cast<int8_t>(_s4.ViewZoom) };
gameState.SavedViewRotation = _s4.ViewRotation;
@@ -2440,9 +2438,8 @@ namespace OpenRCT2::RCT1
dst->position.y = src->y;
}
void FixEntrancePositions()
void FixEntrancePositions(GameState_t& gameState)
{
auto& gameState = GetGameState();
gameState.Park.Entrances.clear();
TileElementIterator it;
TileElementIteratorBegin(&it);

View File

@@ -329,7 +329,7 @@ namespace OpenRCT2::RCT2
ScenarioRandSeed(_s6.ScenarioSrand0, _s6.ScenarioSrand1);
DetermineFlatRideStatus();
ImportTileElements();
ImportTileElements(gameState);
ImportEntities();
gameState.InitialCash = ToMoney64(_s6.InitialCash);
@@ -352,7 +352,7 @@ namespace OpenRCT2::RCT2
// Pad013573EE
// rct1_park_entrance_z
ImportPeepSpawns();
ImportPeepSpawns(gameState);
gameState.GuestChangeModifier = _s6.GuestCountChangeModifier;
gameState.ResearchFundingLevel = _s6.CurrentResearchLevel;
@@ -1098,7 +1098,7 @@ namespace OpenRCT2::RCT2
* Imports guest entry points.
* Includes fixes for incorrectly set guest entry points in some scenarios.
*/
void ImportPeepSpawns()
void ImportPeepSpawns(GameState_t& gameState)
{
// Many WW and TT have scenario_filename fields containing an incorrect filename. Check for both this filename
// and the corrected filename.
@@ -1129,7 +1129,6 @@ namespace OpenRCT2::RCT2
_s6.PeepSpawns[0].z = 7;
}
auto& gameState = GetGameState();
gameState.PeepSpawns.clear();
for (size_t i = 0; i < Limits::kMaxPeepSpawns; i++)
{
@@ -1162,7 +1161,7 @@ namespace OpenRCT2::RCT2
dst->num_riders = numRiders;
}
void ImportTileElements()
void ImportTileElements(GameState_t& gameState)
{
// Build tile pointer cache (needed to get the first element at a certain location)
auto tilePointerIndex = TilePointerIndex<RCT12TileElement>(
@@ -1232,7 +1231,7 @@ namespace OpenRCT2::RCT2
}
}
}
SetTileElements(std::move(tileElements));
SetTileElements(gameState, std::move(tileElements));
}
void ImportTileElement(TileElement* dst, const RCT12TileElement* src, bool invisible)

View File

@@ -2152,7 +2152,8 @@ static void TrackDesignPreviewClearMap()
{
auto numTiles = kMaximumMapSizeTechnical * kMaximumMapSizeTechnical;
GetGameState().MapSize = TRACK_DESIGN_PREVIEW_MAP_SIZE;
auto& gameState = GetGameState();
gameState.MapSize = TRACK_DESIGN_PREVIEW_MAP_SIZE;
// Reserve ~8 elements per tile
std::vector<TileElement> tileElements;
@@ -2171,7 +2172,8 @@ static void TrackDesignPreviewClearMap()
element->AsSurface()->SetOwnership(OWNERSHIP_OWNED);
element->AsSurface()->SetParkFences(0);
}
SetTileElements(std::move(tileElements));
SetTileElements(gameState, std::move(tileElements));
}
bool TrackDesignAreEntranceAndExitPlaced()

View File

@@ -147,9 +147,8 @@ const std::vector<TileElement>& GetTileElements()
return GetGameState().TileElements;
}
void SetTileElements(std::vector<TileElement>&& tileElements)
void SetTileElements(GameState_t& gameState, std::vector<TileElement>&& tileElements)
{
auto& gameState = GetGameState();
gameState.TileElements = std::move(tileElements);
_tileIndex = TilePointerIndex<TileElement>(
kMaximumMapSizeTechnical, gameState.TileElements.data(), gameState.TileElements.size());
@@ -211,7 +210,7 @@ std::vector<TileElement> GetReorganisedTileElementsWithoutGhosts()
return newElements;
}
static void ReorganiseTileElements(size_t capacity)
static void ReorganiseTileElements(GameState_t& gameState, size_t capacity)
{
ContextSetCurrentCursor(CursorID::ZZZ);
@@ -236,12 +235,19 @@ static void ReorganiseTileElements(size_t capacity)
}
}
SetTileElements(std::move(newElements));
SetTileElements(gameState, std::move(newElements));
}
static void ReorganiseTileElements(size_t capacity)
{
auto& gameState = GetGameState();
ReorganiseTileElements(gameState, capacity);
}
void ReorganiseTileElements()
{
ReorganiseTileElements(GetGameState().TileElements.size());
auto& gameState = GetGameState();
ReorganiseTileElements(gameState, gameState.TileElements.size());
}
static bool MapCheckFreeElementsAndReorganise(size_t numElementsOnTile, size_t numNewElements)
@@ -454,9 +460,9 @@ BannerElement* MapGetBannerElementAt(const CoordsXYZ& bannerPos, uint8_t positio
void MapInit(const TileCoordsXY& size)
{
auto numTiles = kMaximumMapSizeTechnical * kMaximumMapSizeTechnical;
SetTileElements(std::vector<TileElement>(numTiles, GetDefaultSurfaceElement()));
auto& gameState = GetGameState();
SetTileElements(gameState, std::vector<TileElement>(numTiles, GetDefaultSurfaceElement()));
gameState.GrassSceneryTileLoopPosition = 0;
gameState.WidePathTileLoopPosition = {};
@@ -2294,7 +2300,8 @@ void ShiftMap(const TileCoordsXY& amount)
}
}
}
SetTileElements(std::move(newElements));
SetTileElements(gameState, std::move(newElements));
MapRemoveOutOfRangeElements();
for (auto& spawn : gameState.PeepSpawns)

View File

@@ -111,9 +111,14 @@ extern uint32_t gLandRemainingConstructionSales;
extern bool gMapLandRightsUpdateSuccess;
namespace OpenRCT2
{
struct GameState_t;
}
void ReorganiseTileElements();
const std::vector<TileElement>& GetTileElements();
void SetTileElements(std::vector<TileElement>&& tileElements);
void SetTileElements(OpenRCT2::GameState_t& gameState, std::vector<TileElement>&& tileElements);
void StashMap();
void UnstashMap();
std::vector<TileElement> GetReorganisedTileElementsWithoutGhosts();