OpenTTD Source  20240917-master-g9ab0a47812
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"
22 #include "dropdown_common_type.h"
23 #include "dropdown_func.h"
24 #include "querystring_gui.h"
25 #include "town.h"
26 #include "core/geometry_func.hpp"
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"
33 #include "video/video_driver.hpp"
34 #include "ai/ai_gui.hpp"
35 #include "game/game_gui.hpp"
36 #include "industry.h"
37 
39 
40 #include "safeguards.h"
41 
42 
43 extern void MakeNewgameSettingsLive();
44 
50 };
51 
55 static uint GetMapHeightLimit()
56 {
59 }
60 
65 void SetNewLandscapeType(uint8_t landscape)
66 {
70 }
71 
75  NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
76  NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_MAPGEN_WORLD_GENERATION_CAPTION, STR_NULL),
77  EndContainer(),
78  NWidget(WWT_PANEL, COLOUR_BROWN),
80  /* Landscape selection. */
82  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TEMPERATE), SetDataTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
83  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_ARCTIC), SetDataTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
84  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TROPICAL), SetDataTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
85  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TOYLAND), SetDataTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
86  EndContainer(),
87 
88  /* Generation options. */
90  /* Left half (land generation options) */
92  /* Labels on the left side (global column 1). */
94  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
95  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TERRAIN_TYPE, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1),
96  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_VARIETY, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1),
97  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SMOOTHNESS, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1),
98  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_QUANTITY_OF_RIVERS, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
99  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(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), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
107  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetFill(0, 1), SetAlignment(SA_CENTER),
108  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
109  EndContainer(),
110  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TERRAIN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT), SetFill(1, 1),
111  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_VARIETY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_VARIETY_HELPTEXT), SetFill(1, 1),
112  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_SMOOTHNESS_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT), SetFill(1, 1),
113  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT), SetFill(1, 1),
114  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_BORDERS_RANDOM), SetDataTip(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, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
124  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
125  NWidget(NWID_SPACER), SetFill(1, 1),
126  EndContainer(),
127  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
128  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
129  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
130  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_INDUSTRIES, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
131  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(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), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
141  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(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), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP), 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), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
147  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(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), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
149  EndContainer(),
150  /* Temperate/Toyland spacer. */
151  NWidget(NWID_SPACER), SetFill(1, 1),
152  EndContainer(),
153  /* Starting date. */
155  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
156  NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
157  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
158  EndContainer(),
159  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
160  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
161  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP), SetFill(1, 1),
162  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_WATER_PULLDOWN), SetDataTip(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, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NORTHWEST, STR_NULL), 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), SetDataTip(STR_JUST_STRING, STR_MAPGEN_NORTHWEST), SetFill(1, 1),
172  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_NE), SetDataTip(STR_JUST_STRING, STR_MAPGEN_NORTHEAST), SetFill(1, 1),
173  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NORTHEAST, STR_NULL), SetPadding(0, 0, 0, WidgetDimensions::unscaled.hsep_normal), SetFill(1, 1),
174  EndContainer(),
176  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SOUTHWEST, STR_NULL), 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), SetDataTip(STR_JUST_STRING, STR_MAPGEN_SOUTHWEST), SetFill(1, 1),
178  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_WATER_SE), SetDataTip(STR_JUST_STRING, STR_MAPGEN_SOUTHEAST), SetFill(1, 1),
179  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SOUTHEAST, STR_NULL), 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), SetDataTip(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), SetDataTip(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), SetDataTip(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), SetDataTip(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), SetDataTip(STR_MAPGEN_WORLD_GENERATION_CAPTION, STR_NULL),
202  EndContainer(),
203  NWidget(WWT_PANEL, COLOUR_BROWN),
205  /* Landscape selection. */
207  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TEMPERATE), SetDataTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
208  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_ARCTIC), SetDataTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
209  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TROPICAL), SetDataTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
210  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_GL_TOYLAND), SetDataTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
211  EndContainer(),
212 
214  /* Heightmap name label. */
215  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_NAME, STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP),
216  NWidget(WWT_TEXT, COLOUR_ORANGE, WID_GL_HEIGHTMAP_NAME_TEXT), SetTextStyle(TC_ORANGE), SetDataTip(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, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP), SetFill(1, 1),
227  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
228  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP), SetFill(1, 1),
229  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_HEIGHT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1),
230  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(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, COLOUR_ORANGE, WID_GL_HEIGHTMAP_SIZE_TEXT), SetDataTip(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), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
239  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetFill(0, 1), SetAlignment(SA_CENTER),
240  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
241  EndContainer(),
242  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_ROTATION_PULLDOWN), SetDataTip(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), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
246  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_TEXT), SetDataTip(STR_JUST_INT, STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP), SetFill(1, 1),
247  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_HEIGHTMAP_HEIGHT_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_HEIGHTMAP_HEIGHT_UP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
248  EndContainer(),
249  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_RIVER_PULLDOWN), SetDataTip(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, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_COVERAGE, STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT), SetFill(1, 1),
259  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DESERT_COVERAGE, STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT), SetFill(1, 1),
260  NWidget(NWID_SPACER), SetFill(1, 1),
261  EndContainer(),
262  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
263  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_TOWN_NAME_LABEL, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
264  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_NUMBER_OF_TOWNS, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
265  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(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), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_COVERAGE_DOWN), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
275  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_SNOW_COVERAGE_TEXT), SetDataTip(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), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_COVERAGE_UP), 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), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_DESERT_COVERAGE_DOWN), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
281  NWidget(WWT_TEXTBTN, COLOUR_ORANGE, WID_GL_DESERT_COVERAGE_TEXT), SetDataTip(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), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_DESERT_COVERAGE_UP), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
283  EndContainer(),
284  /* Temperate/Toyland spacer. */
285  NWidget(NWID_SPACER), SetFill(1, 1),
286  EndContainer(),
287  /* Starting date. */
289  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
290  NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_GL_START_DATE_TEXT), SetDataTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP), SetFill(1, 1),
291  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_GL_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
292  EndContainer(),
293  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWNNAME_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP), SetFill(1, 1),
294  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING1, STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP), SetFill(1, 1),
295  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_GL_INDUSTRY_PULLDOWN), SetDataTip(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), SetDataTip(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), SetDataTip(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), SetDataTip(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), SetDataTip(STR_MAPGEN_GENERATE, STR_MAPGEN_GENERATE_TOOLTIP), SetFill(1, 1),
309  EndContainer(),
310  EndContainer(),
311 };
312 
313 static 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 
322  if (_settings_client.sound.confirm) SndPlayFx(SND_15_BEEP);
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 
331 static void LandscapeGenerationCallback(Window *w, bool confirmed)
332 {
333  if (confirmed) StartGeneratingLandscape((GenerateLandscapeWindowMode)w->window_number);
334 }
335 
336 static 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 
348 static 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 
376 static 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};
377 static 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};
378 static const StringID _rivers[] = {STR_RIVERS_NONE, STR_RIVERS_FEW, STR_RIVERS_MODERATE, STR_RIVERS_LOT};
379 static 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};
380 static const StringID _rotation[] = {STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE};
381 static const StringID _num_towns[] = {STR_NUM_VERY_LOW, STR_NUM_LOW, STR_NUM_NORMAL, STR_NUM_HIGH, STR_NUM_CUSTOM};
382 static 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};
383 static const StringID _variety[] = {STR_VARIETY_NONE, STR_VARIETY_VERY_LOW, STR_VARIETY_LOW, STR_VARIETY_MEDIUM, STR_VARIETY_HIGH, STR_VARIETY_VERY_HIGH};
384 
385 static_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 = (GenerateLandscapeWindowMode)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) {
431  SetDParam(0, STR_CONFIG_SETTING_OFF);
433  SetDParam(0, STR_NUM_CUSTOM_NUMBER);
435  } else {
437  }
438  break;
439 
443  STR_MAPGEN_TOWN_NAME_ORIGINAL_ENGLISH + gen :
444  GetGRFTownNameName(gen - BUILTIN_TOWNNAME_GENERATOR_COUNT);
445  SetDParam(0, name);
446  break;
447  }
448 
450  if (_game_mode == GM_EDITOR) {
451  SetDParam(0, STR_CONFIG_SETTING_OFF);
453  SetDParam(0, STR_NUM_CUSTOM_NUMBER);
455  } else {
457  }
458  break;
459 
462  SetDParam(0, STR_TERRAIN_TYPE_CUSTOM_VALUE);
464  } else {
465  SetDParam(0, _elevations[_settings_newgame.difficulty.terrain_type]); break;
466  }
467  break;
468 
471  SetDParam(0, STR_SEA_LEVEL_CUSTOM_PERCENTAGE);
473  } else {
475  }
476  break;
477 
478  case WID_GL_HEIGHTMAP_NAME_TEXT: SetDParamStr(0, this->name); break;
482  case WID_GL_BORDERS_RANDOM: SetDParam(0, (_settings_newgame.game_creation.water_borders == BORDERS_RANDOM) ? STR_MAPGEN_BORDER_RANDOMIZE : STR_MAPGEN_BORDER_MANUAL); break;
483  case WID_GL_WATER_NE: SetDParam(0, (_settings_newgame.game_creation.water_borders == BORDERS_RANDOM) ? STR_MAPGEN_BORDER_RANDOM : HasBit(_settings_newgame.game_creation.water_borders, BORDER_NE) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); break;
484  case WID_GL_WATER_NW: SetDParam(0, (_settings_newgame.game_creation.water_borders == BORDERS_RANDOM) ? STR_MAPGEN_BORDER_RANDOM : HasBit(_settings_newgame.game_creation.water_borders, BORDER_NW) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); break;
485  case WID_GL_WATER_SE: SetDParam(0, (_settings_newgame.game_creation.water_borders == BORDERS_RANDOM) ? STR_MAPGEN_BORDER_RANDOM : HasBit(_settings_newgame.game_creation.water_borders, BORDER_SE) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); break;
486  case WID_GL_WATER_SW: SetDParam(0, (_settings_newgame.game_creation.water_borders == BORDERS_RANDOM) ? STR_MAPGEN_BORDER_RANDOM : HasBit(_settings_newgame.game_creation.water_borders, BORDER_SW) ? STR_MAPGEN_BORDER_WATER : STR_MAPGEN_BORDER_FREEFORM); 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 LT_TEMPERATE: climate_plane = 2; break;
543  case LT_ARCTIC: climate_plane = 0; break;
544  case LT_TROPIC: climate_plane = 1; break;
545  case LT_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 
574  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
575  {
577  std::span<const StringID> strs;
578  switch (widget) {
579  case WID_GL_TEMPERATE: case WID_GL_ARCTIC:
580  case WID_GL_TROPICAL: case WID_GL_TOYLAND:
583  break;
584 
587  d = GetStringBoundingBox(STR_JUST_INT);
588  break;
589 
592  d = GetStringBoundingBox(STR_JUST_DATE_LONG);
593  break;
594 
598  d = GetStringBoundingBox(STR_JUST_INT);
599  break;
600 
603  d = GetStringBoundingBox(STR_MAPGEN_SNOW_COVERAGE_TEXT);
604  break;
605 
608  d = GetStringBoundingBox(STR_MAPGEN_DESERT_COVERAGE_TEXT);
609  break;
610 
612  SetDParam(0, this->x);
613  SetDParam(1, this->y);
614  d = GetStringBoundingBox(STR_MAPGEN_HEIGHTMAP_SIZE);
615  break;
616 
618  strs = _num_towns;
620  d = GetStringBoundingBox(STR_NUM_CUSTOM_NUMBER);
621  break;
622 
624  strs = _num_inds;
626  d = GetStringBoundingBox(STR_NUM_CUSTOM_NUMBER);
627  break;
628 
630  strs = _elevations;
632  d = GetStringBoundingBox(STR_TERRAIN_TYPE_CUSTOM_VALUE);
633  break;
634 
636  strs = _sea_lakes;
638  d = GetStringBoundingBox(STR_SEA_LEVEL_CUSTOM_PERCENTAGE);
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;
646  d = maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_RANDOMIZE), GetStringBoundingBox(STR_MAPGEN_BORDER_MANUAL));
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:
653  d = maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_RANDOM), maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_WATER), GetStringBoundingBox(STR_MAPGEN_BORDER_FREEFORM)));
654  break;
655 
657  size.width = 0;
658  break;
659 
660  default:
661  return;
662  }
663  d = maxdim(d, GetStringListBoundingBox(strs));
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(
716  STR_WARNING_HEIGHTMAP_SCALE_CAPTION,
717  STR_WARNING_HEIGHTMAP_SCALE_MESSAGE,
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 & WF_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  ShowQueryString(STR_JUST_INT, STR_MAPGEN_HEIGHTMAP_HEIGHT_QUERY_CAPT, 4, this, CS_NUMERAL, QSF_ENABLE_DEFAULT);
742  break;
743 
744 
746  case WID_GL_START_DATE_UP: // Year buttons
747  /* Don't allow too fast scrolling */
748  if (!(this->flags & WF_TIMEOUT) || this->timeout_timer <= 1) {
749  this->HandleButtonClick(widget);
750 
752  this->InvalidateData();
753  }
754  _left_button_clicked = false;
755  break;
756 
757  case WID_GL_START_DATE_TEXT: // Year text
758  this->widget_id = WID_GL_START_DATE_TEXT;
760  ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_ENABLE_DEFAULT);
761  break;
762 
764  case WID_GL_SNOW_COVERAGE_UP: // Snow coverage buttons
765  /* Don't allow too fast scrolling */
766  if (!(this->flags & WF_TIMEOUT) || this->timeout_timer <= 1) {
767  this->HandleButtonClick(widget);
768 
770  this->InvalidateData();
771  }
772  _left_button_clicked = false;
773  break;
774 
775  case WID_GL_SNOW_COVERAGE_TEXT: // Snow coverage text
776  this->widget_id = WID_GL_SNOW_COVERAGE_TEXT;
778  ShowQueryString(STR_JUST_INT, STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT, 4, this, CS_NUMERAL, QSF_ENABLE_DEFAULT);
779  break;
780 
782  case WID_GL_DESERT_COVERAGE_UP: // Desert coverage buttons
783  /* Don't allow too fast scrolling */
784  if (!(this->flags & WF_TIMEOUT) || this->timeout_timer <= 1) {
785  this->HandleButtonClick(widget);
786 
788  this->InvalidateData();
789  }
790  _left_button_clicked = false;
791  break;
792 
793  case WID_GL_DESERT_COVERAGE_TEXT: // Desert line text
794  this->widget_id = WID_GL_DESERT_COVERAGE_TEXT;
796  ShowQueryString(STR_JUST_INT, STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT, 4, this, CS_NUMERAL, QSF_ENABLE_DEFAULT);
797  break;
798 
799  case WID_GL_HEIGHTMAP_ROTATION_PULLDOWN: // Heightmap rotation
801  break;
802 
803  case WID_GL_TERRAIN_PULLDOWN: // Terrain type
804  /* For the original map generation only the first four are valid. */
806  break;
807 
808  case WID_GL_WATER_PULLDOWN: { // Water quantity
809  uint32_t hidden_mask = 0;
810  /* Disable custom water level when the original map generator is active. */
813  }
815  break;
816  }
817 
818  case WID_GL_RIVER_PULLDOWN: // Amount of rivers
820  break;
821 
822  case WID_GL_SMOOTHNESS_PULLDOWN: // Map smoothness
824  break;
825 
826  case WID_GL_VARIETY_PULLDOWN: // Map variety
828  break;
829 
830  /* Freetype map borders */
831  case WID_GL_WATER_NW:
833  this->InvalidateData();
834  break;
835 
836  case WID_GL_WATER_NE:
838  this->InvalidateData();
839  break;
840 
841  case WID_GL_WATER_SE:
843  this->InvalidateData();
844  break;
845 
846  case WID_GL_WATER_SW:
848  this->InvalidateData();
849  break;
850 
853  this->InvalidateData();
854  break;
855 
856  case WID_GL_AI_BUTTON:
858  break;
859 
860  case WID_GL_GS_BUTTON:
862  break;
863 
864  case WID_GL_NEWGRF_BUTTON:
865  ShowNewGRFSettings(true, true, false, &_grfconfig_newgame);
866  break;
867  }
868  }
869 
870  void OnTimeout() override
871  {
872  if (mode == GLWM_HEIGHTMAP) {
874  } else {
876  }
877  }
878 
879  void OnDropdownSelect(WidgetID widget, int index) override
880  {
881  switch (widget) {
887 
889 
891  if ((uint)index == CUSTOM_TOWN_NUMBER_DIFFICULTY) {
892  this->widget_id = widget;
894  ShowQueryString(STR_JUST_INT, STR_MAPGEN_NUMBER_OF_TOWNS, 5, this, CS_NUMERAL, QSF_NONE);
895  }
897  break;
898 
899  case WID_GL_TOWNNAME_DROPDOWN: // Town names
900  if (_game_mode == GM_MENU || Town::GetNumItems() == 0) {
903  }
904  break;
905 
907  if ((uint)index == ID_CUSTOM) {
908  this->widget_id = widget;
910  ShowQueryString(STR_JUST_INT, STR_MAPGEN_NUMBER_OF_INDUSTRIES, 5, this, CS_NUMERAL, QSF_NONE);
911  }
913  break;
914 
916  if ((uint)index == CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY) {
917  this->widget_id = widget;
919  ShowQueryString(STR_JUST_INT, STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT, 4, this, CS_NUMERAL, QSF_NONE);
920  }
922  break;
923  }
924 
925  case WID_GL_WATER_PULLDOWN: {
926  if ((uint)index == CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY) {
927  this->widget_id = widget;
929  ShowQueryString(STR_JUST_INT, STR_MAPGEN_SEA_LEVEL, 3, this, CS_NUMERAL, QSF_NONE);
930  }
932  break;
933  }
934  }
935  this->InvalidateData();
936  }
937 
938  void OnQueryTextFinished(std::optional<std::string> str) override
939  {
940  /* Was 'cancel' pressed? */
941  if (!str.has_value()) return;
942 
943  int32_t value;
944  if (!str->empty()) {
945  value = atoi(str->c_str());
946  } else {
947  /* An empty string means revert to the default */
948  switch (this->widget_id) {
950  case WID_GL_START_DATE_TEXT: value = CalendarTime::DEF_START_YEAR.base(); break;
951  case WID_GL_SNOW_COVERAGE_TEXT: value = DEF_SNOW_COVERAGE; break;
953  case WID_GL_TOWN_PULLDOWN: value = 1; break;
954  case WID_GL_INDUSTRY_PULLDOWN: value = 1; break;
955  case WID_GL_TERRAIN_PULLDOWN: value = MIN_MAP_HEIGHT_LIMIT; break;
957  default: NOT_REACHED();
958  }
959  }
960 
961  switch (this->widget_id) {
965  break;
966 
970  break;
971 
975  break;
976 
980  break;
981 
984  break;
985 
988  break;
989 
992  break;
993 
996  break;
997  }
998 
999  this->InvalidateData();
1000  }
1001 };
1002 
1003 static WindowDesc _generate_landscape_desc(
1004  WDP_CENTER, nullptr, 0, 0,
1006  0,
1008 );
1009 
1010 static WindowDesc _heightmap_load_desc(
1011  WDP_CENTER, nullptr, 0, 0,
1013  0,
1015 );
1016 
1017 static void _ShowGenerateLandscape(GenerateLandscapeWindowMode mode)
1018 {
1019  uint x = 0;
1020  uint y = 0;
1021 
1023 
1024  /* Generate a new seed when opening the window */
1025  _settings_newgame.game_creation.generation_seed = InteractiveRandom();
1026 
1027  if (mode == GLWM_HEIGHTMAP) {
1028  /* If the function returns negative, it means there was a problem loading the heightmap */
1030  }
1031 
1032  WindowDesc &desc = (mode == GLWM_HEIGHTMAP) ? _heightmap_load_desc : _generate_landscape_desc;
1033  GenerateLandscapeWindow *w = AllocateWindowDescFront<GenerateLandscapeWindow>(desc, mode, true);
1034 
1035  if (mode == GLWM_HEIGHTMAP) {
1036  w->x = x;
1037  w->y = y;
1038  w->name = _file_to_saveload.title;
1039  }
1040 
1042 }
1043 
1046 {
1047  _ShowGenerateLandscape(GLWM_GENERATE);
1048 }
1049 
1052 {
1053  _ShowGenerateLandscape(GLWM_HEIGHTMAP);
1054 }
1055 
1058 {
1059  StartGeneratingLandscape(GLWM_SCENARIO);
1060 }
1061 
1066 void StartNewGameWithoutGUI(uint32_t seed)
1067 {
1068  /* GenerateWorld takes care of the possible GENERATE_NEW_SEED value in 'seed' */
1070 
1071  StartGeneratingLandscape(GLWM_GENERATE);
1072 }
1073 
1075 {
1076  WidgetID widget_id;
1077 
1079  {
1080  this->InitNested(window_number);
1082  }
1083 
1084  void SetStringParameters(WidgetID widget) const override
1085  {
1086  switch (widget) {
1089  break;
1090 
1093  break;
1094 
1097  break;
1098 
1101  break;
1102  }
1103  }
1104 
1105  void OnPaint() override
1106  {
1111 
1116 
1117  this->DrawWidgets();
1118  }
1119 
1120  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1121  {
1122  StringID str = STR_JUST_INT;
1123  switch (widget) {
1124  case WID_CS_TEMPERATE: case WID_CS_ARCTIC:
1125  case WID_CS_TROPICAL: case WID_CS_TOYLAND:
1127  size.height += WidgetDimensions::scaled.fullbevel.Vertical();
1128  break;
1129 
1132  str = STR_JUST_DATE_LONG;
1133  break;
1134 
1138  break;
1139 
1142  break;
1143 
1144  default:
1145  return;
1146  }
1148  d.width += padding.width;
1149  d.height += padding.height;
1150  size = maxdim(size, d);
1151  }
1152 
1153  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1154  {
1155  switch (widget) {
1156  case WID_CS_TEMPERATE:
1157  case WID_CS_ARCTIC:
1158  case WID_CS_TROPICAL:
1159  case WID_CS_TOYLAND:
1162  break;
1163 
1164  case WID_CS_MAPSIZE_X_PULLDOWN: // Mapsize X
1166  break;
1167 
1168  case WID_CS_MAPSIZE_Y_PULLDOWN: // Mapsize Y
1170  break;
1171 
1172  case WID_CS_EMPTY_WORLD: // Empty world / flat world
1173  StartGeneratingLandscape(GLWM_SCENARIO);
1174  break;
1175 
1176  case WID_CS_RANDOM_WORLD: // Generate
1178  break;
1179 
1181  case WID_CS_START_DATE_UP: // Year buttons
1182  /* Don't allow too fast scrolling */
1183  if (!(this->flags & WF_TIMEOUT) || this->timeout_timer <= 1) {
1184  this->HandleButtonClick(widget);
1185  this->SetDirty();
1186 
1188  }
1189  _left_button_clicked = false;
1190  break;
1191 
1192  case WID_CS_START_DATE_TEXT: // Year text
1193  this->widget_id = WID_CS_START_DATE_TEXT;
1195  ShowQueryString(STR_JUST_INT, STR_MAPGEN_START_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_NONE);
1196  break;
1197 
1199  case WID_CS_FLAT_LAND_HEIGHT_UP: // Height level buttons
1200  /* Don't allow too fast scrolling */
1201  if (!(this->flags & WF_TIMEOUT) || this->timeout_timer <= 1) {
1202  this->HandleButtonClick(widget);
1203  this->SetDirty();
1204 
1206  }
1207  _left_button_clicked = false;
1208  break;
1209 
1210  case WID_CS_FLAT_LAND_HEIGHT_TEXT: // Height level text
1211  this->widget_id = WID_CS_FLAT_LAND_HEIGHT_TEXT;
1213  ShowQueryString(STR_JUST_INT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT, 4, this, CS_NUMERAL, QSF_NONE);
1214  break;
1215  }
1216  }
1217 
1218  void OnTimeout() override
1219  {
1221  }
1222 
1223  void OnDropdownSelect(WidgetID widget, int index) override
1224  {
1225  switch (widget) {
1228  }
1229  this->SetDirty();
1230  }
1231 
1232  void OnQueryTextFinished(std::optional<std::string> str) override
1233  {
1234  if (!str.has_value() || str->empty()) return;
1235 
1236  int32_t value = atoi(str->c_str());
1237 
1238  switch (this->widget_id) {
1242  break;
1243 
1247  break;
1248  }
1249 
1250  this->SetDirty();
1251  }
1252 };
1253 
1254 static constexpr NWidgetPart _nested_create_scenario_widgets[] = {
1256  NWidget(WWT_CLOSEBOX, COLOUR_BROWN),
1257  NWidget(WWT_CAPTION, COLOUR_BROWN), SetDataTip(STR_SE_MAPGEN_CAPTION, STR_NULL),
1258  EndContainer(),
1259  NWidget(WWT_PANEL, COLOUR_BROWN),
1261  /* Landscape style selection. */
1263  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TEMPERATE), SetDataTip(SPR_SELECT_TEMPERATE, STR_INTRO_TOOLTIP_TEMPERATE),
1264  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_ARCTIC), SetDataTip(SPR_SELECT_SUB_ARCTIC, STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE),
1265  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TROPICAL), SetDataTip(SPR_SELECT_SUB_TROPICAL, STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE),
1266  NWidget(WWT_IMGBTN_2, COLOUR_ORANGE, WID_CS_TOYLAND), SetDataTip(SPR_SELECT_TOYLAND, STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE),
1267  EndContainer(),
1268 
1270  /* Green generation type buttons: 'Flat land' and 'Random land'. */
1272  NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_CS_EMPTY_WORLD), SetDataTip(STR_SE_MAPGEN_FLAT_WORLD, STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP), SetFill(1, 1),
1273  NWidget(WWT_PUSHTXTBTN, COLOUR_GREEN, WID_CS_RANDOM_WORLD), SetDataTip(STR_SE_MAPGEN_RANDOM_LAND, STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND), SetFill(1, 1),
1274  EndContainer(),
1275 
1276  /* Labels + setting drop-downs */
1278  /* Labels. */
1280  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_MAPSIZE, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(0, 1),
1281  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_MAPGEN_DATE_TOOLTIP), SetFill(0, 1),
1282  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_SE_MAPGEN_FLAT_WORLD_HEIGHT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP), SetFill(0, 1),
1283  EndContainer(),
1284 
1286  /* Map size. */
1288  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
1289  NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetFill(0, 1), SetAlignment(SA_CENTER),
1290  NWidget(WWT_DROPDOWN, COLOUR_ORANGE, WID_CS_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_MAPGEN_MAPSIZE_TOOLTIP), SetFill(1, 1),
1291  EndContainer(),
1292 
1293  /* Date. */
1295  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_START_DATE_DOWN), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1296  NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_START_DATE_TEXT), SetFill(1, 1), SetDataTip(STR_JUST_DATE_LONG, STR_MAPGEN_DATE_TOOLTIP),
1297  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_START_DATE_UP), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1298  EndContainer(),
1299 
1300  /* Flat map height. */
1302  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_DOWN), SetFill(0, 1), SetDataTip(SPR_ARROW_DOWN, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1303  NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_TEXT), SetFill(1, 1), SetDataTip(STR_JUST_INT, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP),
1304  NWidget(WWT_IMGBTN, COLOUR_ORANGE, WID_CS_FLAT_LAND_HEIGHT_UP), SetFill(0, 1), SetDataTip(SPR_ARROW_UP, STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP), SetAspect(WidgetDimensions::ASPECT_UP_DOWN_BUTTON),
1305  EndContainer(),
1306  EndContainer(),
1307  EndContainer(),
1308  EndContainer(),
1309  EndContainer(),
1310  EndContainer(),
1311 };
1312 
1313 static WindowDesc _create_scenario_desc(
1314  WDP_CENTER, nullptr, 0, 0,
1316  0,
1317  _nested_create_scenario_widgets
1318 );
1319 
1322 {
1324  new CreateScenarioWindow(_create_scenario_desc, GLWM_SCENARIO);
1325 }
1326 
1327 static constexpr NWidgetPart _nested_generate_progress_widgets[] = {
1328  NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_GENERATION_WORLD, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
1329  NWidget(WWT_PANEL, COLOUR_GREY),
1331  NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_BAR), SetFill(1, 0),
1332  NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GP_PROGRESS_TEXT), SetFill(1, 0),
1333  NWidget(WWT_TEXTBTN, COLOUR_WHITE, WID_GP_ABORT), SetDataTip(STR_GENERATION_ABORT, STR_NULL), SetFill(1, 0),
1334  EndContainer(),
1335  EndContainer(),
1336 };
1337 
1338 
1339 static WindowDesc _generate_progress_desc(
1340  WDP_CENTER, nullptr, 0, 0,
1342  0,
1343  _nested_generate_progress_widgets
1344 );
1345 
1347  uint percent;
1348  StringID cls;
1349  uint current;
1350  uint total;
1351  std::chrono::steady_clock::time_point next_update;
1352 };
1353 
1354 static GenWorldStatus _gws;
1355 
1356 static const StringID _generation_class_table[] = {
1357  STR_GENERATION_WORLD_GENERATION,
1358  STR_GENERATION_LANDSCAPE_GENERATION,
1359  STR_GENERATION_RIVER_GENERATION,
1360  STR_GENERATION_CLEARING_TILES,
1361  STR_GENERATION_TOWN_GENERATION,
1362  STR_GENERATION_INDUSTRY_GENERATION,
1363  STR_GENERATION_OBJECT_GENERATION,
1364  STR_GENERATION_TREE_GENERATION,
1365  STR_GENERATION_SETTINGUP_GAME,
1366  STR_GENERATION_PREPARING_TILELOOP,
1367  STR_GENERATION_PREPARING_SCRIPT,
1368  STR_GENERATION_PREPARING_GAME
1369 };
1370 static_assert(lengthof(_generation_class_table) == GWP_CLASS_COUNT);
1371 
1372 
1373 static void AbortGeneratingWorldCallback(Window *, bool confirmed)
1374 {
1375  if (confirmed) {
1377  } else if (HasModalProgress() && !IsGeneratingWorldAborted()) {
1378  SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE);
1379  }
1380 }
1381 
1383 
1384  GenerateProgressWindow() : Window(_generate_progress_desc)
1385  {
1386  this->InitNested();
1387  }
1388 
1389  void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
1390  {
1391  switch (widget) {
1392  case WID_GP_ABORT:
1393  SetMouseCursorBusy(false);
1394  ShowQuery(
1395  STR_GENERATION_ABORT_CAPTION,
1396  STR_GENERATION_ABORT_MESSAGE,
1397  this,
1398  AbortGeneratingWorldCallback
1399  );
1400  break;
1401  }
1402  }
1403 
1404  void UpdateWidgetSize(WidgetID widget, Dimension &size, [[maybe_unused]] const Dimension &padding, [[maybe_unused]] Dimension &fill, [[maybe_unused]] Dimension &resize) override
1405  {
1406  switch (widget) {
1407  case WID_GP_PROGRESS_BAR: {
1408  SetDParamMaxValue(0, 100);
1409  size = GetStringBoundingBox(STR_GENERATION_PROGRESS);
1410  /* We need some spacing for the 'border' */
1413  break;
1414  }
1415 
1416  case WID_GP_PROGRESS_TEXT:
1417  for (uint i = 0; i < GWP_CLASS_COUNT; i++) {
1418  size.width = std::max(size.width, GetStringBoundingBox(_generation_class_table[i]).width + padding.width);
1419  }
1421  break;
1422  }
1423  }
1424 
1425  void DrawWidget(const Rect &r, WidgetID widget) const override
1426  {
1427  switch (widget) {
1428  case WID_GP_PROGRESS_BAR: {
1429  /* Draw the % complete with a bar and a text */
1430  DrawFrameRect(r, COLOUR_GREY, FR_BORDERONLY | FR_LOWERED);
1431  Rect br = r.Shrink(WidgetDimensions::scaled.bevel);
1432  DrawFrameRect(br.WithWidth(br.Width() * _gws.percent / 100, _current_text_dir == TD_RTL), COLOUR_MAUVE, FR_NONE);
1433  SetDParam(0, _gws.percent);
1434  DrawString(br.left, br.right, CenterBounds(br.top, br.bottom, GetCharacterHeight(FS_NORMAL)), STR_GENERATION_PROGRESS, TC_FROMSTRING, SA_HOR_CENTER);
1435  break;
1436  }
1437 
1438  case WID_GP_PROGRESS_TEXT:
1439  /* Tell which class we are generating */
1440  DrawString(r.left, r.right, r.top, _gws.cls, TC_FROMSTRING, SA_HOR_CENTER);
1441 
1442  /* And say where we are in that class */
1443  SetDParam(0, _gws.current);
1444  SetDParam(1, _gws.total);
1445  DrawString(r.left, r.right, r.top + GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal, STR_GENERATION_PROGRESS_NUM, TC_FROMSTRING, SA_HOR_CENTER);
1446  }
1447  }
1448 };
1449 
1454 {
1455  _gws.cls = STR_GENERATION_WORLD_GENERATION;
1456  _gws.current = 0;
1457  _gws.total = 0;
1458  _gws.percent = 0;
1459  _gws.next_update = std::chrono::steady_clock::now();
1460 }
1461 
1466 {
1467  if (BringWindowToFrontById(WC_MODAL_PROGRESS, 0)) return;
1468  new GenerateProgressWindow();
1469 }
1470 
1471 static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uint total)
1472 {
1473  static const int percent_table[] = {0, 5, 14, 17, 20, 40, 60, 65, 80, 85, 95, 99, 100 };
1474  static_assert(lengthof(percent_table) == GWP_CLASS_COUNT + 1);
1475  assert(cls < GWP_CLASS_COUNT);
1476 
1477  /* Check if we really are generating the world.
1478  * For example, placing trees via the SE also calls this function, but
1479  * shouldn't try to update the progress.
1480  */
1481  if (!HasModalProgress()) return;
1482 
1483  if (IsGeneratingWorldAborted()) {
1485  return;
1486  }
1487 
1488  if (total == 0) {
1489  assert(_gws.cls == _generation_class_table[cls]);
1490  _gws.current += progress;
1491  assert(_gws.current <= _gws.total);
1492  } else {
1493  _gws.cls = _generation_class_table[cls];
1494  _gws.current = progress;
1495  _gws.total = total;
1496  _gws.percent = percent_table[cls];
1497  }
1498 
1499  /* Percentage is about the number of completed tasks, so 'current - 1' */
1500  _gws.percent = percent_table[cls] + (percent_table[cls + 1] - percent_table[cls]) * (_gws.current == 0 ? 0 : _gws.current - 1) / _gws.total;
1501 
1502  if (_network_dedicated) {
1503  static uint last_percent = 0;
1504 
1505  /* Never display 0% */
1506  if (_gws.percent == 0) return;
1507  /* Reset if percent is lower than the last recorded */
1508  if (_gws.percent < last_percent) last_percent = 0;
1509  /* Display every 5%, but 6% is also very valid.. just not smaller steps than 5% */
1510  if (_gws.percent % 5 != 0 && _gws.percent <= last_percent + 5) return;
1511  /* Never show steps smaller than 2%, even if it is a mod 5% */
1512  if (_gws.percent <= last_percent + 2) return;
1513 
1514  Debug(net, 3, "Map generation percentage complete: {}", _gws.percent);
1515  last_percent = _gws.percent;
1516 
1517  return;
1518  }
1519 
1521 
1523 }
1524 
1534 {
1535  if (total == 0) return;
1536 
1537  _SetGeneratingWorldProgress(cls, 0, total);
1538 }
1539 
1548 {
1549  /* In fact the param 'class' isn't needed.. but for some security reasons, we want it around */
1550  _SetGeneratingWorldProgress(cls, 1, 0);
1551 }
ShowNewGRFSettings
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config)
Setup the NewGRF gui.
Definition: newgrf_gui.cpp:2020
Window::timeout_timer
uint8_t timeout_timer
Timer value of the WF_TIMEOUT for flags.
Definition: window_gui.h:309
SetFill
constexpr NWidgetPart SetFill(uint16_t fill_x, uint16_t fill_y)
Widget part function for setting filling.
Definition: widget_type.h:1183
SetMouseCursorBusy
void SetMouseCursorBusy(bool busy)
Set or unset the ZZZ cursor.
Definition: gfx.cpp:1670
CloseWindowByClass
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
Definition: window.cpp:1152
sound_func.h
GameCreationSettings::se_flat_world_height
uint8_t se_flat_world_height
land height a flat world gets in SE
Definition: settings_type.h:366
WID_GL_TOWN_PULLDOWN
@ WID_GL_TOWN_PULLDOWN
Dropdown 'No. of towns'.
Definition: genworld_widget.h:23
WWT_IMGBTN_2
@ WWT_IMGBTN_2
(Toggle) Button with diff image when clicked
Definition: widget_type.h:55
SetBit
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
Definition: bitmath_func.hpp:121
SetWindowDirty
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Definition: window.cpp:3090
querystring_gui.h
ShowQuery
void ShowQuery(StringID caption, StringID 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...
Definition: misc_gui.cpp:1223
SM_START_HEIGHTMAP
@ SM_START_HEIGHTMAP
Load a heightmap and start a new game from it.
Definition: openttd.h:38
GenerateProgressWindow
Definition: genworld_gui.cpp:1382
Dimension
Dimensions (a width and height) of a rectangle in 2D.
Definition: geometry_type.hpp:30
ShowCreateScenario
void ShowCreateScenario()
Show the window to create a scenario.
Definition: genworld_gui.cpp:1321
AbortGeneratingWorld
void AbortGeneratingWorld()
Initializes the abortion process.
Definition: genworld.cpp:252
WidgetDimensions::scaled
static WidgetDimensions scaled
Widget dimensions scaled for current zoom level.
Definition: window_gui.h:68
WID_GL_START_DATE_DOWN
@ WID_GL_START_DATE_DOWN
Decrease start year.
Definition: genworld_widget.h:33
DropDownString< DropDownListItem >::NatSortFunc
static bool NatSortFunc(std::unique_ptr< const DropDownListItem > const &first, std::unique_ptr< const DropDownListItem > const &second)
Natural sorting comparator function for DropDownList::sort().
Definition: dropdown_common_type.h:97
WID_GL_START_DATE_UP
@ WID_GL_START_DATE_UP
Increase start year.
Definition: genworld_widget.h:35
dropdown_func.h
Rect::Shrink
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
Definition: geometry_type.hpp:98
ID_CUSTOM
@ ID_CUSTOM
Custom number of industries.
Definition: settings_type.h:62
WID_GL_TEMPERATE
@ WID_GL_TEMPERATE
Button with icon "Temperate".
Definition: genworld_widget.h:15
FileToSaveLoad::title
std::string title
Internal name of the game.
Definition: saveload.h:407
CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
static const uint CUSTOM_SEA_LEVEL_MIN_PERCENTAGE
Minimum percentage a user can specify for custom sea level.
Definition: genworld.h:48
timer_game_calendar.h
WWT_CAPTION
@ WWT_CAPTION
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:63
WC_SELECT_GAME
@ WC_SELECT_GAME
Select game window; Window numbers:
Definition: window_type.h:448
Window::SetWidgetDirty
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
Definition: window.cpp:551
GameCreationSettings::custom_sea_level
uint8_t custom_sea_level
manually entered percentage of water in the map
Definition: settings_type.h:374
HM_CLOCKWISE
@ HM_CLOCKWISE
Rotate the map clockwise 45 degrees.
Definition: heightmap.h:21
SetAlignment
constexpr NWidgetPart SetAlignment(StringAlignment align)
Widget part function for setting the alignment of text/images.
Definition: widget_type.h:1172
SM_EDITOR
@ SM_EDITOR
Switch to scenario editor.
Definition: openttd.h:31
StringID
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
WWT_IMGBTN
@ WWT_IMGBTN
(Toggle) Button with image
Definition: widget_type.h:54
MIN_MAP_SIZE_BITS
static const uint MIN_MAP_SIZE_BITS
Minimal and maximal map width and height.
Definition: map_type.h:37
FileToSaveLoad::name
std::string name
Name of the file.
Definition: saveload.h:406
GameCreationSettings::desert_coverage
uint8_t desert_coverage
the amount of desert coverage on the map
Definition: settings_type.h:361
DropDownList
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
Definition: dropdown_type.h:50
WID_GL_HEIGHTMAP_HEIGHT_UP
@ WID_GL_HEIGHTMAP_HEIGHT_UP
Increase max. heightmap highest mountain.
Definition: genworld_widget.h:31
_nested_heightmap_load_widgets
static constexpr NWidgetPart _nested_heightmap_load_widgets[]
Widgets of GenerateLandscapeWindow when loading heightmap.
Definition: genworld_gui.cpp:197
NWID_HORIZONTAL
@ NWID_HORIZONTAL
Horizontal container.
Definition: widget_type.h:77
_nested_generate_landscape_widgets
static constexpr NWidgetPart _nested_generate_landscape_widgets[]
Widgets of GenerateLandscapeWindow when generating world.
Definition: genworld_gui.cpp:73
maxdim
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
Definition: geometry_func.cpp:22
LG_ORIGINAL
@ LG_ORIGINAL
The original landscape generator.
Definition: genworld.h:20
WID_GL_MAPSIZE_Y_PULLDOWN
@ WID_GL_MAPSIZE_Y_PULLDOWN
Dropdown 'map Y size'.
Definition: genworld_widget.h:21
GameSettings::difficulty
DifficultySettings difficulty
settings related to the difficulty
Definition: settings_type.h:593
ai_gui.hpp
EndContainer
constexpr NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME,...
Definition: widget_type.h:1193
DifficultySettings::terrain_type
uint8_t terrain_type
the mountainousness of the landscape
Definition: settings_type.h:111
SND_15_BEEP
@ SND_15_BEEP
19 == 0x13 GUI button click
Definition: sound_type.h:58
WID_GL_HEIGHTMAP_NAME_TEXT
@ WID_GL_HEIGHTMAP_NAME_TEXT
Heightmap name.
Definition: genworld_widget.h:47
saveload.h
WC_GENERATE_LANDSCAPE
@ WC_GENERATE_LANDSCAPE
Generate landscape (newgame); Window numbers:
Definition: window_type.h:462
newgrf_townname.h
_settings_client
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:56
WID_GL_WATER_NW
@ WID_GL_WATER_NW
NW 'Water'/'Freeform'.
Definition: genworld_widget.h:58
MIN_CUSTOM_TERRAIN_TYPE
static const uint MIN_CUSTOM_TERRAIN_TYPE
Lowest possible peak value for world generation.
Definition: tile_type.h:27
WWT_EMPTY
@ WWT_EMPTY
Empty widget, place holder to reserve space in widget tree.
Definition: widget_type.h:50
town.h
RectPadding::Vertical
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
Definition: geometry_type.hpp:69
StrongType::Typedef
Templated helper to make a type-safe 'typedef' representing a single POD value.
Definition: strong_typedef_type.hpp:150
WID_CS_MAPSIZE_X_PULLDOWN
@ WID_CS_MAPSIZE_X_PULLDOWN
Pull-down arrow for x map size.
Definition: genworld_widget.h:79
FR_LOWERED
@ FR_LOWERED
If set the frame is lowered and the background colour brighter (ie. buttons when pressed)
Definition: window_gui.h:28
WID_GL_RIVER_PULLDOWN
@ WID_GL_RIVER_PULLDOWN
Dropdown 'Rivers'.
Definition: genworld_widget.h:53
DifficultySettings::number_towns
uint8_t number_towns
the amount of towns
Definition: settings_type.h:101
MAX_TILE_HEIGHT
static const uint MAX_TILE_HEIGHT
Maximum allowed tile height.
Definition: tile_type.h:24
SA_RIGHT
@ SA_RIGHT
Right align the text (must be a single bit).
Definition: gfx_type.h:347
SA_VERT_CENTER
@ SA_VERT_CENTER
Vertically center the text.
Definition: gfx_type.h:351
GameCreationSettings::amount_of_rivers
uint8_t amount_of_rivers
the amount of rivers
Definition: settings_type.h:377
fios.h
GameCreationSettings::landscape
uint8_t landscape
the landscape we're currently in
Definition: settings_type.h:368
StartNewGameWithoutGUI
void StartNewGameWithoutGUI(uint32_t seed)
Start a normal game without the GUI.
Definition: genworld_gui.cpp:1066
NWidgetPart
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:1077
genworld.h
GameCreationSettings::custom_industry_number
uint16_t custom_industry_number
manually entered number of industries
Definition: settings_type.h:371
WID_CS_RANDOM_WORLD
@ WID_CS_RANDOM_WORLD
Generate random land button.
Definition: genworld_widget.h:78
WID_GL_ARCTIC
@ WID_GL_ARCTIC
Button with icon "Arctic".
Definition: genworld_widget.h:16
GameCreationSettings::snow_coverage
uint8_t snow_coverage
the amount of snow coverage on the map
Definition: settings_type.h:360
Debug
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
Definition: debug.h:37
townname_type.h
GameSettings::game_creation
GameCreationSettings game_creation
settings used during the creation of a game (map)
Definition: settings_type.h:594
WN_GAME_OPTIONS_GAME_OPTIONS
@ WN_GAME_OPTIONS_GAME_OPTIONS
Game options.
Definition: window_type.h:26
WindowDesc
High level window description.
Definition: window_gui.h:162
WidgetID
int WidgetID
Widget ID.
Definition: window_type.h:18
RectPadding::Horizontal
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
Definition: geometry_type.hpp:63
WID_GL_AI_BUTTON
@ WID_GL_AI_BUTTON
'AI Settings' button.
Definition: genworld_widget.h:63
Pool::MAX_SIZE
static constexpr size_t MAX_SIZE
Make template parameter accessible from outside.
Definition: pool_type.hpp:84
WC_MODAL_PROGRESS
@ WC_MODAL_PROGRESS
Progress report of landscape generation; Window numbers:
Definition: window_type.h:469
NC_EQUALSIZE
@ NC_EQUALSIZE
Value of the NCB_EQUALSIZE flag.
Definition: widget_type.h:526
PrepareGenerateWorldProgress
void PrepareGenerateWorldProgress()
Initializes the progress counters to the starting point.
Definition: genworld_gui.cpp:1453
SetPadding
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.
Definition: widget_type.h:1230
heightmap.h
CUSTOM_TOWN_MAX_NUMBER
static const uint CUSTOM_TOWN_MAX_NUMBER
this is the maximum number of towns a user can specify in customisation
Definition: town.h:29
ClearErrorMessages
void ClearErrorMessages()
Clear all errors from the queue.
Definition: error_gui.cpp:328
Window::resize
ResizeInfo resize
Resize information.
Definition: window_gui.h:317
GenerateLandscapeWindowMode
GenerateLandscapeWindowMode
Enum for the modes we can generate in.
Definition: genworld_gui.cpp:46
GenerateLandscapeWindow::OnInvalidateData
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
Definition: genworld_gui.cpp:506
GameCreationSettings::heightmap_height
uint8_t heightmap_height
highest mountain for heightmap (towards what it scales)
Definition: settings_type.h:362
ClientSettings::sound
SoundSettings sound
sound effect settings
Definition: settings_type.h:614
WindowNumber
int32_t WindowNumber
Number to differentiate different windows of the same class.
Definition: window_type.h:731
WID_GL_DESERT_COVERAGE_DOWN
@ WID_GL_DESERT_COVERAGE_DOWN
Decrease desert coverage.
Definition: genworld_widget.h:41
GameCreationSettings::water_borders
uint8_t water_borders
bitset of the borders that are water
Definition: settings_type.h:369
WID_GL_GENERATE_BUTTON
@ WID_GL_GENERATE_BUTTON
'Generate' button.
Definition: genworld_widget.h:27
FS_NORMAL
@ FS_NORMAL
Index of the normal font in the font tables.
Definition: gfx_type.h:209
SetMouseCursor
void SetMouseCursor(CursorID sprite, PaletteID pal)
Assign a single non-animated sprite to the cursor.
Definition: gfx.cpp:1686
ShowGenerateLandscape
void ShowGenerateLandscape()
Start with a normal game.
Definition: genworld_gui.cpp:1045
Window::InitNested
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1746
SM_NEWGAME
@ SM_NEWGAME
New Game --> 'Random game'.
Definition: openttd.h:28
GameCreationSettings::custom_town_number
uint16_t custom_town_number
manually entered number of towns
Definition: settings_type.h:370
GenerateLandscapeWindow::OnClick
void OnClick([[maybe_unused]] Point pt, WidgetID widget, [[maybe_unused]] int click_count) override
Definition: genworld_gui.cpp:669
Window::HandleButtonClick
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:590
WID_CS_TROPICAL
@ WID_CS_TROPICAL
Select tropical landscape style.
Definition: genworld_widget.h:75
MAX_MAP_HEIGHT_LIMIT
static const uint MAX_MAP_HEIGHT_LIMIT
Upper bound of maximum allowed heightlevel (in the construction settings)
Definition: tile_type.h:30
game_gui.hpp
Window::SetDirty
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:940
ConstructionSettings::map_height_limit
uint8_t map_height_limit
the maximum allowed heightlevel
Definition: settings_type.h:382
WID_GP_PROGRESS_BAR
@ WID_GP_PROGRESS_BAR
Progress bar.
Definition: genworld_widget.h:91
WID_GL_MAPSIZE_X_PULLDOWN
@ WID_GL_MAPSIZE_X_PULLDOWN
Dropdown 'map X size'.
Definition: genworld_widget.h:20
TimerGameCalendar::ConvertYMDToDate
static Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
Definition: timer_game_calendar.cpp:55
DEF_DESERT_COVERAGE
static const uint DEF_DESERT_COVERAGE
Default desert coverage.
Definition: tile_type.h:37
WWT_PUSHTXTBTN
@ WWT_PUSHTXTBTN
Normal push-button (no toggle button) with text caption.
Definition: widget_type.h:114
WID_GL_SNOW_COVERAGE_TEXT
@ WID_GL_SNOW_COVERAGE_TEXT
Snow coverage.
Definition: genworld_widget.h:38
WID_GL_TOWNNAME_DROPDOWN
@ WID_GL_TOWNNAME_DROPDOWN
Dropdown 'Townnames'.
Definition: genworld_widget.h:24
GameCreationSettings::tgen_smoothness
uint8_t tgen_smoothness
how rough is the terrain from 0-3
Definition: settings_type.h:363
WID_CS_START_DATE_TEXT
@ WID_CS_START_DATE_TEXT
Clickable start date value.
Definition: genworld_widget.h:82
WID_GL_SNOW_COVERAGE_DOWN
@ WID_GL_SNOW_COVERAGE_DOWN
Decrease snow coverage.
Definition: genworld_widget.h:37
WID_CS_START_DATE_UP
@ WID_CS_START_DATE_UP
Increase start year (start later).
Definition: genworld_widget.h:83
dropdown_type.h
WID_GL_DESERT_COVERAGE_UP
@ WID_GL_DESERT_COVERAGE_UP
Increase desert coverage.
Definition: genworld_widget.h:43
CUSTOM_SEA_LEVEL_MAX_PERCENTAGE
static const uint CUSTOM_SEA_LEVEL_MAX_PERCENTAGE
Maximum percentage a user can specify for custom sea level.
Definition: genworld.h:49
HasModalProgress
bool HasModalProgress()
Check if we are currently in a modal progress state.
Definition: progress.h:17
MAP_HEIGHT_LIMIT_AUTO_MINIMUM
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:51
WID_CS_FLAT_LAND_HEIGHT_UP
@ WID_CS_FLAT_LAND_HEIGHT_UP
Increase flat land height.
Definition: genworld_widget.h:86
NWidget
constexpr NWidgetPart NWidget(WidgetType tp, Colours col, WidgetID idx=-1)
Widget part function for starting a new 'real' widget.
Definition: widget_type.h:1311
industry.h
safeguards.h
GenerateLandscapeWindow::OnTimeout
void OnTimeout() override
Called when this window's timeout has been reached.
Definition: genworld_gui.cpp:870
ShowQueryString
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
Definition: misc_gui.cpp:1079
Window::LowerWidget
void LowerWidget(WidgetID widget_index)
Marks a widget as lowered.
Definition: window_gui.h:469
WID_GL_WATER_PULLDOWN
@ WID_GL_WATER_PULLDOWN
Dropdown 'Sea level'.
Definition: genworld_widget.h:52
GameCreationSettings::starting_year
TimerGameCalendar::Year starting_year
starting date
Definition: settings_type.h:353
lengthof
#define lengthof(array)
Return the length of an fixed size array.
Definition: stdafx.h:280
Window::flags
WindowFlags flags
Window flags.
Definition: window_gui.h:303
ConstructionSettings::freeform_edges
bool freeform_edges
allow terraforming the tiles at the map edges
Definition: settings_type.h:395
WF_TIMEOUT
@ WF_TIMEOUT
Window timeout counter.
Definition: window_gui.h:231
CreateScenarioWindow
Definition: genworld_gui.cpp:1074
WID_GL_SMOOTHNESS_PULLDOWN
@ WID_GL_SMOOTHNESS_PULLDOWN
Dropdown 'Smoothness'.
Definition: genworld_widget.h:54
Window::Window
Window(WindowDesc &desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition: window.cpp:1756
Rect::WithWidth
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
Definition: geometry_type.hpp:185
GenWorldStatus
Definition: genworld_gui.cpp:1346
DifficultySettings::quantity_sea_lakes
uint8_t quantity_sea_lakes
the amount of seas/lakes
Definition: settings_type.h:112
GLWM_SCENARIO
@ GLWM_SCENARIO
Generate flat land.
Definition: genworld_gui.cpp:49
Point
Coordinates of a point in 2D.
Definition: geometry_type.hpp:21
error.h
WID_GL_TERRAIN_PULLDOWN
@ WID_GL_TERRAIN_PULLDOWN
Dropdown 'Terrain type'.
Definition: genworld_widget.h:51
TimerGameConst< struct Calendar >::MAX_YEAR
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,...
Definition: timer_game_common.h:173
CenterBounds
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
Definition: gfx_func.h:166
TimerGameConst< struct Calendar >::DEF_START_YEAR
static constexpr TimerGame< struct Calendar >::Year DEF_START_YEAR
The default starting year.
Definition: timer_game_common.h:179
_network_dedicated
bool _network_dedicated
are we a dedicated server?
Definition: network.cpp:68
stdafx.h
SM_GENRANDLAND
@ SM_GENRANDLAND
Generate random land within scenario editor.
Definition: openttd.h:36
Window::window_number
WindowNumber window_number
Window number within the window class.
Definition: window_gui.h:305
WID_GL_HEIGHTMAP_HEIGHT_DOWN
@ WID_GL_HEIGHTMAP_HEIGHT_DOWN
Decrease heightmap highest mountain.
Definition: genworld_widget.h:29
ShowGSConfigWindow
void ShowGSConfigWindow()
Open the GS config window.
Definition: game_gui.cpp:445
IncreaseGeneratingWorldProgress
void IncreaseGeneratingWorldProgress(GenWorldProgress cls)
Increases the current stage of the world generation with one.
Definition: genworld_gui.cpp:1547
Window::InvalidateData
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
Definition: window.cpp:3148
VideoDriver::GetInstance
static VideoDriver * GetInstance()
Get the currently active instance of the video driver.
Definition: video_driver.hpp:201
WC_NONE
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:45
WID_GL_CLIMATE_SEL_SELECTOR
@ WID_GL_CLIMATE_SEL_SELECTOR
NWID_SELECTION for snow or desert coverage selector.
Definition: genworld_widget.h:68
SA_HOR_CENTER
@ SA_HOR_CENTER
Horizontally center the text.
Definition: gfx_type.h:346
Window::SetWidgetLoweredState
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition: window_gui.h:450
BUILTIN_TOWNNAME_GENERATOR_COUNT
static constexpr uint BUILTIN_TOWNNAME_GENERATOR_COUNT
Number of built-in town name generators.
Definition: townname_type.h:22
WID_GL_SNOW_COVERAGE_UP
@ WID_GL_SNOW_COVERAGE_UP
Increase snow coverage.
Definition: genworld_widget.h:39
ShowHeightmapLoad
void ShowHeightmapLoad()
Start with loading a heightmap.
Definition: genworld_gui.cpp:1051
GetHeightmapDimensions
bool GetHeightmapDimensions(DetailedFileType dft, const char *filename, uint *x, uint *y)
Get the dimensions of a heightmap.
Definition: heightmap.cpp:488
NWID_VERTICAL
@ NWID_VERTICAL
Vertical container.
Definition: widget_type.h:79
SetNewLandscapeType
void SetNewLandscapeType(uint8_t landscape)
Changes landscape type and sets genworld window dirty.
Definition: genworld_gui.cpp:65
WidgetDimensions::unscaled
static const WidgetDimensions unscaled
Unscaled widget dimensions.
Definition: window_gui.h:67
DifficultySettings::industry_density
uint8_t industry_density
The industry density.
Definition: settings_type.h:102
Window::SetWidgetDisabledState
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Definition: window_gui.h:390
SM_LOAD_HEIGHTMAP
@ SM_LOAD_HEIGHTMAP
Load heightmap from scenario editor.
Definition: openttd.h:39
WWT_CLOSEBOX
@ WWT_CLOSEBOX
Close box (at top-left of a window)
Definition: widget_type.h:71
GenWorldProgress
GenWorldProgress
Current stage of world generation process.
Definition: genworld.h:69
VideoDriver::GameLoopPause
void GameLoopPause()
Pause the game-loop for a bit, releasing the game-state lock.
Definition: video_driver.cpp:66
WID_GL_VARIETY_PULLDOWN
@ WID_GL_VARIETY_PULLDOWN
Dropdown 'Variety distribution'.
Definition: genworld_widget.h:55
WID_CS_MAPSIZE_Y_PULLDOWN
@ WID_CS_MAPSIZE_Y_PULLDOWN
Pull-down arrow for y map size.
Definition: genworld_widget.h:80
WID_GL_HEIGHTMAP_HEIGHT_TEXT
@ WID_GL_HEIGHTMAP_HEIGHT_TEXT
Max. heightmap highest mountain.
Definition: genworld_widget.h:30
string_func.h
MIN_HEIGHTMAP_HEIGHT
static const uint MIN_HEIGHTMAP_HEIGHT
Lowest possible peak value for heightmap creation.
Definition: tile_type.h:26
WID_GP_ABORT
@ WID_GP_ABORT
Abort button.
Definition: genworld_widget.h:93
_switch_mode
SwitchMode _switch_mode
The next mainloop command.
Definition: gfx.cpp:49
GLWM_HEIGHTMAP
@ GLWM_HEIGHTMAP
Load from heightmap.
Definition: genworld_gui.cpp:48
SoundSettings::confirm
bool confirm
Play sound effect on successful constructions or other actions.
Definition: settings_type.h:248
WC_GAME_OPTIONS
@ WC_GAME_OPTIONS
Game options window; Window numbers:
Definition: window_type.h:618
WID_GL_HEIGHTMAP_ROTATION_PULLDOWN
@ WID_GL_HEIGHTMAP_ROTATION_PULLDOWN
Dropdown 'Heightmap rotation'.
Definition: genworld_widget.h:49
strings_func.h
WID_GL_WATER_NE
@ WID_GL_WATER_NE
NE 'Water'/'Freeform'.
Definition: genworld_widget.h:59
WID_GL_GS_BUTTON
@ WID_GL_GS_BUTTON
'Game Script Settings' button.
Definition: genworld_widget.h:64
WID_GL_NEWGRF_BUTTON
@ WID_GL_NEWGRF_BUTTON
'NewGRF Settings' button.
Definition: genworld_widget.h:65
GameCreationSettings::generation_seed
uint32_t generation_seed
noise seed for world generation
Definition: settings_type.h:352
MIN_MAP_HEIGHT_LIMIT
static const uint MIN_MAP_HEIGHT_LIMIT
Lower bound of maximum allowed heightlevel (in the construction settings)
Definition: tile_type.h:29
MAX_MAP_SIZE_BITS
static const uint MAX_MAP_SIZE_BITS
Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS.
Definition: map_type.h:38
Pool::PoolItem<&_town_pool >::GetNumItems
static size_t GetNumItems()
Returns number of valid items in the pool.
Definition: pool_type.hpp:369
ShowGenerateWorldProgress
void ShowGenerateWorldProgress()
Show the window where a user can follow the process of the map generation.
Definition: genworld_gui.cpp:1465
HandleGeneratingWorldAbortion
void HandleGeneratingWorldAbortion()
Really handle the abortion, i.e.
Definition: genworld.cpp:269
GameCreationSettings::map_y
uint8_t map_y
Y size of map.
Definition: settings_type.h:356
GameCreationSettings::map_x
uint8_t map_x
X size of map.
Definition: settings_type.h:355
WWT_TEXT
@ WWT_TEXT
Pure simple text.
Definition: widget_type.h:60
SetPIP
constexpr NWidgetPart SetPIP(uint8_t pre, uint8_t inter, uint8_t post)
Widget part function for setting a pre/inter/post spaces.
Definition: widget_type.h:1262
WID_CS_TEMPERATE
@ WID_CS_TEMPERATE
Select temperate landscape style.
Definition: genworld_widget.h:73
SetDParamMaxValue
void SetDParamMaxValue(size_t n, uint64_t max_value, uint min_count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
Definition: strings.cpp:127
video_driver.hpp
SetDParam
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings.cpp:104
geometry_func.hpp
CreateScenarioWindow::OnTimeout
void OnTimeout() override
Called when this window's timeout has been reached.
Definition: genworld_gui.cpp:1218
InvalidateWindowClassesData
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:3225
_file_to_saveload
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
Definition: saveload.cpp:60
GenerateLandscapeWindow
Definition: genworld_gui.cpp:387
WWT_PANEL
@ WWT_PANEL
Simple depressed panel.
Definition: widget_type.h:52
WidgetDimensions::vsep_normal
int vsep_normal
Normal vertical spacing.
Definition: window_gui.h:60
CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY
static const uint CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY
Value for custom terrain type in difficulty settings.
Definition: genworld.h:45
WID_GL_INDUSTRY_PULLDOWN
@ WID_GL_INDUSTRY_PULLDOWN
Dropdown 'No. of industries'.
Definition: genworld_widget.h:25
ShowDropDownMenu
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
WID_GL_WATER_SE
@ WID_GL_WATER_SE
SE 'Water'/'Freeform'.
Definition: genworld_widget.h:60
TimerGameConst< struct Calendar >::MIN_YEAR
static constexpr TimerGame< struct Calendar >::Year MIN_YEAR
The absolute minimum year in OTTD.
Definition: timer_game_common.h:176
GLWM_GENERATE
@ GLWM_GENERATE
Generate new game.
Definition: genworld_gui.cpp:47
progress.h
SetDParamStr
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:344
GameCreationSettings::town_name
uint8_t town_name
the town name generator used for town names
Definition: settings_type.h:367
WID_GL_DESERT_COVERAGE_TEXT
@ WID_GL_DESERT_COVERAGE_TEXT
Desert coverage.
Definition: genworld_widget.h:42
ShowDropDownList
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
NWID_SPACER
@ NWID_SPACER
Invisible widget that takes some space.
Definition: widget_type.h:81
WID_GL_BORDERS_RANDOM
@ WID_GL_BORDERS_RANDOM
'Random'/'Manual' borders.
Definition: genworld_widget.h:57
WID_GL_HEIGHTMAP_SIZE_TEXT
@ WID_GL_HEIGHTMAP_SIZE_TEXT
Size of heightmap.
Definition: genworld_widget.h:48
WidgetDimensions::fullbevel
RectPadding fullbevel
Always-scaled bevel thickness.
Definition: window_gui.h:41
WID_GL_CLIMATE_SEL_LABEL
@ WID_GL_CLIMATE_SEL_LABEL
NWID_SELECTION for snow or desert coverage label.
Definition: genworld_widget.h:67
WID_CS_START_DATE_DOWN
@ WID_CS_START_DATE_DOWN
Decrease start year (start earlier).
Definition: genworld_widget.h:81
GameCreationSettings::heightmap_rotation
uint8_t heightmap_rotation
rotation director for the heightmap
Definition: settings_type.h:365
Window::RaiseWidget
void RaiseWidget(WidgetID widget_index)
Marks a widget as raised.
Definition: window_gui.h:478
DrawFrameRect
void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags)
Draw frame rectangle.
Definition: widget.cpp:281
network.h
WID_CS_FLAT_LAND_HEIGHT_DOWN
@ WID_CS_FLAT_LAND_HEIGHT_DOWN
Decrease flat land height.
Definition: genworld_widget.h:84
window_func.h
SA_CENTER
@ SA_CENTER
Center both horizontally and vertically.
Definition: gfx_type.h:355
GetCharacterHeight
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
Definition: fontcache.cpp:77
Window::width
int width
width of the window (number of pixels to the right in x direction)
Definition: window_gui.h:314
SetPIPRatio
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.
Definition: widget_type.h:1274
random_func.hpp
WID_CS_EMPTY_WORLD
@ WID_CS_EMPTY_WORLD
Generate an empty flat world.
Definition: genworld_widget.h:77
WID_GL_START_DATE_TEXT
@ WID_GL_START_DATE_TEXT
Start year.
Definition: genworld_widget.h:34
IsGeneratingWorldAborted
bool IsGeneratingWorldAborted()
Is the generation being aborted?
Definition: genworld.cpp:261
WID_GL_TOYLAND
@ WID_GL_TOYLAND
Button with icon "Toyland".
Definition: genworld_widget.h:18
DrawString
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
GetStringListBoundingBox
Dimension GetStringListBoundingBox(std::span< const StringID > list, FontSize fontsize)
Get maximum dimension of a list of strings.
Definition: gfx.cpp:889
StartScenarioEditor
void StartScenarioEditor()
Start with a scenario editor.
Definition: genworld_gui.cpp:1057
ID_END
@ ID_END
Number of industry density settings.
Definition: settings_type.h:64
Window::RaiseWidgetsWhenLowered
void RaiseWidgetsWhenLowered(Args... widgets)
Raises the widgets and sets widgets dirty that are lowered.
Definition: window_gui.h:545
SetGeneratingWorldProgress
void SetGeneratingWorldProgress(GenWorldProgress cls, uint total)
Set the total of a stage of the world generation.
Definition: genworld_gui.cpp:1533
WidgetDimensions::frametext
RectPadding frametext
Padding inside frame with text.
Definition: window_gui.h:43
GameSettings::construction
ConstructionSettings construction
construction of things in-game
Definition: settings_type.h:595
GameCreationSettings::land_generator
uint8_t land_generator
the landscape generator
Definition: settings_type.h:357
CloseAllNonVitalWindows
void CloseAllNonVitalWindows()
It is possible that a stickied window gets to a position where the 'close' button is outside the gami...
Definition: window.cpp:3269
Window
Data structure for an opened window.
Definition: window_gui.h:276
FileToSaveLoad::detail_ftype
DetailedFileType detail_ftype
Concrete file type (PNG, BMP, old save, etc).
Definition: saveload.h:404
GetMapHeightLimit
static uint GetMapHeightLimit()
Get the map height limit, or if set to "auto", the absolute limit.
Definition: genworld_gui.cpp:55
WID_CS_TOYLAND
@ WID_CS_TOYLAND
Select toy-land landscape style.
Definition: genworld_widget.h:76
ResetGRFConfig
void ResetGRFConfig(bool defaults)
Reset the current GRF Config to either blank or newgame settings.
Definition: newgrf_config.cpp:447
GameCreationSettings::custom_terrain_type
uint8_t custom_terrain_type
manually entered height for TGP to aim for
Definition: settings_type.h:373
Window::DrawWidgets
void DrawWidgets() const
Paint all widgets of a window.
Definition: widget.cpp:731
Clamp
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
Definition: math_func.hpp:79
MAX_MAP_SIZE
static const uint MAX_MAP_SIZE
Maximal map size = 4096.
Definition: map_type.h:40
SetDataTip
constexpr NWidgetPart SetDataTip(uint32_t data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1204
SetMinimalTextLines
constexpr NWidgetPart SetMinimalTextLines(uint8_t lines, uint8_t spacing, FontSize size=FS_NORMAL)
Widget part function for setting the minimal text lines.
Definition: widget_type.h:1151
Rect::Width
int Width() const
Get width of Rect.
Definition: geometry_type.hpp:85
NWID_SELECTION
@ NWID_SELECTION
Stacked widgets, only one visible at a time (eg in a panel with tabs).
Definition: widget_type.h:82
WID_CS_FLAT_LAND_HEIGHT_TEXT
@ WID_CS_FLAT_LAND_HEIGHT_TEXT
Clickable flat land height value.
Definition: genworld_widget.h:85
CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY
static const uint CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY
Value for custom sea level in difficulty settings.
Definition: genworld.h:47
ShowAIConfigWindow
void ShowAIConfigWindow()
Open the AI config window.
Definition: ai_gui.cpp:324
WID_GL_TROPICAL
@ WID_GL_TROPICAL
Button with icon "Tropical".
Definition: genworld_widget.h:17
Rect
Specification of a rectangle with absolute coordinates of all edges.
Definition: geometry_type.hpp:75
BringWindowToFrontById
Window * BringWindowToFrontById(WindowClass cls, WindowNumber number)
Find a window and make it the relative top-window on the screen.
Definition: window.cpp:1223
SetAspect
constexpr NWidgetPart SetAspect(float ratio, AspectFlags flags=AspectFlags::ResizeX)
Widget part function for setting the aspect ratio.
Definition: widget_type.h:1297
Window::SetWidgetsDisabledState
void SetWidgetsDisabledState(bool disab_stat, Args... widgets)
Sets the enabled/disabled status of a list of widgets.
Definition: window_gui.h:524
QSF_ENABLE_DEFAULT
@ QSF_ENABLE_DEFAULT
enable the 'Default' button ("\0" is returned)
Definition: textbuf_gui.h:21
CreateScenarioWindow::OnPaint
void OnPaint() override
The window must be repainted.
Definition: genworld_gui.cpp:1105
WDP_CENTER
@ WDP_CENTER
Center the window.
Definition: window_gui.h:151
WID_CS_ARCTIC
@ WID_CS_ARCTIC
Select arctic landscape style.
Definition: genworld_widget.h:74
_left_button_clicked
bool _left_button_clicked
Is left mouse button clicked?
Definition: gfx.cpp:42
TD_RTL
@ TD_RTL
Text is written right-to-left by default.
Definition: strings_type.h:24
_current_text_dir
TextDirection _current_text_dir
Text direction of the currently selected language.
Definition: strings.cpp:56
GameCreationSettings::variety
uint8_t variety
variety level applied to TGP
Definition: settings_type.h:372
SetTextStyle
constexpr NWidgetPart SetTextStyle(TextColour colour, FontSize size=FS_NORMAL)
Widget part function for setting the text style.
Definition: widget_type.h:1162
CS_NUMERAL
@ CS_NUMERAL
Only numeric ones.
Definition: string_type.h:26
ToggleBit
constexpr T ToggleBit(T &x, const uint8_t y)
Toggles a bit in a variable.
Definition: bitmath_func.hpp:181
CUSTOM_TOWN_NUMBER_DIFFICULTY
static const uint CUSTOM_TOWN_NUMBER_DIFFICULTY
value for custom town number in difficulty settings
Definition: town.h:28
GetStringBoundingBox
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
Definition: gfx.cpp:851
WID_GP_PROGRESS_TEXT
@ WID_GP_PROGRESS_TEXT
Text with the progress bar.
Definition: genworld_widget.h:92
genworld_widget.h
_settings_newgame
GameSettings _settings_newgame
Game settings for new games (updated from the intro screen).
Definition: settings.cpp:58
WWT_TEXTBTN
@ WWT_TEXTBTN
(Toggle) Button with text
Definition: widget_type.h:57
debug.h
FR_BORDERONLY
@ FR_BORDERONLY
Draw border only, no background.
Definition: window_gui.h:27
_grfconfig_newgame
GRFConfig * _grfconfig_newgame
First item in list of default GRF set up.
Definition: newgrf_config.cpp:165
WWT_DROPDOWN
@ WWT_DROPDOWN
Drop down list.
Definition: widget_type.h:72
WID_GL_WATER_SW
@ WID_GL_WATER_SW
SW 'Water'/'Freeform'.
Definition: genworld_widget.h:61
dropdown_common_type.h
DEF_SNOW_COVERAGE
static const uint DEF_SNOW_COVERAGE
Default snow coverage.
Definition: tile_type.h:36
HasBit
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
Definition: bitmath_func.hpp:103