OpenTTD Source 15.3
genworld_gui.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
6 */
7
10#include "stdafx.h"
11#include "heightmap.h"
12#include "debug.h"
13#include "genworld.h"
14#include "network/network.h"
15#include "strings_func.h"
16#include "window_func.h"
18#include "sound_func.h"
19#include "fios.h"
20#include "string_func.h"
21#include "dropdown_type.h"
22#include "dropdown_func.h"
23#include "querystring_gui.h"
24#include "town.h"
26#include "core/random_func.hpp"
27#include "saveload/saveload.h"
28#include "progress.h"
29#include "error.h"
30#include "newgrf_townname.h"
31#include "townname_type.h"
33#include "ai/ai_gui.hpp"
34#include "game/game_gui.hpp"
35#include "industry.h"
37
39
40#include "table/strings.h"
41
43
44#include "safeguards.h"
45
46
47extern void MakeNewgameSettingsLive();
48
55
64
75
77static constexpr std::initializer_list<NWidgetPart> _nested_generate_landscape_widgets = {
79 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
80 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_MAPGEN_WORLD_GENERATION_CAPTION),
82 NWidget(WWT_PANEL, COLOUR_BROWN),
84 /* Landscape selection. */
86 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TEMPERATE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
87 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_ARCTIC), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
88 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TROPICAL), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
89 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TOYLAND), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
91
92 /* Generation options. */
94 /* Left half (land generation options) */
96 /* Labels on the left side (global column 1). */
98 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
99 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_TERRAIN_TYPE, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1),
100 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_VARIETY, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1),
101 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SMOOTHNESS, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1),
102 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
103 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BORDER_TYPE, STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1),
104 EndContainer(),
105
106 /* Widgets on the right side (global column 2). */
108 /* Mapsize X * Y. */
110 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetToolTip(STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
111 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BY), SetFill(0, 1), SetAlignment(SA_CENTER),
112 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetToolTip(STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
113 EndContainer(),
114 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1),
115 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1),
116 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1),
117 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
118 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_BORDERS_PULLDOWN), SetToolTip(STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1),
119 EndContainer(),
120 EndContainer(),
121
122 /* Right half (all other options) */
124 /* Labels on the left side (global column 3). */
127 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
128 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
130 EndContainer(),
131 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
132 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
133 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
134 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
135 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SEA_LEVEL, STR_MAPGEN_SEA_LEVEL_TOOLTIP), SetFill(1, 1),
136 EndContainer(),
137
138 /* Widgets on the right side (global column 4). */
140 /* Climate selector. */
142 /* Snow coverage. */
144 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
145 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetToolTip(STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
146 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_UP), SetSpriteTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
147 EndContainer(),
148 /* Desert coverage. */
150 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
151 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetToolTip(STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
152 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetSpriteTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
153 EndContainer(),
154 /* Temperate/Toyland spacer. */
156 EndContainer(),
157 /* Starting date. */
159 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
160 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetToolTip(STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
161 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
162 EndContainer(),
163 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetToolTip(STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
164 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetToolTip(STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
165 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetToolTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
166 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetToolTip(STR_MAPGEN_SEA_LEVEL_TOOLTIP), SetFill(1, 1),
167 EndContainer(),
168 EndContainer(),
169 EndContainer(),
170
171 /* Map borders buttons for each edge. */
174 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NORTHWEST), SetPadding(0, WidgetDimensions::unscaled.hsep_normal, 0, 0), SetFill(1, 1), SetAlignment(SA_RIGHT | SA_VERT_CENTER),
175 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NW), SetToolTip(STR_MAPGEN_NORTHWEST_TOOLTIP), SetFill(1, 1),
176 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NE), SetToolTip(STR_MAPGEN_NORTHEAST_TOOLTIP), SetFill(1, 1),
177 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NORTHEAST), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1),
178 EndContainer(),
180 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SOUTHWEST), SetPadding(0, WidgetDimensions::unscaled.hsep_normal, 0, 0), SetFill(1, 1), SetAlignment(SA_RIGHT | SA_VERT_CENTER),
181 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SW), SetToolTip(STR_MAPGEN_SOUTHWEST_TOOLTIP), SetFill(1, 1),
182 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SE), SetToolTip(STR_MAPGEN_SOUTHEAST_TOOLTIP), SetFill(1, 1),
183 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SOUTHEAST), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1),
184 EndContainer(),
185 EndContainer(),
186
187 /* AI, GS, and NewGRF settings */
189 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_AI_BUTTON), SetMinimalTextLines(2, 0), SetStringTip(STR_MAPGEN_AI_SETTINGS, STR_MAPGEN_AI_SETTINGS_TOOLTIP), SetFill(1, 0),
190 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_GS_BUTTON), SetMinimalTextLines(2, 0), SetStringTip(STR_MAPGEN_GS_SETTINGS, STR_MAPGEN_GS_SETTINGS_TOOLTIP), SetFill(1, 0),
191 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_NEWGRF_BUTTON), SetMinimalTextLines(2, 0), SetStringTip(STR_MAPGEN_NEWGRF_SETTINGS, STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP), SetFill(1, 0),
192 EndContainer(),
193
194 /* Generate */
195 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetStringTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1),
196 EndContainer(),
197 EndContainer(),
198};
199
201static constexpr std::initializer_list<NWidgetPart> _nested_heightmap_load_widgets = {
202 /* Window header. */
204 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
205 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_MAPGEN_WORLD_GENERATION_CAPTION),
206 EndContainer(),
207 NWidget(WWT_PANEL, COLOUR_BROWN),
209 /* Landscape selection. */
211 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TEMPERATE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
212 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_ARCTIC), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
213 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TROPICAL), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
214 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TOYLAND), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
215 EndContainer(),
216
218 /* Heightmap name label. */
219 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP),
220 NWidget(WWT_TEXT, INVALID_COLOUR, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextStyle(TC_ORANGE), SetToolTip(STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP), SetFill(1, 0),
221 EndContainer(),
222
223 /* Generation options. */
225 /* Left half (land generation options) */
227 /* Labels on the left side (global column 1). */
229 /* Land generation option labels. */
230 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1),
231 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
232 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1),
233 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1),
234 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
235 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BORDER_TYPE, STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1),
236 EndContainer(),
237
238 /* Left half widgets (global column 2) */
240 NWidget(WWT_TEXT, INVALID_COLOUR, WID_GL_HEIGHTMAP_SIZE_TEXT), SetStringTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1),
241 /* Mapsize X * Y. */
243 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetToolTip(STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
244 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BY), SetFill(0, 1), SetAlignment(SA_CENTER),
245 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetToolTip(STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
246 EndContainer(),
247 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_ROTATION_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1),
248 /* Heightmap highest peak. */
250 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
251 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetToolTip(STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1),
252 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_UP), SetSpriteTip(SPR_ARROW_UP, STR_MAPGEN_HEIGHTMAP_HEIGHT_UP_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
253 EndContainer(),
254 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetToolTip(STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
255 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_BORDERS_PULLDOWN), SetToolTip(STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1),
256 EndContainer(),
257 EndContainer(),
258
259 /* Right half (all other options) */
261 /* Right half labels (global column 3) */
264 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
265 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
267 EndContainer(),
268 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
269 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
270 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
271 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
273 EndContainer(),
274
275 /* Right half widgets (global column 4) */
277 /* Climate selector. */
279 /* Snow coverage. */
281 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
282 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetToolTip(STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
283 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_UP), SetSpriteTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
284 EndContainer(),
285 /* Desert coverage. */
287 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
288 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetToolTip(STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
289 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_UP), SetSpriteTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
290 EndContainer(),
291 /* Temperate/Toyland spacer. */
293 EndContainer(),
294 /* Starting date. */
296 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
297 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetToolTip(STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
298 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
299 EndContainer(),
300 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetToolTip(STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
301 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetToolTip(STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
302 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetToolTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
304 EndContainer(),
305 EndContainer(),
306 EndContainer(),
307
308 /* AI, GS, and NewGRF settings */
310 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_AI_BUTTON), SetMinimalTextLines(2, 0), SetStringTip(STR_MAPGEN_AI_SETTINGS, STR_MAPGEN_AI_SETTINGS_TOOLTIP), SetFill(1, 0),
311 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_GS_BUTTON), SetMinimalTextLines(2, 0), SetStringTip(STR_MAPGEN_GS_SETTINGS, STR_MAPGEN_GS_SETTINGS_TOOLTIP), SetFill(1, 0),
312 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_NEWGRF_BUTTON), SetMinimalTextLines(2, 0), SetStringTip(STR_MAPGEN_NEWGRF_SETTINGS, STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP), SetFill(1, 0),
313 EndContainer(),
314
315 /* Generate */
316 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetStringTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1),
317 EndContainer(),
318 EndContainer(),
319};
320
321static void StartGeneratingLandscape(GenerateLandscapeWindowMode mode)
322{
325
326 /* Copy all XXX_newgame to XXX when coming from outside the editor */
327 MakeNewgameSettingsLive();
328 ResetGRFConfig(true);
329
331 switch (mode) {
332 case GLWM_GENERATE: _switch_mode = (_game_mode == GM_EDITOR) ? SM_GENRANDLAND : SM_NEWGAME; break;
333 case GLWM_HEIGHTMAP: _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_HEIGHTMAP : SM_START_HEIGHTMAP; break;
334 case GLWM_SCENARIO: _switch_mode = SM_EDITOR; break;
335 default: NOT_REACHED();
336 }
337}
338
339static void LandscapeGenerationCallback(Window *w, bool confirmed)
340{
341 if (confirmed) StartGeneratingLandscape(w->window_number);
342}
343
344static DropDownList BuildMapsizeDropDown()
345{
346 DropDownList list;
347
348 for (uint i = MIN_MAP_SIZE_BITS; i <= MAX_MAP_SIZE_BITS; i++) {
349 list.push_back(MakeDropDownListStringItem(GetString(STR_JUST_INT, 1ULL << i), i));
350 }
351
352 return list;
353}
354
355static DropDownList BuildTownNameDropDown()
356{
357 DropDownList list;
358
359 /* Add and sort newgrf townnames generators */
360 const auto &grf_names = GetGRFTownNameList();
361 for (uint i = 0; i < grf_names.size(); i++) {
362 list.push_back(MakeDropDownListStringItem(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i));
363 }
364 std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc);
365
366 size_t newgrf_size = list.size();
367 /* Insert newgrf_names at the top of the list */
368 if (newgrf_size > 0) {
369 list.push_back(MakeDropDownListDividerItem()); // separator line
370 newgrf_size++;
371 }
372
373 /* Add and sort original townnames generators */
374 for (uint i = 0; i < BUILTIN_TOWNNAME_GENERATOR_COUNT; i++) {
375 list.push_back(MakeDropDownListStringItem(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i));
376 }
377 std::sort(list.begin() + newgrf_size, list.end(), DropDownListStringItem::NatSortFunc);
378
379 return list;
380}
381
382
383static const StringID _elevations[] = {STR_TERRAIN_TYPE_VERY_FLAT, STR_TERRAIN_TYPE_FLAT, STR_TERRAIN_TYPE_HILLY, STR_TERRAIN_TYPE_MOUNTAINOUS, STR_TERRAIN_TYPE_ALPINIST, STR_TERRAIN_TYPE_CUSTOM};
384static const StringID _sea_lakes[] = {STR_SEA_LEVEL_VERY_LOW, STR_SEA_LEVEL_LOW, STR_SEA_LEVEL_MEDIUM, STR_SEA_LEVEL_HIGH, STR_SEA_LEVEL_CUSTOM};
385static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT};
386static const StringID _borders[] = {STR_MAPGEN_BORDER_RANDOMIZE, STR_MAPGEN_BORDER_MANUAL, STR_MAPGEN_BORDER_INFINITE_WATER};
387static const StringID _smoothness[] = {STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH};
388static const StringID _rotation[] = {STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE};
389static const StringID _num_towns[] = {STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, STR_NUM_CUSTOM};
390static const StringID _num_inds[] = {STR_FUNDING_ONLY, STR_MINIMAL, STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, STR_NUM_CUSTOM};
391static const StringID _variety[] = {STR_VARIETY_NONE, STR_VARIETY_VERY_LOW, STR_VARIETY_LOW, STR_VARIETY_MEDIUM, STR_VARIETY_HIGH, STR_VARIETY_VERY_HIGH};
392
393static_assert(std::size(_num_inds) == ID_END);
394
396 WidgetID widget_id{};
397 uint x = 0;
398 uint y = 0;
399 EncodedString name{};
401
402 GenerateLandscapeWindow(WindowDesc &desc, WindowNumber number = 0) : Window(desc)
403 {
404 this->InitNested(number);
405
407
408 this->mode = this->window_number;
409
410 /* Disable town and industry in SE */
411 this->SetWidgetDisabledState(WID_GL_TOWN_PULLDOWN, _game_mode == GM_EDITOR);
412 this->SetWidgetDisabledState(WID_GL_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
413
414 /* In case the map_height_limit is changed, clamp heightmap_height and custom_terrain_type. */
417
418 /* If original landgenerator is selected and alpinist terrain_type was selected, revert to mountainous. */
421 }
422
423 this->OnInvalidateData();
424 }
425
426
427 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
428 {
429 switch (widget) {
434 case WID_GL_SNOW_COVERAGE_TEXT: return GetString(STR_MAPGEN_SNOW_COVERAGE_TEXT, _settings_newgame.game_creation.snow_coverage);
435 case WID_GL_DESERT_COVERAGE_TEXT: return GetString(STR_MAPGEN_DESERT_COVERAGE_TEXT, _settings_newgame.game_creation.desert_coverage);
436
438 if (_game_mode == GM_EDITOR) {
439 return GetString(STR_CONFIG_SETTING_OFF);
440 }
442 return GetString(STR_NUM_CUSTOM_NUMBER, _settings_newgame.game_creation.custom_town_number);
443 }
445
449 STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + gen :
450 GetGRFTownNameName(gen - BUILTIN_TOWNNAME_GENERATOR_COUNT);
451 return GetString(name);
452 }
453
455 if (_game_mode == GM_EDITOR) {
456 return GetString(STR_CONFIG_SETTING_OFF);
457 }
460 }
462
465 return GetString(STR_TERRAIN_TYPE_CUSTOM_VALUE, _settings_newgame.game_creation.custom_terrain_type);
466 }
468
471 return GetString(STR_SEA_LEVEL_CUSTOM_PERCENTAGE, _settings_newgame.game_creation.custom_sea_level);
472 }
474
475 case WID_GL_HEIGHTMAP_NAME_TEXT: return this->name.GetDecodedString();
480 case WID_GL_WATER_NE: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::NorthEast) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM);
481 case WID_GL_WATER_NW: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::NorthWest) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM);
482 case WID_GL_WATER_SE: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::SouthEast) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM);
483 case WID_GL_WATER_SW: return GetString((_settings_newgame.game_creation.water_borders == BorderFlag::Random) ? STR_MAPGEN_BORDER_RANDOM : _settings_newgame.game_creation.water_borders.Test(BorderFlag::SouthWest) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM);
485
488 return GetString(STR_MAPGEN_HEIGHTMAP_SIZE, this->y, this->x);
489 }
490 return GetString(STR_MAPGEN_HEIGHTMAP_SIZE, this->x, this->y);
491
492 default:
493 return this->Window::GetWidgetString(widget, stringid);
494 }
495 }
496
502 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
503 {
504 if (!gui_scope) return;
505 /* Update the climate buttons */
510
511 /* You can't select smoothness / non-water borders if not terragenesis */
512 if (mode == GLWM_GENERATE) {
518
523
526 }
527
528 /* Disable snowline if not arctic */
530 /* Disable desert if not tropic */
532
533 /* Set snow/rainforest selections */
534 int climate_plane = 0;
536 case LandscapeType::Temperate: climate_plane = 2; break;
537 case LandscapeType::Arctic: climate_plane = 0; break;
538 case LandscapeType::Tropic: climate_plane = 1; break;
539 case LandscapeType::Toyland: climate_plane = 2; break;
540 }
541 this->GetWidget<NWidgetStacked>(WID_GL_CLIMATE_SEL_LABEL)->SetDisplayedPlane(climate_plane);
542 this->GetWidget<NWidgetStacked>(WID_GL_CLIMATE_SEL_SELECTOR)->SetDisplayedPlane(climate_plane);
543
544 /* Update availability of decreasing / increasing start date and snow level */
545 if (mode == GLWM_HEIGHTMAP) {
548 }
555
556 /* Do not allow a custom sea level or terrain type with the original land generator. */
560 }
563 }
564 }
565
566 }
567
568 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
569 {
571 std::span<const StringID> strs;
572 switch (widget) {
577 break;
578
581 break;
582
585 break;
586
590 break;
591
593 d = GetStringBoundingBox(GetString(STR_MAPGEN_SNOW_COVERAGE_TEXT, GetParamMaxValue(MAX_TILE_HEIGHT)));
594 break;
595
597 d = GetStringBoundingBox(GetString(STR_MAPGEN_DESERT_COVERAGE_TEXT, GetParamMaxValue(MAX_TILE_HEIGHT)));
598 break;
599
601 d = GetStringBoundingBox(GetString(STR_MAPGEN_HEIGHTMAP_SIZE, this->x, this->y));
602 break;
603
605 strs = _num_towns;
607 break;
608
610 strs = _num_inds;
612 break;
613
615 strs = _elevations;
616 d = GetStringBoundingBox(GetString(STR_TERRAIN_TYPE_CUSTOM_VALUE, GetParamMaxValue(MAX_MAP_HEIGHT_LIMIT)));
617 break;
618
620 strs = _sea_lakes;
622 break;
623
624 case WID_GL_RIVER_PULLDOWN: strs = _rivers; break;
625 case WID_GL_SMOOTHNESS_PULLDOWN: strs = _smoothness; break;
626 case WID_GL_VARIETY_PULLDOWN: strs = _variety; break;
627 case WID_GL_HEIGHTMAP_ROTATION_PULLDOWN: strs = _rotation; break;
628 case WID_GL_BORDERS_PULLDOWN: strs = _borders; break;
629 case WID_GL_WATER_NE:
630 case WID_GL_WATER_NW:
631 case WID_GL_WATER_SE:
632 case WID_GL_WATER_SW:
633 d = maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_RANDOM), maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_WATER), GetStringBoundingBox(STR_MAPGEN_BORDER_FREEFORM)));
634 break;
635
637 size.width = 0;
638 break;
639
640 default:
641 return;
642 }
643 d = maxdim(d, GetStringListBoundingBox(strs));
644 d.width += padding.width;
645 d.height += padding.height;
646 size = maxdim(size, d);
647 }
648
649 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
650 {
651 switch (widget) {
652 case WID_GL_TEMPERATE:
653 case WID_GL_ARCTIC:
654 case WID_GL_TROPICAL:
655 case WID_GL_TOYLAND:
657 SndClickBeep();
658 break;
659
660 case WID_GL_MAPSIZE_X_PULLDOWN: // Mapsize X
662 break;
663
664 case WID_GL_MAPSIZE_Y_PULLDOWN: // Mapsize Y
666 break;
667
668 case WID_GL_TOWN_PULLDOWN: // Number of towns
670 break;
671
672 case WID_GL_TOWNNAME_DROPDOWN: // Townname generator
674 break;
675
676 case WID_GL_INDUSTRY_PULLDOWN: // Number of industries
678 break;
679
680 case WID_GL_GENERATE_BUTTON: { // Generate
681 /* Get rotated map size. */
682 uint map_x;
683 uint map_y;
685 map_x = this->y;
686 map_y = this->x;
687 } else {
688 map_x = this->x;
689 map_y = this->y;
690 }
691 if (mode == GLWM_HEIGHTMAP &&
692 (map_x * 2 < (1U << _settings_newgame.game_creation.map_x) ||
693 map_x / 2 > (1U << _settings_newgame.game_creation.map_x) ||
694 map_y * 2 < (1U << _settings_newgame.game_creation.map_y) ||
695 map_y / 2 > (1U << _settings_newgame.game_creation.map_y))) {
696 ShowQuery(
697 GetEncodedString(STR_WARNING_HEIGHTMAP_SCALE_CAPTION),
698 GetEncodedString(STR_WARNING_HEIGHTMAP_SCALE_MESSAGE),
699 this,
700 LandscapeGenerationCallback);
701 } else {
702 StartGeneratingLandscape(mode);
703 }
704 break;
705 }
706
708 case WID_GL_HEIGHTMAP_HEIGHT_UP: // Height level buttons
709 /* Don't allow too fast scrolling */
710 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
711 this->HandleButtonClick(widget);
712
714 this->InvalidateData();
715 }
716 _left_button_clicked = false;
717 break;
718
719 case WID_GL_HEIGHTMAP_HEIGHT_TEXT: // Height level text
720 this->widget_id = WID_GL_HEIGHTMAP_HEIGHT_TEXT;
721 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.heightmap_height), STR_MAPGEN_HEIGHTMAP_HEIGHT_QUERY_CAPT, 4, this, CS_NUMERAL, QueryStringFlag::EnableDefault);
722 SndClickBeep();
723 break;
724
725
727 case WID_GL_START_DATE_UP: // Year buttons
728 /* Don't allow too fast scrolling */
729 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
730 this->HandleButtonClick(widget);
731
733 this->InvalidateData();
734 }
735 _left_button_clicked = false;
736 break;
737
738 case WID_GL_START_DATE_TEXT: // Year text
739 this->widget_id = WID_GL_START_DATE_TEXT;
740 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QueryStringFlag::EnableDefault);
741 break;
742
744 case WID_GL_SNOW_COVERAGE_UP: // Snow coverage buttons
745 /* Don't allow too fast scrolling */
746 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
747 this->HandleButtonClick(widget);
748
750 this->InvalidateData();
751 }
752 _left_button_clicked = false;
753 break;
754
755 case WID_GL_SNOW_COVERAGE_TEXT: // Snow coverage text
756 this->widget_id = WID_GL_SNOW_COVERAGE_TEXT;
757 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.snow_coverage), STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT, 4, this, CS_NUMERAL, QueryStringFlag::EnableDefault);
758 SndClickBeep();
759 break;
760
762 case WID_GL_DESERT_COVERAGE_UP: // Desert coverage buttons
763 /* Don't allow too fast scrolling */
764 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
765 this->HandleButtonClick(widget);
766
768 this->InvalidateData();
769 }
770 _left_button_clicked = false;
771 break;
772
773 case WID_GL_DESERT_COVERAGE_TEXT: // Desert line text
774 this->widget_id = WID_GL_DESERT_COVERAGE_TEXT;
775 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.desert_coverage), STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT, 4, this, CS_NUMERAL, QueryStringFlag::EnableDefault);
776 SndClickBeep();
777 break;
778
779 case WID_GL_HEIGHTMAP_ROTATION_PULLDOWN: // Heightmap rotation
781 break;
782
783 case WID_GL_TERRAIN_PULLDOWN: // Terrain type
784 /* For the original map generation only the first four are valid. */
786 break;
787
788 case WID_GL_WATER_PULLDOWN: { // Water quantity
789 uint32_t hidden_mask = 0;
790 /* Disable custom water level when the original map generator is active. */
793 }
795 break;
796 }
797
798 case WID_GL_RIVER_PULLDOWN: // Amount of rivers
800 break;
801
802 case WID_GL_SMOOTHNESS_PULLDOWN: // Map smoothness
804 break;
805
806 case WID_GL_VARIETY_PULLDOWN: // Map variety
808 break;
809
810 /* Map borders */
812 /* WHen loading a heightmap, hide the first option "Random". */
814 break;
815
816 case WID_GL_WATER_NW:
818 SndClickBeep();
819 this->InvalidateData();
820 break;
821
822 case WID_GL_WATER_NE:
824 SndClickBeep();
825 this->InvalidateData();
826 break;
827
828 case WID_GL_WATER_SE:
830 SndClickBeep();
831 this->InvalidateData();
832 break;
833
834 case WID_GL_WATER_SW:
836 SndClickBeep();
837 this->InvalidateData();
838 break;
839
840 case WID_GL_AI_BUTTON:
842 break;
843
844 case WID_GL_GS_BUTTON:
846 break;
847
849 ShowNewGRFSettings(true, true, false, _grfconfig_newgame);
850 break;
851 }
852 }
853
862
863 void OnDropdownSelect(WidgetID widget, int index, int) override
864 {
865 switch (widget) {
871
873
875 if ((uint)index == CUSTOM_TOWN_NUMBER_DIFFICULTY) {
876 this->widget_id = widget;
877 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.custom_town_number), STR_MAPGEN_NUMBER_OF_TOWNS, 5, this, CS_NUMERAL, {});
878 }
880 break;
881
882 case WID_GL_TOWNNAME_DROPDOWN: // Town names
883 if (_game_mode == GM_MENU || Town::GetNumItems() == 0) {
886 }
887 break;
888
890 if ((uint)index == ID_CUSTOM) {
891 this->widget_id = widget;
892 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.custom_industry_number), STR_MAPGEN_NUMBER_OF_INDUSTRIES, 5, this, CS_NUMERAL, {});
893 }
895 break;
896
898 if ((uint)index == CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY) {
899 this->widget_id = widget;
900 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.custom_terrain_type), STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT, 4, this, CS_NUMERAL, {});
901 }
903 break;
904 }
905
907 switch (index) {
908 case BFP_RANDOM:
911 break;
912 case BFP_MANUAL:
915 break;
916 case BFP_INFINITE_WATER:
919 break;
920 }
922 break;
923 }
924
926 if ((uint)index == CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY) {
927 this->widget_id = widget;
928 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.custom_sea_level), STR_MAPGEN_SEA_LEVEL, 3, this, CS_NUMERAL, {});
929 }
931 break;
932 }
933 }
934 this->InvalidateData();
935 }
936
937 void OnQueryTextFinished(std::optional<std::string> str) override
938 {
939 /* Was 'cancel' pressed? */
940 if (!str.has_value()) return;
941
942 int32_t value;
943 if (!str->empty()) {
944 auto val = ParseInteger<int32_t>(*str, 10, true);
945 if (!val.has_value()) return;
946 value = *val;
947 } else {
948 /* An empty string means revert to the default */
949 switch (this->widget_id) {
951 case WID_GL_START_DATE_TEXT: value = CalendarTime::DEF_START_YEAR.base(); break;
952 case WID_GL_SNOW_COVERAGE_TEXT: value = DEF_SNOW_COVERAGE; break;
954 case WID_GL_TOWN_PULLDOWN: value = 1; break;
955 case WID_GL_INDUSTRY_PULLDOWN: value = 1; break;
958 default: NOT_REACHED();
959 }
960 }
961
962 switch (this->widget_id) {
966 break;
967
971 break;
972
976 break;
977
981 break;
982
985 break;
986
989 break;
990
993 break;
994
997 break;
998 }
999
1000 this->InvalidateData();
1001 }
1002};
1003
1004static WindowDesc _generate_landscape_desc(
1005 WDP_CENTER, {}, 0, 0,
1007 {},
1009);
1010
1011static WindowDesc _heightmap_load_desc(
1012 WDP_CENTER, {}, 0, 0,
1014 {},
1016);
1017
1018static void _ShowGenerateLandscape(GenerateLandscapeWindowMode mode)
1019{
1020 uint x = 0;
1021 uint y = 0;
1022
1024
1025 /* Generate a new seed when opening the window */
1026 _settings_newgame.game_creation.generation_seed = InteractiveRandom();
1027
1028 if (mode == GLWM_HEIGHTMAP) {
1029 /* If the function returns negative, it means there was a problem loading the heightmap */
1031 }
1032
1033 WindowDesc &desc = (mode == GLWM_HEIGHTMAP) ? _heightmap_load_desc : _generate_landscape_desc;
1034 GenerateLandscapeWindow *w = AllocateWindowDescFront<GenerateLandscapeWindow, true>(desc, mode);
1035
1036 if (mode == GLWM_HEIGHTMAP) {
1037 w->x = x;
1038 w->y = y;
1039 w->name = _file_to_saveload.title;
1040 }
1041
1043}
1044
1047{
1048 _ShowGenerateLandscape(GLWM_GENERATE);
1049}
1050
1053{
1054 _ShowGenerateLandscape(GLWM_HEIGHTMAP);
1055}
1056
1059{
1060 StartGeneratingLandscape(GLWM_SCENARIO);
1061}
1062
1067void StartNewGameWithoutGUI(uint32_t seed)
1068{
1069 /* GenerateWorld takes care of the possible GENERATE_NEW_SEED value in 'seed' */
1071
1072 StartGeneratingLandscape(GLWM_GENERATE);
1073}
1074
1076{
1077 WidgetID widget_id{};
1078
1080 {
1081 this->InitNested(window_number);
1083 }
1084
1085 std::string GetWidgetString(WidgetID widget, StringID stringid) const override
1086 {
1087 switch (widget) {
1090
1092 return GetString(STR_JUST_INT, 1LL << _settings_newgame.game_creation.map_x);
1093
1095 return GetString(STR_JUST_INT, 1LL << _settings_newgame.game_creation.map_y);
1096
1099
1100 default:
1101 return this->Window::GetWidgetString(widget, stringid);
1102 }
1103 }
1104
1119
1120 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1121 {
1122 std::string str;
1123 switch (widget) {
1128 return;
1129
1132 break;
1133
1136 str = GetString(STR_JUST_INT, GetParamMaxValue(MAX_MAP_SIZE));
1137 break;
1138
1140 str = GetString(STR_JUST_INT, GetParamMaxValue(MAX_TILE_HEIGHT));
1141 break;
1142
1143 default:
1144 return;
1145 }
1147 d.width += padding.width;
1148 d.height += padding.height;
1149 size = maxdim(size, d);
1150 }
1151
1152 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1153 {
1154 switch (widget) {
1155 case WID_CS_TEMPERATE:
1156 case WID_CS_ARCTIC:
1157 case WID_CS_TROPICAL:
1158 case WID_CS_TOYLAND:
1161 break;
1162
1163 case WID_CS_MAPSIZE_X_PULLDOWN: // Mapsize X
1165 break;
1166
1167 case WID_CS_MAPSIZE_Y_PULLDOWN: // Mapsize Y
1169 break;
1170
1171 case WID_CS_EMPTY_WORLD: // Empty world / flat world
1172 StartGeneratingLandscape(GLWM_SCENARIO);
1173 break;
1174
1175 case WID_CS_RANDOM_WORLD: // Generate
1177 break;
1178
1180 case WID_CS_START_DATE_UP: // Year buttons
1181 /* Don't allow too fast scrolling */
1182 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
1183 this->HandleButtonClick(widget);
1184 this->SetDirty();
1185
1187 }
1188 _left_button_clicked = false;
1189 break;
1190
1191 case WID_CS_START_DATE_TEXT: // Year text
1192 this->widget_id = WID_CS_START_DATE_TEXT;
1193 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.starting_year), STR_MAPGEN_START_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, {});
1194 break;
1195
1197 case WID_CS_FLAT_LAND_HEIGHT_UP: // Height level buttons
1198 /* Don't allow too fast scrolling */
1199 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
1200 this->HandleButtonClick(widget);
1201 this->SetDirty();
1202
1204 }
1205 _left_button_clicked = false;
1206 break;
1207
1208 case WID_CS_FLAT_LAND_HEIGHT_TEXT: // Height level text
1209 this->widget_id = WID_CS_FLAT_LAND_HEIGHT_TEXT;
1210 ShowQueryString(GetString(STR_JUST_INT, _settings_newgame.game_creation.se_flat_world_height), STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT, 4, this, CS_NUMERAL, {});
1211 break;
1212 }
1213 }
1214
1219
1220 void OnDropdownSelect(WidgetID widget, int index, int) override
1221 {
1222 switch (widget) {
1225 }
1226 this->SetDirty();
1227 }
1228
1229 void OnQueryTextFinished(std::optional<std::string> str) override
1230 {
1231 if (!str.has_value()) return;
1232
1233 auto value = ParseInteger<int32_t>(*str, 10, true);
1234 if (!value.has_value()) return;
1235
1236 switch (this->widget_id) {
1240 break;
1241
1245 break;
1246 }
1247
1248 this->SetDirty();
1249 }
1250};
1251
1252static constexpr std::initializer_list<NWidgetPart> _nested_create_scenario_widgets = {
1254 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
1255 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_SE_MAPGEN_CAPTION),
1256 EndContainer(),
1257 NWidget(WWT_PANEL, COLOUR_BROWN),
1259 /* Landscape style selection. */
1261 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TEMPERATE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
1262 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_ARCTIC), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
1263 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TROPICAL), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
1264 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TOYLAND), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
1265 EndContainer(),
1266
1268 /* Green generation type buttons: 'Flat land' and 'Random land'. */
1270 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_CS_EMPTY_WORLD), SetStringTip(STR_SE_MAPGEN_FLAT_WORLD, STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP), SetFill(1, 1),
1271 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_CS_RANDOM_WORLD), SetStringTip(STR_SE_MAPGEN_RANDOM_LAND, STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND), SetFill(1, 1),
1272 EndContainer(),
1273
1274 /* Labels + setting drop-downs */
1276 /* Labels. */
1278 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(0, 1),
1279 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(0, 1),
1280 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_SE_MAPGEN_FLAT_WORLD_HEIGHT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP), SetFill(0, 1),
1281 EndContainer(),
1282
1284 /* Map size. */
1286 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_X_PULLDOWN), SetToolTip(STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
1287 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BY), SetFill(0, 1), SetAlignment(SA_CENTER),
1288 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_Y_PULLDOWN), SetToolTip(STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
1289 EndContainer(),
1290
1291 /* Date. */
1293 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_START_DATE_DOWN), SetFill(0, 1), SetSpriteTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_BACKWARD_TOOLTIP), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1294 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_START_DATE_TEXT), SetFill(1, 1), SetToolTip(STR_MAPGEN_DATE_TOOLTIP),
1295 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_START_DATE_UP), SetFill(0, 1), SetSpriteTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_MOVE_THE_STARTING_DATE_FORWARD_TOOLTIP), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1296 EndContainer(),
1297
1298 /* Flat map height. */
1300 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_DOWN), SetFill(0, 1), SetSpriteTip(SPR_ARROW_DOWN, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN_TOOLTIP), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1301 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_TEXT), SetFill(1, 1), SetToolTip(STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP),
1302 NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_UP), SetFill(0, 1), SetSpriteTip(SPR_ARROW_UP, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP_TOOLTIP), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1303 EndContainer(),
1304 EndContainer(),
1305 EndContainer(),
1306 EndContainer(),
1307 EndContainer(),
1308 EndContainer(),
1309};
1310
1311static WindowDesc _create_scenario_desc(
1312 WDP_CENTER, {}, 0, 0,
1314 {},
1315 _nested_create_scenario_widgets
1316);
1317
1320{
1322 new CreateScenarioWindow(_create_scenario_desc, GLWM_SCENARIO);
1323}
1324
1325static constexpr std::initializer_list<NWidgetPart> _nested_generate_progress_widgets = {
1326 NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1327 NWidget(WWT_PANEL, COLOUR_GREY),
1329 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_BAR), SetFill(1, 0),
1330 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_TEXT), SetFill(1, 0),
1331 NWidget(WWT_TEXTBTN, COLOUR_WHITE, WID_GP_ABORT), SetStringTip(STR_GENERATION_ABORT), SetFill(1, 0),
1332 EndContainer(),
1333 EndContainer(),
1334};
1335
1336
1337static WindowDesc _generate_progress_desc(
1338 WDP_CENTER, {}, 0, 0,
1341 _nested_generate_progress_widgets
1342);
1343
1345 static inline uint percent;
1346 static inline StringID cls;
1347 static inline uint current;
1348 static inline uint total;
1349};
1350
1351static const StringID _generation_class_table[] = {
1352 STR_GENERATION_WORLD_GENERATION,
1353 STR_GENERATION_LANDSCAPE_GENERATION,
1354 STR_GENERATION_RIVER_GENERATION,
1355 STR_GENERATION_CLEARING_TILES,
1356 STR_GENERATION_TOWN_GENERATION,
1357 STR_GENERATION_LAND_INDUSTRY_GENERATION,
1358 STR_GENERATION_WATER_INDUSTRY_GENERATION,
1359 STR_GENERATION_OBJECT_GENERATION,
1360 STR_GENERATION_TREE_GENERATION,
1361 STR_GENERATION_SETTINGUP_GAME,
1362 STR_GENERATION_PREPARING_TILELOOP,
1363 STR_GENERATION_PREPARING_SCRIPT,
1364 STR_GENERATION_PREPARING_GAME
1365};
1366static_assert(lengthof(_generation_class_table) == GWP_CLASS_COUNT);
1367
1368
1369static void AbortGeneratingWorldCallback(Window *, bool confirmed)
1370{
1371 if (confirmed) {
1373 } else if (HasModalProgress() && !IsGeneratingWorldAborted()) {
1374 SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE);
1375 }
1376}
1377
1379
1380 GenerateProgressWindow() : Window(_generate_progress_desc)
1381 {
1382 this->InitNested();
1383 }
1384
1385 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1386 {
1387 switch (widget) {
1388 case WID_GP_ABORT:
1389 SetMouseCursorBusy(false);
1390 ShowQuery(
1391 GetEncodedString(STR_GENERATION_ABORT_CAPTION),
1392 GetEncodedString(STR_GENERATION_ABORT_MESSAGE),
1393 this,
1394 AbortGeneratingWorldCallback
1395 );
1396 break;
1397 }
1398 }
1399
1400 void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1401 {
1402 switch (widget) {
1403 case WID_GP_PROGRESS_BAR: {
1404 size = GetStringBoundingBox(GetString(STR_GENERATION_PROGRESS, GetParamMaxValue(100)));
1405 /* We need some spacing for the 'border' */
1408 break;
1409 }
1410
1412 for (uint i = 0; i < GWP_CLASS_COUNT; i++) {
1413 size.width = std::max(size.width, GetStringBoundingBox(_generation_class_table[i]).width + padding.width);
1414 }
1416 break;
1417 }
1418 }
1419
1420 void DrawWidget(const Rect &r, WidgetID widget) const override
1421 {
1422 switch (widget) {
1423 case WID_GP_PROGRESS_BAR: {
1424 /* Draw the % complete with a bar and a text */
1426 Rect br = r.Shrink(WidgetDimensions::scaled.bevel);
1427 DrawFrameRect(br.WithWidth(br.Width() * GenWorldStatus::percent / 100, _current_text_dir == TD_RTL), COLOUR_MAUVE, {});
1428 DrawString(br.CentreToHeight(GetCharacterHeight(FS_NORMAL)), GetString(STR_GENERATION_PROGRESS, GenWorldStatus::percent), TC_FROMSTRING, SA_HOR_CENTER);
1429 break;
1430 }
1431
1433 /* Tell which class we are generating */
1434 DrawString(r.left, r.right, r.top, GenWorldStatus::cls, TC_FROMSTRING, SA_HOR_CENTER);
1435
1436 /* And say where we are in that class */
1437 DrawString(r.left, r.right, r.top + GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal,
1438 GetString(STR_GENERATION_PROGRESS_NUM, GenWorldStatus::current, GenWorldStatus::total), TC_FROMSTRING, SA_HOR_CENTER);
1439 }
1440 }
1441};
1442
1447{
1448 GenWorldStatus::cls = STR_GENERATION_WORLD_GENERATION;
1449 GenWorldStatus::current = 0;
1450 GenWorldStatus::total = 0;
1451 GenWorldStatus::percent = 0;
1452}
1453
1462
1463static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uint total)
1464{
1465 static const int percent_table[] = {0, 5, 14, 17, 20, 40, 55, 60, 65, 80, 85, 95, 99, 100 };
1466 static_assert(lengthof(percent_table) == GWP_CLASS_COUNT + 1);
1467 assert(cls < GWP_CLASS_COUNT);
1468
1469 /* Check if we really are generating the world.
1470 * For example, placing trees via the SE also calls this function, but
1471 * shouldn't try to update the progress.
1472 */
1473 if (!HasModalProgress()) return;
1474
1477 return;
1478 }
1479
1480 if (total == 0) {
1481 assert(GenWorldStatus::cls == _generation_class_table[cls]);
1482 GenWorldStatus::current += progress;
1483 assert(GenWorldStatus::current <= GenWorldStatus::total);
1484 } else {
1485 GenWorldStatus::cls = _generation_class_table[cls];
1486 GenWorldStatus::current = progress;
1487 GenWorldStatus::total = total;
1488 GenWorldStatus::percent = percent_table[cls];
1489 }
1490
1491 /* Percentage is about the number of completed tasks, so 'current - 1' */
1492 GenWorldStatus::percent = percent_table[cls] + (percent_table[cls + 1] - percent_table[cls]) * (GenWorldStatus::current == 0 ? 0 : GenWorldStatus::current - 1) / GenWorldStatus::total;
1493
1494 if (_network_dedicated) {
1495 static uint last_percent = 0;
1496
1497 /* Never display 0% */
1498 if (GenWorldStatus::percent == 0) return;
1499 /* Reset if percent is lower than the last recorded */
1500 if (GenWorldStatus::percent < last_percent) last_percent = 0;
1501 /* Display every 5%, but 6% is also very valid.. just not smaller steps than 5% */
1502 if (GenWorldStatus::percent % 5 != 0 && GenWorldStatus::percent <= last_percent + 5) return;
1503 /* Never show steps smaller than 2%, even if it is a mod 5% */
1504 if (GenWorldStatus::percent <= last_percent + 2) return;
1505
1506 Debug(net, 3, "Map generation percentage complete: {}", GenWorldStatus::percent);
1507 last_percent = GenWorldStatus::percent;
1508
1509 return;
1510 }
1511
1513
1515}
1516
1526{
1527 if (total == 0) return;
1528
1529 _SetGeneratingWorldProgress(cls, 0, total);
1530}
1531
1540{
1541 /* In fact the param 'class' isn't needed.. but for some security reasons, we want it around */
1542 _SetGeneratingWorldProgress(cls, 1, 0);
1543}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:334
Window for configuring the AIs
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr Timpl & Flip(Tvalue_type value)
Flip the value-th bit.
static bool NatSortFunc(std::unique_ptr< const DropDownListItem > const &first, std::unique_ptr< const DropDownListItem > const &second)
Natural sorting comparator function for DropDownList::sort().
Container for an encoded string, created by GetEncodedString.
std::string GetDecodedString() const
Decode the encoded string.
Definition strings.cpp:207
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
The default starting year.
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 VideoDriver * GetInstance()
Get the currently active instance of the video driver.
void GameLoopPause()
Pause the game-loop for a bit, releasing the game-state lock.
RectPadding frametext
Padding inside frame with text.
Definition window_gui.h:41
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition window_gui.h:30
int vsep_normal
Normal vertical spacing.
Definition window_gui.h:58
RectPadding fullbevel
Always-scaled bevel thickness.
Definition window_gui.h:39
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition window_gui.h:93
Functions related to debugging.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
Definition debug.h:37
void ShowDropDownMenu(Window *w, std::span< const StringID > strings, int selected, WidgetID button, uint32_t disabled_mask, uint32_t hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
Definition dropdown.cpp:458
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, DropDownOptions options)
Show a drop down list.
Definition dropdown.cpp:418
Common drop down list components.
Functions related to the drop down widget.
Types related to the drop down widget.
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
constexpr std::underlying_type_t< enum_type > to_underlying(enum_type e)
Implementation of std::to_underlying (from C++23)
Definition enum_type.hpp:17
Functions related to errors.
void ClearErrorMessages()
Clear all errors from the queue.
Declarations for savegames operations.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition fontcache.cpp:87
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:425
Window for configuring the Games
void HandleGeneratingWorldAbortion()
Really handle the abortion, i.e.
Definition genworld.cpp:278
void AbortGeneratingWorld()
Initializes the abortion process.
Definition genworld.cpp:261
bool IsGeneratingWorldAborted()
Is the generation being aborted?
Definition genworld.cpp:270
Functions related to world/map generation.
static const uint MAP_HEIGHT_LIMIT_AUTO_MINIMUM
When map height limit is auto, make this the lowest possible map height limit.
Definition genworld.h:54
@ LG_ORIGINAL
The original landscape generator.
Definition genworld.h:21
static const uint CUSTOM_SEA_LEVEL_MAX_PERCENTAGE
Maximum percentage a user can specify for custom sea level.
Definition genworld.h:50
static const uint CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY
Value for custom sea level in difficulty settings.
Definition genworld.h:48
GenWorldProgress
Current stage of world generation process.
Definition genworld.h:61
static const uint CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
Minimum percentage a user can specify for custom sea level.
Definition genworld.h:49
static const uint CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY
Value for custom terrain type in difficulty settings.
Definition genworld.h:46
static constexpr std::initializer_list< NWidgetPart > _nested_generate_landscape_widgets
Widgets of GenerateLandscapeWindow when generating world.
void IncreaseGeneratingWorldProgress(GenWorldProgress cls)
Increases the current stage of the world generation with one.
void ShowGenerateWorldProgress()
Show the window where a user can follow the process of the map generation.
void ShowGenerateLandscape()
Start with a normal game.
void ShowCreateScenario()
Show the window to create a scenario.
static constexpr std::initializer_list< NWidgetPart > _nested_heightmap_load_widgets
Widgets of GenerateLandscapeWindow when loading heightmap.
static uint GetMapHeightLimit()
Get the map height limit, or if set to "auto", the absolute limit.
void SetNewLandscapeType(LandscapeType landscape)
Changes landscape type and sets genworld window dirty.
void StartScenarioEditor()
Start with a scenario editor.
void SetGeneratingWorldProgress(GenWorldProgress cls, uint total)
Set the total of a stage of the world generation.
void PrepareGenerateWorldProgress()
Initializes the progress counters to the starting point.
GenerateLandscapeWindowMode
Enum for the modes we can generate in.
@ GLWM_GENERATE
Generate new game.
@ GLWM_HEIGHTMAP
Load from heightmap.
@ GLWM_SCENARIO
Generate flat land.
void ShowHeightmapLoad()
Start with loading a heightmap.
void StartNewGameWithoutGUI(uint32_t seed)
Start a normal game without the GUI.
Types related to the genworld widgets.
@ WID_CS_TROPICAL
Select tropical landscape style.
@ WID_CS_TEMPERATE
Select temperate landscape style.
@ WID_CS_MAPSIZE_X_PULLDOWN
Pull-down arrow for x map size.
@ WID_CS_TOYLAND
Select toy-land landscape style.
@ WID_CS_FLAT_LAND_HEIGHT_TEXT
Clickable flat land height value.
@ WID_CS_START_DATE_TEXT
Clickable start date value.
@ WID_CS_START_DATE_DOWN
Decrease start year (start earlier).
@ WID_CS_EMPTY_WORLD
Generate an empty flat world.
@ WID_CS_ARCTIC
Select arctic landscape style.
@ WID_CS_MAPSIZE_Y_PULLDOWN
Pull-down arrow for y map size.
@ WID_CS_FLAT_LAND_HEIGHT_DOWN
Decrease flat land height.
@ WID_CS_FLAT_LAND_HEIGHT_UP
Increase flat land height.
@ WID_CS_RANDOM_WORLD
Generate random land button.
@ WID_CS_START_DATE_UP
Increase start year (start later).
@ WID_GL_TOWNNAME_DROPDOWN
Dropdown 'Townnames'.
@ WID_GL_WATER_SE
SE 'Water'/'Freeform'.
@ WID_GL_WATER_PULLDOWN
Dropdown 'Sea level'.
@ WID_GL_MAPSIZE_X_PULLDOWN
Dropdown 'map X size'.
@ WID_GL_SNOW_COVERAGE_TEXT
Snow coverage.
@ WID_GL_WATER_NE
NE 'Water'/'Freeform'.
@ WID_GL_VARIETY_PULLDOWN
Dropdown 'Variety distribution'.
@ WID_GL_TOYLAND
Button with icon "Toyland".
@ WID_GL_GENERATE_BUTTON
'Generate' button.
@ WID_GL_ARCTIC
Button with icon "Arctic".
@ WID_GL_HEIGHTMAP_HEIGHT_TEXT
Max. heightmap highest mountain.
@ WID_GL_HEIGHTMAP_ROTATION_PULLDOWN
Dropdown 'Heightmap rotation'.
@ WID_GL_MAPSIZE_Y_PULLDOWN
Dropdown 'map Y size'.
@ WID_GL_TROPICAL
Button with icon "Tropical".
@ WID_GL_HEIGHTMAP_NAME_TEXT
Heightmap name.
@ WID_GL_RIVER_PULLDOWN
Dropdown 'Rivers'.
@ WID_GL_DESERT_COVERAGE_TEXT
Desert coverage.
@ WID_GL_AI_BUTTON
'AI Settings' button.
@ WID_GL_SNOW_COVERAGE_DOWN
Decrease snow coverage.
@ WID_GL_HEIGHTMAP_HEIGHT_UP
Increase max. heightmap highest mountain.
@ WID_GL_NEWGRF_BUTTON
'NewGRF Settings' button.
@ WID_GL_CLIMATE_SEL_LABEL
NWID_SELECTION for snow or desert coverage label.
@ WID_GL_HEIGHTMAP_SIZE_TEXT
Size of heightmap.
@ WID_GL_WATER_NW
NW 'Water'/'Freeform'.
@ WID_GL_BORDERS_PULLDOWN
Dropdown 'Map edges'.
@ WID_GL_TEMPERATE
Button with icon "Temperate".
@ WID_GL_SMOOTHNESS_PULLDOWN
Dropdown 'Smoothness'.
@ WID_GL_GS_BUTTON
'Game Script Settings' button.
@ WID_GL_START_DATE_DOWN
Decrease start year.
@ WID_GL_START_DATE_TEXT
Start year.
@ WID_GL_CLIMATE_SEL_SELECTOR
NWID_SELECTION for snow or desert coverage selector.
@ WID_GL_DESERT_COVERAGE_UP
Increase desert coverage.
@ WID_GL_TOWN_PULLDOWN
Dropdown 'No. of towns'.
@ WID_GL_HEIGHTMAP_HEIGHT_DOWN
Decrease heightmap highest mountain.
@ WID_GL_WATER_SW
SW 'Water'/'Freeform'.
@ WID_GL_SNOW_COVERAGE_UP
Increase snow coverage.
@ WID_GL_INDUSTRY_PULLDOWN
Dropdown 'No. of industries'.
@ WID_GL_DESERT_COVERAGE_DOWN
Decrease desert coverage.
@ WID_GL_TERRAIN_PULLDOWN
Dropdown 'Terrain type'.
@ WID_GL_START_DATE_UP
Increase start year.
@ WID_GP_PROGRESS_TEXT
Text with the progress bar.
@ WID_GP_PROGRESS_BAR
Progress bar.
@ WID_GP_ABORT
Abort button.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Geometry functions.
void SetMouseCursor(CursorID sprite, PaletteID pal)
Assign a single non-animated sprite to the cursor.
Definition gfx.cpp:1706
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:897
Dimension GetStringListBoundingBox(std::span< const StringID > list, FontSize fontsize)
Get maximum dimension of a list of strings.
Definition gfx.cpp:935
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:668
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
void SetMouseCursorBusy(bool busy)
Set or unset the ZZZ cursor.
Definition gfx.cpp:1690
SwitchMode _switch_mode
The next mainloop command.
Definition gfx.cpp:49
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:249
@ SA_RIGHT
Right align the text (must be a single bit).
Definition gfx_type.h:390
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:389
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:398
@ SA_VERT_CENTER
Vertically center the text.
Definition gfx_type.h:394
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 SetAspect(float ratio, AspectFlags flags=AspectFlag::ResizeX)
Widget part function for setting the aspect ratio.
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
constexpr NWidgetPart SetToolTip(StringID tip)
Widget part function for setting tooltip and clearing the widget data.
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=INVALID_WIDGET)
Widget part function for starting a new 'real' widget.
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
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.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition window.cpp:968
bool GetHeightmapDimensions(DetailedFileType dft, std::string_view filename, uint *x, uint *y)
Get the dimensions of a heightmap.
Functions related to creating heightmaps from files.
@ HM_CLOCKWISE
Rotate the map clockwise 45 degrees.
Definition heightmap.h:21
Base of all industries.
static constexpr BorderFlags BORDERFLAGS_ALL
Border on all sides.
LandscapeType
Landscape types.
@ NorthWest
Border on North West.
@ Random
Randomise borders.
@ NorthEast
Border on North East.
@ SouthEast
Border on South East.
@ SouthWest
Border on South West.
static const uint MIN_MAP_SIZE_BITS
Minimal and maximal map width and height.
Definition map_type.h:37
static const uint MAX_MAP_SIZE
Maximal map size = 4096.
Definition map_type.h:40
static const uint MAX_MAP_SIZE_BITS
Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS.
Definition map_type.h:38
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition math_func.hpp:79
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...
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.
bool _network_dedicated
are we a dedicated server?
Definition network.cpp:70
Basic functions/variables used all over the place.
void ResetGRFConfig(bool defaults)
Reset the current GRF Config to either blank or newgame settings.
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.
Header of Action 0F "universal holder" structure and functions.
@ SM_START_HEIGHTMAP
Load a heightmap and start a new game from it.
Definition openttd.h:38
@ SM_GENRANDLAND
Generate random land within scenario editor.
Definition openttd.h:36
@ SM_LOAD_HEIGHTMAP
Load heightmap from scenario editor.
Definition openttd.h:39
@ SM_EDITOR
Switch to scenario editor.
Definition openttd.h:31
@ SM_NEWGAME
New Game --> 'Random game'.
Definition openttd.h:28
Functions related to modal progress.
bool HasModalProgress()
Check if we are currently in a modal progress state.
Definition progress.h:17
Base for the GUIs that have an edit box in them.
Pseudo random number generator.
A number of safeguards to prevent using unsafe methods.
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
Definition saveload.cpp:78
Functions/types related to saving and loading games.
GameSettings _settings_newgame
Game settings for new games (updated from the intro screen).
Definition settings.cpp:62
@ ID_CUSTOM
Custom number of industries.
@ ID_END
Number of industry density settings.
BorderFlagPresets
Possible options for the Borders pulldown in the Genworld GUI.
void SndConfirmBeep()
Play a beep sound for a confirm event if enabled in settings.
Definition sound.cpp:261
void SndClickBeep()
Play a beep sound for a click event if enabled in settings.
Definition sound.cpp:253
Functions related to sound.
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:271
Parse strings.
Functions related to low-level strings.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
uint64_t GetParamMaxValue(uint64_t max_value, uint min_count, FontSize size)
Get some number that is suitable for string size computations.
Definition strings.cpp:236
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
Definition strings.cpp:90
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
Definition strings.cpp:424
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
Functions related to OTTD's strings.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
static constexpr uint32_t BUILTIN_TOWNNAME_GENERATOR_COUNT
The number of builtin generators for town names.
@ TD_RTL
Text is written right-to-left by default.
bool freeform_edges
allow terraforming the tiles at the map edges
uint8_t map_height_limit
the maximum allowed heightlevel
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
void OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
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 OnPaint() override
The window must be repainted.
void OnTimeout() override
Called when this window's timeout has been reached.
uint8_t number_towns
the amount of towns
uint8_t terrain_type
the mountainousness of the landscape
uint8_t industry_density
The industry density.
uint8_t quantity_sea_lakes
the amount of seas/lakes
Dimensions (a width and height) of a rectangle in 2D.
FiosType ftype
File type.
Definition saveload.h:429
std::string name
Name of the file.
Definition saveload.h:430
EncodedString title
Internal name of the game.
Definition saveload.h:431
DetailedFileType detailed
Detailed file type.
Definition fileio_type.h:65
BorderFlagPresets water_border_presets
presets for map border options
uint8_t custom_sea_level
manually entered percentage of water in the map
uint8_t amount_of_rivers
the amount of rivers
uint16_t custom_town_number
manually entered number of towns
uint16_t custom_industry_number
manually entered number of industries
uint8_t variety
variety level applied to TGP
uint8_t snow_coverage
the amount of snow coverage on the map
uint8_t desert_coverage
the amount of desert coverage on the map
uint8_t custom_terrain_type
manually entered height for TGP to aim for
LandscapeType landscape
the landscape we're currently in
uint8_t map_x
X size of map.
uint8_t land_generator
the landscape generator
uint8_t tgen_smoothness
how rough is the terrain from 0-3
uint8_t se_flat_world_height
land height a flat world gets in SE
uint8_t town_name
the town name generator used for town names
uint8_t map_y
Y size of map.
TimerGameCalendar::Year starting_year
starting date
uint8_t heightmap_rotation
rotation director for the heightmap
BorderFlags water_borders
bitset of the borders that are water
uint32_t generation_seed
noise seed for world generation
uint8_t heightmap_height
highest mountain for heightmap (towards what it scales)
ConstructionSettings construction
construction of things in-game
DifficultySettings difficulty
settings related to the difficulty
GameCreationSettings game_creation
settings used during the creation of a game (map)
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 OnDropdownSelect(WidgetID widget, int index, int) override
A dropdown option associated to this window has been selected.
void OnTimeout() override
Called when this window's timeout has been reached.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
std::string GetWidgetString(WidgetID widget, StringID stringid) const override
Get the raw string for a widget.
void OnQueryTextFinished(std::optional< std::string > str) override
The query window opened from this window has closed.
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
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 DrawWidget(const Rect &r, WidgetID widget) const override
Draw the contents of a nested widget.
static size_t GetNumItems()
Returns number of valid items in the pool.
static constexpr size_t MAX_SIZE
Make template parameter accessible from outside.
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.
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Templated helper to make a type-safe 'typedef' representing a single POD value.
High level window description.
Definition window_gui.h:168
Number to differentiate different windows of the same class.
Data structure for an opened window.
Definition window_gui.h:274
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:784
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3237
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
Definition window_gui.h:470
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:558
virtual std::string GetWidgetString(WidgetID widget, StringID stringid) const
Get the raw string for a widget.
Definition window.cpp:506
ResizeInfo resize
Resize information.
Definition window_gui.h:315
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:516
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:442
void RaiseWidgetsWhenLowered(Args... widgets)
Raises the widgets and sets widgets dirty that are lowered.
Definition window_gui.h:537
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
Definition window_gui.h:461
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
Definition window.cpp:597
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1823
WindowFlags flags
Window flags.
Definition window_gui.h:301
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:382
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:312
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:303
@ EnableDefault
enable the 'Default' button ("\0" is returned)
static constexpr uint MAX_TILE_HEIGHT
Maximum allowed tile height.
Definition tile_type.h:24
static constexpr uint MIN_CUSTOM_TERRAIN_TYPE
Lowest possible peak value for world generation.
Definition tile_type.h:27
static constexpr uint DEF_DESERT_COVERAGE
Default desert coverage.
Definition tile_type.h:37
static constexpr uint MIN_MAP_HEIGHT_LIMIT
Lower bound of maximum allowed heightlevel (in the construction settings)
Definition tile_type.h:29
static constexpr uint MAX_MAP_HEIGHT_LIMIT
Upper bound of maximum allowed heightlevel (in the construction settings)
Definition tile_type.h:30
static constexpr uint MIN_HEIGHTMAP_HEIGHT
Lowest possible peak value for heightmap creation.
Definition tile_type.h:26
static constexpr uint DEF_SNOW_COVERAGE
Default snow coverage.
Definition tile_type.h:36
Definition of the game-calendar-timer.
Base of the town class.
static const uint CUSTOM_TOWN_MAX_NUMBER
this is the maximum number of towns a user can specify in customisation
Definition town.h:30
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY
value for custom town number in difficulty settings
Definition town.h:29
Definition of structures used for generating town names.
Base of all video drivers.
void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags)
Draw frame rectangle.
Definition widget.cpp:307
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:41
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:42
@ NWID_SPACER
Invisible widget that takes some space.
Definition widget_type.h:70
@ NWID_HORIZONTAL
Horizontal container.
Definition widget_type.h:66
@ WWT_TEXTBTN
(Toggle) Button with text
Definition widget_type.h:44
@ WWT_PANEL
Simple depressed panel.
Definition widget_type.h:39
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition widget_type.h:52
@ NWID_VERTICAL
Vertical container.
Definition widget_type.h:68
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:60
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:37
@ WWT_DROPDOWN
Drop down list.
Definition widget_type.h:61
@ WWT_TEXT
Pure simple text.
Definition widget_type.h:49
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition widget_type.h:71
@ EqualSize
Containers should keep all their (resizing) children equally large.
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition window.cpp:1207
Window * BringWindowToFrontById(WindowClass cls, WindowNumber number)
Find a window and make it the relative top-window on the screen.
Definition window.cpp:1278
void CloseAllNonVitalWindows()
It is possible that a stickied window gets to a position where the 'close' button is outside the gami...
Definition window.cpp:3358
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition window.cpp:3179
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:3314
Window functions not directly related to making/drawing windows.
@ NoClose
This window can't be interactively closed.
@ BorderOnly
Draw border only, no background.
@ Lowered
If set the frame is lowered and the background colour brighter (ie. buttons when pressed)
@ Timeout
Window timeout counter.
@ WDP_CENTER
Center the window.
Definition window_gui.h:145
int WidgetID
Widget ID.
Definition window_type.h:20
@ WN_GAME_OPTIONS_GAME_OPTIONS
Game options.
Definition window_type.h:31
@ WC_SELECT_GAME
Select game window; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:50
@ WC_GENERATE_LANDSCAPE
Generate landscape (newgame); Window numbers:
@ WC_GAME_OPTIONS
Game options window; Window numbers:
@ WC_MODAL_PROGRESS
Progress report of landscape generation; Window numbers: