OpenTTD Source 20260721-master-g25ec12c62d
cheat_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
9
10#include "stdafx.h"
11#include "command_func.h"
12#include "cheat_type.h"
13#include "company_base.h"
14#include "company_func.h"
15#include "currency_func.h"
16#include "vehicle_base.h"
17#include "textbuf_gui.h"
18#include "window_gui.h"
19#include "string_func.h"
20#include "strings_func.h"
21#include "window_func.h"
22#include "rail_gui.h"
23#include "settings_gui.h"
24#include "company_gui.h"
26#include "map_func.h"
27#include "tile_map.h"
28#include "newgrf.h"
29#include "error.h"
30#include "misc_cmd.h"
31#include "settings_type.h"
32#include "settings_internal.h"
33#include "timer/timer.h"
37
39
40#include "table/sprites.h"
41#include "table/strings.h"
42
43#include "safeguards.h"
44
45
51static int32_t _money_cheat_amount = 10000000;
52
61static int32_t ClickMoneyCheat(int32_t, int32_t change_direction)
62{
63 Command<Commands::MoneyCheat>::Post(Money(_money_cheat_amount) * change_direction);
65}
66
73static int32_t ClickChangeCompanyCheat(int32_t new_value, int32_t change_direction)
74{
75 while ((uint)new_value < Company::GetPoolSize()) {
76 if (Company::IsValidID((CompanyID)new_value)) {
77 SetLocalCompany((CompanyID)new_value);
78 return _local_company.base();
79 }
80 new_value += change_direction;
81 }
82
83 return _local_company.base();
84}
85
91static int32_t ClickSetProdCheat(int32_t new_value, int32_t)
92{
93 _cheats.setup_prod.value = (new_value != 0);
94 InvalidateWindowClassesData(WindowClass::IndustryView);
95 return _cheats.setup_prod.value;
96}
97
98extern void CalendarEnginesMonthlyLoop();
99
105static int32_t ClickChangeDateCheat(int32_t new_value, int32_t)
106{
107 /* Don't allow changing to an invalid year, or the current year. */
109 if (new_year == TimerGameCalendar::year) return TimerGameCalendar::year.base();
110
111 TimerGameCalendar::YearMonthDay ymd = TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date);
112 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(new_year, ymd.month, ymd.day);
113
115
116 /* If not using wallclock units, we keep economy date in sync with calendar date and must change it also. */
118 /* Keep economy and calendar dates synced. */
119 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
120
121 /* Shift cached dates before we change the date. */
122 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
123 LinkGraphSchedule::instance.ShiftDates(new_economy_date - TimerGameEconomy::date);
124
125 /* Now it's safe to actually change the date. */
127 }
128
130 SetWindowDirty(WindowClass::Statusbar, 0);
131 InvalidateWindowClassesData(WindowClass::BuildStation, 0);
132 InvalidateWindowClassesData(WindowClass::BuildBusStation, 0);
133 InvalidateWindowClassesData(WindowClass::BuildTruckStation, 0);
134 InvalidateWindowClassesData(WindowClass::BuildObject, 0);
135 InvalidateWindowClassesData(WindowClass::Finances, 0);
137 return TimerGameCalendar::year.base();
138}
139
146static int32_t ClickChangeMaxHlCheat(int32_t new_value, int32_t)
147{
148 new_value = Clamp(new_value, MIN_MAP_HEIGHT_LIMIT, MAX_MAP_HEIGHT_LIMIT);
149
150 /* Check if at least one mountain on the map is higher than the new value.
151 * If yes, disallow the change. */
152 for (const auto t : Map::Iterate()) {
153 if ((int32_t)TileHeight(t) > new_value) {
154 ShowErrorMessage(GetEncodedString(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN), {}, WarningLevel::Error);
155 /* Return old, unchanged value */
156 return _settings_game.construction.map_height_limit;
157 }
158 }
159
160 /* Execute the change and reload GRF Data */
161 _settings_game.construction.map_height_limit = new_value;
163
164 /* The smallmap uses an index from heightlevels to colours. Trigger rebuilding it. */
165 InvalidateWindowClassesData(WindowClass::SmallMap, 2);
166
167 return _settings_game.construction.map_height_limit;
168}
169
184
190typedef int32_t CheckButtonClick(int32_t new_value, int32_t change_direction);
191
200
205static const CheatEntry _cheats_ui[] = {
206 { VarMemType::I32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat },
207 { VarMemType::U8, STR_CHEAT_CHANGE_COMPANY, &_local_company, &_cheats.switch_company.been_used, &ClickChangeCompanyCheat },
208 { VarMemType::Bool, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, nullptr },
209 { VarMemType::Bool, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, nullptr },
210 { VarMemType::Bool, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, nullptr },
211 { VarMemType::Bool, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, &ClickSetProdCheat },
212 { VarMemType::Bool, STR_CHEAT_STATION_RATING, &_cheats.station_rating.value, &_cheats.station_rating.been_used, nullptr },
213 { VarMemType::U8, STR_CHEAT_EDIT_MAX_HL, &_settings_game.construction.map_height_limit, &_cheats.edit_max_hl.been_used, &ClickChangeMaxHlCheat },
214 { VarMemType::I32, STR_CHEAT_CHANGE_DATE, &TimerGameCalendar::year, &_cheats.change_date.been_used, &ClickChangeDateCheat },
215};
216
217static_assert(CHT_NUM_CHEATS == lengthof(_cheats_ui));
218
234
236struct CheatWindow : Window {
237 int clicked = 0;
238 int clicked_cheat = 0;
239 uint line_height = 0;
241
242 std::vector<const SettingDesc *> sandbox_settings{};
243 const SettingDesc *clicked_setting = nullptr;
244 const SettingDesc *last_clicked_setting = nullptr;
245 const SettingDesc *valuewindow_entry = nullptr;
246
247 CheatWindow(WindowDesc &desc) : Window(desc)
248 {
249 this->sandbox_settings = GetFilteredSettingCollection([](const SettingDesc &sd) { return sd.flags.Test(SettingFlag::Sandbox); });
250 this->InitNested();
251 }
252
253 void OnInit() override
254 {
255 this->icon = GetSpriteSize(SPR_COMPANY_ICON);
256 }
257
258 void DrawWidget(const Rect &r, WidgetID widget) const override
259 {
260 switch (widget) {
261 case WID_C_PANEL: DrawCheatWidget(r); break;
262 case WID_C_SETTINGS: DrawSettingsWidget(r); break;
263 }
264 }
265
266 void DrawCheatWidget(const Rect &r) const
267 {
268 const Rect ir = r;
269 int y = ir.top;
270
271 bool rtl = _current_text_dir == TD_RTL;
272 uint button_left = rtl ? ir.right - SETTING_BUTTON_WIDTH : ir.left;
273 uint text_left = ir.left + (rtl ? 0 : WidgetDimensions::scaled.hsep_wide + SETTING_BUTTON_WIDTH);
274 uint text_right = ir.right - (rtl ? WidgetDimensions::scaled.hsep_wide + SETTING_BUTTON_WIDTH : 0);
275
276 int text_y_offset = (this->line_height - GetCharacterHeight(FontSize::Normal)) / 2;
277 int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
278 int icon_y_offset = (this->line_height - this->icon.height) / 2;
279
280 for (int i = 0; i != lengthof(_cheats_ui); i++) {
281 const CheatEntry *ce = &_cheats_ui[i];
282
283 std::string str;
284 switch (ce->type) {
285 case VarMemType::Bool: {
286 bool on = (*(bool*)ce->variable);
287
288 DrawBoolButton(button_left, y + button_y_offset, Colours::Yellow, Colours::Grey, on, true);
289 str = GetString(ce->str, on ? STR_CONFIG_SETTING_ON : STR_CONFIG_SETTING_OFF);
290 break;
291 }
292
293 default: {
294 int32_t val = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
295
296 /* Draw [<][>] boxes for settings of an integer-type */
297 DrawArrowButtons(button_left, y + button_y_offset, Colours::Yellow, clicked - (i * 2), true, true);
298
299 switch (ce->str) {
300 /* Display date for change date cheat */
301 case STR_CHEAT_CHANGE_DATE:
303 break;
304
305 /* Draw coloured flag for change company cheat */
306 case STR_CHEAT_CHANGE_COMPANY: {
307 str = GetString(ce->str, val + 1);
309 DrawCompanyIcon(_local_company, rtl ? text_right - offset - WidgetDimensions::scaled.hsep_indent : text_left + offset, y + icon_y_offset);
310 break;
311 }
312
313 default:
314 str = GetString(ce->str, val);
315 break;
316 }
317 break;
318 }
319 }
320
321 DrawString(text_left, text_right, y + text_y_offset, str);
322
323 y += this->line_height;
324 }
325 }
326
327 void DrawSettingsWidget(const Rect &r) const
328 {
329 Rect ir = r.WithHeight(this->line_height);
330
331 for (const auto &desc : this->sandbox_settings) {
332 DrawSetting(ir, desc);
333 ir = ir.Translate(0, this->line_height);
334 }
335 }
336
337 void DrawSetting(const Rect r, const SettingDesc *desc) const
338 {
339 const IntSettingDesc *sd = desc->AsIntSetting();
340 int state = this->clicked_setting == sd ? this->clicked : 0;
341
342 bool rtl = _current_text_dir == TD_RTL;
343
344 Rect buttons = r.WithWidth(SETTING_BUTTON_WIDTH, rtl);
345 Rect text = r.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl);
346 buttons.top += (r.Height() - SETTING_BUTTON_HEIGHT) / 2;
347 text.top += (r.Height() - GetCharacterHeight(FontSize::Normal)) / 2;
348
349 /* We do not allow changes of some items when we are a client in a network game */
350 bool editable = sd->IsEditable();
351
352 auto [min_val, max_val] = sd->GetRange();
353 int32_t value = sd->Read(&GetGameSettings());
354 if (sd->IsBoolSetting()) {
355 /* Draw checkbox for boolean-value either on/off */
356 DrawBoolButton(buttons.left, buttons.top, Colours::Yellow, Colours::Grey, value != 0, editable);
357 } else if (sd->flags.Test(SettingFlag::GuiDropdown)) {
358 /* Draw [v] button for settings of an enum-type */
359 DrawDropDownButton(buttons.left, buttons.top, Colours::Yellow, state != 0, editable);
360 } else {
361 /* Draw [<][>] boxes for settings of an integer-type */
362 DrawArrowButtons(buttons.left, buttons.top, Colours::Yellow, state,
363 editable && value != (sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : min_val), editable && static_cast<uint32_t>(value) != max_val);
364 }
365 auto [param1, param2] = sd->GetValueParams(value);
366 DrawString(text.left, text.right, text.top, GetString(sd->GetTitle(), STR_CONFIG_SETTING_VALUE, param1, param2), TextColour::LightBlue);
367 }
368
369 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
370 {
371 switch (widget) {
372 case WID_C_PANEL: UpdateCheatPanelSize(size); break;
373 case WID_C_SETTINGS: UpdateSettingsPanelSize(size); break;
374 }
375 }
376
377 void UpdateCheatPanelSize(Dimension &size)
378 {
379 uint width = 0;
380 for (const auto &ce : _cheats_ui) {
381 switch (ce.type) {
382 case VarMemType::Bool:
383 width = std::max(width, GetStringBoundingBox(GetString(ce.str, STR_CONFIG_SETTING_ON)).width);
384 width = std::max(width, GetStringBoundingBox(GetString(ce.str, STR_CONFIG_SETTING_OFF)).width);
385 break;
386
387 default:
388 switch (ce.str) {
389 /* Display date for change date cheat */
390 case STR_CHEAT_CHANGE_DATE:
392 break;
393
394 /* Draw coloured flag for change company cheat */
395 case STR_CHEAT_CHANGE_COMPANY:
396 width = std::max(width, GetStringBoundingBox(GetString(ce.str, MAX_COMPANIES)).width + WidgetDimensions::scaled.hsep_wide);
397 break;
398
399 default:
400 width = std::max(width, GetStringBoundingBox(GetString(ce.str, INT64_MAX)).width);
401 break;
402 }
403 break;
404 }
405 }
406
407 this->line_height = std::max<uint>(this->icon.height, SETTING_BUTTON_HEIGHT);
408 this->line_height = std::max<uint>(this->line_height, GetCharacterHeight(FontSize::Normal)) + WidgetDimensions::scaled.framerect.Vertical();
409
411 size.height = this->line_height * lengthof(_cheats_ui);
412 }
413
414 void UpdateSettingsPanelSize(Dimension &size)
415 {
416 uint width = 0;
417 for (const auto &desc : this->sandbox_settings) {
418 const IntSettingDesc *sd = desc->AsIntSetting();
419
420 auto [param1, param2] = sd->GetValueParams(sd->GetDefaultValue());
421 width = std::max(width, GetStringBoundingBox(GetString(sd->GetTitle(), STR_CONFIG_SETTING_VALUE, param1, param2)).width);
422 }
423
425 size.height = this->line_height * static_cast<uint>(std::size(this->sandbox_settings));
426 }
427
428 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
429 {
430 switch (widget) {
431 case WID_C_PANEL: CheatPanelClick(pt); break;
432 case WID_C_SETTINGS: SettingsPanelClick(pt); break;
433 }
434 }
435
436 void CheatPanelClick(Point pt)
437 {
438 Rect r = this->GetWidget<NWidgetBase>(WID_C_PANEL)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
439 uint btn = (pt.y - r.top) / this->line_height;
440 int x = pt.x - r.left;
441 bool rtl = _current_text_dir == TD_RTL;
442 if (rtl) x = r.Width() - 1 - x;
443
444 if (btn >= lengthof(_cheats_ui)) return;
445
446 const CheatEntry *ce = &_cheats_ui[btn];
447 int value = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
448 int oldvalue = value;
449
450 if (btn == CHT_CHANGE_DATE && x >= SETTING_BUTTON_WIDTH) {
451 /* Click at the date text directly. */
452 clicked_cheat = CHT_CHANGE_DATE;
453 ShowQueryString(GetString(STR_JUST_INT, value), STR_CHEAT_CHANGE_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QueryStringFlag::AcceptUnchanged);
454 return;
455 } else if (btn == CHT_EDIT_MAX_HL && x >= SETTING_BUTTON_WIDTH) {
456 clicked_cheat = CHT_EDIT_MAX_HL;
457 ShowQueryString(GetString(STR_JUST_INT, value), STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT, 8, this, CS_NUMERAL, QueryStringFlag::AcceptUnchanged);
458 return;
459 }
460
461 /* Not clicking a button? */
462 if (!IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) return;
463
464 this->clicked_setting = nullptr;
465 *ce->been_used = true;
466
467 switch (ce->type) {
468 case VarMemType::Bool:
469 value ^= 1;
470 if (ce->proc != nullptr) ce->proc(value, 0);
471 break;
472
473 default:
474 /* Take whatever the function returns */
475 value = ce->proc(value + ((x >= SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= SETTING_BUTTON_WIDTH / 2) ? 1 : -1);
476
477 /* The first cheat (money), doesn't return a different value. */
478 if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0);
479 break;
480 }
481
482 if (value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(value));
483
484 this->SetTimeout();
485
486 this->SetDirty();
487 }
488
489 void SettingsPanelClick(Point pt)
490 {
491 int row = this->GetRowFromWidget(pt.y, WID_C_SETTINGS, WidgetDimensions::scaled.framerect.top, this->line_height);
492 if (row == INT_MAX) return;
493
494 const SettingDesc *desc = this->sandbox_settings[row];
495 const IntSettingDesc *sd = desc->AsIntSetting();
496
497 if (!sd->IsEditable()) return;
498
499 Rect r = this->GetWidget<NWidgetBase>(WID_C_SETTINGS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
500 int x = pt.x - r.left;
501 bool rtl = _current_text_dir == TD_RTL;
502 if (rtl) x = r.Width() - 1 - x;
503
504 if (x < SETTING_BUTTON_WIDTH) {
505 ChangeSettingValue(sd, x);
506 } else {
507 /* Only open editbox if clicked for the second time, and only for types where it is sensible for. */
508 if (this->last_clicked_setting == sd && !sd->IsBoolSetting() && !sd->flags.Test(SettingFlag::GuiDropdown)) {
509 int64_t value64 = sd->Read(&GetGameSettings());
510
511 /* Show the correct currency-translated value */
512 if (sd->flags.Test(SettingFlag::GuiCurrency)) value64 *= GetCurrency().rate;
513
514 CharSetFilter charset_filter = CS_NUMERAL; //default, only numeric input allowed
515 if (sd->min < 0) charset_filter = CS_NUMERAL_SIGNED; // special case, also allow '-' sign for negative input
516
517 this->valuewindow_entry = sd;
518
519 /* Limit string length to 14 so that MAX_INT32 * max currency rate doesn't exceed MAX_INT64. */
520 ShowQueryString(GetString(STR_JUST_INT, value64), STR_CONFIG_SETTING_QUERY_CAPTION, 15, this, charset_filter, QueryStringFlag::EnableDefault);
521 }
522
523 this->clicked_setting = sd;
524 }
525 }
526
527 void ChangeSettingValue(const IntSettingDesc *sd, int x)
528 {
529 int32_t value = sd->Read(&GetGameSettings());
530 int32_t oldvalue = value;
531 if (sd->IsBoolSetting()) {
532 value ^= 1;
533 } else {
534 /* don't allow too fast scrolling */
535 if (this->flags.Test(WindowFlag::Timeout) && this->timeout_timer > 1) {
536 _left_button_clicked = false;
537 return;
538 }
539
540 /* Add a dynamic step-size to the scroller. In a maximum of
541 * 50-steps you should be able to get from min to max,
542 * unless specified otherwise in the 'interval' variable
543 * of the current setting. */
544 uint32_t step = (sd->interval == 0) ? ((sd->max - sd->min) / 50) : sd->interval;
545 if (step == 0) step = 1;
546
547 /* Increase or decrease the value and clamp it to extremes */
548 if (x >= SETTING_BUTTON_WIDTH / 2) {
549 value += step;
550 if (sd->min < 0) {
551 assert(static_cast<int32_t>(sd->max) >= 0);
552 if (value > static_cast<int32_t>(sd->max)) value = static_cast<int32_t>(sd->max);
553 } else {
554 if (static_cast<uint32_t>(value) > sd->max) value = static_cast<int32_t>(sd->max);
555 }
556 if (value < sd->min) value = sd->min; // skip between "disabled" and minimum
557 } else {
558 value -= step;
559 if (value < sd->min) value = sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : sd->min;
560 }
561
562 /* Set up scroller timeout for numeric values */
563 if (value != oldvalue) {
564 this->last_clicked_setting = nullptr;
565 this->clicked_setting = sd;
566 this->clicked = (x >= SETTING_BUTTON_WIDTH / 2) != (_current_text_dir == TD_RTL) ? 2 : 1;
567 this->SetTimeout();
568 _left_button_clicked = false;
569 }
570 }
571
572 if (value != oldvalue) {
573 SetSettingValue(sd, value);
574 this->SetDirty();
575 }
576 }
577
578 bool OnTooltip([[maybe_unused]] Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
579 {
580 if (widget != WID_C_SETTINGS) return false;
581
582 int row = GetRowFromWidget(pt.y, widget, WidgetDimensions::scaled.framerect.top, this->line_height);
583 if (row == INT_MAX) return false;
584
585 const SettingDesc *desc = this->sandbox_settings[row];
586 const IntSettingDesc *sd = desc->AsIntSetting();
587 GuiShowTooltips(this, GetEncodedString(sd->GetHelp()), close_cond);
588
589 return true;
590 }
591
592 void OnTimeout() override
593 {
594 this->clicked_setting = nullptr;
595 this->clicked = 0;
596 this->SetDirty();
597 }
598
599 void OnQueryTextFinished(std::optional<std::string> str) override
600 {
601 /* Was 'cancel' pressed or nothing entered? */
602 if (!str.has_value() || str->empty()) return;
603
604 if (this->valuewindow_entry != nullptr) {
605 const IntSettingDesc *sd = this->valuewindow_entry->AsIntSetting();
606
607 int32_t value;
608 if (!str->empty()) {
609 auto llvalue = ParseInteger<int64_t>(*str, 10, true);
610 if (!llvalue.has_value()) return;
611
612 /* Save the correct currency-translated value */
613 if (sd->flags.Test(SettingFlag::GuiCurrency)) llvalue = *llvalue / GetCurrency().rate;
614
615 value = ClampTo<int32_t>(*llvalue);
616 } else {
617 value = sd->GetDefaultValue();
618 }
619
620 SetSettingValue(sd, value);
621 } else {
622 const CheatEntry *ce = &_cheats_ui[clicked_cheat];
623 int oldvalue = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
624 auto value = ParseInteger<int32_t>(*str, 10, true);
625 if (!value.has_value()) return;
626 *ce->been_used = true;
627 value = ce->proc(*value, *value - oldvalue);
628
629 if (*value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(*value));
630 }
631
632 this->valuewindow_entry = nullptr;
633 this->SetDirty();
634 }
635
636 const IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::Trigger::Month, TimerGameCalendar::Priority::None}, [this](auto) {
637 this->SetDirty();
638 }};
639};
640
643 WindowPosition::Automatic, "cheats", 0, 0,
644 WindowClass::Cheat, WindowClass::None,
645 {},
647);
648
651{
652 CloseWindowById(WindowClass::Cheat, 0);
654}
Cheats _cheats
All the cheats.
Definition cheat.cpp:16
static constexpr std::initializer_list< NWidgetPart > _nested_cheat_widgets
Widget definitions of the cheat GUI.
CheatNumbers
Available cheats.
@ CHT_NO_JETCRASH
Disable jet-airplane crashes.
@ CHT_CHANGE_DATE
Do time traveling.
@ CHT_CROSSINGTUNNELS
Allow tunnels to cross each other.
@ CHT_SETUP_PROD
Allow manually editing of industry production.
@ CHT_CHANGE_COMPANY
Switch company.
@ CHT_NUM_CHEATS
Number of cheats.
@ CHT_EXTRA_DYNAMITE
Dynamite anything.
@ CHT_MONEY
Change amount of money.
@ CHT_STATION_RATING
Fix station ratings at 100%.
@ CHT_EDIT_MAX_HL
Edit maximum allowed heightlevel.
static int32_t _money_cheat_amount
The 'amount' to cheat with.
Definition cheat_gui.cpp:51
static int32_t ClickChangeMaxHlCheat(int32_t new_value, int32_t)
Allow (or disallow) a change of the maximum allowed heightlevel.
static WindowDesc _cheats_desc(WindowPosition::Automatic, "cheats", 0, 0, WindowClass::Cheat, WindowClass::None, {}, _nested_cheat_widgets)
Window description of the cheats GUI.
void CalendarEnginesMonthlyLoop()
Monthly update of the availability, reliability, and preview offers of the engines.
Definition engine.cpp:1176
static int32_t ClickMoneyCheat(int32_t, int32_t change_direction)
Handle cheating of money.
Definition cheat_gui.cpp:61
static int32_t ClickSetProdCheat(int32_t new_value, int32_t)
Allow (or disallow) changing production of all industries.
Definition cheat_gui.cpp:91
static int32_t ClickChangeDateCheat(int32_t new_value, int32_t)
Handle changing of the current year.
static int32_t ClickChangeCompanyCheat(int32_t new_value, int32_t change_direction)
Handle changing of company.
Definition cheat_gui.cpp:73
int32_t CheckButtonClick(int32_t new_value, int32_t change_direction)
Signature of handler function when user clicks at a cheat.
void ShowCheatWindow()
Open cheat window.
static const CheatEntry _cheats_ui[]
The available cheats.
Types related to cheating.
Types related to the cheat widgets.
@ WID_C_PANEL
Panel where all cheats are shown in.
@ WID_C_SETTINGS
Panel where sandbox settings are shown.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition timer.h:76
static LinkGraphSchedule instance
Static instance of LinkGraphSchedule.
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
static void SetDate(Date date, DateFract fract)
Set the date.
static Date date
Current date in days (day counter).
static Year year
Current year, starting at 0.
static DateFract date_fract
Fractional part of the day.
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
static Date date
Current date in days (day counter).
static bool UsingWallclockUnits(bool newgame=false)
Check if we are using wallclock units.
static DateFract date_fract
Fractional part of the day.
static void SetDate(Date date, DateFract fract)
Set the date.
StrongType::Typedef< int32_t, struct YearTag< struct Calendar >, StrongType::Compare, StrongType::Integer > Year
StrongType::Typedef< int32_t, DateTag< struct Calendar >, StrongType::Compare, StrongType::Integer > Date
RectPadding framerect
Standard padding inside many panels.
Definition window_gui.h:42
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:30
int hsep_wide
Wide horizontal spacing.
Definition window_gui.h:64
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:95
int hsep_indent
Width of indentation for tree layouts.
Definition window_gui.h:65
Functions related to commands.
Definition of stuff that is very close to a company, like the company struct itself.
void DrawCompanyIcon(CompanyID c, int x, int y)
Draw the icon of a company.
void SetLocalCompany(CompanyID new_company, bool switching_game)
Sets the local company and updates the settings that are set on a per-company basis to reflect the co...
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to companies.
GUI Functions related to companies.
Functions to handle different currencies.
const CurrencySpec & GetCurrency()
Get the currently selected currency.
Functions related to errors.
@ Error
Errors (eg. saving/loading failed).
Definition error.h:26
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, CommandCost &cc)
Display an error message in a window.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:88
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition gfx.cpp:971
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:899
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:43
int DrawString(int left, int right, int top, std::string_view str, ExtendedTextColour colour, Alignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:668
@ Normal
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ Invalid
Invalid marker.
Definition gfx_type.h:302
@ Yellow
Yellow.
Definition gfx_type.h:288
@ Grey
Grey.
Definition gfx_type.h:299
@ LightBlue
Light blue colour.
Definition gfx_type.h:331
constexpr NWidgetPart SetPadding(uint8_t top, uint8_t right, uint8_t bottom, uint8_t left)
Widget part function for setting additional space around a widget.
constexpr NWidgetPart SetStringTip(StringID string, StringID tip={})
Widget part function for setting the string and tooltip.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
void SetDirty() const
Mark entire window as dirty (in need of re-paint).
Definition window.cpp:972
Declaration of link graph schedule used for cargo distribution.
#define Rect
Macro that prevents name conflicts between included headers.
#define Point
Macro that prevents name conflicts between included headers.
Functions related to maps.
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
constexpr To ClampTo(From value)
Clamp the given value down to lie within the requested type.
Miscellaneous command definitions.
void GuiShowTooltips(Window *parent, EncodedString &&text, TooltipCloseCondition close_tooltip)
Shows a tooltip.
Definition misc_gui.cpp:690
void ShowQueryString(std::string_view str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
Base for the NewGRF implementation.
void ReloadNewGRFData()
Reload all NewGRF files during a running game.
void ResetSignalVariant(int32_t)
Updates the current signal variant used in the signal GUI to the one adequate to current year.
Functions/types etc.
A number of safeguards to prevent using unsafe methods.
void WriteValue(void *ptr, VarMemType conv, int64_t val)
Write the value of a setting.
Definition saveload.cpp:909
int64_t ReadValue(const void *ptr, VarMemType conv)
Return a signed-long version of the value of a setting.
Definition saveload.cpp:885
VarMemType
The types/structures of data we have in memory.
Definition saveload.h:651
@ U8
A 8 bit unsigned int.
Definition saveload.h:654
@ Bool
A boolean value.
Definition saveload.h:652
@ I32
A 32 bit signed int.
Definition saveload.h:657
std::vector< const SettingDesc * > GetFilteredSettingCollection(std::function< bool(const SettingDesc &desc)> func)
Get a collection of settings matching a custom filter.
bool SetSettingValue(const IntSettingDesc *sd, int32_t value, bool force_newgame)
Top function to save the new value of an element of the Settings struct.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
void DrawArrowButtons(int x, int y, Colours button_colour, uint8_t state, bool clickable_left, bool clickable_right)
Draw [<][>] boxes.
void DrawBoolButton(int x, int y, Colours button_colour, Colours background, bool state, bool clickable)
Draw a toggle button.
void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool clickable)
Draw a dropdown button.
Functions for setting GUIs.
#define SETTING_BUTTON_WIDTH
Width of setting buttons.
#define SETTING_BUTTON_HEIGHT
Height of setting buttons.
Functions and types used internally for the settings configurations.
@ GuiCurrency
The number represents money, so when reading value multiply by exchange rate.
@ Sandbox
This setting is a sandbox setting.
@ GuiZeroIsSpecial
A value of zero is possible and has a custom string (the one after "strval").
@ GuiDropdown
The value represents a limited number of string-options (internally integer) presented as dropdown.
Types related to global configuration settings.
GameSettings & GetGameSettings()
Get the settings-object applicable for the current situation: the newgame settings when we're in the ...
This file contains all sprite-related enums and defines.
static const SpriteID SPR_COMPANY_ICON
Icon showing company colour.
Definition sprites.h:385
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:261
Parse strings.
static std::optional< T > ParseInteger(std::string_view arg, int base=10, bool clamp=false)
Change a string into its number representation.
Functions related to low-level strings.
CharSetFilter
Valid filter types for IsValidChar.
Definition string_type.h:24
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
@ CS_NUMERAL_SIGNED
Only numbers and '-' for negative values.
Definition string_type.h:28
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:90
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_RTL
Text is written right-to-left by default.
Information of a cheat.
void * variable
pointer to the variable
StringID str
string with descriptive text
CheckButtonClick * proc
procedure
bool * been_used
has this cheat been used before?
VarMemType type
type of selector
GUI for the cheats.
void OnTimeout() override
Called when this window's timeout has been reached.
Dimension icon
Dimension of company icon sprite.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
void OnInit() override
Notification that the nested widget tree gets initialized.
void UpdateWidgetSize(WidgetID widget, Dimension &size, const Dimension &padding, Dimension &fill, Dimension &resize) override
Update size and resize step of a widget in the window.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
bool OnTooltip(Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
Event to display a custom tooltip.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
T y
Y coordinate.
T x
X coordinate.
uint16_t rate
The conversion rate compared to the base currency.
Dimensions (a width and height) of a rectangle in 2D.
Base integer type, including boolean, settings.
std::tuple< int32_t, uint32_t > GetRange() const
Get the min/max range for the setting.
Definition settings.cpp:502
StringID GetTitle() const
Get the title of the setting.
Definition settings.cpp:452
uint32_t max
maximum values
int32_t min
minimum values
int32_t GetDefaultValue() const
Get the default value of the setting.
Definition settings.cpp:493
StringID GetHelp() const
Get the help text of the setting.
Definition settings.cpp:461
virtual bool IsBoolSetting() const
Check whether this setting is a boolean type setting.
std::pair< StringParameter, StringParameter > GetValueParams(int32_t value) const
Get parameters for drawing the value of the setting.
Definition settings.cpp:471
int32_t Read(const void *object) const
Read the integer from the the actual setting.
Definition settings.cpp:593
int32_t interval
the interval to use between settings in the 'settings' window. If interval is '0' the interval is dyn...
static IterateWrapper Iterate()
Returns an iterable ensemble of all Tiles.
Definition map_func.h:366
static Pool::IterateWrapper< Vehicle > Iterate(size_t from=0)
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
int Width() const
Get width of Rect.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
int Height() const
Get height of Rect.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
Properties of config file settings.
bool IsEditable(bool do_command=false) const
Check whether the setting is editable in the current gamemode.
Definition settings.cpp:920
SettingFlags flags
Handles how a setting would show up in the GUI (text/currency, etc.).
const struct IntSettingDesc * AsIntSetting() const
Get the setting description of this setting as an integer setting.
Definition settings.cpp:947
High level window description.
Definition window_gui.h:172
ResizeInfo resize
Resize information.
Definition window_gui.h:314
void SetTimeout()
Set the timeout flag of the window and initiate the timer.
Definition window_gui.h:355
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition window.cpp:1838
int GetRowFromWidget(int clickpos, WidgetID widget, int padding, int line_height=-1) const
Compute the row of a widget that a user clicked in.
Definition window.cpp:215
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:989
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1828
WindowFlags flags
Window flags.
Definition window_gui.h:300
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:311
Stuff related to the text buffer GUI.
@ AcceptUnchanged
return success even when the text didn't change
Definition textbuf_gui.h:19
@ EnableDefault
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:20
Map writing/reading functions for tiles.
static uint TileHeight(Tile tile)
Returns the height of a tile.
Definition tile_map.h:29
static constexpr uint MIN_MAP_HEIGHT_LIMIT
Lower bound of maximum allowed heightlevel (in the construction settings).
Definition tile_type.h:29
static constexpr uint MAX_MAP_HEIGHT_LIMIT
Upper bound of maximum allowed heightlevel (in the construction settings).
Definition tile_type.h:30
Definition of Interval and OneShot timers.
Definition of the game-calendar-timer.
Definition of the game-economy-timer.
Base class for all vehicles.
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX).
Definition widget_type.h:57
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX).
Definition widget_type.h:55
@ WWT_CAPTION
Window caption (window title between closebox and stickybox).
Definition widget_type.h:52
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
@ WWT_CLOSEBOX
Close box (at top-left of a window).
Definition widget_type.h:60
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:37
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
Definition window.cpp:1201
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting).
Definition window.cpp:3193
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition window.cpp:3333
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
TooltipCloseCondition
Definition window_gui.h:263
@ Timeout
Window timeout counter.
Definition window_gui.h:224
@ Automatic
Find a place automatically.
Definition window_gui.h:146
int WidgetID
Widget ID.
Definition window_type.h:21