OpenTTD Source 20250218-master-g53dd1258a7
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 <http://www.gnu.org/licenses/>.
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"
23#include "dropdown_func.h"
24#include "querystring_gui.h"
25#include "town.h"
27#include "core/random_func.hpp"
28#include "saveload/saveload.h"
29#include "progress.h"
30#include "error.h"
31#include "newgrf_townname.h"
32#include "townname_type.h"
34#include "ai/ai_gui.hpp"
35#include "game/game_gui.hpp"
36#include "industry.h"
37
39
40#include "safeguards.h"
41
42
43extern void MakeNewgameSettingsLive();
44
51
60
71
75 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
76 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_MAPGEN_WORLD_GENERATION_CAPTION),
78 NWidget(WWT_PANEL, COLOUR_BROWN),
80 /* Landscape selection. */
82 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TEMPERATE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
83 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_ARCTIC), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
84 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TROPICAL), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
85 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TOYLAND), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
87
88 /* Generation options. */
90 /* Left half (land generation options) */
92 /* Labels on the left side (global column 1). */
94 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
95 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_TERRAIN_TYPE, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1),
96 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_VARIETY, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1),
97 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SMOOTHNESS, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1),
98 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
99 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BORDER_TYPE, STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1),
100 EndContainer(),
101
102 /* Widgets on the right side (global column 2). */
104 /* Mapsize X * Y. */
106 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetStringTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
107 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BY), SetFill(0, 1), SetAlignment(SA_CENTER),
108 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetStringTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
109 EndContainer(),
110 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetStringTip(STR_JUST_STRING1, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1),
111 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetStringTip(STR_JUST_STRING, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1),
112 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetStringTip(STR_JUST_STRING, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1),
113 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetStringTip(STR_JUST_STRING, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
114 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetStringTip(STR_JUST_STRING, STR_MAPGEN_BORDER_TYPE_TOOLTIP), SetFill(1, 1),
115 EndContainer(),
116 EndContainer(),
117
118 /* Right half (all other options) */
120 /* Labels on the left side (global column 3). */
123 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
124 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
126 EndContainer(),
127 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
128 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
129 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
130 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
131 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SEA_LEVEL, STR_MAPGEN_SEA_LEVEL_TOOLTIP), SetFill(1, 1),
132 EndContainer(),
133
134 /* Widgets on the right side (global column 4). */
136 /* Climate selector. */
138 /* Snow coverage. */
140 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),
141 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetStringTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
142 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),
143 EndContainer(),
144 /* Desert coverage. */
146 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),
147 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetStringTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
148 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),
149 EndContainer(),
150 /* Temperate/Toyland spacer. */
152 EndContainer(),
153 /* Starting date. */
155 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),
156 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetStringTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
157 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),
158 EndContainer(),
159 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetStringTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
160 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetStringTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
161 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetStringTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
162 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetStringTip(STR_JUST_STRING1, STR_MAPGEN_SEA_LEVEL_TOOLTIP), SetFill(1, 1),
163 EndContainer(),
164 EndContainer(),
165 EndContainer(),
166
167 /* Map borders buttons for each edge. */
170 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),
171 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NW), SetStringTip(STR_JUST_STRING, STR_MAPGEN_NORTHWEST), SetFill(1, 1),
172 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NE), SetStringTip(STR_JUST_STRING, STR_MAPGEN_NORTHEAST), SetFill(1, 1),
173 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NORTHEAST), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1),
174 EndContainer(),
176 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),
177 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SW), SetStringTip(STR_JUST_STRING, STR_MAPGEN_SOUTHWEST), SetFill(1, 1),
178 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SE), SetStringTip(STR_JUST_STRING, STR_MAPGEN_SOUTHEAST), SetFill(1, 1),
179 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SOUTHEAST), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1),
180 EndContainer(),
181 EndContainer(),
182
183 /* AI, GS, and NewGRF settings */
185 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),
186 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),
187 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),
188 EndContainer(),
189
190 /* Generate */
191 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetStringTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1),
192 EndContainer(),
193 EndContainer(),
194};
195
198 /* Window header. */
200 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
201 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_MAPGEN_WORLD_GENERATION_CAPTION),
202 EndContainer(),
203 NWidget(WWT_PANEL, COLOUR_BROWN),
205 /* Landscape selection. */
207 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TEMPERATE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
208 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_ARCTIC), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
209 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TROPICAL), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
210 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TOYLAND), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
211 EndContainer(),
212
214 /* Heightmap name label. */
215 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP),
216 NWidget(WWT_TEXT, INVALID_COLOUR, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextStyle(TC_ORANGE), SetStringTip(STR_JUST_RAW_STRING, STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP), SetFill(1, 0),
217 EndContainer(),
218
219 /* Generation options. */
221 /* Left half (land generation options) */
223 /* Labels on the left side (global column 1). */
225 /* Land generation option labels. */
226 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1),
227 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
228 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1),
229 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1),
230 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
231 EndContainer(),
232
233 /* Left half widgets (global column 2) */
235 NWidget(WWT_TEXT, INVALID_COLOUR, WID_GL_HEIGHTMAP_SIZE_TEXT), SetStringTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1),
236 /* Mapsize X * Y. */
238 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_X_PULLDOWN), SetStringTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
239 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BY), SetFill(0, 1), SetAlignment(SA_CENTER),
240 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetStringTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
241 EndContainer(),
242 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_ROTATION_PULLDOWN), SetStringTip(STR_JUST_STRING, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1),
243 /* Heightmap highest peak. */
245 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),
246 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetStringTip(STR_JUST_INT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1),
247 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),
248 EndContainer(),
249 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetStringTip(STR_JUST_STRING, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
250 EndContainer(),
251 EndContainer(),
252
253 /* Right half (all other options) */
255 /* Right half labels (global column 3) */
258 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
259 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
261 EndContainer(),
262 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
263 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
264 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
265 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
266 EndContainer(),
267
268 /* Right half widgets (global column 4) */
270 /* Climate selector. */
272 /* Snow coverage. */
274 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),
275 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetStringTip(STR_MAPGEN_SNOW_COVERAGE_TEXT, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
276 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),
277 EndContainer(),
278 /* Desert coverage. */
280 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),
281 NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetStringTip(STR_MAPGEN_DESERT_COVERAGE_TEXT, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
282 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),
283 EndContainer(),
284 /* Temperate/Toyland spacer. */
286 EndContainer(),
287 /* Starting date. */
289 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),
290 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetStringTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
291 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),
292 EndContainer(),
293 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetStringTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
294 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetStringTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
295 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetStringTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
296 EndContainer(),
297 EndContainer(),
298 EndContainer(),
299
300 /* AI, GS, and NewGRF settings */
302 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),
303 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),
304 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),
305 EndContainer(),
306
307 /* Generate */
308 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_GL_GENERATE_BUTTON), SetMinimalTextLines(3, 0), SetStringTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1),
309 EndContainer(),
310 EndContainer(),
311};
312
313static void StartGeneratingLandscape(GenerateLandscapeWindowMode mode)
314{
317
318 /* Copy all XXX_newgame to XXX when coming from outside the editor */
319 MakeNewgameSettingsLive();
320 ResetGRFConfig(true);
321
323 switch (mode) {
324 case GLWM_GENERATE: _switch_mode = (_game_mode == GM_EDITOR) ? SM_GENRANDLAND : SM_NEWGAME; break;
325 case GLWM_HEIGHTMAP: _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_HEIGHTMAP : SM_START_HEIGHTMAP; break;
326 case GLWM_SCENARIO: _switch_mode = SM_EDITOR; break;
327 default: NOT_REACHED();
328 }
329}
330
331static void LandscapeGenerationCallback(Window *w, bool confirmed)
332{
333 if (confirmed) StartGeneratingLandscape(w->window_number);
334}
335
336static DropDownList BuildMapsizeDropDown()
337{
338 DropDownList list;
339
340 for (uint i = MIN_MAP_SIZE_BITS; i <= MAX_MAP_SIZE_BITS; i++) {
341 SetDParam(0, 1LL << i);
342 list.push_back(MakeDropDownListStringItem(STR_JUST_INT, i));
343 }
344
345 return list;
346}
347
348static DropDownList BuildTownNameDropDown()
349{
350 DropDownList list;
351
352 /* Add and sort newgrf townnames generators */
353 const auto &grf_names = GetGRFTownNameList();
354 for (uint i = 0; i < grf_names.size(); i++) {
355 list.push_back(MakeDropDownListStringItem(grf_names[i], BUILTIN_TOWNNAME_GENERATOR_COUNT + i));
356 }
357 std::sort(list.begin(), list.end(), DropDownListStringItem::NatSortFunc);
358
359 size_t newgrf_size = list.size();
360 /* Insert newgrf_names at the top of the list */
361 if (newgrf_size > 0) {
362 list.push_back(MakeDropDownListDividerItem()); // separator line
363 newgrf_size++;
364 }
365
366 /* Add and sort original townnames generators */
367 for (uint i = 0; i < BUILTIN_TOWNNAME_GENERATOR_COUNT; i++) {
368 list.push_back(MakeDropDownListStringItem(STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + i, i));
369 }
370 std::sort(list.begin() + newgrf_size, list.end(), DropDownListStringItem::NatSortFunc);
371
372 return list;
373}
374
375
376static 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};
377static 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};
378static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT};
379static 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};
380static const StringID _rotation[] = {STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE};
381static const StringID _num_towns[] = {STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, STR_NUM_CUSTOM};
382static 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};
383static const StringID _variety[] = {STR_VARIETY_NONE, STR_VARIETY_VERY_LOW, STR_VARIETY_LOW, STR_VARIETY_MEDIUM, STR_VARIETY_HIGH, STR_VARIETY_VERY_HIGH};
384
385static_assert(std::size(_num_inds) == ID_END);
386
388 WidgetID widget_id;
389 uint x;
390 uint y;
391 std::string name;
393
394 GenerateLandscapeWindow(WindowDesc &desc, WindowNumber number = 0) : Window(desc)
395 {
396 this->InitNested(number);
397
399
400 this->mode = this->window_number;
401
402 /* Disable town and industry in SE */
403 this->SetWidgetDisabledState(WID_GL_TOWN_PULLDOWN, _game_mode == GM_EDITOR);
404 this->SetWidgetDisabledState(WID_GL_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
405
406 /* In case the map_height_limit is changed, clamp heightmap_height and custom_terrain_type. */
409
410 /* If original landgenerator is selected and alpinist terrain_type was selected, revert to mountainous. */
413 }
414
415 this->OnInvalidateData();
416 }
417
418
419 void SetStringParameters(WidgetID widget) const override
420 {
421 switch (widget) {
428
430 if (_game_mode == GM_EDITOR) {
435 } else {
437 }
438 break;
439
444 GetGRFTownNameName(gen - BUILTIN_TOWNNAME_GENERATOR_COUNT);
445 SetDParam(0, name);
446 break;
447 }
448
450 if (_game_mode == GM_EDITOR) {
455 } else {
457 }
458 break;
459
464 } else {
465 SetDParam(0, _elevations[_settings_newgame.difficulty.terrain_type]); break;
466 }
467 break;
468
473 } else {
475 }
476 break;
477
478 case WID_GL_HEIGHTMAP_NAME_TEXT: SetDParamStr(0, this->name); break;
488
491 SetDParam(0, this->y);
492 SetDParam(1, this->x);
493 } else {
494 SetDParam(0, this->x);
495 SetDParam(1, this->y);
496 }
497 break;
498 }
499 }
500
506 void OnInvalidateData([[maybe_unused]] int data = 0, [[maybe_unused]] bool gui_scope = true) override
507 {
508 if (!gui_scope) return;
509 /* Update the climate buttons */
514
515 /* You can't select smoothness / non-water borders if not terragenesis */
516 if (mode == GLWM_GENERATE) {
522
524
529
532 }
533
534 /* Disable snowline if not arctic */
536 /* Disable desert if not tropic */
538
539 /* Set snow/rainforest selections */
540 int climate_plane = 0;
542 case LandscapeType::Temperate: climate_plane = 2; break;
543 case LandscapeType::Arctic: climate_plane = 0; break;
544 case LandscapeType::Tropic: climate_plane = 1; break;
545 case LandscapeType::Toyland: climate_plane = 2; break;
546 }
547 this->GetWidget<NWidgetStacked>(WID_GL_CLIMATE_SEL_LABEL)->SetDisplayedPlane(climate_plane);
548 this->GetWidget<NWidgetStacked>(WID_GL_CLIMATE_SEL_SELECTOR)->SetDisplayedPlane(climate_plane);
549
550 /* Update availability of decreasing / increasing start date and snow level */
551 if (mode == GLWM_HEIGHTMAP) {
554 }
561
562 /* Do not allow a custom sea level or terrain type with the original land generator. */
566 }
569 }
570 }
571
572 }
573
575 {
577 std::span<const StringID> strs;
578 switch (widget) {
583 break;
584
588 break;
589
593 break;
594
599 break;
600
604 break;
605
609 break;
610
612 SetDParam(0, this->x);
613 SetDParam(1, this->y);
615 break;
616
618 strs = _num_towns;
621 break;
622
624 strs = _num_inds;
627 break;
628
630 strs = _elevations;
633 break;
634
636 strs = _sea_lakes;
639 break;
640
641 case WID_GL_RIVER_PULLDOWN: strs = _rivers; break;
642 case WID_GL_SMOOTHNESS_PULLDOWN: strs = _smoothness; break;
643 case WID_GL_VARIETY_PULLDOWN: strs = _variety; break;
644 case WID_GL_HEIGHTMAP_ROTATION_PULLDOWN: strs = _rotation; break;
647 break;
648
649 case WID_GL_WATER_NE:
650 case WID_GL_WATER_NW:
651 case WID_GL_WATER_SE:
652 case WID_GL_WATER_SW:
654 break;
655
657 size.width = 0;
658 break;
659
660 default:
661 return;
662 }
664 d.width += padding.width;
665 d.height += padding.height;
666 size = maxdim(size, d);
667 }
668
669 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
670 {
671 switch (widget) {
672 case WID_GL_TEMPERATE:
673 case WID_GL_ARCTIC:
674 case WID_GL_TROPICAL:
675 case WID_GL_TOYLAND:
677 break;
678
679 case WID_GL_MAPSIZE_X_PULLDOWN: // Mapsize X
681 break;
682
683 case WID_GL_MAPSIZE_Y_PULLDOWN: // Mapsize Y
685 break;
686
687 case WID_GL_TOWN_PULLDOWN: // Number of towns
689 break;
690
691 case WID_GL_TOWNNAME_DROPDOWN: // Townname generator
693 break;
694
695 case WID_GL_INDUSTRY_PULLDOWN: // Number of industries
697 break;
698
699 case WID_GL_GENERATE_BUTTON: { // Generate
700 /* Get rotated map size. */
701 uint map_x;
702 uint map_y;
704 map_x = this->y;
705 map_y = this->x;
706 } else {
707 map_x = this->x;
708 map_y = this->y;
709 }
710 if (mode == GLWM_HEIGHTMAP &&
711 (map_x * 2 < (1U << _settings_newgame.game_creation.map_x) ||
712 map_x / 2 > (1U << _settings_newgame.game_creation.map_x) ||
713 map_y * 2 < (1U << _settings_newgame.game_creation.map_y) ||
714 map_y / 2 > (1U << _settings_newgame.game_creation.map_y))) {
715 ShowQuery(
718 this,
719 LandscapeGenerationCallback);
720 } else {
721 StartGeneratingLandscape(mode);
722 }
723 break;
724 }
725
727 case WID_GL_HEIGHTMAP_HEIGHT_UP: // Height level 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_HEIGHTMAP_HEIGHT_TEXT: // Height level text
739 this->widget_id = WID_GL_HEIGHTMAP_HEIGHT_TEXT;
741 break;
742
743
745 case WID_GL_START_DATE_UP: // Year buttons
746 /* Don't allow too fast scrolling */
747 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
748 this->HandleButtonClick(widget);
749
751 this->InvalidateData();
752 }
753 _left_button_clicked = false;
754 break;
755
756 case WID_GL_START_DATE_TEXT: // Year text
757 this->widget_id = WID_GL_START_DATE_TEXT;
759 break;
760
762 case WID_GL_SNOW_COVERAGE_UP: // Snow 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_SNOW_COVERAGE_TEXT: // Snow coverage text
774 this->widget_id = WID_GL_SNOW_COVERAGE_TEXT;
776 break;
777
779 case WID_GL_DESERT_COVERAGE_UP: // Desert coverage buttons
780 /* Don't allow too fast scrolling */
781 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
782 this->HandleButtonClick(widget);
783
785 this->InvalidateData();
786 }
787 _left_button_clicked = false;
788 break;
789
790 case WID_GL_DESERT_COVERAGE_TEXT: // Desert line text
791 this->widget_id = WID_GL_DESERT_COVERAGE_TEXT;
793 break;
794
795 case WID_GL_HEIGHTMAP_ROTATION_PULLDOWN: // Heightmap rotation
797 break;
798
799 case WID_GL_TERRAIN_PULLDOWN: // Terrain type
800 /* For the original map generation only the first four are valid. */
802 break;
803
804 case WID_GL_WATER_PULLDOWN: { // Water quantity
806 /* Disable custom water level when the original map generator is active. */
809 }
811 break;
812 }
813
814 case WID_GL_RIVER_PULLDOWN: // Amount of rivers
816 break;
817
818 case WID_GL_SMOOTHNESS_PULLDOWN: // Map smoothness
820 break;
821
822 case WID_GL_VARIETY_PULLDOWN: // Map variety
824 break;
825
826 /* Freetype map borders */
827 case WID_GL_WATER_NW:
829 this->InvalidateData();
830 break;
831
832 case WID_GL_WATER_NE:
834 this->InvalidateData();
835 break;
836
837 case WID_GL_WATER_SE:
839 this->InvalidateData();
840 break;
841
842 case WID_GL_WATER_SW:
844 this->InvalidateData();
845 break;
846
849 this->InvalidateData();
850 break;
851
852 case WID_GL_AI_BUTTON:
854 break;
855
856 case WID_GL_GS_BUTTON:
858 break;
859
861 ShowNewGRFSettings(true, true, false, _grfconfig_newgame);
862 break;
863 }
864 }
865
874
875 void OnDropdownSelect(WidgetID widget, int index) override
876 {
877 switch (widget) {
883
885
887 if ((uint)index == CUSTOM_TOWN_NUMBER_DIFFICULTY) {
888 this->widget_id = widget;
890 }
892 break;
893
894 case WID_GL_TOWNNAME_DROPDOWN: // Town names
895 if (_game_mode == GM_MENU || Town::GetNumItems() == 0) {
898 }
899 break;
900
902 if ((uint)index == ID_CUSTOM) {
903 this->widget_id = widget;
905 }
907 break;
908
910 if ((uint)index == CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY) {
911 this->widget_id = widget;
913 }
915 break;
916 }
917
919 if ((uint)index == CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY) {
920 this->widget_id = widget;
922 }
924 break;
925 }
926 }
927 this->InvalidateData();
928 }
929
930 void OnQueryTextFinished(std::optional<std::string> str) override
931 {
932 /* Was 'cancel' pressed? */
933 if (!str.has_value()) return;
934
935 int32_t value;
936 if (!str->empty()) {
937 value = atoi(str->c_str());
938 } else {
939 /* An empty string means revert to the default */
940 switch (this->widget_id) {
942 case WID_GL_START_DATE_TEXT: value = CalendarTime::DEF_START_YEAR.base(); break;
943 case WID_GL_SNOW_COVERAGE_TEXT: value = DEF_SNOW_COVERAGE; break;
945 case WID_GL_TOWN_PULLDOWN: value = 1; break;
946 case WID_GL_INDUSTRY_PULLDOWN: value = 1; break;
949 default: NOT_REACHED();
950 }
951 }
952
953 switch (this->widget_id) {
957 break;
958
962 break;
963
967 break;
968
972 break;
973
976 break;
977
980 break;
981
984 break;
985
988 break;
989 }
990
991 this->InvalidateData();
992 }
993};
994
995static WindowDesc _generate_landscape_desc(
996 WDP_CENTER, nullptr, 0, 0,
998 {},
1000);
1001
1002static WindowDesc _heightmap_load_desc(
1003 WDP_CENTER, nullptr, 0, 0,
1005 {},
1007);
1008
1009static void _ShowGenerateLandscape(GenerateLandscapeWindowMode mode)
1010{
1011 uint x = 0;
1012 uint y = 0;
1013
1015
1016 /* Generate a new seed when opening the window */
1017 _settings_newgame.game_creation.generation_seed = InteractiveRandom();
1018
1019 if (mode == GLWM_HEIGHTMAP) {
1020 /* If the function returns negative, it means there was a problem loading the heightmap */
1022 }
1023
1024 WindowDesc &desc = (mode == GLWM_HEIGHTMAP) ? _heightmap_load_desc : _generate_landscape_desc;
1025 GenerateLandscapeWindow *w = AllocateWindowDescFront<GenerateLandscapeWindow, true>(desc, mode);
1026
1027 if (mode == GLWM_HEIGHTMAP) {
1028 w->x = x;
1029 w->y = y;
1030 w->name = _file_to_saveload.title;
1031 }
1032
1034}
1035
1038{
1039 _ShowGenerateLandscape(GLWM_GENERATE);
1040}
1041
1044{
1045 _ShowGenerateLandscape(GLWM_HEIGHTMAP);
1046}
1047
1050{
1051 StartGeneratingLandscape(GLWM_SCENARIO);
1052}
1053
1058void StartNewGameWithoutGUI(uint32_t seed)
1059{
1060 /* GenerateWorld takes care of the possible GENERATE_NEW_SEED value in 'seed' */
1062
1063 StartGeneratingLandscape(GLWM_GENERATE);
1064}
1065
1067{
1068 WidgetID widget_id;
1069
1071 {
1072 this->InitNested(window_number);
1074 }
1075
1076 void SetStringParameters(WidgetID widget) const override
1077 {
1078 switch (widget) {
1081 break;
1082
1085 break;
1086
1089 break;
1090
1093 break;
1094 }
1095 }
1096
1111
1113 {
1114 StringID str = STR_JUST_INT;
1115 switch (widget) {
1120 return;
1121
1124 str = STR_JUST_DATE_LONG;
1125 break;
1126
1130 break;
1131
1134 break;
1135
1136 default:
1137 return;
1138 }
1140 d.width += padding.width;
1141 d.height += padding.height;
1142 size = maxdim(size, d);
1143 }
1144
1145 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1146 {
1147 switch (widget) {
1148 case WID_CS_TEMPERATE:
1149 case WID_CS_ARCTIC:
1150 case WID_CS_TROPICAL:
1151 case WID_CS_TOYLAND:
1154 break;
1155
1156 case WID_CS_MAPSIZE_X_PULLDOWN: // Mapsize X
1158 break;
1159
1160 case WID_CS_MAPSIZE_Y_PULLDOWN: // Mapsize Y
1162 break;
1163
1164 case WID_CS_EMPTY_WORLD: // Empty world / flat world
1165 StartGeneratingLandscape(GLWM_SCENARIO);
1166 break;
1167
1168 case WID_CS_RANDOM_WORLD: // Generate
1170 break;
1171
1173 case WID_CS_START_DATE_UP: // Year buttons
1174 /* Don't allow too fast scrolling */
1175 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
1176 this->HandleButtonClick(widget);
1177 this->SetDirty();
1178
1180 }
1181 _left_button_clicked = false;
1182 break;
1183
1184 case WID_CS_START_DATE_TEXT: // Year text
1185 this->widget_id = WID_CS_START_DATE_TEXT;
1187 break;
1188
1190 case WID_CS_FLAT_LAND_HEIGHT_UP: // Height level buttons
1191 /* Don't allow too fast scrolling */
1192 if (!this->flags.Test(WindowFlag::Timeout) || this->timeout_timer <= 1) {
1193 this->HandleButtonClick(widget);
1194 this->SetDirty();
1195
1197 }
1198 _left_button_clicked = false;
1199 break;
1200
1201 case WID_CS_FLAT_LAND_HEIGHT_TEXT: // Height level text
1202 this->widget_id = WID_CS_FLAT_LAND_HEIGHT_TEXT;
1204 break;
1205 }
1206 }
1207
1212
1213 void OnDropdownSelect(WidgetID widget, int index) override
1214 {
1215 switch (widget) {
1218 }
1219 this->SetDirty();
1220 }
1221
1222 void OnQueryTextFinished(std::optional<std::string> str) override
1223 {
1224 if (!str.has_value() || str->empty()) return;
1225
1226 int32_t value = atoi(str->c_str());
1227
1228 switch (this->widget_id) {
1232 break;
1233
1237 break;
1238 }
1239
1240 this->SetDirty();
1241 }
1242};
1243
1244static constexpr NWidgetPart _nested_create_scenario_widgets[] = {
1246 NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
1247 NWidget(WWT_CAPTION, COLOUR_BROWN), SetStringTip(STR_SE_MAPGEN_CAPTION),
1248 EndContainer(),
1249 NWidget(WWT_PANEL, COLOUR_BROWN),
1251 /* Landscape style selection. */
1253 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TEMPERATE), SetSpriteTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
1254 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_ARCTIC), SetSpriteTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
1255 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TROPICAL), SetSpriteTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
1256 NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TOYLAND), SetSpriteTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
1257 EndContainer(),
1258
1260 /* Green generation type buttons: 'Flat land' and 'Random land'. */
1262 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_CS_EMPTY_WORLD), SetStringTip(STR_SE_MAPGEN_FLAT_WORLD, STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP), SetFill(1, 1),
1263 NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_CS_RANDOM_WORLD), SetStringTip(STR_SE_MAPGEN_RANDOM_LAND, STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND), SetFill(1, 1),
1264 EndContainer(),
1265
1266 /* Labels + setting drop-downs */
1268 /* Labels. */
1270 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(0, 1),
1271 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(0, 1),
1272 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_SE_MAPGEN_FLAT_WORLD_HEIGHT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP), SetFill(0, 1),
1273 EndContainer(),
1274
1276 /* Map size. */
1278 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_X_PULLDOWN), SetStringTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
1279 NWidget(WWT_TEXT, INVALID_COLOUR), SetStringTip(STR_MAPGEN_BY), SetFill(0, 1), SetAlignment(SA_CENTER),
1280 NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_Y_PULLDOWN), SetStringTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
1281 EndContainer(),
1282
1283 /* Date. */
1285 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),
1286 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_START_DATE_TEXT), SetFill(1, 1), SetStringTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP),
1287 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),
1288 EndContainer(),
1289
1290 /* Flat map height. */
1292 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),
1293 NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_TEXT), SetFill(1, 1), SetStringTip(STR_JUST_INT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP),
1294 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),
1295 EndContainer(),
1296 EndContainer(),
1297 EndContainer(),
1298 EndContainer(),
1299 EndContainer(),
1300 EndContainer(),
1301};
1302
1303static WindowDesc _create_scenario_desc(
1304 WDP_CENTER, nullptr, 0, 0,
1306 {},
1307 _nested_create_scenario_widgets
1308);
1309
1312{
1314 new CreateScenarioWindow(_create_scenario_desc, GLWM_SCENARIO);
1315}
1316
1317static constexpr NWidgetPart _nested_generate_progress_widgets[] = {
1318 NWidget(WWT_CAPTION, COLOUR_GREY), SetStringTip(STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1319 NWidget(WWT_PANEL, COLOUR_GREY),
1321 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_BAR), SetFill(1, 0),
1322 NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_TEXT), SetFill(1, 0),
1323 NWidget(WWT_TEXTBTN, COLOUR_WHITE, WID_GP_ABORT), SetStringTip(STR_GENERATION_ABORT), SetFill(1, 0),
1324 EndContainer(),
1325 EndContainer(),
1326};
1327
1328
1329static WindowDesc _generate_progress_desc(
1330 WDP_CENTER, nullptr, 0, 0,
1333 _nested_generate_progress_widgets
1334);
1335
1337 static inline uint percent;
1338 static inline StringID cls;
1339 static inline uint current;
1340 static inline uint total;
1341};
1342
1343static const StringID _generation_class_table[] = {
1344 STR_GENERATION_WORLD_GENERATION,
1345 STR_GENERATION_LANDSCAPE_GENERATION,
1346 STR_GENERATION_RIVER_GENERATION,
1347 STR_GENERATION_CLEARING_TILES,
1348 STR_GENERATION_TOWN_GENERATION,
1349 STR_GENERATION_INDUSTRY_GENERATION,
1350 STR_GENERATION_OBJECT_GENERATION,
1351 STR_GENERATION_TREE_GENERATION,
1352 STR_GENERATION_SETTINGUP_GAME,
1353 STR_GENERATION_PREPARING_TILELOOP,
1354 STR_GENERATION_PREPARING_SCRIPT,
1355 STR_GENERATION_PREPARING_GAME
1356};
1357static_assert(lengthof(_generation_class_table) == GWP_CLASS_COUNT);
1358
1359
1360static void AbortGeneratingWorldCallback(Window *, bool confirmed)
1361{
1362 if (confirmed) {
1364 } else if (HasModalProgress() && !IsGeneratingWorldAborted()) {
1365 SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE);
1366 }
1367}
1368
1370
1371 GenerateProgressWindow() : Window(_generate_progress_desc)
1372 {
1373 this->InitNested();
1374 }
1375
1376 void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1377 {
1378 switch (widget) {
1379 case WID_GP_ABORT:
1380 SetMouseCursorBusy(false);
1381 ShowQuery(
1384 this,
1385 AbortGeneratingWorldCallback
1386 );
1387 break;
1388 }
1389 }
1390
1392 {
1393 switch (widget) {
1394 case WID_GP_PROGRESS_BAR: {
1395 SetDParamMaxValue(0, 100);
1397 /* We need some spacing for the 'border' */
1400 break;
1401 }
1402
1404 for (uint i = 0; i < GWP_CLASS_COUNT; i++) {
1405 size.width = std::max(size.width, GetStringBoundingBox(_generation_class_table[i]).width + padding.width);
1406 }
1408 break;
1409 }
1410 }
1411
1412 void DrawWidget(const Rect &r, WidgetID widget) const override
1413 {
1414 switch (widget) {
1415 case WID_GP_PROGRESS_BAR: {
1416 /* Draw the % complete with a bar and a text */
1419 DrawFrameRect(br.WithWidth(br.Width() * GenWorldStatus::percent / 100, _current_text_dir == TD_RTL), COLOUR_MAUVE, {});
1420 SetDParam(0, GenWorldStatus::percent);
1421 DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, GetCharacterHeight(FS_NORMAL)), STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_HOR_CENTER);
1422 break;
1423 }
1424
1426 /* Tell which class we are generating */
1427 DrawString(r.left, r.right, r.top, GenWorldStatus::cls, TC_FROMSTRING, SA_HOR_CENTER);
1428
1429 /* And say where we are in that class */
1430 SetDParam(0, GenWorldStatus::current);
1431 SetDParam(1, GenWorldStatus::total);
1432 DrawString(r.left, r.right, r.top + GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal, STR_GENERATION_PROGRESS_NUM, TC_FROMSTRING, SA_HOR_CENTER);
1433 }
1434 }
1435};
1436
1441{
1442 GenWorldStatus::cls = STR_GENERATION_WORLD_GENERATION;
1443 GenWorldStatus::current = 0;
1444 GenWorldStatus::total = 0;
1445 GenWorldStatus::percent = 0;
1446}
1447
1456
1457static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uint total)
1458{
1459 static const int percent_table[] = {0, 5, 14, 17, 20, 40, 60, 65, 80, 85, 95, 99, 100 };
1460 static_assert(lengthof(percent_table) == GWP_CLASS_COUNT + 1);
1461 assert(cls < GWP_CLASS_COUNT);
1462
1463 /* Check if we really are generating the world.
1464 * For example, placing trees via the SE also calls this function, but
1465 * shouldn't try to update the progress.
1466 */
1467 if (!HasModalProgress()) return;
1468
1471 return;
1472 }
1473
1474 if (total == 0) {
1475 assert(GenWorldStatus::cls == _generation_class_table[cls]);
1476 GenWorldStatus::current += progress;
1477 assert(GenWorldStatus::current <= GenWorldStatus::total);
1478 } else {
1479 GenWorldStatus::cls = _generation_class_table[cls];
1480 GenWorldStatus::current = progress;
1481 GenWorldStatus::total = total;
1482 GenWorldStatus::percent = percent_table[cls];
1483 }
1484
1485 /* Percentage is about the number of completed tasks, so 'current - 1' */
1486 GenWorldStatus::percent = percent_table[cls] + (percent_table[cls + 1] - percent_table[cls]) * (GenWorldStatus::current == 0 ? 0 : GenWorldStatus::current - 1) / GenWorldStatus::total;
1487
1488 if (_network_dedicated) {
1489 static uint last_percent = 0;
1490
1491 /* Never display 0% */
1492 if (GenWorldStatus::percent == 0) return;
1493 /* Reset if percent is lower than the last recorded */
1494 if (GenWorldStatus::percent < last_percent) last_percent = 0;
1495 /* Display every 5%, but 6% is also very valid.. just not smaller steps than 5% */
1496 if (GenWorldStatus::percent % 5 != 0 && GenWorldStatus::percent <= last_percent + 5) return;
1497 /* Never show steps smaller than 2%, even if it is a mod 5% */
1498 if (GenWorldStatus::percent <= last_percent + 2) return;
1499
1500 Debug(net, 3, "Map generation percentage complete: {}", GenWorldStatus::percent);
1501 last_percent = GenWorldStatus::percent;
1502
1503 return;
1504 }
1505
1507
1509}
1510
1520{
1521 if (total == 0) return;
1522
1523 _SetGeneratingWorldProgress(cls, 0, total);
1524}
1525
1534{
1535 /* In fact the param 'class' isn't needed.. but for some security reasons, we want it around */
1536 _SetGeneratingWorldProgress(cls, 1, 0);
1537}
void ShowAIConfigWindow()
Open the AI config window.
Definition ai_gui.cpp:324
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().
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:28
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:94
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:441
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close, bool persist)
Show a drop down list.
Definition dropdown.cpp:404
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:77
void ShowGSConfigWindow()
Open the GS config window.
Definition game_gui.cpp:444
Window for configuring the Games
void HandleGeneratingWorldAbortion()
Really handle the abortion, i.e.
Definition genworld.cpp:274
void AbortGeneratingWorld()
Initializes the abortion process.
Definition genworld.cpp:257
bool IsGeneratingWorldAborted()
Is the generation being aborted?
Definition genworld.cpp:266
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
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.
static constexpr NWidgetPart _nested_heightmap_load_widgets[]
Widgets of GenerateLandscapeWindow when loading heightmap.
void ShowCreateScenario()
Show the window to create a scenario.
static constexpr NWidgetPart _nested_generate_landscape_widgets[]
Widgets of GenerateLandscapeWindow when generating world.
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_BORDERS_RANDOM
'Random'/'Manual' borders.
@ WID_GL_HEIGHTMAP_SIZE_TEXT
Size of heightmap.
@ WID_GL_WATER_NW
NW 'Water'/'Freeform'.
@ 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:1686
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition gfx.cpp:851
Dimension GetStringListBoundingBox(std::span< const StringID > list, FontSize fontsize)
Get maximum dimension of a list of strings.
Definition gfx.cpp:889
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
Definition gfx.cpp:657
bool _left_button_clicked
Is left mouse button clicked?
Definition gfx.cpp:42
void SetMouseCursorBusy(bool busy)
Set or unset the ZZZ cursor.
Definition gfx.cpp:1670
SwitchMode _switch_mode
The next mainloop command.
Definition gfx.cpp:49
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
Definition gfx_func.h:166
@ FS_NORMAL
Index of the normal font in the font tables.
Definition gfx_type.h:243
@ SA_RIGHT
Right align the text (must be a single bit).
Definition gfx_type.h:377
@ SA_HOR_CENTER
Horizontally center the text.
Definition gfx_type.h:376
@ SA_CENTER
Center both horizontally and vertically.
Definition gfx_type.h:385
@ SA_VERT_CENTER
Vertically center the text.
Definition gfx_type.h:381
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 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 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:937
bool GetHeightmapDimensions(DetailedFileType dft, const char *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.
LandscapeType
Landscape types.
BorderFlag
For storing the water borders which shall be retained.
@ 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:68
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:64
Functions/types related to saving and loading games.
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
@ ID_CUSTOM
Custom number of industries.
@ ID_END
Number of industry density settings.
Functions related to sound.
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition sound_type.h:66
Definition of base types and functions in a cross-platform compatible way.
#define lengthof(array)
Return the length of an fixed size array.
Definition stdafx.h:277
Functions related to low-level strings.
@ CS_NUMERAL
Only numeric ones.
Definition string_type.h:26
void SetDParamMaxValue(size_t n, uint64_t max_value, uint min_count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
Definition strings.cpp:186
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
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition strings.cpp:56
void SetDParamStr(size_t n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
Definition strings.cpp:466
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.
SoundSettings sound
sound effect settings
bool freeform_edges
allow terraforming the tiles at the map edges
uint8_t map_height_limit
the maximum allowed heightlevel
void OnClick(Point pt, WidgetID widget, int click_count) override
A click with the left mouse button has been made on the window.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
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.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
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.
DetailedFileType detail_ftype
Concrete file type (PNG, BMP, old save, etc).
Definition saveload.h:416
std::string title
Internal name of the game.
Definition saveload.h:419
std::string name
Name of the file.
Definition saveload.h:418
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 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.
void SetStringParameters(WidgetID widget) const override
Initialize string parameters for a widget.
void OnDropdownSelect(WidgetID widget, int index) override
A dropdown option associated to this window has been selected.
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.
Partial widget specification to allow NWidgets to be written nested.
Coordinates of a point in 2D.
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.
bool confirm
Play sound effect on successful constructions or other actions.
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:272
void DrawWidgets() const
Paint all widgets of a window.
Definition widget.cpp:731
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition window.cpp:3157
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
Definition window_gui.h:468
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition window.cpp:548
ResizeInfo resize
Resize information.
Definition window_gui.h:313
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition window_gui.h:514
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition window_gui.h:440
void RaiseWidgetsWhenLowered(Args... widgets)
Raises the widgets and sets widgets dirty that are lowered.
Definition window_gui.h:535
const NWID * GetWidget(WidgetID widnum) const
Get the nested widget with number widnum from the nested widget tree.
Definition window_gui.h:969
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
Definition window_gui.h:459
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:587
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition window.cpp:1743
WindowFlags flags
Window flags.
Definition window_gui.h:299
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition window_gui.h:380
int width
width of the window (number of pixels to the right in x direction)
Definition window_gui.h:310
WindowNumber window_number
Window number within the window class.
Definition window_gui.h:301
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition textbuf_gui.h:21
static const uint MIN_MAP_HEIGHT_LIMIT
Lower bound of maximum allowed heightlevel (in the construction settings)
Definition tile_type.h:29
static const uint MIN_CUSTOM_TERRAIN_TYPE
Lowest possible peak value for world generation.
Definition tile_type.h:27
static const uint DEF_DESERT_COVERAGE
Default desert coverage.
Definition tile_type.h:37
static const uint MAX_TILE_HEIGHT
Maximum allowed tile height.
Definition tile_type.h:24
static const uint MIN_HEIGHTMAP_HEIGHT
Lowest possible peak value for heightmap creation.
Definition tile_type.h:26
static const uint MAX_MAP_HEIGHT_LIMIT
Upper bound of maximum allowed heightlevel (in the construction settings)
Definition tile_type.h:30
static const 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:29
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY
value for custom town number in difficulty settings
Definition town.h:28
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:283
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
@ WWT_IMGBTN
(Toggle) Button with image
Definition widget_type.h:43
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition widget_type.h:44
@ 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:46
@ 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_CLOSEBOX
Close box (at top-left of a window)
Definition widget_type.h:60
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition widget_type.h:39
@ 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:1149
Window * BringWindowToFrontById(WindowClass cls, WindowNumber number)
Find a window and make it the relative top-window on the screen.
Definition window.cpp:1220
void CloseAllNonVitalWindows()
It is possible that a stickied window gets to a position where the 'close' button is outside the gami...
Definition window.cpp:3278
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition window.cpp:3099
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
Definition window.cpp:3234
Window functions not directly related to making/drawing windows.
@ 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:146
int WidgetID
Widget ID.
Definition window_type.h:20
@ WN_GAME_OPTIONS_GAME_OPTIONS
Game options.
Definition window_type.h:28
@ WC_SELECT_GAME
Select game window; Window numbers:
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition window_type.h:47
@ 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: