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:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user