OpenTTD Source 20250312-master-gcdcc6b491d
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.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);
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(GetEncodedString(STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN), {}, 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 = 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;
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 std::string str;
284 switch (ce->type) {
285 case SLE_BOOL: {
286 bool on = (*(bool*)ce->variable);
287
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, COLOUR_YELLOW, clicked - (i * 2), true, true);
298
299 switch (ce->str) {
300 /* Display date for change date cheat */
303 break;
304
305 /* Draw coloured flag for change company cheat */
307 str = GetString(ce->str, val + 1);
310 break;
311 }
312
313 default:
314 str = GetString(ce->str, val);
315 break;
316 }
317 break;
318 }
319 }
320
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
346 buttons.top += (r.Height() - SETTING_BUTTON_HEIGHT) / 2;
347 text.top += (r.Height() - GetCharacterHeight(FS_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, 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, COLOUR_YELLOW, state != 0, editable);
360 } else {
361 /* Draw [<][>] boxes for settings of an integer-type */
362 DrawArrowButtons(buttons.left, buttons.top, COLOUR_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), TC_LIGHT_BLUE);
367 }
368
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 SLE_BOOL:
385 break;
386
387 default:
388 switch (ce.str) {
389 /* Display date for change date cheat */
392 break;
393
394 /* Draw coloured flag for change company cheat */
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(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
420 auto [param1, param2] = sd->GetValueParams(sd->GetDefaultValue());
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
451 /* Click at the date text directly. */
452 clicked_cheat = CHT_CHANGE_DATE;
454 return;
455 } else if (btn == CHT_EDIT_MAX_HL && x >= SETTING_BUTTON_WIDTH) {
456 clicked_cheat = CHT_EDIT_MAX_HL;
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 SLE_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. */
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 long long llvalue = atoll(str->c_str());
610
611 /* Save the correct currency-translated value */
612 if (sd->flags.Test(SettingFlag::GuiCurrency)) llvalue /= GetCurrency().rate;
613
614 value = ClampTo<int32_t>(llvalue);
615 } else {
616 value = sd->GetDefaultValue();
617 }
618
619 SetSettingValue(sd, value);
620 } else {
621 const CheatEntry *ce = &_cheats_ui[clicked_cheat];
622 int oldvalue = static_cast<int32_t>(ReadValue(ce->variable, ce->type));
623 int value = atoi(str->c_str());
624 *ce->been_used = true;
625 value = ce->proc(value, value - oldvalue);
626
627 if (value != oldvalue) WriteValue(ce->variable, ce->type, static_cast<int64_t>(value));
628 }
629
630 this->valuewindow_entry = nullptr;
631 this->SetDirty();
632 }
633
634 IntervalTimer<TimerGameCalendar> daily_interval = {{TimerGameCalendar::MONTH, TimerGameCalendar::Priority::NONE}, [this](auto) {
635 this->SetDirty();
636 }};
637};
638
641 WDP_AUTO, "cheats", 0, 0,
643 {},
645);
646
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:1148
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(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:29
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 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:118
Functions related to errors.
@ WL_ERROR
Errors (eg. saving/loading failed)
Definition error.h:26
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, const 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:923
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:852
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:658
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:943
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: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, VarType conv, int64_t val)
Write the value of a setting.
Definition saveload.cpp:822
int64_t ReadValue(const void *ptr, VarType conv)
Return a signed-long version of the value of a setting.
Definition saveload.cpp:798
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:58
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
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:426
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
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.
std::pair< StringParameter, StringParameter > GetValueParams(int32_t value) const
Get parameters for drawing the value of the setting.
Definition settings.cpp:457
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:362
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
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.
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:928
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:210
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:973
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1749
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 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:65
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:40
@ WWT_STICKYBOX
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition widget_type.h:56
@ WWT_SHADEBOX
Shade box (at top-right of a window, between WWT_DEBUGBOX and WWT_DEFSIZEBOX)
Definition widget_type.h:54
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:51
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:67
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:59
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:38
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:1143
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition window.cpp:3106
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:3241
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: