src/genworld_gui.cpp
changeset 5901 ab59510b0c9c
parent 5899 6f5ece1805fe
child 6179 d19b0137d8e4
equal deleted inserted replaced
5900:135d10dd7219 5901:ab59510b0c9c
    22 #include "network/network.h"
    22 #include "network/network.h"
    23 #include "thread.h"
    23 #include "thread.h"
    24 #include "date.h"
    24 #include "date.h"
    25 #include "newgrf_config.h"
    25 #include "newgrf_config.h"
    26 
    26 
    27 enum {
       
    28 	START_DATE_QUERY,
       
    29 	SNOW_LINE_QUERY,
       
    30 	FLAT_WORLD_HEIGHT_QUERY,
       
    31 
       
    32 	LEN_RND_SEED = 11,
       
    33 	SEED_EDIT    = 15,
       
    34 };
       
    35 
       
    36 /**
    27 /**
    37  * In what 'mode' the GenerateLandscapeWindowProc is.
    28  * In what 'mode' the GenerateLandscapeWindowProc is.
    38  */
    29  */
    39 typedef enum glwp_modes {
    30 typedef enum glwp_modes {
    40 	GLWP_GENERATE,
    31 	GLWP_GENERATE,
    54 	_opt_newgame.landscape = landscape;
    45 	_opt_newgame.landscape = landscape;
    55 	InvalidateWindowClasses(WC_SELECT_GAME);
    46 	InvalidateWindowClasses(WC_SELECT_GAME);
    56 	InvalidateWindowClasses(WC_GENERATE_LANDSCAPE);
    47 	InvalidateWindowClasses(WC_GENERATE_LANDSCAPE);
    57 }
    48 }
    58 
    49 
       
    50 enum GenerateLandscapeWindowWidgets {
       
    51 	GLAND_TEMPERATE = 3,
       
    52 	GLAND_ARCTIC,
       
    53 	GLAND_TROPICAL,
       
    54 	GLAND_TOYLAND,
       
    55 
       
    56 	GLAND_MAPSIZE_X_TEXT,
       
    57 	GLAND_MAPSIZE_X_PULLDOWN,
       
    58 	GLAND_MAPSIZE_Y_TEXT,
       
    59 	GLAND_MAPSIZE_Y_PULLDOWN,
       
    60 
       
    61 	GLAND_TOWN_TEXT,
       
    62 	GLAND_TOWN_PULLDOWN,
       
    63 	GLAND_INDUSTRY_TEXT,
       
    64 	GLAND_INDUSTRY_PULLDOWN,
       
    65 
       
    66 	GLAND_RANDOM_EDITBOX,
       
    67 	GLAND_RANDOM_BUTTON,
       
    68 
       
    69 	GLAND_GENERATE_BUTTON,
       
    70 
       
    71 	GLAND_START_DATE_DOWN,
       
    72 	GLAND_START_DATE_TEXT,
       
    73 	GLAND_START_DATE_UP,
       
    74 
       
    75 	GLAND_SNOW_LEVEL_DOWN,
       
    76 	GLAND_SNOW_LEVEL_TEXT,
       
    77 	GLAND_SNOW_LEVEL_UP,
       
    78 
       
    79 	GLAND_TREE_TEXT,
       
    80 	GLAND_TREE_PULLDOWN,
       
    81 	GLAND_LANDSCAPE_TEXT,
       
    82 	GLAND_LANDSCAPE_PULLDOWN,
       
    83 	GLAND_HEIGHTMAP_ROTATION_TEXT = GLAND_LANDSCAPE_TEXT,
       
    84 	GLAND_HEIGHTMAP_ROTATION_PULLDOWN = GLAND_LANDSCAPE_PULLDOWN,
       
    85 
       
    86 	GLAND_TERRAIN_TEXT,
       
    87 	GLAND_TERRAIN_PULLDOWN,
       
    88 	GLAND_WATER_TEXT,
       
    89 	GLAND_WATER_PULLDOWN,
       
    90 	GLAND_SMOOTHNESS_TEXT,
       
    91 	GLAND_SMOOTHNESS_PULLDOWN
       
    92 };
       
    93 
    59 static const Widget _generate_landscape_widgets[] = {
    94 static const Widget _generate_landscape_widgets[] = {
    60 {  WWT_CLOSEBOX,  RESIZE_NONE, 13,   0,  10,   0,  13, STR_00C5,                     STR_018B_CLOSE_WINDOW},
    95 {  WWT_CLOSEBOX,  RESIZE_NONE, 13,   0,  10,   0,  13, STR_00C5,                     STR_018B_CLOSE_WINDOW},
    61 {    WWT_CAPTION, RESIZE_NONE, 13,  11, 337,   0,  13, STR_WORLD_GENERATION_CAPTION, STR_NULL},
    96 {    WWT_CAPTION, RESIZE_NONE, 13,  11, 337,   0,  13, STR_WORLD_GENERATION_CAPTION, STR_NULL},
    62 {      WWT_PANEL, RESIZE_NONE, 13,   0, 337,  14, 267, 0x0,                          STR_NULL},
    97 {      WWT_PANEL, RESIZE_NONE, 13,   0, 337,  14, 267, 0x0,                          STR_NULL},
    63 
    98 
    89 {      WWT_PANEL, RESIZE_NONE, 12, 294, 314, 130, 141, 0x0,                          STR_NULL},
   124 {      WWT_PANEL, RESIZE_NONE, 12, 294, 314, 130, 141, 0x0,                          STR_NULL},
    90 {     WWT_IMGBTN, RESIZE_NONE, 12, 315, 326, 130, 141, SPR_ARROW_UP,                 STR_SNOW_LINE_UP},
   125 {     WWT_IMGBTN, RESIZE_NONE, 12, 315, 326, 130, 141, SPR_ARROW_UP,                 STR_SNOW_LINE_UP},
    91 
   126 
    92 {      WWT_PANEL, RESIZE_NONE, 12, 114, 219, 192, 203, 0x0,                          STR_NULL},
   127 {      WWT_PANEL, RESIZE_NONE, 12, 114, 219, 192, 203, 0x0,                          STR_NULL},
    93 {    WWT_TEXTBTN, RESIZE_NONE, 12, 220, 231, 192, 203, STR_0225,                     STR_NULL}, // Tree placer
   128 {    WWT_TEXTBTN, RESIZE_NONE, 12, 220, 231, 192, 203, STR_0225,                     STR_NULL}, // Tree placer
    94 
       
    95 {      WWT_PANEL, RESIZE_NONE, 12, 114, 219, 174, 185, 0x0,                          STR_NULL},
   129 {      WWT_PANEL, RESIZE_NONE, 12, 114, 219, 174, 185, 0x0,                          STR_NULL},
    96 {    WWT_TEXTBTN, RESIZE_NONE, 12, 220, 231, 174, 185, STR_0225,                     STR_NULL}, // Landscape generator
   130 {    WWT_TEXTBTN, RESIZE_NONE, 12, 220, 231, 174, 185, STR_0225,                     STR_NULL}, // Landscape generator
    97 {      WWT_PANEL, RESIZE_NONE, 12, 114, 219, 210, 221, 0x0,                          STR_NULL},
   131 {      WWT_PANEL, RESIZE_NONE, 12, 114, 219, 210, 221, 0x0,                          STR_NULL},
    98 {    WWT_TEXTBTN, RESIZE_NONE, 12, 220, 231, 210, 221, STR_0225,                     STR_NULL}, // Terrain type
   132 {    WWT_TEXTBTN, RESIZE_NONE, 12, 220, 231, 210, 221, STR_0225,                     STR_NULL}, // Terrain type
    99 {      WWT_PANEL, RESIZE_NONE, 12, 113, 219, 228, 239, 0x0,                          STR_NULL},
   133 {      WWT_PANEL, RESIZE_NONE, 12, 113, 219, 228, 239, 0x0,                          STR_NULL},
   180 	static const StringID num_towns[]   = {STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
   214 	static const StringID num_towns[]   = {STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
   181 	static const StringID num_inds[]    = {STR_26816_NONE, STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
   215 	static const StringID num_inds[]    = {STR_26816_NONE, STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
   182 
   216 
   183 	/* Data used for the generate seed edit box */
   217 	/* Data used for the generate seed edit box */
   184 	static querystr_d _genseed_query;
   218 	static querystr_d _genseed_query;
   185 	static char _genseed_buffer[LEN_RND_SEED];
   219 	static char _genseed_buffer[11];
   186 
   220 
   187 	glwp_modes mode = (glwp_modes)w->window_number;
   221 	glwp_modes mode = (glwp_modes)w->window_number;
   188 	uint y;
   222 	uint y;
   189 
   223 
   190 	switch (e->event) {
   224 	switch (e->event) {
   191 	case WE_CREATE:
   225 	case WE_CREATE:
   192 		LowerWindowWidget(w, _opt_newgame.landscape + 3);
   226 		LowerWindowWidget(w, _opt_newgame.landscape + GLAND_TEMPERATE);
   193 
   227 
   194 		snprintf(_genseed_buffer, sizeof(_genseed_buffer), "%u", _patches_newgame.generation_seed);
   228 		snprintf(_genseed_buffer, sizeof(_genseed_buffer), "%u", _patches_newgame.generation_seed);
   195 		InitializeTextBuffer(&_genseed_query.text, _genseed_buffer, lengthof(_genseed_buffer), 120);
   229 		InitializeTextBuffer(&_genseed_query.text, _genseed_buffer, lengthof(_genseed_buffer), 120);
   196 		_genseed_query.caption = STR_NULL;
   230 		_genseed_query.caption = STR_NULL;
   197 		_genseed_query.afilter = CS_NUMERAL;
   231 		_genseed_query.afilter = CS_NUMERAL;
   198 		break;
   232 		break;
   199 
   233 
   200 	case WE_PAINT:
   234 	case WE_PAINT:
   201 		/* You can't select smoothness if not terragenesis */
   235 		/* You can't select smoothness if not terragenesis */
   202 		if (mode == GLWP_GENERATE) {
   236 		if (mode == GLWP_GENERATE) {
   203 			SetWindowWidgetDisabledState(w, 32, _patches_newgame.land_generator == 0);
   237 			SetWindowWidgetDisabledState(w, GLAND_SMOOTHNESS_TEXT,     _patches_newgame.land_generator == 0);
   204 			SetWindowWidgetDisabledState(w, 33, _patches_newgame.land_generator == 0);
   238 			SetWindowWidgetDisabledState(w, GLAND_SMOOTHNESS_PULLDOWN, _patches_newgame.land_generator == 0);
   205 		}
   239 		}
   206 		/* Disable snowline if not hilly */
   240 		/* Disable snowline if not hilly */
   207 		SetWindowWidgetDisabledState(w, 22, _opt_newgame.landscape != LT_HILLY);
   241 		SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_TEXT, _opt_newgame.landscape != LT_HILLY);
   208 		/* Disable town and industry in SE */
   242 		/* Disable town, industry and trees in SE */
   209 		SetWindowWidgetDisabledState(w, 11, _game_mode == GM_EDITOR);
   243 		SetWindowWidgetDisabledState(w, GLAND_TOWN_TEXT,         _game_mode == GM_EDITOR);
   210 		SetWindowWidgetDisabledState(w, 12, _game_mode == GM_EDITOR);
   244 		SetWindowWidgetDisabledState(w, GLAND_TOWN_PULLDOWN,     _game_mode == GM_EDITOR);
   211 		SetWindowWidgetDisabledState(w, 13, _game_mode == GM_EDITOR);
   245 		SetWindowWidgetDisabledState(w, GLAND_INDUSTRY_TEXT,     _game_mode == GM_EDITOR);
   212 		SetWindowWidgetDisabledState(w, 14, _game_mode == GM_EDITOR);
   246 		SetWindowWidgetDisabledState(w, GLAND_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
   213 		SetWindowWidgetDisabledState(w, 24, _game_mode == GM_EDITOR);
   247 		SetWindowWidgetDisabledState(w, GLAND_TREE_TEXT,         _game_mode == GM_EDITOR);
   214 		SetWindowWidgetDisabledState(w, 25, _game_mode == GM_EDITOR);
   248 		SetWindowWidgetDisabledState(w, GLAND_TREE_PULLDOWN,     _game_mode == GM_EDITOR);
   215 
   249 
   216 		SetWindowWidgetDisabledState(w, 18, _patches_newgame.starting_year <= MIN_YEAR);
   250 		SetWindowWidgetDisabledState(w, GLAND_START_DATE_DOWN, _patches_newgame.starting_year <= MIN_YEAR);
   217 		SetWindowWidgetDisabledState(w, 20, _patches_newgame.starting_year >= MAX_YEAR);
   251 		SetWindowWidgetDisabledState(w, GLAND_START_DATE_UP,   _patches_newgame.starting_year >= MAX_YEAR);
   218 		SetWindowWidgetDisabledState(w, 21, _patches_newgame.snow_line_height <= 2 || _opt_newgame.landscape != LT_HILLY);
   252 		SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_DOWN, _patches_newgame.snow_line_height <= 2 || _opt_newgame.landscape != LT_HILLY);
   219 		SetWindowWidgetDisabledState(w, 23, _patches_newgame.snow_line_height >= 13 || _opt_newgame.landscape != LT_HILLY);
   253 		SetWindowWidgetDisabledState(w, GLAND_SNOW_LEVEL_UP,   _patches_newgame.snow_line_height >= 13 || _opt_newgame.landscape != LT_HILLY);
   220 
   254 
   221 		SetWindowWidgetLoweredState(w, 3, _opt_newgame.landscape == LT_NORMAL);
   255 		SetWindowWidgetLoweredState(w, GLAND_TEMPERATE, _opt_newgame.landscape == LT_NORMAL);
   222 		SetWindowWidgetLoweredState(w, 4, _opt_newgame.landscape == LT_HILLY);
   256 		SetWindowWidgetLoweredState(w, GLAND_ARCTIC,    _opt_newgame.landscape == LT_HILLY);
   223 		SetWindowWidgetLoweredState(w, 5, _opt_newgame.landscape == LT_DESERT);
   257 		SetWindowWidgetLoweredState(w, GLAND_TROPICAL,  _opt_newgame.landscape == LT_DESERT);
   224 		SetWindowWidgetLoweredState(w, 6, _opt_newgame.landscape == LT_CANDY);
   258 		SetWindowWidgetLoweredState(w, GLAND_TOYLAND,   _opt_newgame.landscape == LT_CANDY);
   225 		DrawWindowWidgets(w);
   259 		DrawWindowWidgets(w);
   226 
   260 
   227 		y = (mode == GLWP_HEIGHTMAP) ? 22 : 0;
   261 		y = (mode == GLWP_HEIGHTMAP) ? 22 : 0;
   228 
   262 
   229 		DrawString( 12,  91 + y, STR_MAPSIZE, 0);
   263 		DrawString( 12,  91 + y, STR_MAPSIZE, 0);
   240 			DrawString(118, 113 + y, num_towns[_opt_newgame.diff.number_towns], 0x10);
   274 			DrawString(118, 113 + y, num_towns[_opt_newgame.diff.number_towns], 0x10);
   241 			DrawString(118, 131 + y, num_inds[_opt_newgame.diff.number_industries], 0x10);
   275 			DrawString(118, 131 + y, num_inds[_opt_newgame.diff.number_industries], 0x10);
   242 		}
   276 		}
   243 
   277 
   244 		DrawString( 12, 153 + y, STR_RANDOM_SEED, 0);
   278 		DrawString( 12, 153 + y, STR_RANDOM_SEED, 0);
   245 		DrawEditBox(w, &_genseed_query, SEED_EDIT);
   279 		DrawEditBox(w, &_genseed_query, GLAND_RANDOM_EDITBOX);
   246 
   280 
   247 		DrawString(182, 113 + y, STR_DATE, 0);
   281 		DrawString(182, 113 + y, STR_DATE, 0);
   248 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
   282 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
   249 		DrawStringCentered(271, 113 + y, STR_GENERATE_DATE, 0);
   283 		DrawStringCentered(271, 113 + y, STR_GENERATE_DATE, 0);
   250 
   284 
   293 
   327 
   294 		break;
   328 		break;
   295 	case WE_CLICK:
   329 	case WE_CLICK:
   296 		switch (e->we.click.widget) {
   330 		switch (e->we.click.widget) {
   297 		case 0: DeleteWindow(w); break;
   331 		case 0: DeleteWindow(w); break;
   298 		case 3: case 4: case 5: case 6:
   332 		case GLAND_TEMPERATE: case GLAND_ARCTIC: case GLAND_TROPICAL: case GLAND_TOYLAND:
   299 			RaiseWindowWidget(w, _opt_newgame.landscape + 3);
   333 			RaiseWindowWidget(w, _opt_newgame.landscape + GLAND_TEMPERATE);
   300 			SetNewLandscapeType(e->we.click.widget - 3);
   334 			SetNewLandscapeType(e->we.click.widget - GLAND_TEMPERATE);
   301 			break;
   335 			break;
   302 		case 7: case 8: // Mapsize X
   336 		case GLAND_MAPSIZE_X_TEXT: case GLAND_MAPSIZE_X_PULLDOWN: // Mapsize X
   303 			ShowDropDownMenu(w, mapsizes, _patches_newgame.map_x - 6, 8, 0, 0);
   337 			ShowDropDownMenu(w, mapsizes, _patches_newgame.map_x - 6, GLAND_MAPSIZE_X_PULLDOWN, 0, 0);
   304 			break;
   338 			break;
   305 		case 9: case 10: // Mapsize Y
   339 		case GLAND_MAPSIZE_Y_TEXT: case GLAND_MAPSIZE_Y_PULLDOWN: // Mapsize Y
   306 			ShowDropDownMenu(w, mapsizes, _patches_newgame.map_y - 6, 10, 0, 0);
   340 			ShowDropDownMenu(w, mapsizes, _patches_newgame.map_y - 6, GLAND_MAPSIZE_Y_PULLDOWN, 0, 0);
   307 			break;
   341 			break;
   308 		case 11: case 12: // Number of towns
   342 		case GLAND_TOWN_TEXT: case GLAND_TOWN_PULLDOWN: // Number of towns
   309 			ShowDropDownMenu(w, num_towns, _opt_newgame.diff.number_towns, 12, 0, 0);
   343 			ShowDropDownMenu(w, num_towns, _opt_newgame.diff.number_towns, GLAND_TOWN_PULLDOWN, 0, 0);
   310 			break;
   344 			break;
   311 		case 13: case 14: // Number of industries
   345 		case GLAND_INDUSTRY_TEXT: case GLAND_INDUSTRY_PULLDOWN: // Number of industries
   312 			ShowDropDownMenu(w, num_inds, _opt_newgame.diff.number_industries, 14, 0, 0);
   346 			ShowDropDownMenu(w, num_inds, _opt_newgame.diff.number_industries, GLAND_INDUSTRY_PULLDOWN, 0, 0);
   313 			break;
   347 			break;
   314 		case 16: // Random seed
   348 		case GLAND_RANDOM_BUTTON: // Random seed
   315 			_patches_newgame.generation_seed = InteractiveRandom();
   349 			_patches_newgame.generation_seed = InteractiveRandom();
   316 			snprintf(_genseed_buffer, lengthof(_genseed_buffer), "%u", _patches_newgame.generation_seed);
   350 			snprintf(_genseed_buffer, lengthof(_genseed_buffer), "%u", _patches_newgame.generation_seed);
   317 			UpdateTextBufferSize(&_genseed_query.text);
   351 			UpdateTextBufferSize(&_genseed_query.text);
   318 			SetWindowDirty(w);
   352 			SetWindowDirty(w);
   319 			break;
   353 			break;
   320 		case 17: // Generate
   354 		case GLAND_GENERATE_BUTTON: // Generate
   321 			if (mode == GLWP_HEIGHTMAP && (
   355 			if (mode == GLWP_HEIGHTMAP && (
   322 					_heightmap_x * 2 < (1U << _patches_newgame.map_x) || _heightmap_x / 2 > (1U << _patches_newgame.map_x) ||
   356 					_heightmap_x * 2 < (1U << _patches_newgame.map_x) || _heightmap_x / 2 > (1U << _patches_newgame.map_x) ||
   323 					_heightmap_y * 2 < (1U << _patches_newgame.map_y) || _heightmap_y / 2 > (1U << _patches_newgame.map_y))) {
   357 					_heightmap_y * 2 < (1U << _patches_newgame.map_y) || _heightmap_y / 2 > (1U << _patches_newgame.map_y))) {
   324 				ShowQuery(
   358 				ShowQuery(
   325 					STR_HEIGHTMAP_SCALE_WARNING_CAPTION,
   359 					STR_HEIGHTMAP_SCALE_WARNING_CAPTION,
   328 					HeightmapScaledTooMuchCallback);
   362 					HeightmapScaledTooMuchCallback);
   329 			} else {
   363 			} else {
   330 				StartGeneratingLandscape(mode);
   364 				StartGeneratingLandscape(mode);
   331 			}
   365 			}
   332 			break;
   366 			break;
   333 		case 18: case 20: // Year buttons
   367 		case GLAND_START_DATE_DOWN: case GLAND_START_DATE_UP: // Year buttons
   334 			/* Don't allow too fast scrolling */
   368 			/* Don't allow too fast scrolling */
   335 			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   369 			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   336 				HandleButtonClick(w, e->we.click.widget);
   370 				HandleButtonClick(w, e->we.click.widget);
   337 				SetWindowDirty(w);
   371 				SetWindowDirty(w);
   338 
   372 
   339 				_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + e->we.click.widget - 19, MIN_YEAR, MAX_YEAR);
   373 				_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + e->we.click.widget - GLAND_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   340 			}
   374 			}
   341 			_left_button_clicked = false;
   375 			_left_button_clicked = false;
   342 			break;
   376 			break;
   343 		case 19: // Year text
   377 		case GLAND_START_DATE_TEXT: // Year text
   344 			WP(w, def_d).data_3 = START_DATE_QUERY;
   378 			WP(w, def_d).data_3 = GLAND_START_DATE_TEXT;
   345 			SetDParam(0, _patches_newgame.starting_year);
   379 			SetDParam(0, _patches_newgame.starting_year);
   346 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, w, CS_NUMERAL);
   380 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, w, CS_NUMERAL);
   347 			break;
   381 			break;
   348 		case 21: case 23: // Snow line buttons
   382 		case GLAND_SNOW_LEVEL_DOWN: case GLAND_SNOW_LEVEL_UP: // Snow line buttons
   349 			/* Don't allow too fast scrolling */
   383 			/* Don't allow too fast scrolling */
   350 			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   384 			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   351 				HandleButtonClick(w, e->we.click.widget);
   385 				HandleButtonClick(w, e->we.click.widget);
   352 				SetWindowDirty(w);
   386 				SetWindowDirty(w);
   353 
   387 
   354 				_patches_newgame.snow_line_height = clamp(_patches_newgame.snow_line_height + e->we.click.widget - 22, 2, 13);
   388 				_patches_newgame.snow_line_height = clamp(_patches_newgame.snow_line_height + e->we.click.widget - GLAND_SNOW_LEVEL_TEXT, 2, 13);
   355 			}
   389 			}
   356 			_left_button_clicked = false;
   390 			_left_button_clicked = false;
   357 			break;
   391 			break;
   358 		case 22: // Snow line text
   392 		case GLAND_SNOW_LEVEL_TEXT: // Snow line text
   359 			WP(w, def_d).data_3 = SNOW_LINE_QUERY;
   393 			WP(w, def_d).data_3 = GLAND_SNOW_LEVEL_TEXT;
   360 			SetDParam(0, _patches_newgame.snow_line_height);
   394 			SetDParam(0, _patches_newgame.snow_line_height);
   361 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_SNOW_LINE_QUERY_CAPT, 3, 100, w, CS_NUMERAL);
   395 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_SNOW_LINE_QUERY_CAPT, 3, 100, w, CS_NUMERAL);
   362 			break;
   396 			break;
   363 		case 24: case 25: // Tree placer
   397 		case GLAND_TREE_TEXT: case GLAND_TREE_PULLDOWN: // Tree placer
   364 			ShowDropDownMenu(w, tree_placer, _patches_newgame.tree_placer, 25, 0, 0);
   398 			ShowDropDownMenu(w, tree_placer, _patches_newgame.tree_placer, GLAND_TREE_PULLDOWN, 0, 0);
   365 			break;
   399 			break;
   366 		case 26: case 27: // Landscape generator OR Heightmap rotation
   400 		case GLAND_LANDSCAPE_TEXT: case GLAND_LANDSCAPE_PULLDOWN: // Landscape generator OR Heightmap rotation
       
   401 		/*case GLAND_HEIGHTMAP_ROTATION_TEXT: case GLAND_HEIGHTMAP_ROTATION_PULLDOWN:*/
   367 			if (mode == GLWP_HEIGHTMAP) {
   402 			if (mode == GLWP_HEIGHTMAP) {
   368 				ShowDropDownMenu(w, rotation, _patches_newgame.heightmap_rotation, 27, 0, 0);
   403 				ShowDropDownMenu(w, rotation, _patches_newgame.heightmap_rotation, GLAND_HEIGHTMAP_ROTATION_PULLDOWN, 0, 0);
   369 			} else {
   404 			} else {
   370 				ShowDropDownMenu(w, landscape, _patches_newgame.land_generator, 27, 0, 0);
   405 				ShowDropDownMenu(w, landscape, _patches_newgame.land_generator, GLAND_LANDSCAPE_PULLDOWN, 0, 0);
   371 			}
   406 			}
   372 			break;
   407 			break;
   373 		case 28: case 29: // Terrain type
   408 		case GLAND_TERRAIN_TEXT: case GLAND_TERRAIN_PULLDOWN: // Terrain type
   374 			ShowDropDownMenu(w, elevations, _opt_newgame.diff.terrain_type, 29, 0, 0);
   409 			ShowDropDownMenu(w, elevations, _opt_newgame.diff.terrain_type, GLAND_TERRAIN_PULLDOWN, 0, 0);
   375 			break;
   410 			break;
   376 		case 30: case 31: // Water quantity
   411 		case GLAND_WATER_TEXT: case GLAND_WATER_PULLDOWN: // Water quantity
   377 			ShowDropDownMenu(w, sea_lakes, _opt_newgame.diff.quantity_sea_lakes, 31, 0, 0);
   412 			ShowDropDownMenu(w, sea_lakes, _opt_newgame.diff.quantity_sea_lakes, GLAND_WATER_PULLDOWN, 0, 0);
   378 			break;
   413 			break;
   379 		case 32: case 33: // Map smoothness
   414 		case GLAND_SMOOTHNESS_TEXT: case GLAND_SMOOTHNESS_PULLDOWN: // Map smoothness
   380 			ShowDropDownMenu(w, smoothness, _patches_newgame.tgen_smoothness, 33, 0, 0);
   415 			ShowDropDownMenu(w, smoothness, _patches_newgame.tgen_smoothness, GLAND_SMOOTHNESS_PULLDOWN, 0, 0);
   381 			break;
   416 			break;
   382 		}
   417 		}
   383 		break;
   418 		break;
   384 
   419 
   385 	case WE_MOUSELOOP:
   420 	case WE_MOUSELOOP:
   386 		HandleEditBox(w, &_genseed_query, SEED_EDIT);
   421 		HandleEditBox(w, &_genseed_query, GLAND_RANDOM_EDITBOX);
   387 		break;
   422 		break;
   388 
   423 
   389 	case WE_KEYPRESS:
   424 	case WE_KEYPRESS:
   390 		HandleEditBoxKey(w, &_genseed_query, SEED_EDIT, e);
   425 		HandleEditBoxKey(w, &_genseed_query, GLAND_RANDOM_EDITBOX, e);
   391 		/* the seed is unsigned, therefore atoi cannot be used.
   426 		/* the seed is unsigned, therefore atoi cannot be used.
   392 		 * As 2^32 - 1 (MAX_UVALUE(uint32)) is a 'magic' value
   427 		 * As 2^32 - 1 (MAX_UVALUE(uint32)) is a 'magic' value
   393 		 * (use random seed) it should not be possible to be
   428 		 * (use random seed) it should not be possible to be
   394 		 * entered into the input field; the generate seed
   429 		 * entered into the input field; the generate seed
   395 		 * button can be used instead. */
   430 		 * button can be used instead. */
   396 		_patches_newgame.generation_seed = minu(strtoul(_genseed_buffer, NULL, sizeof(_genseed_buffer) - 1), MAX_UVALUE(uint32) - 1);
   431 		_patches_newgame.generation_seed = minu(strtoul(_genseed_buffer, NULL, sizeof(_genseed_buffer) - 1), MAX_UVALUE(uint32) - 1);
   397 		break;
   432 		break;
   398 
   433 
   399 	case WE_DROPDOWN_SELECT:
   434 	case WE_DROPDOWN_SELECT:
   400 		switch (e->we.dropdown.button) {
   435 		switch (e->we.dropdown.button) {
   401 			case 8:  _patches_newgame.map_x = e->we.dropdown.index + 6; break;
   436 			case GLAND_MAPSIZE_X_PULLDOWN:  _patches_newgame.map_x = e->we.dropdown.index + 6; break;
   402 			case 10: _patches_newgame.map_y = e->we.dropdown.index + 6; break;
   437 			case GLAND_MAPSIZE_Y_PULLDOWN:  _patches_newgame.map_y = e->we.dropdown.index + 6; break;
   403 			case 12:
   438 			case GLAND_TREE_PULLDOWN:       _patches_newgame.tree_placer = e->we.dropdown.index; break;
       
   439 			case GLAND_SMOOTHNESS_PULLDOWN: _patches_newgame.tgen_smoothness = e->we.dropdown.index;  break;
       
   440 
       
   441 			case GLAND_TOWN_PULLDOWN:
   404 				_opt_newgame.diff.number_towns = e->we.dropdown.index;
   442 				_opt_newgame.diff.number_towns = e->we.dropdown.index;
   405 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   443 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   406 				DoCommandP(0, 2, _opt_newgame.diff.number_towns, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   444 				DoCommandP(0, 2, _opt_newgame.diff.number_towns, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   407 				break;
   445 				break;
   408 			case 14:
   446 			case GLAND_INDUSTRY_PULLDOWN:
   409 				_opt_newgame.diff.number_industries = e->we.dropdown.index;
   447 				_opt_newgame.diff.number_industries = e->we.dropdown.index;
   410 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   448 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   411 				DoCommandP(0, 3, _opt_newgame.diff.number_industries, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   449 				DoCommandP(0, 3, _opt_newgame.diff.number_industries, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   412 				break;
   450 				break;
   413 			case 25:
   451 			case GLAND_LANDSCAPE_PULLDOWN:
   414 				_patches_newgame.tree_placer = e->we.dropdown.index;
   452 			/*case GLAND_HEIGHTMAP_PULLDOWN: */
   415 				break;
       
   416 			case 27:
       
   417 				if (mode == GLWP_HEIGHTMAP) {
   453 				if (mode == GLWP_HEIGHTMAP) {
   418 					_patches_newgame.heightmap_rotation = e->we.dropdown.index;
   454 					_patches_newgame.heightmap_rotation = e->we.dropdown.index;
   419 				} else {
   455 				} else {
   420 					_patches_newgame.land_generator = e->we.dropdown.index;
   456 					_patches_newgame.land_generator = e->we.dropdown.index;
   421 				}
   457 				}
   422 				break;
   458 				break;
   423 			case 29:
   459 			case GLAND_TERRAIN_PULLDOWN:
   424 				_opt_newgame.diff.terrain_type = e->we.dropdown.index;
   460 				_opt_newgame.diff.terrain_type = e->we.dropdown.index;
   425 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   461 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   426 				DoCommandP(0, 12, _opt_newgame.diff.terrain_type, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   462 				DoCommandP(0, 12, _opt_newgame.diff.terrain_type, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   427 				break;
   463 				break;
   428 			case 31:
   464 			case GLAND_WATER_PULLDOWN:
   429 				_opt_newgame.diff.quantity_sea_lakes = e->we.dropdown.index;
   465 				_opt_newgame.diff.quantity_sea_lakes = e->we.dropdown.index;
   430 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   466 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   431 				DoCommandP(0, 13, _opt_newgame.diff.quantity_sea_lakes, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   467 				DoCommandP(0, 13, _opt_newgame.diff.quantity_sea_lakes, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   432 				break;
   468 				break;
   433 			case 33:
       
   434 				_patches_newgame.tgen_smoothness = e->we.dropdown.index;
       
   435 				break;
       
   436 		}
   469 		}
   437 		SetWindowDirty(w);
   470 		SetWindowDirty(w);
   438 		break;
   471 		break;
   439 
   472 
   440 	case WE_ON_EDIT_TEXT: {
   473 	case WE_ON_EDIT_TEXT: {
   441 		if (e->we.edittext.str != NULL) {
   474 		if (e->we.edittext.str != NULL) {
   442 			int32 value = atoi(e->we.edittext.str);
   475 			int32 value = atoi(e->we.edittext.str);
   443 
   476 
   444 			switch (WP(w, def_d).data_3) {
   477 			switch (WP(w, def_d).data_3) {
   445 			case START_DATE_QUERY:
   478 			case GLAND_START_DATE_TEXT:
   446 				InvalidateWidget(w, 19);
   479 				InvalidateWidget(w, GLAND_START_DATE_TEXT);
   447 				_patches_newgame.starting_year = clamp(value, MIN_YEAR, MAX_YEAR);
   480 				_patches_newgame.starting_year = clamp(value, MIN_YEAR, MAX_YEAR);
   448 				break;
   481 				break;
   449 			case SNOW_LINE_QUERY:
   482 			case GLAND_SNOW_LEVEL_TEXT:
   450 				InvalidateWidget(w, 22);
   483 				InvalidateWidget(w, GLAND_SNOW_LEVEL_TEXT);
   451 				_patches_newgame.snow_line_height = clamp(value, 2, 13);
   484 				_patches_newgame.snow_line_height = clamp(value, 2, 13);
   452 				break;
   485 				break;
   453 			}
   486 			}
   454 
   487 
   455 			SetWindowDirty(w);
   488 			SetWindowDirty(w);
   475 	GenerateLandscapeWndProc,
   508 	GenerateLandscapeWndProc,
   476 };
   509 };
   477 
   510 
   478 static void _ShowGenerateLandscape(glwp_modes mode)
   511 static void _ShowGenerateLandscape(glwp_modes mode)
   479 {
   512 {
   480 	DeleteWindowById(WC_GENERATE_LANDSCAPE, GLWP_GENERATE);
   513 	DeleteWindowByClass(WC_GENERATE_LANDSCAPE);
   481 	DeleteWindowById(WC_GENERATE_LANDSCAPE, GLWP_HEIGHTMAP);
       
   482 	DeleteWindowById(WC_GENERATE_LANDSCAPE, GLWP_SCENARIO);
       
   483 
   514 
   484 	/* Always give a new seed if not editor */
   515 	/* Always give a new seed if not editor */
   485 	if (_game_mode != GM_EDITOR) _patches_newgame.generation_seed = InteractiveRandom();
   516 	if (_game_mode != GM_EDITOR) _patches_newgame.generation_seed = InteractiveRandom();
   486 
   517 
   487 	if (mode == GLWP_HEIGHTMAP) {
   518 	if (mode == GLWP_HEIGHTMAP) {
   603 				_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + e->we.click.widget - CSCEN_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   634 				_patches_newgame.starting_year = clamp(_patches_newgame.starting_year + e->we.click.widget - CSCEN_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   604 			}
   635 			}
   605 			_left_button_clicked = false;
   636 			_left_button_clicked = false;
   606 			break;
   637 			break;
   607 		case CSCEN_START_DATE_TEXT: // Year text
   638 		case CSCEN_START_DATE_TEXT: // Year text
   608 			WP(w, def_d).data_3 = START_DATE_QUERY;
   639 			WP(w, def_d).data_3 = CSCEN_START_DATE_TEXT;
   609 			SetDParam(0, _patches_newgame.starting_year);
   640 			SetDParam(0, _patches_newgame.starting_year);
   610 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, w, CS_NUMERAL);
   641 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, w, CS_NUMERAL);
   611 			break;
   642 			break;
   612 		case CSCEN_FLAT_LAND_HEIGHT_DOWN: case CSCEN_FLAT_LAND_HEIGHT_UP: // Height level buttons
   643 		case CSCEN_FLAT_LAND_HEIGHT_DOWN: case CSCEN_FLAT_LAND_HEIGHT_UP: // Height level buttons
   613 			/* Don't allow too fast scrolling */
   644 			/* Don't allow too fast scrolling */
   618 				_patches_newgame.se_flat_world_height = clamp(_patches_newgame.se_flat_world_height + e->we.click.widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, 15);
   649 				_patches_newgame.se_flat_world_height = clamp(_patches_newgame.se_flat_world_height + e->we.click.widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, 15);
   619 			}
   650 			}
   620 			_left_button_clicked = false;
   651 			_left_button_clicked = false;
   621 			break;
   652 			break;
   622 		case CSCEN_FLAT_LAND_HEIGHT_TEXT: // Height level text
   653 		case CSCEN_FLAT_LAND_HEIGHT_TEXT: // Height level text
   623 			WP(w, def_d).data_3 = FLAT_WORLD_HEIGHT_QUERY;
   654 			WP(w, def_d).data_3 = CSCEN_FLAT_LAND_HEIGHT_TEXT;
   624 			SetDParam(0, _patches_newgame.se_flat_world_height);
   655 			SetDParam(0, _patches_newgame.se_flat_world_height);
   625 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_FLAT_WORLD_HEIGHT_QUERY_CAPT, 3, 100, w, CS_NUMERAL);
   656 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_FLAT_WORLD_HEIGHT_QUERY_CAPT, 3, 100, w, CS_NUMERAL);
   626 			break;
   657 			break;
   627 		}
   658 		}
   628 		break;
   659 		break;
   638 	case WE_ON_EDIT_TEXT: {
   669 	case WE_ON_EDIT_TEXT: {
   639 		if (e->we.edittext.str != NULL) {
   670 		if (e->we.edittext.str != NULL) {
   640 			int32 value = atoi(e->we.edittext.str);
   671 			int32 value = atoi(e->we.edittext.str);
   641 
   672 
   642 			switch (WP(w, def_d).data_3) {
   673 			switch (WP(w, def_d).data_3) {
   643 			case START_DATE_QUERY:
   674 			case CSCEN_START_DATE_TEXT:
   644 				InvalidateWidget(w, CSCEN_START_DATE_TEXT);
   675 				InvalidateWidget(w, CSCEN_START_DATE_TEXT);
   645 				_patches_newgame.starting_year = clamp(value, MIN_YEAR, MAX_YEAR);
   676 				_patches_newgame.starting_year = clamp(value, MIN_YEAR, MAX_YEAR);
   646 				break;
   677 				break;
   647 			case FLAT_WORLD_HEIGHT_QUERY:
   678 			case CSCEN_FLAT_LAND_HEIGHT_TEXT:
   648 				InvalidateWidget(w, CSCEN_FLAT_LAND_HEIGHT_TEXT);
   679 				InvalidateWidget(w, CSCEN_FLAT_LAND_HEIGHT_TEXT);
   649 				_patches_newgame.se_flat_world_height = clamp(value, 0, 15);
   680 				_patches_newgame.se_flat_world_height = clamp(value, 0, 15);
   650 				break;
   681 				break;
   651 			}
   682 			}
   652 
   683