OpenTTD Source 20250205-master-gfd85ab1e2c
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 <http://www.gnu.org/licenses/>.
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"
33#include "settings_type.h"
34#include "settings_internal.h"
35#include "timer/timer.h"
38
40
41#include "table/sprites.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{
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;
79 }
80 new_value += change_direction;
81 }
82
83 return _local_company;
84}
85
91static int32_t ClickSetProdCheat(int32_t new_value, int32_t)
92{
93 _cheats.setup_prod.value = (new_value != 0);
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);
124
125 /* Now it's safe to actually change the date. */
127 }
128
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(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN, INVALID_STRING_ID, WL_ERROR);
155 /* Return old, unchanged value */
157 }
158 }
159
160 /* Execute the change and reload GRF Data */
163
164 /* The smallmap uses an index from heightlevels to colours. Trigger rebuilding it. */
166
168}
169
184
190typedef int32_t CheckButtonClick(int32_t new_value, int32_t change_direction);
191
200
205static const CheatEntry _cheats_ui[] = {
206 {SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat },
207 {SLE_UINT8, STR_CHEAT_CHANGE_COMPANY, &_local_company, &_cheats.switch_company.been_used, &ClickChangeCompanyCheat },
208 {SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, nullptr },
209 {SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, nullptr },
210 {SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, nullptr },
211 {SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, &ClickSetProdCheat },
212 {SLE_BOOL, STR_CHEAT_STATION_RATING, &_cheats.station_rating.value, &_cheats.station_rating.been_used, nullptr },
214 {SLE_INT32, STR_CHEAT_CHANGE_DATE, &TimerGameCalendar::year, &_cheats.change_date.been_used, &ClickChangeDateCheat },
215};
216
217static_assert(CHT_NUM_CHEATS == lengthof(_cheats_ui));
218
220static constexpr NWidgetPart _nested_cheat_widgets[] = {
222 NWidget(WWT_CLOSEBOX, COLOUR_GREY),
223 NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_CHEATS, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
224 NWidget(WWT_SHADEBOX, COLOUR_GREY),
225 NWidget(WWT_STICKYBOX, COLOUR_GREY),
226 EndContainer(),
227 NWidget(WWT_PANEL, COLOUR_GREY),
229 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_PANEL),
230 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_C_SETTINGS),
231 EndContainer(),
232 EndContainer(),
233};
234
237 int clicked;
238 int clicked_cheat;
239 uint line_height;
241
242 std::vector<const SettingDesc *> sandbox_settings;
243 const SettingDesc *clicked_setting;
244 const SettingDesc *last_clicked_setting;
245 const SettingDesc *valuewindow_entry;
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;
275
276 int text_y_offset = (this->line_height - GetCharacterHeight(FS_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 switch (ce->type) {
284 case SLE_BOOL: {
285 bool on = (*(bool*)ce->variable);
286
289 break;
290 }
291
292 default: {
293 int32_t val = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
294
295 /* Draw [<][>] boxes for settings of an integer-type */
296 DrawArrowButtons(button_left, y + button_y_offset, COLOUR_YELLOW, clicked - (i * 2), true, true);
297
298 switch (ce->str) {
299 /* Display date for change date cheat */
301
302 /* Draw coloured flag for change company cheat */
304 SetDParam(0, val + 1);
307 break;
308 }
309
310 default: SetDParam(0, val);
311 }
312 break;
313 }
314 }
315
317
318 y += this->line_height;
319 }
320 }
321
322 void DrawSettingsWidget(const Rect &r) const
323 {
324 Rect ir = r.WithHeight(this->line_height);
325
326 for (const auto &desc : this->sandbox_settings) {
327 DrawSetting(ir, desc);
328 ir = ir.Translate(0, this->line_height);
329 }
330 }
331
332 void DrawSetting(const Rect r, const SettingDesc *desc) const
333 {
334 const IntSettingDesc *sd = desc->AsIntSetting();
335 int state = this->clicked_setting == sd ? this->clicked : 0;
336
337 bool rtl = _current_text_dir == TD_RTL;
338
341 buttons.top += (r.Height() - SETTING_BUTTON_HEIGHT) / 2;
342 text.top += (r.Height() - GetCharacterHeight(FS_NORMAL)) / 2;
343
344 /* We do not allow changes of some items when we are a client in a network game */
345 bool editable = sd->IsEditable();
346
348 int32_t value = sd->Read(&GetGameSettings());
349 if (sd->IsBoolSetting()) {
350 /* Draw checkbox for boolean-value either on/off */
351 DrawBoolButton(buttons.left, buttons.top, value != 0, editable);
352 } else if (sd->flags.Test(SettingFlag::GuiDropdown)) {
353 /* Draw [v] button for settings of an enum-type */
354 DrawDropDownButton(buttons.left, buttons.top, COLOUR_YELLOW, state != 0, editable);
355 } else {
356 /* Draw [<][>] boxes for settings of an integer-type */
357 DrawArrowButtons(buttons.left, buttons.top, COLOUR_YELLOW, state,
358 editable && value != (sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : sd->min), editable && static_cast<uint32_t>(value) != sd->max);
359 }
360 sd->SetValueDParams(1, value);
361 DrawString(text.left, text.right, text.top, sd->GetTitle(), TC_LIGHT_BLUE);
362 }
363
365 {
366 switch (widget) {
367 case WID_C_PANEL: UpdateCheatPanelSize(size); break;
368 case WID_C_SETTINGS: UpdateSettingsPanelSize(size); break;
369 }
370 }
371
372 void UpdateCheatPanelSize(Dimension &size)
373 {
374 uint width = 0;
375 for (const auto &ce : _cheats_ui) {
376 switch (ce.type) {
377 case SLE_BOOL:
379 width = std::max(width, GetStringBoundingBox(ce.str).width);
381 width = std::max(width, GetStringBoundingBox(ce.str).width);
382 break;
383
384 default:
385 switch (ce.str) {
386 /* Display date for change date cheat */
389 width = std::max(width, GetStringBoundingBox(ce.str).width);
390 break;
391
392 /* Draw coloured flag for change company cheat */
396 break;
397
398 default:
400 width = std::max(width, GetStringBoundingBox(ce.str).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(FS_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
421 sd->SetValueDParams(1, sd->max);
422 width = std::max(width, GetStringBoundingBox(sd->GetTitle()).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
452 /* Click at the date text directly. */
453 clicked_cheat = CHT_CHANGE_DATE;
454 SetDParam(0, value);
456 return;
457 } else if (btn == CHT_EDIT_MAX_HL && x >= SETTING_BUTTON_WIDTH) {
458 clicked_cheat = CHT_EDIT_MAX_HL;
459 SetDParam(0, value);
461 return;
462 }
463
464 /* Not clicking a button? */
465 if (!IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) return;
466
467 this->clicked_setting = nullptr;
468 *ce->been_used = true;
469
470 switch (ce->type) {
471 case SLE_BOOL:
472 value ^= 1;
473 if (ce->proc != nullptr) ce->proc(value, 0);
474 break;
475
476 default:
477 /* Take whatever the function returns */
478 value = ce->proc(value + ((x >= SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= SETTING_BUTTON_WIDTH / 2) ? 1 : -1);
479
480 /* The first cheat (money), doesn't return a different value. */
481 if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0);
482 break;
483 }
484
485 if (value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(value));
486
487 this->SetTimeout();
488
489 this->SetDirty();
490 }
491
492 void SettingsPanelClick(Point pt)
493 {
494 int row = this->GetRowFromWidget(pt.y, WID_C_SETTINGS, WidgetDimensions::scaled.framerect.top, this->line_height);
495 if (row == INT_MAX) return;
496
497 const SettingDesc *desc = this->sandbox_settings[row];
498 const IntSettingDesc *sd = desc->AsIntSetting();
499
500 if (!sd->IsEditable()) return;
501
502 Rect r = this->GetWidget<NWidgetBase>(WID_C_SETTINGS)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
503 int x = pt.x - r.left;
504 bool rtl = _current_text_dir == TD_RTL;
505 if (rtl) x = r.Width() - 1 - x;
506
507 if (x < SETTING_BUTTON_WIDTH) {
508 ChangeSettingValue(sd, x);
509 } else {
510 /* Only open editbox if clicked for the second time, and only for types where it is sensible for. */
511 if (this->last_clicked_setting == sd && !sd->IsBoolSetting() && !sd->flags.Test(SettingFlag::GuiDropdown)) {
512 int64_t value64 = sd->Read(&GetGameSettings());
513
514 /* Show the correct currency-translated value */
515 if (sd->flags.Test(SettingFlag::GuiCurrency)) value64 *= GetCurrency().rate;
516
517 CharSetFilter charset_filter = CS_NUMERAL; //default, only numeric input allowed
518 if (sd->min < 0) charset_filter = CS_NUMERAL_SIGNED; // special case, also allow '-' sign for negative input
519
520 this->valuewindow_entry = sd;
521 SetDParam(0, value64);
522
523 /* Limit string length to 14 so that MAX_INT32 * max currency rate doesn't exceed MAX_INT64. */
525 }
526
527 this->clicked_setting = sd;
528 }
529 }
530
531 void ChangeSettingValue(const IntSettingDesc *sd, int x)
532 {
533 int32_t value = sd->Read(&GetGameSettings());
534 int32_t oldvalue = value;
535 if (sd->IsBoolSetting()) {
536 value ^= 1;
537 } else {
538 /* don't allow too fast scrolling */
539 if (this->flags.Test(WindowFlag::Timeout) && this->timeout_timer > 1) {
540 _left_button_clicked = false;
541 return;
542 }
543
544 /* Add a dynamic step-size to the scroller. In a maximum of
545 * 50-steps you should be able to get from min to max,
546 * unless specified otherwise in the 'interval' variable
547 * of the current setting. */
548 uint32_t step = (sd->interval == 0) ? ((sd->max - sd->min) / 50) : sd->interval;
549 if (step == 0) step = 1;
550
551 /* Increase or decrease the value and clamp it to extremes */
552 if (x >= SETTING_BUTTON_WIDTH / 2) {
553 value += step;
554 if (sd->min < 0) {
555 assert(static_cast<int32_t>(sd->max) >= 0);
556 if (value > static_cast<int32_t>(sd->max)) value = static_cast<int32_t>(sd->max);
557 } else {
558 if (static_cast<uint32_t>(value) > sd->max) value = static_cast<int32_t>(sd->max);
559 }
560 if (value < sd->min) value = sd->min; // skip between "disabled" and minimum
561 } else {
562 value -= step;
563 if (value < sd->min) value = sd->flags.Test(SettingFlag::GuiZeroIsSpecial) ? 0 : sd->min;
564 }
565
566 /* Set up scroller timeout for numeric values */
567 if (value != oldvalue) {
568 this->last_clicked_setting = nullptr;
569 this->clicked_setting = sd;
570 this->clicked = (x >= SETTING_BUTTON_WIDTH / 2) != (_current_text_dir == TD_RTL) ? 2 : 1;
571 this->SetTimeout();
572 _left_button_clicked = false;
573 }
574 }
575
576 if (value != oldvalue) {
577 SetSettingValue(sd, value);
578 this->SetDirty();
579 }
580 }
581
582 bool OnTooltip([[maybe_unused]] Point pt, WidgetID widget, TooltipCloseCondition close_cond) override
583 {
584 if (widget != WID_C_SETTINGS) return false;
585
586 int row = GetRowFromWidget(pt.y, widget, WidgetDimensions::scaled.framerect.top, this->line_height);
587 if (row == INT_MAX) return false;
588
589 const SettingDesc *desc = this->sandbox_settings[row];
590 const IntSettingDesc *sd = desc->AsIntSetting();
591 GuiShowTooltips(this, sd->GetHelp(), close_cond);
592
593 return true;
594 }
595
596 void OnTimeout() override
597 {
598 this->clicked_setting = nullptr;
599 this->clicked = 0;
600 this->SetDirty();
601 }
602
603 void OnQueryTextFinished(std::optional<std::string> str) override
604 {
605 /* Was 'cancel' pressed or nothing entered? */
606 if (!str.has_value() || str->empty()) return;
607
608 if (this->valuewindow_entry != nullptr) {
609 const IntSettingDesc *sd = this->valuewindow_entry->AsIntSetting();
610
611 int32_t value;
612 if (!str->empty()) {
613 long long llvalue = atoll(str->c_str());
614
615 /* Save the correct currency-translated value */
616 if (sd->flags.Test(SettingFlag::GuiCurrency)) llvalue /= GetCurrency().rate;
617
618 value = ClampTo<int32_t>(llvalue);
619 } else {
620 value = sd->GetDefaultValue();
621 }
622
623 SetSettingValue(sd, value);
624 } else {
625 const CheatEntry *ce = &_cheats_ui[clicked_cheat];
626 int oldvalue = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
627 int value = atoi(str->c_str());
628 *ce->been_used = true;
629 value = ce->proc(value, value - oldvalue);
630
631 if (value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(value));
632 }
633
634 this->valuewindow_entry = nullptr;
635 this->SetDirty();
636 }
637
638 IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [this](auto) {
639 this->SetDirty();
640 }};
641};
642
645 WDP_AUTO, "cheats", 0, 0,
647 {},
649);
650
Cheats _cheats
All the cheats.
Definition cheat.cpp:16
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.
void CalendarEnginesMonthlyLoop()
Monthly update of the availability, reliability, and preview offers of the engines.
Definition engine.cpp:1147
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 constexpr NWidgetPart _nested_cheat_widgets[]
Widget definitions of the cheat GUI.
static int32_t ClickChangeCompanyCheat(int32_t new_value, int32_t change_direction)
Handle changing of company.
Definition cheat_gui.cpp:73
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(Tenum value) const
Test if the enum value 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:28
int hsep_wide
Wide horizontal spacing.
Definition window_gui.h:62
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:94
int hsep_indent
Width of identation 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.
Owner
Enum for all companies/owners.
@ MAX_COMPANIES
Maximum number of companies.
Functions to handle different currencies.
const CurrencySpec & GetCurrency()
Get the currently selected currency.
Definition currency.h:118
Functions related to errors.
@ WL_ERROR
Errors (eg. saving/loading failed)
Definition error.h:26
void ShowErrorMessage(StringID 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:77
Geometry functions.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
Definition gfx.cpp:922
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
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:657
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:243
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 NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:937
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, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
Shows a tooltip.
Definition misc_gui.cpp:740
void ShowQueryString(StringID 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:821
int64_t ReadValue(const void *ptr, VarType conv)
Return a signed-long version of the value of a setting.
Definition saveload.cpp:797
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:57
void DrawArrowButtons(int x, int y, Colours button_colour, uint8_t state, bool clickable_left, bool clickable_right)
Draw [<][>] boxes.
void DrawDropDownButton(int x, int y, Colours button_colour, bool state, bool clickable)
Draw a dropdown button.
void DrawBoolButton(int x, int y, bool state, bool clickable)
Draw a toggle 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:277
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
void SetDParamMaxValue(size_t n, uint64_t max_value, uint min_count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
Definition strings.cpp:127
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition strings.cpp:104
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.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
@ 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
uint16_t rate
The conversion rate compared to the base currency.
Definition currency.h:77
Dimensions (a width and height) of a rectangle in 2D.
ConstructionSettings construction
construction of things in-game
Base integer type, including boolean, settings.
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:363
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
static size_t GetPoolSize()
Returns first unused index.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid 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.
Properties of config file settings.
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:930
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:272
ResizeInfo resize
Resize information.
Definition window_gui.h:313
void SetTimeout()
Set the timeout flag of the window and initiate the timer.
Definition window_gui.h:354
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:210
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:970
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1743
WindowFlags flags
Window flags.
Definition window_gui.h:299
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:310
Stuff related to the text buffer GUI.
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:21
@ QSF_ACCEPT_UNCHANGED
return success even when the text didn't change
Definition textbuf_gui.h:20
Map writing/reading functions for tiles.
static debug_inline uint TileHeight(Tile tile)
Returns the height of a tile.
Definition tile_map.h:29
static const uint MIN_MAP_HEIGHT_LIMIT
Lower bound of maximum allowed heightlevel (in the construction settings)
Definition tile_type.h:29
static const 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:41
@ 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:39
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:1137
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition window.cpp:3099
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:3234
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:145
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:66
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:47
@ 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: