1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-10 09:32:29 +01:00

Pass ParkData& to scenario objective checks (#25209)

This commit is contained in:
Aaron van Geffen
2025-09-19 12:51:17 +02:00
committed by GitHub
parent f5faef7bea
commit 1d956b6dfb
3 changed files with 39 additions and 43 deletions

View File

@@ -620,7 +620,8 @@ bool AllowEarlyCompletion()
static void ScenarioCheckObjective(GameState_t& gameState) 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) if (status == ObjectiveStatus::Success)
{ {
ScenarioSuccess(gameState); ScenarioSuccess(gameState);

View File

@@ -18,14 +18,14 @@
namespace OpenRCT2::Scenario 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(); int32_t currentMonthYear = GetDate().GetMonthsElapsed();
if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion()) if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion())
{ {
if (parkRating >= 600 && gameState.park.numGuestsInPark >= NumGuests) if (parkRating >= 600 && park.numGuestsInPark >= NumGuests)
{ {
return ObjectiveStatus::Success; return ObjectiveStatus::Success;
} }
@@ -39,11 +39,11 @@ namespace OpenRCT2::Scenario
return ObjectiveStatus::Undecided; 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(); int32_t currentMonthYear = GetDate().GetMonthsElapsed();
money64 objectiveParkValue = Currency; money64 objectiveParkValue = Currency;
money64 parkValue = gameState.park.value; money64 parkValue = park.value;
if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion()) if (currentMonthYear == MONTH_COUNT * Year || AllowEarlyCompletion())
{ {
@@ -66,7 +66,7 @@ namespace OpenRCT2::Scenario
* excitement >= 600 . * excitement >= 600 .
* rct2: * rct2:
**/ **/
ObjectiveStatus Objective::Check10RollerCoasters(GameState_t& gameState) const ObjectiveStatus Objective::Check10RollerCoasters(Park::ParkData& park, GameState_t& gameState) const
{ {
auto rcs = 0; auto rcs = 0;
BitSet<kMaxRideObjects> type_already_counted; BitSet<kMaxRideObjects> type_already_counted;
@@ -98,10 +98,8 @@ namespace OpenRCT2::Scenario
* *
* rct2: 0x0066A13C * 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 // TODO: make park-specific
if (park.rating < 700 && GetDate().GetMonthsElapsed() >= 1) if (park.rating < 700 && GetDate().GetMonthsElapsed() >= 1)
{ {
@@ -154,11 +152,8 @@ namespace OpenRCT2::Scenario
return ObjectiveStatus::Undecided; 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)]; money64 lastMonthRideIncome = park.expenditureTable[1][EnumValue(ExpenditureType::parkRideTickets)];
if (lastMonthRideIncome >= Currency) if (lastMonthRideIncome >= Currency)
{ {
@@ -173,7 +168,7 @@ namespace OpenRCT2::Scenario
* excitement > 700 and a minimum length; * excitement > 700 and a minimum length;
* rct2: 0x0066A6B5 * rct2: 0x0066A6B5
*/ */
ObjectiveStatus Objective::Check10RollerCoastersLength(GameState_t& gameState) const ObjectiveStatus Objective::Check10RollerCoastersLength(Park::ParkData& park, GameState_t& gameState) const
{ {
BitSet<kMaxRideObjects> type_already_counted; BitSet<kMaxRideObjects> type_already_counted;
auto rcs = 0; auto rcs = 0;
@@ -204,7 +199,7 @@ namespace OpenRCT2::Scenario
return ObjectiveStatus::Undecided; 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 // 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. // the rides are even rollercoasters, never mind the right rollercoasters to be finished.
@@ -232,10 +227,8 @@ namespace OpenRCT2::Scenario
return ObjectiveStatus::Undecided; 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 parkValue = park.value;
money64 currentLoan = park.bankLoan; money64 currentLoan = park.bankLoan;
@@ -247,11 +240,8 @@ namespace OpenRCT2::Scenario
return ObjectiveStatus::Undecided; 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]; const auto* lastMonthExpenditure = park.expenditureTable[1];
auto lastMonthProfit = lastMonthExpenditure[EnumValue(ExpenditureType::shopSales)] auto lastMonthProfit = lastMonthExpenditure[EnumValue(ExpenditureType::shopSales)]
+ lastMonthExpenditure[EnumValue(ExpenditureType::shopStock)] + lastMonthExpenditure[EnumValue(ExpenditureType::shopStock)]
@@ -270,7 +260,7 @@ namespace OpenRCT2::Scenario
* Checks the win/lose conditions of the current objective. * Checks the win/lose conditions of the current objective.
* rct2: 0x0066A4B2 * rct2: 0x0066A4B2
*/ */
ObjectiveStatus Objective::Check(GameState_t& gameState) const ObjectiveStatus Objective::Check(Park::ParkData& park, GameState_t& gameState) const
{ {
if (gameState.scenarioCompletedCompanyValue != kMoney64Undefined) if (gameState.scenarioCompletedCompanyValue != kMoney64Undefined)
{ {
@@ -280,23 +270,23 @@ namespace OpenRCT2::Scenario
switch (Type) switch (Type)
{ {
case ObjectiveType::guestsBy: case ObjectiveType::guestsBy:
return CheckGuestsBy(gameState); return CheckGuestsBy(park, gameState);
case ObjectiveType::parkValueBy: case ObjectiveType::parkValueBy:
return CheckParkValueBy(gameState); return CheckParkValueBy(park, gameState);
case ObjectiveType::tenRollercoasters: case ObjectiveType::tenRollercoasters:
return Check10RollerCoasters(gameState); return Check10RollerCoasters(park, gameState);
case ObjectiveType::guestsAndRating: case ObjectiveType::guestsAndRating:
return CheckGuestsAndRating(gameState); return CheckGuestsAndRating(park, gameState);
case ObjectiveType::monthlyRideIncome: case ObjectiveType::monthlyRideIncome:
return CheckMonthlyRideIncome(gameState); return CheckMonthlyRideIncome(park, gameState);
case ObjectiveType::tenRollercoastersLength: case ObjectiveType::tenRollercoastersLength:
return Check10RollerCoastersLength(gameState); return Check10RollerCoastersLength(park, gameState);
case ObjectiveType::finishFiveRollercoasters: case ObjectiveType::finishFiveRollercoasters:
return CheckFinish5RollerCoasters(gameState); return CheckFinish5RollerCoasters(park, gameState);
case ObjectiveType::repayLoanAndParkValue: case ObjectiveType::repayLoanAndParkValue:
return CheckRepayLoanAndParkValue(gameState); return CheckRepayLoanAndParkValue(park, gameState);
case ObjectiveType::monthlyFoodIncome: case ObjectiveType::monthlyFoodIncome:
return CheckMonthlyFoodIncome(gameState); return CheckMonthlyFoodIncome(park, gameState);
default: default:
return ObjectiveStatus::Undecided; return ObjectiveStatus::Undecided;
} }

View File

@@ -18,6 +18,11 @@ namespace OpenRCT2
struct GameState_t; struct GameState_t;
} }
namespace OpenRCT2::Park
{
struct ParkData;
}
namespace OpenRCT2::Scenario namespace OpenRCT2::Scenario
{ {
enum class ObjectiveType : uint8_t enum class ObjectiveType : uint8_t
@@ -76,17 +81,17 @@ namespace OpenRCT2::Scenario
return objectiveAllowedByMoneyUsage && objectiveAllowedByPaymentSettings; return objectiveAllowedByMoneyUsage && objectiveAllowedByPaymentSettings;
} }
ObjectiveStatus Check(GameState_t& gameState) const; ObjectiveStatus Check(Park::ParkData& park, GameState_t& gameState) const;
private: private:
ObjectiveStatus CheckGuestsBy(GameState_t& gameState) const; ObjectiveStatus CheckGuestsBy(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus CheckParkValueBy(GameState_t& gameState) const; ObjectiveStatus CheckParkValueBy(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus Check10RollerCoasters(GameState_t& gameState) const; ObjectiveStatus Check10RollerCoasters(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus CheckGuestsAndRating(GameState_t& gameState) const; ObjectiveStatus CheckGuestsAndRating(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus CheckMonthlyRideIncome(GameState_t& gameState) const; ObjectiveStatus CheckMonthlyRideIncome(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus Check10RollerCoastersLength(GameState_t& gameState) const; ObjectiveStatus Check10RollerCoastersLength(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus CheckFinish5RollerCoasters(GameState_t& gameState) const; ObjectiveStatus CheckFinish5RollerCoasters(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus CheckRepayLoanAndParkValue(GameState_t& gameState) const; ObjectiveStatus CheckRepayLoanAndParkValue(Park::ParkData& park, GameState_t& gameState) const;
ObjectiveStatus CheckMonthlyFoodIncome(GameState_t& gameState) const; ObjectiveStatus CheckMonthlyFoodIncome(Park::ParkData& park, GameState_t& gameState) const;
}; };
} // namespace OpenRCT2::Scenario } // namespace OpenRCT2::Scenario