From e63432a41649f149de58782595c0eb15f9848682 Mon Sep 17 00:00:00 2001 From: Tulio Leao Date: Mon, 21 Mar 2022 08:47:58 -0300 Subject: [PATCH] Add ToGBP function to convert non literals to money32 --- src/openrct2/actions/LandSetHeightAction.cpp | 2 +- src/openrct2/actions/MazeSetTrackAction.cpp | 4 ++-- src/openrct2/common.h | 5 +++++ src/openrct2/interface/InteractiveConsole.cpp | 16 ++++++++-------- src/openrct2/localisation/Localisation.cpp | 2 +- src/openrct2/world/Park.cpp | 3 ++- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/openrct2/actions/LandSetHeightAction.cpp b/src/openrct2/actions/LandSetHeightAction.cpp index 695d3c4eaa..ab344ef52d 100644 --- a/src/openrct2/actions/LandSetHeightAction.cpp +++ b/src/openrct2/actions/LandSetHeightAction.cpp @@ -360,7 +360,7 @@ money32 LandSetHeightAction::GetSurfaceHeightChangeCost(SurfaceElement* surfaceE { int32_t cornerHeight = tile_element_get_corner_height(surfaceElement, i); cornerHeight -= map_get_corner_height(_height, _style & TILE_ELEMENT_SURFACE_SLOPE_MASK, i); - cost += (abs(cornerHeight) * 5 / 2) * 10; + cost += 2.5_GBP * abs(cornerHeight); } return cost; } diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index 034371bf45..0fec4a2c50 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -138,7 +138,7 @@ GameActions::Result MazeSetTrackAction::Query() const const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Price) >> 16)); - res.Cost = price / 2 * 10; + res.Cost = (price / 2) * 10; return res; } @@ -174,7 +174,7 @@ GameActions::Result MazeSetTrackAction::Execute() const { const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Price) >> 16)); - res.Cost = price / 2 * 10; + res.Cost = (price / 2) * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/common.h b/src/openrct2/common.h index 3e47f23410..fbc283632e 100644 --- a/src/openrct2/common.h +++ b/src/openrct2/common.h @@ -98,6 +98,11 @@ constexpr money32 operator"" _GBP(long double money) noexcept return money * 10; } +constexpr money32 ToMoney32FromGBP(long double money) noexcept +{ + return money * 10; +} + #define MONEY16_UNDEFINED static_cast(static_cast(0xFFFF)) #define MONEY32_UNDEFINED (static_cast(0x80000000)) #define MONEY64_UNDEFINED (static_cast(0x8000000000000000)) diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 92f2c77dbb..41b8814113 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -754,7 +754,7 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) if (argv[0] == "money" && invalidArguments(&invalidArgs, double_valid[0])) { - money32 money = static_cast(double_val[0] * 10); + money32 money = ToMoney32FromGBP(double_val[0]); if (gCash != money) { auto setCheatAction = SetCheatAction(CheatType::SetMoney, money); @@ -774,7 +774,7 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) else if (argv[0] == "scenario_initial_cash" && invalidArguments(&invalidArgs, int_valid[0])) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::InitialCash, std::clamp(int_val[0] * 10, 0.00_GBP, 1000000.00_GBP)); + ScenarioSetSetting::InitialCash, std::clamp(ToMoney32FromGBP(int_val[0]), 0.00_GBP, 1000000.00_GBP)); scenarioSetSetting.SetCallback([&console](const GameAction*, const GameActions::Result* res) { if (res->Error != GameActions::Status::Ok) console.WriteLineError("set scenario_initial_cash command failed, likely due to permissions."); @@ -787,7 +787,8 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) { auto scenarioSetSetting = ScenarioSetSettingAction( ScenarioSetSetting::InitialLoan, - std::clamp((int_val[0] - (int_val[0] % 1000)) * 10, 0.00_GBP, gMaxBankLoan)); + std::clamp( + ToMoney32FromGBP(int_val[0]) - ToMoney32FromGBP(int_val[0] % 1000), 0.00_GBP, gMaxBankLoan)); scenarioSetSetting.SetCallback([&console](const GameAction*, const GameActions::Result* res) { if (res->Error != GameActions::Status::Ok) console.WriteLineError("set current_loan command failed, likely due to permissions."); @@ -800,7 +801,7 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) { auto scenarioSetSetting = ScenarioSetSettingAction( ScenarioSetSetting::MaximumLoanSize, - std::clamp((int_val[0] - (int_val[0] % 1000)) * 10, 0.00_GBP, 5000000.00_GBP)); + std::clamp(ToMoney32FromGBP(int_val[0]) - ToMoney32FromGBP(int_val[0] % 1000), 0.00_GBP, 5000000.00_GBP)); scenarioSetSetting.SetCallback([&console](const GameAction*, const GameActions::Result* res) { if (res->Error != GameActions::Status::Ok) console.WriteLineError("set max_loan command failed, likely due to permissions."); @@ -812,8 +813,7 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) else if (argv[0] == "guest_initial_cash" && invalidArguments(&invalidArgs, double_valid[0])) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::AverageCashPerGuest, - std::clamp(static_cast(double_val[0] * 10), 0.00_GBP, 1000.00_GBP)); + ScenarioSetSetting::AverageCashPerGuest, std::clamp(ToMoney32FromGBP(double_val[0]), 0.00_GBP, 1000.00_GBP)); scenarioSetSetting.SetCallback([&console](const GameAction*, const GameActions::Result* res) { if (res->Error != GameActions::Status::Ok) console.WriteLineError("set guest_initial_cash command failed, likely due to permissions."); @@ -977,7 +977,7 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) else if (argv[0] == "land_rights_cost" && invalidArguments(&invalidArgs, double_valid[0])) { auto scenarioSetSetting = ScenarioSetSettingAction( - ScenarioSetSetting::CostToBuyLand, std::clamp(static_cast(double_val[0] * 10), 0.00_GBP, 200.00_GBP)); + ScenarioSetSetting::CostToBuyLand, std::clamp(ToMoney32FromGBP(double_val[0]), 0.00_GBP, 200.00_GBP)); scenarioSetSetting.SetCallback([&console](const GameAction*, const GameActions::Result* res) { if (res->Error != GameActions::Status::Ok) console.WriteLineError("set land_rights_cost command failed, likely due to permissions."); @@ -990,7 +990,7 @@ static int32_t cc_set(InteractiveConsole& console, const arguments_t& argv) { auto scenarioSetSetting = ScenarioSetSettingAction( ScenarioSetSetting::CostToBuyConstructionRights, - std::clamp(static_cast(double_val[0] * 10), 0.00_GBP, 200.00_GBP)); + std::clamp(ToMoney32FromGBP(double_val[0]), 0.00_GBP, 200.00_GBP)); scenarioSetSetting.SetCallback([&console](const GameAction*, const GameActions::Result* res) { if (res->Error != GameActions::Status::Ok) console.WriteLineError("set construction_rights_cost command failed, likely due to permissions."); diff --git a/src/openrct2/localisation/Localisation.cpp b/src/openrct2/localisation/Localisation.cpp index 8349a02b65..b998039c61 100644 --- a/src/openrct2/localisation/Localisation.cpp +++ b/src/openrct2/localisation/Localisation.cpp @@ -500,7 +500,7 @@ money32 string_to_money(const char* string_to_monetise) number /= (currencyDesc->rate / 10.0); // Check if MONEY resulted in overflow - uint64_t result = std::min(number * 10.0, (std::numeric_limits::max)()); + uint64_t result = std::min(ToMoney32FromGBP(number), (std::numeric_limits::max)()); result *= sign; return static_cast(result); } diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index ab18e9105b..89ef59f54c 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -504,7 +504,8 @@ money64 Park::CalculateRideValue(const Ride* ride) const if (ride != nullptr && ride->value != RIDE_VALUE_UNDEFINED) { const auto& rtd = ride->GetRideTypeDescriptor(); - result = (ride->value * 10LL) * (static_cast(ride_customers_in_last_5_minutes(ride)) + rtd.BonusValue * 4LL); + result = ToMoney32FromGBP(static_cast(ride->value)) + * (static_cast(ride_customers_in_last_5_minutes(ride)) + rtd.BonusValue * 4LL); } return result; }