diff --git a/src/openrct2-ui/windows/EditorScenarioOptions.cpp b/src/openrct2-ui/windows/EditorScenarioOptions.cpp index d1bca40861..bc86b62c30 100644 --- a/src/openrct2-ui/windows/EditorScenarioOptions.cpp +++ b/src/openrct2-ui/windows/EditorScenarioOptions.cpp @@ -1434,10 +1434,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_INITIAL_LOAN_INCREASE: - if (gameState.bankLoan < 5000000.00_GBP) + if (gameState.park.bankLoan < 5000000.00_GBP) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::InitialLoan, gameState.bankLoan + 1000.00_GBP); + ScenarioSetSetting::InitialLoan, gameState.park.bankLoan + 1000.00_GBP); GameActions::Execute(&scenarioSetSetting); } else @@ -1447,10 +1447,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_INITIAL_LOAN_DECREASE: - if (gameState.bankLoan > 0.00_GBP) + if (gameState.park.bankLoan > 0.00_GBP) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::InitialLoan, gameState.bankLoan - 1000.00_GBP); + ScenarioSetSetting::InitialLoan, gameState.park.bankLoan - 1000.00_GBP); GameActions::Execute(&scenarioSetSetting); } else @@ -1696,7 +1696,7 @@ namespace OpenRCT2::Ui::Windows { screenCoords = windowPos + ScreenCoordsXY{ initialLoanWidget.left + 1, initialLoanWidget.top }; auto ft = Formatter(); - ft.Add(gameState.bankLoan); + ft.Add(gameState.park.bankLoan); auto colour = !IsWidgetDisabled(WIDX_INITIAL_LOAN) ? wColour2 : wColour2.withFlag(ColourFlag::inset, true); DrawTextBasic(rt, screenCoords, STR_CURRENCY_FORMAT_LABEL, ft, colour); } diff --git a/src/openrct2-ui/windows/Finances.cpp b/src/openrct2-ui/windows/Finances.cpp index ee9078ff02..7a8c3065e1 100644 --- a/src/openrct2-ui/windows/Finances.cpp +++ b/src/openrct2-ui/windows/Finances.cpp @@ -357,7 +357,7 @@ namespace OpenRCT2::Ui::Windows case WINDOW_FINANCES_PAGE_FINANCIAL_GRAPH: { auto& gameState = getGameState(); - const auto cashLessLoan = gameState.park.cash - gameState.bankLoan; + const auto cashLessLoan = gameState.park.cash - gameState.park.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); @@ -543,8 +543,8 @@ namespace OpenRCT2::Ui::Windows { // If loan can be increased, do so. // If not, action shows error message. - auto newLoan = gameState.bankLoan + 1000.00_GBP; - if (gameState.bankLoan < gameState.maxBankLoan) + auto newLoan = gameState.park.bankLoan + 1000.00_GBP; + if (gameState.park.bankLoan < gameState.maxBankLoan) { newLoan = std::min(gameState.maxBankLoan, newLoan); } @@ -557,10 +557,10 @@ namespace OpenRCT2::Ui::Windows // If loan is positive, decrease it. // If loan is negative, action shows error message. // If loan is exactly 0, prevent error message. - if (gameState.bankLoan != 0) + if (gameState.park.bankLoan != 0) { - auto newLoan = gameState.bankLoan - 1000.00_GBP; - if (gameState.bankLoan > 0) + auto newLoan = gameState.park.bankLoan - 1000.00_GBP; + if (gameState.park.bankLoan > 0) { newLoan = std::max(static_cast(0LL), newLoan); } @@ -579,7 +579,7 @@ namespace OpenRCT2::Ui::Windows // drawing has completed. auto ft = Formatter::Common(); ft.Increment(6); - ft.Add(getGameState().bankLoan); + ft.Add(getGameState().park.bankLoan); // Keep up with new months being added in the first two years. if (GetDate().GetMonthsElapsed() != _lastPaintedMonth) diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index 77d8fea42d..783fbb6a77 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -326,7 +326,7 @@ namespace OpenRCT2::Editor gameState.initialCash = std::min(gameState.initialCash, 100000); FinanceResetCashToInitial(); - gameState.bankLoan = std::clamp(gameState.bankLoan, 0.00_GBP, 5000000.00_GBP); + gameState.park.bankLoan = std::clamp(gameState.park.bankLoan, 0.00_GBP, 5000000.00_GBP); gameState.maxBankLoan = std::clamp(gameState.maxBankLoan, 0.00_GBP, 5000000.00_GBP); diff --git a/src/openrct2/GameState.h b/src/openrct2/GameState.h index 27cb7b695c..a198b72197 100644 --- a/src/openrct2/GameState.h +++ b/src/openrct2/GameState.h @@ -61,11 +61,12 @@ namespace OpenRCT2 money64 totalRideValueForMoney; uint16_t weeklyProfitAverageDivisor; money64 weeklyProfitHistory[kFinanceHistorySize]; + Objective scenarioObjective; uint16_t scenarioParkRatingWarningDays; money64 scenarioCompletedCompanyValue; money64 scenarioCompanyValueRecord; - money64 bankLoan; + uint8_t bankLoanInterestRate; money64 maxBankLoan; random_engine_t scenarioRand; diff --git a/src/openrct2/actions/CheatSetAction.cpp b/src/openrct2/actions/CheatSetAction.cpp index da8f1ba7af..d3546e811f 100644 --- a/src/openrct2/actions/CheatSetAction.cpp +++ b/src/openrct2/actions/CheatSetAction.cpp @@ -624,7 +624,7 @@ void CheatSetAction::AddMoney(money64 amount) const void CheatSetAction::ClearLoan() const { // First give money - AddMoney(getGameState().bankLoan); + AddMoney(getGameState().park.bankLoan); // Then pay the loan auto gameAction = ParkSetLoanAction(0.00_GBP); diff --git a/src/openrct2/actions/ParkSetLoanAction.cpp b/src/openrct2/actions/ParkSetLoanAction.cpp index e0b32cdccc..e2da1a4d29 100644 --- a/src/openrct2/actions/ParkSetLoanAction.cpp +++ b/src/openrct2/actions/ParkSetLoanAction.cpp @@ -43,18 +43,18 @@ void ParkSetLoanAction::Serialise(DataSerialiser& stream) GameActions::Result ParkSetLoanAction::Query() const { auto& gameState = getGameState(); - if (_value > gameState.bankLoan && _value > gameState.maxBankLoan) + if (_value > gameState.park.bankLoan && _value > gameState.maxBankLoan) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BORROW_ANY_MORE_MONEY, STR_BANK_REFUSES_TO_INCREASE_LOAN); } - if (_value < gameState.bankLoan && _value < 0.00_GBP) + if (_value < gameState.park.bankLoan && _value < 0.00_GBP) { return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_PAY_BACK_LOAN, STR_LOAN_CANT_BE_NEGATIVE); } // 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; + const auto isPayingBack = gameState.park.bankLoan > _value; + const auto amountToPayBack = gameState.park.bankLoan - _value; if (isPayingBack && amountToPayBack > gameState.park.cash) { return GameActions::Result( @@ -67,8 +67,8 @@ GameActions::Result ParkSetLoanAction::Execute() const { auto& gameState = getGameState(); - gameState.park.cash -= (gameState.bankLoan - _value); - gameState.bankLoan = _value; + gameState.park.cash -= (gameState.park.bankLoan - _value); + gameState.park.bankLoan = _value; auto windowManager = OpenRCT2::Ui::GetWindowManager(); windowManager->BroadcastIntent(Intent(INTENT_ACTION_UPDATE_CASH)); diff --git a/src/openrct2/actions/ScenarioSetSettingAction.cpp b/src/openrct2/actions/ScenarioSetSettingAction.cpp index dcc50e2812..ea342012e0 100644 --- a/src/openrct2/actions/ScenarioSetSettingAction.cpp +++ b/src/openrct2/actions/ScenarioSetSettingAction.cpp @@ -89,13 +89,13 @@ GameActions::Result ScenarioSetSettingAction::Execute() const windowMgr->InvalidateByClass(WindowClass::BottomToolbar); break; case ScenarioSetSetting::InitialLoan: - gameState.bankLoan = std::clamp(_value, 0.00_GBP, 5000000.00_GBP); - gameState.maxBankLoan = std::max(gameState.bankLoan, gameState.maxBankLoan); + gameState.park.bankLoan = std::clamp(_value, 0.00_GBP, 5000000.00_GBP); + gameState.maxBankLoan = std::max(gameState.park.bankLoan, gameState.maxBankLoan); windowMgr->InvalidateByClass(WindowClass::Finances); break; case ScenarioSetSetting::MaximumLoanSize: gameState.maxBankLoan = std::clamp(_value, 0.00_GBP, 5000000.00_GBP); - gameState.bankLoan = std::min(gameState.bankLoan, gameState.maxBankLoan); + gameState.park.bankLoan = std::min(gameState.park.bankLoan, gameState.maxBankLoan); windowMgr->InvalidateByClass(WindowClass::Finances); break; case ScenarioSetSetting::AnnualInterestRate: diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 4bb2bbcf81..451feefbf9 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -569,7 +569,7 @@ static void ConsoleCommandGet(InteractiveConsole& console, const arguments_t& ar } else if (argv[0] == "current_loan") { - console.WriteLine(FormatString("current_loan {CURRENCY2DP}", gameState.bankLoan)); + console.WriteLine(FormatString("current_loan {CURRENCY2DP}", gameState.park.bankLoan)); } else if (argv[0] == "max_loan") { diff --git a/src/openrct2/management/Finance.cpp b/src/openrct2/management/Finance.cpp index faca591f0a..ea58e16648 100644 --- a/src/openrct2/management/Finance.cpp +++ b/src/openrct2/management/Finance.cpp @@ -141,7 +141,7 @@ void FinancePayInterest() // This variable uses the 64-bit type as the computation below can involve multiplying very large numbers // that will overflow money64 if the loan is greater than (1 << 31) / (5 * current_interest_rate) - const money64 current_loan = gameState.bankLoan; + const money64 current_loan = gameState.park.bankLoan; const auto current_interest_rate = gameState.bankLoanInterestRate; const money64 interest_to_pay = (gameState.park.Flags & PARK_FLAGS_RCT1_INTEREST) ? (current_loan / 2400) @@ -225,7 +225,7 @@ void FinanceInit() gameState.initialCash = 10000.00_GBP; // Cheat detection gameState.park.cash = 10000.00_GBP; - gameState.bankLoan = 10000.00_GBP; + gameState.park.bankLoan = 10000.00_GBP; gameState.maxBankLoan = 20000.00_GBP; gameState.bankLoanInterestRate = 10; @@ -265,7 +265,7 @@ void FinanceUpdateDailyProfit() current_profit -= research_cost_table[level]; // Loan costs - auto current_loan = gameState.bankLoan; + auto current_loan = gameState.park.bankLoan; current_profit -= current_loan / 600; // Ride costs @@ -298,7 +298,7 @@ money64 FinanceGetInitialCash() money64 FinanceGetCurrentLoan() { - return getGameState().bankLoan; + return getGameState().park.bankLoan; } money64 FinanceGetMaximumLoan() diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index d01a510011..2ccf856c3f 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -894,7 +894,7 @@ namespace OpenRCT2 ParkFileChunkType::PARK, [version = os.GetHeader().TargetVersion, &gameState](OrcaStream::ChunkStream& cs) { cs.ReadWrite(gameState.park.Name); cs.ReadWrite(gameState.park.cash); - cs.ReadWrite(gameState.bankLoan); + cs.ReadWrite(gameState.park.bankLoan); cs.ReadWrite(gameState.maxBankLoan); cs.ReadWrite(gameState.bankLoanInterestRate); cs.ReadWrite(gameState.park.Flags); diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 40c466983e..6a187b09de 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -1505,7 +1505,7 @@ namespace OpenRCT2::RCT1 gameState.constructionRightsPrice = ToMoney64(_s4.ConstructionRightsPrice); gameState.park.cash = ToMoney64(_s4.Cash); - gameState.bankLoan = ToMoney64(_s4.Loan); + gameState.park.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. gameState.bankLoanInterestRate = 1; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 199743e6a6..2b941e852e 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -380,7 +380,7 @@ namespace OpenRCT2::RCT2 ConvertPeepAnimationTypeToObjects(gameState); gameState.initialCash = ToMoney64(_s6.InitialCash); - gameState.bankLoan = ToMoney64(_s6.CurrentLoan); + gameState.park.bankLoan = ToMoney64(_s6.CurrentLoan); gameState.park.Flags = _s6.ParkFlags & ~PARK_FLAGS_NO_MONEY_SCENARIO; diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index bfb62ea588..c92276bde4 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -108,7 +108,7 @@ 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.bankLoan; + gameState.park.historicalProfit = gameState.initialCash - gameState.park.bankLoan; gameState.park.cash = gameState.initialCash; auto& objManager = GetContext()->GetObjectManager(); @@ -815,7 +815,7 @@ ObjectiveStatus Objective::CheckRepayLoanAndParkValue() const { const auto& gameState = getGameState(); money64 parkValue = gameState.park.Value; - money64 currentLoan = gameState.bankLoan; + money64 currentLoan = gameState.park.bankLoan; if (currentLoan <= 0 && parkValue >= Currency) { diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp index 9cae4425b3..0c914da2b1 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.cpp +++ b/src/openrct2/scripting/bindings/world/ScPark.cpp @@ -87,7 +87,7 @@ namespace OpenRCT2::Scripting money64 ScPark::bankLoan_get() const { - return getGameState().bankLoan; + return getGameState().park.bankLoan; } void ScPark::bankLoan_set(money64 value) { @@ -95,9 +95,9 @@ namespace OpenRCT2::Scripting auto& gameState = getGameState(); - if (gameState.bankLoan != value) + if (gameState.park.bankLoan != value) { - gameState.bankLoan = value; + gameState.park.bankLoan = 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 2dc038d8fc..feeecf7385 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -529,7 +529,7 @@ namespace OpenRCT2::Park { const auto& gameState = getGameState(); - auto result = gameState.park.Value - gameState.bankLoan; + auto result = gameState.park.Value - gameState.park.bankLoan; // Clamp addition to prevent overflow result = AddClamp(result, FinanceGetCurrentCash()); @@ -613,7 +613,8 @@ namespace OpenRCT2::Park HistoryPushRecord(gameState.park.guestsInParkHistory, gameState.park.numGuestsInPark); constexpr auto cashHistorySize = std::extent_v; - HistoryPushRecord(gameState.park.cashHistory, FinanceGetCurrentCash() - gameState.bankLoan); + HistoryPushRecord( + gameState.park.cashHistory, FinanceGetCurrentCash() - gameState.park.bankLoan); // Update weekly profit history auto currentWeeklyProfit = gameState.weeklyProfitAverageDividend; diff --git a/src/openrct2/world/ParkData.h b/src/openrct2/world/ParkData.h index 8b53dbce0f..f0bf053d9b 100644 --- a/src/openrct2/world/ParkData.h +++ b/src/openrct2/world/ParkData.h @@ -80,5 +80,7 @@ namespace OpenRCT2::Park uint32_t guestsInParkHistory[kGuestsInParkHistorySize]; uint32_t numGuestsInPark; + + money64 bankLoan; }; } // namespace OpenRCT2::Park