diff options
Diffstat (limited to 'src/misc_gui.cpp')
-rw-r--r-- | src/misc_gui.cpp | 195 |
1 files changed, 81 insertions, 114 deletions
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index 9b6434d02..6ff5071ed 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -1768,10 +1768,17 @@ void SetFiosType(const byte fiostype) } } +/** + * The 'amount' to cheat with. + * This variable is semantically a constant value, but because the cheat + * code requires to be able to write to the variable it is not constified. + */ +static int32 _money_cheat_amount = 10000000; + static int32 ClickMoneyCheat(int32 p1, int32 p2) { - DoCommandP(0, 10000000, 0, NULL, CMD_MONEY_CHEAT); - return true; + DoCommandP(0, (uint32)(p2 * _money_cheat_amount), 0, NULL, CMD_MONEY_CHEAT); + return _money_cheat_amount; } /** @@ -1827,38 +1834,24 @@ static int32 ClickChangeDateCheat(int32 p1, int32 p2) typedef int32 CheckButtonClick(int32, int32); -enum ce_flags_long -{ - CE_NONE = 0, - CE_CLICK = 1 << 0, - CE_END = 1 << 1, -}; - -/** Define basic enum properties */ -template <> struct EnumPropsT<ce_flags_long> : MakeEnumPropsT<ce_flags_long, byte, CE_NONE, CE_END, CE_END> {}; -typedef TinyEnumT<ce_flags_long> ce_flags; - - struct CheatEntry { VarType type; ///< type of selector - ce_flags flags; ///< selector flags StringID str; ///< string with descriptive text void *variable; ///< pointer to the variable bool *been_used; ///< has this cheat been used before? CheckButtonClick *proc;///< procedure - int16 min, max; ///< range for spinbox setting }; static const CheatEntry _cheats_ui[] = { - {SLE_BOOL, {CE_CLICK}, STR_CHEAT_MONEY, &_cheats.money.value, &_cheats.money.been_used, &ClickMoneyCheat, 0, 0}, - {SLE_UINT8, {CE_NONE}, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat, 0, 11}, - {SLE_BOOL, {CE_NONE}, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL, 0, 0}, - {SLE_BOOL, {CE_NONE}, STR_CHEAT_CROSSINGTUNNELS,&_cheats.crossing_tunnels.value,&_cheats.crossing_tunnels.been_used,NULL, 0, 0}, - {SLE_BOOL, {CE_NONE}, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL, 0, 0}, - {SLE_BOOL, {CE_NONE}, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL, 0, 0}, - {SLE_BOOL, {CE_NONE}, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL, 0, 0}, - {SLE_UINT8, {CE_NONE}, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat,-1, 4}, - {SLE_INT32, {CE_NONE}, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat, -1, 1}, + {SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat }, + {SLE_UINT8, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat }, + {SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL }, + {SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, NULL }, + {SLE_BOOL, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL }, + {SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL }, + {SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL }, + {SLE_UINT8, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat}, + {SLE_INT32, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat }, }; @@ -1873,123 +1866,97 @@ static const Widget _cheat_widgets[] = { static void CheatsWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: { - int clk = WP(w, def_d).data_1; - int x, y; - int i; + case WE_PAINT: { + int clk = WP(w, def_d).data_1; - DrawWindowWidgets(w); + DrawWindowWidgets(w); + DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, w->width - 50); - DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, w->width - 50); + for (int i = 0, x = 0, y = 45; i != lengthof(_cheats_ui); i++) { + const CheatEntry *ce = &_cheats_ui[i]; - x = 0; - y = 45; + DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2); - for (i = 0; i != lengthof(_cheats_ui); i++) { - const CheatEntry *ce = &_cheats_ui[i]; + switch (ce->type) { + case SLE_BOOL: { + bool on = (*(bool*)ce->variable); - DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2); + DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE); + SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF); + } break; - switch (ce->type) { - case SLE_BOOL: { - bool on = (*(bool*)ce->variable); - - if (ce->flags & CE_CLICK) { - DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, 0, (clk - (i * 2) == 1) ? FR_LOWERED : FR_NONE); - if (i == 0) { // XXX - hack/hack for first element which is increase money. Told ya it's a mess - SetDParam(0, 10000000); - } else { - SetDParam(0, false); - } - } else { - DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE); - SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF); - } - } break; - default: { - int32 val = (int32)ReadValue(ce->variable, ce->type); - char buf[512]; - - /* Draw [<][>] boxes for settings of an integer-type */ - DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true); - - switch (ce->str) { - /* Display date for change date cheat */ - case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break; - /* Draw colored flag for change player cheat */ - case STR_CHEAT_CHANGE_PLAYER: - SetDParam(0, val); - GetString(buf, STR_CHEAT_CHANGE_PLAYER, lastof(buf)); - DrawPlayerIcon(_current_player, 60 + GetStringBoundingBox(buf).width, y + 2); - break; - /* Set correct string for switch climate cheat */ - case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE; - /* Fallthrough */ - default: SetDParam(0, val); + default: { + int32 val = (int32)ReadValue(ce->variable, ce->type); + char buf[512]; + + /* Draw [<][>] boxes for settings of an integer-type */ + DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true); + + switch (ce->str) { + /* Display date for change date cheat */ + case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break; + + /* Draw colored flag for change player cheat */ + case STR_CHEAT_CHANGE_PLAYER: + SetDParam(0, val); + GetString(buf, STR_CHEAT_CHANGE_PLAYER, lastof(buf)); + DrawPlayerIcon(_current_player, 60 + GetStringBoundingBox(buf).width, y + 2); + break; + + /* Set correct string for switch climate cheat */ + case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE; + + /* Fallthrough */ + default: SetDParam(0, val); + } + } break; } - } break; - } - DrawString(50, y + 1, ce->str, TC_FROMSTRING); + DrawString(50, y + 1, ce->str, TC_FROMSTRING); - y += 12; + y += 12; + } + break; } - break; - } - case WE_CLICK: { - const CheatEntry *ce; + case WE_CLICK: { uint btn = (e->we.click.pt.y - 46) / 12; - int32 value, oldvalue; uint x = e->we.click.pt.x; - /* not clicking a button? */ + /* Not clicking a button? */ if (!IsInsideMM(x, 20, 40) || btn >= lengthof(_cheats_ui)) break; - ce = &_cheats_ui[btn]; - oldvalue = value = (int32)ReadValue(ce->variable, ce->type); + const CheatEntry *ce = &_cheats_ui[btn]; + int value = (int32)ReadValue(ce->variable, ce->type); + int oldvalue = value; *ce->been_used = true; switch (ce->type) { - case SLE_BOOL: - if (ce->flags & CE_CLICK) WP(w, def_d).data_1 = btn * 2 + 1; - value ^= 1; - if (ce->proc != NULL) ce->proc(value, 0); - break; - default: { - /* Add a dynamic step-size to the scroller. In a maximum of - * 50-steps you should be able to get from min to max */ - uint16 step = ((ce->max - ce->min) / 20); - if (step == 0) step = 1; - - /* Increase or decrease the value and clamp it to extremes */ - value += (x >= 30) ? step : -step; - value = Clamp(value, ce->min, ce->max); + case SLE_BOOL: + value ^= 1; + if (ce->proc != NULL) ce->proc(value, 0); + break; - /* take whatever the function returns */ - value = ce->proc(value, (x >= 30) ? 1 : -1); + default: + /* Take whatever the function returns */ + value = ce->proc(value + ((x >= 30) ? 1 : -1), (x >= 30) ? 1 : -1); - if (value != oldvalue) { - WP(w, def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0); - } - } break; + if (value != oldvalue) WP(w, def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0); + break; } - if (value != oldvalue) { - WriteValue(ce->variable, ce->type, (int64)value); - SetWindowDirty(w); - } + if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value); w->flags4 |= 5 << WF_TIMEOUT_SHL; SetWindowDirty(w); - } - break; - case WE_TIMEOUT: - WP(w, def_d).data_1 = 0; - SetWindowDirty(w); - break; + } break; + + case WE_TIMEOUT: + WP(w, def_d).data_1 = 0; + SetWindowDirty(w); + break; } } |