diff options
-rw-r--r-- | src/cheat_gui.cpp | 160 |
1 files changed, 82 insertions, 78 deletions
diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 198d6ecc3..0ee653185 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -120,114 +120,118 @@ static const Widget _cheat_widgets[] = { { WIDGETS_END}, }; -static void CheatsWndProc(Window *w, WindowEvent *e) -{ - switch (e->event) { - case WE_PAINT: { - int clk = WP(w, def_d).data_1; - - DrawWindowWidgets(w); - 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]; - - DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2); - - switch (ce->type) { - case SLE_BOOL: { - bool on = (*(bool*)ce->variable); +struct CheatWindow : Window { + int clicked; - 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); + CheatWindow(const WindowDesc *desc) : Window(desc) + { + } - switch (ce->str) { - /* Display date for change date cheat */ - case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break; + virtual void OnPaint() + { + DrawWindowWidgets(this); + DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, width - 50); - /* 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; + for (int i = 0, x = 0, y = 45; i != lengthof(_cheats_ui); i++) { + const CheatEntry *ce = &_cheats_ui[i]; - /* Set correct string for switch climate cheat */ - case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE; + DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2); - /* Fallthrough */ - default: SetDParam(0, val); - } - } break; - } + switch (ce->type) { + case SLE_BOOL: { + bool on = (*(bool*)ce->variable); + + 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, clicked - (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; + } - DrawString(50, y + 1, ce->str, TC_FROMSTRING); + DrawString(50, y + 1, ce->str, TC_FROMSTRING); - y += 12; - } - break; + y += 12; } + } - case WE_CLICK: { - uint btn = (e->we.click.pt.y - 46) / 12; - uint x = e->we.click.pt.x; + virtual void OnClick(Point pt, int widget) + { + uint btn = (pt.y - 46) / 12; + uint x = pt.x; - /* Not clicking a button? */ - if (!IsInsideMM(x, 20, 40) || btn >= lengthof(_cheats_ui)) break; + /* Not clicking a button? */ + if (!IsInsideMM(x, 20, 40) || btn >= lengthof(_cheats_ui)) return; - const CheatEntry *ce = &_cheats_ui[btn]; - int value = (int32)ReadValue(ce->variable, ce->type); - int oldvalue = value; + const CheatEntry *ce = &_cheats_ui[btn]; + int value = (int32)ReadValue(ce->variable, ce->type); + int oldvalue = value; - *ce->been_used = true; + *ce->been_used = true; - switch (ce->type) { - case SLE_BOOL: - value ^= 1; - if (ce->proc != NULL) ce->proc(value, 0); - break; + switch (ce->type) { + case SLE_BOOL: + value ^= 1; + if (ce->proc != NULL) ce->proc(value, 0); + break; - default: - /* Take whatever the function returns */ - value = ce->proc(value + ((x >= 30) ? 1 : -1), (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; - } + /* The first cheat (money), doesn't return a different value. */ + if (value != oldvalue || btn == 0) this->clicked = btn * 2 + 1 + ((x >= 30) ? 1 : 0); + break; + } - if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value); + if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value); - w->flags4 |= 5 << WF_TIMEOUT_SHL; + flags4 |= 5 << WF_TIMEOUT_SHL; - w->SetDirty(); - } break; + SetDirty(); + } - case WE_TIMEOUT: - WP(w, def_d).data_1 = 0; - w->SetDirty(); - break; + virtual void OnTimeout() + { + this->clicked = 0; + this->SetDirty(); } -} +}; static const WindowDesc _cheats_desc = { 240, 22, 400, 170, 400, 170, WC_CHEATS, WC_NONE, WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, _cheat_widgets, - CheatsWndProc + NULL }; void ShowCheatWindow() { DeleteWindowById(WC_CHEATS, 0); - new Window(&_cheats_desc); + new CheatWindow(&_cheats_desc); } |