diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 6bf6b1a1e6..bbfd2052eb 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -176,14 +176,16 @@ struct CheatEntry { * Order matches with the values of #CheatNumbers */ static const CheatEntry _cheats_ui[] = { - {CNM_MONEY, SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat }, - {CNM_LOCAL_ONLY, SLE_UINT8, STR_CHEAT_CHANGE_COMPANY, &_local_company, &_cheats.switch_company.been_used, &ClickChangeCompanyCheat }, - {CNM_ALL, SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, nullptr }, - {CNM_ALL, SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, nullptr }, - {CNM_ALL, SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, nullptr }, - {CNM_LOCAL_ONLY, SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, &ClickSetProdCheat }, - {CNM_LOCAL_ONLY, SLE_UINT8, STR_CHEAT_EDIT_MAX_HL, &_settings_game.construction.max_heightlevel, &_cheats.edit_max_hl.been_used, &ClickChangeMaxHlCheat }, - {CNM_LOCAL_ONLY, SLE_INT32, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat }, + {CNM_MONEY, SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat }, + {CNM_LOCAL_ONLY, SLE_UINT8, STR_CHEAT_CHANGE_COMPANY, &_local_company, &_cheats.switch_company.been_used, &ClickChangeCompanyCheat }, + {CNM_ALL, SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, nullptr }, + {CNM_ALL, SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, nullptr }, + {CNM_ALL, SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, nullptr }, + {CNM_LOCAL_ONLY, SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, &ClickSetProdCheat }, + {CNM_LOCAL_ONLY, SLE_UINT8, STR_CHEAT_EDIT_MAX_HL, &_settings_game.construction.max_heightlevel, &_cheats.edit_max_hl.been_used, &ClickChangeMaxHlCheat }, + {CNM_LOCAL_ONLY, SLE_INT32, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat }, + {CNM_ALL, SLF_NOT_IN_SAVE, STR_CHEAT_INFLATION_COST, &_economy.inflation_prices, &_extra_cheats.inflation_cost.been_used, nullptr }, + {CNM_ALL, SLF_NOT_IN_SAVE, STR_CHEAT_INFLATION_INCOME, &_economy.inflation_payment, &_extra_cheats.inflation_income.been_used, nullptr }, }; static bool IsCheatAllowed(CheatNetworkMode mode) @@ -251,6 +253,18 @@ struct CheatWindow : Window { DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, box_left, y + icon_y_offset + 2); switch (ce->type) { + case SLF_NOT_IN_SAVE: { + /* Change inflation factors */ + + /* Draw [<][>] boxes for settings of an integer-type */ + DrawArrowButtons(button_left, y + icon_y_offset, COLOUR_YELLOW, clicked - (i * 2), true, true); + + uint64 val = (uint64)ReadValue(ce->variable, SLE_UINT64); + SetDParam(0, val * 1000 >> 16); + SetDParam(1, 3); + break; + } + case SLE_BOOL: { bool on = (*(bool*)ce->variable); @@ -302,6 +316,10 @@ struct CheatWindow : Window { if (!IsCheatAllowed(ce->mode)) continue; lines++; switch (ce->type) { + case SLF_NOT_IN_SAVE: + /* Change inflation factors */ + break; + case SLE_BOOL: SetDParam(0, STR_CONFIG_SETTING_ON); width = max(width, GetStringBoundingBox(ce->str).width); @@ -371,6 +389,17 @@ struct CheatWindow : Window { SetDParam(0, value); ShowQueryString(STR_JUST_INT, STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); return; + } else if (ce->type == SLF_NOT_IN_SAVE && x >= 20 + this->box_width + SETTING_BUTTON_WIDTH) { + clicked_widget = btn; + uint64 val = (uint64)ReadValue(ce->variable, SLE_UINT64); + SetDParam(0, val * 1000 >> 16); + SetDParam(1, 3); + StringID str = (btn == CHT_INFLATION_COST) ? STR_CHEAT_INFLATION_COST_QUERY_CAPT : STR_CHEAT_INFLATION_INCOME_QUERY_CAPT; + char *saved = _settings_game.locale.digit_group_separator; + _settings_game.locale.digit_group_separator = const_cast(""); + ShowQueryString(STR_JUST_DECIMAL, str, 12, this, CS_NUMERAL_DECIMAL, QSF_ACCEPT_UNCHANGED); + _settings_game.locale.digit_group_separator = saved; + return; } /* Not clicking a button? */ @@ -379,6 +408,14 @@ struct CheatWindow : Window { if (!_networking) *ce->been_used = true; switch (ce->type) { + case SLF_NOT_IN_SAVE: { + /* Change inflation factors */ + uint64 value = (uint64)ReadValue(ce->variable, SLE_UINT64) + (((x >= 10 + this->box_width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1) << 16); + value = Clamp(value, 1 << 16, MAX_INFLATION); + DoCommandP(0, (uint32)btn, (uint32)value, CMD_CHEAT_SETTING); + break; + } + case SLE_BOOL: value ^= 1; if (ce->proc != nullptr && !_networking) ce->proc(value, 0); @@ -414,12 +451,20 @@ struct CheatWindow : Window { void OnQueryTextFinished(char *str) override { - if (_networking) return; - /* Was 'cancel' pressed or nothing entered? */ if (str == nullptr || StrEmpty(str)) return; const CheatEntry *ce = &_cheats_ui[clicked_widget]; + + if (ce->type == SLF_NOT_IN_SAVE) { + char tmp_buffer[32]; + strecpy(tmp_buffer, str, lastof(tmp_buffer)); + str_replace_wchar(tmp_buffer, lastof(tmp_buffer), GetDecimalSeparatorChar(), '.'); + DoCommandP(0, (uint32)clicked_widget, (uint32)Clamp(atof(tmp_buffer) * 65536.0, 1 << 16, MAX_INFLATION), CMD_CHEAT_SETTING); + return; + } + + if (_networking) return; int oldvalue = (int32)ReadValue(ce->variable, ce->type); int value = atoi(str); *ce->been_used = true; diff --git a/src/cheat_type.h b/src/cheat_type.h index 429c19ac07..d379992888 100644 --- a/src/cheat_type.h +++ b/src/cheat_type.h @@ -38,6 +38,8 @@ struct Cheats { }; struct ExtraCheats { + Cheat inflation_cost; ///< inflation cost factor + Cheat inflation_income; ///< inflation income factor }; /** Available cheats. */ @@ -50,6 +52,8 @@ enum CheatNumbers { CHT_SETUP_PROD, ///< Allow manually editing of industry production. CHT_EDIT_MAX_HL, ///< Edit maximum allowed heightlevel CHT_CHANGE_DATE, ///< Do time traveling. + CHT_INFLATION_COST, ///< Change inflation cost factor + CHT_INFLATION_INCOME,///< Change inflation income factor CHT_NUM_CHEATS, ///< Number of cheats. }; diff --git a/src/lang/english.txt b/src/lang/english.txt index c64ab32099..783cdf29ae 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2080,6 +2080,10 @@ STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Toyland landsca STR_CHEAT_CHANGE_DATE :{LTBLUE}Change date: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Change current year STR_CHEAT_SETUP_PROD :{LTBLUE}Enable modifying production values: {ORANGE}{STRING1} +STR_CHEAT_INFLATION_COST :{LTBLUE}Change inflation cost factor: {ORANGE}{DECIMAL} +STR_CHEAT_INFLATION_COST_QUERY_CAPT :{WHITE}Change inflation cost factor +STR_CHEAT_INFLATION_INCOME :{LTBLUE}Change inflation income factor: {ORANGE}{DECIMAL} +STR_CHEAT_INFLATION_INCOME_QUERY_CAPT :{WHITE}Change inflation income factor # Livery window STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Colour Scheme diff --git a/src/misc_cmd.cpp b/src/misc_cmd.cpp index b49e36260b..4160290ea1 100644 --- a/src/misc_cmd.cpp +++ b/src/misc_cmd.cpp @@ -249,6 +249,32 @@ CommandCost CmdCheatSetting(TileIndex tile, DoCommandFlag flags, uint32 p1, uint cht = &_cheats.no_jetcrash; break; + case CHT_INFLATION_INCOME: + if (flags & DC_EXEC) { + _extra_cheats.inflation_income.been_used = true; + _economy.inflation_payment = Clamp(p2, 1 << 16, MAX_INFLATION); + if (_economy.inflation_payment > _economy.inflation_prices) { + _economy.inflation_prices = _economy.inflation_payment; + _extra_cheats.inflation_cost.been_used = true; + } + RecomputePrices(); + SetWindowDirty(WC_CHEATS, 0); + } + return CommandCost(); + + case CHT_INFLATION_COST: + if (flags & DC_EXEC) { + _extra_cheats.inflation_cost.been_used = true; + _economy.inflation_prices = Clamp(p2, 1 << 16, MAX_INFLATION); + if (_economy.inflation_payment > _economy.inflation_prices) { + _economy.inflation_payment = _economy.inflation_prices; + _extra_cheats.inflation_income.been_used = true; + } + RecomputePrices(); + SetWindowDirty(WC_CHEATS, 0); + } + return CommandCost(); + default: return CMD_ERROR; } diff --git a/src/saveload/cheat_sl.cpp b/src/saveload/cheat_sl.cpp index bbc324c0ec..cdc731d5eb 100644 --- a/src/saveload/cheat_sl.cpp +++ b/src/saveload/cheat_sl.cpp @@ -26,6 +26,8 @@ struct ExtraCheatNameDesc { }; static ExtraCheatNameDesc _extra_cheat_descs[] = { + { "inflation_cost", &_extra_cheats.inflation_cost }, + { "inflation_income", &_extra_cheats.inflation_income }, }; /**