diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index f39180d1f1..a5b238a241 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -281,7 +281,7 @@ struct CheatWindow : Window { /* 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); + DrawArrowButtons(button_left, y + button_y_offset, COLOUR_YELLOW, clicked - (i * 2), true, true); uint64 val = (uint64)ReadValue(ce->variable, SLE_UINT64); SetDParam(0, val * 1000 >> 16); @@ -435,12 +435,22 @@ struct CheatWindow : Window { if (!_networking) *ce->been_used = true; + auto get_arrow_button_value = [&]() -> int { + return (x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1; + }; + + auto register_arrow_button_clicked = [&]() { + this->clicked = btn * 2 + 1 + ((x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0); + }; + switch (ce->type) { case SLF_ALLOW_CONTROL: { /* Change inflation factors */ - uint64 value = (uint64)ReadValue(ce->variable, SLE_UINT64) + (((x >= 10 + this->box.width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1) << 16); + uint64 oldvalue = (uint64)ReadValue(ce->variable, SLE_UINT64); + uint64 value = oldvalue + (uint64)(get_arrow_button_value() << 16); value = Clamp(value, 1 << 16, MAX_INFLATION); DoCommandP(0, (uint32)btn, (uint32)value, CMD_CHEAT_SETTING); + if (value != oldvalue) register_arrow_button_clicked(); break; } @@ -451,10 +461,11 @@ struct CheatWindow : Window { default: /* Take whatever the function returns */ - value = ce->proc(value + ((x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) ? 1 : -1); + int offset = get_arrow_button_value(); + value = ce->proc(value + offset, offset); /* The first cheat (money), doesn't return a different value. */ - if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= WidgetDimensions::scaled.hsep_wide * 2 + this->box.width + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0); + if (value != oldvalue || btn == CHT_MONEY) register_arrow_button_clicked(); break; }