From aa35ec07cdbb63237bad91c487c5fe85dcadab37 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Fri, 22 Aug 2025 15:57:33 +0200 Subject: [PATCH] Introduce Scenario::Options struct; move cash and guest options --- .../windows/EditorScenarioOptions.cpp | 51 ++++++++++--------- src/openrct2/Editor.cpp | 40 +++++++-------- src/openrct2/GameState.h | 20 ++++++-- .../actions/ScenarioSetSettingAction.cpp | 12 ++--- src/openrct2/audio/Audio.h | 1 - src/openrct2/entity/Guest.cpp | 14 ++--- src/openrct2/interface/InteractiveConsole.cpp | 20 ++++---- src/openrct2/management/Finance.cpp | 6 +-- src/openrct2/park/ParkFile.cpp | 12 ++--- src/openrct2/rct1/S4Importer.cpp | 10 ++-- src/openrct2/rct2/S6Importer.cpp | 10 ++-- src/openrct2/scenario/Scenario.cpp | 6 +-- .../scripting/bindings/world/ScPark.cpp | 8 +-- src/openrct2/world/Park.cpp | 8 +-- 14 files changed, 115 insertions(+), 103 deletions(-) diff --git a/src/openrct2-ui/windows/EditorScenarioOptions.cpp b/src/openrct2-ui/windows/EditorScenarioOptions.cpp index 0709ef3d43..65545a5359 100644 --- a/src/openrct2-ui/windows/EditorScenarioOptions.cpp +++ b/src/openrct2-ui/windows/EditorScenarioOptions.cpp @@ -1408,10 +1408,10 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_INITIAL_CASH_INCREASE: - if (gameState.initialCash < 1000000.00_GBP) + if (gameState.scenarioOptions.initialCash < 1000000.00_GBP) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::InitialCash, gameState.initialCash + 500.00_GBP); + ScenarioSetSetting::InitialCash, gameState.scenarioOptions.initialCash + 500.00_GBP); GameActions::Execute(&scenarioSetSetting); } else @@ -1421,10 +1421,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_INITIAL_CASH_DECREASE: - if (gameState.initialCash > 0.00_GBP) + if (gameState.scenarioOptions.initialCash > 0.00_GBP) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::InitialCash, gameState.initialCash - 500.00_GBP); + ScenarioSetSetting::InitialCash, gameState.scenarioOptions.initialCash - 500.00_GBP); GameActions::Execute(&scenarioSetSetting); } else @@ -1686,7 +1686,7 @@ namespace OpenRCT2::Ui::Windows { screenCoords = windowPos + ScreenCoordsXY{ initialCashWidget.left + 1, initialCashWidget.top }; auto ft = Formatter(); - ft.Add(getGameState().initialCash); + ft.Add(getGameState().scenarioOptions.initialCash); auto colour = !IsWidgetDisabled(WIDX_INITIAL_CASH) ? wColour2 : wColour2.withFlag(ColourFlag::inset, true); DrawTextBasic(rt, screenCoords, STR_CURRENCY_FORMAT_LABEL, ft, colour); } @@ -1767,14 +1767,15 @@ namespace OpenRCT2::Ui::Windows void GuestsMouseDown(WidgetIndex widgetIndex) { auto& gameState = getGameState(); + auto& scenarioOptions = gameState.scenarioOptions; switch (widgetIndex) { case WIDX_CASH_PER_GUEST_INCREASE: - if (gameState.guestInitialCash < 1000.00_GBP) + if (scenarioOptions.guestInitialCash < 1000.00_GBP) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::AverageCashPerGuest, gameState.guestInitialCash + 1.00_GBP); + ScenarioSetSetting::AverageCashPerGuest, scenarioOptions.guestInitialCash + 1.00_GBP); GameActions::Execute(&scenarioSetSetting); } else @@ -1784,10 +1785,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_CASH_PER_GUEST_DECREASE: - if (gameState.guestInitialCash > 0.00_GBP) + if (scenarioOptions.guestInitialCash > 0.00_GBP) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::AverageCashPerGuest, gameState.guestInitialCash - 1.00_GBP); + ScenarioSetSetting::AverageCashPerGuest, scenarioOptions.guestInitialCash - 1.00_GBP); GameActions::Execute(&scenarioSetSetting); } else @@ -1797,10 +1798,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_GUEST_INITIAL_HAPPINESS_INCREASE: - if (gameState.guestInitialHappiness < 250) + if (scenarioOptions.guestInitialHappiness < 250) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::GuestInitialHappiness, gameState.guestInitialHappiness + 4); + ScenarioSetSetting::GuestInitialHappiness, scenarioOptions.guestInitialHappiness + 4); GameActions::Execute(&scenarioSetSetting); } else @@ -1810,10 +1811,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_GUEST_INITIAL_HAPPINESS_DECREASE: - if (gameState.guestInitialHappiness > 40) + if (scenarioOptions.guestInitialHappiness > 40) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::GuestInitialHappiness, gameState.guestInitialHappiness - 4); + ScenarioSetSetting::GuestInitialHappiness, scenarioOptions.guestInitialHappiness - 4); GameActions::Execute(&scenarioSetSetting); } else @@ -1823,10 +1824,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_GUEST_INITIAL_HUNGER_INCREASE: - if (gameState.guestInitialHunger > 40) + if (scenarioOptions.guestInitialHunger > 40) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::GuestInitialHunger, gameState.guestInitialHunger - 4); + ScenarioSetSetting::GuestInitialHunger, scenarioOptions.guestInitialHunger - 4); GameActions::Execute(&scenarioSetSetting); } else @@ -1836,10 +1837,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_GUEST_INITIAL_HUNGER_DECREASE: - if (gameState.guestInitialHunger < 250) + if (scenarioOptions.guestInitialHunger < 250) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::GuestInitialHunger, gameState.guestInitialHunger + 4); + ScenarioSetSetting::GuestInitialHunger, scenarioOptions.guestInitialHunger + 4); GameActions::Execute(&scenarioSetSetting); } else @@ -1849,10 +1850,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_GUEST_INITIAL_THIRST_INCREASE: - if (gameState.guestInitialThirst > 40) + if (scenarioOptions.guestInitialThirst > 40) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::GuestInitialThirst, gameState.guestInitialThirst - 4); + ScenarioSetSetting::GuestInitialThirst, scenarioOptions.guestInitialThirst - 4); GameActions::Execute(&scenarioSetSetting); } else @@ -1862,10 +1863,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_GUEST_INITIAL_THIRST_DECREASE: - if (gameState.guestInitialThirst < 250) + if (scenarioOptions.guestInitialThirst < 250) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::GuestInitialThirst, gameState.guestInitialThirst + 4); + ScenarioSetSetting::GuestInitialThirst, scenarioOptions.guestInitialThirst + 4); GameActions::Execute(&scenarioSetSetting); } else @@ -1975,7 +1976,7 @@ namespace OpenRCT2::Ui::Windows // Cash per guest value screenCoords = windowPos + ScreenCoordsXY{ cashPerGuestWidget.left + 1, cashPerGuestWidget.top }; auto ft = Formatter(); - ft.Add(gameState.guestInitialCash); + ft.Add(gameState.scenarioOptions.guestInitialCash); auto colour = !IsWidgetDisabled(WIDX_CASH_PER_GUEST) ? wColour2 : wColour2.withFlag(ColourFlag::inset, true); DrawTextBasic(rt, screenCoords, STR_CURRENCY_FORMAT_LABEL, ft, colour); } @@ -1986,21 +1987,21 @@ namespace OpenRCT2::Ui::Windows const auto& initialHappinessWidget = widgets[WIDX_GUEST_INITIAL_HAPPINESS]; screenCoords = windowPos + ScreenCoordsXY{ initialHappinessWidget.left + 1, initialHappinessWidget.top }; auto ft = Formatter(); - ft.Add((gameState.guestInitialHappiness * 100) / 255); + ft.Add((gameState.scenarioOptions.guestInitialHappiness * 100) / 255); DrawTextBasic(rt, screenCoords, STR_PERCENT_FORMAT_LABEL, ft, colour); // Guest initial hunger value const auto& initialHungerWidget = widgets[WIDX_GUEST_INITIAL_HUNGER]; screenCoords = windowPos + ScreenCoordsXY{ initialHungerWidget.left + 1, initialHungerWidget.top }; ft = Formatter(); - ft.Add(((255 - gameState.guestInitialHunger) * 100) / 255); + ft.Add(((255 - gameState.scenarioOptions.guestInitialHunger) * 100) / 255); DrawTextBasic(rt, screenCoords, STR_PERCENT_FORMAT_LABEL, ft, colour); // Guest initial thirst value const auto& initialThirstWidget = widgets[WIDX_GUEST_INITIAL_THIRST]; screenCoords = windowPos + ScreenCoordsXY{ initialThirstWidget.left + 1, initialThirstWidget.top }; ft = Formatter(); - ft.Add(((255 - gameState.guestInitialThirst) * 100) / 255); + ft.Add(((255 - gameState.scenarioOptions.guestInitialThirst) * 100) / 255); DrawTextBasic(rt, screenCoords, STR_PERCENT_FORMAT_LABEL, ft, colour); // Guests' intensity value diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index 5e5f17bb4a..231275ef07 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -298,40 +298,40 @@ namespace OpenRCT2::Editor staff->SetName({}); } - auto& gameState = getGameState(); - ResetAllEntities(); UpdateConsolidatedPatrolAreas(); - gameState.park.numGuestsInPark = 0; - gameState.park.numGuestsHeadingForPark = 0; - gameState.park.numGuestsInParkLastWeek = 0; - gameState.park.guestChangeModifier = 0; + + auto& gameState = getGameState(); + auto& park = gameState.park; + auto& scenarioOptions = gameState.scenarioOptions; + + park.numGuestsInPark = 0; + park.numGuestsHeadingForPark = 0; + park.numGuestsInParkLastWeek = 0; + park.guestChangeModifier = 0; + if (fromSave) { - gameState.park.flags |= PARK_FLAGS_NO_MONEY; + park.flags |= PARK_FLAGS_NO_MONEY; - if (gameState.park.entranceFee == 0) + if (park.entranceFee == 0) { - gameState.park.flags |= PARK_FLAGS_PARK_FREE_ENTRY; + park.flags |= PARK_FLAGS_PARK_FREE_ENTRY; } else { - gameState.park.flags &= ~PARK_FLAGS_PARK_FREE_ENTRY; + park.flags &= ~PARK_FLAGS_PARK_FREE_ENTRY; } - gameState.park.flags &= ~PARK_FLAGS_SPRITES_INITIALISED; + park.flags &= ~PARK_FLAGS_SPRITES_INITIALISED; - gameState.guestInitialCash = std::clamp(gameState.guestInitialCash, 10.00_GBP, kMaxEntranceFee); - - gameState.initialCash = std::min(gameState.initialCash, 100000); + scenarioOptions.guestInitialCash = std::clamp(scenarioOptions.guestInitialCash, 10.00_GBP, kMaxEntranceFee); + scenarioOptions.initialCash = std::min(scenarioOptions.initialCash, 100000); FinanceResetCashToInitial(); - gameState.park.bankLoan = std::clamp(gameState.park.bankLoan, 0.00_GBP, 5000000.00_GBP); - - gameState.park.maxBankLoan = std::clamp(gameState.park.maxBankLoan, 0.00_GBP, 5000000.00_GBP); - - gameState.park.bankLoanInterestRate = std::clamp( - gameState.park.bankLoanInterestRate, 5, kMaxBankLoanInterestRate); + park.bankLoan = std::clamp(park.bankLoan, 0.00_GBP, 5000000.00_GBP); + park.maxBankLoan = std::clamp(park.maxBankLoan, 0.00_GBP, 5000000.00_GBP); + park.bankLoanInterestRate = std::clamp(park.bankLoanInterestRate, 5, kMaxBankLoanInterestRate); } ClimateReset(); diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index c0c2e0cb5d..773fadf284 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -30,11 +30,26 @@ #include #include +namespace OpenRCT2::Scenario +{ + struct Options + { + money64 initialCash; + + money64 guestInitialCash; + uint8_t guestInitialHappiness; + uint8_t guestInitialHunger; + uint8_t guestInitialThirst; + }; +} // namespace OpenRCT2::Scenario + namespace OpenRCT2 { + struct GameState_t { Park::ParkData park{}; + Scenario::Options scenarioOptions; std::string pluginStorage; uint32_t currentTicks{}; Date date; @@ -43,11 +58,6 @@ namespace OpenRCT2 WeatherState weatherNext; uint16_t weatherUpdateTimer; - money64 initialCash; - money64 guestInitialCash; - uint8_t guestInitialHappiness; - uint8_t guestInitialHunger; - uint8_t guestInitialThirst; uint32_t nextGuestNumber; Objective scenarioObjective; diff --git a/src/openrct2/actions/ScenarioSetSettingAction.cpp b/src/openrct2/actions/ScenarioSetSettingAction.cpp index 4f251c4b6d..699df23200 100644 --- a/src/openrct2/actions/ScenarioSetSettingAction.cpp +++ b/src/openrct2/actions/ScenarioSetSettingAction.cpp @@ -83,8 +83,8 @@ GameActions::Result ScenarioSetSettingAction::Execute() const } break; case ScenarioSetSetting::InitialCash: - gameState.initialCash = std::clamp(_value, 0.00_GBP, 1000000.00_GBP); - gameState.park.cash = gameState.initialCash; + gameState.scenarioOptions.initialCash = std::clamp(_value, 0.00_GBP, 1000000.00_GBP); + gameState.park.cash = gameState.scenarioOptions.initialCash; windowMgr->InvalidateByClass(WindowClass::Finances); windowMgr->InvalidateByClass(WindowClass::BottomToolbar); break; @@ -113,16 +113,16 @@ GameActions::Result ScenarioSetSettingAction::Execute() const } break; case ScenarioSetSetting::AverageCashPerGuest: - gameState.guestInitialCash = std::clamp(_value, 0.00_GBP, 1000.00_GBP); + gameState.scenarioOptions.guestInitialCash = std::clamp(_value, 0.00_GBP, 1000.00_GBP); break; case ScenarioSetSetting::GuestInitialHappiness: - gameState.guestInitialHappiness = std::clamp(_value, 40, 250); + gameState.scenarioOptions.guestInitialHappiness = std::clamp(_value, 40, 250); break; case ScenarioSetSetting::GuestInitialHunger: - gameState.guestInitialHunger = std::clamp(_value, 40, 250); + gameState.scenarioOptions.guestInitialHunger = std::clamp(_value, 40, 250); break; case ScenarioSetSetting::GuestInitialThirst: - gameState.guestInitialThirst = std::clamp(_value, 40, 250); + gameState.scenarioOptions.guestInitialThirst = std::clamp(_value, 40, 250); break; case ScenarioSetSetting::GuestsPreferLessIntenseRides: if (_value != 0) diff --git a/src/openrct2/audio/Audio.h b/src/openrct2/audio/Audio.h index 3edac36578..dfcaf54521 100644 --- a/src/openrct2/audio/Audio.h +++ b/src/openrct2/audio/Audio.h @@ -18,7 +18,6 @@ #include #include -class AudioObject; struct CoordsXYZ; namespace OpenRCT2::Audio diff --git a/src/openrct2/entity/Guest.cpp b/src/openrct2/entity/Guest.cpp index 9883979d2b..873cc8cae9 100644 --- a/src/openrct2/entity/Guest.cpp +++ b/src/openrct2/entity/Guest.cpp @@ -7338,10 +7338,10 @@ Guest* Guest::Generate(const CoordsXYZ& coords) /* Scenario editor limits initial guest happiness to between 37..253. * To be on the safe side, assume the value could have been hacked * to any value 0..255. */ - peep->Happiness = gameState.guestInitialHappiness; + peep->Happiness = gameState.scenarioOptions.guestInitialHappiness; /* Assume a default initial happiness of 0 is wrong and set * to 128 (50%) instead. */ - if (gameState.guestInitialHappiness == 0) + if (gameState.scenarioOptions.guestInitialHappiness == 0) peep->Happiness = 128; /* Initial value will vary by -15..16 */ int8_t happinessDelta = (ScenarioRand() & 0x1F) - 15; @@ -7354,7 +7354,7 @@ Guest* Guest::Generate(const CoordsXYZ& coords) /* Scenario editor limits initial guest hunger to between 37..253. * To be on the safe side, assume the value could have been hacked * to any value 0..255. */ - peep->Hunger = gameState.guestInitialHunger; + peep->Hunger = gameState.scenarioOptions.guestInitialHunger; /* Initial value will vary by -15..16 */ int8_t hungerDelta = (ScenarioRand() & 0x1F) - 15; /* Adjust by the delta, clamping at min=0 and max=255. */ @@ -7363,7 +7363,7 @@ Guest* Guest::Generate(const CoordsXYZ& coords) /* Scenario editor limits initial guest thirst to between 37..253. * To be on the safe side, assume the value could have been hacked * to any value 0..255. */ - peep->Thirst = gameState.guestInitialThirst; + peep->Thirst = gameState.scenarioOptions.guestInitialThirst; /* Initial value will vary by -15..16 */ int8_t thirstDelta = (ScenarioRand() & 0x1F) - 15; /* Adjust by the delta, clamping at min=0 and max=255. */ @@ -7376,11 +7376,11 @@ Guest* Guest::Generate(const CoordsXYZ& coords) peep->PeepId = gameState.nextGuestNumber++; peep->Name = nullptr; - money64 cash = (static_cast(ScenarioRand() & 0x3) * 100) - 100 + gameState.guestInitialCash; + money64 cash = (static_cast(ScenarioRand() & 0x3) * 100) - 100 + gameState.scenarioOptions.guestInitialCash; if (cash < 0) cash = 0; - if (gameState.guestInitialCash == 0.00_GBP) + if (gameState.scenarioOptions.guestInitialCash == 0.00_GBP) { cash = 500; } @@ -7390,7 +7390,7 @@ Guest* Guest::Generate(const CoordsXYZ& coords) cash = 0; } - if (gameState.guestInitialCash == kMoney64Undefined) + if (gameState.scenarioOptions.guestInitialCash == kMoney64Undefined) { cash = 0; } diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index f788144554..b3fc3973f1 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -565,7 +565,7 @@ static void ConsoleCommandGet(InteractiveConsole& console, const arguments_t& ar } else if (argv[0] == "scenario_initial_cash") { - console.WriteLine(FormatString("scenario_initial_cash {CURRENCY2DP}", gameState.initialCash)); + console.WriteLine(FormatString("scenario_initial_cash {CURRENCY2DP}", gameState.scenarioOptions.initialCash)); } else if (argv[0] == "current_loan") { @@ -577,7 +577,7 @@ static void ConsoleCommandGet(InteractiveConsole& console, const arguments_t& ar } else if (argv[0] == "guest_initial_cash") { - console.WriteLine(FormatString("guest_initial_cash {CURRENCY2DP}", gameState.guestInitialCash)); + console.WriteLine(FormatString("guest_initial_cash {CURRENCY2DP}", gameState.scenarioOptions.guestInitialCash)); } else if (argv[0] == "land_rights_cost") { @@ -589,16 +589,18 @@ static void ConsoleCommandGet(InteractiveConsole& console, const arguments_t& ar } else if (argv[0] == "guest_initial_happiness") { - uint32_t current_happiness = gameState.guestInitialHappiness; + uint32_t current_happiness = gameState.scenarioOptions.guestInitialHappiness; for (int32_t i = 15; i <= 99; i++) { if (i == 99) { - console.WriteFormatLine("guest_initial_happiness %d%% (%d)", 15, gameState.guestInitialHappiness); + console.WriteFormatLine( + "guest_initial_happiness %d%% (%d)", 15, gameState.scenarioOptions.guestInitialHappiness); } else if (current_happiness == Park::CalculateGuestInitialHappiness(i)) { - console.WriteFormatLine("guest_initial_happiness %d%% (%d)", i, gameState.guestInitialHappiness); + console.WriteFormatLine( + "guest_initial_happiness %d%% (%d)", i, gameState.scenarioOptions.guestInitialHappiness); break; } } @@ -606,14 +608,14 @@ static void ConsoleCommandGet(InteractiveConsole& console, const arguments_t& ar else if (argv[0] == "guest_initial_hunger") { console.WriteFormatLine( - "guest_initial_hunger %d%% (%d)", ((255 - gameState.guestInitialHunger) * 100) / 255, - gameState.guestInitialHunger); + "guest_initial_hunger %d%% (%d)", ((255 - gameState.scenarioOptions.guestInitialHunger) * 100) / 255, + gameState.scenarioOptions.guestInitialHunger); } else if (argv[0] == "guest_initial_thirst") { console.WriteFormatLine( - "guest_initial_thirst %d%% (%d)", ((255 - gameState.guestInitialThirst) * 100) / 255, - gameState.guestInitialThirst); + "guest_initial_thirst %d%% (%d)", ((255 - gameState.scenarioOptions.guestInitialThirst) * 100) / 255, + gameState.scenarioOptions.guestInitialThirst); } else if (argv[0] == "guest_prefer_less_intense_rides") { diff --git a/src/openrct2/management/Finance.cpp b/src/openrct2/management/Finance.cpp index 20c23cd0ae..cdc084f73d 100644 --- a/src/openrct2/management/Finance.cpp +++ b/src/openrct2/management/Finance.cpp @@ -235,7 +235,7 @@ void FinanceInit() gameState.park.weeklyProfitAverageDividend = 0; gameState.park.weeklyProfitAverageDivisor = 0; - gameState.initialCash = 10000.00_GBP; // Cheat detection + gameState.scenarioOptions.initialCash = 10000.00_GBP; // Cheat detection gameState.park.cash = 10000.00_GBP; gameState.park.bankLoan = 10000.00_GBP; @@ -306,7 +306,7 @@ void FinanceUpdateDailyProfit() money64 FinanceGetInitialCash() { - return getGameState().initialCash; + return getGameState().scenarioOptions.initialCash; } money64 FinanceGetCurrentLoan() @@ -368,7 +368,7 @@ void FinanceShiftExpenditureTable() void FinanceResetCashToInitial() { auto& gameState = getGameState(); - gameState.park.cash = gameState.initialCash; + gameState.park.cash = gameState.scenarioOptions.initialCash; } /** diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index 1970b905fa..91339f3dba 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -175,7 +175,7 @@ namespace OpenRCT2 } // Initial cash will eventually be removed - gameState.initialCash = gameState.park.cash; + gameState.scenarioOptions.initialCash = gameState.park.cash; } void Save(GameState_t& gameState, IStream& stream, int16_t compressionLevel) @@ -601,19 +601,19 @@ namespace OpenRCT2 cs.write(randState.s1); } - cs.readWrite(gameState.guestInitialHappiness); + cs.readWrite(gameState.scenarioOptions.guestInitialHappiness); if (version <= 18) { money16 tempGuestInitialCash{}; cs.readWrite(tempGuestInitialCash); - gameState.guestInitialCash = ToMoney64(tempGuestInitialCash); + gameState.scenarioOptions.guestInitialCash = ToMoney64(tempGuestInitialCash); } else { - cs.readWrite(gameState.guestInitialCash); + cs.readWrite(gameState.scenarioOptions.guestInitialCash); } - cs.readWrite(gameState.guestInitialHunger); - cs.readWrite(gameState.guestInitialThirst); + cs.readWrite(gameState.scenarioOptions.guestInitialHunger); + cs.readWrite(gameState.scenarioOptions.guestInitialThirst); cs.readWrite(gameState.nextGuestNumber); cs.readWriteVector(gameState.peepSpawns, [&cs](PeepSpawn& spawn) { diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 413024bfb8..660c3a74fd 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1509,7 +1509,7 @@ namespace OpenRCT2::RCT1 gameState.park.maxBankLoan = ToMoney64(_s4.MaxLoan); // It's more like 1.33%, but we can only use integers. Can be fixed once we have our own save format. gameState.park.bankLoanInterestRate = 1; - gameState.initialCash = ToMoney64(_s4.Cash); + gameState.scenarioOptions.initialCash = ToMoney64(_s4.Cash); gameState.park.companyValue = ToMoney64(_s4.CompanyValue); gameState.park.value = CorrectRCT1ParkValue(_s4.ParkValue); @@ -2309,10 +2309,10 @@ namespace OpenRCT2::RCT1 News::importNewsItems(gameState, recentMessages, archivedMessages); // Initial guest status - gameState.guestInitialCash = ToMoney64(_s4.GuestInitialCash); - gameState.guestInitialHunger = _s4.GuestInitialHunger; - gameState.guestInitialThirst = _s4.GuestInitialThirst; - gameState.guestInitialHappiness = _s4.GuestInitialHappiness; + gameState.scenarioOptions.guestInitialCash = ToMoney64(_s4.GuestInitialCash); + gameState.scenarioOptions.guestInitialHunger = _s4.GuestInitialHunger; + gameState.scenarioOptions.guestInitialThirst = _s4.GuestInitialThirst; + gameState.scenarioOptions.guestInitialHappiness = _s4.GuestInitialHappiness; gameState.park.guestGenerationProbability = _s4.GuestGenerationProbability; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index d7e8292981..16852a7bcc 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -379,7 +379,7 @@ namespace OpenRCT2::RCT2 ImportEntities(); ConvertPeepAnimationTypeToObjects(gameState); - gameState.initialCash = ToMoney64(_s6.InitialCash); + gameState.scenarioOptions.initialCash = ToMoney64(_s6.InitialCash); gameState.park.bankLoan = ToMoney64(_s6.CurrentLoan); gameState.park.flags = _s6.ParkFlags & ~PARK_FLAGS_NO_MONEY_SCENARIO; @@ -460,14 +460,14 @@ namespace OpenRCT2::RCT2 gameState.researchProgress = _s6.ResearchProgress; gameState.researchExpectedDay = _s6.NextResearchExpectedDay; gameState.researchExpectedMonth = _s6.NextResearchExpectedMonth; - gameState.guestInitialHappiness = _s6.GuestInitialHappiness; + gameState.scenarioOptions.guestInitialHappiness = _s6.GuestInitialHappiness; gameState.park.size = _s6.ParkSize; gameState.park.guestGenerationProbability = _s6.GuestGenerationProbability; gameState.park.totalRideValueForMoney = _s6.TotalRideValueForMoney; gameState.park.maxBankLoan = ToMoney64(_s6.MaximumLoan); - gameState.guestInitialCash = ToMoney64(_s6.GuestInitialCash); - gameState.guestInitialHunger = _s6.GuestInitialHunger; - gameState.guestInitialThirst = _s6.GuestInitialThirst; + gameState.scenarioOptions.guestInitialCash = ToMoney64(_s6.GuestInitialCash); + gameState.scenarioOptions.guestInitialHunger = _s6.GuestInitialHunger; + gameState.scenarioOptions.guestInitialThirst = _s6.GuestInitialThirst; gameState.scenarioObjective.Type = _s6.ObjectiveType; gameState.scenarioObjective.Year = _s6.ObjectiveYear; // Pad013580FA diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 4c738a4c62..81f527cb6f 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -106,8 +106,8 @@ void ScenarioReset(GameState_t& gameState) gameState.park.rating = Park::CalculateParkRating(); gameState.park.value = Park::CalculateParkValue(); gameState.park.companyValue = Park::CalculateCompanyValue(); - gameState.park.historicalProfit = gameState.initialCash - gameState.park.bankLoan; - gameState.park.cash = gameState.initialCash; + gameState.park.historicalProfit = gameState.scenarioOptions.initialCash - gameState.park.bankLoan; + gameState.park.cash = gameState.scenarioOptions.initialCash; auto& objManager = GetContext()->GetObjectManager(); if (auto* textObject = objManager.GetLoadedObject(0); textObject != nullptr) @@ -718,7 +718,7 @@ ObjectiveStatus Objective::CheckGuestsAndRating() const { News::AddItemToQueue(News::ItemType::graph, STR_PARK_HAS_BEEN_CLOSED_DOWN, 0, {}); gameState.park.flags &= ~PARK_FLAGS_PARK_OPEN; - gameState.guestInitialHappiness = 50; + gameState.scenarioOptions.guestInitialHappiness = 50; return ObjectiveStatus::Failure; } } diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp index 00a683c134..e91e56f414 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.cpp +++ b/src/openrct2/scripting/bindings/world/ScPark.cpp @@ -161,22 +161,22 @@ namespace OpenRCT2::Scripting money64 ScPark::guestInitialCash_get() const { - return getGameState().guestInitialCash; + return getGameState().scenarioOptions.guestInitialCash; } uint8_t ScPark::guestInitialHappiness_get() const { - return getGameState().guestInitialHappiness; + return getGameState().scenarioOptions.guestInitialHappiness; } uint8_t ScPark::guestInitialHunger_get() const { - return getGameState().guestInitialHunger; + return getGameState().scenarioOptions.guestInitialHunger; } uint8_t ScPark::guestInitialThirst_get() const { - return getGameState().guestInitialThirst; + return getGameState().scenarioOptions.guestInitialThirst; } money64 ScPark::value_get() const diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index cf02a13123..551938012b 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -309,10 +309,10 @@ namespace OpenRCT2::Park ResearchCategory::Water, ResearchCategory::Shop, ResearchCategory::SceneryGroup); gameState.researchFundingLevel = RESEARCH_FUNDING_NORMAL; - gameState.guestInitialCash = 50.00_GBP; - gameState.guestInitialHappiness = Park::CalculateGuestInitialHappiness(50); - gameState.guestInitialHunger = 200; - gameState.guestInitialThirst = 200; + gameState.scenarioOptions.guestInitialCash = 50.00_GBP; + gameState.scenarioOptions.guestInitialHappiness = Park::CalculateGuestInitialHappiness(50); + gameState.scenarioOptions.guestInitialHunger = 200; + gameState.scenarioOptions.guestInitialThirst = 200; gameState.scenarioObjective.Type = OBJECTIVE_GUESTS_BY; gameState.scenarioObjective.Year = 4; gameState.scenarioObjective.NumGuests = 1000;