From 37e143565bae2d54f84619d46f482d3ee52fa840 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Thu, 11 Sep 2025 13:41:58 +0200 Subject: [PATCH] Park: pass ParkData& and GameState_t& refs down --- src/openrct2/Editor.cpp | 3 +- src/openrct2/actions/MapChangeSizeAction.cpp | 4 +- src/openrct2/actions/RideDemolishAction.cpp | 3 +- src/openrct2/scenario/Scenario.cpp | 8 +- src/openrct2/world/Park.cpp | 86 +++++++++----------- src/openrct2/world/Park.h | 9 +- 6 files changed, 53 insertions(+), 60 deletions(-) diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index a7093cbcb0..7432c28120 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -499,7 +499,8 @@ namespace OpenRCT2::Editor ResultWithMessage CheckPark() { auto& gameState = getGameState(); - int32_t parkSize = Park::UpdateSize(gameState); + auto& park = gameState.park; + int32_t parkSize = Park::UpdateSize(park, gameState); if (parkSize == 0) { return { false, STR_PARK_MUST_OWN_SOME_LAND }; diff --git a/src/openrct2/actions/MapChangeSizeAction.cpp b/src/openrct2/actions/MapChangeSizeAction.cpp index 3480e90951..c5f4dfba0b 100644 --- a/src/openrct2/actions/MapChangeSizeAction.cpp +++ b/src/openrct2/actions/MapChangeSizeAction.cpp @@ -83,7 +83,9 @@ namespace OpenRCT2::GameActions auto* ctx = OpenRCT2::GetContext(); auto& uiContext = ctx->GetUiContext(); auto* windowManager = uiContext.GetWindowManager(); - Park::UpdateSize(gameState); + + auto& park = gameState.park; + Park::UpdateSize(park, gameState); windowManager->BroadcastIntent(Intent(INTENT_ACTION_MAP)); GfxInvalidateScreen(); diff --git a/src/openrct2/actions/RideDemolishAction.cpp b/src/openrct2/actions/RideDemolishAction.cpp index 6c605d37e2..71c9057a62 100644 --- a/src/openrct2/actions/RideDemolishAction.cpp +++ b/src/openrct2/actions/RideDemolishAction.cpp @@ -156,7 +156,8 @@ namespace OpenRCT2::GameActions } ride.remove(); - getGameState().park.value = Park::CalculateParkValue(); + auto& park = gameState.park; + park.value = Park::CalculateParkValue(park, gameState); // Close windows related to the demolished ride auto* windowMgr = Ui::GetWindowManager(); diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index bd98e14dcf..329a056334 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -102,9 +102,9 @@ void ScenarioReset(GameState_t& gameState) News::InitQueue(gameState); auto& park = gameState.park; - park.rating = Park::CalculateParkRating(); - park.value = Park::CalculateParkValue(); - park.companyValue = Park::CalculateCompanyValue(); + park.rating = Park::CalculateParkRating(park, gameState); + park.value = Park::CalculateParkValue(park, gameState); + park.companyValue = Park::CalculateCompanyValue(park); park.historicalProfit = gameState.scenarioOptions.initialCash - park.bankLoan; park.cash = gameState.scenarioOptions.initialCash; @@ -138,7 +138,7 @@ void ScenarioReset(GameState_t& gameState) ResetAllRideBuildDates(); ResetDate(); Duck::RemoveAll(); - Park::UpdateSize(gameState); + Park::UpdateSize(park, gameState); MapCountRemainingLandRights(); Staff::ResetStats(); diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index a6bc81e69e..03e5759276 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -78,11 +78,11 @@ namespace OpenRCT2::Park return result; } - static money64 calculateTotalRideValueForMoney() + static money64 calculateTotalRideValueForMoney(const ParkData& park, const GameState_t& gameState) { money64 totalRideValue = 0; - bool ridePricesUnlocked = RidePricesUnlocked() && !(getGameState().park.flags & PARK_FLAGS_NO_MONEY); - for (auto& ride : GetRideManager()) + bool ridePricesUnlocked = RidePricesUnlocked() && !(gameState.park.flags & PARK_FLAGS_NO_MONEY); + for (auto& ride : RideManager(gameState)) { if (ride.status != RideStatus::open) continue; @@ -108,15 +108,12 @@ namespace OpenRCT2::Park return totalRideValue; } - static uint32_t calculateSuggestedMaxGuests() + static uint32_t calculateSuggestedMaxGuests(const ParkData& park, const GameState_t& gameState) { uint32_t suggestedMaxGuests = 0; uint32_t difficultGenerationBonus = 0; - // TODO: pass park by ref - auto& park = getGameState().park; - - for (auto& ride : GetRideManager()) + for (auto& ride : RideManager(gameState)) { if (ride.status != RideStatus::open) continue; @@ -172,11 +169,8 @@ namespace OpenRCT2::Park return suggestedMaxGuests; } - static uint32_t calculateGuestGenerationProbability() + static uint32_t calculateGuestGenerationProbability(ParkData& park) { - // TODO: pass park by ref - auto& park = getGameState().park; - // Begin with 50 + park rating uint32_t probability = 50 + std::clamp(park.rating - 200, 0, 650); @@ -227,11 +221,8 @@ namespace OpenRCT2::Park return probability; } - static void generateGuests(GameState_t& gameState) + static void generateGuests(ParkData& park, GameState_t& gameState) { - // TODO: pass park by ref - auto& park = gameState.park; - // Generate a new guest for some probability if (static_cast(ScenarioRand() & 0xFFFF) < park.guestGenerationProbability) { @@ -350,12 +341,12 @@ namespace OpenRCT2::Park // Every ~13 seconds if (currentTicks % 512 == 0) { - park.rating = CalculateParkRating(); - park.value = Park::CalculateParkValue(); - park.companyValue = CalculateCompanyValue(); - park.totalRideValueForMoney = calculateTotalRideValueForMoney(); - park.suggestedGuestMaximum = calculateSuggestedMaxGuests(); - park.guestGenerationProbability = calculateGuestGenerationProbability(); + park.rating = CalculateParkRating(park, gameState); + park.value = CalculateParkValue(park, gameState); + park.companyValue = CalculateCompanyValue(park); + park.totalRideValueForMoney = calculateTotalRideValueForMoney(park, gameState); + park.suggestedGuestMaximum = calculateSuggestedMaxGuests(park, gameState); + park.guestGenerationProbability = calculateGuestGenerationProbability(park); windowMgr->InvalidateByClass(WindowClass::Finances); auto intent = Intent(INTENT_ACTION_UPDATE_PARK_RATING); @@ -365,14 +356,14 @@ namespace OpenRCT2::Park // Every ~102 seconds if (currentTicks % 4096 == 0) { - park.size = CalculateParkSize(); + park.size = CalculateParkSize(park); windowMgr->InvalidateByClass(WindowClass::ParkInformation); } - generateGuests(gameState); + generateGuests(park, gameState); } - uint32_t CalculateParkSize() + uint32_t CalculateParkSize(ParkData& park) { uint32_t tiles = 0; TileElementIterator it; @@ -389,7 +380,6 @@ namespace OpenRCT2::Park } while (TileElementIteratorNext(&it)); // TODO: pass park by ref - auto& park = getGameState().park; if (tiles != park.size) { park.size = tiles; @@ -400,17 +390,15 @@ namespace OpenRCT2::Park return tiles; } - int32_t CalculateParkRating() + int32_t CalculateParkRating(const ParkData& park, const GameState_t& gameState) { - auto& gameState = getGameState(); - if (gameState.cheats.forcedParkRating != kForcedParkRatingDisabled) { return gameState.cheats.forcedParkRating; } int32_t result = 1150; - if (gameState.park.flags & PARK_FLAGS_DIFFICULT_PARK_RATING) + if (park.flags & PARK_FLAGS_DIFFICULT_PARK_RATING) { result = 1050; } @@ -418,7 +406,7 @@ namespace OpenRCT2::Park // Guests { // -150 to +3 based on a range of guests from 0 to 2000 - result -= 150 - (std::min(2000, gameState.park.numGuestsInPark) / 13); + result -= 150 - (std::min(2000, park.numGuestsInPark) / 13); // Find the number of happy peeps and the number of peeps who can't find the park exit uint32_t happyGuestCount = 0; @@ -440,9 +428,9 @@ namespace OpenRCT2::Park // Peep happiness -500 to +0 result -= 500; - if (gameState.park.numGuestsInPark > 0) + if (park.numGuestsInPark > 0) { - result += 2 * std::min(250u, (happyGuestCount * 300) / gameState.park.numGuestsInPark); + result += 2 * std::min(250u, (happyGuestCount * 300) / park.numGuestsInPark); } // Up to 25 guests can be lost without affecting the park rating. @@ -459,7 +447,7 @@ namespace OpenRCT2::Park int32_t totalRideUptime = 0; int32_t totalRideIntensity = 0; int32_t totalRideExcitement = 0; - for (auto& ride : GetRideManager()) + for (auto& ride : RideManager(gameState)) { totalRideUptime += 100 - ride.downtime; if (RideHasRatings(ride)) @@ -513,34 +501,35 @@ namespace OpenRCT2::Park result -= 600 - (4 * (150 - std::min(150, litterCount))); } - result -= gameState.park.ratingCasualtyPenalty; + result -= park.ratingCasualtyPenalty; result = std::clamp(result, 0, 999); return result; } - money64 CalculateParkValue() + money64 CalculateParkValue(const ParkData& park, const GameState_t& gameState) { // Sum ride values money64 result = 0; - for (const auto& ride : GetRideManager()) + for (const auto& ride : RideManager(gameState)) { result += calculateRideValue(ride); } - // TODO: pass park by ref - auto& park = getGameState().park; - // +7.00 per guest result += static_cast(park.numGuestsInPark) * 7.00_GBP; return result; } - money64 CalculateCompanyValue() + // TODO: refactor S4Importer so this hack is no longer needed + money64 CalculateParkValue() { - // TODO: pass park by ref - auto& park = getGameState().park; + auto& gameState = getGameState(); + return CalculateParkValue(gameState.park, gameState); + } + money64 CalculateCompanyValue(const ParkData& park) + { auto result = park.value - park.bankLoan; // Clamp addition to prevent overflow @@ -648,12 +637,9 @@ namespace OpenRCT2::Park windowMgr->InvalidateByClass(WindowClass::Finances); } - uint32_t UpdateSize(GameState_t& gameState) + uint32_t UpdateSize(ParkData& park, GameState_t& gameState) { - // TODO: pass park by ref - auto& park = gameState.park; - - auto tiles = CalculateParkSize(); + auto tiles = CalculateParkSize(park, gameState); if (tiles != park.size) { park.size = tiles; @@ -754,7 +740,9 @@ namespace OpenRCT2::Park { auto& gameState = getGameState(); gameState.cheats.forcedParkRating = rating; - gameState.park.rating = CalculateParkRating(); + + auto& park = gameState.park; + park.rating = CalculateParkRating(park, gameState); auto intent = Intent(INTENT_ACTION_UPDATE_PARK_RATING); ContextBroadcastIntent(&intent); diff --git a/src/openrct2/world/Park.h b/src/openrct2/world/Park.h index 1a9b24a6bc..6ea2c8a2fc 100644 --- a/src/openrct2/world/Park.h +++ b/src/openrct2/world/Park.h @@ -27,10 +27,11 @@ namespace OpenRCT2::Park void Initialise(GameState_t& gameState); void Update(GameState_t& gameState, const Date& date); - uint32_t CalculateParkSize(); - int32_t CalculateParkRating(); + uint32_t CalculateParkSize(ParkData& park); + int32_t CalculateParkRating(const ParkData& park, const GameState_t& gameState); + money64 CalculateParkValue(const ParkData& park, const GameState_t& gameState); money64 CalculateParkValue(); - money64 CalculateCompanyValue(); + money64 CalculateCompanyValue(const ParkData& park); Guest* GenerateGuest(); @@ -39,7 +40,7 @@ namespace OpenRCT2::Park void SetForcedRating(int32_t rating); int32_t GetForcedRating(); - uint32_t UpdateSize(GameState_t& gameState); + uint32_t UpdateSize(ParkData& park, GameState_t& gameState); void UpdateFences(const CoordsXY& coords); void UpdateFencesAroundTile(const CoordsXY& coords);