From 1d956b6dfb9d37b92623d4ea41e0d0d1105cb9b2 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Fri, 19 Sep 2025 12:51:17 +0200 Subject: [PATCH] Pass ParkData& to scenario objective checks (#25209) --- src/openrct2/scenario/Scenario.cpp | 3 +- src/openrct2/scenario/ScenarioObjective.cpp | 54 +++++++++------------ src/openrct2/scenario/ScenarioObjective.h | 25 ++++++---- 3 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 9498ec46c1..470beb6949 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -620,7 +620,8 @@ bool AllowEarlyCompletion() static void ScenarioCheckObjective(GameState_t& gameState) { - auto status = gameState.scenarioOptions.objective.Check(gameState); + auto& park = gameState.park; + auto status = gameState.scenarioOptions.objective.Check(park, gameState); if (status == ObjectiveStatus::Success) { ScenarioSuccess(gameState); diff --git a/src/openrct2/scenario/ScenarioObjective.cpp b/src/openrct2/scenario/ScenarioObjective.cpp index 16be0ea35e..9b8427e194 100644 --- a/src/openrct2/scenario/ScenarioObjective.cpp +++ b/src/openrct2/scenario/ScenarioObjective.cpp @@ -18,14 +18,14 @@ namespace OpenRCT2::Scenario { - ObjectiveStatus Objective::CheckGuestsBy(GameState_t& gameState) const + ObjectiveStatus Objective::CheckGuestsBy(Park::ParkData& park, GameState_t& gameState) const { - auto parkRating = gameState.park.rating; + auto parkRating = park.rating; int32_t currentMonthYear = GetDate().GetMonthsElapsed(); if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion()) { - if (parkRating >= 600 && gameState.park.numGuestsInPark >= NumGuests) + if (parkRating >= 600 && park.numGuestsInPark >= NumGuests) { return ObjectiveStatus::Success; } @@ -39,11 +39,11 @@ namespace OpenRCT2::Scenario return ObjectiveStatus::Undecided; } - ObjectiveStatus Objective::CheckParkValueBy(GameState_t& gameState) const + ObjectiveStatus Objective::CheckParkValueBy(Park::ParkData& park, GameState_t& gameState) const { int32_t currentMonthYear = GetDate().GetMonthsElapsed(); money64 objectiveParkValue = Currency; - money64 parkValue = gameState.park.value; + money64 parkValue = park.value; if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion()) { @@ -66,7 +66,7 @@ namespace OpenRCT2::Scenario * excitement >= 600 . * rct2: **/ - ObjectiveStatus Objective::Check10RollerCoasters(GameState_t& gameState) const + ObjectiveStatus Objective::Check10RollerCoasters(Park::ParkData& park, GameState_t& gameState) const { auto rcs = 0; BitSet type_already_counted; @@ -98,10 +98,8 @@ namespace OpenRCT2::Scenario * * rct2: 0x0066A13C */ - ObjectiveStatus Objective::CheckGuestsAndRating(GameState_t& gameState) const + ObjectiveStatus Objective::CheckGuestsAndRating(Park::ParkData& park, GameState_t& gameState) const { - auto& park = gameState.park; - // TODO: make park-specific if (park.rating < 700 && GetDate().GetMonthsElapsed() >= 1) { @@ -154,11 +152,8 @@ namespace OpenRCT2::Scenario return ObjectiveStatus::Undecided; } - ObjectiveStatus Objective::CheckMonthlyRideIncome(GameState_t& gameState) const + ObjectiveStatus Objective::CheckMonthlyRideIncome(Park::ParkData& park, GameState_t& gameState) const { - // TODO: pass park by ref - const auto& park = gameState.park; - money64 lastMonthRideIncome = park.expenditureTable[1][EnumValue(ExpenditureType::parkRideTickets)]; if (lastMonthRideIncome >= Currency) { @@ -173,7 +168,7 @@ namespace OpenRCT2::Scenario * excitement > 700 and a minimum length; * rct2: 0x0066A6B5 */ - ObjectiveStatus Objective::Check10RollerCoastersLength(GameState_t& gameState) const + ObjectiveStatus Objective::Check10RollerCoastersLength(Park::ParkData& park, GameState_t& gameState) const { BitSet type_already_counted; auto rcs = 0; @@ -204,7 +199,7 @@ namespace OpenRCT2::Scenario return ObjectiveStatus::Undecided; } - ObjectiveStatus Objective::CheckFinish5RollerCoasters(GameState_t& gameState) const + ObjectiveStatus Objective::CheckFinish5RollerCoasters(Park::ParkData& park, GameState_t& gameState) const { // Originally, this did not check for null rides, neither did it check if // the rides are even rollercoasters, never mind the right rollercoasters to be finished. @@ -232,10 +227,8 @@ namespace OpenRCT2::Scenario return ObjectiveStatus::Undecided; } - ObjectiveStatus Objective::CheckRepayLoanAndParkValue(GameState_t& gameState) const + ObjectiveStatus Objective::CheckRepayLoanAndParkValue(Park::ParkData& park, GameState_t& gameState) const { - // TODO: pass park by ref - const auto& park = gameState.park; money64 parkValue = park.value; money64 currentLoan = park.bankLoan; @@ -247,11 +240,8 @@ namespace OpenRCT2::Scenario return ObjectiveStatus::Undecided; } - ObjectiveStatus Objective::CheckMonthlyFoodIncome(GameState_t& gameState) const + ObjectiveStatus Objective::CheckMonthlyFoodIncome(Park::ParkData& park, GameState_t& gameState) const { - // TODO: pass park by ref - const auto& park = gameState.park; - const auto* lastMonthExpenditure = park.expenditureTable[1]; auto lastMonthProfit = lastMonthExpenditure[EnumValue(ExpenditureType::shopSales)] + lastMonthExpenditure[EnumValue(ExpenditureType::shopStock)] @@ -270,7 +260,7 @@ namespace OpenRCT2::Scenario * Checks the win/lose conditions of the current objective. * rct2: 0x0066A4B2 */ - ObjectiveStatus Objective::Check(GameState_t& gameState) const + ObjectiveStatus Objective::Check(Park::ParkData& park, GameState_t& gameState) const { if (gameState.scenarioCompletedCompanyValue != kMoney64Undefined) { @@ -280,23 +270,23 @@ namespace OpenRCT2::Scenario switch (Type) { case ObjectiveType::guestsBy: - return CheckGuestsBy(gameState); + return CheckGuestsBy(park, gameState); case ObjectiveType::parkValueBy: - return CheckParkValueBy(gameState); + return CheckParkValueBy(park, gameState); case ObjectiveType::tenRollercoasters: - return Check10RollerCoasters(gameState); + return Check10RollerCoasters(park, gameState); case ObjectiveType::guestsAndRating: - return CheckGuestsAndRating(gameState); + return CheckGuestsAndRating(park, gameState); case ObjectiveType::monthlyRideIncome: - return CheckMonthlyRideIncome(gameState); + return CheckMonthlyRideIncome(park, gameState); case ObjectiveType::tenRollercoastersLength: - return Check10RollerCoastersLength(gameState); + return Check10RollerCoastersLength(park, gameState); case ObjectiveType::finishFiveRollercoasters: - return CheckFinish5RollerCoasters(gameState); + return CheckFinish5RollerCoasters(park, gameState); case ObjectiveType::repayLoanAndParkValue: - return CheckRepayLoanAndParkValue(gameState); + return CheckRepayLoanAndParkValue(park, gameState); case ObjectiveType::monthlyFoodIncome: - return CheckMonthlyFoodIncome(gameState); + return CheckMonthlyFoodIncome(park, gameState); default: return ObjectiveStatus::Undecided; } diff --git a/src/openrct2/scenario/ScenarioObjective.h b/src/openrct2/scenario/ScenarioObjective.h index ee97a37e08..88685a677e 100644 --- a/src/openrct2/scenario/ScenarioObjective.h +++ b/src/openrct2/scenario/ScenarioObjective.h @@ -18,6 +18,11 @@ namespace OpenRCT2 struct GameState_t; } +namespace OpenRCT2::Park +{ + struct ParkData; +} + namespace OpenRCT2::Scenario { enum class ObjectiveType : uint8_t @@ -76,17 +81,17 @@ namespace OpenRCT2::Scenario return objectiveAllowedByMoneyUsage && objectiveAllowedByPaymentSettings; } - ObjectiveStatus Check(GameState_t& gameState) const; + ObjectiveStatus Check(Park::ParkData& park, GameState_t& gameState) const; private: - ObjectiveStatus CheckGuestsBy(GameState_t& gameState) const; - ObjectiveStatus CheckParkValueBy(GameState_t& gameState) const; - ObjectiveStatus Check10RollerCoasters(GameState_t& gameState) const; - ObjectiveStatus CheckGuestsAndRating(GameState_t& gameState) const; - ObjectiveStatus CheckMonthlyRideIncome(GameState_t& gameState) const; - ObjectiveStatus Check10RollerCoastersLength(GameState_t& gameState) const; - ObjectiveStatus CheckFinish5RollerCoasters(GameState_t& gameState) const; - ObjectiveStatus CheckRepayLoanAndParkValue(GameState_t& gameState) const; - ObjectiveStatus CheckMonthlyFoodIncome(GameState_t& gameState) const; + ObjectiveStatus CheckGuestsBy(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus CheckParkValueBy(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus Check10RollerCoasters(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus CheckGuestsAndRating(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus CheckMonthlyRideIncome(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus Check10RollerCoastersLength(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus CheckFinish5RollerCoasters(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus CheckRepayLoanAndParkValue(Park::ParkData& park, GameState_t& gameState) const; + ObjectiveStatus CheckMonthlyFoodIncome(Park::ParkData& park, GameState_t& gameState) const; }; } // namespace OpenRCT2::Scenario