OpenTTD Source 20251213-master-g1091fa6071
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
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.h"
16#include "saveload/saveload.h"
17#include "vehicle_base.h"
18#include "textbuf_gui.h"
19#include "window_gui.h"
20#include "string_func.h"
21#include "strings_func.h"
22#include "window_func.h"
23#include "rail_gui.h"
24#include "settings_gui.h"
25#include "company_gui.h"
27#include "map_func.h"
28#include "tile_map.h"
29#include "newgrf.h"
30#include "error.h"
31#include "misc_cmd.h"
32#include "settings_type.h"
33#include "settings_internal.h"
34#include "timer/timer.h"
38
40
41#include "table/sprites.h"
42#include "table/strings.h"
43
44#include "safeguards.h"
45
46
52static int32_t _money_cheat_amount = 10000000;
53
62static int32_t ClickMoneyCheat(int32_t, int32_t change_direction)
63{
66}
67
74static int32_t ClickChangeCompanyCheat(int32_t new_value, int32_t change_direction)
75{
76 while ((uint)new_value < Company::GetPoolSize()) {
77 if (Company::IsValidID((CompanyID)new_value)) {
78 SetLocalCompany((CompanyID)new_value);
79 return _local_company.base();
80 }
81 new_value += change_direction;
82 }
83
84 return _local_company.base();
85}
86
92static int32_t ClickSetProdCheat(int32_t new_value, int32_t)
93{
94 _cheats.setup_prod.value = (new_value != 0);
97}
98
99extern void CalendarEnginesMonthlyLoop();
100
106static int32_t ClickChangeDateCheat(int32_t new_value, int32_t)
107{
108 /* Don't allow changing to an invalid year, or the current year. */
110 if (new_year == TimerGameCalendar::year) return TimerGameCalendar::year.base();
111
112 TimerGameCalendar::YearMonthDay ymd = TimerGameCalendar::ConvertDateToYMD(TimerGameCalendar::date);
113 TimerGameCalendar::Date new_calendar_date = TimerGameCalendar::ConvertYMDToDate(new_year, ymd.month, ymd.day);
114
116
117 /* If not using wallclock units, we keep economy date in sync with calendar date and must change it also. */
119 /* Keep economy and calendar dates synced. */
120 TimerGameEconomy::Date new_economy_date{new_calendar_date.base()};
121
122 /* Shift cached dates before we change the date. */
123 for (auto v : Vehicle::Iterate()) v->ShiftDates(new_economy_date - TimerGameEconomy::date);
125
126 /* Now it's safe to actually change the date. */
128 }
129
138 return TimerGameCalendar::year.base();
139}
140
147static int32_t ClickChangeMaxHlCheat(int32_t new_value, int32_t)
148{
149 new_value = Clamp(new_value, MIN_MAP_HEIGHT_LIMIT, MAX_MAP_HEIGHT_LIMIT);
150
151 /* Check if at least one mountain on the map is higher than the new value.
152 * If yes, disallow the change. */
153 for (const auto t : Map::Iterate()) {
154 if ((int32_t)TileHeight(t) > new_value) {
155 ShowErrorMessage(GetEncodedString(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN), {}, WL_ERROR);
156 /* Return old, unchanged value */
158 }
159 }
160
161 /* Execute the change and reload GRF Data */
164
165 /* The smallmap uses an index from heightlevels to colours. Trigger rebuilding it. */
167
169}
170
185
191typedef int32_t CheckButtonClick(int32_t new_value, int32_t change_direction);
192
201
206static const CheatEntry _cheats_ui[] = {
207 {SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat },
208 {SLE_UINT8, STR_CHEAT_CHANGE_COMPANY, &_local_company, &_cheats.switch_company.been_used, &ClickChangeCompanyCheat },
209 {SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, nullptr },
210 {SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, nullptr },
211 {SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, nullptr },
212 {SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, &ClickSetProdCheat },
213 {SLE_BOOL, STR_CHEAT_STATION_RATING, &_cheats.station_rating.value, &_cheats.station_rating.been_used, nullptr },
215 {SLE_INT32, STR_CHEAT_CHANGE_DATE, &TimerGameCalendar::year, &_cheats.change_date.been_used, &ClickChangeDateCheat },
216};
217
218static_assert(CHT_NUM_CHEATS == lengthof(_cheats_ui));
219
221static constexpr std::initializer_list<NWidgetPart> _nested_cheat_widgets = {
223 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
224 NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_CHEATS, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
225 NWidget(WWT_SHADEBOX, COLOUR_GREY),
226 NWidget(WWT_STICKYBOX, COLOUR_GREY),
227 EndContainer(),
228 NWidget(WWT_PANEL, COLOUR_GREY),
230 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_PANEL),
231 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_SETTINGS),
232 EndContainer(),
233 EndContainer(),
234};
235
238 int clicked = 0;
239 int clicked_cheat = 0;
240 uint line_height = 0;
242
243 std::vector<const SettingDesc *> sandbox_settings{};
244 const SettingDesc *clicked_setting = nullptr;
245 const SettingDesc *last_clicked_setting = nullptr;
246 const SettingDesc *valuewindow_entry = nullptr;
247
248 CheatWindow(WindowDesc &desc) : Window(desc)
249 {
250 this->sandbox_settings = GetFilteredSettingCollection([](const SettingDesc &sd) { return sd.flags.Test(SettingFlag::Sandbox); });
251 this->InitNested();
252 }
253
254 void OnInit() override
255 {
256 this->icon = GetSpriteSize(SPR_COMPANY_ICON);
257 }
258
259 void DrawWidget(const Rect &r, WidgetID widget) const override
260 {
261 switch (widget) {
262 case WID_C_PANEL: DrawCheatWidget(r); break;
263 case WID_C_SETTINGS: DrawSettingsWidget(r); break;
264 }
265 }
266
267 void DrawCheatWidget(const Rect &r) const
268 {
269 const Rect ir = r;
270 int y = ir.top;
271
272 bool rtl = _current_text_dir == TD_RTL;
273 uint button_left = rtl ? ir.right - SETTING_BUTTON_WIDTH : ir.left;
274 uint text_left = ir.left + (rtl ? 0 : WidgetDimensions::scaled.hsep_wide + SETTING_BUTTON_WIDTH);
275 uint text_right = ir.right - (rtl ? WidgetDimensions::scaled.hsep_wide + SETTING_BUTTON_WIDTH : 0);
276
277 int text_y_offset = (this->line_height - GetCharacterHeight(FS_NORMAL)) / 2;
278 int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
279 int icon_y_offset = (this->line_height - this->icon.height) / 2;
280
281 for (int i = 0; i != lengthof(_cheats_ui); i++) {
282 const CheatEntry *ce = &_cheats_ui[i];
283
284 std::string str;
285 switch (ce->type) {
286 case SLE_BOOL: {
287 bool on = (*(bool*)ce->variable);
288
289 DrawBoolButton(button_left, y + button_y_offset, COLOUR_YELLOW, COLOUR_GREY, on, true);
290 str = GetString(ce->str, on ? STR_CONFIG_SETTING_ON : STR_CONFIG_SETTING_OFF);
291 break;
292 }
293
294 default: {
295 int32_t val = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
296
297 /* Draw [<][>] boxes for settings of an integer-type */
298 DrawArrowButtons(button_left, y + button_y_offset, COLOUR_YELLOW, clicked - (i * 2), true, true);
299
300 switch (ce->str) {
301 /* Display date for change date cheat */
302 case STR_CHEAT_CHANGE_DATE:
304 break;
305
306 /* Draw coloured flag for change company cheat */
307 case STR_CHEAT_CHANGE_COMPANY: {
308 str = GetString(ce->str, val + 1);
310 DrawCompanyIcon(_local_company, rtl ? text_right - offset - WidgetDimensions::scaled.hsep_indent : text_left + offset, y + icon_y_offset);
311 break;
312 }
313
314 default:
315 str = GetString(ce->str, val);
316 break;
317 }
318 break;
319 }
320 }
321
322 DrawString(text_left, text_right, y + text_y_offset, str);
323
324 y += this->line_height;
325 }
326 }
327
328 void DrawSettingsWidget(const Rect &r) const
329 {
330 Rect ir = r.WithHeight(this->line_height);
331
332 for (const auto &desc : this->sandbox_settings) {
333 DrawSetting(ir, desc);
334 ir = ir.Translate(0, this->line_height);
335 }
336 }
337
338 void DrawSetting(const Rect r, const SettingDesc *desc) const
339 {
340 const IntSettingDesc *sd = desc->AsIntSetting();
341 int state = this->clicked_setting == sd ? this->clicked : 0;
342
343 bool rtl = _current_text_dir == TD_RTL;
344
345 Rect buttons = r.WithWidth(SETTING_BUTTON_WIDTH, rtl);
346 Rect text = r.Indent(SETTING_BUTTON_WIDTH + WidgetDimensions::scaled.hsep_wide, rtl);
347 buttons.top += (r.Height() - SETTING_BUTTON_HEIGHT) / 2;
348 text.top += (r.Height() - GetCharacterHeight(FS_NORMAL)) / 2;
349
350 /* We do not allow changes of some items when we are a client in a network game */
351 bool editable = sd->IsEditable();
352
353 auto [min_val, max_val] = sd->GetRange();
354 int32_t value = sd->Read(&GetGameSettings());
355 if (sd->IsBoolSetting()) {
356 /* Draw checkbox for boolean-value either on/off */
357 DrawBoolButton(buttons.left, buttons.top, COLOUR_YELLOW, COLOUR_GREY, value != 0, editable);
358 } else if (sd->flags.Test(SettingFlag::GuiDropdown)) {
359 /* Draw [v] button for settings of an enum-type */
360 DrawDropDownButton(buttons.left, buttons.top, COLOUR_YELLOW, state != 0, editable);
361 } else {
362 /* Draw [<][>] boxes for settings of an integer-type */
363 DrawArrowButtons(buttons.left, buttons.top, COLOUR_YELLOW, state,
364 editable && value != (sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : min_val), editable && static_cast<uint32_t>(value) != max_val);
365 }
366 auto [param1, param2] = sd->GetValueParams(value);
367 DrawString(text.left, text.right, text.top, GetString(sd->GetTitle(), STR_CONFIG_SETTING_VALUE, param1, param2), TC_LIGHT_BLUE);
368 }
369
370 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
371 {
372 switch (widget) {
373 case WID_C_PANEL: UpdateCheatPanelSize(size); break;
374 case WID_C_SETTINGS: UpdateSettingsPanelSize(size); break;
375 }
376 }
377
378 void UpdateCheatPanelSize(Dimension &size)
379 {
380 uint width = 0;
381 for (const auto &ce : _cheats_ui) {
382 switch (ce.type) {
383 case SLE_BOOL:
384 width = std::max(width, GetStringBoundingBox(GetString(ce.str, STR_CONFIG_SETTING_ON)).width);
385 width = std::max(width, GetStringBoundingBox(GetString(ce.str, STR_CONFIG_SETTING_OFF)).width);
386 break;
387
388 default:
389 switch (ce.str) {
390 /* Display date for change date cheat */
391 case STR_CHEAT_CHANGE_DATE:
393 break;
394
395 /* Draw coloured flag for change company cheat */
396 case STR_CHEAT_CHANGE_COMPANY:
397 width = std::max(width, GetStringBoundingBox(GetString(ce.str, MAX_COMPANIES)).width + WidgetDimensions::scaled.hsep_wide);
398 break;
399
400 default:
401 width = std::max(width, GetStringBoundingBox(GetString(ce.str, INT64_MAX)).width);
402 break;
403 }
404 break;
405 }
406 }
407
408 this->line_height = std::max<uint>(this->icon.height, SETTING_BUTTON_HEIGHT);
409 this->line_height = std::max<uint>(this->line_height, GetCharacterHeight(FS_NORMAL)) + WidgetDimensions::scaled.framerect.Vertical();
410
412 size.height = this->line_height * lengthof(_cheats_ui);
413 }
414
415 void UpdateSettingsPanelSize(Dimension &size)
416 {
417 uint width = 0;
418 for (const auto &desc : this->sandbox_settings) {
419 const IntSettingDesc *sd = desc->AsIntSetting();
420
421 auto [param1, param2] = sd->GetValueParams(sd->GetDefaultValue());
422 width = std::max(width, GetStringBoundingBox(GetString(sd->GetTitle(), STR_CONFIG_SETTING_VALUE, param1, param2)).width);
423 }
424
426 size.height = this->line_height * static_cast<uint>(std::size(this->sandbox_settings));
427 }
428
429 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
430 {
431 switch (widget) {
432 case WID_C_PANEL: CheatPanelClick(pt); break;
433 case WID_C_SETTINGS: SettingsPanelClick(pt); break;
434 }
435 }
436
437 void CheatPanelClick(Point pt)
438 {
439 Rect r = this->GetWidget<NWidgetBase>(WID_C_PANEL)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
440 uint btn = (pt.y - r.top) / this->line_height;
441 int x = pt.x - r.left;
442 bool rtl = _current_text_dir == TD_RTL;
443 if (rtl) x = r.Width() - 1 - x;
444
445 if (btn >= lengthof(_cheats_ui)) return;
446
447 const CheatEntry *ce = &_cheats_ui[btn];
448 int value = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
449 int oldvalue = value;
450
451 if (btn == CHT_CHANGE_DATE && x >= SETTING_BUTTON_WIDTH) {
452 /* Click at the date text directly. */
453 clicked_cheat = CHT_CHANGE_DATE;
454 ShowQueryString(GetString(STR_JUST_INT, value), STR_CHEAT_CHANGE_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QueryStringFlag::AcceptUnchanged);
455 return;
456 } else if (btn == CHT_EDIT_MAX_HL && x >= SETTING_BUTTON_WIDTH) {
457 clicked_cheat = CHT_EDIT_MAX_HL;
458 ShowQueryString(GetString(STR_JUST_INT, value), STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT, 8, this, CS_NUMERAL, QueryStringFlag::AcceptUnchanged);
459 return;
460 }
461
462 /* Not clicking a button? */
463 if (!IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) return;
464
465 this->clicked_setting = nullptr;
466 *ce->been_used = true;
467
468 switch (ce->type) {
469 case SLE_BOOL:
470 value ^= 1;
471 if (ce->proc != nullptr) ce->proc(value, 0);
472 break;
473
474 default:
475 /* Take whatever the function returns */
476 value = ce->proc(value + ((x >= SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= SETTING_BUTTON_WIDTH / 2) ? 1 : -1);
477
478 /* The first cheat (money), doesn't return a different value. */
479 if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0);
480 break;
481 }
482
483 if (value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(value));
484
485 this->SetTimeout();
486
487 this->SetDirty();
488 }
489
490 void SettingsPanelClick(Point pt)
491 {
492 int row = this->GetRowFromWidget(pt.y, WID_C_SETTINGS, WidgetDimensions::scaled.framerect.top, this->line_height);
493 if (row == INT_MAX) return;
494
495 const SettingDesc *desc = this->sandbox_settings[row];
496 const IntSettingDesc *sd = desc->AsIntSetting();
497
498 if (!sd->IsEditable()) return;
499
500 Rect r = this->GetWidget<NWidgetBase>(WID_C_SETTINGS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
501 int x = pt.x - r.left;
502 bool rtl = _current_text_dir == TD_RTL;
503 if (rtl) x = r.Width() - 1 - x;
504
505 if (x < SETTING_BUTTON_WIDTH) {
506 ChangeSettingValue(sd, x);
507 } else {
508 /* Only open editbox if clicked for the second time, and only for types where it is sensible for. */
509 if (this->last_clicked_setting == sd && !sd->IsBoolSetting() && !sd->flags.Test(SettingFlag::GuiDropdown)) {
510 int64_t value64 = sd->Read(&GetGameSettings());
511
512 /* Show the correct currency-translated value */
513 if (sd->flags.Test(SettingFlag::GuiCurrency)) value64 *= GetCurrency().rate;
514
515 CharSetFilter charset_filter = CS_NUMERAL; //default, only numeric input allowed
516 if (sd->min < 0) charset_filter = CS_NUMERAL_SIGNED; // special case, also allow '-' sign for negative input
517
518 this->valuewindow_entry = sd;
519
520 /* Limit string length to 14 so that MAX_INT32 * max currency rate doesn't exceed MAX_INT64. */
521 ShowQueryString(GetString(STR_JUST_INT, value64), STR_CONFIG_SETTING_QUERY_CAPTION, 15, this, charset_filter, QueryStringFlag::EnableDefault);
522 }
523
524 this->clicked_setting = sd;
525 }
526 }
527
528 void ChangeSettingValue(const IntSettingDesc *sd, int x)
529 {
530 int32_t value = sd->Read(&GetGameSettings());
531 int32_t oldvalue = value;
532 if (sd->IsBoolSetting()) {
533 value ^= 1;
534 } else {
535 /* don't allow too fast scrolling */
536 if (this->flags.Test(WindowFlag::Timeout) && this->timeout_timer > 1) {
537 _left_button_clicked = false;
538 return;
539 }
540
541 /* Add a dynamic step-size to the scroller. In a maximum of
542 * 50-steps you should be able to get from min to max,
543 * unless specified otherwise in the 'interval' variable
544 * of the current setting. */
545 uint32_t step = (sd->interval == 0) ? ((sd->max - sd->min) / 50) : sd->interval;
546 if (step == 0) step = 1;
547
548 /* Increase or decrease the value and clamp it to extremes */
549 if (x >= SETTING_BUTTON_WIDTH / 2) {
550 value += step;
551 if (sd->min < 0) {
552 assert(static_cast<int32_t>(sd->max) >= 0);
553 if (value > static_cast<int32_t>(sd->max)) value = static_cast<int32_t>(sd->max);
554 } else {
555 if (static_cast<uint32_t>(value) > sd->max) value = static_cast<int32_t>(sd->max);
556 }
557 if (value < sd->min) value = sd->min; // skip between "disabled" and minimum
558 } else {
559 value -= step;
560 if (value < sd->min) value = sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : sd->min;
561 }
562
563 /* Set up scroller timeout for numeric values */
564 if (value != oldvalue) {
565 this->last_clicked_setting = nullptr;
566 this->clicked_setting = sd;
567 this->clicked = (x >= SETTING_BUTTON_WIDTH / 2) != (_current_text_dir == TD_RTL) ? 2 : 1;
568 this->SetTimeout();
569 _left_button_clicked = false;
570 }
571 }
572
573 if (value != oldvalue) {
574 SetSettingValue(sd, value);
575 this->SetDirty();
576 }
577 }
578
579 bool OnTooltip([[maybe_unused]] Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
580 {
581 if (widget != WID_C_SETTINGS) return false;
582
583 int row = GetRowFromWidget(pt.y, widget, WidgetDimensions::scaled.framerect.top, this->line_height);
584 if (row == INT_MAX) return false;
585
586 const SettingDesc *desc = this->sandbox_settings[row];
587 const IntSettingDesc *sd = desc->AsIntSetting();
588 GuiShowTooltips(this, GetEncodedString(sd->GetHelp()), close_cond);
589
590 return true;
591 }
592
593 void OnTimeout() override
594 {
595 this->clicked_setting = nullptr;
596 this->clicked = 0;
597 this->SetDirty();
598 }
599
600 void OnQueryTextFinished(std::optional<std::string> str) override
601 {
602 /* Was 'cancel' pressed or nothing entered? */
603 if (!str.has_value() || str->empty()) return;
604
605 if (this->valuewindow_entry != nullptr) {
606 const IntSettingDesc *sd = this->valuewindow_entry->AsIntSetting();
607
608 int32_t value;
609 if (!str->empty()) {
610 auto llvalue = ParseInteger<int64_t>(*str, 10, true);
611 if (!llvalue.has_value()) return;
612
613 /* Save the correct currency-translated value */
614 if (sd->flags.Test(SettingFlag::GuiCurrency)) llvalue = *llvalue / GetCurrency().rate;
615
616 value = ClampTo<int32_t>(*llvalue);
617 } else {
618 value = sd->GetDefaultValue();
619 }
620
621 SetSettingValue(sd, value);
622 } else {
623 const CheatEntry *ce = &_cheats_ui[clicked_cheat];
624 int oldvalue = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
625 auto value = ParseInteger<int32_t>(*str, 10, true);
626 if (!value.has_value()) return;
627 *ce->been_used = true;
628 value = ce->proc(*value, *value - oldvalue);
629
630 if (*value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(*value));
631 }
632
633 this->valuewindow_entry = nullptr;
634 this->SetDirty();
635 }
636
637 const IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [this](auto) {
638 this->SetDirty();
639 }};
640};
641
644 WDP_AUTO, "cheats", 0, 0,
646 {},
648);
649
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:52
static int32_t ClickChangeMaxHlCheat(int32_t new_value, int32_t)
Allow (or disallow) a change of the maximum allowed heightlevel.
void CalendarEnginesMonthlyLoop()
Monthly update of the availability, reliability, and preview offers of the engines.
Definition engine.cpp:1139
static int32_t ClickMoneyCheat(int32_t, int32_t change_direction)
Handle cheating of money.
Definition cheat_gui.cpp:62
static int32_t ClickSetProdCheat(int32_t new_value, int32_t)
Allow (or disallow) changing production of all industries.
Definition cheat_gui.cpp:92
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:74
static WindowDesc _cheats_desc(WDP_AUTO, "cheats", 0, 0, WC_CHEATS, WC_NONE, {}, _nested_cheat_widgets)
Window description of the cheats GUI.
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.
void ShiftDates(TimerGameEconomy::Date interval)
Shift all dates (join dates and edge annotations) of link graphs and link graph jobs by the number of...
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
The absolute minimum year in OTTD.
static constexpr TimerGame< struct Calendar >::Year MAX_YEAR
MAX_YEAR, nicely rounded value of the number of years that can be encoded in a single 32 bits date,...
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.
RectPadding framerect
Standard padding inside many panels.
Definition window_gui.h:40
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:62
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:93
int hsep_indent
Width of indentation for tree layouts.
Definition window_gui.h:63
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.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
void SetLocalCompany(CompanyID new_company)
Sets the local company and updates the settings that are set on a per-company basis to reflect the co...
Functions related to companies.
GUI Functions related to companies.
Functions to handle different currencies.
const CurrencySpec & GetCurrency()
Get the currently selected currency.
Definition currency.h:119
Functions related to errors.
@ WL_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.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition gfx.cpp:962
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:891
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:662
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
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:966
Declaration of link graph schedule used for cargo distribution.
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
Miscellaneous command definitions.
void GuiShowTooltips(Window *parent, EncodedString &&text, TooltipCloseCondition close_tooltip)
Shows a tooltip.
Definition misc_gui.cpp:693
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, VarType conv, int64_t val)
Write the value of a setting.
Definition saveload.cpp:836
int64_t ReadValue(const void *ptr, VarType conv)
Return a signed-long version of the value of a setting.
Definition saveload.cpp:812
Functions/types related to saving and loading games.
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.
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:271
Parse strings.
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.
VarType type
type of selector
void * variable
pointer to the variable
StringID str
string with descriptive text
CheckButtonClick * proc
procedure
bool * been_used
has this cheat been used before?
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.
bool value
tells if the bool cheat is active or not
Definition cheat_type.h:18
bool been_used
has this cheat been used before?
Definition cheat_type.h:17
Cheat crossing_tunnels
allow tunnels that cross each other
Definition cheat_type.h:30
Cheat no_jetcrash
no jet will crash on small airports anymore
Definition cheat_type.h:31
Cheat change_date
changes date ingame
Definition cheat_type.h:32
Cheat station_rating
Fix station ratings at 100%.
Definition cheat_type.h:35
Cheat money
get rich or poor
Definition cheat_type.h:29
Cheat setup_prod
setup raw-material production in game
Definition cheat_type.h:33
Cheat switch_company
change to another company
Definition cheat_type.h:28
Cheat magic_bulldozer
dynamite industries, objects
Definition cheat_type.h:27
Cheat edit_max_hl
edit the maximum heightlevel; this is a cheat because of the fact that it needs to reset NewGRF game ...
Definition cheat_type.h:34
uint8_t map_height_limit
the maximum allowed heightlevel
T y
Y coordinate.
T x
X coordinate.
uint16_t rate
The conversion rate compared to the base currency.
Definition currency.h:78
Dimensions (a width and height) of a rectangle in 2D.
ConstructionSettings construction
construction of things in-game
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:476
StringID GetTitle() const
Get the title of the setting.
Definition settings.cpp:427
uint32_t max
maximum values
int32_t min
minimum values
int32_t GetDefaultValue() const
Get the default value of the setting.
Definition settings.cpp:467
StringID GetHelp() const
Get the help text of the setting.
Definition settings.cpp:436
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:445
int32_t Read(const void *object) const
Read the integer from the the actual setting.
Definition settings.cpp:567
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:375
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
static size_t GetPoolSize()
Returns first unused index.
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
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:894
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:921
Templated helper to make a type-safe 'typedef' representing a single POD value.
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:274
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void SetTimeout()
Set the timeout flag of the window and initiate the timer.
Definition window_gui.h:356
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:212
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1820
WindowFlags flags
Window flags.
Definition window_gui.h:301
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:312
Stuff related to the text buffer GUI.
@ AcceptUnchanged
return success even when the text didn't change
@ EnableDefault
enable the 'Default' button ("\0" is returned)
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:1193
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition window.cpp:3176
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:3311
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ Timeout
Window timeout counter.
@ WDP_AUTO
Find a place automatically.
Definition window_gui.h:144
int WidgetID
Widget ID.
Definition window_type.h:20
@ WC_BUILD_STATION
Build station; Window numbers:
@ WC_BUILD_OBJECT
Build object; Window numbers:
@ WC_STATUS_BAR
Statusbar (at the bottom of your screen); Window numbers:
Definition window_type.h:69
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50
@ WC_CHEATS
Cheat window; Window numbers:
@ WC_TRUCK_STATION
Build truck station; Window numbers:
@ WC_INDUSTRY_VIEW
Industry view; Window numbers:
@ WC_FINANCES
Finances of a company; Window numbers:
@ WC_BUS_STATION
Build bus station; Window numbers:
@ WC_SMALLMAP
Small map; Window numbers: