OpenTTD Source 20250218-master-g53dd1258a7
intro_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 "error.h"
12#include "gui.h"
13#include "window_gui.h"
14#include "window_func.h"
15#include "textbuf_gui.h"
16#include "help_gui.h"
17#include "network/network.h"
18#include "genworld.h"
19#include "network/network_gui.h"
22#include "landscape_type.h"
23#include "landscape.h"
24#include "strings_func.h"
25#include "fios.h"
26#include "ai/ai_gui.hpp"
27#include "game/game_gui.hpp"
28#include "gfx_func.h"
30#include "language.h"
31#include "rev.h"
32#include "highscore.h"
33#include "signs_base.h"
34#include "viewport_func.h"
35#include "vehicle_base.h"
36#include <regex>
37
39
40#include "table/strings.h"
41#include "table/sprites.h"
42
43#include "safeguards.h"
44
45
51 enum AlignmentH : uint8_t {
52 LEFT,
53 CENTRE,
54 RIGHT,
55 };
57 enum AlignmentV : uint8_t {
58 TOP,
59 MIDDLE,
60 BOTTOM,
61 };
62
63 int command_index = 0;
64 Point position{ 0, 0 };
65 VehicleID vehicle = VehicleID::Invalid();
66 uint delay = 0;
67 int zoom_adjust = 0;
68 bool pan_to_next = false;
71
79 {
80 if (this->vehicle != VehicleID::Invalid()) {
81 const Vehicle *v = Vehicle::Get(this->vehicle);
82 this->position = RemapCoords(v->x_pos, v->y_pos, v->z_pos);
83 }
84
85 Point p;
86 switch (this->align_h) {
87 case LEFT: p.x = this->position.x; break;
88 case CENTRE: p.x = this->position.x - vp->virtual_width / 2; break;
89 case RIGHT: p.x = this->position.x - vp->virtual_width; break;
90 }
91 switch (this->align_v) {
92 case TOP: p.y = this->position.y; break;
93 case MIDDLE: p.y = this->position.y - vp->virtual_height / 2; break;
94 case BOTTOM: p.y = this->position.y - vp->virtual_height; break;
95 }
96 return p;
97 }
98};
99
100
101struct SelectGameWindow : public Window {
103 std::vector<IntroGameViewportCommand> intro_viewport_commands;
108 uint mouse_idle_time;
109 Point mouse_idle_pos;
110
116 {
118
119 /* Regular expression matching the commands: T, spaces, integer, spaces, flags, spaces, integer */
120 const char *sign_langauge = "^T\\s*([0-9]+)\\s*([-+A-Z0-9]+)\\s*([0-9]+)";
121 std::regex re(sign_langauge, std::regex_constants::icase);
122
123 /* List of signs successfully parsed to delete afterwards. */
124 std::vector<SignID> signs_to_delete;
125
126 for (const Sign *sign : Sign::Iterate()) {
127 std::smatch match;
128 if (std::regex_search(sign->name, match, re)) {
130 /* Sequence index from the first matching group. */
131 vc.command_index = std::stoi(match[1].str());
132 /* Sign coordinates for positioning. */
133 vc.position = RemapCoords(sign->x, sign->y, sign->z);
134 /* Delay from the third matching group. */
135 vc.delay = std::stoi(match[3].str()) * 1000; // milliseconds
136
137 /* Parse flags from second matching group. */
138 enum IdType : uint8_t {
140 } id_type = ID_NONE;
141 for (char c : match[2].str()) {
142 if (isdigit(c)) {
143 if (id_type == ID_VEHICLE) {
144 vc.vehicle = static_cast<VehicleID>(vc.vehicle.base() * 10 + (c - '0'));
145 }
146 } else {
148 switch (toupper(c)) {
149 case '-': vc.zoom_adjust = +1; break;
150 case '+': vc.zoom_adjust = -1; break;
151 case 'T': vc.align_v = IntroGameViewportCommand::TOP; break;
152 case 'M': vc.align_v = IntroGameViewportCommand::MIDDLE; break;
153 case 'B': vc.align_v = IntroGameViewportCommand::BOTTOM; break;
154 case 'L': vc.align_h = IntroGameViewportCommand::LEFT; break;
155 case 'C': vc.align_h = IntroGameViewportCommand::CENTRE; break;
156 case 'R': vc.align_h = IntroGameViewportCommand::RIGHT; break;
157 case 'P': vc.pan_to_next = true; break;
158 case 'V': id_type = ID_VEHICLE; vc.vehicle = VehicleID::Begin(); break;
159 }
160 }
161 }
162
163 /* Successfully parsed, store. */
164 intro_viewport_commands.push_back(vc);
165 signs_to_delete.push_back(sign->index);
166 }
167 }
168
169 /* Sort the commands by sequence index. */
170 std::sort(intro_viewport_commands.begin(), intro_viewport_commands.end(), [](const IntroGameViewportCommand &a, const IntroGameViewportCommand &b) { return a.command_index < b.command_index; });
171
172 /* Delete all the consumed signs, from last ID to first ID. */
173 std::sort(signs_to_delete.begin(), signs_to_delete.end(), [](SignID a, SignID b) { return a > b; });
175 delete Sign::Get(sign_id);
176 }
177 }
178
179 SelectGameWindow(WindowDesc &desc) : Window(desc)
180 {
181 this->CreateNestedTree();
182 this->FinishInitNested(0);
183 this->OnInvalidateData();
184
186
187 this->cur_viewport_command_index = SIZE_MAX;
188 this->cur_viewport_command_time = 0;
189 this->mouse_idle_time = 0;
190 this->mouse_idle_pos = _cursor.pos;
191 }
192
193 void OnRealtimeTick(uint delta_ms) override
194 {
195 /* Move the main game viewport according to intro viewport commands. */
196
197 if (intro_viewport_commands.empty()) return;
198
199 bool suppress_panning = true;
200 if (this->mouse_idle_pos.x != _cursor.pos.x || this->mouse_idle_pos.y != _cursor.pos.y) {
201 this->mouse_idle_pos = _cursor.pos;
202 this->mouse_idle_time = 2000;
203 } else if (this->mouse_idle_time > delta_ms) {
204 this->mouse_idle_time -= delta_ms;
205 } else {
206 this->mouse_idle_time = 0;
207 suppress_panning = false;
208 }
209
210 /* Determine whether to move to the next command or stay at current. */
211 bool changed_command = false;
212 if (this->cur_viewport_command_index >= intro_viewport_commands.size()) {
213 /* Reached last, rotate back to start of the list. */
214 this->cur_viewport_command_index = 0;
215 changed_command = true;
216 } else {
217 /* Check if current command has elapsed and switch to next. */
218 this->cur_viewport_command_time += delta_ms;
219 if (this->cur_viewport_command_time >= intro_viewport_commands[this->cur_viewport_command_index].delay) {
220 this->cur_viewport_command_index = (this->cur_viewport_command_index + 1) % intro_viewport_commands.size();
221 this->cur_viewport_command_time = 0;
222 changed_command = true;
223 }
224 }
225
228 Viewport *vp = mw->viewport;
229
230 /* Early exit if the current command hasn't elapsed and isn't animated. */
231 if (!changed_command && !vc.pan_to_next && vc.vehicle == VehicleID::Invalid()) return;
232
233 /* Suppress panning commands, while user interacts with GUIs. */
234 if (!changed_command && suppress_panning) return;
235
236 /* Reset the zoom level. */
237 if (changed_command) FixTitleGameZoom(vc.zoom_adjust);
238
239 /* Calculate current command position (updates followed vehicle coordinates). */
240 Point pos = vc.PositionForViewport(vp);
241
242 /* Calculate panning (linear interpolation between current and next command position). */
243 if (vc.pan_to_next) {
244 size_t next_command_index = (this->cur_viewport_command_index + 1) % intro_viewport_commands.size();
246 Point pos2 = nvc.PositionForViewport(vp);
247 const double t = this->cur_viewport_command_time / (double)vc.delay;
248 pos.x = pos.x + (int)(t * (pos2.x - pos.x));
249 pos.y = pos.y + (int)(t * (pos2.y - pos.y));
250 }
251
252 /* Update the viewport position. */
253 mw->viewport->dest_scrollpos_x = mw->viewport->scrollpos_x = pos.x;
254 mw->viewport->dest_scrollpos_y = mw->viewport->scrollpos_y = pos.y;
256 mw->SetDirty(); // Required during panning, otherwise logo graphics disappears
257
258 /* If there is only one command, we just executed it and don't need to do any more */
259 if (intro_viewport_commands.size() == 1 && vc.vehicle == VehicleID::Invalid()) intro_viewport_commands.clear();
260 }
261
275
276 void OnInit() override
277 {
278 bool missing_sprites = _missing_extra_graphics > 0 && !IsReleasedVersion();
279 this->GetWidget<NWidgetStacked>(WID_SGI_BASESET_SELECTION)->SetDisplayedPlane(missing_sprites ? 0 : SZSP_NONE);
280
282 this->GetWidget<NWidgetStacked>(WID_SGI_TRANSLATION_SELECTION)->SetDisplayedPlane(missing_lang ? 0 : SZSP_NONE);
283 }
284
285 void DrawWidget(const Rect &r, WidgetID widget) const override
286 {
287 switch (widget) {
288 case WID_SGI_BASESET:
290 DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_INTRO_BASESET, TC_FROMSTRING, SA_CENTER);
291 break;
292
295 DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_INTRO_TRANSLATION, TC_FROMSTRING, SA_CENTER);
296 break;
297 }
298 }
299
301 {
302 switch (widget) {
307 break;
308 }
309 }
310
311 void OnResize() override
312 {
313 bool changed = false;
314
316 changed |= wid->UpdateMultilineWidgetSize(GetString(STR_INTRO_BASESET, _missing_extra_graphics), 3);
317 }
318
320 changed |= wid->UpdateMultilineWidgetSize(GetString(STR_INTRO_TRANSLATION, _current_language->missing), 3);
321 }
322
323 if (changed) this->ReInit(0, 0, this->flags.Test(WindowFlag::Centred));
324 }
325
326 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
327 {
328 /* Do not create a network server when you (just) have closed one of the game
329 * creation/load windows for the network server. */
331
332 switch (widget) {
334 if (_ctrl_pressed) {
336 } else {
338 }
339 break;
340
345
347 if (!_network_available) {
349 } else {
350 ShowNetworkGameWindow();
351 }
352 break;
353
357 break;
358
359 case WID_SGI_OPTIONS: ShowGameOptions(); break;
361 case WID_SGI_HELP: ShowHelpWindow(); break;
363 case WID_SGI_GRF_SETTINGS: ShowNewGRFSettings(true, true, false, _grfconfig_newgame); break;
365 if (!_network_available) {
367 } else {
369 }
370 break;
373 case WID_SGI_EXIT: HandleExitGameRequest(); break;
374 }
375 }
376};
377
378static constexpr NWidgetPart _nested_select_game_widgets[] = {
379 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_INTRO_CAPTION),
380 NWidget(WWT_PANEL, COLOUR_BROWN),
382
384 /* 'New Game' and 'Load Game' buttons */
386 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_GENERATE_GAME), SetStringTip(STR_INTRO_NEW_GAME, STR_INTRO_TOOLTIP_NEW_GAME), SetFill(1, 0),
387 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_LOAD_GAME), SetStringTip(STR_INTRO_LOAD_GAME, STR_INTRO_TOOLTIP_LOAD_GAME), SetFill(1, 0),
388 EndContainer(),
389
390 /* 'Play Scenario' and 'Play Heightmap' buttons */
392 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_PLAY_SCENARIO), SetStringTip(STR_INTRO_PLAY_SCENARIO, STR_INTRO_TOOLTIP_PLAY_SCENARIO), SetFill(1, 0),
393 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_PLAY_HEIGHTMAP), SetStringTip(STR_INTRO_PLAY_HEIGHTMAP, STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP), SetFill(1, 0),
394 EndContainer(),
395
396 /* 'Scenario Editor' and 'Multiplayer' buttons */
398 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_EDIT_SCENARIO), SetStringTip(STR_INTRO_SCENARIO_EDITOR, STR_INTRO_TOOLTIP_SCENARIO_EDITOR), SetFill(1, 0),
399 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_PLAY_NETWORK), SetStringTip(STR_INTRO_MULTIPLAYER, STR_INTRO_TOOLTIP_MULTIPLAYER), SetFill(1, 0),
400 EndContainer(),
401 EndContainer(),
402
403 /* Climate selection buttons */
405 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_SGI_TEMPERATE_LANDSCAPE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
406 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_SGI_ARCTIC_LANDSCAPE), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
407 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_SGI_TROPIC_LANDSCAPE), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
408 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_SGI_TOYLAND_LANDSCAPE), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
409 EndContainer(),
410
413 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SGI_BASESET), SetFill(1, 0),
414 EndContainer(),
415 EndContainer(),
416
419 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_SGI_TRANSLATION), SetFill(1, 0),
420 EndContainer(),
421 EndContainer(),
422
424 /* 'Game Options' and 'Settings' buttons */
426 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_OPTIONS), SetStringTip(STR_INTRO_GAME_OPTIONS, STR_INTRO_TOOLTIP_GAME_OPTIONS), SetFill(1, 0),
427 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_SETTINGS_OPTIONS), SetStringTip(STR_INTRO_CONFIG_SETTINGS_TREE, STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE), SetFill(1, 0),
428 EndContainer(),
429
430 /* 'AI Settings' and 'Game Script Settings' buttons */
432 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_AI_SETTINGS), SetStringTip(STR_INTRO_AI_SETTINGS, STR_INTRO_TOOLTIP_AI_SETTINGS), SetFill(1, 0),
433 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_GS_SETTINGS), SetStringTip(STR_INTRO_GAMESCRIPT_SETTINGS, STR_INTRO_TOOLTIP_GAMESCRIPT_SETTINGS), SetFill(1, 0),
434 EndContainer(),
435
436 /* 'Check Online Content' and 'NewGRF Settings' buttons */
438 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_CONTENT_DOWNLOAD), SetStringTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT), SetFill(1, 0),
439 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_GRF_SETTINGS), SetStringTip(STR_INTRO_NEWGRF_SETTINGS, STR_INTRO_TOOLTIP_NEWGRF_SETTINGS), SetFill(1, 0),
440 EndContainer(),
441 EndContainer(),
442
443 /* 'Help and Manuals' and 'Highscore Table' buttons */
445 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_HELP), SetStringTip(STR_INTRO_HELP, STR_INTRO_TOOLTIP_HELP), SetFill(1, 0),
446 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_HIGHSCORE), SetStringTip(STR_INTRO_HIGHSCORE, STR_INTRO_TOOLTIP_HIGHSCORE), SetFill(1, 0),
447 EndContainer(),
448
449 /* 'Exit' button */
451 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_SGI_EXIT), SetMinimalSize(128, 0), SetStringTip(STR_INTRO_QUIT, STR_INTRO_TOOLTIP_QUIT),
452 EndContainer(),
453 EndContainer(),
454 EndContainer(),
455};
456
457static WindowDesc _select_game_desc(
458 WDP_CENTER, nullptr, 0, 0,
461 _nested_select_game_widgets
462);
463
464void ShowSelectGameWindow()
465{
466 new SelectGameWindow(_select_game_desc);
467}
468
469static void AskExitGameCallback(Window *, bool confirmed)
470{
471 if (confirmed) {
473 _exit_game = true;
474 }
475}
476
477void AskExitGame()
478{
479 ShowQuery(
480 GetEncodedString(STR_QUIT_CAPTION),
481 GetEncodedString(STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD),
482 nullptr,
483 AskExitGameCallback,
484 true
485 );
486}
487
488
489static void AskExitToGameMenuCallback(Window *, bool confirmed)
490{
491 if (confirmed) {
494 }
495}
496
497void AskExitToGameMenu()
498{
499 ShowQuery(
500 GetEncodedString(STR_ABANDON_GAME_CAPTION),
501 GetEncodedString((_game_mode != GM_EDITOR) ? STR_ABANDON_GAME_QUERY : STR_ABANDON_SCENARIO_QUERY),
502 nullptr,
503 AskExitToGameMenuCallback,
504 true
505 );
506}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:324
Window for configuring the AIs
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
uint current_x
Current horizontal size (after resizing).
Base class for a resizable nested widget.
@ EXIT
User is exiting the application.
void Transmit(Reason reason, bool blocking=false)
Transmit the survey.
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:28
RectPadding fullbevel
Always-scaled bevel thickness.
Definition window_gui.h:39
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:94
Functions related to errors.
void ClearErrorMessages()
Clear all errors from the queue.
@ 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.
@ SLO_LOAD
File is being loaded.
Definition fileio_type.h:55
@ FT_SCENARIO
old or new scenario
Definition fileio_type.h:19
@ FT_HEIGHTMAP
heightmap file
Definition fileio_type.h:20
@ FT_SAVEGAME
old or new savegame
Definition fileio_type.h:18
Declarations for savegames operations.
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
Definition fios_gui.cpp:992
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:444
Window for configuring the Games
Functions related to world/map generation.
static const uint32_t GENERATE_NEW_SEED
Create a new random seed.
Definition genworld.h:25
void SetNewLandscapeType(LandscapeType landscape)
Changes landscape type and sets genworld window dirty.
void StartScenarioEditor()
Start with a scenario editor.
void StartNewGameWithoutGUI(uint32_t seed)
Start a normal game without the GUI.
void ShowGenerateLandscape()
Start with a normal game.
Geometry functions.
bool _ctrl_pressed
Is Ctrl pressed?
Definition gfx.cpp:38
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
Definition gfx.cpp:774
SwitchMode _switch_mode
The next mainloop command.
Definition gfx.cpp:49
Functions related to the gfx engine.
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:385
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
constexpr NWidgetPart SetSpriteTip(SpriteID sprite, StringID tip={})
Widget part function for setting the sprite and tooltip.
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
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 SetMinimalSize(int16_t x, int16_t y)
Widget part function for setting the minimal size.
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,...
constexpr NWidgetPart SetPIPRatio(uint8_t ratio_pre, uint8_t ratio_inter, uint8_t ratio_post)
Widget part function for setting a pre/inter/post ratio.
GUI functions that shouldn't be here.
void ShowGameSettings()
Open advanced settings window.
void ShowGameOptions()
Open the game options window.
GUI to access manuals and related.
Declaration of functions and types defined in highscore.h and highscore_gui.h.
void ShowHighscoreTable(int difficulty=SP_CUSTOM, int8_t rank=-1)
Show the highscore table for a given difficulty.
Types related to the intro widgets.
@ WID_SGI_PLAY_NETWORK
Play network button.
@ WID_SGI_TRANSLATION
Translation errors.
@ WID_SGI_BASESET
Baseset errors.
@ WID_SGI_GENERATE_GAME
Generate game button.
@ WID_SGI_ARCTIC_LANDSCAPE
Select arctic landscape button.
@ WID_SGI_EDIT_SCENARIO
Edit scenario button.
@ WID_SGI_LOAD_GAME
Load game button.
@ WID_SGI_PLAY_HEIGHTMAP
Play heightmap button.
@ WID_SGI_HIGHSCORE
Highscore button.
@ WID_SGI_EXIT
Exit button.
@ WID_SGI_BASESET_SELECTION
Baseset selection.
@ WID_SGI_CONTENT_DOWNLOAD
Content Download button.
@ WID_SGI_HELP
Help and manuals button.
@ WID_SGI_TOYLAND_LANDSCAPE
Select toyland landscape button.
@ WID_SGI_TEMPERATE_LANDSCAPE
Select temperate landscape button.
@ WID_SGI_GS_SETTINGS
Game Script button.
@ WID_SGI_GRF_SETTINGS
NewGRF button.
@ WID_SGI_TROPIC_LANDSCAPE
Select tropic landscape button.
@ WID_SGI_TRANSLATION_SELECTION
Translation selection.
@ WID_SGI_SETTINGS_OPTIONS
Settings button.
@ WID_SGI_OPTIONS
Options button.
@ WID_SGI_AI_SETTINGS
AI button.
@ WID_SGI_PLAY_SCENARIO
Play scenario button.
Functions related to OTTD's landscape.
Point RemapCoords(int x, int y, int z)
Map 3D world or tile coordinate to equivalent 2D coordinate as used in the viewports and smallmap.
Definition landscape.h:79
Types related to the landscape.
LandscapeType
Landscape types.
Information about languages and their files.
const LanguageMetadata * _current_language
The currently loaded language.
Definition strings.cpp:54
constexpr bool IsInsideMM(const size_t x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
void ShowQuery(EncodedString &&caption, EncodedString &&message, Window *parent, QueryCallbackProc *callback, bool focus)
Show a confirmation window with standard 'yes' and 'no' buttons The window is aligned to the centre o...
bool _is_network_server
Does this client wants to be a network-server?
Definition network.cpp:69
bool _network_available
is network mode available?
Definition network.cpp:67
Basic functions/variables used all over the place.
Part of the network protocol handling content distribution.
void ShowNetworkContentListWindow(ContentVector *cv=nullptr, ContentType type1=CONTENT_TYPE_END, ContentType type2=CONTENT_TYPE_END)
Show the content list window with a given set of content.
GUIs related to networking.
Part of the network protocol handling opt-in survey.
uint _missing_extra_graphics
Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset.
GRFConfigList _grfconfig_newgame
First item in list of default GRF set up.
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfigList &config)
Setup the NewGRF gui.
@ SM_MENU
Switch to game intro menu.
Definition openttd.h:33
declaration of OTTD revision dependent variables
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_newgame
Game settings for new games (updated from the intro screen).
Definition settings.cpp:59
ClientSettings _settings_client
The current settings for this game.
Definition settings.cpp:57
Base class for signs.
This file contains all sprite-related enums and defines.
Definition of base types and functions in a cross-platform compatible way.
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:163
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:103
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition strings.cpp:420
Functions related to OTTD's strings.
GUISettings gui
settings related to the GUI
Point pos
logical mouse position
Definition gfx_type.h:124
Dimensions (a width and height) of a rectangle in 2D.
uint8_t missing_strings_threshold
the number of missing strings before showing the warning
LandscapeType landscape
the landscape we're currently in
GameCreationSettings game_creation
settings used during the creation of a game (map)
A viewport command for the main menu background (intro game).
Definition intro_gui.cpp:49
int zoom_adjust
Adjustment to zoom level from base zoom level.
Definition intro_gui.cpp:67
Point PositionForViewport(const Viewport *vp)
Calculate effective position.
Definition intro_gui.cpp:78
uint delay
Delay until next command.
Definition intro_gui.cpp:66
VehicleID vehicle
Vehicle to follow, or VehicleID::Invalid() if not following a vehicle.
Definition intro_gui.cpp:65
bool pan_to_next
If true, do a smooth pan from this position to the next.
Definition intro_gui.cpp:68
AlignmentH align_h
Horizontal alignment.
Definition intro_gui.cpp:69
AlignmentH
Horizontal alignment value.
Definition intro_gui.cpp:51
AlignmentV
Vertical alignment value.
Definition intro_gui.cpp:57
AlignmentV align_v
Vertical alignment.
Definition intro_gui.cpp:70
int command_index
Sequence number of the command (order they are performed in).
Definition intro_gui.cpp:63
Point position
Calculated world coordinate to position viewport top-left at.
Definition intro_gui.cpp:64
uint16_t missing
number of missing strings.
Definition language.h:40
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 Titem * Get(auto index)
Returns Titem with given index.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Specification of a rectangle with absolute coordinates of all edges.
void ReadIntroGameViewportCommands()
Find and parse all viewport command signs.
std::vector< IntroGameViewportCommand > intro_viewport_commands
Vector of viewport commands parsed.
void OnResize() override
Called after the window got resized.
void OnRealtimeTick(uint delta_ms) override
Called periodically.
size_t cur_viewport_command_index
Index of currently active viewport command.
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 OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
uint cur_viewport_command_time
Time spent (milliseconds) on current viewport command.
void OnInit() override
Notification that the nested widget tree gets initialized.
void DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
Vehicle data structure.
int32_t z_pos
z coordinate.
int32_t y_pos
y coordinate.
int32_t x_pos
x coordinate.
Data structure for viewport, display of a part of the world.
int virtual_width
width << zoom
int virtual_height
height << zoom
High level window description.
Definition window_gui.h:168
Data structure for an opened window.
Definition window_gui.h:272
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Definition window.cpp:949
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
Definition window.cpp:1730
ResizeInfo resize
Resize information.
Definition window_gui.h:313
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
Definition window.cpp:1720
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:440
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:969
WindowFlags flags
Window flags.
Definition window_gui.h:299
Stuff related to the text buffer GUI.
Base class for all vehicles.
void UpdateViewportPosition(Window *w, uint32_t delta_ms)
Update the viewport position being displayed.
Functions related to (drawing on) viewports.
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:44
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:41
@ 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_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:39
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:71
@ SZSP_NONE
Display plane with zero size in both directions (none filling and resizing).
@ EqualSize
Containers should keep all their (resizing) children equally large.
Window * GetMainWindow()
Get the main window, i.e.
Definition window.cpp:1124
Window functions not directly related to making/drawing windows.
Functions, definitions and such used only by the GUI.
@ NoClose
This window can't be interactively closed.
@ Centred
Window is centered and shall stay centered after ReInit.
@ WDP_CENTER
Center the window.
Definition window_gui.h:146
int WidgetID
Widget ID.
Definition window_type.h:20
@ WC_SELECT_GAME
Select game window; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:47