diff --git a/src/openrct2-ui/windows/Finances.cpp b/src/openrct2-ui/windows/Finances.cpp index 7fc5ba29bb..816c8bf758 100644 --- a/src/openrct2-ui/windows/Finances.cpp +++ b/src/openrct2-ui/windows/Finances.cpp @@ -336,7 +336,7 @@ namespace OpenRCT2::Ui::Windows case WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH: graphPageWidget = &widgets[WIDX_PAGE_BACKGROUND]; centredGraph = true; - _graphProps.series = getGameState().cashHistory; + _graphProps.series = getGameState().park.cashHistory; break; default: return; @@ -357,7 +357,7 @@ namespace OpenRCT2::Ui::Windows case WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH: { auto& gameState = getGameState(); - const auto cashLessLoan = gameState.cash - gameState.bankLoan; + const auto cashLessLoan = gameState.park.cash - gameState.bankLoan; const auto fmt = cashLessLoan >= 0 ? STR_FINANCES_FINANCIAL_GRAPH_CASH_LESS_LOAN_POSITIVE : STR_FINANCES_FINANCIAL_GRAPH_CASH_LESS_LOAN_NEGATIVE; OnDrawGraph(rt, cashLessLoan, fmt); @@ -631,8 +631,8 @@ namespace OpenRCT2::Ui::Windows // Current cash auto ft = Formatter(); - ft.Add(gameState.cash); - StringId stringId = gameState.cash >= 0 ? STR_CASH_LABEL : STR_CASH_NEGATIVE_LABEL; + ft.Add(gameState.park.cash); + StringId stringId = gameState.park.cash >= 0 ? STR_CASH_LABEL : STR_CASH_NEGATIVE_LABEL; DrawTextBasic(rt, windowPos + ScreenCoordsXY{ 8, titleBarBottom + 280 }, stringId, ft); // Objective related financial information diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index d59ed1396d..70b4557a5f 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -107,9 +107,9 @@ namespace OpenRCT2::Ui::Windows windowPos.y + widget.midY() - (line_height == 10 ? 5 : 6) }; auto colour = GetHoverWidgetColour(WIDX_MONEY); - StringId stringId = gameState.cash < 0 ? STR_BOTTOM_TOOLBAR_CASH_NEGATIVE : STR_BOTTOM_TOOLBAR_CASH; + StringId stringId = gameState.park.cash < 0 ? STR_BOTTOM_TOOLBAR_CASH_NEGATIVE : STR_BOTTOM_TOOLBAR_CASH; auto ft = Formatter(); - ft.Add(gameState.cash); + ft.Add(gameState.park.cash); DrawTextBasic(rt, screenCoords, stringId, ft, { colour, TextAlignment::CENTRE }); } diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index cb5e16a43b..053fc084c7 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -51,8 +51,7 @@ namespace OpenRCT2 WeatherState weatherCurrent; WeatherState weatherNext; uint16_t weatherUpdateTimer; - money64 cash; - money64 cashHistory[kFinanceHistorySize]; + money64 initialCash; money64 guestInitialCash; uint8_t guestInitialHappiness; diff --git a/src/openrct2/actions/CheatSetAction.cpp b/src/openrct2/actions/CheatSetAction.cpp index 15175bbb20..da8f1ba7af 100644 --- a/src/openrct2/actions/CheatSetAction.cpp +++ b/src/openrct2/actions/CheatSetAction.cpp @@ -604,7 +604,7 @@ void CheatSetAction::SetScenarioNoMoney(bool enabled) const void CheatSetAction::SetMoney(money64 amount) const { - getGameState().cash = amount; + getGameState().park.cash = amount; auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::Finances); @@ -614,7 +614,7 @@ void CheatSetAction::SetMoney(money64 amount) const void CheatSetAction::AddMoney(money64 amount) const { auto& gameState = getGameState(); - gameState.cash = AddClamp(gameState.cash, amount); + gameState.park.cash = AddClamp(gameState.park.cash, amount); auto* windowMgr = Ui::GetWindowManager(); windowMgr->InvalidateByClass(WindowClass::Finances); diff --git a/src/openrct2/actions/ParkSetLoanAction.cpp b/src/openrct2/actions/ParkSetLoanAction.cpp index b753443753..e0b32cdccc 100644 --- a/src/openrct2/actions/ParkSetLoanAction.cpp +++ b/src/openrct2/actions/ParkSetLoanAction.cpp @@ -55,7 +55,7 @@ GameActions::Result ParkSetLoanAction::Query() const // The “isPayingBack” check is needed to allow increasing the loan when the player is in debt. const auto isPayingBack = gameState.bankLoan > _value; const auto amountToPayBack = gameState.bankLoan - _value; - if (isPayingBack && amountToPayBack > gameState.cash) + if (isPayingBack && amountToPayBack > gameState.park.cash) { return GameActions::Result( GameActions::Status::InsufficientFunds, STR_CANT_PAY_BACK_LOAN, STR_NOT_ENOUGH_CASH_AVAILABLE); @@ -67,7 +67,7 @@ GameActions::Result ParkSetLoanAction::Execute() const { auto& gameState = getGameState(); - gameState.cash -= (gameState.bankLoan - _value); + gameState.park.cash -= (gameState.bankLoan - _value); gameState.bankLoan = _value; auto windowManager = OpenRCT2::Ui::GetWindowManager(); diff --git a/src/openrct2/actions/ScenarioSetSettingAction.cpp b/src/openrct2/actions/ScenarioSetSettingAction.cpp index 5485bfcd51..dcc50e2812 100644 --- a/src/openrct2/actions/ScenarioSetSettingAction.cpp +++ b/src/openrct2/actions/ScenarioSetSettingAction.cpp @@ -84,7 +84,7 @@ GameActions::Result ScenarioSetSettingAction::Execute() const break; case ScenarioSetSetting::InitialCash: gameState.initialCash = std::clamp(_value, 0.00_GBP, 1000000.00_GBP); - gameState.cash = gameState.initialCash; + gameState.park.cash = gameState.initialCash; windowMgr->InvalidateByClass(WindowClass::Finances); windowMgr->InvalidateByClass(WindowClass::BottomToolbar); break; diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 4075ad106c..8f028ac305 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -561,7 +561,7 @@ static void ConsoleCommandGet(InteractiveConsole& console, const arguments_t& ar } else if (argv[0] == "money") { - console.WriteLine(FormatString("money {CURRENCY2DP}", gameState.cash)); + console.WriteLine(FormatString("money {CURRENCY2DP}", gameState.park.cash)); } else if (argv[0] == "scenario_initial_cash") { @@ -785,7 +785,7 @@ static void ConsoleCommandSet(InteractiveConsole& console, const arguments_t& ar if (varName == "money" && InvalidArguments(&invalidArgs, double_valid[0])) { money64 money = ToMoney64FromGBP(double_val[0]); - if (gameState.cash != money) + if (gameState.park.cash != money) { ConsoleSetVariableAction(console, varName, CheatType::SetMoney, money); } diff --git a/src/openrct2/management/Finance.cpp b/src/openrct2/management/Finance.cpp index 877162fbf8..3a8583f1fc 100644 --- a/src/openrct2/management/Finance.cpp +++ b/src/openrct2/management/Finance.cpp @@ -65,7 +65,7 @@ bool FinanceCheckMoneyRequired(uint32_t flags) */ bool FinanceCheckAffordability(money64 cost, uint32_t flags) { - return !FinanceCheckMoneyRequired(flags) || cost <= 0 || cost <= getGameState().cash; + return !FinanceCheckMoneyRequired(flags) || cost <= 0 || cost <= getGameState().park.cash; } /** @@ -78,7 +78,7 @@ void FinancePayment(money64 amount, ExpenditureType type) { // overflow check auto& gameState = getGameState(); - gameState.cash = AddClamp(gameState.cash, -amount); + gameState.park.cash = AddClamp(gameState.park.cash, -amount); gameState.expenditureTable[0][EnumValue(type)] -= amount; if (dword_988E60[EnumValue(type)] & 1) @@ -188,7 +188,7 @@ void FinanceResetHistory() auto& gameState = getGameState(); for (auto i = 0; i < kFinanceHistorySize; i++) { - gameState.cashHistory[i] = kMoney64Undefined; + gameState.park.cashHistory[i] = kMoney64Undefined; gameState.weeklyProfitHistory[i] = kMoney64Undefined; gameState.park.ValueHistory[i] = kMoney64Undefined; } @@ -224,7 +224,7 @@ void FinanceInit() gameState.initialCash = 10000.00_GBP; // Cheat detection - gameState.cash = 10000.00_GBP; + gameState.park.cash = 10000.00_GBP; gameState.bankLoan = 10000.00_GBP; gameState.maxBankLoan = 20000.00_GBP; @@ -308,7 +308,7 @@ money64 FinanceGetMaximumLoan() money64 FinanceGetCurrentCash() { - return getGameState().cash; + return getGameState().park.cash; } /** @@ -355,7 +355,7 @@ void FinanceShiftExpenditureTable() void FinanceResetCashToInitial() { auto& gameState = getGameState(); - gameState.cash = gameState.initialCash; + gameState.park.cash = gameState.initialCash; } /** diff --git a/src/openrct2/network/NetworkServerAdvertiser.cpp b/src/openrct2/network/NetworkServerAdvertiser.cpp index 43629a99f5..3516e59e4e 100644 --- a/src/openrct2/network/NetworkServerAdvertiser.cpp +++ b/src/openrct2/network/NetworkServerAdvertiser.cpp @@ -316,7 +316,7 @@ private: if (!(gameState.park.Flags & PARK_FLAGS_NO_MONEY)) { - gameInfo["cash"] = gameState.cash; + gameInfo["cash"] = gameState.park.cash; } root["gameInfo"] = gameInfo; diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index d650d42f2b..48e06e0f20 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.cash; + gameState.initialCash = gameState.park.cash; } void Save(GameState_t& gameState, IStream& stream, int16_t compressionLevel) @@ -893,7 +893,7 @@ namespace OpenRCT2 os.ReadWriteChunk( ParkFileChunkType::PARK, [version = os.GetHeader().TargetVersion, &gameState](OrcaStream::ChunkStream& cs) { cs.ReadWrite(gameState.park.Name); - cs.ReadWrite(gameState.cash); + cs.ReadWrite(gameState.park.cash); cs.ReadWrite(gameState.bankLoan); cs.ReadWrite(gameState.maxBankLoan); cs.ReadWrite(gameState.bankLoanInterestRate); @@ -1061,7 +1061,7 @@ namespace OpenRCT2 return true; }); - cs.ReadWriteArray(gameState.cashHistory, [&cs](money64& value) { + cs.ReadWriteArray(gameState.park.cashHistory, [&cs](money64& value) { cs.ReadWrite(value); return true; }); diff --git a/src/openrct2/park/ParkPreview.cpp b/src/openrct2/park/ParkPreview.cpp index 26fb471f2d..ade4bc9b67 100644 --- a/src/openrct2/park/ParkPreview.cpp +++ b/src/openrct2/park/ParkPreview.cpp @@ -38,7 +38,7 @@ namespace OpenRCT2 .month = gameState.date.GetMonth(), .day = gameState.date.GetDay(), .parkUsesMoney = !(gameState.park.Flags & PARK_FLAGS_NO_MONEY), - .cash = gameState.cash, + .cash = gameState.park.cash, .numRides = static_cast(RideManager().size()), .numGuests = static_cast(gameState.numGuestsInPark), }; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index e5c596129c..c9d6f076e1 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1504,7 +1504,7 @@ namespace OpenRCT2::RCT1 gameState.landPrice = ToMoney64(_s4.LandPrice); gameState.constructionRightsPrice = ToMoney64(_s4.ConstructionRightsPrice); - gameState.cash = ToMoney64(_s4.Cash); + gameState.park.cash = ToMoney64(_s4.Cash); gameState.bankLoan = ToMoney64(_s4.Loan); gameState.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. @@ -1517,7 +1517,7 @@ namespace OpenRCT2::RCT1 for (size_t i = 0; i < Limits::kFinanceGraphSize; i++) { - gameState.cashHistory[i] = ToMoney64(_s4.CashHistory[i]); + gameState.park.cashHistory[i] = ToMoney64(_s4.CashHistory[i]); gameState.park.ValueHistory[i] = CorrectRCT1ParkValue(_s4.ParkValueHistory[i]); gameState.weeklyProfitHistory[i] = ToMoney64(_s4.WeeklyProfitHistory[i]); } diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 7e3977ff2f..604e13e295 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -490,7 +490,7 @@ namespace OpenRCT2::RCT2 for (size_t i = 0; i < Limits::kFinanceGraphSize; i++) { - gameState.cashHistory[i] = ToMoney64(_s6.BalanceHistory[i]); + gameState.park.cashHistory[i] = ToMoney64(_s6.BalanceHistory[i]); gameState.weeklyProfitHistory[i] = ToMoney64(_s6.WeeklyProfitHistory[i]); gameState.park.ValueHistory[i] = ToMoney64(_s6.ParkValueHistory[i]); } @@ -523,7 +523,7 @@ namespace OpenRCT2::RCT2 gameState.historicalProfit = ToMoney64(_s6.HistoricalProfit); // Pad013587D4 gameState.scenarioCompletedBy = std::string_view(_s6.ScenarioCompletedName, sizeof(_s6.ScenarioCompletedName)); - gameState.cash = ToMoney64(DECRYPT_MONEY(_s6.Cash)); + gameState.park.cash = ToMoney64(DECRYPT_MONEY(_s6.Cash)); // Pad013587FC gameState.park.RatingCasualtyPenalty = _s6.ParkRatingCasualtyPenalty; gameState.mapSize = { _s6.MapSize, _s6.MapSize }; diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 330fbbcb48..699aaa4a4a 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -109,7 +109,7 @@ void ScenarioReset(GameState_t& gameState) gameState.park.Value = Park::CalculateParkValue(); gameState.companyValue = Park::CalculateCompanyValue(); gameState.historicalProfit = gameState.initialCash - gameState.bankLoan; - gameState.cash = gameState.initialCash; + gameState.park.cash = gameState.initialCash; auto& objManager = GetContext()->GetObjectManager(); if (auto* textObject = objManager.GetLoadedObject(0); textObject != nullptr) diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp index c115667795..76f5108da6 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.cpp +++ b/src/openrct2/scripting/bindings/world/ScPark.cpp @@ -52,16 +52,16 @@ namespace OpenRCT2::Scripting money64 ScPark::cash_get() const { - return getGameState().cash; + return getGameState().park.cash; } void ScPark::cash_set(money64 value) { ThrowIfGameStateNotMutable(); auto& gameState = getGameState(); - if (gameState.cash != value) + if (gameState.park.cash != value) { - gameState.cash = value; + gameState.park.cash = value; auto intent = Intent(INTENT_ACTION_UPDATE_CASH); ContextBroadcastIntent(&intent); } diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index 42d004b9f1..bdad842bad 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -611,8 +611,8 @@ namespace OpenRCT2::Park constexpr auto numGuestsHistorySize = std::extent_v; HistoryPushRecord(gameState.guestsInParkHistory, gameState.numGuestsInPark); - constexpr auto cashHistorySize = std::extent_v; - HistoryPushRecord(gameState.cashHistory, FinanceGetCurrentCash() - gameState.bankLoan); + constexpr auto cashHistorySize = std::extent_v; + HistoryPushRecord(gameState.park.cashHistory, FinanceGetCurrentCash() - gameState.bankLoan); // Update weekly profit history auto currentWeeklyProfit = gameState.weeklyProfitAverageDividend; diff --git a/src/openrct2/world/ParkData.h b/src/openrct2/world/ParkData.h index 88ebd3e30d..73d9d10b24 100644 --- a/src/openrct2/world/ParkData.h +++ b/src/openrct2/world/ParkData.h @@ -65,5 +65,8 @@ namespace OpenRCT2::Park uint32_t Size; money64 Value; money64 ValueHistory[kFinanceHistorySize]; + + money64 cash; + money64 cashHistory[kFinanceHistorySize]; }; } // namespace OpenRCT2::Park