src/genworld_gui.cpp
changeset 10703 2c998f3776d1
parent 10695 95e0154da7a0
child 10707 81a4013a7680
equal deleted inserted replaced
10702:d36547edcb86 10703:2c998f3776d1
   254 
   254 
   255 	GenerateLandscapeWindow(const WindowDesc *desc, WindowNumber number = 0) : QueryStringBaseWindow(desc, number)
   255 	GenerateLandscapeWindow(const WindowDesc *desc, WindowNumber number = 0) : QueryStringBaseWindow(desc, number)
   256 	{
   256 	{
   257 		this->LowerWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
   257 		this->LowerWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
   258 
   258 
   259 		snprintf(this->edit_str_buf, sizeof(this->edit_str_buf), "%u", _patches_newgame.generation_seed);
   259 		snprintf(this->edit_str_buf, sizeof(this->edit_str_buf), "%u", _settings_newgame.game_creation.generation_seed);
   260 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 120);
   260 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 120);
   261 		this->caption = STR_NULL;
   261 		this->caption = STR_NULL;
   262 		this->afilter = CS_NUMERAL;
   262 		this->afilter = CS_NUMERAL;
   263 
   263 
   264 		this->mode = (glwp_modes)this->window_number;
   264 		this->mode = (glwp_modes)this->window_number;
   268 
   268 
   269 	virtual void OnPaint()
   269 	virtual void OnPaint()
   270 	{
   270 	{
   271 		/* You can't select smoothness if not terragenesis */
   271 		/* You can't select smoothness if not terragenesis */
   272 		if (mode == GLWP_GENERATE) {
   272 		if (mode == GLWP_GENERATE) {
   273 			this->SetWidgetDisabledState(GLAND_SMOOTHNESS_PULLDOWN, _patches_newgame.land_generator == 0);
   273 			this->SetWidgetDisabledState(GLAND_SMOOTHNESS_PULLDOWN, _settings_newgame.game_creation.land_generator == 0);
   274 		}
   274 		}
   275 		/* Disable snowline if not hilly */
   275 		/* Disable snowline if not hilly */
   276 		this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_TEXT, _opt_newgame.landscape != LT_ARCTIC);
   276 		this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_TEXT, _opt_newgame.landscape != LT_ARCTIC);
   277 		/* Disable town, industry and trees in SE */
   277 		/* Disable town, industry and trees in SE */
   278 		this->SetWidgetDisabledState(GLAND_TOWN_PULLDOWN,     _game_mode == GM_EDITOR);
   278 		this->SetWidgetDisabledState(GLAND_TOWN_PULLDOWN,     _game_mode == GM_EDITOR);
   279 		this->SetWidgetDisabledState(GLAND_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
   279 		this->SetWidgetDisabledState(GLAND_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
   280 		this->SetWidgetDisabledState(GLAND_TREE_PULLDOWN,     _game_mode == GM_EDITOR);
   280 		this->SetWidgetDisabledState(GLAND_TREE_PULLDOWN,     _game_mode == GM_EDITOR);
   281 
   281 
   282 		this->SetWidgetDisabledState(GLAND_START_DATE_DOWN, _patches_newgame.starting_year <= MIN_YEAR);
   282 		this->SetWidgetDisabledState(GLAND_START_DATE_DOWN, _settings_newgame.game_creation.starting_year <= MIN_YEAR);
   283 		this->SetWidgetDisabledState(GLAND_START_DATE_UP,   _patches_newgame.starting_year >= MAX_YEAR);
   283 		this->SetWidgetDisabledState(GLAND_START_DATE_UP,   _settings_newgame.game_creation.starting_year >= MAX_YEAR);
   284 		this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_DOWN, _patches_newgame.snow_line_height <= 2 || _opt_newgame.landscape != LT_ARCTIC);
   284 		this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_DOWN, _settings_newgame.game_creation.snow_line_height <= 2 || _opt_newgame.landscape != LT_ARCTIC);
   285 		this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_UP,   _patches_newgame.snow_line_height >= MAX_SNOWLINE_HEIGHT || _opt_newgame.landscape != LT_ARCTIC);
   285 		this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_UP,   _settings_newgame.game_creation.snow_line_height >= MAX_SNOWLINE_HEIGHT || _opt_newgame.landscape != LT_ARCTIC);
   286 
   286 
   287 		this->SetWidgetLoweredState(GLAND_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
   287 		this->SetWidgetLoweredState(GLAND_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
   288 		this->SetWidgetLoweredState(GLAND_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
   288 		this->SetWidgetLoweredState(GLAND_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
   289 		this->SetWidgetLoweredState(GLAND_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
   289 		this->SetWidgetLoweredState(GLAND_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
   290 		this->SetWidgetLoweredState(GLAND_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
   290 		this->SetWidgetLoweredState(GLAND_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
   296 			this->widget[GLAND_TOWN_PULLDOWN].data     = _num_towns[_opt_newgame.diff.number_towns];
   296 			this->widget[GLAND_TOWN_PULLDOWN].data     = _num_towns[_opt_newgame.diff.number_towns];
   297 			this->widget[GLAND_INDUSTRY_PULLDOWN].data = _num_inds[_opt_newgame.diff.number_industries];
   297 			this->widget[GLAND_INDUSTRY_PULLDOWN].data = _num_inds[_opt_newgame.diff.number_industries];
   298 		}
   298 		}
   299 
   299 
   300 		if (mode == GLWP_GENERATE) {
   300 		if (mode == GLWP_GENERATE) {
   301 			this->widget[GLAND_LANDSCAPE_PULLDOWN].data  = _landscape[_patches_newgame.land_generator];
   301 			this->widget[GLAND_LANDSCAPE_PULLDOWN].data  = _landscape[_settings_newgame.game_creation.land_generator];
   302 			this->widget[GLAND_TREE_PULLDOWN].data       = _tree_placer[_patches_newgame.tree_placer];
   302 			this->widget[GLAND_TREE_PULLDOWN].data       = _tree_placer[_settings_newgame.game_creation.tree_placer];
   303 			this->widget[GLAND_TERRAIN_PULLDOWN].data    = _elevations[_opt_newgame.diff.terrain_type];
   303 			this->widget[GLAND_TERRAIN_PULLDOWN].data    = _elevations[_opt_newgame.diff.terrain_type];
   304 			this->widget[GLAND_WATER_PULLDOWN].data      = _sea_lakes[_opt_newgame.diff.quantity_sea_lakes];
   304 			this->widget[GLAND_WATER_PULLDOWN].data      = _sea_lakes[_opt_newgame.diff.quantity_sea_lakes];
   305 			this->widget[GLAND_SMOOTHNESS_PULLDOWN].data = _smoothness[_patches_newgame.tgen_smoothness];
   305 			this->widget[GLAND_SMOOTHNESS_PULLDOWN].data = _smoothness[_settings_newgame.game_creation.tgen_smoothness];
   306 		} else {
   306 		} else {
   307 			this->widget[GLAND_TREE_PULLDOWN].data               = _tree_placer[_patches_newgame.tree_placer];
   307 			this->widget[GLAND_TREE_PULLDOWN].data               = _tree_placer[_settings_newgame.game_creation.tree_placer];
   308 			this->widget[GLAND_HEIGHTMAP_ROTATION_PULLDOWN].data = _rotation[_patches_newgame.heightmap_rotation];
   308 			this->widget[GLAND_HEIGHTMAP_ROTATION_PULLDOWN].data = _rotation[_settings_newgame.game_creation.heightmap_rotation];
   309 		}
   309 		}
   310 
   310 
   311 		/* Set parameters for widget text that requires them. */
   311 		/* Set parameters for widget text that requires them. */
   312 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1)); // GLAND_START_DATE_TEXT
   312 		SetDParam(0, ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); // GLAND_START_DATE_TEXT
   313 		SetDParam(1, 1 << _patches_newgame.map_x); // GLAND_MAPSIZE_X_PULLDOWN
   313 		SetDParam(1, 1 << _settings_newgame.game_creation.map_x); // GLAND_MAPSIZE_X_PULLDOWN
   314 		SetDParam(2, 1 << _patches_newgame.map_y); // GLAND_MAPSIZE_Y_PULLDOWN
   314 		SetDParam(2, 1 << _settings_newgame.game_creation.map_y); // GLAND_MAPSIZE_Y_PULLDOWN
   315 		SetDParam(3, _patches_newgame.snow_line_height); // GLAND_SNOW_LEVEL_TEXT
   315 		SetDParam(3, _settings_newgame.game_creation.snow_line_height); // GLAND_SNOW_LEVEL_TEXT
   316 
   316 
   317 		this->DrawWidgets();
   317 		this->DrawWidgets();
   318 
   318 
   319 		this->DrawEditBox(GLAND_RANDOM_EDITBOX);
   319 		this->DrawEditBox(GLAND_RANDOM_EDITBOX);
   320 
   320 
   321 		if (mode != GLWP_GENERATE) {
   321 		if (mode != GLWP_GENERATE) {
   322 			char buffer[512];
   322 			char buffer[512];
   323 
   323 
   324 			if (_patches_newgame.heightmap_rotation == HM_CLOCKWISE) {
   324 			if (_settings_newgame.game_creation.heightmap_rotation == HM_CLOCKWISE) {
   325 				SetDParam(0, this->y);
   325 				SetDParam(0, this->y);
   326 				SetDParam(1, this->x);
   326 				SetDParam(1, this->x);
   327 			} else {
   327 			} else {
   328 				SetDParam(0, this->x);
   328 				SetDParam(0, this->x);
   329 				SetDParam(1, this->y);
   329 				SetDParam(1, this->y);
   349 				this->RaiseWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
   349 				this->RaiseWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
   350 				SetNewLandscapeType(widget - GLAND_TEMPERATE);
   350 				SetNewLandscapeType(widget - GLAND_TEMPERATE);
   351 				break;
   351 				break;
   352 
   352 
   353 			case GLAND_MAPSIZE_X_PULLDOWN: // Mapsize X
   353 			case GLAND_MAPSIZE_X_PULLDOWN: // Mapsize X
   354 				ShowDropDownList(this, BuildMapsizeDropDown(), _patches_newgame.map_x, GLAND_MAPSIZE_X_PULLDOWN);
   354 				ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_x, GLAND_MAPSIZE_X_PULLDOWN);
   355 				break;
   355 				break;
   356 
   356 
   357 			case GLAND_MAPSIZE_Y_PULLDOWN: // Mapsize Y
   357 			case GLAND_MAPSIZE_Y_PULLDOWN: // Mapsize Y
   358 				ShowDropDownList(this, BuildMapsizeDropDown(), _patches_newgame.map_y, GLAND_MAPSIZE_Y_PULLDOWN);
   358 				ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_y, GLAND_MAPSIZE_Y_PULLDOWN);
   359 				break;
   359 				break;
   360 
   360 
   361 			case GLAND_TOWN_PULLDOWN: // Number of towns
   361 			case GLAND_TOWN_PULLDOWN: // Number of towns
   362 				ShowDropDownMenu(this, _num_towns, _opt_newgame.diff.number_towns, GLAND_TOWN_PULLDOWN, 0, 0);
   362 				ShowDropDownMenu(this, _num_towns, _opt_newgame.diff.number_towns, GLAND_TOWN_PULLDOWN, 0, 0);
   363 				break;
   363 				break;
   365 			case GLAND_INDUSTRY_PULLDOWN: // Number of industries
   365 			case GLAND_INDUSTRY_PULLDOWN: // Number of industries
   366 				ShowDropDownMenu(this, _num_inds, _opt_newgame.diff.number_industries, GLAND_INDUSTRY_PULLDOWN, 0, 0);
   366 				ShowDropDownMenu(this, _num_inds, _opt_newgame.diff.number_industries, GLAND_INDUSTRY_PULLDOWN, 0, 0);
   367 				break;
   367 				break;
   368 
   368 
   369 			case GLAND_RANDOM_BUTTON: // Random seed
   369 			case GLAND_RANDOM_BUTTON: // Random seed
   370 				_patches_newgame.generation_seed = InteractiveRandom();
   370 				_settings_newgame.game_creation.generation_seed = InteractiveRandom();
   371 				snprintf(this->edit_str_buf, lengthof(this->edit_str_buf), "%u", _patches_newgame.generation_seed);
   371 				snprintf(this->edit_str_buf, lengthof(this->edit_str_buf), "%u", _settings_newgame.game_creation.generation_seed);
   372 				UpdateTextBufferSize(&this->text);
   372 				UpdateTextBufferSize(&this->text);
   373 				this->SetDirty();
   373 				this->SetDirty();
   374 				break;
   374 				break;
   375 
   375 
   376 			case GLAND_RANDOM_EDITBOX: // edit box for random seed
   376 			case GLAND_RANDOM_EDITBOX: // edit box for random seed
   378 				break;
   378 				break;
   379 
   379 
   380 			case GLAND_GENERATE_BUTTON: // Generate
   380 			case GLAND_GENERATE_BUTTON: // Generate
   381 				UpdatePatches();
   381 				UpdatePatches();
   382 
   382 
   383 				if (_patches.town_layout == TL_NO_ROADS) {
   383 				if (_settings.economy.town_layout == TL_NO_ROADS) {
   384 					ShowQuery(
   384 					ShowQuery(
   385 						STR_TOWN_LAYOUT_WARNING_CAPTION,
   385 						STR_TOWN_LAYOUT_WARNING_CAPTION,
   386 						STR_TOWN_LAYOUT_WARNING_MESSAGE,
   386 						STR_TOWN_LAYOUT_WARNING_MESSAGE,
   387 						this,
   387 						this,
   388 						LandscapeGenerationCallback);
   388 						LandscapeGenerationCallback);
   389 				} else if (mode == GLWP_HEIGHTMAP &&
   389 				} else if (mode == GLWP_HEIGHTMAP &&
   390 						(this->x * 2 < (1U << _patches_newgame.map_x) ||
   390 						(this->x * 2 < (1U << _settings_newgame.game_creation.map_x) ||
   391 						this->x / 2 > (1U << _patches_newgame.map_x) ||
   391 						this->x / 2 > (1U << _settings_newgame.game_creation.map_x) ||
   392 						this->y * 2 < (1U << _patches_newgame.map_y) ||
   392 						this->y * 2 < (1U << _settings_newgame.game_creation.map_y) ||
   393 						this->y / 2 > (1U << _patches_newgame.map_y))) {
   393 						this->y / 2 > (1U << _settings_newgame.game_creation.map_y))) {
   394 					ShowQuery(
   394 					ShowQuery(
   395 						STR_HEIGHTMAP_SCALE_WARNING_CAPTION,
   395 						STR_HEIGHTMAP_SCALE_WARNING_CAPTION,
   396 						STR_HEIGHTMAP_SCALE_WARNING_MESSAGE,
   396 						STR_HEIGHTMAP_SCALE_WARNING_MESSAGE,
   397 						this,
   397 						this,
   398 						LandscapeGenerationCallback);
   398 						LandscapeGenerationCallback);
   406 				/* Don't allow too fast scrolling */
   406 				/* Don't allow too fast scrolling */
   407 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   407 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   408 					this->HandleButtonClick(widget);
   408 					this->HandleButtonClick(widget);
   409 					this->SetDirty();
   409 					this->SetDirty();
   410 
   410 
   411 					_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + widget - GLAND_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   411 					_settings_newgame.game_creation.starting_year = Clamp(_settings_newgame.game_creation.starting_year + widget - GLAND_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   412 				}
   412 				}
   413 				_left_button_clicked = false;
   413 				_left_button_clicked = false;
   414 				break;
   414 				break;
   415 
   415 
   416 			case GLAND_START_DATE_TEXT: // Year text
   416 			case GLAND_START_DATE_TEXT: // Year text
   417 				this->widget_id = GLAND_START_DATE_TEXT;
   417 				this->widget_id = GLAND_START_DATE_TEXT;
   418 				SetDParam(0, _patches_newgame.starting_year);
   418 				SetDParam(0, _settings_newgame.game_creation.starting_year);
   419 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, this, CS_NUMERAL);
   419 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, this, CS_NUMERAL);
   420 				break;
   420 				break;
   421 
   421 
   422 			case GLAND_SNOW_LEVEL_DOWN:
   422 			case GLAND_SNOW_LEVEL_DOWN:
   423 			case GLAND_SNOW_LEVEL_UP: // Snow line buttons
   423 			case GLAND_SNOW_LEVEL_UP: // Snow line buttons
   424 				/* Don't allow too fast scrolling */
   424 				/* Don't allow too fast scrolling */
   425 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   425 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   426 					this->HandleButtonClick(widget);
   426 					this->HandleButtonClick(widget);
   427 					this->SetDirty();
   427 					this->SetDirty();
   428 
   428 
   429 					_patches_newgame.snow_line_height = Clamp(_patches_newgame.snow_line_height + widget - GLAND_SNOW_LEVEL_TEXT, 2, MAX_SNOWLINE_HEIGHT);
   429 					_settings_newgame.game_creation.snow_line_height = Clamp(_settings_newgame.game_creation.snow_line_height + widget - GLAND_SNOW_LEVEL_TEXT, 2, MAX_SNOWLINE_HEIGHT);
   430 				}
   430 				}
   431 				_left_button_clicked = false;
   431 				_left_button_clicked = false;
   432 				break;
   432 				break;
   433 
   433 
   434 			case GLAND_SNOW_LEVEL_TEXT: // Snow line text
   434 			case GLAND_SNOW_LEVEL_TEXT: // Snow line text
   435 				this->widget_id = GLAND_SNOW_LEVEL_TEXT;
   435 				this->widget_id = GLAND_SNOW_LEVEL_TEXT;
   436 				SetDParam(0, _patches_newgame.snow_line_height);
   436 				SetDParam(0, _settings_newgame.game_creation.snow_line_height);
   437 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_SNOW_LINE_QUERY_CAPT, 3, 100, this, CS_NUMERAL);
   437 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_SNOW_LINE_QUERY_CAPT, 3, 100, this, CS_NUMERAL);
   438 				break;
   438 				break;
   439 
   439 
   440 			case GLAND_TREE_PULLDOWN: // Tree placer
   440 			case GLAND_TREE_PULLDOWN: // Tree placer
   441 				ShowDropDownMenu(this, _tree_placer, _patches_newgame.tree_placer, GLAND_TREE_PULLDOWN, 0, 0);
   441 				ShowDropDownMenu(this, _tree_placer, _settings_newgame.game_creation.tree_placer, GLAND_TREE_PULLDOWN, 0, 0);
   442 				break;
   442 				break;
   443 
   443 
   444 			case GLAND_LANDSCAPE_PULLDOWN: // Landscape generator OR Heightmap rotation
   444 			case GLAND_LANDSCAPE_PULLDOWN: // Landscape generator OR Heightmap rotation
   445 			/* case GLAND_HEIGHTMAP_ROTATION_TEXT: case GLAND_HEIGHTMAP_ROTATION_PULLDOWN:*/
   445 			/* case GLAND_HEIGHTMAP_ROTATION_TEXT: case GLAND_HEIGHTMAP_ROTATION_PULLDOWN:*/
   446 				if (mode == GLWP_HEIGHTMAP) {
   446 				if (mode == GLWP_HEIGHTMAP) {
   447 					ShowDropDownMenu(this, _rotation, _patches_newgame.heightmap_rotation, GLAND_HEIGHTMAP_ROTATION_PULLDOWN, 0, 0);
   447 					ShowDropDownMenu(this, _rotation, _settings_newgame.game_creation.heightmap_rotation, GLAND_HEIGHTMAP_ROTATION_PULLDOWN, 0, 0);
   448 				} else {
   448 				} else {
   449 					ShowDropDownMenu(this, _landscape, _patches_newgame.land_generator, GLAND_LANDSCAPE_PULLDOWN, 0, 0);
   449 					ShowDropDownMenu(this, _landscape, _settings_newgame.game_creation.land_generator, GLAND_LANDSCAPE_PULLDOWN, 0, 0);
   450 				}
   450 				}
   451 				break;
   451 				break;
   452 
   452 
   453 			case GLAND_TERRAIN_PULLDOWN: // Terrain type
   453 			case GLAND_TERRAIN_PULLDOWN: // Terrain type
   454 				ShowDropDownMenu(this, _elevations, _opt_newgame.diff.terrain_type, GLAND_TERRAIN_PULLDOWN, 0, 0);
   454 				ShowDropDownMenu(this, _elevations, _opt_newgame.diff.terrain_type, GLAND_TERRAIN_PULLDOWN, 0, 0);
   457 			case GLAND_WATER_PULLDOWN: // Water quantity
   457 			case GLAND_WATER_PULLDOWN: // Water quantity
   458 				ShowDropDownMenu(this, _sea_lakes, _opt_newgame.diff.quantity_sea_lakes, GLAND_WATER_PULLDOWN, 0, 0);
   458 				ShowDropDownMenu(this, _sea_lakes, _opt_newgame.diff.quantity_sea_lakes, GLAND_WATER_PULLDOWN, 0, 0);
   459 				break;
   459 				break;
   460 
   460 
   461 			case GLAND_SMOOTHNESS_PULLDOWN: // Map smoothness
   461 			case GLAND_SMOOTHNESS_PULLDOWN: // Map smoothness
   462 				ShowDropDownMenu(this, _smoothness, _patches_newgame.tgen_smoothness, GLAND_SMOOTHNESS_PULLDOWN, 0, 0);
   462 				ShowDropDownMenu(this, _smoothness, _settings_newgame.game_creation.tgen_smoothness, GLAND_SMOOTHNESS_PULLDOWN, 0, 0);
   463 				break;
   463 				break;
   464 		}
   464 		}
   465 	}
   465 	}
   466 
   466 
   467 	virtual void OnMouseLoop()
   467 	virtual void OnMouseLoop()
   476 		/* the seed is unsigned, therefore atoi cannot be used.
   476 		/* the seed is unsigned, therefore atoi cannot be used.
   477 			* As 2^32 - 1 (MAX_UVALUE(uint32)) is a 'magic' value
   477 			* As 2^32 - 1 (MAX_UVALUE(uint32)) is a 'magic' value
   478 			* (use random seed) it should not be possible to be
   478 			* (use random seed) it should not be possible to be
   479 			* entered into the input field; the generate seed
   479 			* entered into the input field; the generate seed
   480 			* button can be used instead. */
   480 			* button can be used instead. */
   481 		_patches_newgame.generation_seed = minu(strtoul(this->edit_str_buf, NULL, sizeof(this->edit_str_buf) - 1), MAX_UVALUE(uint32) - 1);
   481 		_settings_newgame.game_creation.generation_seed = minu(strtoul(this->edit_str_buf, NULL, sizeof(this->edit_str_buf) - 1), MAX_UVALUE(uint32) - 1);
   482 		return state;
   482 		return state;
   483 	}
   483 	}
   484 
   484 
   485 	virtual void OnDropdownSelect(int widget, int index)
   485 	virtual void OnDropdownSelect(int widget, int index)
   486 	{
   486 	{
   487 		switch (widget) {
   487 		switch (widget) {
   488 			case GLAND_MAPSIZE_X_PULLDOWN:  _patches_newgame.map_x = index; break;
   488 			case GLAND_MAPSIZE_X_PULLDOWN:  _settings_newgame.game_creation.map_x = index; break;
   489 			case GLAND_MAPSIZE_Y_PULLDOWN:  _patches_newgame.map_y = index; break;
   489 			case GLAND_MAPSIZE_Y_PULLDOWN:  _settings_newgame.game_creation.map_y = index; break;
   490 			case GLAND_TREE_PULLDOWN:       _patches_newgame.tree_placer = index; break;
   490 			case GLAND_TREE_PULLDOWN:       _settings_newgame.game_creation.tree_placer = index; break;
   491 			case GLAND_SMOOTHNESS_PULLDOWN: _patches_newgame.tgen_smoothness = index;  break;
   491 			case GLAND_SMOOTHNESS_PULLDOWN: _settings_newgame.game_creation.tgen_smoothness = index;  break;
   492 
   492 
   493 			case GLAND_TOWN_PULLDOWN:
   493 			case GLAND_TOWN_PULLDOWN:
   494 				_opt_newgame.diff.number_towns = index;
   494 				_opt_newgame.diff.number_towns = index;
   495 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   495 				if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
   496 				DoCommandP(0, 2, _opt_newgame.diff.number_towns, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   496 				DoCommandP(0, 2, _opt_newgame.diff.number_towns, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
   503 				break;
   503 				break;
   504 
   504 
   505 			case GLAND_LANDSCAPE_PULLDOWN:
   505 			case GLAND_LANDSCAPE_PULLDOWN:
   506 			/* case GLAND_HEIGHTMAP_PULLDOWN: */
   506 			/* case GLAND_HEIGHTMAP_PULLDOWN: */
   507 				if (mode == GLWP_HEIGHTMAP) {
   507 				if (mode == GLWP_HEIGHTMAP) {
   508 					_patches_newgame.heightmap_rotation = index;
   508 					_settings_newgame.game_creation.heightmap_rotation = index;
   509 				} else {
   509 				} else {
   510 					_patches_newgame.land_generator = index;
   510 					_settings_newgame.game_creation.land_generator = index;
   511 				}
   511 				}
   512 				break;
   512 				break;
   513 
   513 
   514 			case GLAND_TERRAIN_PULLDOWN:
   514 			case GLAND_TERRAIN_PULLDOWN:
   515 				_opt_newgame.diff.terrain_type = index;
   515 				_opt_newgame.diff.terrain_type = index;
   532 			int32 value = atoi(str);
   532 			int32 value = atoi(str);
   533 
   533 
   534 			switch (this->widget_id) {
   534 			switch (this->widget_id) {
   535 				case GLAND_START_DATE_TEXT:
   535 				case GLAND_START_DATE_TEXT:
   536 					this->InvalidateWidget(GLAND_START_DATE_TEXT);
   536 					this->InvalidateWidget(GLAND_START_DATE_TEXT);
   537 					_patches_newgame.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
   537 					_settings_newgame.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
   538 					break;
   538 					break;
   539 
   539 
   540 				case GLAND_SNOW_LEVEL_TEXT:
   540 				case GLAND_SNOW_LEVEL_TEXT:
   541 					this->InvalidateWidget(GLAND_SNOW_LEVEL_TEXT);
   541 					this->InvalidateWidget(GLAND_SNOW_LEVEL_TEXT);
   542 					_patches_newgame.snow_line_height = Clamp(value, 2, MAX_SNOWLINE_HEIGHT);
   542 					_settings_newgame.game_creation.snow_line_height = Clamp(value, 2, MAX_SNOWLINE_HEIGHT);
   543 					break;
   543 					break;
   544 			}
   544 			}
   545 
   545 
   546 			this->SetDirty();
   546 			this->SetDirty();
   547 		}
   547 		}
   568 	uint y = 0;
   568 	uint y = 0;
   569 
   569 
   570 	DeleteWindowByClass(WC_GENERATE_LANDSCAPE);
   570 	DeleteWindowByClass(WC_GENERATE_LANDSCAPE);
   571 
   571 
   572 	/* Always give a new seed if not editor */
   572 	/* Always give a new seed if not editor */
   573 	if (_game_mode != GM_EDITOR) _patches_newgame.generation_seed = InteractiveRandom();
   573 	if (_game_mode != GM_EDITOR) _settings_newgame.game_creation.generation_seed = InteractiveRandom();
   574 
   574 
   575 	if (mode == GLWP_HEIGHTMAP) {
   575 	if (mode == GLWP_HEIGHTMAP) {
   576 		/* If the function returns negative, it means there was a problem loading the heightmap */
   576 		/* If the function returns negative, it means there was a problem loading the heightmap */
   577 		if (!GetHeightmapDimensions(_file_to_saveload.name, &x, &y)) return;
   577 		if (!GetHeightmapDimensions(_file_to_saveload.name, &x, &y)) return;
   578 	}
   578 	}
   598 	_ShowGenerateLandscape(GLWP_HEIGHTMAP);
   598 	_ShowGenerateLandscape(GLWP_HEIGHTMAP);
   599 }
   599 }
   600 
   600 
   601 void StartScenarioEditor()
   601 void StartScenarioEditor()
   602 {
   602 {
   603 	if (_patches_newgame.town_layout == TL_NO_ROADS) {
   603 	if (_settings_newgame.economy.town_layout == TL_NO_ROADS) {
   604 		_patches_newgame.town_layout = TL_ORIGINAL;
   604 		_settings_newgame.economy.town_layout = TL_ORIGINAL;
   605 	}
   605 	}
   606 
   606 
   607 	StartGeneratingLandscape(GLWP_SCENARIO);
   607 	StartGeneratingLandscape(GLWP_SCENARIO);
   608 }
   608 }
   609 
   609 
   610 void StartNewGameWithoutGUI(uint seed)
   610 void StartNewGameWithoutGUI(uint seed)
   611 {
   611 {
   612 	/* GenerateWorld takes care of the possible GENERATE_NEW_SEED value in 'seed' */
   612 	/* GenerateWorld takes care of the possible GENERATE_NEW_SEED value in 'seed' */
   613 	_patches_newgame.generation_seed = seed;
   613 	_settings_newgame.game_creation.generation_seed = seed;
   614 
   614 
   615 	StartGeneratingLandscape(GLWP_GENERATE);
   615 	StartGeneratingLandscape(GLWP_GENERATE);
   616 }
   616 }
   617 
   617 
   618 enum CreateScenarioWindowWidgets {
   618 enum CreateScenarioWindowWidgets {
   647 		this->FindWindowPlacementAndResize(desc);
   647 		this->FindWindowPlacementAndResize(desc);
   648 	}
   648 	}
   649 
   649 
   650 	virtual void OnPaint()
   650 	virtual void OnPaint()
   651 	{
   651 	{
   652 		this->SetWidgetDisabledState(CSCEN_START_DATE_DOWN,       _patches_newgame.starting_year <= MIN_YEAR);
   652 		this->SetWidgetDisabledState(CSCEN_START_DATE_DOWN,       _settings_newgame.game_creation.starting_year <= MIN_YEAR);
   653 		this->SetWidgetDisabledState(CSCEN_START_DATE_UP,         _patches_newgame.starting_year >= MAX_YEAR);
   653 		this->SetWidgetDisabledState(CSCEN_START_DATE_UP,         _settings_newgame.game_creation.starting_year >= MAX_YEAR);
   654 		this->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_DOWN, _patches_newgame.se_flat_world_height <= 0);
   654 		this->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_DOWN, _settings_newgame.game_creation.se_flat_world_height <= 0);
   655 		this->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_UP,   _patches_newgame.se_flat_world_height >= MAX_TILE_HEIGHT);
   655 		this->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_UP,   _settings_newgame.game_creation.se_flat_world_height >= MAX_TILE_HEIGHT);
   656 
   656 
   657 		this->SetWidgetLoweredState(CSCEN_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
   657 		this->SetWidgetLoweredState(CSCEN_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
   658 		this->SetWidgetLoweredState(CSCEN_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
   658 		this->SetWidgetLoweredState(CSCEN_ARCTIC,    _opt_newgame.landscape == LT_ARCTIC);
   659 		this->SetWidgetLoweredState(CSCEN_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
   659 		this->SetWidgetLoweredState(CSCEN_TROPICAL,  _opt_newgame.landscape == LT_TROPIC);
   660 		this->SetWidgetLoweredState(CSCEN_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
   660 		this->SetWidgetLoweredState(CSCEN_TOYLAND,   _opt_newgame.landscape == LT_TOYLAND);
   661 
   661 
   662 		/* Set parameters for widget text that requires them */
   662 		/* Set parameters for widget text that requires them */
   663 		SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1)); // CSCEN_START_DATE_TEXT
   663 		SetDParam(0, ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); // CSCEN_START_DATE_TEXT
   664 		SetDParam(1, 1 << _patches_newgame.map_x); // CSCEN_MAPSIZE_X_PULLDOWN
   664 		SetDParam(1, 1 << _settings_newgame.game_creation.map_x); // CSCEN_MAPSIZE_X_PULLDOWN
   665 		SetDParam(2, 1 << _patches_newgame.map_y); // CSCEN_MAPSIZE_Y_PULLDOWN
   665 		SetDParam(2, 1 << _settings_newgame.game_creation.map_y); // CSCEN_MAPSIZE_Y_PULLDOWN
   666 		SetDParam(3, _patches_newgame.se_flat_world_height); // CSCEN_FLAT_LAND_HEIGHT_TEXT
   666 		SetDParam(3, _settings_newgame.game_creation.se_flat_world_height); // CSCEN_FLAT_LAND_HEIGHT_TEXT
   667 
   667 
   668 		this->DrawWidgets();
   668 		this->DrawWidgets();
   669 	}
   669 	}
   670 
   670 
   671 	virtual void OnClick(Point pt, int widget)
   671 	virtual void OnClick(Point pt, int widget)
   678 				this->RaiseWidget(_opt_newgame.landscape + CSCEN_TEMPERATE);
   678 				this->RaiseWidget(_opt_newgame.landscape + CSCEN_TEMPERATE);
   679 				SetNewLandscapeType(widget - CSCEN_TEMPERATE);
   679 				SetNewLandscapeType(widget - CSCEN_TEMPERATE);
   680 				break;
   680 				break;
   681 
   681 
   682 			case CSCEN_MAPSIZE_X_PULLDOWN: // Mapsize X
   682 			case CSCEN_MAPSIZE_X_PULLDOWN: // Mapsize X
   683 				ShowDropDownList(this, BuildMapsizeDropDown(), _patches_newgame.map_x, CSCEN_MAPSIZE_X_PULLDOWN);
   683 				ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_x, CSCEN_MAPSIZE_X_PULLDOWN);
   684 				break;
   684 				break;
   685 
   685 
   686 			case CSCEN_MAPSIZE_Y_PULLDOWN: // Mapsize Y
   686 			case CSCEN_MAPSIZE_Y_PULLDOWN: // Mapsize Y
   687 				ShowDropDownList(this, BuildMapsizeDropDown(), _patches_newgame.map_y, CSCEN_MAPSIZE_Y_PULLDOWN);
   687 				ShowDropDownList(this, BuildMapsizeDropDown(), _settings_newgame.game_creation.map_y, CSCEN_MAPSIZE_Y_PULLDOWN);
   688 				break;
   688 				break;
   689 
   689 
   690 			case CSCEN_EMPTY_WORLD: // Empty world / flat world
   690 			case CSCEN_EMPTY_WORLD: // Empty world / flat world
   691 				StartGeneratingLandscape(GLWP_SCENARIO);
   691 				StartGeneratingLandscape(GLWP_SCENARIO);
   692 				break;
   692 				break;
   700 				/* Don't allow too fast scrolling */
   700 				/* Don't allow too fast scrolling */
   701 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   701 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   702 					this->HandleButtonClick(widget);
   702 					this->HandleButtonClick(widget);
   703 					this->SetDirty();
   703 					this->SetDirty();
   704 
   704 
   705 					_patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + widget - CSCEN_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   705 					_settings_newgame.game_creation.starting_year = Clamp(_settings_newgame.game_creation.starting_year + widget - CSCEN_START_DATE_TEXT, MIN_YEAR, MAX_YEAR);
   706 				}
   706 				}
   707 				_left_button_clicked = false;
   707 				_left_button_clicked = false;
   708 				break;
   708 				break;
   709 
   709 
   710 			case CSCEN_START_DATE_TEXT: // Year text
   710 			case CSCEN_START_DATE_TEXT: // Year text
   711 				this->widget_id = CSCEN_START_DATE_TEXT;
   711 				this->widget_id = CSCEN_START_DATE_TEXT;
   712 				SetDParam(0, _patches_newgame.starting_year);
   712 				SetDParam(0, _settings_newgame.game_creation.starting_year);
   713 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, this, CS_NUMERAL);
   713 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_START_DATE_QUERY_CAPT, 8, 100, this, CS_NUMERAL);
   714 				break;
   714 				break;
   715 
   715 
   716 			case CSCEN_FLAT_LAND_HEIGHT_DOWN:
   716 			case CSCEN_FLAT_LAND_HEIGHT_DOWN:
   717 			case CSCEN_FLAT_LAND_HEIGHT_UP: // Height level buttons
   717 			case CSCEN_FLAT_LAND_HEIGHT_UP: // Height level buttons
   718 				/* Don't allow too fast scrolling */
   718 				/* Don't allow too fast scrolling */
   719 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   719 				if ((this->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   720 					this->HandleButtonClick(widget);
   720 					this->HandleButtonClick(widget);
   721 					this->SetDirty();
   721 					this->SetDirty();
   722 
   722 
   723 					_patches_newgame.se_flat_world_height = Clamp(_patches_newgame.se_flat_world_height + widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, MAX_TILE_HEIGHT);
   723 					_settings_newgame.game_creation.se_flat_world_height = Clamp(_settings_newgame.game_creation.se_flat_world_height + widget - CSCEN_FLAT_LAND_HEIGHT_TEXT, 0, MAX_TILE_HEIGHT);
   724 				}
   724 				}
   725 				_left_button_clicked = false;
   725 				_left_button_clicked = false;
   726 				break;
   726 				break;
   727 
   727 
   728 			case CSCEN_FLAT_LAND_HEIGHT_TEXT: // Height level text
   728 			case CSCEN_FLAT_LAND_HEIGHT_TEXT: // Height level text
   729 				this->widget_id = CSCEN_FLAT_LAND_HEIGHT_TEXT;
   729 				this->widget_id = CSCEN_FLAT_LAND_HEIGHT_TEXT;
   730 				SetDParam(0, _patches_newgame.se_flat_world_height);
   730 				SetDParam(0, _settings_newgame.game_creation.se_flat_world_height);
   731 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_FLAT_WORLD_HEIGHT_QUERY_CAPT, 3, 100, this, CS_NUMERAL);
   731 				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_FLAT_WORLD_HEIGHT_QUERY_CAPT, 3, 100, this, CS_NUMERAL);
   732 				break;
   732 				break;
   733 		}
   733 		}
   734 	}
   734 	}
   735 
   735 
   736 	virtual void OnDropdownSelect(int widget, int index)
   736 	virtual void OnDropdownSelect(int widget, int index)
   737 	{
   737 	{
   738 		switch (widget) {
   738 		switch (widget) {
   739 			case CSCEN_MAPSIZE_X_PULLDOWN: _patches_newgame.map_x = index; break;
   739 			case CSCEN_MAPSIZE_X_PULLDOWN: _settings_newgame.game_creation.map_x = index; break;
   740 			case CSCEN_MAPSIZE_Y_PULLDOWN: _patches_newgame.map_y = index; break;
   740 			case CSCEN_MAPSIZE_Y_PULLDOWN: _settings_newgame.game_creation.map_y = index; break;
   741 		}
   741 		}
   742 		this->SetDirty();
   742 		this->SetDirty();
   743 	}
   743 	}
   744 
   744 
   745 	virtual void OnQueryTextFinished(char *str)
   745 	virtual void OnQueryTextFinished(char *str)
   748 			int32 value = atoi(str);
   748 			int32 value = atoi(str);
   749 
   749 
   750 			switch (this->widget_id) {
   750 			switch (this->widget_id) {
   751 				case CSCEN_START_DATE_TEXT:
   751 				case CSCEN_START_DATE_TEXT:
   752 					this->InvalidateWidget(CSCEN_START_DATE_TEXT);
   752 					this->InvalidateWidget(CSCEN_START_DATE_TEXT);
   753 					_patches_newgame.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
   753 					_settings_newgame.game_creation.starting_year = Clamp(value, MIN_YEAR, MAX_YEAR);
   754 					break;
   754 					break;
   755 
   755 
   756 				case CSCEN_FLAT_LAND_HEIGHT_TEXT:
   756 				case CSCEN_FLAT_LAND_HEIGHT_TEXT:
   757 					this->InvalidateWidget(CSCEN_FLAT_LAND_HEIGHT_TEXT);
   757 					this->InvalidateWidget(CSCEN_FLAT_LAND_HEIGHT_TEXT);
   758 					_patches_newgame.se_flat_world_height = Clamp(value, 0, MAX_TILE_HEIGHT);
   758 					_settings_newgame.game_creation.se_flat_world_height = Clamp(value, 0, MAX_TILE_HEIGHT);
   759 					break;
   759 					break;
   760 			}
   760 			}
   761 
   761 
   762 			this->SetDirty();
   762 			this->SetDirty();
   763 		}
   763 		}