From 3ac596faf17ae6c446c2a4712a3b74cc0c62a3d4 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 14 May 2019 21:08:50 +0100 Subject: [PATCH] Implement ScenarioSetSetting game action Further work moving game commands into the game action framework to improve design. --- .../windows/EditorScenarioOptions.cpp | 220 ++++++------- src/openrct2/Editor.cpp | 219 ------------- src/openrct2/Editor.h | 4 - src/openrct2/Game.cpp | 2 +- src/openrct2/Game.h | 2 +- .../actions/GameActionRegistration.cpp | 2 + .../actions/ScenarioSetSettingAction.hpp | 290 ++++++++++++++++++ 7 files changed, 408 insertions(+), 331 deletions(-) create mode 100644 src/openrct2/actions/ScenarioSetSettingAction.hpp diff --git a/src/openrct2-ui/windows/EditorScenarioOptions.cpp b/src/openrct2-ui/windows/EditorScenarioOptions.cpp index df9942005b..eaa651b547 100644 --- a/src/openrct2-ui/windows/EditorScenarioOptions.cpp +++ b/src/openrct2-ui/windows/EditorScenarioOptions.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -508,18 +509,19 @@ static void window_editor_scenario_options_financial_mouseup(rct_window* w, rct_ newMoneySetting = (gParkFlags & PARK_FLAGS_NO_MONEY) ? 0 : 1; } - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETNOMONEY, newMoneySetting, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction(ScenarioSetSetting::NoMoney, newMoneySetting); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; } case WIDX_FORBID_MARKETING: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETFORBIDMARKETINGCAMPAIGNS, - gParkFlags & PARK_FLAGS_FORBID_MARKETING_CAMPAIGN ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ForbidMarketingCampaigns, gParkFlags & PARK_FLAGS_FORBID_MARKETING_CAMPAIGN ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } } } @@ -561,9 +563,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_INITIAL_CASH_INCREASE: if (gInitialCash < MONEY(1000000, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETINITIALCASH, gInitialCash + MONEY(500, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::InitialCash, gInitialCash + MONEY(500, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -574,9 +576,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_INITIAL_CASH_DECREASE: if (gInitialCash > MONEY(0, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETINITIALCASH, gInitialCash - MONEY(500, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::InitialCash, gInitialCash - MONEY(500, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -587,9 +589,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_INITIAL_LOAN_INCREASE: if (gBankLoan < MONEY(5000000, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETINITIALLOAN, gBankLoan + MONEY(1000, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::InitialLoan, gBankLoan + MONEY(1000, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -600,9 +602,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_INITIAL_LOAN_DECREASE: if (gBankLoan > MONEY(0, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETINITIALLOAN, gBankLoan - MONEY(1000, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::InitialLoan, gBankLoan - MONEY(1000, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -613,9 +615,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_MAXIMUM_LOAN_INCREASE: if (gMaxBankLoan < MONEY(5000000, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETMAXIMUMLOANSIZE, gMaxBankLoan + MONEY(1000, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::MaximumLoanSize, gMaxBankLoan + MONEY(1000, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -626,9 +628,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_MAXIMUM_LOAN_DECREASE: if (gMaxBankLoan > MONEY(0, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETMAXIMUMLOANSIZE, gMaxBankLoan - MONEY(1000, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::MaximumLoanSize, gMaxBankLoan - MONEY(1000, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -639,9 +641,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_INTEREST_RATE_INCREASE: if (gBankLoanInterestRate < 80) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETANNUALINTERESTRATE, gBankLoanInterestRate + 1, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::AnnualInterestRate, gBankLoanInterestRate + 1); + GameActions::Execute(&scenarioSetSetting); } else { @@ -652,18 +654,9 @@ static void window_editor_scenario_options_financial_mousedown(rct_window* w, rc case WIDX_INTEREST_RATE_DECREASE: if (gBankLoanInterestRate > 0) { - if (gBankLoanInterestRate > 80) - { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETANNUALINTERESTRATE, 80, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); - } - else - { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETANNUALINTERESTRATE, gBankLoanInterestRate - 1, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); - } + auto interest = std::min(80, gBankLoanInterestRate - 1); + auto scenarioSetSetting = ScenarioSetSettingAction(ScenarioSetSetting::AnnualInterestRate, interest); + GameActions::Execute(&scenarioSetSetting); } else { @@ -820,17 +813,21 @@ static void window_editor_scenario_options_guests_mouseup(rct_window* w, rct_wid window_editor_scenario_options_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_GUEST_PREFER_LESS_INTENSE_RIDES: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTSPREFERLESSINTENSERIDES, - gParkFlags & PARK_FLAGS_PREF_LESS_INTENSE_RIDES ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestsPreferLessIntenseRides, gParkFlags & PARK_FLAGS_PREF_LESS_INTENSE_RIDES ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } case WIDX_GUEST_PREFER_MORE_INTENSE_RIDES: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTSPREFERMOREINTENSERIDES, - gParkFlags & PARK_FLAGS_PREF_MORE_INTENSE_RIDES ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestsPreferMoreIntenseRides, gParkFlags & PARK_FLAGS_PREF_MORE_INTENSE_RIDES ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } } } @@ -854,9 +851,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_CASH_PER_GUEST_INCREASE: if (gGuestInitialCash < MONEY(1000, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETAVERAGECASHPERGUEST, gGuestInitialCash + MONEY(1, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::AverageCashPerGuest, gGuestInitialCash + MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -867,9 +864,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_CASH_PER_GUEST_DECREASE: if (gGuestInitialCash > MONEY(0, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETAVERAGECASHPERGUEST, gGuestInitialCash - MONEY(1, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::AverageCashPerGuest, gGuestInitialCash - MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -880,9 +877,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_GUEST_INITIAL_HAPPINESS_INCREASE: if (gGuestInitialHappiness < 250) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTINITIALHAPPINESS, gGuestInitialHappiness + 4, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestInitialHappiness, gGuestInitialHappiness + 4); + GameActions::Execute(&scenarioSetSetting); } else { @@ -893,9 +890,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_GUEST_INITIAL_HAPPINESS_DECREASE: if (gGuestInitialHappiness > 40) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTINITIALHAPPINESS, gGuestInitialHappiness - 4, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestInitialHappiness, gGuestInitialHappiness - 4); + GameActions::Execute(&scenarioSetSetting); } else { @@ -906,9 +903,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_GUEST_INITIAL_HUNGER_INCREASE: if (gGuestInitialHunger > 40) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTINITIALHUNGER, gGuestInitialHunger - 4, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestInitialHunger, gGuestInitialHunger - 4); + GameActions::Execute(&scenarioSetSetting); } else { @@ -919,9 +916,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_GUEST_INITIAL_HUNGER_DECREASE: if (gGuestInitialHunger < 250) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTINITIALHUNGER, gGuestInitialHunger + 4, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestInitialHunger, gGuestInitialHunger + 4); + GameActions::Execute(&scenarioSetSetting); } else { @@ -932,9 +929,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_GUEST_INITIAL_THIRST_INCREASE: if (gGuestInitialThirst > 40) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTINITIALTHIRST, gGuestInitialThirst - 4, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestInitialThirst, gGuestInitialThirst - 4); + GameActions::Execute(&scenarioSetSetting); } else { @@ -945,9 +942,9 @@ static void window_editor_scenario_options_guests_mousedown(rct_window* w, rct_w case WIDX_GUEST_INITIAL_THIRST_DECREASE: if (gGuestInitialThirst < 250) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTINITIALTHIRST, gGuestInitialThirst + 4, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestInitialThirst, gGuestInitialThirst + 4); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1097,35 +1094,46 @@ static void window_editor_scenario_options_park_mouseup(rct_window* w, rct_widge window_editor_scenario_options_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_FORBID_TREE_REMOVAL: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETFORBIDTREEREMOVAL, - gParkFlags & PARK_FLAGS_FORBID_TREE_REMOVAL ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ForbidTreeRemoval, gParkFlags & PARK_FLAGS_FORBID_TREE_REMOVAL ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } case WIDX_FORBID_LANDSCAPE_CHANGES: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETFORBIDLANDSCAPECHANGES, - gParkFlags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ForbidLandscapeChanges, gParkFlags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } case WIDX_FORBID_HIGH_CONSTRUCTION: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETFORBIDHIGHCONSTRUCTION, - gParkFlags & PARK_FLAGS_FORBID_HIGH_CONSTRUCTION ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ForbidHighConstruction, gParkFlags & PARK_FLAGS_FORBID_HIGH_CONSTRUCTION ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } case WIDX_HARD_PARK_RATING: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETPARKRATINGHIGHERDIFFICULTLEVEL, - gParkFlags & PARK_FLAGS_DIFFICULT_PARK_RATING ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ParkRatingHigherDifficultyLevel, gParkFlags & PARK_FLAGS_DIFFICULT_PARK_RATING ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } case WIDX_HARD_GUEST_GENERATION: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETGUESTGENERATIONHIGHERDIFFICULTLEVEL, - gParkFlags & PARK_FLAGS_DIFFICULT_GUEST_GENERATION ? 0 : 1, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::GuestGenerationHigherDifficultyLevel, + gParkFlags & PARK_FLAGS_DIFFICULT_GUEST_GENERATION ? 0 : 1); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; + } } } @@ -1151,9 +1159,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid case WIDX_LAND_COST_INCREASE: if (gLandPrice < MONEY(200, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETCOSTTOBUYLAND, gLandPrice + MONEY(1, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::CostToBuyLand, gLandPrice + MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1164,9 +1172,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid case WIDX_LAND_COST_DECREASE: if (gLandPrice > MONEY(5, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETCOSTTOBUYLAND, gLandPrice - MONEY(1, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::CostToBuyLand, gLandPrice - MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1177,9 +1185,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid case WIDX_CONSTRUCTION_RIGHTS_COST_INCREASE: if (gConstructionRightsPrice < MONEY(200, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETCOSTTOBUYCONSTRUCTIONRIGHTS, - gConstructionRightsPrice + MONEY(1, 00), GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::CostToBuyConstructionRights, gConstructionRightsPrice + MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1190,9 +1198,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid case WIDX_CONSTRUCTION_RIGHTS_COST_DECREASE: if (gConstructionRightsPrice > MONEY(5, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETCOSTTOBUYCONSTRUCTIONRIGHTS, - gConstructionRightsPrice - MONEY(1, 00), GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::CostToBuyConstructionRights, gConstructionRightsPrice - MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1203,9 +1211,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid case WIDX_ENTRY_PRICE_INCREASE: if (gParkEntranceFee < MAX_ENTRANCE_FEE) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETPARKCHARGEENTRYFEE, gParkEntranceFee + MONEY(1, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ParkChargeEntryFee, gParkEntranceFee + MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1216,9 +1224,9 @@ static void window_editor_scenario_options_park_mousedown(rct_window* w, rct_wid case WIDX_ENTRY_PRICE_DECREASE: if (gParkEntranceFee > MONEY(0, 00)) { - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETPARKCHARGEENTRYFEE, gParkEntranceFee - MONEY(1, 00), - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + auto scenarioSetSetting = ScenarioSetSettingAction( + ScenarioSetSetting::ParkChargeEntryFee, gParkEntranceFee - MONEY(1, 00)); + GameActions::Execute(&scenarioSetSetting); } else { @@ -1268,12 +1276,12 @@ static void window_editor_scenario_options_park_dropdown(rct_window* w, rct_widg switch (widgetIndex) { case WIDX_PAY_FOR_PARK_OR_RIDES_DROPDOWN: - game_do_command( - 0, GAME_COMMAND_FLAG_APPLY, EDIT_SCENARIOOPTIONS_SETPARKCHARGEMETHOD, dropdownIndex, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, 0, 0); + { + auto scenarioSetSetting = ScenarioSetSettingAction(ScenarioSetSetting::ParkChargeMethod, dropdownIndex); + GameActions::Execute(&scenarioSetSetting); window_invalidate(w); break; - + } case WIDX_CLIMATE_DROPDOWN: if (gClimate != (uint8_t)dropdownIndex) { diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index 6d3f97833e..45232073a9 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -538,219 +538,6 @@ namespace Editor return true; } - void GameCommandEditScenarioOptions( - [[maybe_unused]] int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, - [[maybe_unused]] int32_t* edi, [[maybe_unused]] int32_t* ebp) - { - if (!(*ebx & GAME_COMMAND_FLAG_APPLY)) - { - *ebx = 0; - return; - } - - switch (*ecx) - { - case EDIT_SCENARIOOPTIONS_SETNOMONEY: - if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) - { - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_NO_MONEY_SCENARIO; - } - else - { - gParkFlags &= ~PARK_FLAGS_NO_MONEY_SCENARIO; - } - } - else - { - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_NO_MONEY; - } - else - { - gParkFlags &= ~PARK_FLAGS_NO_MONEY; - } - // Invalidate all windows that have anything to do with finance - window_invalidate_by_class(WC_RIDE); - window_invalidate_by_class(WC_PEEP); - window_invalidate_by_class(WC_PARK_INFORMATION); - window_invalidate_by_class(WC_FINANCES); - window_invalidate_by_class(WC_BOTTOM_TOOLBAR); - window_invalidate_by_class(WC_TOP_TOOLBAR); - } - break; - case EDIT_SCENARIOOPTIONS_SETINITIALCASH: - gInitialCash = std::clamp(*edx, MONEY(0, 00), MONEY(1000000, 00)); - gCash = gInitialCash; - window_invalidate_by_class(WC_FINANCES); - window_invalidate_by_class(WC_BOTTOM_TOOLBAR); - break; - case EDIT_SCENARIOOPTIONS_SETINITIALLOAN: - gBankLoan = std::clamp(*edx, MONEY(0, 00), MONEY(5000000, 00)); - gMaxBankLoan = std::max(gBankLoan, gMaxBankLoan); - window_invalidate_by_class(WC_FINANCES); - break; - case EDIT_SCENARIOOPTIONS_SETMAXIMUMLOANSIZE: - gMaxBankLoan = std::clamp(*edx, MONEY(0, 00), MONEY(5000000, 00)); - gBankLoan = std::min(gBankLoan, gMaxBankLoan); - window_invalidate_by_class(WC_FINANCES); - break; - case EDIT_SCENARIOOPTIONS_SETANNUALINTERESTRATE: - gBankLoanInterestRate = std::clamp(*edx, 0, 80); - window_invalidate_by_class(WC_FINANCES); - break; - case EDIT_SCENARIOOPTIONS_SETFORBIDMARKETINGCAMPAIGNS: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_FORBID_MARKETING_CAMPAIGN; - } - else - { - gParkFlags &= ~PARK_FLAGS_FORBID_MARKETING_CAMPAIGN; - } - break; - case EDIT_SCENARIOOPTIONS_SETAVERAGECASHPERGUEST: - gGuestInitialCash = std::clamp(*edx, MONEY(0, 00), MONEY(1000, 00)); - break; - case EDIT_SCENARIOOPTIONS_SETGUESTINITIALHAPPINESS: - gGuestInitialHappiness = std::clamp(*edx, 40, 250); - break; - case EDIT_SCENARIOOPTIONS_SETGUESTINITIALHUNGER: - gGuestInitialHunger = std::clamp(*edx, 40, 250); - break; - case EDIT_SCENARIOOPTIONS_SETGUESTINITIALTHIRST: - gGuestInitialThirst = std::clamp(*edx, 40, 250); - break; - case EDIT_SCENARIOOPTIONS_SETGUESTSPREFERLESSINTENSERIDES: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_PREF_LESS_INTENSE_RIDES; - } - else - { - gParkFlags &= ~PARK_FLAGS_PREF_LESS_INTENSE_RIDES; - } - break; - case EDIT_SCENARIOOPTIONS_SETGUESTSPREFERMOREINTENSERIDES: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_PREF_MORE_INTENSE_RIDES; - } - else - { - gParkFlags &= ~PARK_FLAGS_PREF_MORE_INTENSE_RIDES; - } - break; - case EDIT_SCENARIOOPTIONS_SETCOSTTOBUYLAND: - gLandPrice = std::clamp(*edx, MONEY(5, 00), MONEY(200, 00)); - break; - case EDIT_SCENARIOOPTIONS_SETCOSTTOBUYCONSTRUCTIONRIGHTS: - gConstructionRightsPrice = std::clamp(*edx, MONEY(5, 00), MONEY(200, 00)); - break; - case EDIT_SCENARIOOPTIONS_SETPARKCHARGEMETHOD: - if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) - { - if (*edx == 0) - { - gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; - gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; - gParkEntranceFee = MONEY(0, 00); - } - else if (*edx == 1) - { - gParkFlags &= ~PARK_FLAGS_PARK_FREE_ENTRY; - gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; - gParkEntranceFee = MONEY(10, 00); - } - else - { - gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; - gParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; - gParkEntranceFee = MONEY(10, 00); - } - } - else - { - if (*edx == 0) - { - gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; - gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; - } - else if (*edx == 1) - { - gParkFlags &= ~PARK_FLAGS_PARK_FREE_ENTRY; - gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; - } - else - { - gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; - gParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; - } - window_invalidate_by_class(WC_PARK_INFORMATION); - window_invalidate_by_class(WC_RIDE); - } - break; - case EDIT_SCENARIOOPTIONS_SETPARKCHARGEENTRYFEE: - gParkEntranceFee = std::clamp(*edx, MONEY(0, 00), MAX_ENTRANCE_FEE); - window_invalidate_by_class(WC_PARK_INFORMATION); - break; - case EDIT_SCENARIOOPTIONS_SETFORBIDTREEREMOVAL: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_FORBID_TREE_REMOVAL; - } - else - { - gParkFlags &= ~PARK_FLAGS_FORBID_TREE_REMOVAL; - } - break; - case EDIT_SCENARIOOPTIONS_SETFORBIDLANDSCAPECHANGES: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_FORBID_LANDSCAPE_CHANGES; - } - else - { - gParkFlags &= ~PARK_FLAGS_FORBID_LANDSCAPE_CHANGES; - } - break; - case EDIT_SCENARIOOPTIONS_SETFORBIDHIGHCONSTRUCTION: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_FORBID_HIGH_CONSTRUCTION; - } - else - { - gParkFlags &= ~PARK_FLAGS_FORBID_HIGH_CONSTRUCTION; - } - break; - case EDIT_SCENARIOOPTIONS_SETPARKRATINGHIGHERDIFFICULTLEVEL: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_DIFFICULT_PARK_RATING; - } - else - { - gParkFlags &= ~PARK_FLAGS_DIFFICULT_PARK_RATING; - } - break; - case EDIT_SCENARIOOPTIONS_SETGUESTGENERATIONHIGHERDIFFICULTLEVEL: - if (*edx != 0) - { - gParkFlags |= PARK_FLAGS_DIFFICULT_GUEST_GENERATION; - } - else - { - gParkFlags &= ~PARK_FLAGS_DIFFICULT_GUEST_GENERATION; - } - break; - } - window_invalidate_by_class(WC_EDITOR_SCENARIO_OPTIONS); - *ebx = 0; - } - uint8_t GetSelectedObjectFlags(int32_t objectType, size_t index) { uint8_t result = 0; @@ -787,9 +574,3 @@ void editor_open_windows_for_current_step() { Editor::OpenWindowsForCurrentStep(); } - -void game_command_edit_scenario_options( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp) -{ - Editor::GameCommandEditScenarioOptions(eax, ebx, ecx, edx, esi, edi, ebp); -} diff --git a/src/openrct2/Editor.h b/src/openrct2/Editor.h index 8810f12ab1..50bfb8d3fd 100644 --- a/src/openrct2/Editor.h +++ b/src/openrct2/Editor.h @@ -24,7 +24,6 @@ namespace Editor int32_t CheckObjectSelection(); void OpenWindowsForCurrentStep(); - void GameCommandEditScenarioOptions(int32_t*, int32_t*, int32_t*, int32_t*, int32_t*, int32_t*, int32_t*); uint8_t GetSelectedObjectFlags(int32_t objectType, size_t index); void ClearSelectedObject(int32_t objectType, size_t index, uint32_t flags); @@ -70,7 +69,4 @@ enum void editor_open_windows_for_current_step(); -void game_command_edit_scenario_options( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp); - #endif diff --git a/src/openrct2/Game.cpp b/src/openrct2/Game.cpp index d9ccf3738a..8fe33e3dfa 100644 --- a/src/openrct2/Game.cpp +++ b/src/openrct2/Game.cpp @@ -1226,6 +1226,6 @@ GAME_COMMAND_POINTER* new_game_command_table[GAME_COMMAND_COUNT] = { game_command_pickup_staff, nullptr, game_command_modify_tile, - game_command_edit_scenario_options, + nullptr, NULL, }; diff --git a/src/openrct2/Game.h b/src/openrct2/Game.h index 4a897eda5b..d9885993c3 100644 --- a/src/openrct2/Game.h +++ b/src/openrct2/Game.h @@ -89,7 +89,7 @@ enum GAME_COMMAND GAME_COMMAND_PICKUP_STAFF, GAME_COMMAND_BALLOON_PRESS, // GA GAME_COMMAND_MODIFY_TILE, - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, + GAME_COMMAND_EDIT_SCENARIO_OPTIONS, // GA GAME_COMMAND_PLACE_PEEP_SPAWN, // GA, TODO: refactor to separate array for just game actions GAME_COMMAND_SET_CLIMATE, // GA GAME_COMMAND_SET_COLOUR_SCHEME, // GA diff --git a/src/openrct2/actions/GameActionRegistration.cpp b/src/openrct2/actions/GameActionRegistration.cpp index 9da6c6dffe..4bbbabdbcd 100644 --- a/src/openrct2/actions/GameActionRegistration.cpp +++ b/src/openrct2/actions/GameActionRegistration.cpp @@ -58,6 +58,7 @@ #include "RideSetSetting.hpp" #include "RideSetStatus.hpp" #include "RideSetVehiclesAction.hpp" +#include "ScenarioSetSettingAction.hpp" #include "SetCheatAction.hpp" #include "SetParkEntranceFeeAction.hpp" #include "SignSetNameAction.hpp" @@ -123,6 +124,7 @@ namespace GameActions Register(); Register(); Register(); + Register(); Register(); Register(); Register(); diff --git a/src/openrct2/actions/ScenarioSetSettingAction.hpp b/src/openrct2/actions/ScenarioSetSettingAction.hpp new file mode 100644 index 0000000000..cbfd2fe8ad --- /dev/null +++ b/src/openrct2/actions/ScenarioSetSettingAction.hpp @@ -0,0 +1,290 @@ +/***************************************************************************** + * Copyright (c) 2014-2019 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../OpenRCT2.h" +#include "../interface/Window.h" +#include "../management/Finance.h" +#include "../peep/Peep.h" +#include "../world/Park.h" +#include "GameAction.h" + +#include + +enum class ScenarioSetSetting : uint8_t +{ + NoMoney, + InitialCash, + InitialLoan, + MaximumLoanSize, + AnnualInterestRate, + ForbidMarketingCampaigns, + AverageCashPerGuest, + GuestInitialHappiness, + GuestInitialHunger, + GuestInitialThirst, + GuestsPreferLessIntenseRides, + GuestsPreferMoreIntenseRides, + CostToBuyLand, + CostToBuyConstructionRights, + ParkChargeMethod, + ParkChargeEntryFee, + ForbidTreeRemoval, + ForbidLandscapeChanges, + ForbidHighConstruction, + ParkRatingHigherDifficultyLevel, + GuestGenerationHigherDifficultyLevel, + Count +}; + +DEFINE_GAME_ACTION(ScenarioSetSettingAction, GAME_COMMAND_EDIT_SCENARIO_OPTIONS, GameActionResult) +{ +private: + uint8_t _setting{ static_cast(ScenarioSetSetting::Count) }; + uint32_t _value{ 0 }; + +public: + ScenarioSetSettingAction() + { + } + ScenarioSetSettingAction(ScenarioSetSetting setting, uint32_t value) + : _setting(static_cast(setting)) + , _value(value) + { + } + + uint16_t GetActionFlags() const override + { + return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED; + } + + void Serialise(DataSerialiser & stream) override + { + GameAction::Serialise(stream); + + stream << DS_TAG(_setting) << DS_TAG(_value); + } + + GameActionResult::Ptr Query() const override + { + if (_setting >= static_cast(ScenarioSetSetting::Count)) + { + log_error("Invalid setting: %u", _setting); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_NONE); + } + + return MakeResult(); + } + + GameActionResult::Ptr Execute() const override + { + switch (static_cast(_setting)) + { + case ScenarioSetSetting::NoMoney: + if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) + { + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_NO_MONEY_SCENARIO; + } + else + { + gParkFlags &= ~PARK_FLAGS_NO_MONEY_SCENARIO; + } + } + else + { + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_NO_MONEY; + } + else + { + gParkFlags &= ~PARK_FLAGS_NO_MONEY; + } + // Invalidate all windows that have anything to do with finance + window_invalidate_by_class(WC_RIDE); + window_invalidate_by_class(WC_PEEP); + window_invalidate_by_class(WC_PARK_INFORMATION); + window_invalidate_by_class(WC_FINANCES); + window_invalidate_by_class(WC_BOTTOM_TOOLBAR); + window_invalidate_by_class(WC_TOP_TOOLBAR); + } + break; + case ScenarioSetSetting::InitialCash: + gInitialCash = std::clamp(_value, MONEY(0, 00), MONEY(1000000, 00)); + gCash = gInitialCash; + window_invalidate_by_class(WC_FINANCES); + window_invalidate_by_class(WC_BOTTOM_TOOLBAR); + break; + case ScenarioSetSetting::InitialLoan: + gBankLoan = std::clamp(_value, MONEY(0, 00), MONEY(5000000, 00)); + gMaxBankLoan = std::max(gBankLoan, gMaxBankLoan); + window_invalidate_by_class(WC_FINANCES); + break; + case ScenarioSetSetting::MaximumLoanSize: + gMaxBankLoan = std::clamp(_value, MONEY(0, 00), MONEY(5000000, 00)); + gBankLoan = std::min(gBankLoan, gMaxBankLoan); + window_invalidate_by_class(WC_FINANCES); + break; + case ScenarioSetSetting::AnnualInterestRate: + gBankLoanInterestRate = std::clamp(_value, 0, 80); + window_invalidate_by_class(WC_FINANCES); + break; + case ScenarioSetSetting::ForbidMarketingCampaigns: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_FORBID_MARKETING_CAMPAIGN; + } + else + { + gParkFlags &= ~PARK_FLAGS_FORBID_MARKETING_CAMPAIGN; + } + break; + case ScenarioSetSetting::AverageCashPerGuest: + gGuestInitialCash = std::clamp(_value, MONEY(0, 00), MONEY(1000, 00)); + break; + case ScenarioSetSetting::GuestInitialHappiness: + gGuestInitialHappiness = std::clamp(_value, 40, 250); + break; + case ScenarioSetSetting::GuestInitialHunger: + gGuestInitialHunger = std::clamp(_value, 40, 250); + break; + case ScenarioSetSetting::GuestInitialThirst: + gGuestInitialThirst = std::clamp(_value, 40, 250); + break; + case ScenarioSetSetting::GuestsPreferLessIntenseRides: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_PREF_LESS_INTENSE_RIDES; + } + else + { + gParkFlags &= ~PARK_FLAGS_PREF_LESS_INTENSE_RIDES; + } + break; + case ScenarioSetSetting::GuestsPreferMoreIntenseRides: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_PREF_MORE_INTENSE_RIDES; + } + else + { + gParkFlags &= ~PARK_FLAGS_PREF_MORE_INTENSE_RIDES; + } + break; + case ScenarioSetSetting::CostToBuyLand: + gLandPrice = std::clamp(_value, MONEY(5, 00), MONEY(200, 00)); + break; + case ScenarioSetSetting::CostToBuyConstructionRights: + gConstructionRightsPrice = std::clamp(_value, MONEY(5, 00), MONEY(200, 00)); + break; + case ScenarioSetSetting::ParkChargeMethod: + if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) + { + if (_value == 0) + { + gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; + gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; + gParkEntranceFee = MONEY(0, 00); + } + else if (_value == 1) + { + gParkFlags &= ~PARK_FLAGS_PARK_FREE_ENTRY; + gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; + gParkEntranceFee = MONEY(10, 00); + } + else + { + gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; + gParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; + gParkEntranceFee = MONEY(10, 00); + } + } + else + { + if (_value == 0) + { + gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; + gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; + } + else if (_value == 1) + { + gParkFlags &= ~PARK_FLAGS_PARK_FREE_ENTRY; + gParkFlags &= ~PARK_FLAGS_UNLOCK_ALL_PRICES; + } + else + { + gParkFlags |= PARK_FLAGS_PARK_FREE_ENTRY; + gParkFlags |= PARK_FLAGS_UNLOCK_ALL_PRICES; + } + window_invalidate_by_class(WC_PARK_INFORMATION); + window_invalidate_by_class(WC_RIDE); + } + break; + case ScenarioSetSetting::ParkChargeEntryFee: + gParkEntranceFee = std::clamp(_value, MONEY(0, 00), MAX_ENTRANCE_FEE); + window_invalidate_by_class(WC_PARK_INFORMATION); + break; + case ScenarioSetSetting::ForbidTreeRemoval: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_FORBID_TREE_REMOVAL; + } + else + { + gParkFlags &= ~PARK_FLAGS_FORBID_TREE_REMOVAL; + } + break; + case ScenarioSetSetting::ForbidLandscapeChanges: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_FORBID_LANDSCAPE_CHANGES; + } + else + { + gParkFlags &= ~PARK_FLAGS_FORBID_LANDSCAPE_CHANGES; + } + break; + case ScenarioSetSetting::ForbidHighConstruction: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_FORBID_HIGH_CONSTRUCTION; + } + else + { + gParkFlags &= ~PARK_FLAGS_FORBID_HIGH_CONSTRUCTION; + } + break; + case ScenarioSetSetting::ParkRatingHigherDifficultyLevel: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_DIFFICULT_PARK_RATING; + } + else + { + gParkFlags &= ~PARK_FLAGS_DIFFICULT_PARK_RATING; + } + break; + case ScenarioSetSetting::GuestGenerationHigherDifficultyLevel: + if (_value != 0) + { + gParkFlags |= PARK_FLAGS_DIFFICULT_GUEST_GENERATION; + } + else + { + gParkFlags &= ~PARK_FLAGS_DIFFICULT_GUEST_GENERATION; + } + break; + } + window_invalidate_by_class(WC_EDITOR_SCENARIO_OPTIONS); + return MakeResult(); + } +};