diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 7c763eab7b..912138e7af 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -134,7 +134,7 @@ static InteractionInfo ViewportInteractionGetItemLeft(const ScreenCoordsXY& scre break; case ViewportInteractionItem::ParkEntrance: { - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; auto parkName = park.Name.c_str(); auto ft = Formatter(); diff --git a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp index 3cea51f898..34893d1e56 100644 --- a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp +++ b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp @@ -662,7 +662,7 @@ static uint64_t window_editor_objective_options_page_hold_down_widgets[] = { { case WIDX_PARK_NAME: { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; WindowTextInputRawOpen( this, WIDX_PARK_NAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, {}, park.Name.c_str(), ParkNameMaxLength); break; @@ -794,7 +794,7 @@ static uint64_t window_editor_objective_options_page_hold_down_widgets[] = { if (gameState.ScenarioName.empty()) { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; gameState.ScenarioName = park.Name; } break; @@ -972,7 +972,7 @@ static uint64_t window_editor_objective_options_page_hold_down_widgets[] = { widthToSet = widgets[WIDX_PARK_NAME].left - 16; { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; auto parkName = park.Name.c_str(); ft = Formatter(); diff --git a/src/openrct2-ui/windows/Finances.cpp b/src/openrct2-ui/windows/Finances.cpp index f1fa47c280..dbb4c73863 100644 --- a/src/openrct2-ui/windows/Finances.cpp +++ b/src/openrct2-ui/windows/Finances.cpp @@ -870,7 +870,7 @@ static Widget _windowFinancesResearchWidgets[] = break; default: { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; auto parkName = park.Name.c_str(); ft.Add(STR_STRING); ft.Add(parkName); diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index fadc34476a..5f66742b80 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -1629,7 +1629,7 @@ static_assert(_guestWindowPageWidgets.size() == WINDOW_GUEST_PAGE_COUNT); std::pair InventoryFormatItem(Guest& guest, ShopItem item) const { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; auto parkName = park.Name.c_str(); // Default arguments diff --git a/src/openrct2-ui/windows/LoadSave.cpp b/src/openrct2-ui/windows/LoadSave.cpp index dd5f9dd067..0702650c69 100644 --- a/src/openrct2-ui/windows/LoadSave.cpp +++ b/src/openrct2-ui/windows/LoadSave.cpp @@ -458,7 +458,7 @@ static Widget window_loadsave_widgets[] = } else { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; auto buffer = park.Name; if (buffer.empty()) { diff --git a/src/openrct2-ui/windows/Park.cpp b/src/openrct2-ui/windows/Park.cpp index 02310b3c7a..bbe0924379 100644 --- a/src/openrct2-ui/windows/Park.cpp +++ b/src/openrct2-ui/windows/Park.cpp @@ -402,7 +402,7 @@ static constexpr WindowParkAward _parkAwards[] = { void PrepareWindowTitleText() { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; auto parkName = park.Name.c_str(); auto ft = Formatter::Common(); @@ -423,7 +423,7 @@ static constexpr WindowParkAward _parkAwards[] = { break; case WIDX_RENAME: { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; WindowTextInputRawOpen( this, WIDX_RENAME, STR_PARK_NAME, STR_ENTER_PARK_NAME, {}, park.Name.c_str(), USER_STRING_MAX_LENGTH); break; @@ -512,7 +512,7 @@ static constexpr WindowParkAward _parkAwards[] = { // Set open / close park button state { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; auto parkName = park.Name.c_str(); auto ft = Formatter::Common(); diff --git a/src/openrct2/GameState.cpp b/src/openrct2/GameState.cpp index 72eb352a8b..7486b48c42 100644 --- a/src/openrct2/GameState.cpp +++ b/src/openrct2/GameState.cpp @@ -62,7 +62,6 @@ namespace OpenRCT2 GameState::GameState() { - _park = std::make_unique(); } /** @@ -77,7 +76,7 @@ void GameState::InitAll(const TileCoordsXY& mapSize) gameState.CurrentTicks = 0; MapInit(mapSize); - _park->Initialise(); + gameState.Park.Initialise(); FinanceInit(); BannerInit(gameState); RideInitAll(); @@ -340,7 +339,7 @@ void GameState::UpdateLogic() if (!(gScreenFlags & SCREEN_FLAGS_EDITOR)) { - _park->Update(gameState.Date); + gameState.Park.Update(gameState.Date); } ResearchUpdate(); diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index a5a6180ddf..b0742f8ea6 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -38,6 +38,7 @@ namespace OpenRCT2 struct GameState_t { + ::OpenRCT2::Park Park{}; uint32_t CurrentTicks{}; ::OpenRCT2::Date Date; uint64_t ParkFlags; @@ -162,18 +163,10 @@ namespace OpenRCT2 */ class GameState final { - private: - std::unique_ptr _park; - public: GameState(); GameState(const GameState&) = delete; - Park& GetPark() - { - return *_park; - } - void InitAll(const TileCoordsXY& mapSize); void Tick(); void UpdateLogic(); diff --git a/src/openrct2/actions/CheatSetAction.cpp b/src/openrct2/actions/CheatSetAction.cpp index 30d2c73b4f..780016fa91 100644 --- a/src/openrct2/actions/CheatSetAction.cpp +++ b/src/openrct2/actions/CheatSetAction.cpp @@ -607,7 +607,7 @@ void CheatSetAction::ClearLoan() const void CheatSetAction::GenerateGuests(int32_t count) const { - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; for (int32_t i = 0; i < count; i++) { park.GenerateGuest(); diff --git a/src/openrct2/actions/ParkSetNameAction.cpp b/src/openrct2/actions/ParkSetNameAction.cpp index 549d99a1bf..668aa52dfb 100644 --- a/src/openrct2/actions/ParkSetNameAction.cpp +++ b/src/openrct2/actions/ParkSetNameAction.cpp @@ -56,7 +56,7 @@ GameActions::Result ParkSetNameAction::Query() const GameActions::Result ParkSetNameAction::Execute() const { // Do a no-op if new name is the same as the current name is the same - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; if (_name != park.Name) { park.Name = _name; diff --git a/src/openrct2/actions/RideDemolishAction.cpp b/src/openrct2/actions/RideDemolishAction.cpp index 113c4fd675..c42c08c242 100644 --- a/src/openrct2/actions/RideDemolishAction.cpp +++ b/src/openrct2/actions/RideDemolishAction.cpp @@ -156,7 +156,7 @@ GameActions::Result RideDemolishAction::DemolishRide(Ride& ride) const } ride.Delete(); - GetGameState().ParkValue = GetContext()->GetGameState()->GetPark().CalculateParkValue(); + GetGameState().ParkValue = GetGameState().Park.CalculateParkValue(); // Close windows related to the demolished ride WindowCloseByNumber(WindowClass::RideConstruction, rideId.ToUnderlying()); diff --git a/src/openrct2/interface/Screenshot.cpp b/src/openrct2/interface/Screenshot.cpp index 9c649088b3..36c5e5025d 100644 --- a/src/openrct2/interface/Screenshot.cpp +++ b/src/openrct2/interface/Screenshot.cpp @@ -105,7 +105,7 @@ void ScreenshotCheck() static std::string ScreenshotGetParkName() { - return GetContext()->GetGameState()->GetPark().Name; + return GetGameState().Park.Name; } static std::string ScreenshotGetDirectory() diff --git a/src/openrct2/network/DiscordService.cpp b/src/openrct2/network/DiscordService.cpp index df4d4ec2c2..ccfe7f095e 100644 --- a/src/openrct2/network/DiscordService.cpp +++ b/src/openrct2/network/DiscordService.cpp @@ -63,12 +63,8 @@ DiscordService::~DiscordService() static std::string GetParkName() { - auto gameState = OpenRCT2::GetContext()->GetGameState(); - if (gameState != nullptr) - { - return gameState->GetPark().Name; - } - return {}; + auto& gameState = OpenRCT2::GetGameState(); + return gameState.Park.Name; } void DiscordService::Tick() diff --git a/src/openrct2/paint/tile_element/Paint.Entrance.cpp b/src/openrct2/paint/tile_element/Paint.Entrance.cpp index c97eb3e727..7be70b9f3b 100644 --- a/src/openrct2/paint/tile_element/Paint.Entrance.cpp +++ b/src/openrct2/paint/tile_element/Paint.Entrance.cpp @@ -222,7 +222,7 @@ static void PaintParkEntranceScrollingText( auto ft = Formatter(); if (GetGameState().ParkFlags & PARK_FLAGS_PARK_OPEN) { - const auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + const auto& park = OpenRCT2::GetGameState().Park; auto name = park.Name.c_str(); ft.Add(STR_STRING); ft.Add(name); diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index 134c6b1009..51ce303c33 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -420,11 +420,7 @@ namespace OpenRCT2 os.ReadWriteChunk(ParkFileChunkType::SCENARIO, [&gameState, &os](OrcaStream::ChunkStream& cs) { cs.ReadWrite(gameState.ScenarioCategory); ReadWriteStringTable(cs, gameState.ScenarioName, "en-GB"); - - // TODO: Use the passed gameState instead of the global one. - auto& park = GetContext()->GetGameState()->GetPark(); - ReadWriteStringTable(cs, park.Name, "en-GB"); - + ReadWriteStringTable(cs, gameState.Park.Name, "en-GB"); ReadWriteStringTable(cs, gameState.ScenarioDetails, "en-GB"); cs.ReadWrite(gameState.ScenarioObjective.Type); @@ -653,8 +649,7 @@ namespace OpenRCT2 void ReadWritePluginStorageChunk(GameState_t& gameState, OrcaStream& os) { - // TODO: Use the passed gameState instead of the global one. - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = gameState.Park; if (os.GetMode() == OrcaStream::Mode::WRITING) { #ifdef ENABLE_SCRIPTING @@ -798,9 +793,7 @@ namespace OpenRCT2 { os.ReadWriteChunk( ParkFileChunkType::PARK, [version = os.GetHeader().TargetVersion, &gameState](OrcaStream::ChunkStream& cs) { - // TODO: Use the passed gameState instead of the global one. - auto& park = GetContext()->GetGameState()->GetPark(); - cs.ReadWrite(park.Name); + cs.ReadWrite(gameState.Park.Name); cs.ReadWrite(gameState.Cash); cs.ReadWrite(gameState.BankLoan); cs.ReadWrite(gameState.MaxBankLoan); diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 378a711eba..b7c34cc69c 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -275,7 +275,7 @@ namespace RCT1 { // Use the ratio between the old and new park value to calcute the ratio to // use for the park value history and the goal. - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; _parkValueConversionFactor = (park.CalculateParkValue() * 10) / _s4.ParkValue; } else @@ -2136,7 +2136,7 @@ namespace RCT1 } } - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; park.Name = std::move(parkName); } @@ -2150,7 +2150,7 @@ namespace RCT1 // Park rating gameState.ParkRating = _s4.ParkRating; - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; park.ResetHistories(); std::copy(std::begin(_s4.ParkRatingHistory), std::end(_s4.ParkRatingHistory), gameState.ParkRatingHistory); for (size_t i = 0; i < std::size(_s4.GuestsInParkHistory); i++) @@ -2351,7 +2351,7 @@ namespace RCT1 gameState.ScenarioDetails = std::move(details); if (_isScenario && !parkName.empty()) { - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; park.Name = std::move(parkName); } } diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 3e12ee3b7d..4be0af6967 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -307,7 +307,7 @@ namespace RCT2 gameState.ParkRating = _s6.ParkRating; - auto& park = OpenRCT2::GetContext()->GetGameState()->GetPark(); + auto& park = OpenRCT2::GetGameState().Park; park.ResetHistories(); std::copy(std::begin(_s6.ParkRatingHistory), std::end(_s6.ParkRatingHistory), gameState.ParkRatingHistory); for (size_t i = 0; i < std::size(_s6.GuestsInParkHistory); i++) diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index aaec8425df..07df1e1936 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -100,7 +100,7 @@ void ScenarioReset(GameState_t& gameState) ScenerySetDefaultPlacementConfiguration(); News::InitQueue(); - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; gameState.ParkRating = park.CalculateParkRating(); gameState.ParkValue = park.CalculateParkValue(); gameState.CompanyValue = park.CalculateCompanyValue(); diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp index ae849cb189..bac2a9adc0 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.cpp +++ b/src/openrct2/scripting/bindings/world/ScPark.cpp @@ -278,13 +278,13 @@ namespace OpenRCT2::Scripting std::string ScPark::name_get() const { - return GetContext()->GetGameState()->GetPark().Name; + return GetGameState().Park.Name; } void ScPark::name_set(std::string value) { ThrowIfGameStateNotMutable(); - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; if (park.Name != value) { park.Name = std::move(value); diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index 3263a2f4b8..94d32218c1 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -152,7 +152,7 @@ void ParkUpdateFencesAroundTile(const CoordsXY& coords) void ParkSetForcedRating(int32_t rating) { _forcedParkRating = rating; - auto& park = GetContext()->GetGameState()->GetPark(); + auto& park = GetGameState().Park; GetGameState().ParkRating = park.CalculateParkRating(); auto intent = Intent(INTENT_ACTION_UPDATE_PARK_RATING); ContextBroadcastIntent(&intent); @@ -776,13 +776,13 @@ void Park::UpdateHistories() int32_t ParkIsOpen() { - return GetContext()->GetGameState()->GetPark().IsOpen(); + return GetGameState().Park.IsOpen(); } uint32_t ParkCalculateSize() { auto& gameState = GetGameState(); - auto tiles = GetContext()->GetGameState()->GetPark().CalculateParkSize(); + auto tiles = GetGameState().Park.CalculateParkSize(); if (tiles != gameState.ParkSize) { gameState.ParkSize = tiles; diff --git a/test/tests/PlayTests.cpp b/test/tests/PlayTests.cpp index fafade06eb..360c2911f9 100644 --- a/test/tests/PlayTests.cpp +++ b/test/tests/PlayTests.cpp @@ -98,11 +98,13 @@ TEST_F(PlayTests, SecondGuestInQueueShouldNotRideIfNoFunds) auto gs = context->GetGameState(); ASSERT_NE(gs, nullptr); + + auto& gameState = GetGameState(); // Open park for free but charging for rides execute(ParkParameter::Open); execute(0); - GetGameState().ParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; + gameState.ParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; // Find ferris wheel auto rideManager = GetRideManager(); @@ -116,10 +118,10 @@ TEST_F(PlayTests, SecondGuestInQueueShouldNotRideIfNoFunds) execute(ferrisWheel.id, 0, true); // Ignore intensity to stimulate peeps to queue into ferris wheel - GetGameState().Cheats.IgnoreRideIntensity = true; + gameState.Cheats.IgnoreRideIntensity = true; // Insert a rich guest - auto richGuest = gs->GetPark().GenerateGuest(); + auto richGuest = gameState.Park.GenerateGuest(); richGuest->CashInPocket = 3000; // Wait for rich guest to get in queue @@ -127,7 +129,7 @@ TEST_F(PlayTests, SecondGuestInQueueShouldNotRideIfNoFunds) ASSERT_TRUE(matched); // Insert poor guest - auto poorGuest = gs->GetPark().GenerateGuest(); + auto poorGuest = gameState.Park.GenerateGuest(); poorGuest->CashInPocket = 5; // Wait for poor guest to get in queue @@ -159,11 +161,13 @@ TEST_F(PlayTests, CarRideWithOneCarOnlyAcceptsTwoGuests) auto gs = context->GetGameState(); ASSERT_NE(gs, nullptr); + + auto& gameState = GetGameState(); // Open park for free but charging for rides execute(ParkParameter::Open); execute(0); - GetGameState().ParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; + gameState.ParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; // Find car ride auto rideManager = GetRideManager(); @@ -176,13 +180,13 @@ TEST_F(PlayTests, CarRideWithOneCarOnlyAcceptsTwoGuests) execute(carRide.id, 0, true); // Ignore intensity to stimulate peeps to queue into the ride - GetGameState().Cheats.IgnoreRideIntensity = true; + gameState.Cheats.IgnoreRideIntensity = true; // Create some guests std::vector guests; for (int i = 0; i < 25; i++) { - guests.push_back(gs->GetPark().GenerateGuest()); + guests.push_back(gameState.Park.GenerateGuest()); } // Wait until one of them is riding