1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-18 04:23:20 +01:00

Implement ScenarioSetSetting game action

Further work moving game commands into the game action framework to improve design.
This commit is contained in:
duncanspumpkin
2019-05-14 21:08:50 +01:00
parent c9cbe391eb
commit 3ac596faf1
7 changed files with 408 additions and 331 deletions

View File

@@ -18,6 +18,7 @@
#include <openrct2/Game.h>
#include <openrct2/OpenRCT2.h>
#include <openrct2/actions/ClimateSetAction.hpp>
#include <openrct2/actions/ScenarioSetSettingAction.hpp>
#include <openrct2/drawing/Drawing.h>
#include <openrct2/interface/Colour.h>
#include <openrct2/localisation/StringIds.h>
@@ -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)
{

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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,
};

View File

@@ -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

View File

@@ -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<RideSetAppearanceAction>();
Register<RideSetVehicleAction>();
Register<RideSetSettingAction>();
Register<ScenarioSetSettingAction>();
Register<SetParkEntranceFeeAction>();
Register<SignSetNameAction>();
Register<SignSetStyleAction>();

View File

@@ -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 <algorithm>
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<uint8_t>(ScenarioSetSetting::Count) };
uint32_t _value{ 0 };
public:
ScenarioSetSettingAction()
{
}
ScenarioSetSettingAction(ScenarioSetSetting setting, uint32_t value)
: _setting(static_cast<uint8_t>(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<uint8_t>(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<ScenarioSetSetting>(_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<money32>(_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<money32>(_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<money32>(_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<uint8_t>(_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<money32>(_value, MONEY(0, 00), MONEY(1000, 00));
break;
case ScenarioSetSetting::GuestInitialHappiness:
gGuestInitialHappiness = std::clamp<uint8_t>(_value, 40, 250);
break;
case ScenarioSetSetting::GuestInitialHunger:
gGuestInitialHunger = std::clamp<uint8_t>(_value, 40, 250);
break;
case ScenarioSetSetting::GuestInitialThirst:
gGuestInitialThirst = std::clamp<uint8_t>(_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<money32>(_value, MONEY(5, 00), MONEY(200, 00));
break;
case ScenarioSetSetting::CostToBuyConstructionRights:
gConstructionRightsPrice = std::clamp<money32>(_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<money32>(_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();
}
};