From 848b328a82fde5e9b1bef975495ed3b2b4bb2daa Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Sun, 8 Sep 2024 22:43:03 +0200 Subject: [PATCH 01/39] Use MapGenSettings struct to store settings in MapGen window --- src/openrct2-ui/windows/MapGen.cpp | 270 +++++++++++++++-------------- 1 file changed, 138 insertions(+), 132 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 3f6c6718d6..ba637dda2d 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -308,26 +308,35 @@ namespace OpenRCT2::Ui::Windows class MapGenWindow final : public Window { private: - TileCoordsXY _mapSize{ 150, 150 }; ResizeDirection _resizeDirection{ ResizeDirection::Both }; bool _mapWidthAndHeightLinked{ true }; - int32_t _baseHeight = 12; - int32_t _waterLevel = 6; - int32_t _floorTexture = 0; - int32_t _wallTexture = 0; + + MapGenSettings _settings{ + // Base + .mapSize{ 150, 150 }, + .height = 12, + .water_level = 6, + .floor = 0, + .wall = 0, + + // Features (e.g. tree, rivers, lakes etc.) + .trees = 1, + + // Simplex Noise Parameters + .simplex_low = 6, + .simplex_high = 10, + .simplex_base_freq = 60, + .simplex_octaves = 4, + + // Height map _settings + .smooth = true, + .smooth_height_map = false, + .smooth_strength = 1, + .normalize_height = false, + }; + bool _randomTerrain = true; - int32_t _placeTrees = 1; - - int32_t _simplex_low = 6; - int32_t _simplex_high = 10; - int32_t _simplex_base_freq = 60; - int32_t _simplex_octaves = 4; - bool _heightmapLoaded = false; - bool _heightmapSmoothMap = false; - int32_t _heightmapSmoothStrength = 1; - bool _heightmapNormalize = false; - bool _heightmapSmoothTiles = true; int32_t _heightmapLow = 2; int32_t _heightmapHigh = 70; @@ -346,9 +355,9 @@ namespace OpenRCT2::Ui::Windows if (newPage == WINDOW_MAPGEN_PAGE_HEIGHTMAP && _heightmapLoaded) { SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _heightmapSmoothMap); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _heightmapSmoothMap); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _heightmapSmoothMap); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILES, true); SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH, true); @@ -406,12 +415,12 @@ namespace OpenRCT2::Ui::Windows _resizeDirection = ResizeDirection::Both; if (_resizeDirection != ResizeDirection::X) - _mapSize.y = std::clamp( - _mapSize.y + sizeOffset, static_cast(kMinimumMapSizeTechnical), + _settings.mapSize.y = std::clamp( + _settings.mapSize.y + sizeOffset, static_cast(kMinimumMapSizeTechnical), static_cast(kMaximumMapSizeTechnical)); if (_resizeDirection != ResizeDirection::Y) - _mapSize.x = std::clamp( - _mapSize.x + sizeOffset, static_cast(kMinimumMapSizeTechnical), + _settings.mapSize.x = std::clamp( + _settings.mapSize.x + sizeOffset, static_cast(kMinimumMapSizeTechnical), static_cast(kMaximumMapSizeTechnical)); } @@ -449,45 +458,49 @@ namespace OpenRCT2::Ui::Windows { SharedMouseUp(widgetIndex); - MapGenSettings mapgenSettings; - Formatter ft; switch (widgetIndex) { case WIDX_MAP_GENERATE: - mapgenSettings.mapSize = _mapSize; - mapgenSettings.height = _baseHeight + 2; - mapgenSettings.water_level = _waterLevel + 2; - mapgenSettings.floor = _floorTexture; - mapgenSettings.wall = _wallTexture; + { + MapGenSettings mapgenSettings = _settings; + mapgenSettings.height += 2; + mapgenSettings.water_level += 2; MapGenGenerateBlank(&mapgenSettings); GfxInvalidateScreen(); break; + } case WIDX_MAP_SIZE_Y: _resizeDirection = ResizeDirection::Y; - InputMapSize(WIDX_MAP_SIZE_Y, _mapSize.y); + InputMapSize(WIDX_MAP_SIZE_Y, _settings.mapSize.y); break; case WIDX_MAP_SIZE_X: _resizeDirection = ResizeDirection::X; - InputMapSize(WIDX_MAP_SIZE_X, _mapSize.x); + InputMapSize(WIDX_MAP_SIZE_X, _settings.mapSize.x); break; case WIDX_MAP_SIZE_LINK: _mapWidthAndHeightLinked = !_mapWidthAndHeightLinked; break; case WIDX_BASE_HEIGHT: + { + Formatter ft; ft.Add((BASESIZE_MIN - 12) / 2); ft.Add((BASESIZE_MAX - 12) / 2); WindowTextInputOpen( this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, - (_baseHeight - 12) / 2, 3); + (_settings.height - 12) / 2, 3); break; + } case WIDX_WATER_LEVEL: + { + Formatter ft; ft.Add((WATERLEVEL_MIN - 12) / 2); ft.Add((WATERLEVEL_MAX - 12) / 2); WindowTextInputOpen( this, WIDX_WATER_LEVEL, STR_WATER_LEVEL, STR_ENTER_WATER_LEVEL, ft, STR_FORMAT_INTEGER, - (_waterLevel - 12) / 2, 3); + (_settings.water_level - 12) / 2, 3); break; + } } } @@ -516,26 +529,26 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_BASE_HEIGHT_UP: - _baseHeight = std::min(_baseHeight + 2, BASESIZE_MAX); + _settings.height = std::min(_settings.height + 2, BASESIZE_MAX); Invalidate(); break; case WIDX_BASE_HEIGHT_DOWN: - _baseHeight = std::max(_baseHeight - 2, BASESIZE_MIN); + _settings.height = std::max(_settings.height - 2, BASESIZE_MIN); Invalidate(); break; case WIDX_WATER_LEVEL_UP: - _waterLevel = std::min(_waterLevel + 2, WATERLEVEL_MAX); + _settings.water_level = std::min(_settings.water_level + 2, WATERLEVEL_MAX); Invalidate(); break; case WIDX_WATER_LEVEL_DOWN: - _waterLevel = std::max(_waterLevel - 2, WATERLEVEL_MIN); + _settings.water_level = std::max(_settings.water_level - 2, WATERLEVEL_MIN); Invalidate(); break; case WIDX_FLOOR_TEXTURE: - LandTool::ShowSurfaceStyleDropdown(this, widget, _floorTexture); + LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.floor); break; case WIDX_WALL_TEXTURE: - LandTool::ShowEdgeStyleDropdown(this, widget, _wallTexture); + LandTool::ShowEdgeStyleDropdown(this, widget, _settings.wall); break; } } @@ -550,7 +563,7 @@ namespace OpenRCT2::Ui::Windows if (dropdownIndex == -1) dropdownIndex = gDropdownHighlightedIndex; - type = (dropdownIndex == -1) ? _floorTexture : dropdownIndex; + type = (dropdownIndex == -1) ? _settings.floor : dropdownIndex; if (gLandToolTerrainSurface == type) { @@ -559,7 +572,7 @@ namespace OpenRCT2::Ui::Windows else { gLandToolTerrainSurface = type; - _floorTexture = type; + _settings.floor = type; } Invalidate(); break; @@ -567,7 +580,7 @@ namespace OpenRCT2::Ui::Windows if (dropdownIndex == -1) dropdownIndex = gDropdownHighlightedIndex; - type = (dropdownIndex == -1) ? _wallTexture : dropdownIndex; + type = (dropdownIndex == -1) ? _settings.wall : dropdownIndex; if (gLandToolTerrainEdge == type) { @@ -576,7 +589,7 @@ namespace OpenRCT2::Ui::Windows else { gLandToolTerrainEdge = type; - _wallTexture = type; + _settings.wall = type; } Invalidate(); break; @@ -613,15 +626,15 @@ namespace OpenRCT2::Ui::Windows // The practical size is 2 lower than the technical size value += 2; if (_resizeDirection == ResizeDirection::Y || _mapWidthAndHeightLinked) - _mapSize.y = value; + _settings.mapSize.y = value; if (_resizeDirection == ResizeDirection::X || _mapWidthAndHeightLinked) - _mapSize.x = value; + _settings.mapSize.x = value; break; case WIDX_BASE_HEIGHT: - _baseHeight = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); + _settings.height = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); break; case WIDX_WATER_LEVEL: - _waterLevel = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); + _settings.water_level = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); break; } @@ -638,14 +651,14 @@ namespace OpenRCT2::Ui::Windows // Only allow linking the map size when X and Y are the same SetWidgetPressed(WIDX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); - SetWidgetDisabled(WIDX_MAP_SIZE_LINK, _mapSize.x != _mapSize.y); + SetWidgetDisabled(WIDX_MAP_SIZE_LINK, _settings.mapSize.x != _settings.mapSize.y); SetPressedTab(); // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use auto ft = Formatter::Common(); - ft.Add(_mapSize.y - 2); - ft.Add(_mapSize.x - 2); + ft.Add(_settings.mapSize.y - 2); + ft.Add(_settings.mapSize.x - 2); } void DrawDropdownButton(DrawPixelInfo& dpi, WidgetIndex widgetIndex, ImageId image) @@ -674,7 +687,7 @@ namespace OpenRCT2::Ui::Windows { auto& objManager = GetContext()->GetObjectManager(); const auto surfaceObj = static_cast( - objManager.GetLoadedObject(ObjectType::TerrainSurface, _floorTexture)); + objManager.GetLoadedObject(ObjectType::TerrainSurface, _settings.floor)); ImageId surfaceImage; if (surfaceObj != nullptr) { @@ -687,7 +700,7 @@ namespace OpenRCT2::Ui::Windows ImageId edgeImage; const auto edgeObj = static_cast( - objManager.GetLoadedObject(ObjectType::TerrainEdge, _wallTexture)); + objManager.GetLoadedObject(ObjectType::TerrainEdge, _settings.wall)); if (edgeObj != nullptr) { edgeImage = ImageId(edgeObj->IconImageId); @@ -718,13 +731,13 @@ namespace OpenRCT2::Ui::Windows { textColour }); auto ft = Formatter(); - ft.Add((_baseHeight - 12) / 2); + ft.Add((_settings.height - 12) / 2); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_COMMA16, ft, { colours[1] }); ft = Formatter(); - ft.Add((_waterLevel - 12) / 2); + ft.Add((_settings.water_level - 12) / 2); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_WATER_LEVEL].left + 1, widgets[WIDX_WATER_LEVEL].top + 1 }, STR_COMMA16, ft, { colours[1] }); @@ -738,17 +751,18 @@ namespace OpenRCT2::Ui::Windows { SharedMouseUp(widgetIndex); - MapGenSettings mapgenSettings; - switch (widgetIndex) { case WIDX_RANDOM_GENERATE: - mapgenSettings.mapSize = _mapSize; - mapgenSettings.height = _baseHeight + 2; - mapgenSettings.water_level = _waterLevel + 2; - mapgenSettings.floor = _randomTerrain ? -1 : _floorTexture; - mapgenSettings.wall = _randomTerrain ? -1 : _wallTexture; - mapgenSettings.trees = _placeTrees; + { + MapGenSettings mapgenSettings = _settings; + mapgenSettings.height += 2; + mapgenSettings.water_level += 2; + if (_randomTerrain) + { + mapgenSettings.floor = -1; + mapgenSettings.wall = -1; + } mapgenSettings.simplex_low = UtilRand() % 4; mapgenSettings.simplex_high = 12 + (UtilRand() % (32 - 12)); @@ -758,11 +772,12 @@ namespace OpenRCT2::Ui::Windows MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; + } case WIDX_RANDOM_TERRAIN: _randomTerrain = !_randomTerrain; break; case WIDX_RANDOM_PLACE_TREES: - _placeTrees ^= 1; + _settings.trees ^= 1; break; } } @@ -786,7 +801,7 @@ namespace OpenRCT2::Ui::Windows pressed_widgets = 0; if (_randomTerrain) pressed_widgets |= 1uLL << WIDX_RANDOM_TERRAIN; - if (_placeTrees) + if (_settings.trees) pressed_widgets |= 1uLL << WIDX_RANDOM_PLACE_TREES; SetPressedTab(); @@ -806,38 +821,34 @@ namespace OpenRCT2::Ui::Windows { SharedMouseUp(widgetIndex); - MapGenSettings mapgenSettings; - switch (widgetIndex) { case WIDX_SIMPLEX_MAP_SIZE_Y: _resizeDirection = ResizeDirection::Y; - InputMapSize(WIDX_SIMPLEX_MAP_SIZE_Y, _mapSize.y); + InputMapSize(WIDX_SIMPLEX_MAP_SIZE_Y, _settings.mapSize.y); break; case WIDX_SIMPLEX_MAP_SIZE_X: _resizeDirection = ResizeDirection::X; - InputMapSize(WIDX_SIMPLEX_MAP_SIZE_X, _mapSize.x); + InputMapSize(WIDX_SIMPLEX_MAP_SIZE_X, _settings.mapSize.x); break; case WIDX_SIMPLEX_MAP_SIZE_LINK: _mapWidthAndHeightLinked = !_mapWidthAndHeightLinked; break; case WIDX_SIMPLEX_GENERATE: - mapgenSettings.mapSize = _mapSize; - - mapgenSettings.height = _baseHeight; - mapgenSettings.water_level = _waterLevel + kMinimumWaterHeight; - mapgenSettings.floor = _randomTerrain ? -1 : _floorTexture; - mapgenSettings.wall = _randomTerrain ? -1 : _wallTexture; - mapgenSettings.trees = _placeTrees; - - mapgenSettings.simplex_low = _simplex_low; - mapgenSettings.simplex_high = _simplex_high; - mapgenSettings.simplex_base_freq = (static_cast(_simplex_base_freq)) / 100.00f; - mapgenSettings.simplex_octaves = _simplex_octaves; + { + MapGenSettings mapgenSettings = _settings; + mapgenSettings.water_level += kMinimumWaterHeight; + mapgenSettings.simplex_base_freq /= 100.00f; + if (_randomTerrain) + { + mapgenSettings.floor = -1; + mapgenSettings.wall = -1; + } MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; + } } } @@ -846,35 +857,35 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_SIMPLEX_LOW_UP: - _simplex_low = std::min(_simplex_low + 1, 24); + _settings.simplex_low = std::min(_settings.simplex_low + 1, 24); Invalidate(); break; case WIDX_SIMPLEX_LOW_DOWN: - _simplex_low = std::max(_simplex_low - 1, 0); + _settings.simplex_low = std::max(_settings.simplex_low - 1, 0); Invalidate(); break; case WIDX_SIMPLEX_HIGH_UP: - _simplex_high = std::min(_simplex_high + 1, 36); + _settings.simplex_high = std::min(_settings.simplex_high + 1, 36); Invalidate(); break; case WIDX_SIMPLEX_HIGH_DOWN: - _simplex_high = std::max(_simplex_high - 1, 0); + _settings.simplex_high = std::max(_settings.simplex_high - 1, 0); Invalidate(); break; case WIDX_SIMPLEX_BASE_FREQ_UP: - _simplex_base_freq = std::min(_simplex_base_freq + 5, 1000); + _settings.simplex_base_freq = std::min(_settings.simplex_base_freq + 5, 1000); Invalidate(); break; case WIDX_SIMPLEX_BASE_FREQ_DOWN: - _simplex_base_freq = std::max(_simplex_base_freq - 5, 0); + _settings.simplex_base_freq = std::max(_settings.simplex_base_freq - 5, 0); Invalidate(); break; case WIDX_SIMPLEX_OCTAVES_UP: - _simplex_octaves = std::min(_simplex_octaves + 1, 10); + _settings.simplex_octaves = std::min(_settings.simplex_octaves + 1, 10); Invalidate(); break; case WIDX_SIMPLEX_OCTAVES_DOWN: - _simplex_octaves = std::max(_simplex_octaves - 1, 1); + _settings.simplex_octaves = std::max(_settings.simplex_octaves - 1, 1); Invalidate(); break; case WIDX_SIMPLEX_MAP_SIZE_Y_UP: @@ -898,11 +909,11 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_SIMPLEX_WATER_LEVEL_UP: - _waterLevel = std::min(_waterLevel + kMinimumWaterHeight, kMinimumWaterHeight + kMaximumWaterHeight); + _settings.water_level = std::min(_settings.water_level + kMinimumWaterHeight, kMinimumWaterHeight + kMaximumWaterHeight); Invalidate(); break; case WIDX_SIMPLEX_WATER_LEVEL_DOWN: - _waterLevel = std::max(_waterLevel - kMinimumWaterHeight, 0); + _settings.water_level = std::max(_settings.water_level - kMinimumWaterHeight, 0); Invalidate(); break; case WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX: @@ -910,13 +921,13 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_SIMPLEX_FLOOR_TEXTURE: - LandTool::ShowSurfaceStyleDropdown(this, widget, _floorTexture); + LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.floor); break; case WIDX_SIMPLEX_WALL_TEXTURE: - LandTool::ShowEdgeStyleDropdown(this, widget, _wallTexture); + LandTool::ShowEdgeStyleDropdown(this, widget, _settings.wall); break; case WIDX_SIMPLEX_PLACE_TREES_CHECKBOX: - _placeTrees ^= 1; + _settings.trees ^= 1; Invalidate(); break; } @@ -932,7 +943,7 @@ namespace OpenRCT2::Ui::Windows if (dropdownIndex == -1) dropdownIndex = gDropdownHighlightedIndex; - type = (dropdownIndex == -1) ? _floorTexture : dropdownIndex; + type = (dropdownIndex == -1) ? _settings.floor : dropdownIndex; if (gLandToolTerrainSurface == type) { @@ -941,7 +952,7 @@ namespace OpenRCT2::Ui::Windows else { gLandToolTerrainSurface = type; - _floorTexture = type; + _settings.floor = type; } Invalidate(); break; @@ -949,7 +960,7 @@ namespace OpenRCT2::Ui::Windows if (dropdownIndex == -1) dropdownIndex = gDropdownHighlightedIndex; - type = (dropdownIndex == -1) ? _wallTexture : dropdownIndex; + type = (dropdownIndex == -1) ? _settings.wall : dropdownIndex; if (gLandToolTerrainEdge == type) { @@ -958,7 +969,7 @@ namespace OpenRCT2::Ui::Windows else { gLandToolTerrainEdge = type; - _wallTexture = type; + _settings.wall = type; } Invalidate(); break; @@ -983,10 +994,10 @@ namespace OpenRCT2::Ui::Windows // Only allow linking the map size when X and Y are the same SetWidgetPressed(WIDX_SIMPLEX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); - SetWidgetDisabled(WIDX_SIMPLEX_MAP_SIZE_LINK, _mapSize.x != _mapSize.y); + SetWidgetDisabled(WIDX_SIMPLEX_MAP_SIZE_LINK, _settings.mapSize.x != _settings.mapSize.y); SetCheckboxValue(WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX, _randomTerrain != 0); - SetCheckboxValue(WIDX_SIMPLEX_PLACE_TREES_CHECKBOX, _placeTrees != 0); + SetCheckboxValue(WIDX_SIMPLEX_PLACE_TREES_CHECKBOX, _settings.trees != 0); // Only allow floor and wall texture options if random terrain is disabled if (!_randomTerrain) @@ -1004,8 +1015,8 @@ namespace OpenRCT2::Ui::Windows // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use auto ft = Formatter::Common(); - ft.Add(_mapSize.y - 2); - ft.Add(_mapSize.x - 2); + ft.Add(_settings.mapSize.y - 2); + ft.Add(_settings.mapSize.x - 2); } void SimplexDraw(DrawPixelInfo& dpi) @@ -1036,23 +1047,23 @@ namespace OpenRCT2::Ui::Windows { textColour }); auto ft = Formatter(); - ft.Add(_simplex_low); + ft.Add(_settings.simplex_low); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_LOW].left + 1, widgets[WIDX_SIMPLEX_LOW].top + 1 }, STR_COMMA16, ft, { textColour }); ft = Formatter(); - ft.Add(_simplex_high); + ft.Add(_settings.simplex_high); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_HIGH].left + 1, widgets[WIDX_SIMPLEX_HIGH].top + 1 }, STR_COMMA16, ft, { textColour }); ft = Formatter(); - ft.Add(_simplex_base_freq); + ft.Add(_settings.simplex_base_freq); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_BASE_FREQ].left + 1, widgets[WIDX_SIMPLEX_BASE_FREQ].top + 1 }, STR_WINDOW_COLOUR_2_COMMA2DP32, ft, { textColour }); ft = Formatter(); - ft.Add(_simplex_octaves); + ft.Add(_settings.simplex_octaves); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_OCTAVES].left + 1, widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, @@ -1065,7 +1076,7 @@ namespace OpenRCT2::Ui::Windows STR_MAPGEN_OPTION_PLACE_TREES, {}, { textColour }); ft = Formatter(); - ft.Add((_waterLevel - 12) / 2); + ft.Add((_settings.water_level - 12) / 2); DrawTextBasic( dpi, windowPos @@ -1082,11 +1093,11 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_HEIGHTMAP_STRENGTH_UP: - _heightmapSmoothStrength = std::min(_heightmapSmoothStrength + 1, MAX_SMOOTH_ITERATIONS); + _settings.smooth_strength = std::min(_settings.smooth_strength + 1, MAX_SMOOTH_ITERATIONS); InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; case WIDX_HEIGHTMAP_STRENGTH_DOWN: - _heightmapSmoothStrength = std::max(_heightmapSmoothStrength - 1, 1); + _settings.smooth_strength = std::max(_settings.smooth_strength - 1, 1); InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; case WIDX_HEIGHTMAP_LOW_UP: @@ -1108,11 +1119,11 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; case WIDX_HEIGHTMAP_WATER_LEVEL_UP: - _waterLevel = std::min(_waterLevel + kMinimumWaterHeight, kMinimumWaterHeight + kMaximumWaterHeight); + _settings.water_level = std::min(_settings.water_level + kMinimumWaterHeight, kMinimumWaterHeight + kMaximumWaterHeight); InvalidateWidget(WIDX_HEIGHTMAP_WATER_LEVEL); break; case WIDX_HEIGHTMAP_WATER_LEVEL_DOWN: - _waterLevel = std::max(_waterLevel - kMinimumWaterHeight, 0); + _settings.water_level = std::max(_settings.water_level - kMinimumWaterHeight, 0); InvalidateWidget(WIDX_HEIGHTMAP_WATER_LEVEL); break; } @@ -1120,12 +1131,7 @@ namespace OpenRCT2::Ui::Windows void HeightmapGenerateMap() { - MapGenSettings mapgenSettings; - mapgenSettings.water_level = _waterLevel; - mapgenSettings.smooth = _heightmapSmoothTiles; - mapgenSettings.smooth_height_map = _heightmapSmoothMap; - mapgenSettings.smooth_strength = _heightmapSmoothStrength; - mapgenSettings.normalize_height = _heightmapNormalize; + MapGenSettings mapgenSettings = _settings; mapgenSettings.simplex_low = _heightmapLow; mapgenSettings.simplex_high = _heightmapHigh; MapGenGenerateFromHeightmap(&mapgenSettings); @@ -1155,22 +1161,22 @@ namespace OpenRCT2::Ui::Windows return; } case WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP: - _heightmapSmoothMap = !_heightmapSmoothMap; - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _heightmapSmoothMap); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _heightmapSmoothMap); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _heightmapSmoothMap); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _heightmapSmoothMap); + _settings.smooth_height_map = !_settings.smooth_height_map; + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP); InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; case WIDX_HEIGHTMAP_NORMALIZE: - _heightmapNormalize = !_heightmapNormalize; - SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _heightmapNormalize); + _settings.normalize_height = !_settings.normalize_height; + SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); InvalidateWidget(WIDX_HEIGHTMAP_NORMALIZE); break; case WIDX_HEIGHTMAP_SMOOTH_TILES: - _heightmapSmoothTiles = !_heightmapSmoothTiles; - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILES, _heightmapSmoothTiles); + _settings.smooth = !_settings.smooth; + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILES, _settings.smooth); InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_TILES); break; } @@ -1187,9 +1193,9 @@ namespace OpenRCT2::Ui::Windows InitScrollWidgets(); } - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _heightmapSmoothMap); - SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _heightmapNormalize); - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILES, _heightmapSmoothTiles); + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _settings.smooth_height_map); + SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILES, _settings.smooth); SetPressedTab(); } @@ -1203,13 +1209,13 @@ namespace OpenRCT2::Ui::Windows const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); // Smooth strength label and value - const auto strengthColour = _heightmapSmoothMap ? enabledColour : disabledColour; + const auto strengthColour = _settings.smooth_height_map ? enabledColour : disabledColour; DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, { strengthColour }); auto ft = Formatter(); - ft.Add(_heightmapSmoothStrength); + ft.Add(_settings.smooth_strength); DrawTextBasic( dpi, windowPos @@ -1245,7 +1251,7 @@ namespace OpenRCT2::Ui::Windows { labelColour }); ft = Formatter(); - ft.Add(_waterLevel); + ft.Add(_settings.water_level); DrawTextBasic( dpi, windowPos From 0c9c79d18607d3608852053e22a1a5b60fb3858f Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Sun, 8 Sep 2024 22:44:27 +0200 Subject: [PATCH 02/39] ChangeMapSize: use templated std::clamp and drop static casts --- src/openrct2-ui/windows/MapGen.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index ba637dda2d..57a106c69b 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -415,13 +415,16 @@ namespace OpenRCT2::Ui::Windows _resizeDirection = ResizeDirection::Both; if (_resizeDirection != ResizeDirection::X) - _settings.mapSize.y = std::clamp( - _settings.mapSize.y + sizeOffset, static_cast(kMinimumMapSizeTechnical), - static_cast(kMaximumMapSizeTechnical)); + { + _settings.mapSize.y = std::clamp( + _settings.mapSize.y + sizeOffset, kMinimumMapSizeTechnical, kMaximumMapSizeTechnical); + } + if (_resizeDirection != ResizeDirection::Y) - _settings.mapSize.x = std::clamp( - _settings.mapSize.x + sizeOffset, static_cast(kMinimumMapSizeTechnical), - static_cast(kMaximumMapSizeTechnical)); + { + _settings.mapSize.x = std::clamp( + _settings.mapSize.x + sizeOffset, kMinimumMapSizeTechnical, kMaximumMapSizeTechnical); + } } void InputMapSize(WidgetIndex callingWidget, int32_t currentValue) From 0607f55f1439912b7b8321edfee80866670ecd5b Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 9 Sep 2024 20:17:33 +0200 Subject: [PATCH 03/39] Consolidate terrain and water settings in two new dedicated tabs --- src/openrct2-ui/windows/MapGen.cpp | 858 +++++++++++++++-------------- 1 file changed, 442 insertions(+), 416 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 57a106c69b..f58c193b90 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -34,6 +34,8 @@ namespace OpenRCT2::Ui::Windows WINDOW_MAPGEN_PAGE_RANDOM, WINDOW_MAPGEN_PAGE_SIMPLEX, WINDOW_MAPGEN_PAGE_HEIGHTMAP, + WINDOW_MAPGEN_PAGE_TERRAIN, + WINDOW_MAPGEN_PAGE_WATER, WINDOW_MAPGEN_PAGE_COUNT }; @@ -47,6 +49,8 @@ namespace OpenRCT2::Ui::Windows WIDX_TAB_2, WIDX_TAB_3, WIDX_TAB_4, + WIDX_TAB_5, + WIDX_TAB_6, TAB_BEGIN, @@ -58,17 +62,8 @@ namespace OpenRCT2::Ui::Windows WIDX_MAP_SIZE_X, WIDX_MAP_SIZE_X_UP, WIDX_MAP_SIZE_X_DOWN, - WIDX_BASE_HEIGHT, - WIDX_BASE_HEIGHT_UP, - WIDX_BASE_HEIGHT_DOWN, - WIDX_WATER_LEVEL, - WIDX_WATER_LEVEL_UP, - WIDX_WATER_LEVEL_DOWN, - WIDX_FLOOR_TEXTURE, - WIDX_WALL_TEXTURE, WIDX_RANDOM_GENERATE = TAB_BEGIN, - WIDX_RANDOM_TERRAIN, WIDX_RANDOM_PLACE_TREES, WIDX_SIMPLEX_GENERATE = TAB_BEGIN, @@ -85,20 +80,6 @@ namespace OpenRCT2::Ui::Windows WIDX_SIMPLEX_OCTAVES, WIDX_SIMPLEX_OCTAVES_UP, WIDX_SIMPLEX_OCTAVES_DOWN, - WIDX_SIMPLEX_MAP_SIZE_Y, - WIDX_SIMPLEX_MAP_SIZE_Y_UP, - WIDX_SIMPLEX_MAP_SIZE_Y_DOWN, - WIDX_SIMPLEX_MAP_SIZE_LINK, - WIDX_SIMPLEX_MAP_SIZE_X, - WIDX_SIMPLEX_MAP_SIZE_X_UP, - WIDX_SIMPLEX_MAP_SIZE_X_DOWN, - WIDX_SIMPLEX_WATER_LEVEL, - WIDX_SIMPLEX_WATER_LEVEL_UP, - WIDX_SIMPLEX_WATER_LEVEL_DOWN, - WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX, - WIDX_SIMPLEX_FLOOR_TEXTURE, - WIDX_SIMPLEX_WALL_TEXTURE, - WIDX_SIMPLEX_PLACE_TREES_CHECKBOX, WIDX_HEIGHTMAP_SELECT = TAB_BEGIN, WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, @@ -113,9 +94,19 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_HIGH, WIDX_HEIGHTMAP_HIGH_UP, WIDX_HEIGHTMAP_HIGH_DOWN, - WIDX_HEIGHTMAP_WATER_LEVEL, - WIDX_HEIGHTMAP_WATER_LEVEL_UP, - WIDX_HEIGHTMAP_WATER_LEVEL_DOWN, + + WIDX_TERRAIN_GENERATE = TAB_BEGIN, + WIDX_BASE_HEIGHT, + WIDX_BASE_HEIGHT_UP, + WIDX_BASE_HEIGHT_DOWN, + WIDX_RANDOM_TERRAIN, + WIDX_FLOOR_TEXTURE, + WIDX_WALL_TEXTURE, + + WIDX_WATER_GENERATE = TAB_BEGIN, + WIDX_WATER_LEVEL, + WIDX_WATER_LEVEL_UP, + WIDX_WATER_LEVEL_DOWN, }; #pragma region Widgets @@ -130,46 +121,35 @@ namespace OpenRCT2::Ui::Windows MakeTab({ 3, 17 }), /* WIDX_TAB_1 */ \ MakeTab({ 34, 17 }), /* WIDX_TAB_2 */ \ MakeTab({ 65, 17 }), /* WIDX_TAB_3 */ \ - MakeTab({ 96, 17 }) /* WIDX_TAB_4 */ + MakeTab({ 96, 17 }), /* WIDX_TAB_4 */ \ + MakeTab({ 127, 17 }), /* WIDX_TAB_5 */ \ + MakeTab({ 158, 17 }) /* WIDX_TAB_6 */ // clang-format off - static Widget MapWidgets[] = { + static Widget BaseWidgets[] = { SHARED_WIDGETS, MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), MakeSpinnerWidgets({104, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets - MakeWidget ({155, 52}, {21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), + MakeWidget ({155, 52}, {21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), MakeSpinnerWidgets({177, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets - MakeSpinnerWidgets({104, 70}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets - MakeSpinnerWidgets({104, 88}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets - MakeWidget ({104, 106}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), - MakeWidget ({151, 106}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP ), kWidgetsEnd, }; static Widget RandomWidgets[] = { SHARED_WIDGETS, MakeWidget({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), - MakeWidget({ 4, 52}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN), - MakeWidget({ 4, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), + MakeWidget({ 4, 52}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), kWidgetsEnd, }; static Widget SimplexWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), // WIDX_SIMPLEX_GENERATE - MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL - MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} - MakeSpinnerWidgets({104, 106}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} - MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} - MakeSpinnerWidgets({104, 148}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // WIDX_SIMPLEX_MAP_SIZE_Y{,_UP,_DOWN} - MakeWidget ({155, 148}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), // WIDX_SIMPLEX_MAP_SIZE_LINK - MakeSpinnerWidgets({177, 148}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // WIDX_SIMPLEX_MAP_SIZE_X{,_UP,_DOWN} - MakeSpinnerWidgets({104, 166}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_WATER_LEVEL{,_UP,_DOWN} - MakeWidget ({104, 190}, { 95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), // WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX - MakeWidget ({102, 202}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), // WIDX_SIMPLEX_FLOOR_TEXTURE - MakeWidget ({150, 202}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP ), // WIDX_SIMPLEX_WALL_TEXTURE - MakeWidget ({104, 239}, { 95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary ), // WIDX_SIMPLEX_PLACE_TREES_CHECKBOX + MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE), // WIDX_SIMPLEX_GENERATE + MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL + MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} + MakeSpinnerWidgets({104, 106}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} + MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} kWidgetsEnd, }; @@ -182,17 +162,35 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({ 4, 106}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILES MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} MakeSpinnerWidgets({104, 142}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} - MakeSpinnerWidgets({104, 160}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_WATER_LEVEL{,_UP,_DOWN} kWidgetsEnd, }; - // clang-format on + + static Widget TerrainWidgets[] = { + SHARED_WIDGETS, + MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), + MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeWidget ({104, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), + MakeWidget ({104, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), + MakeWidget ({151, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), + kWidgetsEnd, + }; + + static Widget WaterWidgets[] = { + SHARED_WIDGETS, + MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE), + MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + kWidgetsEnd, + }; static Widget* PageWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { - MapWidgets, + BaseWidgets, RandomWidgets, SimplexWidgets, HeightmapWidgets, + TerrainWidgets, + WaterWidgets, }; + // clang-format on #pragma endregion @@ -217,21 +215,14 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_HEIGHTMAP_HIGH_DOWN) | (1uLL << WIDX_HEIGHTMAP_LOW) | (1uLL << WIDX_HEIGHTMAP_LOW_UP) | - (1uLL << WIDX_HEIGHTMAP_LOW_DOWN) | - (1uLL << WIDX_HEIGHTMAP_WATER_LEVEL) | - (1uLL << WIDX_HEIGHTMAP_WATER_LEVEL_UP) | - (1uLL << WIDX_HEIGHTMAP_WATER_LEVEL_DOWN) + (1uLL << WIDX_HEIGHTMAP_LOW_DOWN) }; static uint64_t HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { (1uLL << WIDX_MAP_SIZE_Y_UP) | (1uLL << WIDX_MAP_SIZE_Y_DOWN) | (1uLL << WIDX_MAP_SIZE_X_UP) | - (1uLL << WIDX_MAP_SIZE_X_DOWN) | - (1uLL << WIDX_BASE_HEIGHT_UP) | - (1uLL << WIDX_BASE_HEIGHT_DOWN) | - (1uLL << WIDX_WATER_LEVEL_UP) | - (1uLL << WIDX_WATER_LEVEL_DOWN), + (1uLL << WIDX_MAP_SIZE_X_DOWN), 0, @@ -242,41 +233,46 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_SIMPLEX_BASE_FREQ_UP) | (1uLL << WIDX_SIMPLEX_BASE_FREQ_DOWN) | (1uLL << WIDX_SIMPLEX_OCTAVES_UP) | - (1uLL << WIDX_SIMPLEX_OCTAVES_DOWN) | - (1uLL << WIDX_SIMPLEX_MAP_SIZE_Y_UP) | - (1uLL << WIDX_SIMPLEX_MAP_SIZE_Y_DOWN) | - (1uLL << WIDX_SIMPLEX_MAP_SIZE_X_UP) | - (1uLL << WIDX_SIMPLEX_MAP_SIZE_X_DOWN) | - (1uLL << WIDX_SIMPLEX_WATER_LEVEL_UP) | - (1uLL << WIDX_SIMPLEX_WATER_LEVEL_DOWN), + (1uLL << WIDX_SIMPLEX_OCTAVES_DOWN), (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN) | (1uLL << WIDX_HEIGHTMAP_LOW_UP) | (1uLL << WIDX_HEIGHTMAP_LOW_DOWN) | (1uLL << WIDX_HEIGHTMAP_HIGH_UP) | - (1uLL << WIDX_HEIGHTMAP_HIGH_DOWN) | - (1uLL << WIDX_HEIGHTMAP_WATER_LEVEL_UP) | - (1uLL << WIDX_HEIGHTMAP_WATER_LEVEL_DOWN) + (1uLL << WIDX_HEIGHTMAP_HIGH_DOWN), + + (1uLL << WIDX_BASE_HEIGHT_UP) | + (1uLL << WIDX_BASE_HEIGHT_DOWN), + + (1uLL << WIDX_WATER_LEVEL_UP) | + (1uLL << WIDX_WATER_LEVEL_DOWN), }; static uint64_t PressedWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { 0, 0, 0, - (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILES) + (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILES), + 0, + 0, }; // clang-format on #pragma endregion + // clang-format off static constexpr int32_t TabAnimationDivisor[WINDOW_MAPGEN_PAGE_COUNT] = { + 2, + 1, 1, 1, 1, 1, }; static constexpr int32_t TabAnimationFrames[WINDOW_MAPGEN_PAGE_COUNT] = { + 4, + 1, 1, 1, 1, @@ -287,6 +283,8 @@ namespace OpenRCT2::Ui::Windows 16, 16, 0, + 1, + 1, }; // clang-format on @@ -366,9 +364,6 @@ namespace OpenRCT2::Ui::Windows SetWidgetEnabled(WIDX_HEIGHTMAP_LOW, true); SetWidgetEnabled(WIDX_HEIGHTMAP_LOW_UP, true); SetWidgetEnabled(WIDX_HEIGHTMAP_LOW_DOWN, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_WATER_LEVEL, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_WATER_LEVEL_UP, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_WATER_LEVEL_DOWN, true); } InitScrollWidgets(); @@ -377,8 +372,7 @@ namespace OpenRCT2::Ui::Windows void SetPressedTab() { - int32_t i; - for (i = 0; i < WINDOW_MAPGEN_PAGE_COUNT; i++) + for (auto i = 0; i < WINDOW_MAPGEN_PAGE_COUNT; i++) pressed_widgets &= ~(1 << (WIDX_TAB_1 + i)); pressed_widgets |= 1LL << (WIDX_TAB_1 + page); } @@ -403,10 +397,12 @@ namespace OpenRCT2::Ui::Windows void DrawTabImages(DrawPixelInfo& dpi) { - DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_BASE, SPR_G2_TAB_LAND); + DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_BASE, SPR_TAB_GEARS_0); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_RANDOM, SPR_G2_TAB_TREE); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_SIMPLEX, SPR_G2_TAB_PENCIL); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_HEIGHTMAP, SPR_TAB_GRAPH_0); + DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_TERRAIN, SPR_G2_TAB_LAND); + DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_WATER, SPR_TAB_WATER); } void ChangeMapSize(int32_t sizeOffset) @@ -450,6 +446,8 @@ namespace OpenRCT2::Ui::Windows case WIDX_TAB_2: case WIDX_TAB_3: case WIDX_TAB_4: + case WIDX_TAB_5: + case WIDX_TAB_6: SetPage(widgetIndex - WIDX_TAB_1); break; } @@ -484,26 +482,6 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_SIZE_LINK: _mapWidthAndHeightLinked = !_mapWidthAndHeightLinked; break; - case WIDX_BASE_HEIGHT: - { - Formatter ft; - ft.Add((BASESIZE_MIN - 12) / 2); - ft.Add((BASESIZE_MAX - 12) / 2); - WindowTextInputOpen( - this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, - (_settings.height - 12) / 2, 3); - break; - } - case WIDX_WATER_LEVEL: - { - Formatter ft; - ft.Add((WATERLEVEL_MIN - 12) / 2); - ft.Add((WATERLEVEL_MAX - 12) / 2); - WindowTextInputOpen( - this, WIDX_WATER_LEVEL, STR_WATER_LEVEL, STR_ENTER_WATER_LEVEL, ft, STR_FORMAT_INTEGER, - (_settings.water_level - 12) / 2, 3); - break; - } } } @@ -531,71 +509,6 @@ namespace OpenRCT2::Ui::Windows ChangeMapSize(-1); Invalidate(); break; - case WIDX_BASE_HEIGHT_UP: - _settings.height = std::min(_settings.height + 2, BASESIZE_MAX); - Invalidate(); - break; - case WIDX_BASE_HEIGHT_DOWN: - _settings.height = std::max(_settings.height - 2, BASESIZE_MIN); - Invalidate(); - break; - case WIDX_WATER_LEVEL_UP: - _settings.water_level = std::min(_settings.water_level + 2, WATERLEVEL_MAX); - Invalidate(); - break; - case WIDX_WATER_LEVEL_DOWN: - _settings.water_level = std::max(_settings.water_level - 2, WATERLEVEL_MIN); - Invalidate(); - break; - case WIDX_FLOOR_TEXTURE: - LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.floor); - break; - case WIDX_WALL_TEXTURE: - LandTool::ShowEdgeStyleDropdown(this, widget, _settings.wall); - break; - } - } - - void BaseDropdown(WidgetIndex widgetIndex, int32_t dropdownIndex) - { - int32_t type; - - switch (widgetIndex) - { - case WIDX_FLOOR_TEXTURE: - if (dropdownIndex == -1) - dropdownIndex = gDropdownHighlightedIndex; - - type = (dropdownIndex == -1) ? _settings.floor : dropdownIndex; - - if (gLandToolTerrainSurface == type) - { - gLandToolTerrainSurface = OBJECT_ENTRY_INDEX_NULL; - } - else - { - gLandToolTerrainSurface = type; - _settings.floor = type; - } - Invalidate(); - break; - case WIDX_WALL_TEXTURE: - if (dropdownIndex == -1) - dropdownIndex = gDropdownHighlightedIndex; - - type = (dropdownIndex == -1) ? _settings.wall : dropdownIndex; - - if (gLandToolTerrainEdge == type) - { - gLandToolTerrainEdge = OBJECT_ENTRY_INDEX_NULL; - } - else - { - gLandToolTerrainEdge = type; - _settings.wall = type; - } - Invalidate(); - break; } } @@ -607,7 +520,7 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_1); } - void TextInput(WidgetIndex widgetIndex, std::string_view text) + void BaseTextInput(WidgetIndex widgetIndex, std::string_view text) { int32_t value; char* end; @@ -624,8 +537,6 @@ namespace OpenRCT2::Ui::Windows { case WIDX_MAP_SIZE_Y: case WIDX_MAP_SIZE_X: - case WIDX_SIMPLEX_MAP_SIZE_Y: - case WIDX_SIMPLEX_MAP_SIZE_X: // The practical size is 2 lower than the technical size value += 2; if (_resizeDirection == ResizeDirection::Y || _mapWidthAndHeightLinked) @@ -633,12 +544,6 @@ namespace OpenRCT2::Ui::Windows if (_resizeDirection == ResizeDirection::X || _mapWidthAndHeightLinked) _settings.mapSize.x = value; break; - case WIDX_BASE_HEIGHT: - _settings.height = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); - break; - case WIDX_WATER_LEVEL: - _settings.water_level = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); - break; } Invalidate(); @@ -664,86 +569,15 @@ namespace OpenRCT2::Ui::Windows ft.Add(_settings.mapSize.x - 2); } - void DrawDropdownButton(DrawPixelInfo& dpi, WidgetIndex widgetIndex, ImageId image) - { - const auto& widget = widgets[widgetIndex]; - ScreenCoordsXY pos = { windowPos.x + widget.left, windowPos.y + widget.top }; - if (IsWidgetDisabled(widgetIndex)) - { - // Draw greyed out (light border bottom right shadow) - auto colour = colours[widget.colour].colour; - colour = ColourMapA[colour].lighter; - GfxDrawSpriteSolid(dpi, image, pos + ScreenCoordsXY{ 1, 1 }, colour); - - // Draw greyed out (dark) - colour = colours[widget.colour].colour; - colour = ColourMapA[colour].mid_light; - GfxDrawSpriteSolid(dpi, image, pos, colour); - } - else - { - GfxDrawSprite(dpi, image, pos); - } - } - - void DrawDropdownButtons(DrawPixelInfo& dpi, WidgetIndex floorWidgetIndex, WidgetIndex edgeWidgetIndex) - { - auto& objManager = GetContext()->GetObjectManager(); - const auto surfaceObj = static_cast( - objManager.GetLoadedObject(ObjectType::TerrainSurface, _settings.floor)); - ImageId surfaceImage; - if (surfaceObj != nullptr) - { - surfaceImage = ImageId(surfaceObj->IconImageId); - if (surfaceObj->Colour != TerrainSurfaceObject::kNoValue) - { - surfaceImage = surfaceImage.WithPrimary(surfaceObj->Colour); - } - } - - ImageId edgeImage; - const auto edgeObj = static_cast( - objManager.GetLoadedObject(ObjectType::TerrainEdge, _settings.wall)); - if (edgeObj != nullptr) - { - edgeImage = ImageId(edgeObj->IconImageId); - } - - DrawDropdownButton(dpi, floorWidgetIndex, surfaceImage); - DrawDropdownButton(dpi, edgeWidgetIndex, edgeImage); - } - void BaseDraw(DrawPixelInfo& dpi) { DrawWidgets(dpi); DrawTabImages(dpi); - DrawDropdownButtons(dpi, WIDX_FLOOR_TEXTURE, WIDX_WALL_TEXTURE); const auto textColour = colours[1]; DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, - { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, - { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, - { textColour }); - - auto ft = Formatter(); - ft.Add((_settings.height - 12) / 2); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, - STR_COMMA16, ft, { colours[1] }); - - ft = Formatter(); - ft.Add((_settings.water_level - 12) / 2); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_WATER_LEVEL].left + 1, widgets[WIDX_WATER_LEVEL].top + 1 }, - STR_COMMA16, ft, { colours[1] }); } #pragma endregion @@ -776,9 +610,6 @@ namespace OpenRCT2::Ui::Windows GfxInvalidateScreen(); break; } - case WIDX_RANDOM_TERRAIN: - _randomTerrain = !_randomTerrain; - break; case WIDX_RANDOM_PLACE_TREES: _settings.trees ^= 1; break; @@ -802,8 +633,6 @@ namespace OpenRCT2::Ui::Windows } pressed_widgets = 0; - if (_randomTerrain) - pressed_widgets |= 1uLL << WIDX_RANDOM_TERRAIN; if (_settings.trees) pressed_widgets |= 1uLL << WIDX_RANDOM_PLACE_TREES; @@ -826,17 +655,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { - case WIDX_SIMPLEX_MAP_SIZE_Y: - _resizeDirection = ResizeDirection::Y; - InputMapSize(WIDX_SIMPLEX_MAP_SIZE_Y, _settings.mapSize.y); - break; - case WIDX_SIMPLEX_MAP_SIZE_X: - _resizeDirection = ResizeDirection::X; - InputMapSize(WIDX_SIMPLEX_MAP_SIZE_X, _settings.mapSize.x); - break; - case WIDX_SIMPLEX_MAP_SIZE_LINK: - _mapWidthAndHeightLinked = !_mapWidthAndHeightLinked; - break; case WIDX_SIMPLEX_GENERATE: { MapGenSettings mapgenSettings = _settings; @@ -891,91 +709,6 @@ namespace OpenRCT2::Ui::Windows _settings.simplex_octaves = std::max(_settings.simplex_octaves - 1, 1); Invalidate(); break; - case WIDX_SIMPLEX_MAP_SIZE_Y_UP: - _resizeDirection = ResizeDirection::Y; - ChangeMapSize(+1); - Invalidate(); - break; - case WIDX_SIMPLEX_MAP_SIZE_Y_DOWN: - _resizeDirection = ResizeDirection::Y; - ChangeMapSize(-1); - Invalidate(); - break; - case WIDX_SIMPLEX_MAP_SIZE_X_UP: - _resizeDirection = ResizeDirection::X; - ChangeMapSize(+1); - Invalidate(); - break; - case WIDX_SIMPLEX_MAP_SIZE_X_DOWN: - _resizeDirection = ResizeDirection::X; - ChangeMapSize(-1); - Invalidate(); - break; - case WIDX_SIMPLEX_WATER_LEVEL_UP: - _settings.water_level = std::min(_settings.water_level + kMinimumWaterHeight, kMinimumWaterHeight + kMaximumWaterHeight); - Invalidate(); - break; - case WIDX_SIMPLEX_WATER_LEVEL_DOWN: - _settings.water_level = std::max(_settings.water_level - kMinimumWaterHeight, 0); - Invalidate(); - break; - case WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX: - _randomTerrain = !_randomTerrain; - Invalidate(); - break; - case WIDX_SIMPLEX_FLOOR_TEXTURE: - LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.floor); - break; - case WIDX_SIMPLEX_WALL_TEXTURE: - LandTool::ShowEdgeStyleDropdown(this, widget, _settings.wall); - break; - case WIDX_SIMPLEX_PLACE_TREES_CHECKBOX: - _settings.trees ^= 1; - Invalidate(); - break; - } - } - - void SimplexDropdown(WidgetIndex widgetIndex, int32_t dropdownIndex) - { - int32_t type; - - switch (widgetIndex) - { - case WIDX_SIMPLEX_FLOOR_TEXTURE: - if (dropdownIndex == -1) - dropdownIndex = gDropdownHighlightedIndex; - - type = (dropdownIndex == -1) ? _settings.floor : dropdownIndex; - - if (gLandToolTerrainSurface == type) - { - gLandToolTerrainSurface = OBJECT_ENTRY_INDEX_NULL; - } - else - { - gLandToolTerrainSurface = type; - _settings.floor = type; - } - Invalidate(); - break; - case WIDX_SIMPLEX_WALL_TEXTURE: - if (dropdownIndex == -1) - dropdownIndex = gDropdownHighlightedIndex; - - type = (dropdownIndex == -1) ? _settings.wall : dropdownIndex; - - if (gLandToolTerrainEdge == type) - { - gLandToolTerrainEdge = OBJECT_ENTRY_INDEX_NULL; - } - else - { - gLandToolTerrainEdge = type; - _settings.wall = type; - } - Invalidate(); - break; } } @@ -995,38 +728,13 @@ namespace OpenRCT2::Ui::Windows InitScrollWidgets(); } - // Only allow linking the map size when X and Y are the same - SetWidgetPressed(WIDX_SIMPLEX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); - SetWidgetDisabled(WIDX_SIMPLEX_MAP_SIZE_LINK, _settings.mapSize.x != _settings.mapSize.y); - - SetCheckboxValue(WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX, _randomTerrain != 0); - SetCheckboxValue(WIDX_SIMPLEX_PLACE_TREES_CHECKBOX, _settings.trees != 0); - - // Only allow floor and wall texture options if random terrain is disabled - if (!_randomTerrain) - { - SetWidgetEnabled(WIDX_SIMPLEX_FLOOR_TEXTURE, true); - SetWidgetEnabled(WIDX_SIMPLEX_WALL_TEXTURE, true); - } - else - { - SetWidgetEnabled(WIDX_SIMPLEX_FLOOR_TEXTURE, false); - SetWidgetEnabled(WIDX_SIMPLEX_WALL_TEXTURE, false); - } - SetPressedTab(); - - // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use - auto ft = Formatter::Common(); - ft.Add(_settings.mapSize.y - 2); - ft.Add(_settings.mapSize.x - 2); } void SimplexDraw(DrawPixelInfo& dpi) { DrawWidgets(dpi); DrawTabImages(dpi); - DrawDropdownButtons(dpi, WIDX_SIMPLEX_FLOOR_TEXTURE, WIDX_SIMPLEX_WALL_TEXTURE); const auto textColour = colours[1]; @@ -1042,12 +750,6 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES, {}, { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, - { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, - { textColour }); auto ft = Formatter(); ft.Add(_settings.simplex_low); @@ -1071,20 +773,6 @@ namespace OpenRCT2::Ui::Windows dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_OCTAVES].left + 1, widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, STR_COMMA16, ft, { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_RANDOM_TERRAIN_CHECKBOX].top + 1 }, STR_TERRAIN_LABEL, - {}, { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_PLACE_TREES_CHECKBOX].top + 1 }, - STR_MAPGEN_OPTION_PLACE_TREES, {}, { textColour }); - - ft = Formatter(); - ft.Add((_settings.water_level - 12) / 2); - DrawTextBasic( - dpi, - windowPos - + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_WATER_LEVEL].left + 1, widgets[WIDX_SIMPLEX_WATER_LEVEL].top + 1 }, - STR_COMMA16, ft, { textColour }); } #pragma endregion @@ -1121,14 +809,6 @@ namespace OpenRCT2::Ui::Windows _heightmapLow = std::min(_heightmapLow, _heightmapHigh - 1); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; - case WIDX_HEIGHTMAP_WATER_LEVEL_UP: - _settings.water_level = std::min(_settings.water_level + kMinimumWaterHeight, kMinimumWaterHeight + kMaximumWaterHeight); - InvalidateWidget(WIDX_HEIGHTMAP_WATER_LEVEL); - break; - case WIDX_HEIGHTMAP_WATER_LEVEL_DOWN: - _settings.water_level = std::max(_settings.water_level - kMinimumWaterHeight, 0); - InvalidateWidget(WIDX_HEIGHTMAP_WATER_LEVEL); - break; } } @@ -1152,9 +832,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_TAB_2: case WIDX_TAB_3: case WIDX_TAB_4: + case WIDX_TAB_5: + case WIDX_TAB_6: return; // Only widgets that change a setting need to regenerate the map - // Page widgets + // Page widgets case WIDX_HEIGHTMAP_SELECT: { auto intent = Intent(WindowClass::Loadsave); @@ -1247,20 +929,344 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_HIGH].left + 1, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_COMMA16, ft, { labelColour }); + } - // Water level label and value - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, - { labelColour }); +#pragma endregion + +#pragma region Terrain page + + void TerrainMouseUp(WidgetIndex widgetIndex) + { + SharedMouseUp(widgetIndex); + + switch (widgetIndex) + { + case WIDX_MAP_GENERATE: + { + MapGenSettings mapgenSettings = _settings; + mapgenSettings.height += 2; + mapgenSettings.water_level += 2; + + MapGenGenerateBlank(&mapgenSettings); + GfxInvalidateScreen(); + break; + } + + case WIDX_BASE_HEIGHT: + { + Formatter ft; + ft.Add((BASESIZE_MIN - 12) / 2); + ft.Add((BASESIZE_MAX - 12) / 2); + WindowTextInputOpen( + this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, + (_settings.height - 12) / 2, 3); + break; + } + } + } + + void TerrainMouseDown(WidgetIndex widgetIndex, Widget* widget) + { + switch (widgetIndex) + { + case WIDX_BASE_HEIGHT_UP: + _settings.height = std::min(_settings.height + 2, BASESIZE_MAX); + Invalidate(); + break; + case WIDX_BASE_HEIGHT_DOWN: + _settings.height = std::max(_settings.height - 2, BASESIZE_MIN); + Invalidate(); + break; + case WIDX_RANDOM_TERRAIN: + _randomTerrain = !_randomTerrain; + Invalidate(); + break; + case WIDX_FLOOR_TEXTURE: + LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.floor); + break; + case WIDX_WALL_TEXTURE: + LandTool::ShowEdgeStyleDropdown(this, widget, _settings.wall); + break; + } + } + + void TerrainUpdate() + { + // Tab animation + if (++frame_no >= TabAnimationLoops[page]) + frame_no = 0; + InvalidateWidget(WIDX_TAB_5); + } + + void TerrainTextInput(WidgetIndex widgetIndex, std::string_view text) + { + int32_t value; + char* end; + + const auto strText = u8string(text); + value = strtol(strText.c_str(), &end, 10); + + if (*end != '\0') + { + return; + } + + switch (widgetIndex) + { + case WIDX_BASE_HEIGHT: + _settings.height = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); + break; + } + + Invalidate(); + } + + void TerrainDropdown(WidgetIndex widgetIndex, int32_t dropdownIndex) + { + int32_t type; + + switch (widgetIndex) + { + case WIDX_FLOOR_TEXTURE: + if (dropdownIndex == -1) + dropdownIndex = gDropdownHighlightedIndex; + + type = (dropdownIndex == -1) ? _settings.floor : dropdownIndex; + + if (gLandToolTerrainSurface == type) + { + gLandToolTerrainSurface = OBJECT_ENTRY_INDEX_NULL; + } + else + { + gLandToolTerrainSurface = type; + _settings.floor = type; + } + Invalidate(); + break; + case WIDX_WALL_TEXTURE: + if (dropdownIndex == -1) + dropdownIndex = gDropdownHighlightedIndex; + + type = (dropdownIndex == -1) ? _settings.wall : dropdownIndex; + + if (gLandToolTerrainEdge == type) + { + gLandToolTerrainEdge = OBJECT_ENTRY_INDEX_NULL; + } + else + { + gLandToolTerrainEdge = type; + _settings.wall = type; + } + Invalidate(); + break; + } + } + + void DrawDropdownButton(DrawPixelInfo& dpi, WidgetIndex widgetIndex, ImageId image) + { + const auto& widget = widgets[widgetIndex]; + ScreenCoordsXY pos = { windowPos.x + widget.left, windowPos.y + widget.top }; + if (IsWidgetDisabled(widgetIndex)) + { + // Draw greyed out (light border bottom right shadow) + auto colour = colours[widget.colour].colour; + colour = ColourMapA[colour].lighter; + GfxDrawSpriteSolid(dpi, image, pos + ScreenCoordsXY{ 1, 1 }, colour); + + // Draw greyed out (dark) + colour = colours[widget.colour].colour; + colour = ColourMapA[colour].mid_light; + GfxDrawSpriteSolid(dpi, image, pos, colour); + } + else + { + GfxDrawSprite(dpi, image, pos); + } + } + + void DrawDropdownButtons(DrawPixelInfo& dpi, WidgetIndex floorWidgetIndex, WidgetIndex edgeWidgetIndex) + { + auto& objManager = GetContext()->GetObjectManager(); + const auto surfaceObj = static_cast( + objManager.GetLoadedObject(ObjectType::TerrainSurface, _settings.floor)); + ImageId surfaceImage; + if (surfaceObj != nullptr) + { + surfaceImage = ImageId(surfaceObj->IconImageId); + if (surfaceObj->Colour != TerrainSurfaceObject::kNoValue) + { + surfaceImage = surfaceImage.WithPrimary(surfaceObj->Colour); + } + } + + ImageId edgeImage; + const auto edgeObj = static_cast( + objManager.GetLoadedObject(ObjectType::TerrainEdge, _settings.wall)); + if (edgeObj != nullptr) + { + edgeImage = ImageId(edgeObj->IconImageId); + } + + DrawDropdownButton(dpi, floorWidgetIndex, surfaceImage); + DrawDropdownButton(dpi, edgeWidgetIndex, edgeImage); + } + + void TerrainPrepareDraw() + { + if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_TERRAIN]) + { + widgets = PageWidgets[WINDOW_MAPGEN_PAGE_TERRAIN]; + InitScrollWidgets(); + } + + SetCheckboxValue(WIDX_RANDOM_TERRAIN, _randomTerrain != 0); + + // Only allow floor and wall texture options if random terrain is disabled + if (!_randomTerrain) + { + SetWidgetEnabled(WIDX_FLOOR_TEXTURE, true); + SetWidgetEnabled(WIDX_WALL_TEXTURE, true); + } + else + { + SetWidgetEnabled(WIDX_FLOOR_TEXTURE, false); + SetWidgetEnabled(WIDX_WALL_TEXTURE, false); + } + + SetPressedTab(); + } + + void TerrainDraw(DrawPixelInfo& dpi) + { + DrawWidgets(dpi); + DrawTabImages(dpi); + DrawDropdownButtons(dpi, WIDX_FLOOR_TEXTURE, WIDX_WALL_TEXTURE); + + const auto textColour = colours[1]; - ft = Formatter(); - ft.Add(_settings.water_level); DrawTextBasic( - dpi, - windowPos - + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_WATER_LEVEL].left + 1, - widgets[WIDX_HEIGHTMAP_WATER_LEVEL].top + 1 }, - STR_COMMA16, ft, { labelColour }); + dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, + { textColour }); + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, + { textColour }); + + auto ft = Formatter(); + ft.Add((_settings.height - 12) / 2); + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, + STR_COMMA16, ft, { colours[1] }); + } + +#pragma endregion + +#pragma region Water page + + void WaterMouseUp(WidgetIndex widgetIndex) + { + SharedMouseUp(widgetIndex); + + switch (widgetIndex) + { + case WIDX_MAP_GENERATE: + { + MapGenSettings mapgenSettings = _settings; + mapgenSettings.height += 2; + mapgenSettings.water_level += 2; + + MapGenGenerateBlank(&mapgenSettings); + GfxInvalidateScreen(); + break; + } + + case WIDX_WATER_LEVEL: + { + Formatter ft; + ft.Add((WATERLEVEL_MIN - 12) / 2); + ft.Add((WATERLEVEL_MAX - 12) / 2); + WindowTextInputOpen( + this, WIDX_WATER_LEVEL, STR_WATER_LEVEL, STR_ENTER_WATER_LEVEL, ft, STR_FORMAT_INTEGER, + (_settings.water_level - 12) / 2, 3); + break; + } + } + } + + void WaterMouseDown(WidgetIndex widgetIndex, Widget* widget) + { + switch (widgetIndex) + { + case WIDX_WATER_LEVEL_UP: + _settings.water_level = std::min(_settings.water_level + 2, WATERLEVEL_MAX); + Invalidate(); + break; + case WIDX_WATER_LEVEL_DOWN: + _settings.water_level = std::max(_settings.water_level - 2, WATERLEVEL_MIN); + Invalidate(); + break; + } + } + + void WaterUpdate() + { + // Tab animation + if (++frame_no >= TabAnimationLoops[page]) + frame_no = 0; + InvalidateWidget(WIDX_TAB_6); + } + + void WaterTextInput(WidgetIndex widgetIndex, std::string_view text) + { + int32_t value; + char* end; + + const auto strText = u8string(text); + value = strtol(strText.c_str(), &end, 10); + + if (*end != '\0') + { + return; + } + + switch (widgetIndex) + { + case WIDX_WATER_LEVEL: + _settings.water_level = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); + break; + } + + Invalidate(); + } + + void WaterPrepareDraw() + { + if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_WATER]) + { + widgets = PageWidgets[WINDOW_MAPGEN_PAGE_WATER]; + InitScrollWidgets(); + } + + SetPressedTab(); + } + + void WaterDraw(DrawPixelInfo& dpi) + { + DrawWidgets(dpi); + DrawTabImages(dpi); + + const auto textColour = colours[1]; + + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, + { textColour }); + + auto ft = Formatter(); + ft.Add((_settings.water_level - 12) / 2); + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_WATER_LEVEL].left + 1, widgets[WIDX_WATER_LEVEL].top + 1 }, + STR_COMMA16, ft, { colours[1] }); } #pragma endregion @@ -1299,6 +1305,10 @@ namespace OpenRCT2::Ui::Windows return SimplexMouseUp(widgetIndex); case WINDOW_MAPGEN_PAGE_HEIGHTMAP: return HeightmapMouseUp(widgetIndex); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainMouseUp(widgetIndex); + case WINDOW_MAPGEN_PAGE_WATER: + return WaterMouseUp(widgetIndex); } } @@ -1312,6 +1322,10 @@ namespace OpenRCT2::Ui::Windows return SimplexMouseDown(widgetIndex, &widgets[widgetIndex]); case WINDOW_MAPGEN_PAGE_HEIGHTMAP: return HeightmapMouseDown(widgetIndex, &widgets[widgetIndex]); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainMouseDown(widgetIndex, &widgets[widgetIndex]); + case WINDOW_MAPGEN_PAGE_WATER: + return WaterMouseDown(widgetIndex, &widgets[widgetIndex]); } } @@ -1319,10 +1333,8 @@ namespace OpenRCT2::Ui::Windows { switch (page) { - case WINDOW_MAPGEN_PAGE_BASE: - return BaseDropdown(widgetIndex, selectedIndex); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return SimplexDropdown(widgetIndex, selectedIndex); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainDropdown(widgetIndex, selectedIndex); } } @@ -1336,6 +1348,10 @@ namespace OpenRCT2::Ui::Windows return RandomUpdate(); case WINDOW_MAPGEN_PAGE_SIMPLEX: return SimplexUpdate(); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainUpdate(); + case WINDOW_MAPGEN_PAGE_WATER: + return WaterUpdate(); } } @@ -1351,6 +1367,10 @@ namespace OpenRCT2::Ui::Windows return SimplexPrepareDraw(); case WINDOW_MAPGEN_PAGE_HEIGHTMAP: return HeightmapPrepareDraw(); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainPrepareDraw(); + case WINDOW_MAPGEN_PAGE_WATER: + return WaterPrepareDraw(); } } @@ -1366,6 +1386,10 @@ namespace OpenRCT2::Ui::Windows return SimplexDraw(dpi); case WINDOW_MAPGEN_PAGE_HEIGHTMAP: return HeightmapDraw(dpi); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainDraw(dpi); + case WINDOW_MAPGEN_PAGE_WATER: + return WaterDraw(dpi); } } @@ -1374,9 +1398,11 @@ namespace OpenRCT2::Ui::Windows switch (page) { case WINDOW_MAPGEN_PAGE_BASE: - return TextInput(widgetIndex, text); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return TextInput(widgetIndex, text); + return BaseTextInput(widgetIndex, text); + case WINDOW_MAPGEN_PAGE_TERRAIN: + return TerrainTextInput(widgetIndex, text); + case WINDOW_MAPGEN_PAGE_WATER: + return WaterTextInput(widgetIndex, text); } } From 403495cacff438dc74ffd8a3d7ec5ea704c66a12 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 11:21:09 +0200 Subject: [PATCH 04/39] Rename internal map generator functions --- src/openrct2-ui/windows/MapGen.cpp | 10 +++++----- src/openrct2/world/MapGen.cpp | 8 ++++---- src/openrct2/world/MapGen.h | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index f58c193b90..7b51057efa 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -606,7 +606,7 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.simplex_base_freq = 1.75f; mapgenSettings.simplex_octaves = 6; - MapGenGenerate(&mapgenSettings); + MapGenGenerateSimplex(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -666,7 +666,7 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.wall = -1; } - MapGenGenerate(&mapgenSettings); + MapGenGenerateSimplex(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -817,7 +817,7 @@ namespace OpenRCT2::Ui::Windows MapGenSettings mapgenSettings = _settings; mapgenSettings.simplex_low = _heightmapLow; mapgenSettings.simplex_high = _heightmapHigh; - MapGenGenerateFromHeightmap(&mapgenSettings); + MapGenGenerateFromHeightmapImage(&mapgenSettings); GfxInvalidateScreen(); } @@ -1290,7 +1290,7 @@ namespace OpenRCT2::Ui::Windows void OnClose() override { - MapGenUnloadHeightmap(); + MapGenUnloadHeightmapImage(); } void OnMouseUp(WidgetIndex widgetIndex) override @@ -1410,7 +1410,7 @@ namespace OpenRCT2::Ui::Windows { if (result == MODAL_RESULT_OK) { - if (!MapGenLoadHeightmap(path)) + if (!MapGenLoadHeightmapImage(path)) { // TODO: Display error popup return; diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 42e5c3a2dd..dc6e6d0245 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -142,7 +142,7 @@ void MapGenGenerateBlank(MapGenSettings* settings) MapGenSetWaterLevel(settings->water_level); } -void MapGenGenerate(MapGenSettings* settings) +void MapGenGenerateSimplex(MapGenSettings* settings) { const auto& mapSize = settings->mapSize; auto waterLevel = settings->water_level; @@ -682,7 +682,7 @@ static TileCoordsXY MapgenHeightmapCoordToTileCoordsXY(uint32_t x, uint32_t y) return TileCoordsXY(static_cast(y + 1), static_cast(x + 1)); } -bool MapGenLoadHeightmap(const utf8* path) +bool MapGenLoadHeightmapImage(const utf8* path) { auto format = Imaging::GetImageFormatFromPath(path); if (format == IMAGE_FORMAT::PNG) @@ -743,7 +743,7 @@ bool MapGenLoadHeightmap(const utf8* path) /** * Frees the memory used to store the selected height map */ -void MapGenUnloadHeightmap() +void MapGenUnloadHeightmapImage() { _heightMapData.mono_bitmap.clear(); _heightMapData.width = 0; @@ -796,7 +796,7 @@ static void MapGenSmoothHeightmap(std::vector& src, int32_t strength) } } -void MapGenGenerateFromHeightmap(MapGenSettings* settings) +void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) { Guard::Assert(!_heightMapData.mono_bitmap.empty(), "No height map loaded"); Guard::Assert(settings->simplex_high != settings->simplex_low, "Low and high setting cannot be the same"); diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 158990c85a..8db921f516 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -38,7 +38,7 @@ struct MapGenSettings }; void MapGenGenerateBlank(MapGenSettings* settings); -void MapGenGenerate(MapGenSettings* settings); -bool MapGenLoadHeightmap(const utf8* path); -void MapGenUnloadHeightmap(); -void MapGenGenerateFromHeightmap(MapGenSettings* settings); +void MapGenGenerateSimplex(MapGenSettings* settings); +bool MapGenLoadHeightmapImage(const utf8* path); +void MapGenUnloadHeightmapImage(); +void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); From 6545ab33f284cc47488c54add06846b2be42afa8 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 12:14:01 +0200 Subject: [PATCH 05/39] Unify interface for calling internal map generator --- src/openrct2-ui/windows/MapGen.cpp | 19 +++++++++++++------ src/openrct2/world/MapGen.cpp | 28 +++++++++++++++++++++++++--- src/openrct2/world/MapGen.h | 12 +++++++++--- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 7b51057efa..a0c0ace69a 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -311,6 +311,7 @@ namespace OpenRCT2::Ui::Windows MapGenSettings _settings{ // Base + .algorithm = MapGenAlgorithm::blank, .mapSize{ 150, 150 }, .height = 12, .water_level = 6, @@ -464,10 +465,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::blank; mapgenSettings.height += 2; mapgenSettings.water_level += 2; - MapGenGenerateBlank(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -593,6 +595,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_RANDOM_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::simplex; mapgenSettings.height += 2; mapgenSettings.water_level += 2; if (_randomTerrain) @@ -606,7 +609,7 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.simplex_base_freq = 1.75f; mapgenSettings.simplex_octaves = 6; - MapGenGenerateSimplex(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -658,6 +661,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_SIMPLEX_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::simplex; mapgenSettings.water_level += kMinimumWaterHeight; mapgenSettings.simplex_base_freq /= 100.00f; if (_randomTerrain) @@ -666,7 +670,7 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.wall = -1; } - MapGenGenerateSimplex(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -815,9 +819,10 @@ namespace OpenRCT2::Ui::Windows void HeightmapGenerateMap() { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::heightmapImage; mapgenSettings.simplex_low = _heightmapLow; mapgenSettings.simplex_high = _heightmapHigh; - MapGenGenerateFromHeightmapImage(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); } @@ -944,10 +949,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::blank; mapgenSettings.height += 2; mapgenSettings.water_level += 2; - MapGenGenerateBlank(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -1173,10 +1179,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::blank; mapgenSettings.height += 2; mapgenSettings.water_level += 2; - MapGenGenerateBlank(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index dc6e6d0245..c4aa7c21f9 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -93,6 +93,28 @@ static constexpr std::string_view BaseTerrain[] = { "rct2.terrain_surface.dirt", "rct2.terrain_surface.ice", }; +static void MapGenGenerateBlank(MapGenSettings* settings); +static void MapGenGenerateSimplex(MapGenSettings* settings); +static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); + +void MapGenGenerate(MapGenSettings* settings) +{ + switch (settings->algorithm) + { + case MapGenAlgorithm::blank: + MapGenGenerateBlank(settings); + break; + + case MapGenAlgorithm::simplex: + MapGenGenerateSimplex(settings); + break; + + case MapGenAlgorithm::heightmapImage: + MapGenGenerateFromHeightmapImage(settings); + break; + } +} + static void MapGenPlaceTrees(); static void MapGenSetWaterLevel(int32_t waterLevel); static void MapGenSmoothHeight(int32_t iterations); @@ -118,7 +140,7 @@ static void SetHeight(int32_t x, int32_t y, int32_t height) _height[x + y * _heightSize.x] = height; } -void MapGenGenerateBlank(MapGenSettings* settings) +static void MapGenGenerateBlank(MapGenSettings* settings) { int32_t x, y; MapClearAllElements(); @@ -142,7 +164,7 @@ void MapGenGenerateBlank(MapGenSettings* settings) MapGenSetWaterLevel(settings->water_level); } -void MapGenGenerateSimplex(MapGenSettings* settings) +static void MapGenGenerateSimplex(MapGenSettings* settings) { const auto& mapSize = settings->mapSize; auto waterLevel = settings->water_level; @@ -796,7 +818,7 @@ static void MapGenSmoothHeightmap(std::vector& src, int32_t strength) } } -void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) +static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) { Guard::Assert(!_heightMapData.mono_bitmap.empty(), "No height map loaded"); Guard::Assert(settings->simplex_high != settings->simplex_low, "Low and high setting cannot be the same"); diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 8db921f516..a1fad13579 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -12,9 +12,17 @@ #include "../core/StringTypes.h" #include "Location.hpp" +enum class MapGenAlgorithm : uint8_t +{ + blank, + simplex, + heightmapImage, +}; + struct MapGenSettings { // Base + MapGenAlgorithm algorithm; TileCoordsXY mapSize; int32_t height; int32_t water_level; @@ -37,8 +45,6 @@ struct MapGenSettings bool normalize_height; }; -void MapGenGenerateBlank(MapGenSettings* settings); -void MapGenGenerateSimplex(MapGenSettings* settings); +void MapGenGenerate(MapGenSettings* settings); bool MapGenLoadHeightmapImage(const utf8* path); void MapGenUnloadHeightmapImage(); -void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); From 44268fd758e9ce90730ece98d17f1cfb0d1d540f Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 12:17:56 +0200 Subject: [PATCH 06/39] Make tree placement available to all generator algorithms --- src/openrct2-ui/windows/MapGen.cpp | 4 ++-- src/openrct2/world/MapGen.cpp | 12 +++++++----- src/openrct2/world/MapGen.h | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index a0c0ace69a..b7b4608c5c 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -319,7 +319,7 @@ namespace OpenRCT2::Ui::Windows .wall = 0, // Features (e.g. tree, rivers, lakes etc.) - .trees = 1, + .trees = true, // Simplex Noise Parameters .simplex_low = 6, @@ -614,7 +614,7 @@ namespace OpenRCT2::Ui::Windows break; } case WIDX_RANDOM_PLACE_TREES: - _settings.trees ^= 1; + _settings.trees ^= true; break; } } diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index c4aa7c21f9..c2b06e9f83 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -97,8 +97,11 @@ static void MapGenGenerateBlank(MapGenSettings* settings); static void MapGenGenerateSimplex(MapGenSettings* settings); static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); +static void MapGenPlaceTrees(); + void MapGenGenerate(MapGenSettings* settings) { + // First, generate the height map switch (settings->algorithm) { case MapGenAlgorithm::blank: @@ -113,9 +116,12 @@ void MapGenGenerate(MapGenSettings* settings) MapGenGenerateFromHeightmapImage(settings); break; } + + // Place trees? + if (settings->trees) + MapGenPlaceTrees(); } -static void MapGenPlaceTrees(); static void MapGenSetWaterLevel(int32_t waterLevel); static void MapGenSmoothHeight(int32_t iterations); static void MapGenSetHeight(MapGenSettings* settings); @@ -270,10 +276,6 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) surfaceElement->SetSurfaceObjectIndex(beachTextureId); } } - - // Place the trees - if (settings->trees != 0) - MapGenPlaceTrees(); } static void MapGenPlaceTree(ObjectEntryIndex type, const CoordsXY& loc) diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index a1fad13579..76840bcf2c 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -30,7 +30,7 @@ struct MapGenSettings int32_t wall; // Features (e.g. tree, rivers, lakes etc.) - int32_t trees; + bool trees; // Simplex Noise Parameters int32_t simplex_low; From 710fbfbf9aa3f0e8192f1c9abd78e336181cd27d Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 12:41:28 +0200 Subject: [PATCH 07/39] Make beaches around water bodies a general option for all generators --- data/language/en-GB.txt | 1 + src/openrct2-ui/UiStringIds.h | 1 + src/openrct2-ui/windows/MapGen.cpp | 16 +++++++++-- src/openrct2/world/MapGen.cpp | 45 +++++++++++++++++++----------- src/openrct2/world/MapGen.h | 1 + 5 files changed, 45 insertions(+), 19 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 3bacc3eb0c..2766eabf55 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3748,6 +3748,7 @@ STR_6673 :Transparent STR_6674 :{MONTH}, Year {COMMA16} STR_6675 :Peep Names STR_6676 :At least one peep names object must be selected +STR_6677 :Add beaches around water bodies ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 84cd447ec6..3a02786206 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -896,6 +896,7 @@ namespace OpenRCT2 STR_SHOW_RIDES_STALLS_ON_MAP_TIP = 3144, // Window: MapGen + STR_BEACHES_WATER_BODIES = 6677, STR_BASE_HEIGHT = 5183, STR_BASE_HEIGHT_LABEL = 2691, STR_ENTER_BASE_HEIGHT = 5184, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index b7b4608c5c..9ab464d05d 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -107,6 +107,7 @@ namespace OpenRCT2::Ui::Windows WIDX_WATER_LEVEL, WIDX_WATER_LEVEL_UP, WIDX_WATER_LEVEL_DOWN, + WIDX_ADD_BEACHES, }; #pragma region Widgets @@ -177,8 +178,9 @@ namespace OpenRCT2::Ui::Windows static Widget WaterWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE), - MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE), + MakeSpinnerWidgets({104, 52}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeWidget ({ 4, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_BEACHES_WATER_BODIES ), kWidgetsEnd, }; @@ -320,6 +322,7 @@ namespace OpenRCT2::Ui::Windows // Features (e.g. tree, rivers, lakes etc.) .trees = true, + .beaches = true, // Simplex Noise Parameters .simplex_low = 6, @@ -1198,6 +1201,13 @@ namespace OpenRCT2::Ui::Windows (_settings.water_level - 12) / 2, 3); break; } + + case WIDX_ADD_BEACHES: + { + _settings.beaches ^= true; + Invalidate(); + break; + } } } @@ -1255,6 +1265,8 @@ namespace OpenRCT2::Ui::Windows InitScrollWidgets(); } + SetCheckboxValue(WIDX_ADD_BEACHES, _settings.beaches != 0); + SetPressedTab(); } diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index c2b06e9f83..1d6d3ce328 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -98,6 +98,7 @@ static void MapGenGenerateSimplex(MapGenSettings* settings); static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); static void MapGenPlaceTrees(); +static void MapGenAddBeaches(MapGenSettings* settings); void MapGenGenerate(MapGenSettings* settings) { @@ -117,6 +118,10 @@ void MapGenGenerate(MapGenSettings* settings) break; } + // Add beaches? + if (settings->beaches) + MapGenAddBeaches(settings); + // Place trees? if (settings->trees) MapGenPlaceTrees(); @@ -172,13 +177,13 @@ static void MapGenGenerateBlank(MapGenSettings* settings) static void MapGenGenerateSimplex(MapGenSettings* settings) { - const auto& mapSize = settings->mapSize; - auto waterLevel = settings->water_level; + auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); + const auto selectedFloor = TerrainSurfaceObject::GetById(settings->floor); std::string_view floorTexture = selectedFloor != nullptr ? selectedFloor->GetIdentifier() : ""; + const auto selectedEdge = TerrainEdgeObject::GetById(settings->wall); std::string_view edgeTexture = selectedFloor != nullptr ? selectedEdge->GetIdentifier() : ""; - auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); if (floorTexture.empty()) { @@ -215,6 +220,7 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) MapClearAllElements(); // Initialise the base map + const auto& mapSize = settings->mapSize; MapInit(mapSize); for (auto y = 1; y < mapSize.y - 1; y++) { @@ -249,30 +255,35 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) } // Add the water - MapGenSetWaterLevel(waterLevel); + MapGenSetWaterLevel(settings->water_level); +} - // Add sandy beaches - std::string_view beachTexture = floorTexture; - if (settings->floor == -1 && floorTexture == "rct2.terrain_surface.grass" && (UtilRand() & 1)) - { - std::vector availableBeachTextures; - if (objectManager.GetLoadedObject(ObjectEntryDescriptor("rct2.terrain_surface.sand")) != nullptr) - availableBeachTextures.push_back("rct2.terrain_surface.sand"); - if (objectManager.GetLoadedObject(ObjectEntryDescriptor("rct2.terrain_surface.sand_brown")) != nullptr) - availableBeachTextures.push_back("rct2.terrain_surface.sand_brown"); +static void MapGenAddBeaches(MapGenSettings* settings) +{ + auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); - if (!availableBeachTextures.empty()) - beachTexture = availableBeachTextures[UtilRand() % availableBeachTextures.size()]; - } + // Figure out what beach texture to use + std::vector availableBeachTextures; + if (objectManager.GetLoadedObject(ObjectEntryDescriptor("rct2.terrain_surface.sand")) != nullptr) + availableBeachTextures.push_back("rct2.terrain_surface.sand"); + if (objectManager.GetLoadedObject(ObjectEntryDescriptor("rct2.terrain_surface.sand_brown")) != nullptr) + availableBeachTextures.push_back("rct2.terrain_surface.sand_brown"); + + if (availableBeachTextures.empty()) + return; + + std::string_view beachTexture = availableBeachTextures[UtilRand() % availableBeachTextures.size()]; auto beachTextureId = objectManager.GetLoadedObjectEntryIndex(ObjectEntryDescriptor(beachTexture)); + // Add sandy beaches + const auto& mapSize = settings->mapSize; for (auto y = 1; y < mapSize.y - 1; y++) { for (auto x = 1; x < mapSize.x - 1; x++) { auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); - if (surfaceElement != nullptr && surfaceElement->BaseHeight < waterLevel + 6) + if (surfaceElement != nullptr && surfaceElement->BaseHeight < settings->water_level + 6) surfaceElement->SetSurfaceObjectIndex(beachTextureId); } } diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 76840bcf2c..2adff1797f 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -31,6 +31,7 @@ struct MapGenSettings // Features (e.g. tree, rivers, lakes etc.) bool trees; + bool beaches; // Simplex Noise Parameters int32_t simplex_low; From 36bcb694583f2ccad1f708af3987253d289eadca Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 13:27:53 +0200 Subject: [PATCH 08/39] Use dynamic height in MakeDropdownButtonWidget --- src/openrct2-ui/interface/Widget.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2-ui/interface/Widget.h b/src/openrct2-ui/interface/Widget.h index bc0f0e7777..8f1d82ab9e 100644 --- a/src/openrct2-ui/interface/Widget.h +++ b/src/openrct2-ui/interface/Widget.h @@ -165,7 +165,7 @@ namespace OpenRCT2::Ui const int16_t xPos = origin.x + size.width - 11; const int16_t yPos = origin.y + 1; const uint16_t width = 11; - const uint16_t height = 10; + const uint16_t height = size.height - 2; return MakeWidget({ xPos, yPos }, { width, height }, WindowWidgetType::Button, colour, STR_DROPDOWN_GLYPH, tooltip); } From 6398c066a78b0b2c6d1218105aae38bd2236fa4b Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 13:51:14 +0200 Subject: [PATCH 09/39] Unify generator buttons for all tabs --- data/language/en-GB.txt | 5 + src/openrct2-ui/UiStringIds.h | 5 + src/openrct2-ui/windows/MapGen.cpp | 236 ++++++++++++++++------------- src/openrct2/world/MapGen.cpp | 3 +- src/openrct2/world/MapGen.h | 3 +- 5 files changed, 143 insertions(+), 109 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 2766eabf55..3e8b732765 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3749,6 +3749,11 @@ STR_6674 :{MONTH}, Year {COMMA16} STR_6675 :Peep Names STR_6676 :At least one peep names object must be selected STR_6677 :Add beaches around water bodies +STR_6678 :Heightmap source: +STR_6679 :Flatland +STR_6680 :Simplex noise (random) +STR_6681 :Simplex noise (custom) +STR_6682 :Heightmap file ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 3a02786206..24980dbea1 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -901,6 +901,11 @@ namespace OpenRCT2 STR_BASE_HEIGHT_LABEL = 2691, STR_ENTER_BASE_HEIGHT = 5184, STR_ENTER_WATER_LEVEL = 5186, + STR_HEIGHTMAP_FILE = 6682, + STR_HEIGHTMAP_FLATLAND = 6679, + STR_HEIGHTMAP_SIMPLEX_CUSTOM = 6681, + STR_HEIGHTMAP_SIMPLEX_NOISE = 6680, + STR_HEIGHTMAP_SOURCE = 6678, STR_MAPGEN_ACTION_GENERATE = 2694, STR_MAPGEN_NORMALIZE = 6046, STR_MAPGEN_OPTION_PLACE_TREES = 2696, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 9ab464d05d..090f54adfa 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -51,23 +51,23 @@ namespace OpenRCT2::Ui::Windows WIDX_TAB_4, WIDX_TAB_5, WIDX_TAB_6, + WIDX_MAP_GENERATE, TAB_BEGIN, - WIDX_MAP_GENERATE = TAB_BEGIN, - WIDX_MAP_SIZE_Y, + WIDX_MAP_SIZE_Y = TAB_BEGIN, WIDX_MAP_SIZE_Y_UP, WIDX_MAP_SIZE_Y_DOWN, WIDX_MAP_SIZE_LINK, WIDX_MAP_SIZE_X, WIDX_MAP_SIZE_X_UP, WIDX_MAP_SIZE_X_DOWN, + WIDX_HEIGHTMAP_SOURCE, + WIDX_HEIGHTMAP_SOURCE_DROPDOWN, - WIDX_RANDOM_GENERATE = TAB_BEGIN, - WIDX_RANDOM_PLACE_TREES, + WIDX_RANDOM_PLACE_TREES = TAB_BEGIN, - WIDX_SIMPLEX_GENERATE = TAB_BEGIN, - WIDX_SIMPLEX_LABEL, + WIDX_SIMPLEX_LABEL = TAB_BEGIN, WIDX_SIMPLEX_LOW, WIDX_SIMPLEX_LOW_UP, WIDX_SIMPLEX_LOW_DOWN, @@ -95,16 +95,14 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_HIGH_UP, WIDX_HEIGHTMAP_HIGH_DOWN, - WIDX_TERRAIN_GENERATE = TAB_BEGIN, - WIDX_BASE_HEIGHT, + WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, WIDX_BASE_HEIGHT_DOWN, WIDX_RANDOM_TERRAIN, WIDX_FLOOR_TEXTURE, WIDX_WALL_TEXTURE, - WIDX_WATER_GENERATE = TAB_BEGIN, - WIDX_WATER_LEVEL, + WIDX_WATER_LEVEL = TAB_BEGIN, WIDX_WATER_LEVEL_UP, WIDX_WATER_LEVEL_DOWN, WIDX_ADD_BEACHES, @@ -124,28 +122,27 @@ namespace OpenRCT2::Ui::Windows MakeTab({ 65, 17 }), /* WIDX_TAB_3 */ \ MakeTab({ 96, 17 }), /* WIDX_TAB_4 */ \ MakeTab({ 127, 17 }), /* WIDX_TAB_5 */ \ - MakeTab({ 158, 17 }) /* WIDX_TAB_6 */ + MakeTab({ 158, 17 }), /* WIDX_TAB_6 */ \ + MakeWidget({ 155, 255 }, { 90, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE) // clang-format off static Widget BaseWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), - MakeSpinnerWidgets({104, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets - MakeWidget ({155, 52}, {21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), - MakeSpinnerWidgets({177, 52}, {50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets + MakeSpinnerWidgets ({104, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets + MakeWidget ({155, 52}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), + MakeSpinnerWidgets ({177, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets + MakeDropdownWidgets({104, 70}, {123, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_HEIGHTMAP_FLATLAND ), kWidgetsEnd, }; static Widget RandomWidgets[] = { SHARED_WIDGETS, - MakeWidget({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), MakeWidget({ 4, 52}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), kWidgetsEnd, }; static Widget SimplexWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE), // WIDX_SIMPLEX_GENERATE MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_LOW{,_UP,_DOWN} MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} @@ -168,7 +165,6 @@ namespace OpenRCT2::Ui::Windows static Widget TerrainWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, {90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE ), MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets MakeWidget ({104, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), MakeWidget ({104, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), @@ -178,7 +174,6 @@ namespace OpenRCT2::Ui::Windows static Widget WaterWidgets[] = { SHARED_WIDGETS, - MakeWidget ({155, 255}, { 90, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE), MakeSpinnerWidgets({104, 52}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets MakeWidget ({ 4, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_BEACHES_WATER_BODIES ), kWidgetsEnd, @@ -454,9 +449,60 @@ namespace OpenRCT2::Ui::Windows case WIDX_TAB_6: SetPage(widgetIndex - WIDX_TAB_1); break; + case WIDX_MAP_GENERATE: + GenerateMap(); + break; } } + void GenerateMap() + { + MapGenSettings mapgenSettings = _settings; + switch (mapgenSettings.algorithm) + { + case MapGenAlgorithm::blank: + mapgenSettings.height += 2; + mapgenSettings.water_level += 2; + break; + + case MapGenAlgorithm::simplexNoise: + mapgenSettings.height += 2; + mapgenSettings.water_level += 2; + if (_randomTerrain) + { + mapgenSettings.floor = -1; + mapgenSettings.wall = -1; + } + + mapgenSettings.simplex_low = UtilRand() % 4; + mapgenSettings.simplex_high = 12 + (UtilRand() % (32 - 12)); + mapgenSettings.simplex_base_freq = 1.75f; + mapgenSettings.simplex_octaves = 6; + break; + + case MapGenAlgorithm::simplexCustom: + mapgenSettings.water_level += kMinimumWaterHeight; + mapgenSettings.simplex_base_freq /= 100.00f; + if (_randomTerrain) + { + mapgenSettings.floor = -1; + mapgenSettings.wall = -1; + } + break; + + case MapGenAlgorithm::heightmapImage: + if (!_heightmapLoaded) + return; + + mapgenSettings.simplex_low = _heightmapLow; + mapgenSettings.simplex_high = _heightmapHigh; + break; + } + + MapGenGenerate(&mapgenSettings); + GfxInvalidateScreen(); + } + #pragma region Base page void BaseMouseUp(WidgetIndex widgetIndex) @@ -465,17 +511,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { - case WIDX_MAP_GENERATE: - { - MapGenSettings mapgenSettings = _settings; - mapgenSettings.algorithm = MapGenAlgorithm::blank; - mapgenSettings.height += 2; - mapgenSettings.water_level += 2; - - MapGenGenerate(&mapgenSettings); - GfxInvalidateScreen(); - break; - } case WIDX_MAP_SIZE_Y: _resizeDirection = ResizeDirection::Y; InputMapSize(WIDX_MAP_SIZE_Y, _settings.mapSize.y); @@ -514,6 +549,27 @@ namespace OpenRCT2::Ui::Windows ChangeMapSize(-1); Invalidate(); break; + case WIDX_HEIGHTMAP_SOURCE_DROPDOWN: + { + using namespace Dropdown; + + constexpr ItemExt items[] = { + ToggleOption(0, STR_HEIGHTMAP_FLATLAND), + ToggleOption(1, STR_HEIGHTMAP_SIMPLEX_NOISE), + ToggleOption(2, STR_HEIGHTMAP_SIMPLEX_CUSTOM), + ToggleOption(3, STR_HEIGHTMAP_FILE), + }; + + SetItems(items); + + Widget* ddWidget = &widgets[widgetIndex - 1]; + WindowDropdownShowText( + { windowPos.x + ddWidget->left, windowPos.y + ddWidget->top }, ddWidget->height() + 1, colours[1], 0, + std::size(items)); + + SetChecked(EnumValue(_settings.algorithm), true); + break; + } } } @@ -525,6 +581,20 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_1); } + void BaseDropdown(WidgetIndex widgetIndex, int32_t dropdownIndex) + { + if (dropdownIndex == -1) + return; + + switch (widgetIndex) + { + case WIDX_HEIGHTMAP_SOURCE_DROPDOWN: + _settings.algorithm = MapGenAlgorithm(dropdownIndex); + Invalidate(); + break; + } + } + void BaseTextInput(WidgetIndex widgetIndex, std::string_view text) { int32_t value; @@ -572,6 +642,26 @@ namespace OpenRCT2::Ui::Windows auto ft = Formatter::Common(); ft.Add(_settings.mapSize.y - 2); ft.Add(_settings.mapSize.x - 2); + + auto& sourceWidget = widgets[WIDX_HEIGHTMAP_SOURCE]; + switch (_settings.algorithm) + { + case MapGenAlgorithm::blank: + sourceWidget.text = STR_HEIGHTMAP_FLATLAND; + break; + + case MapGenAlgorithm::simplexNoise: + sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_NOISE; + break; + + case MapGenAlgorithm::simplexCustom: + sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_CUSTOM; + break; + + case MapGenAlgorithm::heightmapImage: + sourceWidget.text = STR_HEIGHTMAP_FILE; + break; + } } void BaseDraw(DrawPixelInfo& dpi) @@ -583,6 +673,10 @@ namespace OpenRCT2::Ui::Windows DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); + + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_HEIGHTMAP_SOURCE].top + 1 }, STR_HEIGHTMAP_SOURCE, {}, + { textColour }); } #pragma endregion @@ -595,27 +689,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { - case WIDX_RANDOM_GENERATE: - { - MapGenSettings mapgenSettings = _settings; - mapgenSettings.algorithm = MapGenAlgorithm::simplex; - mapgenSettings.height += 2; - mapgenSettings.water_level += 2; - if (_randomTerrain) - { - mapgenSettings.floor = -1; - mapgenSettings.wall = -1; - } - - mapgenSettings.simplex_low = UtilRand() % 4; - mapgenSettings.simplex_high = 12 + (UtilRand() % (32 - 12)); - mapgenSettings.simplex_base_freq = 1.75f; - mapgenSettings.simplex_octaves = 6; - - MapGenGenerate(&mapgenSettings); - GfxInvalidateScreen(); - break; - } case WIDX_RANDOM_PLACE_TREES: _settings.trees ^= true; break; @@ -658,26 +731,6 @@ namespace OpenRCT2::Ui::Windows void SimplexMouseUp(WidgetIndex widgetIndex) { SharedMouseUp(widgetIndex); - - switch (widgetIndex) - { - case WIDX_SIMPLEX_GENERATE: - { - MapGenSettings mapgenSettings = _settings; - mapgenSettings.algorithm = MapGenAlgorithm::simplex; - mapgenSettings.water_level += kMinimumWaterHeight; - mapgenSettings.simplex_base_freq /= 100.00f; - if (_randomTerrain) - { - mapgenSettings.floor = -1; - mapgenSettings.wall = -1; - } - - MapGenGenerate(&mapgenSettings); - GfxInvalidateScreen(); - break; - } - } } void SimplexMouseDown(WidgetIndex widgetIndex, Widget* widget) @@ -819,16 +872,6 @@ namespace OpenRCT2::Ui::Windows } } - void HeightmapGenerateMap() - { - MapGenSettings mapgenSettings = _settings; - mapgenSettings.algorithm = MapGenAlgorithm::heightmapImage; - mapgenSettings.simplex_low = _heightmapLow; - mapgenSettings.simplex_high = _heightmapHigh; - MapGenGenerate(&mapgenSettings); - GfxInvalidateScreen(); - } - void HeightmapMouseUp(WidgetIndex widgetIndex) { SharedMouseUp(widgetIndex); @@ -842,6 +885,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_TAB_4: case WIDX_TAB_5: case WIDX_TAB_6: + case WIDX_MAP_GENERATE: return; // Only widgets that change a setting need to regenerate the map // Page widgets @@ -875,7 +919,7 @@ namespace OpenRCT2::Ui::Windows } // Always regenerate the map after one of the page widgets has been changed - HeightmapGenerateMap(); + GenerateMap(); } void HeightmapPrepareDraw() @@ -949,18 +993,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { - case WIDX_MAP_GENERATE: - { - MapGenSettings mapgenSettings = _settings; - mapgenSettings.algorithm = MapGenAlgorithm::blank; - mapgenSettings.height += 2; - mapgenSettings.water_level += 2; - - MapGenGenerate(&mapgenSettings); - GfxInvalidateScreen(); - break; - } - case WIDX_BASE_HEIGHT: { Formatter ft; @@ -1179,18 +1211,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { - case WIDX_MAP_GENERATE: - { - MapGenSettings mapgenSettings = _settings; - mapgenSettings.algorithm = MapGenAlgorithm::blank; - mapgenSettings.height += 2; - mapgenSettings.water_level += 2; - - MapGenGenerate(&mapgenSettings); - GfxInvalidateScreen(); - break; - } - case WIDX_WATER_LEVEL: { Formatter ft; @@ -1352,6 +1372,8 @@ namespace OpenRCT2::Ui::Windows { switch (page) { + case WINDOW_MAPGEN_PAGE_BASE: + return BaseDropdown(widgetIndex, selectedIndex); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainDropdown(widgetIndex, selectedIndex); } @@ -1439,7 +1461,7 @@ namespace OpenRCT2::Ui::Windows _heightmapLoaded = true; SetPage(WINDOW_MAPGEN_PAGE_HEIGHTMAP); - HeightmapGenerateMap(); + GenerateMap(); } } diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 1d6d3ce328..ba0e984425 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -109,7 +109,8 @@ void MapGenGenerate(MapGenSettings* settings) MapGenGenerateBlank(settings); break; - case MapGenAlgorithm::simplex: + case MapGenAlgorithm::simplexNoise: + case MapGenAlgorithm::simplexCustom: MapGenGenerateSimplex(settings); break; diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 2adff1797f..9f8b1dc2d1 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -15,7 +15,8 @@ enum class MapGenAlgorithm : uint8_t { blank, - simplex, + simplexNoise, + simplexCustom, heightmapImage, }; From b434e1bc35860603446adf97b408f257adfa83c2 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 14:13:31 +0200 Subject: [PATCH 10/39] Clarify height map parameters and integrate into MapGenSettings --- data/language/en-GB.txt | 4 +-- src/openrct2-ui/windows/MapGen.cpp | 47 ++++++++++++++---------------- src/openrct2/world/MapGen.cpp | 12 ++++---- src/openrct2/world/MapGen.h | 4 ++- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 3e8b732765..0c86bd81f2 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3166,9 +3166,9 @@ STR_6041 :{BLACK}No mechanics are hired! STR_6042 :Load height map STR_6043 :Select height map STR_6044 :Smooth height map -STR_6045 :Strength +STR_6045 :Strength: STR_6046 :Normalise height map -STR_6047 :Smooth tiles +STR_6047 :Smooth tile edges STR_6048 :Height map error STR_6049 :Error reading PNG STR_6050 :Error reading bitmap diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 090f54adfa..ef568a4519 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -87,7 +87,7 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_STRENGTH_UP, WIDX_HEIGHTMAP_STRENGTH_DOWN, WIDX_HEIGHTMAP_NORMALIZE, - WIDX_HEIGHTMAP_SMOOTH_TILES, + WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, WIDX_HEIGHTMAP_LOW, WIDX_HEIGHTMAP_LOW_UP, WIDX_HEIGHTMAP_LOW_DOWN, @@ -157,7 +157,7 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({ 4, 52}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} MakeWidget ({ 4, 88}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE - MakeWidget ({ 4, 106}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILES + MakeWidget ({ 4, 106}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} MakeSpinnerWidgets({104, 142}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} kWidgetsEnd, @@ -206,7 +206,7 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN) | (1uLL << WIDX_HEIGHTMAP_NORMALIZE) | - (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILES) | + (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES) | (1uLL << WIDX_HEIGHTMAP_HIGH) | (1uLL << WIDX_HEIGHTMAP_HIGH_UP) | (1uLL << WIDX_HEIGHTMAP_HIGH_DOWN) | @@ -250,7 +250,7 @@ namespace OpenRCT2::Ui::Windows 0, 0, 0, - (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILES), + (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES), 0, 0, }; @@ -326,16 +326,16 @@ namespace OpenRCT2::Ui::Windows .simplex_octaves = 4, // Height map _settings - .smooth = true, .smooth_height_map = false, .smooth_strength = 1, .normalize_height = false, + .smoothTileEdges = true, + .heightmapLow = 2, + .heightmapHigh = 70, }; bool _randomTerrain = true; bool _heightmapLoaded = false; - int32_t _heightmapLow = 2; - int32_t _heightmapHigh = 70; void SetPage(int32_t newPage) { @@ -356,7 +356,7 @@ namespace OpenRCT2::Ui::Windows SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILES, true); + SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, true); SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH, true); SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH_UP, true); SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH_DOWN, true); @@ -493,9 +493,6 @@ namespace OpenRCT2::Ui::Windows case MapGenAlgorithm::heightmapImage: if (!_heightmapLoaded) return; - - mapgenSettings.simplex_low = _heightmapLow; - mapgenSettings.simplex_high = _heightmapHigh; break; } @@ -852,21 +849,21 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; case WIDX_HEIGHTMAP_LOW_UP: - _heightmapLow = std::min(_heightmapLow + 1, kMaximumWaterHeight - 1); - _heightmapHigh = std::max(_heightmapHigh, _heightmapLow + 1); + _settings.heightmapLow = std::min(_settings.heightmapLow + 1, kMaximumWaterHeight - 1); + _settings.heightmapHigh = std::max(_settings.heightmapHigh, _settings.heightmapLow + 1); InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_LOW_DOWN: - _heightmapLow = std::max(_heightmapLow - 1, 2); + _settings.heightmapLow = std::max(_settings.heightmapLow - 1, 2); InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_HIGH_UP: - _heightmapHigh = std::min(_heightmapHigh + 1, kMaximumWaterHeight); + _settings.heightmapHigh = std::min(_settings.heightmapHigh + 1, kMaximumWaterHeight); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; case WIDX_HEIGHTMAP_HIGH_DOWN: - _heightmapHigh = std::max(_heightmapHigh - 1, 2 + 1); - _heightmapLow = std::min(_heightmapLow, _heightmapHigh - 1); + _settings.heightmapHigh = std::max(_settings.heightmapHigh - 1, 2 + 1); + _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh - 1); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; } @@ -911,10 +908,10 @@ namespace OpenRCT2::Ui::Windows SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); InvalidateWidget(WIDX_HEIGHTMAP_NORMALIZE); break; - case WIDX_HEIGHTMAP_SMOOTH_TILES: - _settings.smooth = !_settings.smooth; - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILES, _settings.smooth); - InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_TILES); + case WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES: + _settings.smoothTileEdges = !_settings.smoothTileEdges; + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); + InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES); break; } @@ -932,7 +929,7 @@ namespace OpenRCT2::Ui::Windows SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _settings.smooth_height_map); SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILES, _settings.smooth); + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); SetPressedTab(); } @@ -948,7 +945,7 @@ namespace OpenRCT2::Ui::Windows // Smooth strength label and value const auto strengthColour = _settings.smooth_height_map ? enabledColour : disabledColour; DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, + dpi, windowPos + ScreenCoordsXY{ 18, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, { strengthColour }); auto ft = Formatter(); @@ -966,7 +963,7 @@ namespace OpenRCT2::Ui::Windows { labelColour }); ft = Formatter(); - ft.Add(_heightmapLow); + ft.Add(_settings.heightmapLow); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_LOW].left + 1, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_COMMA16, ft, { labelColour }); @@ -977,7 +974,7 @@ namespace OpenRCT2::Ui::Windows { labelColour }); ft = Formatter(); - ft.Add(_heightmapHigh); + ft.Add(_settings.heightmapHigh); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_HIGH].left + 1, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_COMMA16, ft, { labelColour }); diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index ba0e984425..1b1c62f418 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -835,7 +835,7 @@ static void MapGenSmoothHeightmap(std::vector& src, int32_t strength) static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) { Guard::Assert(!_heightMapData.mono_bitmap.empty(), "No height map loaded"); - Guard::Assert(settings->simplex_high != settings->simplex_low, "Low and high setting cannot be the same"); + Guard::Assert(settings->heightmapHigh != settings->heightmapLow, "Low and high setting cannot be the same"); // Make a copy of the original height map that we can edit auto dest = _heightMapData.mono_bitmap; @@ -876,10 +876,10 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) } Guard::Assert(maxValue > minValue, "Input range is invalid"); - Guard::Assert(settings->simplex_high > settings->simplex_low, "Output range is invalid"); + Guard::Assert(settings->heightmapHigh > settings->heightmapLow, "Output range is invalid"); const uint8_t rangeIn = maxValue - minValue; - const uint8_t rangeOut = settings->simplex_high - settings->simplex_low; + const uint8_t rangeOut = settings->heightmapHigh - settings->heightmapLow; for (uint32_t y = 0; y < _heightMapData.height; y++) { @@ -893,7 +893,7 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) // Read value from bitmap, and convert its range uint8_t value = dest[x + y * _heightMapData.width]; - value = static_cast(static_cast(value - minValue) / rangeIn * rangeOut) + settings->simplex_low; + value = static_cast(static_cast(value - minValue) / rangeIn * rangeOut) + settings->heightmapLow; surfaceElement->BaseHeight = value; // Floor to even number @@ -909,8 +909,8 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) } } - // Smooth map - if (settings->smooth) + // Smooth tile edges + if (settings->smoothTileEdges) { // Keep smoothing the entire map until no tiles are changed anymore while (true) diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 9f8b1dc2d1..72493e8291 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -41,10 +41,12 @@ struct MapGenSettings int32_t simplex_octaves; // Height map settings - bool smooth; bool smooth_height_map; uint32_t smooth_strength; bool normalize_height; + bool smoothTileEdges; + int32_t heightmapLow; + int32_t heightmapHigh; }; void MapGenGenerate(MapGenSettings* settings); From e2d05642ae55e20cd0c6948a2a4a66521e527863 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 14:34:46 +0200 Subject: [PATCH 11/39] Unify low/high parameters using kMaximumLandHeight --- src/openrct2-ui/windows/MapGen.cpp | 12 ++++++------ src/openrct2/world/MapGen.cpp | 5 +++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index ef568a4519..81a2a4b119 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -330,8 +330,8 @@ namespace OpenRCT2::Ui::Windows .smooth_strength = 1, .normalize_height = false, .smoothTileEdges = true, - .heightmapLow = 2, - .heightmapHigh = 70, + .heightmapLow = 1, + .heightmapHigh = 35, }; bool _randomTerrain = true; @@ -735,7 +735,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_SIMPLEX_LOW_UP: - _settings.simplex_low = std::min(_settings.simplex_low + 1, 24); + _settings.simplex_low = std::min(_settings.simplex_low + 1, kMaximumLandHeight / 2 - 1); Invalidate(); break; case WIDX_SIMPLEX_LOW_DOWN: @@ -743,7 +743,7 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_SIMPLEX_HIGH_UP: - _settings.simplex_high = std::min(_settings.simplex_high + 1, 36); + _settings.simplex_high = std::min(_settings.simplex_high + 1, kMaximumLandHeight / 2); Invalidate(); break; case WIDX_SIMPLEX_HIGH_DOWN: @@ -849,7 +849,7 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; case WIDX_HEIGHTMAP_LOW_UP: - _settings.heightmapLow = std::min(_settings.heightmapLow + 1, kMaximumWaterHeight - 1); + _settings.heightmapLow = std::min(_settings.heightmapLow + 1, kMaximumLandHeight / 2 - 1); _settings.heightmapHigh = std::max(_settings.heightmapHigh, _settings.heightmapLow + 1); InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; @@ -858,7 +858,7 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_HIGH_UP: - _settings.heightmapHigh = std::min(_settings.heightmapHigh + 1, kMaximumWaterHeight); + _settings.heightmapHigh = std::min(_settings.heightmapHigh + 1, kMaximumLandHeight - 1); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; case WIDX_HEIGHTMAP_HIGH_DOWN: diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 1b1c62f418..3280326573 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -879,7 +879,7 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) Guard::Assert(settings->heightmapHigh > settings->heightmapLow, "Output range is invalid"); const uint8_t rangeIn = maxValue - minValue; - const uint8_t rangeOut = settings->heightmapHigh - settings->heightmapLow; + const uint8_t rangeOut = (settings->heightmapHigh - settings->heightmapLow) * 2; for (uint32_t y = 0; y < _heightMapData.height; y++) { @@ -893,7 +893,8 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) // Read value from bitmap, and convert its range uint8_t value = dest[x + y * _heightMapData.width]; - value = static_cast(static_cast(value - minValue) / rangeIn * rangeOut) + settings->heightmapLow; + value = static_cast(static_cast(value - minValue) / rangeIn * rangeOut) + + (settings->heightmapLow * 2); surfaceElement->BaseHeight = value; // Floor to even number From 0c4429e60f483abfe4b183665bb444ab92c3265a Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 14:56:54 +0200 Subject: [PATCH 12/39] Rename baseHeight, waterLevel, landTexture, edgeTexture settings --- src/openrct2-ui/windows/MapGen.cpp | 62 +++++++++++++++--------------- src/openrct2/world/MapGen.cpp | 28 +++++++------- src/openrct2/world/MapGen.h | 8 ++-- 3 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 81a2a4b119..6a1d6003c6 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -310,10 +310,10 @@ namespace OpenRCT2::Ui::Windows // Base .algorithm = MapGenAlgorithm::blank, .mapSize{ 150, 150 }, - .height = 12, - .water_level = 6, - .floor = 0, - .wall = 0, + .baseHeight = 12, + .waterLevel = 6, + .landTexture = 0, + .edgeTexture = 0, // Features (e.g. tree, rivers, lakes etc.) .trees = true, @@ -461,17 +461,17 @@ namespace OpenRCT2::Ui::Windows switch (mapgenSettings.algorithm) { case MapGenAlgorithm::blank: - mapgenSettings.height += 2; - mapgenSettings.water_level += 2; + mapgenSettings.baseHeight += 2; + mapgenSettings.waterLevel += 2; break; case MapGenAlgorithm::simplexNoise: - mapgenSettings.height += 2; - mapgenSettings.water_level += 2; + mapgenSettings.baseHeight += 2; + mapgenSettings.waterLevel += 2; if (_randomTerrain) { - mapgenSettings.floor = -1; - mapgenSettings.wall = -1; + mapgenSettings.landTexture = -1; + mapgenSettings.edgeTexture = -1; } mapgenSettings.simplex_low = UtilRand() % 4; @@ -481,12 +481,12 @@ namespace OpenRCT2::Ui::Windows break; case MapGenAlgorithm::simplexCustom: - mapgenSettings.water_level += kMinimumWaterHeight; + mapgenSettings.waterLevel += kMinimumWaterHeight; mapgenSettings.simplex_base_freq /= 100.00f; if (_randomTerrain) { - mapgenSettings.floor = -1; - mapgenSettings.wall = -1; + mapgenSettings.landTexture = -1; + mapgenSettings.edgeTexture = -1; } break; @@ -997,7 +997,7 @@ namespace OpenRCT2::Ui::Windows ft.Add((BASESIZE_MAX - 12) / 2); WindowTextInputOpen( this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, - (_settings.height - 12) / 2, 3); + (_settings.baseHeight - 12) / 2, 3); break; } } @@ -1008,11 +1008,11 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BASE_HEIGHT_UP: - _settings.height = std::min(_settings.height + 2, BASESIZE_MAX); + _settings.baseHeight = std::min(_settings.baseHeight + 2, BASESIZE_MAX); Invalidate(); break; case WIDX_BASE_HEIGHT_DOWN: - _settings.height = std::max(_settings.height - 2, BASESIZE_MIN); + _settings.baseHeight = std::max(_settings.baseHeight - 2, BASESIZE_MIN); Invalidate(); break; case WIDX_RANDOM_TERRAIN: @@ -1020,10 +1020,10 @@ namespace OpenRCT2::Ui::Windows Invalidate(); break; case WIDX_FLOOR_TEXTURE: - LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.floor); + LandTool::ShowSurfaceStyleDropdown(this, widget, _settings.landTexture); break; case WIDX_WALL_TEXTURE: - LandTool::ShowEdgeStyleDropdown(this, widget, _settings.wall); + LandTool::ShowEdgeStyleDropdown(this, widget, _settings.edgeTexture); break; } } @@ -1052,7 +1052,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BASE_HEIGHT: - _settings.height = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); + _settings.baseHeight = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); break; } @@ -1069,7 +1069,7 @@ namespace OpenRCT2::Ui::Windows if (dropdownIndex == -1) dropdownIndex = gDropdownHighlightedIndex; - type = (dropdownIndex == -1) ? _settings.floor : dropdownIndex; + type = (dropdownIndex == -1) ? _settings.landTexture : dropdownIndex; if (gLandToolTerrainSurface == type) { @@ -1078,7 +1078,7 @@ namespace OpenRCT2::Ui::Windows else { gLandToolTerrainSurface = type; - _settings.floor = type; + _settings.landTexture = type; } Invalidate(); break; @@ -1086,7 +1086,7 @@ namespace OpenRCT2::Ui::Windows if (dropdownIndex == -1) dropdownIndex = gDropdownHighlightedIndex; - type = (dropdownIndex == -1) ? _settings.wall : dropdownIndex; + type = (dropdownIndex == -1) ? _settings.edgeTexture : dropdownIndex; if (gLandToolTerrainEdge == type) { @@ -1095,7 +1095,7 @@ namespace OpenRCT2::Ui::Windows else { gLandToolTerrainEdge = type; - _settings.wall = type; + _settings.edgeTexture = type; } Invalidate(); break; @@ -1128,7 +1128,7 @@ namespace OpenRCT2::Ui::Windows { auto& objManager = GetContext()->GetObjectManager(); const auto surfaceObj = static_cast( - objManager.GetLoadedObject(ObjectType::TerrainSurface, _settings.floor)); + objManager.GetLoadedObject(ObjectType::TerrainSurface, _settings.landTexture)); ImageId surfaceImage; if (surfaceObj != nullptr) { @@ -1141,7 +1141,7 @@ namespace OpenRCT2::Ui::Windows ImageId edgeImage; const auto edgeObj = static_cast( - objManager.GetLoadedObject(ObjectType::TerrainEdge, _settings.wall)); + objManager.GetLoadedObject(ObjectType::TerrainEdge, _settings.edgeTexture)); if (edgeObj != nullptr) { edgeImage = ImageId(edgeObj->IconImageId); @@ -1192,7 +1192,7 @@ namespace OpenRCT2::Ui::Windows { textColour }); auto ft = Formatter(); - ft.Add((_settings.height - 12) / 2); + ft.Add((_settings.baseHeight - 12) / 2); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_COMMA16, ft, { colours[1] }); @@ -1215,7 +1215,7 @@ namespace OpenRCT2::Ui::Windows ft.Add((WATERLEVEL_MAX - 12) / 2); WindowTextInputOpen( this, WIDX_WATER_LEVEL, STR_WATER_LEVEL, STR_ENTER_WATER_LEVEL, ft, STR_FORMAT_INTEGER, - (_settings.water_level - 12) / 2, 3); + (_settings.waterLevel - 12) / 2, 3); break; } @@ -1233,11 +1233,11 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_WATER_LEVEL_UP: - _settings.water_level = std::min(_settings.water_level + 2, WATERLEVEL_MAX); + _settings.waterLevel = std::min(_settings.waterLevel + 2, WATERLEVEL_MAX); Invalidate(); break; case WIDX_WATER_LEVEL_DOWN: - _settings.water_level = std::max(_settings.water_level - 2, WATERLEVEL_MIN); + _settings.waterLevel = std::max(_settings.waterLevel - 2, WATERLEVEL_MIN); Invalidate(); break; } @@ -1267,7 +1267,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_WATER_LEVEL: - _settings.water_level = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); + _settings.waterLevel = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); break; } @@ -1299,7 +1299,7 @@ namespace OpenRCT2::Ui::Windows { textColour }); auto ft = Formatter(); - ft.Add((_settings.water_level - 12) / 2); + ft.Add((_settings.waterLevel - 12) / 2); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_WATER_LEVEL].left + 1, widgets[WIDX_WATER_LEVEL].top + 1 }, STR_COMMA16, ft, { colours[1] }); diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 3280326573..7a83fcb2cd 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -165,25 +165,25 @@ static void MapGenGenerateBlank(MapGenSettings* settings) auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); if (surfaceElement != nullptr) { - surfaceElement->SetSurfaceObjectIndex(settings->floor); - surfaceElement->SetEdgeObjectIndex(settings->wall); - surfaceElement->BaseHeight = settings->height; - surfaceElement->ClearanceHeight = settings->height; + surfaceElement->SetSurfaceObjectIndex(settings->landTexture); + surfaceElement->SetEdgeObjectIndex(settings->edgeTexture); + surfaceElement->BaseHeight = settings->baseHeight; + surfaceElement->ClearanceHeight = settings->baseHeight; } } } - MapGenSetWaterLevel(settings->water_level); + MapGenSetWaterLevel(settings->waterLevel); } static void MapGenGenerateSimplex(MapGenSettings* settings) { auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); - const auto selectedFloor = TerrainSurfaceObject::GetById(settings->floor); + const auto selectedFloor = TerrainSurfaceObject::GetById(settings->landTexture); std::string_view floorTexture = selectedFloor != nullptr ? selectedFloor->GetIdentifier() : ""; - const auto selectedEdge = TerrainEdgeObject::GetById(settings->wall); + const auto selectedEdge = TerrainEdgeObject::GetById(settings->edgeTexture); std::string_view edgeTexture = selectedFloor != nullptr ? selectedEdge->GetIdentifier() : ""; if (floorTexture.empty()) @@ -232,8 +232,8 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) { surfaceElement->SetSurfaceObjectIndex(floorTextureId); surfaceElement->SetEdgeObjectIndex(edgeTextureId); - surfaceElement->BaseHeight = settings->height; - surfaceElement->ClearanceHeight = settings->height; + surfaceElement->BaseHeight = settings->baseHeight; + surfaceElement->ClearanceHeight = settings->baseHeight; } } } @@ -256,7 +256,7 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) } // Add the water - MapGenSetWaterLevel(settings->water_level); + MapGenSetWaterLevel(settings->waterLevel); } static void MapGenAddBeaches(MapGenSettings* settings) @@ -284,7 +284,7 @@ static void MapGenAddBeaches(MapGenSettings* settings) { auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); - if (surfaceElement != nullptr && surfaceElement->BaseHeight < settings->water_level + 6) + if (surfaceElement != nullptr && surfaceElement->BaseHeight < settings->waterLevel + 6) surfaceElement->SetSurfaceObjectIndex(beachTextureId); } } @@ -526,7 +526,7 @@ static void MapGenSetHeight(MapGenSettings* settings) surfaceElement->BaseHeight = std::max(2, baseHeight * 2); // If base height is below water level, lower it to create more natural shorelines - if (surfaceElement->BaseHeight >= 4 && surfaceElement->BaseHeight <= settings->water_level) + if (surfaceElement->BaseHeight >= 4 && surfaceElement->BaseHeight <= settings->waterLevel) surfaceElement->BaseHeight -= 2; surfaceElement->ClearanceHeight = surfaceElement->BaseHeight; @@ -903,9 +903,9 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) surfaceElement->ClearanceHeight = surfaceElement->BaseHeight; // Set water level - if (surfaceElement->BaseHeight < settings->water_level) + if (surfaceElement->BaseHeight < settings->waterLevel) { - surfaceElement->SetWaterHeight(settings->water_level * kCoordsZStep); + surfaceElement->SetWaterHeight(settings->waterLevel * kCoordsZStep); } } } diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 72493e8291..c2f0bca0b1 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -25,10 +25,10 @@ struct MapGenSettings // Base MapGenAlgorithm algorithm; TileCoordsXY mapSize; - int32_t height; - int32_t water_level; - int32_t floor; - int32_t wall; + int32_t baseHeight; + int32_t waterLevel; + int32_t landTexture; + int32_t edgeTexture; // Features (e.g. tree, rivers, lakes etc.) bool trees; From eb5471346a501557b363b43c9c3feba612481f1f Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 15:08:57 +0200 Subject: [PATCH 13/39] Unify min/max land height settings in terrain tab --- data/language/en-GB.txt | 4 +- src/openrct2-ui/UiStringIds.h | 4 +- src/openrct2-ui/windows/MapGen.cpp | 187 ++++++++++------------------- src/openrct2/world/MapGen.cpp | 10 +- src/openrct2/world/MapGen.h | 6 +- 5 files changed, 76 insertions(+), 135 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 0c86bd81f2..678a6112e9 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -1910,8 +1910,8 @@ STR_2670 :Scroll STR_2680 :All research complete STR_2684 :Large group of guests arrive STR_2685 :Simplex Noise Parameters -STR_2686 :Low: -STR_2687 :High: +STR_2686 :Min. land height: +STR_2687 :Max. land height: STR_2688 :Base Frequency: STR_2689 :Octaves: STR_2690 :Map Generation diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 24980dbea1..5f6add994b 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -913,8 +913,8 @@ namespace OpenRCT2 STR_MAPGEN_SELECT_HEIGHTMAP = 6043, STR_MAPGEN_SIMPLEX_NOISE = 2685, STR_MAPGEN_SIMPLEX_NOISE_BASE_FREQUENCY = 2688, - STR_MAPGEN_SIMPLEX_NOISE_HIGH = 2687, - STR_MAPGEN_SIMPLEX_NOISE_LOW_ = 2686, + STR_MAPGEN_MAX_LAND_HEIGHT = 2687, + STR_MAPGEN_MIN_LAND_HEIGHT = 2686, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES = 2689, STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, STR_MAPGEN_SMOOTH_STRENGTH = 6045, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 6a1d6003c6..10c3011b69 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -68,12 +68,6 @@ namespace OpenRCT2::Ui::Windows WIDX_RANDOM_PLACE_TREES = TAB_BEGIN, WIDX_SIMPLEX_LABEL = TAB_BEGIN, - WIDX_SIMPLEX_LOW, - WIDX_SIMPLEX_LOW_UP, - WIDX_SIMPLEX_LOW_DOWN, - WIDX_SIMPLEX_HIGH, - WIDX_SIMPLEX_HIGH_UP, - WIDX_SIMPLEX_HIGH_DOWN, WIDX_SIMPLEX_BASE_FREQ, WIDX_SIMPLEX_BASE_FREQ_UP, WIDX_SIMPLEX_BASE_FREQ_DOWN, @@ -88,12 +82,6 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_STRENGTH_DOWN, WIDX_HEIGHTMAP_NORMALIZE, WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, - WIDX_HEIGHTMAP_LOW, - WIDX_HEIGHTMAP_LOW_UP, - WIDX_HEIGHTMAP_LOW_DOWN, - WIDX_HEIGHTMAP_HIGH, - WIDX_HEIGHTMAP_HIGH_UP, - WIDX_HEIGHTMAP_HIGH_DOWN, WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, @@ -101,6 +89,12 @@ namespace OpenRCT2::Ui::Windows WIDX_RANDOM_TERRAIN, WIDX_FLOOR_TEXTURE, WIDX_WALL_TEXTURE, + WIDX_HEIGHTMAP_LOW, + WIDX_HEIGHTMAP_LOW_UP, + WIDX_HEIGHTMAP_LOW_DOWN, + WIDX_HEIGHTMAP_HIGH, + WIDX_HEIGHTMAP_HIGH_UP, + WIDX_HEIGHTMAP_HIGH_DOWN, WIDX_WATER_LEVEL = TAB_BEGIN, WIDX_WATER_LEVEL_UP, @@ -144,10 +138,8 @@ namespace OpenRCT2::Ui::Windows static Widget SimplexWidgets[] = { SHARED_WIDGETS, MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL - MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_HIGH{,_UP,_DOWN} - MakeSpinnerWidgets({104, 106}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} - MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} + MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} + MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} kWidgetsEnd, }; @@ -158,8 +150,6 @@ namespace OpenRCT2::Ui::Windows MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} MakeWidget ({ 4, 88}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE MakeWidget ({ 4, 106}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES - MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({104, 142}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} kWidgetsEnd, }; @@ -169,6 +159,8 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({104, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), MakeWidget ({104, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), MakeWidget ({151, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), + MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({104, 142}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} kWidgetsEnd, }; @@ -206,13 +198,7 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN) | (1uLL << WIDX_HEIGHTMAP_NORMALIZE) | - (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES) | - (1uLL << WIDX_HEIGHTMAP_HIGH) | - (1uLL << WIDX_HEIGHTMAP_HIGH_UP) | - (1uLL << WIDX_HEIGHTMAP_HIGH_DOWN) | - (1uLL << WIDX_HEIGHTMAP_LOW) | - (1uLL << WIDX_HEIGHTMAP_LOW_UP) | - (1uLL << WIDX_HEIGHTMAP_LOW_DOWN) + (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES) }; static uint64_t HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { @@ -223,25 +209,21 @@ namespace OpenRCT2::Ui::Windows 0, - (1uLL << WIDX_SIMPLEX_LOW_UP) | - (1uLL << WIDX_SIMPLEX_LOW_DOWN) | - (1uLL << WIDX_SIMPLEX_HIGH_UP) | - (1uLL << WIDX_SIMPLEX_HIGH_DOWN) | (1uLL << WIDX_SIMPLEX_BASE_FREQ_UP) | (1uLL << WIDX_SIMPLEX_BASE_FREQ_DOWN) | (1uLL << WIDX_SIMPLEX_OCTAVES_UP) | (1uLL << WIDX_SIMPLEX_OCTAVES_DOWN), (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | - (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN) | + (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN), + + (1uLL << WIDX_BASE_HEIGHT_UP) | + (1uLL << WIDX_BASE_HEIGHT_DOWN) | (1uLL << WIDX_HEIGHTMAP_LOW_UP) | (1uLL << WIDX_HEIGHTMAP_LOW_DOWN) | (1uLL << WIDX_HEIGHTMAP_HIGH_UP) | (1uLL << WIDX_HEIGHTMAP_HIGH_DOWN), - (1uLL << WIDX_BASE_HEIGHT_UP) | - (1uLL << WIDX_BASE_HEIGHT_DOWN), - (1uLL << WIDX_WATER_LEVEL_UP) | (1uLL << WIDX_WATER_LEVEL_DOWN), }; @@ -314,14 +296,14 @@ namespace OpenRCT2::Ui::Windows .waterLevel = 6, .landTexture = 0, .edgeTexture = 0, + .heightmapLow = 1, + .heightmapHigh = 20, // Features (e.g. tree, rivers, lakes etc.) .trees = true, .beaches = true, // Simplex Noise Parameters - .simplex_low = 6, - .simplex_high = 10, .simplex_base_freq = 60, .simplex_octaves = 4, @@ -330,8 +312,6 @@ namespace OpenRCT2::Ui::Windows .smooth_strength = 1, .normalize_height = false, .smoothTileEdges = true, - .heightmapLow = 1, - .heightmapHigh = 35, }; bool _randomTerrain = true; @@ -357,12 +337,6 @@ namespace OpenRCT2::Ui::Windows SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH_UP, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH_DOWN, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_LOW, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_LOW_UP, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_LOW_DOWN, true); } InitScrollWidgets(); @@ -474,8 +448,8 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.edgeTexture = -1; } - mapgenSettings.simplex_low = UtilRand() % 4; - mapgenSettings.simplex_high = 12 + (UtilRand() % (32 - 12)); + mapgenSettings.heightmapLow = UtilRand() % 4; + mapgenSettings.heightmapHigh = 12 + (UtilRand() % (32 - 12)); mapgenSettings.simplex_base_freq = 1.75f; mapgenSettings.simplex_octaves = 6; break; @@ -734,22 +708,6 @@ namespace OpenRCT2::Ui::Windows { switch (widgetIndex) { - case WIDX_SIMPLEX_LOW_UP: - _settings.simplex_low = std::min(_settings.simplex_low + 1, kMaximumLandHeight / 2 - 1); - Invalidate(); - break; - case WIDX_SIMPLEX_LOW_DOWN: - _settings.simplex_low = std::max(_settings.simplex_low - 1, 0); - Invalidate(); - break; - case WIDX_SIMPLEX_HIGH_UP: - _settings.simplex_high = std::min(_settings.simplex_high + 1, kMaximumLandHeight / 2); - Invalidate(); - break; - case WIDX_SIMPLEX_HIGH_DOWN: - _settings.simplex_high = std::max(_settings.simplex_high - 1, 0); - Invalidate(); - break; case WIDX_SIMPLEX_BASE_FREQ_UP: _settings.simplex_base_freq = std::min(_settings.simplex_base_freq + 5, 1000); Invalidate(); @@ -795,12 +753,6 @@ namespace OpenRCT2::Ui::Windows const auto textColour = colours[1]; - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_LOW].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_LOW_, {}, - { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_HIGH].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_HIGH, {}, - { textColour }); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_BASE_FREQ].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_BASE_FREQUENCY, {}, { textColour }); @@ -809,21 +761,12 @@ namespace OpenRCT2::Ui::Windows {}, { textColour }); auto ft = Formatter(); - ft.Add(_settings.simplex_low); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_LOW].left + 1, widgets[WIDX_SIMPLEX_LOW].top + 1 }, - STR_COMMA16, ft, { textColour }); - ft = Formatter(); - ft.Add(_settings.simplex_high); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_HIGH].left + 1, widgets[WIDX_SIMPLEX_HIGH].top + 1 }, - STR_COMMA16, ft, { textColour }); - ft = Formatter(); ft.Add(_settings.simplex_base_freq); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_SIMPLEX_BASE_FREQ].left + 1, widgets[WIDX_SIMPLEX_BASE_FREQ].top + 1 }, STR_WINDOW_COLOUR_2_COMMA2DP32, ft, { textColour }); + ft = Formatter(); ft.Add(_settings.simplex_octaves); DrawTextBasic( @@ -848,24 +791,6 @@ namespace OpenRCT2::Ui::Windows _settings.smooth_strength = std::max(_settings.smooth_strength - 1, 1); InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; - case WIDX_HEIGHTMAP_LOW_UP: - _settings.heightmapLow = std::min(_settings.heightmapLow + 1, kMaximumLandHeight / 2 - 1); - _settings.heightmapHigh = std::max(_settings.heightmapHigh, _settings.heightmapLow + 1); - InvalidateWidget(WIDX_HEIGHTMAP_LOW); - break; - case WIDX_HEIGHTMAP_LOW_DOWN: - _settings.heightmapLow = std::max(_settings.heightmapLow - 1, 2); - InvalidateWidget(WIDX_HEIGHTMAP_LOW); - break; - case WIDX_HEIGHTMAP_HIGH_UP: - _settings.heightmapHigh = std::min(_settings.heightmapHigh + 1, kMaximumLandHeight - 1); - InvalidateWidget(WIDX_HEIGHTMAP_HIGH); - break; - case WIDX_HEIGHTMAP_HIGH_DOWN: - _settings.heightmapHigh = std::max(_settings.heightmapHigh - 1, 2 + 1); - _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh - 1); - InvalidateWidget(WIDX_HEIGHTMAP_HIGH); - break; } } @@ -955,29 +880,6 @@ namespace OpenRCT2::Ui::Windows windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_STRENGTH].left + 1, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_COMMA16, ft, { strengthColour }); - - // Low label and value - const auto labelColour = _heightmapLoaded ? enabledColour : disabledColour; - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_LOW_, {}, - { labelColour }); - - ft = Formatter(); - ft.Add(_settings.heightmapLow); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_LOW].left + 1, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, - STR_COMMA16, ft, { labelColour }); - - // High label and value - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_HIGH, {}, - { labelColour }); - - ft = Formatter(); - ft.Add(_settings.heightmapHigh); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_HIGH].left + 1, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, - STR_COMMA16, ft, { labelColour }); } #pragma endregion @@ -1025,6 +927,24 @@ namespace OpenRCT2::Ui::Windows case WIDX_WALL_TEXTURE: LandTool::ShowEdgeStyleDropdown(this, widget, _settings.edgeTexture); break; + case WIDX_HEIGHTMAP_LOW_UP: + _settings.heightmapLow = std::min(_settings.heightmapLow + 1, kMaximumLandHeight / 2 - 1); + _settings.heightmapHigh = std::max(_settings.heightmapHigh, _settings.heightmapLow + 1); + InvalidateWidget(WIDX_HEIGHTMAP_LOW); + break; + case WIDX_HEIGHTMAP_LOW_DOWN: + _settings.heightmapLow = std::max(_settings.heightmapLow - 1, 2); + InvalidateWidget(WIDX_HEIGHTMAP_LOW); + break; + case WIDX_HEIGHTMAP_HIGH_UP: + _settings.heightmapHigh = std::min(_settings.heightmapHigh + 1, kMaximumLandHeight - 1); + InvalidateWidget(WIDX_HEIGHTMAP_HIGH); + break; + case WIDX_HEIGHTMAP_HIGH_DOWN: + _settings.heightmapHigh = std::max(_settings.heightmapHigh - 1, 2 + 1); + _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh - 1); + InvalidateWidget(WIDX_HEIGHTMAP_HIGH); + break; } } @@ -1184,18 +1104,43 @@ namespace OpenRCT2::Ui::Windows const auto textColour = colours[1]; + // Base height label and value DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, { textColour }); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, - { textColour }); auto ft = Formatter(); ft.Add((_settings.baseHeight - 12) / 2); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_COMMA16, ft, { colours[1] }); + + // Floor texture label + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, + { textColour }); + + // Minimum land height label and value + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_MAPGEN_MIN_LAND_HEIGHT, {}, + { textColour }); + + ft = Formatter(); + ft.Add(_settings.heightmapLow); + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_LOW].left + 1, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, + STR_COMMA16, ft, { textColour }); + + // Maximum land height label and value + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_MAPGEN_MAX_LAND_HEIGHT, {}, + { textColour }); + + ft = Formatter(); + ft.Add(_settings.heightmapHigh); + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_HIGH].left + 1, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, + STR_COMMA16, ft, { textColour }); } #pragma endregion diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 7a83fcb2cd..af392f875b 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -684,18 +684,16 @@ static float Grad(int32_t hash, float x, float y) static void MapGenSimplex(MapGenSettings* settings) { - int32_t x, y; - float freq = settings->simplex_base_freq * (1.0f / _heightSize.x); int32_t octaves = settings->simplex_octaves; - int32_t low = settings->simplex_low; - int32_t high = settings->simplex_high; + int32_t low = settings->heightmapLow; + int32_t high = settings->heightmapHigh; NoiseRand(); - for (y = 0; y < _heightSize.y; y++) + for (int32_t y = 0; y < _heightSize.y; y++) { - for (x = 0; x < _heightSize.x; x++) + for (int32_t x = 0; x < _heightSize.x; x++) { float noiseValue = std::clamp(FractalNoise(x, y, freq, octaves, 2.0f, 0.65f), -1.0f, 1.0f); float normalisedNoiseValue = (noiseValue + 1.0f) / 2.0f; diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index c2f0bca0b1..79ca1c5327 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -29,14 +29,14 @@ struct MapGenSettings int32_t waterLevel; int32_t landTexture; int32_t edgeTexture; + int32_t heightmapLow; + int32_t heightmapHigh; // Features (e.g. tree, rivers, lakes etc.) bool trees; bool beaches; // Simplex Noise Parameters - int32_t simplex_low; - int32_t simplex_high; float simplex_base_freq; int32_t simplex_octaves; @@ -45,8 +45,6 @@ struct MapGenSettings uint32_t smooth_strength; bool normalize_height; bool smoothTileEdges; - int32_t heightmapLow; - int32_t heightmapHigh; }; void MapGenGenerate(MapGenSettings* settings); From 457a923178bce89fcc00a385c10017be398b18bc Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 15:27:15 +0200 Subject: [PATCH 14/39] Move smooth tile edges option to terrain tab, apply to all generators --- src/openrct2-ui/windows/MapGen.cpp | 28 +++++++++++++--------------- src/openrct2/world/MapGen.cpp | 7 +++++-- src/openrct2/world/MapGen.h | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 10c3011b69..3d2a79861c 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -81,7 +81,6 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_STRENGTH_UP, WIDX_HEIGHTMAP_STRENGTH_DOWN, WIDX_HEIGHTMAP_NORMALIZE, - WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, @@ -95,6 +94,7 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_HIGH, WIDX_HEIGHTMAP_HIGH_UP, WIDX_HEIGHTMAP_HIGH_DOWN, + WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, WIDX_WATER_LEVEL = TAB_BEGIN, WIDX_WATER_LEVEL_UP, @@ -149,7 +149,6 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({ 4, 52}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} MakeWidget ({ 4, 88}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE - MakeWidget ({ 4, 106}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES kWidgetsEnd, }; @@ -159,8 +158,9 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({104, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), MakeWidget ({104, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), MakeWidget ({151, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), - MakeSpinnerWidgets({104, 124}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({104, 142}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} + MakeSpinnerWidgets({104, 124}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({104, 142}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} + MakeWidget ({104, 160}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES kWidgetsEnd, }; @@ -197,8 +197,7 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_HEIGHTMAP_STRENGTH) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN) | - (1uLL << WIDX_HEIGHTMAP_NORMALIZE) | - (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES) + (1uLL << WIDX_HEIGHTMAP_NORMALIZE) }; static uint64_t HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { @@ -232,8 +231,8 @@ namespace OpenRCT2::Ui::Windows 0, 0, 0, - (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES), 0, + (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES), 0, }; // clang-format on @@ -298,6 +297,7 @@ namespace OpenRCT2::Ui::Windows .edgeTexture = 0, .heightmapLow = 1, .heightmapHigh = 20, + .smoothTileEdges = true, // Features (e.g. tree, rivers, lakes etc.) .trees = true, @@ -311,7 +311,6 @@ namespace OpenRCT2::Ui::Windows .smooth_height_map = false, .smooth_strength = 1, .normalize_height = false, - .smoothTileEdges = true, }; bool _randomTerrain = true; @@ -336,7 +335,6 @@ namespace OpenRCT2::Ui::Windows SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, true); } InitScrollWidgets(); @@ -833,11 +831,6 @@ namespace OpenRCT2::Ui::Windows SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); InvalidateWidget(WIDX_HEIGHTMAP_NORMALIZE); break; - case WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES: - _settings.smoothTileEdges = !_settings.smoothTileEdges; - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); - InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES); - break; } // Always regenerate the map after one of the page widgets has been changed @@ -854,7 +847,6 @@ namespace OpenRCT2::Ui::Windows SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _settings.smooth_height_map); SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); SetPressedTab(); } @@ -902,6 +894,11 @@ namespace OpenRCT2::Ui::Windows (_settings.baseHeight - 12) / 2, 3); break; } + case WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES: + _settings.smoothTileEdges = !_settings.smoothTileEdges; + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); + InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES); + break; } } @@ -1080,6 +1077,7 @@ namespace OpenRCT2::Ui::Windows } SetCheckboxValue(WIDX_RANDOM_TERRAIN, _randomTerrain != 0); + SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); // Only allow floor and wall texture options if random terrain is disabled if (!_randomTerrain) diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index af392f875b..7fa2ddcb19 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -250,9 +250,12 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) MapGenSetHeight(settings); delete[] _height; - // Set the tile slopes so that there are no cliffs - while (MapSmooth(1, 1, mapSize.x - 1, mapSize.y - 1)) + if (settings->smoothTileEdges) { + // Set the tile slopes so that there are no cliffs + while (MapSmooth(1, 1, mapSize.x - 1, mapSize.y - 1)) + { + } } // Add the water diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 79ca1c5327..7ead7c318f 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -31,6 +31,7 @@ struct MapGenSettings int32_t edgeTexture; int32_t heightmapLow; int32_t heightmapHigh; + bool smoothTileEdges; // Features (e.g. tree, rivers, lakes etc.) bool trees; @@ -44,7 +45,6 @@ struct MapGenSettings bool smooth_height_map; uint32_t smooth_strength; bool normalize_height; - bool smoothTileEdges; }; void MapGenGenerate(MapGenSettings* settings); From 6d6dc95a91e940eb275d0725c214faf9992208bd Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 17:54:25 +0200 Subject: [PATCH 15/39] Consolitate simplex and heightmap settings in generator tab --- src/openrct2-ui/windows/MapGen.cpp | 219 +++++++++++------------------ 1 file changed, 86 insertions(+), 133 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 3d2a79861c..8c902f39c9 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -32,8 +32,6 @@ namespace OpenRCT2::Ui::Windows { WINDOW_MAPGEN_PAGE_BASE, WINDOW_MAPGEN_PAGE_RANDOM, - WINDOW_MAPGEN_PAGE_SIMPLEX, - WINDOW_MAPGEN_PAGE_HEIGHTMAP, WINDOW_MAPGEN_PAGE_TERRAIN, WINDOW_MAPGEN_PAGE_WATER, WINDOW_MAPGEN_PAGE_COUNT @@ -49,8 +47,6 @@ namespace OpenRCT2::Ui::Windows WIDX_TAB_2, WIDX_TAB_3, WIDX_TAB_4, - WIDX_TAB_5, - WIDX_TAB_6, WIDX_MAP_GENERATE, TAB_BEGIN, @@ -65,9 +61,7 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_SOURCE, WIDX_HEIGHTMAP_SOURCE_DROPDOWN, - WIDX_RANDOM_PLACE_TREES = TAB_BEGIN, - - WIDX_SIMPLEX_LABEL = TAB_BEGIN, + WIDX_SIMPLEX_GROUP, WIDX_SIMPLEX_BASE_FREQ, WIDX_SIMPLEX_BASE_FREQ_UP, WIDX_SIMPLEX_BASE_FREQ_DOWN, @@ -75,12 +69,15 @@ namespace OpenRCT2::Ui::Windows WIDX_SIMPLEX_OCTAVES_UP, WIDX_SIMPLEX_OCTAVES_DOWN, - WIDX_HEIGHTMAP_SELECT = TAB_BEGIN, + WIDX_HEIGHTMAP_GROUP, + WIDX_HEIGHTMAP_SELECT, + WIDX_HEIGHTMAP_NORMALIZE, WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, WIDX_HEIGHTMAP_STRENGTH, WIDX_HEIGHTMAP_STRENGTH_UP, WIDX_HEIGHTMAP_STRENGTH_DOWN, - WIDX_HEIGHTMAP_NORMALIZE, + + WIDX_RANDOM_PLACE_TREES = TAB_BEGIN, WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, @@ -115,8 +112,6 @@ namespace OpenRCT2::Ui::Windows MakeTab({ 34, 17 }), /* WIDX_TAB_2 */ \ MakeTab({ 65, 17 }), /* WIDX_TAB_3 */ \ MakeTab({ 96, 17 }), /* WIDX_TAB_4 */ \ - MakeTab({ 127, 17 }), /* WIDX_TAB_5 */ \ - MakeTab({ 158, 17 }), /* WIDX_TAB_6 */ \ MakeWidget({ 155, 255 }, { 90, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE) // clang-format off @@ -126,6 +121,16 @@ namespace OpenRCT2::Ui::Windows MakeWidget ({155, 52}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), MakeSpinnerWidgets ({177, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets MakeDropdownWidgets({104, 70}, {123, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_HEIGHTMAP_FLATLAND ), + + MakeWidget ({ 5, 90}, {240, 60}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE), // WIDX_SIMPLEX_GROUP + MakeSpinnerWidgets({104, 107}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} + MakeSpinnerWidgets({104, 125}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} + + MakeWidget ({ 5, 90}, {240, 88}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_GROUP + MakeWidget ({115, 107}, {120, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_SELECT + MakeWidget ({ 4, 107}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE + MakeWidget ({ 4, 125}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP + MakeSpinnerWidgets({104, 143}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} kWidgetsEnd, }; @@ -135,23 +140,6 @@ namespace OpenRCT2::Ui::Windows kWidgetsEnd, }; - static Widget SimplexWidgets[] = { - SHARED_WIDGETS, - MakeWidget ({ 4, 52}, {195, 12}, WindowWidgetType::LabelCentred, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE ), // WIDX_SIMPLEX_LABEL - MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} - MakeSpinnerWidgets({104, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} - kWidgetsEnd, - }; - - static Widget HeightmapWidgets[] = { - SHARED_WIDGETS, - MakeWidget ({ 95, 255}, {150, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_SELECT - MakeWidget ({ 4, 52}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP - MakeSpinnerWidgets({104, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} - MakeWidget ({ 4, 88}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE - kWidgetsEnd, - }; - static Widget TerrainWidgets[] = { SHARED_WIDGETS, MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets @@ -174,8 +162,6 @@ namespace OpenRCT2::Ui::Windows static Widget* PageWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { BaseWidgets, RandomWidgets, - SimplexWidgets, - HeightmapWidgets, TerrainWidgets, WaterWidgets, }; @@ -187,35 +173,33 @@ namespace OpenRCT2::Ui::Windows // clang-format off static uint64_t PageDisabledWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { - 0, - - 0, - - 0, - (1uLL << WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN) | - (1uLL << WIDX_HEIGHTMAP_NORMALIZE) + (1uLL << WIDX_HEIGHTMAP_NORMALIZE), + + 0, + + 0, + + 0 }; static uint64_t HoldDownWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { (1uLL << WIDX_MAP_SIZE_Y_UP) | (1uLL << WIDX_MAP_SIZE_Y_DOWN) | (1uLL << WIDX_MAP_SIZE_X_UP) | - (1uLL << WIDX_MAP_SIZE_X_DOWN), - - 0, - + (1uLL << WIDX_MAP_SIZE_X_DOWN) | (1uLL << WIDX_SIMPLEX_BASE_FREQ_UP) | (1uLL << WIDX_SIMPLEX_BASE_FREQ_DOWN) | (1uLL << WIDX_SIMPLEX_OCTAVES_UP) | - (1uLL << WIDX_SIMPLEX_OCTAVES_DOWN), - + (1uLL << WIDX_SIMPLEX_OCTAVES_DOWN) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN), + 0, + (1uLL << WIDX_BASE_HEIGHT_UP) | (1uLL << WIDX_BASE_HEIGHT_DOWN) | (1uLL << WIDX_HEIGHTMAP_LOW_UP) | @@ -228,8 +212,6 @@ namespace OpenRCT2::Ui::Windows }; static uint64_t PressedWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { - 0, - 0, 0, 0, (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES), @@ -245,22 +227,16 @@ namespace OpenRCT2::Ui::Windows 1, 1, 1, - 1, - 1, }; static constexpr int32_t TabAnimationFrames[WINDOW_MAPGEN_PAGE_COUNT] = { 4, 1, 1, 1, - 1, - 1, }; static constexpr int32_t TabAnimationLoops[WINDOW_MAPGEN_PAGE_COUNT] = { 16, 16, - 16, - 0, 1, 1, }; @@ -328,7 +304,7 @@ namespace OpenRCT2::Ui::Windows pressed_widgets = PressedWidgets[newPage]; // Enable heightmap widgets if one is loaded - if (newPage == WINDOW_MAPGEN_PAGE_HEIGHTMAP && _heightmapLoaded) + if (_settings.algorithm == MapGenAlgorithm::heightmapImage && _heightmapLoaded) { SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, true); SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _settings.smooth_height_map); @@ -370,8 +346,6 @@ namespace OpenRCT2::Ui::Windows { DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_BASE, SPR_TAB_GEARS_0); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_RANDOM, SPR_G2_TAB_TREE); - DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_SIMPLEX, SPR_G2_TAB_PENCIL); - DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_HEIGHTMAP, SPR_TAB_GRAPH_0); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_TERRAIN, SPR_G2_TAB_LAND); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_WATER, SPR_TAB_WATER); } @@ -417,8 +391,6 @@ namespace OpenRCT2::Ui::Windows case WIDX_TAB_2: case WIDX_TAB_3: case WIDX_TAB_4: - case WIDX_TAB_5: - case WIDX_TAB_6: SetPage(widgetIndex - WIDX_TAB_1); break; case WIDX_MAP_GENERATE: @@ -478,6 +450,9 @@ namespace OpenRCT2::Ui::Windows { SharedMouseUp(widgetIndex); + if (_settings.algorithm == MapGenAlgorithm::heightmapImage) + HeightmapMouseUp(widgetIndex); + switch (widgetIndex) { case WIDX_MAP_SIZE_Y: @@ -496,6 +471,12 @@ namespace OpenRCT2::Ui::Windows void BaseMouseDown(WidgetIndex widgetIndex, Widget* widget) { + if (_settings.algorithm == MapGenAlgorithm::simplexCustom) + SimplexMouseDown(widgetIndex, widget); + + else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) + HeightmapMouseDown(widgetIndex, widget); + switch (widgetIndex) { case WIDX_MAP_SIZE_Y_UP: @@ -617,27 +598,68 @@ namespace OpenRCT2::Ui::Windows { case MapGenAlgorithm::blank: sourceWidget.text = STR_HEIGHTMAP_FLATLAND; + ToggleSimplexWidgets(false); + ToggleHeightmapWidgets(false); break; case MapGenAlgorithm::simplexNoise: sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_NOISE; + ToggleSimplexWidgets(false); + ToggleHeightmapWidgets(false); break; case MapGenAlgorithm::simplexCustom: sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_CUSTOM; + ToggleSimplexWidgets(true); + ToggleHeightmapWidgets(false); break; case MapGenAlgorithm::heightmapImage: sourceWidget.text = STR_HEIGHTMAP_FILE; + ToggleSimplexWidgets(false); + ToggleHeightmapWidgets(true); + HeightmapPrepareDraw(); break; } } + void ToggleSimplexWidgets(bool state) + { + // clang-format off + BaseWidgets[WIDX_SIMPLEX_GROUP].type = state ? WindowWidgetType::Groupbox : WindowWidgetType::Empty; + BaseWidgets[WIDX_SIMPLEX_BASE_FREQ].type = state ? WindowWidgetType::Spinner : WindowWidgetType::Empty; + BaseWidgets[WIDX_SIMPLEX_BASE_FREQ_UP].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + BaseWidgets[WIDX_SIMPLEX_BASE_FREQ_DOWN].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + BaseWidgets[WIDX_SIMPLEX_OCTAVES].type = state ? WindowWidgetType::Spinner : WindowWidgetType::Empty; + BaseWidgets[WIDX_SIMPLEX_OCTAVES_UP].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + BaseWidgets[WIDX_SIMPLEX_OCTAVES_DOWN].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + // clang-format on + } + + void ToggleHeightmapWidgets(bool state) + { + // clang-format off + BaseWidgets[WIDX_HEIGHTMAP_GROUP].type = state ? WindowWidgetType::Groupbox : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_SELECT].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_NORMALIZE].type = state ? WindowWidgetType::Checkbox : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP].type = state ? WindowWidgetType::Checkbox : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_STRENGTH].type = state ? WindowWidgetType::Spinner : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_STRENGTH_UP].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_STRENGTH_DOWN].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + // clang-format on + } + void BaseDraw(DrawPixelInfo& dpi) { DrawWidgets(dpi); DrawTabImages(dpi); + if (_settings.algorithm == MapGenAlgorithm::simplexCustom) + SimplexDraw(dpi); + + else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) + HeightmapDraw(dpi); + const auto textColour = colours[1]; DrawTextBasic( @@ -695,12 +717,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion -#pragma region Simplex page - - void SimplexMouseUp(WidgetIndex widgetIndex) - { - SharedMouseUp(widgetIndex); - } +#pragma region Simplex settings, part of generator tab void SimplexMouseDown(WidgetIndex widgetIndex, Widget* widget) { @@ -725,25 +742,6 @@ namespace OpenRCT2::Ui::Windows } } - void SimplexUpdate() - { - // Tab animation - if (++frame_no >= TabAnimationLoops[page]) - frame_no = 0; - InvalidateWidget(WIDX_TAB_3); - } - - void SimplexPrepareDraw() - { - if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_SIMPLEX]) - { - widgets = PageWidgets[WINDOW_MAPGEN_PAGE_SIMPLEX]; - InitScrollWidgets(); - } - - SetPressedTab(); - } - void SimplexDraw(DrawPixelInfo& dpi) { DrawWidgets(dpi); @@ -775,7 +773,7 @@ namespace OpenRCT2::Ui::Windows #pragma endregion -#pragma region Heightmap page +#pragma region Heightmap settings, part of generator tab void HeightmapMouseDown(WidgetIndex widgetIndex, Widget* widget) { @@ -794,20 +792,8 @@ namespace OpenRCT2::Ui::Windows void HeightmapMouseUp(WidgetIndex widgetIndex) { - SharedMouseUp(widgetIndex); - switch (widgetIndex) { - case WIDX_CLOSE: - case WIDX_TAB_1: - case WIDX_TAB_2: - case WIDX_TAB_3: - case WIDX_TAB_4: - case WIDX_TAB_5: - case WIDX_TAB_6: - case WIDX_MAP_GENERATE: - return; // Only widgets that change a setting need to regenerate the map - // Page widgets case WIDX_HEIGHTMAP_SELECT: { @@ -832,30 +818,16 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_NORMALIZE); break; } - - // Always regenerate the map after one of the page widgets has been changed - GenerateMap(); } void HeightmapPrepareDraw() { - if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_HEIGHTMAP]) - { - widgets = PageWidgets[WINDOW_MAPGEN_PAGE_HEIGHTMAP]; - InitScrollWidgets(); - } - SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _settings.smooth_height_map); SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); - - SetPressedTab(); } void HeightmapDraw(DrawPixelInfo& dpi) { - DrawWidgets(dpi); - DrawTabImages(dpi); - const auto enabledColour = colours[1]; const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); @@ -950,7 +922,7 @@ namespace OpenRCT2::Ui::Windows // Tab animation if (++frame_no >= TabAnimationLoops[page]) frame_no = 0; - InvalidateWidget(WIDX_TAB_5); + InvalidateWidget(WIDX_TAB_3); } void TerrainTextInput(WidgetIndex widgetIndex, std::string_view text) @@ -1191,7 +1163,7 @@ namespace OpenRCT2::Ui::Windows // Tab animation if (++frame_no >= TabAnimationLoops[page]) frame_no = 0; - InvalidateWidget(WIDX_TAB_6); + InvalidateWidget(WIDX_TAB_4); } void WaterTextInput(WidgetIndex widgetIndex, std::string_view text) @@ -1280,10 +1252,6 @@ namespace OpenRCT2::Ui::Windows return BaseMouseUp(widgetIndex); case WINDOW_MAPGEN_PAGE_RANDOM: return RandomMouseUp(widgetIndex); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return SimplexMouseUp(widgetIndex); - case WINDOW_MAPGEN_PAGE_HEIGHTMAP: - return HeightmapMouseUp(widgetIndex); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainMouseUp(widgetIndex); case WINDOW_MAPGEN_PAGE_WATER: @@ -1297,10 +1265,6 @@ namespace OpenRCT2::Ui::Windows { case WINDOW_MAPGEN_PAGE_BASE: return BaseMouseDown(widgetIndex, &widgets[widgetIndex]); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return SimplexMouseDown(widgetIndex, &widgets[widgetIndex]); - case WINDOW_MAPGEN_PAGE_HEIGHTMAP: - return HeightmapMouseDown(widgetIndex, &widgets[widgetIndex]); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainMouseDown(widgetIndex, &widgets[widgetIndex]); case WINDOW_MAPGEN_PAGE_WATER: @@ -1327,10 +1291,6 @@ namespace OpenRCT2::Ui::Windows return BaseUpdate(); case WINDOW_MAPGEN_PAGE_RANDOM: return RandomUpdate(); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return SimplexUpdate(); - case WINDOW_MAPGEN_PAGE_TERRAIN: - return TerrainUpdate(); case WINDOW_MAPGEN_PAGE_WATER: return WaterUpdate(); } @@ -1338,16 +1298,15 @@ namespace OpenRCT2::Ui::Windows void OnPrepareDraw() override { + bool isHeightMapImage = _settings.algorithm == MapGenAlgorithm::heightmapImage; + SetWidgetDisabled(WIDX_MAP_GENERATE, isHeightMapImage && !_heightmapLoaded); + switch (page) { case WINDOW_MAPGEN_PAGE_BASE: return BasePrepareDraw(); case WINDOW_MAPGEN_PAGE_RANDOM: return RandomPrepareDraw(); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return SimplexPrepareDraw(); - case WINDOW_MAPGEN_PAGE_HEIGHTMAP: - return HeightmapPrepareDraw(); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainPrepareDraw(); case WINDOW_MAPGEN_PAGE_WATER: @@ -1363,10 +1322,6 @@ namespace OpenRCT2::Ui::Windows return BaseDraw(dpi); case WINDOW_MAPGEN_PAGE_RANDOM: return RandomDraw(dpi); - case WINDOW_MAPGEN_PAGE_SIMPLEX: - return SimplexDraw(dpi); - case WINDOW_MAPGEN_PAGE_HEIGHTMAP: - return HeightmapDraw(dpi); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainDraw(dpi); case WINDOW_MAPGEN_PAGE_WATER: @@ -1399,9 +1354,7 @@ namespace OpenRCT2::Ui::Windows // The window needs to be open while using the map _heightmapLoaded = true; - SetPage(WINDOW_MAPGEN_PAGE_HEIGHTMAP); - - GenerateMap(); + SetPage(WINDOW_MAPGEN_PAGE_BASE); } } From fc5ad2a663c293b9d18fea2804c2ab0e1867c983 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 19:13:37 +0200 Subject: [PATCH 16/39] Adjust window dimensions, resize and move widgets --- src/openrct2-ui/windows/MapGen.cpp | 72 +++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 8c902f39c9..4d3dce0546 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -102,60 +102,60 @@ namespace OpenRCT2::Ui::Windows #pragma region Widgets static constexpr StringId WINDOW_TITLE = STR_MAPGEN_WINDOW_TITLE; - static constexpr int32_t WW = 250; - static constexpr int32_t WH = 273; + static constexpr int32_t WW = 300; + static constexpr int32_t WH = 220; #define SHARED_WIDGETS \ WINDOW_SHIM(WINDOW_TITLE, WW, WH), /* WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE */ \ - MakeWidget({ 0, 43 }, { WW, 229 }, WindowWidgetType::Resize, WindowColour::Secondary), /* WIDX_PAGE_BACKGROUND */ \ + MakeWidget({ 0, 43 }, { WW, 177 }, WindowWidgetType::Resize, WindowColour::Secondary), /* WIDX_PAGE_BACKGROUND */ \ MakeTab({ 3, 17 }), /* WIDX_TAB_1 */ \ MakeTab({ 34, 17 }), /* WIDX_TAB_2 */ \ MakeTab({ 65, 17 }), /* WIDX_TAB_3 */ \ MakeTab({ 96, 17 }), /* WIDX_TAB_4 */ \ - MakeWidget({ 155, 255 }, { 90, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE) + MakeWidget({ 204, 200 }, { 90, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE) // clang-format off static Widget BaseWidgets[] = { SHARED_WIDGETS, - MakeSpinnerWidgets ({104, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets - MakeWidget ({155, 52}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), - MakeSpinnerWidgets ({177, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets - MakeDropdownWidgets({104, 70}, {123, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_HEIGHTMAP_FLATLAND ), + MakeSpinnerWidgets ({165, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets + MakeWidget ({216, 52}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), + MakeSpinnerWidgets ({238, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets + MakeDropdownWidgets({155, 70}, {133, 14}, WindowWidgetType::DropdownMenu, WindowColour::Secondary, STR_HEIGHTMAP_FLATLAND ), - MakeWidget ({ 5, 90}, {240, 60}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE), // WIDX_SIMPLEX_GROUP - MakeSpinnerWidgets({104, 107}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} - MakeSpinnerWidgets({104, 125}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} + MakeWidget ({ 5, 90}, {290, 55}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SIMPLEX_NOISE), // WIDX_SIMPLEX_GROUP + MakeSpinnerWidgets({179, 107}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} + MakeSpinnerWidgets({179, 125}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} - MakeWidget ({ 5, 90}, {240, 88}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_GROUP - MakeWidget ({115, 107}, {120, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_SELECT - MakeWidget ({ 4, 107}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE - MakeWidget ({ 4, 125}, {100, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP - MakeSpinnerWidgets({104, 143}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} + MakeWidget ({ 5, 90}, {290, 70}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_GROUP + MakeWidget ({179, 107}, {109, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_SELECT + MakeWidget ({ 10, 107}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE + MakeWidget ({ 10, 125}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP + MakeSpinnerWidgets({179, 141}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} kWidgetsEnd, }; static Widget RandomWidgets[] = { SHARED_WIDGETS, - MakeWidget({ 4, 52}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), + MakeWidget({ 4, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), kWidgetsEnd, }; static Widget TerrainWidgets[] = { SHARED_WIDGETS, - MakeSpinnerWidgets({104, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets - MakeWidget ({104, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), - MakeWidget ({104, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), - MakeWidget ({151, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), - MakeSpinnerWidgets({104, 124}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({104, 142}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} - MakeWidget ({104, 160}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE ), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES + MakeSpinnerWidgets({179, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeWidget ({179, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), + MakeWidget ({179, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), + MakeWidget ({236, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), + MakeSpinnerWidgets({179, 124}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({179, 142}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} + MakeWidget ({179, 160}, {145, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES kWidgetsEnd, }; static Widget WaterWidgets[] = { SHARED_WIDGETS, - MakeSpinnerWidgets({104, 52}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets - MakeWidget ({ 4, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_BEACHES_WATER_BODIES ), + MakeSpinnerWidgets({179, 52}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeWidget ({ 10, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_BEACHES_WATER_BODIES), kWidgetsEnd, }; @@ -663,10 +663,10 @@ namespace OpenRCT2::Ui::Windows const auto textColour = colours[1]; DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_HEIGHTMAP_SOURCE].top + 1 }, STR_HEIGHTMAP_SOURCE, {}, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_SOURCE].top + 1 }, STR_HEIGHTMAP_SOURCE, {}, { textColour }); } @@ -750,10 +750,10 @@ namespace OpenRCT2::Ui::Windows const auto textColour = colours[1]; DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_BASE_FREQ].top + 1 }, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_SIMPLEX_BASE_FREQ].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_BASE_FREQUENCY, {}, { textColour }); DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_SIMPLEX_OCTAVES].top + 1 }, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES, {}, { textColour }); auto ft = Formatter(); @@ -834,7 +834,7 @@ namespace OpenRCT2::Ui::Windows // Smooth strength label and value const auto strengthColour = _settings.smooth_height_map ? enabledColour : disabledColour; DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 18, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, + dpi, windowPos + ScreenCoordsXY{ 24, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, { strengthColour }); auto ft = Formatter(); @@ -1076,7 +1076,7 @@ namespace OpenRCT2::Ui::Windows // Base height label and value DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, { textColour }); auto ft = Formatter(); @@ -1087,12 +1087,12 @@ namespace OpenRCT2::Ui::Windows // Floor texture label DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, { textColour }); // Minimum land height label and value DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_MAPGEN_MIN_LAND_HEIGHT, {}, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_MAPGEN_MIN_LAND_HEIGHT, {}, { textColour }); ft = Formatter(); @@ -1103,7 +1103,7 @@ namespace OpenRCT2::Ui::Windows // Maximum land height label and value DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 5, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_MAPGEN_MAX_LAND_HEIGHT, {}, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_MAPGEN_MAX_LAND_HEIGHT, {}, { textColour }); ft = Formatter(); @@ -1210,7 +1210,7 @@ namespace OpenRCT2::Ui::Windows const auto textColour = colours[1]; DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 4, widgets[WIDX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_WATER_LEVEL].top + 1 }, STR_WATER_LEVEL_LABEL, {}, { textColour }); auto ft = Formatter(); From c5b8b91b17fcfe0b19a7891176a33e3342d49d92 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 19:19:15 +0200 Subject: [PATCH 17/39] Move forests tab to the end --- src/openrct2-ui/windows/MapGen.cpp | 64 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 4d3dce0546..a986616fc5 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -31,9 +31,9 @@ namespace OpenRCT2::Ui::Windows enum { WINDOW_MAPGEN_PAGE_BASE, - WINDOW_MAPGEN_PAGE_RANDOM, WINDOW_MAPGEN_PAGE_TERRAIN, WINDOW_MAPGEN_PAGE_WATER, + WINDOW_MAPGEN_PAGE_FORESTS, WINDOW_MAPGEN_PAGE_COUNT }; @@ -77,7 +77,7 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_STRENGTH_UP, WIDX_HEIGHTMAP_STRENGTH_DOWN, - WIDX_RANDOM_PLACE_TREES = TAB_BEGIN, + WIDX_FORESTS_PLACE_TREES = TAB_BEGIN, WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, @@ -134,12 +134,6 @@ namespace OpenRCT2::Ui::Windows kWidgetsEnd, }; - static Widget RandomWidgets[] = { - SHARED_WIDGETS, - MakeWidget({ 4, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), - kWidgetsEnd, - }; - static Widget TerrainWidgets[] = { SHARED_WIDGETS, MakeSpinnerWidgets({179, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets @@ -159,11 +153,17 @@ namespace OpenRCT2::Ui::Windows kWidgetsEnd, }; + static Widget ForestsWidgets[] = { + SHARED_WIDGETS, + MakeWidget({ 4, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), + kWidgetsEnd, + }; + static Widget* PageWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { BaseWidgets, - RandomWidgets, TerrainWidgets, WaterWidgets, + ForestsWidgets, }; // clang-format on @@ -198,8 +198,6 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN), - 0, - (1uLL << WIDX_BASE_HEIGHT_UP) | (1uLL << WIDX_BASE_HEIGHT_DOWN) | (1uLL << WIDX_HEIGHTMAP_LOW_UP) | @@ -209,13 +207,15 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_WATER_LEVEL_UP) | (1uLL << WIDX_WATER_LEVEL_DOWN), + + 0, }; static uint64_t PressedWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { - 0, 0, (1uLL << WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES), 0, + 0, }; // clang-format on @@ -236,7 +236,7 @@ namespace OpenRCT2::Ui::Windows }; static constexpr int32_t TabAnimationLoops[WINDOW_MAPGEN_PAGE_COUNT] = { 16, - 16, + 1, 1, 1, }; @@ -306,11 +306,11 @@ namespace OpenRCT2::Ui::Windows // Enable heightmap widgets if one is loaded if (_settings.algorithm == MapGenAlgorithm::heightmapImage && _heightmapLoaded) { + SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, true); SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _settings.smooth_height_map); SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); - SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); } InitScrollWidgets(); @@ -345,9 +345,9 @@ namespace OpenRCT2::Ui::Windows void DrawTabImages(DrawPixelInfo& dpi) { DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_BASE, SPR_TAB_GEARS_0); - DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_RANDOM, SPR_G2_TAB_TREE); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_TERRAIN, SPR_G2_TAB_LAND); DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_WATER, SPR_TAB_WATER); + DrawTabImage(dpi, WINDOW_MAPGEN_PAGE_FORESTS, SPR_G2_TAB_TREE); } void ChangeMapSize(int32_t sizeOffset) @@ -672,21 +672,21 @@ namespace OpenRCT2::Ui::Windows #pragma endregion -#pragma region Random page +#pragma region Forests page - void RandomMouseUp(WidgetIndex widgetIndex) + void ForestsMouseUp(WidgetIndex widgetIndex) { SharedMouseUp(widgetIndex); switch (widgetIndex) { - case WIDX_RANDOM_PLACE_TREES: + case WIDX_FORESTS_PLACE_TREES: _settings.trees ^= true; break; } } - void RandomUpdate() + void ForestsUpdate() { // Tab animation if (++frame_no >= TabAnimationLoops[page]) @@ -694,22 +694,22 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_2); } - void RandomPrepareDraw() + void ForestsPrepareDraw() { - if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_RANDOM]) + if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_FORESTS]) { - widgets = PageWidgets[WINDOW_MAPGEN_PAGE_RANDOM]; + widgets = PageWidgets[WINDOW_MAPGEN_PAGE_FORESTS]; InitScrollWidgets(); } pressed_widgets = 0; if (_settings.trees) - pressed_widgets |= 1uLL << WIDX_RANDOM_PLACE_TREES; + pressed_widgets |= 1uLL << WIDX_FORESTS_PLACE_TREES; SetPressedTab(); } - void RandomDraw(DrawPixelInfo& dpi) + void ForestsDraw(DrawPixelInfo& dpi) { DrawWidgets(dpi); DrawTabImages(dpi); @@ -1250,8 +1250,8 @@ namespace OpenRCT2::Ui::Windows { case WINDOW_MAPGEN_PAGE_BASE: return BaseMouseUp(widgetIndex); - case WINDOW_MAPGEN_PAGE_RANDOM: - return RandomMouseUp(widgetIndex); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsMouseUp(widgetIndex); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainMouseUp(widgetIndex); case WINDOW_MAPGEN_PAGE_WATER: @@ -1289,8 +1289,8 @@ namespace OpenRCT2::Ui::Windows { case WINDOW_MAPGEN_PAGE_BASE: return BaseUpdate(); - case WINDOW_MAPGEN_PAGE_RANDOM: - return RandomUpdate(); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsUpdate(); case WINDOW_MAPGEN_PAGE_WATER: return WaterUpdate(); } @@ -1305,8 +1305,8 @@ namespace OpenRCT2::Ui::Windows { case WINDOW_MAPGEN_PAGE_BASE: return BasePrepareDraw(); - case WINDOW_MAPGEN_PAGE_RANDOM: - return RandomPrepareDraw(); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsPrepareDraw(); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainPrepareDraw(); case WINDOW_MAPGEN_PAGE_WATER: @@ -1320,8 +1320,8 @@ namespace OpenRCT2::Ui::Windows { case WINDOW_MAPGEN_PAGE_BASE: return BaseDraw(dpi); - case WINDOW_MAPGEN_PAGE_RANDOM: - return RandomDraw(dpi); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsDraw(dpi); case WINDOW_MAPGEN_PAGE_TERRAIN: return TerrainDraw(dpi); case WINDOW_MAPGEN_PAGE_WATER: From a2b572b6f3e6350540183a8d46d7c549e12ade91 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 19:39:21 +0200 Subject: [PATCH 18/39] Apply texture preferences to height map images; blank maps --- src/openrct2-ui/windows/MapGen.cpp | 17 ++--- src/openrct2/world/MapGen.cpp | 111 ++++++++++++++++++----------- 2 files changed, 75 insertions(+), 53 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index a986616fc5..548367e78e 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -402,6 +402,12 @@ namespace OpenRCT2::Ui::Windows void GenerateMap() { MapGenSettings mapgenSettings = _settings; + if (_randomTerrain) + { + mapgenSettings.landTexture = -1; + mapgenSettings.edgeTexture = -1; + } + switch (mapgenSettings.algorithm) { case MapGenAlgorithm::blank: @@ -412,12 +418,6 @@ namespace OpenRCT2::Ui::Windows case MapGenAlgorithm::simplexNoise: mapgenSettings.baseHeight += 2; mapgenSettings.waterLevel += 2; - if (_randomTerrain) - { - mapgenSettings.landTexture = -1; - mapgenSettings.edgeTexture = -1; - } - mapgenSettings.heightmapLow = UtilRand() % 4; mapgenSettings.heightmapHigh = 12 + (UtilRand() % (32 - 12)); mapgenSettings.simplex_base_freq = 1.75f; @@ -427,11 +427,6 @@ namespace OpenRCT2::Ui::Windows case MapGenAlgorithm::simplexCustom: mapgenSettings.waterLevel += kMinimumWaterHeight; mapgenSettings.simplex_base_freq /= 100.00f; - if (_randomTerrain) - { - mapgenSettings.landTexture = -1; - mapgenSettings.edgeTexture = -1; - } break; case MapGenAlgorithm::heightmapImage: diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 7fa2ddcb19..c0e0ba214a 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -152,11 +152,68 @@ static void SetHeight(int32_t x, int32_t y, int32_t height) _height[x + y * _heightSize.x] = height; } +static ObjectEntryIndex MapGenSurfaceTextureId(MapGenSettings* settings) +{ + auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); + + const auto selectedFloor = TerrainSurfaceObject::GetById(settings->landTexture); + std::string_view surfaceTexture = selectedFloor != nullptr ? selectedFloor->GetIdentifier() : ""; + + if (surfaceTexture.empty()) + { + std::vector availableTerrains; + std::copy_if(std::begin(BaseTerrain), std::end(BaseTerrain), std::back_inserter(availableTerrains), [&](auto terrain) { + return objectManager.GetLoadedObject(ObjectEntryDescriptor(terrain)) != nullptr; + }); + + if (availableTerrains.empty()) + // Fall back to the first available surface texture that is available in the park + surfaceTexture = TerrainSurfaceObject::GetById(0)->GetIdentifier(); + else + surfaceTexture = availableTerrains[UtilRand() % availableTerrains.size()]; + } + + auto surfaceTextureId = objectManager.GetLoadedObjectEntryIndex(ObjectEntryDescriptor(surfaceTexture)); + return surfaceTextureId; +} + +static ObjectEntryIndex MapGenEdgeTextureId(MapGenSettings* settings, ObjectEntryIndex surfaceTextureId) +{ + auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); + + const auto selectedEdge = TerrainEdgeObject::GetById(settings->edgeTexture); + std::string_view edgeTexture = selectedEdge != nullptr ? selectedEdge->GetIdentifier() : ""; + + if (edgeTexture.empty()) + { + auto surfaceObject = objectManager.GetLoadedObject(ObjectType::TerrainSurface, surfaceTextureId); + auto surfaceTexture = surfaceObject->GetIdentifier(); + + // Base edge type on surface type + if (surfaceTexture == "rct2.terrain_surface.dirt") + edgeTexture = "rct2.terrain_edge.wood_red"; + else if (surfaceTexture == "rct2.terrain_surface.ice") + edgeTexture = "rct2.terrain_edge.ice"; + else + edgeTexture = "rct2.terrain_edge.rock"; + + // Fall back to the first available edge texture that is available in the park + if (objectManager.GetLoadedObject(ObjectEntryDescriptor(edgeTexture)) == nullptr) + edgeTexture = TerrainEdgeObject::GetById(0)->GetIdentifier(); + } + + auto edgeTextureId = objectManager.GetLoadedObjectEntryIndex(ObjectEntryDescriptor(edgeTexture)); + return edgeTextureId; +} + static void MapGenGenerateBlank(MapGenSettings* settings) { int32_t x, y; MapClearAllElements(); + const auto surfaceTextureId = MapGenSurfaceTextureId(settings); + const auto edgeTextureId = MapGenEdgeTextureId(settings, surfaceTextureId); + MapInit(settings->mapSize); for (y = 1; y < settings->mapSize.y - 1; y++) { @@ -165,8 +222,8 @@ static void MapGenGenerateBlank(MapGenSettings* settings) auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); if (surfaceElement != nullptr) { - surfaceElement->SetSurfaceObjectIndex(settings->landTexture); - surfaceElement->SetEdgeObjectIndex(settings->edgeTexture); + surfaceElement->SetSurfaceObjectIndex(surfaceTextureId); + surfaceElement->SetEdgeObjectIndex(edgeTextureId); surfaceElement->BaseHeight = settings->baseHeight; surfaceElement->ClearanceHeight = settings->baseHeight; } @@ -178,45 +235,8 @@ static void MapGenGenerateBlank(MapGenSettings* settings) static void MapGenGenerateSimplex(MapGenSettings* settings) { - auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); - - const auto selectedFloor = TerrainSurfaceObject::GetById(settings->landTexture); - std::string_view floorTexture = selectedFloor != nullptr ? selectedFloor->GetIdentifier() : ""; - - const auto selectedEdge = TerrainEdgeObject::GetById(settings->edgeTexture); - std::string_view edgeTexture = selectedFloor != nullptr ? selectedEdge->GetIdentifier() : ""; - - if (floorTexture.empty()) - { - std::vector availableTerrains; - std::copy_if(std::begin(BaseTerrain), std::end(BaseTerrain), std::back_inserter(availableTerrains), [&](auto terrain) { - return objectManager.GetLoadedObject(ObjectEntryDescriptor(terrain)) != nullptr; - }); - - if (availableTerrains.empty()) - // Fall back to the first available surface texture that is available in the park - floorTexture = TerrainSurfaceObject::GetById(0)->GetIdentifier(); - else - floorTexture = availableTerrains[UtilRand() % availableTerrains.size()]; - } - - if (edgeTexture.empty()) - { - // Base edge type on surface type - if (floorTexture == "rct2.terrain_surface.dirt") - edgeTexture = "rct2.terrain_edge.wood_red"; - else if (floorTexture == "rct2.terrain_surface.ice") - edgeTexture = "rct2.terrain_edge.ice"; - else - edgeTexture = "rct2.terrain_edge.rock"; - - // Fall back to the first available edge texture that is available in the park - if (objectManager.GetLoadedObject(ObjectEntryDescriptor(edgeTexture)) == nullptr) - edgeTexture = TerrainEdgeObject::GetById(0)->GetIdentifier(); - } - - auto floorTextureId = objectManager.GetLoadedObjectEntryIndex(ObjectEntryDescriptor(floorTexture)); - auto edgeTextureId = objectManager.GetLoadedObjectEntryIndex(ObjectEntryDescriptor(edgeTexture)); + const auto surfaceTextureId = MapGenSurfaceTextureId(settings); + const auto edgeTextureId = MapGenEdgeTextureId(settings); MapClearAllElements(); @@ -230,7 +250,7 @@ static void MapGenGenerateSimplex(MapGenSettings* settings) auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); if (surfaceElement != nullptr) { - surfaceElement->SetSurfaceObjectIndex(floorTextureId); + surfaceElement->SetSurfaceObjectIndex(surfaceTextureId); surfaceElement->SetEdgeObjectIndex(edgeTextureId); surfaceElement->BaseHeight = settings->baseHeight; surfaceElement->ClearanceHeight = settings->baseHeight; @@ -879,6 +899,9 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) Guard::Assert(maxValue > minValue, "Input range is invalid"); Guard::Assert(settings->heightmapHigh > settings->heightmapLow, "Output range is invalid"); + const auto surfaceTextureId = MapGenSurfaceTextureId(settings); + const auto edgeTextureId = MapGenEdgeTextureId(settings, surfaceTextureId); + const uint8_t rangeIn = maxValue - minValue; const uint8_t rangeOut = (settings->heightmapHigh - settings->heightmapLow) * 2; @@ -903,6 +926,10 @@ static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) surfaceElement->BaseHeight *= 2; surfaceElement->ClearanceHeight = surfaceElement->BaseHeight; + // Set textures + surfaceElement->SetSurfaceObjectIndex(surfaceTextureId); + surfaceElement->SetEdgeObjectIndex(edgeTextureId); + // Set water level if (surfaceElement->BaseHeight < settings->waterLevel) { From 6f83e44a821fc0cd8a549228a90ea2e5b55ee160 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 20:10:58 +0200 Subject: [PATCH 19/39] Add custom window captions for each page --- data/language/en-GB.txt | 4 ++++ src/openrct2-ui/UiStringIds.h | 6 +++++- src/openrct2-ui/windows/MapGen.cpp | 15 +++++++-------- src/openrct2-ui/windows/TopToolbar.cpp | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 678a6112e9..36bef2753f 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3754,6 +3754,10 @@ STR_6679 :Flatland STR_6680 :Simplex noise (random) STR_6681 :Simplex noise (custom) STR_6682 :Heightmap file +STR_6683 :Map Generator - Generator +STR_6684 :Map Generator - Terrain +STR_6685 :Map Generator - Water +STR_6686 :Map Generator - Forests ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 5f6add994b..1356d81440 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -907,6 +907,10 @@ namespace OpenRCT2 STR_HEIGHTMAP_SIMPLEX_NOISE = 6680, STR_HEIGHTMAP_SOURCE = 6678, STR_MAPGEN_ACTION_GENERATE = 2694, + STR_MAPGEN_CAPTION_FORESTS = 6686, + STR_MAPGEN_CAPTION_GENERATOR = 6683, + STR_MAPGEN_CAPTION_TERRAIN = 6684, + STR_MAPGEN_CAPTION_WATER = 6685, STR_MAPGEN_NORMALIZE = 6046, STR_MAPGEN_OPTION_PLACE_TREES = 2696, STR_MAPGEN_OPTION_RANDOM_TERRAIN = 2695, @@ -919,7 +923,6 @@ namespace OpenRCT2 STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, STR_MAPGEN_SMOOTH_STRENGTH = 6045, STR_MAPGEN_SMOOTH_TILE = 6047, - STR_MAPGEN_WINDOW_TITLE = 2690, STR_TERRAIN_LABEL = 2693, STR_WATER_LEVEL = 5185, STR_WATER_LEVEL_LABEL = 2692, @@ -2138,6 +2141,7 @@ namespace OpenRCT2 STR_HEIGHT_MARKS_ON_RIDE_TRACKS = 1153, STR_HIGHLIGHT_PATH_ISSUES_MENU = 6219, STR_LOAD_LANDSCAPE = 884, + STR_MAPGEN_MENU_ITEM = 2690, STR_MULTIPLAYER_RECONNECT = 6309, STR_NEW_GAME = 5715, STR_OVERLAY_CLEARANCE_CHECKS_DISABLED = 6374, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 548367e78e..cbd24ffcfd 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -101,12 +101,11 @@ namespace OpenRCT2::Ui::Windows #pragma region Widgets - static constexpr StringId WINDOW_TITLE = STR_MAPGEN_WINDOW_TITLE; static constexpr int32_t WW = 300; static constexpr int32_t WH = 220; -#define SHARED_WIDGETS \ - WINDOW_SHIM(WINDOW_TITLE, WW, WH), /* WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE */ \ +#define SHARED_WIDGETS(PAGE_TITLE) \ + WINDOW_SHIM(PAGE_TITLE, WW, WH), /* WIDX_BACKGROUND, WIDX_TITLE, WIDX_CLOSE */ \ MakeWidget({ 0, 43 }, { WW, 177 }, WindowWidgetType::Resize, WindowColour::Secondary), /* WIDX_PAGE_BACKGROUND */ \ MakeTab({ 3, 17 }), /* WIDX_TAB_1 */ \ MakeTab({ 34, 17 }), /* WIDX_TAB_2 */ \ @@ -116,7 +115,7 @@ namespace OpenRCT2::Ui::Windows // clang-format off static Widget BaseWidgets[] = { - SHARED_WIDGETS, + SHARED_WIDGETS(STR_MAPGEN_CAPTION_GENERATOR), MakeSpinnerWidgets ({165, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_COMMA16 ), // NB: 3 widgets MakeWidget ({216, 52}, { 21, 12}, WindowWidgetType::FlatBtn, WindowColour::Secondary, ImageId(SPR_G2_LINK_CHAIN), STR_MAINTAIN_SQUARE_MAP_TOOLTIP), MakeSpinnerWidgets ({238, 52}, { 50, 12}, WindowWidgetType::Spinner, WindowColour::Secondary, STR_POP16_COMMA16 ), // NB: 3 widgets @@ -135,7 +134,7 @@ namespace OpenRCT2::Ui::Windows }; static Widget TerrainWidgets[] = { - SHARED_WIDGETS, + SHARED_WIDGETS(STR_MAPGEN_CAPTION_TERRAIN), MakeSpinnerWidgets({179, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets MakeWidget ({179, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), MakeWidget ({179, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), @@ -147,15 +146,15 @@ namespace OpenRCT2::Ui::Windows }; static Widget WaterWidgets[] = { - SHARED_WIDGETS, + SHARED_WIDGETS(STR_MAPGEN_CAPTION_WATER), MakeSpinnerWidgets({179, 52}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets MakeWidget ({ 10, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_BEACHES_WATER_BODIES), kWidgetsEnd, }; static Widget ForestsWidgets[] = { - SHARED_WIDGETS, - MakeWidget({ 4, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), + SHARED_WIDGETS(STR_MAPGEN_CAPTION_FORESTS), + MakeWidget({ 10, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), kWidgetsEnd, }; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index f33e30de8c..82b170f2e5 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1173,7 +1173,7 @@ namespace OpenRCT2::Ui::Windows gDropdownItems[i++].Format = STR_EXTRA_VIEWPORT; if ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && GetGameState().EditorStep == EditorStep::LandscapeEditor) { - gDropdownItems[i++].Format = STR_MAPGEN_WINDOW_TITLE; + gDropdownItems[i++].Format = STR_MAPGEN_MENU_ITEM; } #ifdef ENABLE_SCRIPTING From df5dcfce48516f78c039d1012f6e04e39952980f Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 20:45:38 +0200 Subject: [PATCH 20/39] Add settings for number of trees, min/max tree altitude --- data/language/en-GB.txt | 4 ++ src/openrct2-ui/UiStringIds.h | 4 ++ src/openrct2-ui/windows/MapGen.cpp | 101 +++++++++++++++++++++++++++-- src/openrct2/world/MapGen.cpp | 18 ++--- src/openrct2/world/MapGen.h | 3 + 5 files changed, 118 insertions(+), 12 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 36bef2753f..8454248cbc 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3758,6 +3758,10 @@ STR_6683 :Map Generator - Generator STR_6684 :Map Generator - Terrain STR_6685 :Map Generator - Water STR_6686 :Map Generator - Forests +STR_6687 :Tree to land ratio: +STR_6688 :Min. tree altitude: +STR_6689 :Max. tree altitude: +STR_6690 :{UINT16}% ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 1356d81440..27a76ab70e 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -923,6 +923,10 @@ namespace OpenRCT2 STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, STR_MAPGEN_SMOOTH_STRENGTH = 6045, STR_MAPGEN_SMOOTH_TILE = 6047, + STR_MAPGEN_TREE_MAX_ALTITUDE = 6689, + STR_MAPGEN_TREE_MIN_ALTITUDE = 6688, + STR_MAPGEN_TREE_TO_LAND_RATIO = 6687, + STR_MAPGEN_TREE_TO_LAND_RATIO_PCT = 6690, STR_TERRAIN_LABEL = 2693, STR_WATER_LEVEL = 5185, STR_WATER_LEVEL_LABEL = 2692, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index cbd24ffcfd..691dae889c 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -77,8 +77,6 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_STRENGTH_UP, WIDX_HEIGHTMAP_STRENGTH_DOWN, - WIDX_FORESTS_PLACE_TREES = TAB_BEGIN, - WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, WIDX_BASE_HEIGHT_DOWN, @@ -97,6 +95,17 @@ namespace OpenRCT2::Ui::Windows WIDX_WATER_LEVEL_UP, WIDX_WATER_LEVEL_DOWN, WIDX_ADD_BEACHES, + + WIDX_FORESTS_PLACE_TREES = TAB_BEGIN, + WIDX_TREE_LAND_RATIO, + WIDX_TREE_LAND_RATIO_UP, + WIDX_TREE_LAND_RATIO_DOWN, + WIDX_TREE_ALTITUDE_MIN, + WIDX_TREE_ALTITUDE_MIN_UP, + WIDX_TREE_ALTITUDE_MIN_DOWN, + WIDX_TREE_ALTITUDE_MAX, + WIDX_TREE_ALTITUDE_MAX_UP, + WIDX_TREE_ALTITUDE_MAX_DOWN, }; #pragma region Widgets @@ -154,7 +163,10 @@ namespace OpenRCT2::Ui::Windows static Widget ForestsWidgets[] = { SHARED_WIDGETS(STR_MAPGEN_CAPTION_FORESTS), - MakeWidget({ 10, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES ), + MakeWidget ({ 10, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES), + MakeSpinnerWidgets({179, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_LAND_RATIO{,_UP,_DOWN} + MakeSpinnerWidgets({179, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_ALTITUDE_MIN{,_UP,_DOWN} + MakeSpinnerWidgets({179, 106}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_ALTITUDE_MAX{,_UP,_DOWN} kWidgetsEnd, }; @@ -207,7 +219,12 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_WATER_LEVEL_UP) | (1uLL << WIDX_WATER_LEVEL_DOWN), - 0, + (1uLL << WIDX_TREE_LAND_RATIO_UP) | + (1uLL << WIDX_TREE_LAND_RATIO_DOWN) | + (1uLL << WIDX_TREE_ALTITUDE_MIN_UP) | + (1uLL << WIDX_TREE_ALTITUDE_MIN_DOWN) | + (1uLL << WIDX_TREE_ALTITUDE_MAX_UP) | + (1uLL << WIDX_TREE_ALTITUDE_MAX_DOWN), }; static uint64_t PressedWidgets[WINDOW_MAPGEN_PAGE_COUNT] = { @@ -276,6 +293,9 @@ namespace OpenRCT2::Ui::Windows // Features (e.g. tree, rivers, lakes etc.) .trees = true, + .treeToLandRatio = 25, + .minTreeAltitude = 10, + .maxTreeAltitude = 50, .beaches = true, // Simplex Noise Parameters @@ -680,6 +700,39 @@ namespace OpenRCT2::Ui::Windows } } + void ForestsMouseDown(WidgetIndex widgetIndex, Widget* widget) + { + switch (widgetIndex) + { + case WIDX_TREE_LAND_RATIO_UP: + _settings.treeToLandRatio = std::min(_settings.treeToLandRatio + 1, 50); + InvalidateWidget(WIDX_TREE_LAND_RATIO); + break; + case WIDX_TREE_LAND_RATIO_DOWN: + _settings.treeToLandRatio = std::max(_settings.treeToLandRatio - 1, 10); + InvalidateWidget(WIDX_TREE_LAND_RATIO); + break; + case WIDX_TREE_ALTITUDE_MIN_UP: + _settings.minTreeAltitude = std::min(_settings.minTreeAltitude + 1, kMaximumLandHeight / 2 - 1); + _settings.maxTreeAltitude = std::max(_settings.maxTreeAltitude, _settings.minTreeAltitude + 1); + InvalidateWidget(WIDX_TREE_ALTITUDE_MIN); + break; + case WIDX_TREE_ALTITUDE_MIN_DOWN: + _settings.minTreeAltitude = std::max(_settings.minTreeAltitude - 1, 2); + InvalidateWidget(WIDX_TREE_ALTITUDE_MIN); + break; + case WIDX_TREE_ALTITUDE_MAX_UP: + _settings.maxTreeAltitude = std::min(_settings.maxTreeAltitude + 1, kMaximumLandHeight - 1); + InvalidateWidget(WIDX_TREE_ALTITUDE_MAX); + break; + case WIDX_TREE_ALTITUDE_MAX_DOWN: + _settings.maxTreeAltitude = std::max(_settings.maxTreeAltitude - 1, 2 + 1); + _settings.minTreeAltitude = std::min(_settings.minTreeAltitude, _settings.maxTreeAltitude - 1); + InvalidateWidget(WIDX_TREE_ALTITUDE_MAX); + break; + } + } + void ForestsUpdate() { // Tab animation @@ -707,6 +760,44 @@ namespace OpenRCT2::Ui::Windows { DrawWidgets(dpi); DrawTabImages(dpi); + + const auto textColour = colours[1]; + + // Tree to land ratio, label and value + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_TREE_LAND_RATIO].top + 1 }, STR_MAPGEN_TREE_TO_LAND_RATIO, {}, + { textColour }); + + auto ft = Formatter(); + ft.Add(_settings.treeToLandRatio); + DrawTextBasic( + dpi, + windowPos + ScreenCoordsXY{ widgets[WIDX_TREE_LAND_RATIO].left + 1, widgets[WIDX_TREE_LAND_RATIO].top + 1 }, + STR_MAPGEN_TREE_TO_LAND_RATIO_PCT, ft, { textColour }); + + // Minimum tree altitude, label and value + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_TREE_ALTITUDE_MIN].top + 1 }, STR_MAPGEN_TREE_MIN_ALTITUDE, + {}, { textColour }); + + ft = Formatter(); + ft.Add(_settings.minTreeAltitude); + DrawTextBasic( + dpi, + windowPos + ScreenCoordsXY{ widgets[WIDX_TREE_ALTITUDE_MIN].left + 1, widgets[WIDX_TREE_ALTITUDE_MIN].top + 1 }, + STR_COMMA16, ft, { textColour }); + + // Maximum tree altitude, label and value + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_TREE_ALTITUDE_MAX].top + 1 }, STR_MAPGEN_TREE_MAX_ALTITUDE, + {}, { textColour }); + + ft = Formatter(); + ft.Add(_settings.maxTreeAltitude); + DrawTextBasic( + dpi, + windowPos + ScreenCoordsXY{ widgets[WIDX_TREE_ALTITUDE_MAX].left + 1, widgets[WIDX_TREE_ALTITUDE_MAX].top + 1 }, + STR_COMMA16, ft, { textColour }); } #pragma endregion @@ -1263,6 +1354,8 @@ namespace OpenRCT2::Ui::Windows return TerrainMouseDown(widgetIndex, &widgets[widgetIndex]); case WINDOW_MAPGEN_PAGE_WATER: return WaterMouseDown(widgetIndex, &widgets[widgetIndex]); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsMouseDown(widgetIndex, &widgets[widgetIndex]); } } diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index c0e0ba214a..f169e36cb3 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -97,7 +97,7 @@ static void MapGenGenerateBlank(MapGenSettings* settings); static void MapGenGenerateSimplex(MapGenSettings* settings); static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); -static void MapGenPlaceTrees(); +static void MapGenPlaceTrees(MapGenSettings* settings); static void MapGenAddBeaches(MapGenSettings* settings); void MapGenGenerate(MapGenSettings* settings) @@ -125,7 +125,7 @@ void MapGenGenerate(MapGenSettings* settings) // Place trees? if (settings->trees) - MapGenPlaceTrees(); + MapGenPlaceTrees(settings); } static void MapGenSetWaterLevel(int32_t waterLevel); @@ -365,7 +365,7 @@ template static bool TryFindTreeInList(std::string_view id, const T& /** * Randomly places a selection of preset trees on the map. Picks the right tree for the terrain it is placing it on. */ -static void MapGenPlaceTrees() +static void MapGenPlaceTrees(MapGenSettings* settings) { std::vector grassTreeIds; std::vector desertTreeIds; @@ -394,16 +394,14 @@ static void MapGenPlaceTrees() } // Place trees - CoordsXY pos; - float treeToLandRatio = (10 + (UtilRand() % 30)) / 100.0f; + float treeToLandRatio = static_cast(settings->treeToLandRatio) / 100.0f; + auto& gameState = GetGameState(); for (int32_t y = 1; y < gameState.MapSize.y - 1; y++) { for (int32_t x = 1; x < gameState.MapSize.x - 1; x++) { - pos.x = x * kCoordsXYStep; - pos.y = y * kCoordsXYStep; - + auto pos = CoordsXY{ x, y } * kCoordsXYStep; auto* surfaceElement = MapGetSurfaceElementAt(pos); if (surfaceElement == nullptr) continue; @@ -412,6 +410,10 @@ static void MapGenPlaceTrees() if (surfaceElement->GetWaterHeight() > 0) continue; + if (settings->minTreeAltitude > surfaceElement->BaseHeight + || settings->maxTreeAltitude < surfaceElement->BaseHeight) + continue; + // On sand surfaces, give the tile a score based on nearby water, to be used to determine whether to spawn // vegetation float oasisScore = 0.0f; diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 7ead7c318f..a20bdc6aa1 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -35,6 +35,9 @@ struct MapGenSettings // Features (e.g. tree, rivers, lakes etc.) bool trees; + int32_t treeToLandRatio; + int32_t minTreeAltitude; + int32_t maxTreeAltitude; bool beaches; // Simplex Noise Parameters From e10e5548728671e37b6c834e0761ed3f1690afe6 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 20:57:03 +0200 Subject: [PATCH 21/39] Change icons for terrain tab and forests tab --- resources/g2/icons/map_gen_terrain_tab.png | Bin 0 -> 1024 bytes resources/g2/sprites.json | 5 +++++ src/openrct2-ui/windows/MapGen.cpp | 4 ++-- src/openrct2/sprites.h | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 resources/g2/icons/map_gen_terrain_tab.png diff --git a/resources/g2/icons/map_gen_terrain_tab.png b/resources/g2/icons/map_gen_terrain_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4243e9822ef4ecb794829338753e1aca32362e GIT binary patch literal 1024 zcmaJ=@oO7(6n|ThlxE#cBHY|L4;S!;_e0cEu5drxx@&hU8NJ%;$PZDY95hJ8b313~ z;yBk7f<(DVU_nxe<>n%s8b+Dt7VxBTR*ZPiII?ncEsl;H8UcXOsgo14en0Hzf#D&)ZZ(%W0DCuQPR&jF@_zykhrbA zqlyyOG&P&e7K`O-)vni@p4aR5nF#P4NYP+C9!jOibS9F^bH$QWsU~WU)^PLfjw#TA z7#CEdxE>=7g(_>zYF2QHu|`$()^lCY9Q5iU0SOw?JQ#AIq6VBi)~ba14FYu|sGmT) z214~PfCP{T1XK*u3BsT#ljBw;X+4>2>H7V0895HYgu*-?kw`8+O61JBlSt25aIhl?sY+M!8oRljk%C>5|dfh9y-Aa4lU_69mz>`2`fHDGX85gTm z+~HL>mTzlj�qSi4G|&krwHEjH@U@O_SZM(kf~lE8BC51J^>GIu>FnI>xX`UP#Mw zUQtTvbTyxM%4OHK+s$UL*F!+4KotW_1rut7+@Opl02+V+U;(THbOL~UNCL`e$TE@Fk|`-X0ak3ESm zU&w6#fNei=?#_eR>!TYZ&tH44v>{IYEAKehPU_$O6eB+tS>dg}A1n+uFYWWb+5YEU z{L3OqEFC=Y)xzb&ul)A@r;7{pjqrCzuWtN&(Hqu=RyJ>)TR#8duWu61-2DCsvGmci z^XZ++7pIgoBrZ!h0lS^4G6*us&| z)>5N; Date: Tue, 10 Sep 2024 21:35:46 +0200 Subject: [PATCH 22/39] Deduplicate some code shared between blank and simplex generators --- src/openrct2-ui/windows/MapGen.cpp | 8 +++---- src/openrct2/world/MapGen.cpp | 37 ++++++++---------------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 1469c1264a..b675aa23b4 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -430,13 +430,13 @@ namespace OpenRCT2::Ui::Windows switch (mapgenSettings.algorithm) { case MapGenAlgorithm::blank: - mapgenSettings.baseHeight += 2; - mapgenSettings.waterLevel += 2; + mapgenSettings.baseHeight += kMinimumLandHeight; + mapgenSettings.waterLevel += kMinimumWaterHeight; break; case MapGenAlgorithm::simplexNoise: - mapgenSettings.baseHeight += 2; - mapgenSettings.waterLevel += 2; + mapgenSettings.baseHeight += kMinimumLandHeight; + mapgenSettings.waterLevel += kMinimumWaterHeight; mapgenSettings.heightmapLow = UtilRand() % 4; mapgenSettings.heightmapHigh = 12 + (UtilRand() % (32 - 12)); mapgenSettings.simplex_base_freq = 1.75f; diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index f169e36cb3..516b5e81a9 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -206,18 +206,17 @@ static ObjectEntryIndex MapGenEdgeTextureId(MapGenSettings* settings, ObjectEntr return edgeTextureId; } -static void MapGenGenerateBlank(MapGenSettings* settings) +static void MapGenResetSurfaces(MapGenSettings* settings) { - int32_t x, y; MapClearAllElements(); + MapInit(settings->mapSize); const auto surfaceTextureId = MapGenSurfaceTextureId(settings); const auto edgeTextureId = MapGenEdgeTextureId(settings, surfaceTextureId); - MapInit(settings->mapSize); - for (y = 1; y < settings->mapSize.y - 1; y++) + for (auto y = 1; y < settings->mapSize.y - 1; y++) { - for (x = 1; x < settings->mapSize.x - 1; x++) + for (auto x = 1; x < settings->mapSize.x - 1; x++) { auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); if (surfaceElement != nullptr) @@ -229,36 +228,20 @@ static void MapGenGenerateBlank(MapGenSettings* settings) } } } +} +static void MapGenGenerateBlank(MapGenSettings* settings) +{ + MapGenResetSurfaces(settings); MapGenSetWaterLevel(settings->waterLevel); } static void MapGenGenerateSimplex(MapGenSettings* settings) { - const auto surfaceTextureId = MapGenSurfaceTextureId(settings); - const auto edgeTextureId = MapGenEdgeTextureId(settings); - - MapClearAllElements(); - - // Initialise the base map - const auto& mapSize = settings->mapSize; - MapInit(mapSize); - for (auto y = 1; y < mapSize.y - 1; y++) - { - for (auto x = 1; x < mapSize.x - 1; x++) - { - auto surfaceElement = MapGetSurfaceElementAt(TileCoordsXY{ x, y }); - if (surfaceElement != nullptr) - { - surfaceElement->SetSurfaceObjectIndex(surfaceTextureId); - surfaceElement->SetEdgeObjectIndex(edgeTextureId); - surfaceElement->BaseHeight = settings->baseHeight; - surfaceElement->ClearanceHeight = settings->baseHeight; - } - } - } + MapGenResetSurfaces(settings); // Create the temporary height map and initialise + auto& mapSize = settings->mapSize; _heightSize = { mapSize.x * 2, mapSize.y * 2 }; _height = new uint8_t[_heightSize.y * _heightSize.x]; std::fill_n(_height, _heightSize.y * _heightSize.x, 0x00); From 1ad9bc47863969d0df0024090a2766a56c841b1f Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 22:09:49 +0200 Subject: [PATCH 23/39] Change terrain widget order once more --- src/openrct2-ui/windows/MapGen.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index b675aa23b4..42f6a10a3b 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -80,15 +80,15 @@ namespace OpenRCT2::Ui::Windows WIDX_BASE_HEIGHT = TAB_BEGIN, WIDX_BASE_HEIGHT_UP, WIDX_BASE_HEIGHT_DOWN, - WIDX_RANDOM_TERRAIN, - WIDX_FLOOR_TEXTURE, - WIDX_WALL_TEXTURE, WIDX_HEIGHTMAP_LOW, WIDX_HEIGHTMAP_LOW_UP, WIDX_HEIGHTMAP_LOW_DOWN, WIDX_HEIGHTMAP_HIGH, WIDX_HEIGHTMAP_HIGH_UP, WIDX_HEIGHTMAP_HIGH_DOWN, + WIDX_FLOOR_TEXTURE, + WIDX_WALL_TEXTURE, + WIDX_RANDOM_TERRAIN, WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, WIDX_WATER_LEVEL = TAB_BEGIN, @@ -120,7 +120,7 @@ namespace OpenRCT2::Ui::Windows MakeTab({ 34, 17 }), /* WIDX_TAB_2 */ \ MakeTab({ 65, 17 }), /* WIDX_TAB_3 */ \ MakeTab({ 96, 17 }), /* WIDX_TAB_4 */ \ - MakeWidget({ 204, 200 }, { 90, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE) + MakeWidget({ 185, 200 }, { 109, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_ACTION_GENERATE) // clang-format off static Widget BaseWidgets[] = { @@ -144,19 +144,19 @@ namespace OpenRCT2::Ui::Windows static Widget TerrainWidgets[] = { SHARED_WIDGETS(STR_MAPGEN_CAPTION_TERRAIN), - MakeSpinnerWidgets({179, 52}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets - MakeWidget ({179, 70}, {95, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), - MakeWidget ({179, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), - MakeWidget ({236, 82}, {47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), - MakeSpinnerWidgets({179, 124}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({179, 142}, {95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} - MakeWidget ({179, 160}, {145, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES + MakeSpinnerWidgets({179, 52}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeSpinnerWidgets({179, 70}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({179, 88}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} + MakeWidget ({179, 106}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), + MakeWidget ({236, 106}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), + MakeWidget ({ 10, 124}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), + MakeWidget ({ 10, 142}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES kWidgetsEnd, }; static Widget WaterWidgets[] = { SHARED_WIDGETS(STR_MAPGEN_CAPTION_WATER), - MakeSpinnerWidgets({179, 52}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets + MakeSpinnerWidgets({179, 52}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets MakeWidget ({ 10, 70}, {195, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_BEACHES_WATER_BODIES), kWidgetsEnd, }; @@ -164,9 +164,9 @@ namespace OpenRCT2::Ui::Windows static Widget ForestsWidgets[] = { SHARED_WIDGETS(STR_MAPGEN_CAPTION_FORESTS), MakeWidget ({ 10, 52}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_PLACE_TREES), - MakeSpinnerWidgets({179, 70}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_LAND_RATIO{,_UP,_DOWN} - MakeSpinnerWidgets({179, 88}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_ALTITUDE_MIN{,_UP,_DOWN} - MakeSpinnerWidgets({179, 106}, { 95, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_ALTITUDE_MAX{,_UP,_DOWN} + MakeSpinnerWidgets({179, 70}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_LAND_RATIO{,_UP,_DOWN} + MakeSpinnerWidgets({179, 88}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_ALTITUDE_MIN{,_UP,_DOWN} + MakeSpinnerWidgets({179, 106}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary), // WIDX_TREE_ALTITUDE_MAX{,_UP,_DOWN} kWidgetsEnd, }; From 56ef87cb541a7b847e96bec10a6f313cef96762f Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 22:19:15 +0200 Subject: [PATCH 24/39] Remove terrain height setting map from GenerateMap --- src/openrct2-ui/windows/MapGen.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 42f6a10a3b..16bfa88b75 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -430,13 +430,9 @@ namespace OpenRCT2::Ui::Windows switch (mapgenSettings.algorithm) { case MapGenAlgorithm::blank: - mapgenSettings.baseHeight += kMinimumLandHeight; - mapgenSettings.waterLevel += kMinimumWaterHeight; break; case MapGenAlgorithm::simplexNoise: - mapgenSettings.baseHeight += kMinimumLandHeight; - mapgenSettings.waterLevel += kMinimumWaterHeight; mapgenSettings.heightmapLow = UtilRand() % 4; mapgenSettings.heightmapHigh = 12 + (UtilRand() % (32 - 12)); mapgenSettings.simplex_base_freq = 1.75f; @@ -444,7 +440,6 @@ namespace OpenRCT2::Ui::Windows break; case MapGenAlgorithm::simplexCustom: - mapgenSettings.waterLevel += kMinimumWaterHeight; mapgenSettings.simplex_base_freq /= 100.00f; break; From cd5e55a1ba06cfc9eb7a9d3ea2a968b002be6883 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 22:24:12 +0200 Subject: [PATCH 25/39] Replace custom constants with map constants --- src/openrct2-ui/windows/MapGen.cpp | 32 ++++++++++++------------------ 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 16bfa88b75..61705497b5 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -258,12 +258,6 @@ namespace OpenRCT2::Ui::Windows }; // clang-format on - constexpr int32_t BASESIZE_MIN = 0; - constexpr int32_t BASESIZE_MAX = 60; - constexpr int32_t WATERLEVEL_MIN = 0; - constexpr int32_t WATERLEVEL_MAX = 54; - constexpr int32_t MAX_SMOOTH_ITERATIONS = 20; - enum class ResizeDirection { Both, @@ -860,7 +854,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_HEIGHTMAP_STRENGTH_UP: - _settings.smooth_strength = std::min(_settings.smooth_strength + 1, MAX_SMOOTH_ITERATIONS); + _settings.smooth_strength = std::min(_settings.smooth_strength + 1, 20); InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; case WIDX_HEIGHTMAP_STRENGTH_DOWN: @@ -939,8 +933,8 @@ namespace OpenRCT2::Ui::Windows case WIDX_BASE_HEIGHT: { Formatter ft; - ft.Add((BASESIZE_MIN - 12) / 2); - ft.Add((BASESIZE_MAX - 12) / 2); + ft.Add((kMinimumLandHeight - 12) / 2); + ft.Add((kMaximumLandHeight - 12) / 2); WindowTextInputOpen( this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, (_settings.baseHeight - 12) / 2, 3); @@ -959,11 +953,11 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BASE_HEIGHT_UP: - _settings.baseHeight = std::min(_settings.baseHeight + 2, BASESIZE_MAX); + _settings.baseHeight = std::min(_settings.baseHeight + 2, kMaximumLandHeight); Invalidate(); break; case WIDX_BASE_HEIGHT_DOWN: - _settings.baseHeight = std::max(_settings.baseHeight - 2, BASESIZE_MIN); + _settings.baseHeight = std::max(_settings.baseHeight - 2, kMinimumLandHeight); Invalidate(); break; case WIDX_RANDOM_TERRAIN: @@ -982,7 +976,7 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_LOW_DOWN: - _settings.heightmapLow = std::max(_settings.heightmapLow - 1, 2); + _settings.heightmapLow = std::max(_settings.heightmapLow - 1, kMinimumLandHeight); InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_HIGH_UP: @@ -990,7 +984,7 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; case WIDX_HEIGHTMAP_HIGH_DOWN: - _settings.heightmapHigh = std::max(_settings.heightmapHigh - 1, 2 + 1); + _settings.heightmapHigh = std::max(_settings.heightmapHigh - 1, kMinimumLandHeight + 1); _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh - 1); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; @@ -1021,7 +1015,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_BASE_HEIGHT: - _settings.baseHeight = std::clamp((value * 2) + 12, BASESIZE_MIN, BASESIZE_MAX); + _settings.baseHeight = std::clamp((value * 2) + 12, kMinimumLandHeight, kMaximumLandHeight); break; } @@ -1206,8 +1200,8 @@ namespace OpenRCT2::Ui::Windows case WIDX_WATER_LEVEL: { Formatter ft; - ft.Add((WATERLEVEL_MIN - 12) / 2); - ft.Add((WATERLEVEL_MAX - 12) / 2); + ft.Add((kMinimumWaterHeight - 12) / 2); + ft.Add((kMaximumWaterHeight - 12) / 2); WindowTextInputOpen( this, WIDX_WATER_LEVEL, STR_WATER_LEVEL, STR_ENTER_WATER_LEVEL, ft, STR_FORMAT_INTEGER, (_settings.waterLevel - 12) / 2, 3); @@ -1228,11 +1222,11 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_WATER_LEVEL_UP: - _settings.waterLevel = std::min(_settings.waterLevel + 2, WATERLEVEL_MAX); + _settings.waterLevel = std::min(_settings.waterLevel + 2, kMaximumWaterHeight); Invalidate(); break; case WIDX_WATER_LEVEL_DOWN: - _settings.waterLevel = std::max(_settings.waterLevel - 2, WATERLEVEL_MIN); + _settings.waterLevel = std::max(_settings.waterLevel - 2, kMinimumWaterHeight); Invalidate(); break; } @@ -1262,7 +1256,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { case WIDX_WATER_LEVEL: - _settings.waterLevel = std::clamp((value * 2) + 12, WATERLEVEL_MIN, WATERLEVEL_MAX); + _settings.waterLevel = std::clamp((value * 2) + 12, kMinimumWaterHeight, kMaximumWaterHeight); break; } From fcbe1aaf92a8b45186f9af52aa931511a34a4e51 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 11 Sep 2024 17:08:20 +0200 Subject: [PATCH 26/39] Display height units in preferred length measurement unit --- src/openrct2-ui/windows/MapGen.cpp | 71 +++++++++++++++++++----------- src/openrct2/util/Util.cpp | 15 +++++++ src/openrct2/util/Util.h | 3 ++ 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 61705497b5..99353989c9 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -770,11 +771,11 @@ namespace OpenRCT2::Ui::Windows {}, { textColour }); ft = Formatter(); - ft.Add(_settings.minTreeAltitude); + ft.Add(BaseZToMetres(_settings.minTreeAltitude)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_TREE_ALTITUDE_MIN].left + 1, widgets[WIDX_TREE_ALTITUDE_MIN].top + 1 }, - STR_COMMA16, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { textColour }); // Maximum tree altitude, label and value DrawTextBasic( @@ -782,11 +783,11 @@ namespace OpenRCT2::Ui::Windows {}, { textColour }); ft = Formatter(); - ft.Add(_settings.maxTreeAltitude); + ft.Add(BaseZToMetres(_settings.maxTreeAltitude)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_TREE_ALTITUDE_MAX].left + 1, widgets[WIDX_TREE_ALTITUDE_MAX].top + 1 }, - STR_COMMA16, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { textColour }); } #pragma endregion @@ -933,11 +934,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_BASE_HEIGHT: { Formatter ft; - ft.Add((kMinimumLandHeight - 12) / 2); - ft.Add((kMaximumLandHeight - 12) / 2); + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); WindowTextInputOpen( this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, - (_settings.baseHeight - 12) / 2, 3); + BaseZToMetres(_settings.baseHeight), 6); break; } case WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES: @@ -1001,21 +1002,30 @@ namespace OpenRCT2::Ui::Windows void TerrainTextInput(WidgetIndex widgetIndex, std::string_view text) { - int32_t value; - char* end; - const auto strText = u8string(text); - value = strtol(strText.c_str(), &end, 10); - + char* end; + int32_t value = strtol(strText.c_str(), &end, 10); if (*end != '\0') { return; } + switch (Config::Get().general.MeasurementFormat) + { + case MeasurementFormat::Imperial: + value = FeetToMetres(value); + [[fallthrough]]; + + default: + value = std::clamp(MetresToBaseZ(value), kMinimumLandHeight, kMaximumLandHeight); + break; + } + switch (widgetIndex) { case WIDX_BASE_HEIGHT: - _settings.baseHeight = std::clamp((value * 2) + 12, kMinimumLandHeight, kMaximumLandHeight); + _settings.baseHeight = value; + break; break; } @@ -1154,10 +1164,10 @@ namespace OpenRCT2::Ui::Windows { textColour }); auto ft = Formatter(); - ft.Add((_settings.baseHeight - 12) / 2); + ft.Add(BaseZToMetres(_settings.baseHeight)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, - STR_COMMA16, ft, { colours[1] }); + STR_RIDE_LENGTH_ENTRY, ft, { colours[1] }); // Floor texture label DrawTextBasic( @@ -1170,10 +1180,10 @@ namespace OpenRCT2::Ui::Windows { textColour }); ft = Formatter(); - ft.Add(_settings.heightmapLow); + ft.Add(BaseZToMetres(_settings.heightmapLow)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_LOW].left + 1, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, - STR_COMMA16, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { textColour }); // Maximum land height label and value DrawTextBasic( @@ -1181,10 +1191,10 @@ namespace OpenRCT2::Ui::Windows { textColour }); ft = Formatter(); - ft.Add(_settings.heightmapHigh); + ft.Add(BaseZToMetres(_settings.heightmapHigh)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_HIGH].left + 1, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, - STR_COMMA16, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { textColour }); } #pragma endregion @@ -1200,11 +1210,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_WATER_LEVEL: { Formatter ft; - ft.Add((kMinimumWaterHeight - 12) / 2); - ft.Add((kMaximumWaterHeight - 12) / 2); + ft.Add(kMinimumWaterHeight); + ft.Add(kMaximumWaterHeight); WindowTextInputOpen( this, WIDX_WATER_LEVEL, STR_WATER_LEVEL, STR_ENTER_WATER_LEVEL, ft, STR_FORMAT_INTEGER, - (_settings.waterLevel - 12) / 2, 3); + _settings.waterLevel, 6); break; } @@ -1253,10 +1263,21 @@ namespace OpenRCT2::Ui::Windows return; } + switch (Config::Get().general.MeasurementFormat) + { + case MeasurementFormat::Imperial: + value = FeetToMetres(value); + [[fallthrough]]; + + default: + value = std::clamp(MetresToBaseZ(value), kMinimumWaterHeight, kMaximumWaterHeight); + break; + } + switch (widgetIndex) { case WIDX_WATER_LEVEL: - _settings.waterLevel = std::clamp((value * 2) + 12, kMinimumWaterHeight, kMaximumWaterHeight); + _settings.waterLevel = value; break; } @@ -1288,10 +1309,10 @@ namespace OpenRCT2::Ui::Windows { textColour }); auto ft = Formatter(); - ft.Add((_settings.waterLevel - 12) / 2); + ft.Add(BaseZToMetres(_settings.waterLevel)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_WATER_LEVEL].left + 1, widgets[WIDX_WATER_LEVEL].top + 1 }, - STR_COMMA16, ft, { colours[1] }); + STR_RIDE_LENGTH_ENTRY, ft, { colours[1] }); } #pragma endregion diff --git a/src/openrct2/util/Util.cpp b/src/openrct2/util/Util.cpp index 3e1e8dd4da..fcaf6703a1 100644 --- a/src/openrct2/util/Util.cpp +++ b/src/openrct2/util/Util.cpp @@ -39,6 +39,11 @@ int32_t MetresToFeet(int32_t metres) return (metres * 840) / 256; } +int32_t FeetToMetres(int32_t feet) +{ + return feet * 256 / 840; +} + int32_t MphToKmph(int32_t mph) { // 1 mph = 1.60934 kmph @@ -52,6 +57,16 @@ int32_t MphToDmps(int32_t mph) return (mph * 73243) >> 14; } +int32_t BaseZToMetres(int16_t baseZ) +{ + return (baseZ / 2 - 7) * 1.5; +} + +uint8_t MetresToBaseZ(int16_t metres) +{ + return ((metres / 1.5) + 7) * 2; +} + /* Case insensitive logical compare */ // Example: // - Guest 10 diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index ec4074c63a..b94e51042d 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -25,8 +25,11 @@ int32_t SquaredMetresToSquaredFeet(int32_t squaredMetres); int32_t MetresToFeet(int32_t metres); +int32_t FeetToMetres(int32_t feet); int32_t MphToKmph(int32_t mph); int32_t MphToDmps(int32_t mph); +int32_t BaseZToMetres(int16_t baseZ); +uint8_t MetresToBaseZ(int16_t metres); inline int32_t UtilBitScanForward(uint32_t source) { From d03fbef0e7aeecccbbe3ce75bc05c1856f44b567 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 11 Sep 2024 17:20:08 +0200 Subject: [PATCH 27/39] Add text input event to remaining numerical fields --- data/language/en-GB.txt | 15 ++ src/openrct2-ui/UiStringIds.h | 21 ++- src/openrct2-ui/windows/MapGen.cpp | 230 +++++++++++++++++++++-------- 3 files changed, 205 insertions(+), 61 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 8454248cbc..57838fda54 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3762,6 +3762,21 @@ STR_6687 :Tree to land ratio: STR_6688 :Min. tree altitude: STR_6689 :Max. tree altitude: STR_6690 :{UINT16}% +STR_6691 :Minimum land height +STR_6692 :Enter min. land height between {COMMA16} and {COMMA16} +STR_6693 :Maximum land height +STR_6694 :Enter max. land height between {COMMA16} and {COMMA16} +STR_6695 :Minimum tree altitude +STR_6696 :Enter min. tree altitude between {COMMA16} and {COMMA16} +STR_6697 :Maximum tree altitude +STR_6698 :Enter max. tree altitude between {COMMA16} and {COMMA16} +STR_6699 :Tree to land ratio +STR_6700 :Enter tree to land ratio between {COMMA16} and {COMMA16} +STR_6701 :Simplex Base Frequency +STR_6702 :Enter Base Frequency between {COMMA2DP32} and {COMMA2DP32} +STR_6703 :Simplex Octaves +STR_6704 :Enter Octaves between {COMMA16} and {COMMA16} +STR_6705 :{COMMA2DP32} ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 27a76ab70e..905768225e 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -36,6 +36,7 @@ namespace OpenRCT2 STR_ENTER_PARK_NAME = 1719, STR_ENTER_SELECTION_SIZE = 5129, STR_ERROR_INVALID_CHARACTERS = 5243, + STR_FORMAT_COMMA2DP32 = 6705, STR_FORMAT_INTEGER = 5182, STR_GRAPH_LABEL = 2222, STR_LIGHTPINK_STRINGID = 5299, @@ -896,10 +897,17 @@ namespace OpenRCT2 STR_SHOW_RIDES_STALLS_ON_MAP_TIP = 3144, // Window: MapGen - STR_BEACHES_WATER_BODIES = 6677, STR_BASE_HEIGHT = 5183, STR_BASE_HEIGHT_LABEL = 2691, + STR_BEACHES_WATER_BODIES = 6677, + STR_ENTER_BASE_FREQUENCY = 6702, STR_ENTER_BASE_HEIGHT = 5184, + STR_ENTER_MAX_LAND = 6694, + STR_ENTER_MAX_TREE_ALTITUDE = 6698, + STR_ENTER_MIN_LAND = 6692, + STR_ENTER_MIN_TREE_ALTITUDE = 6696, + STR_ENTER_OCTAVES = 6704, + STR_ENTER_TREE_TO_LAND_RATIO = 6700, STR_ENTER_WATER_LEVEL = 5186, STR_HEIGHTMAP_FILE = 6682, STR_HEIGHTMAP_FLATLAND = 6679, @@ -911,14 +919,14 @@ namespace OpenRCT2 STR_MAPGEN_CAPTION_GENERATOR = 6683, STR_MAPGEN_CAPTION_TERRAIN = 6684, STR_MAPGEN_CAPTION_WATER = 6685, + STR_MAPGEN_MAX_LAND_HEIGHT = 2687, + STR_MAPGEN_MIN_LAND_HEIGHT = 2686, STR_MAPGEN_NORMALIZE = 6046, STR_MAPGEN_OPTION_PLACE_TREES = 2696, STR_MAPGEN_OPTION_RANDOM_TERRAIN = 2695, STR_MAPGEN_SELECT_HEIGHTMAP = 6043, STR_MAPGEN_SIMPLEX_NOISE = 2685, STR_MAPGEN_SIMPLEX_NOISE_BASE_FREQUENCY = 2688, - STR_MAPGEN_MAX_LAND_HEIGHT = 2687, - STR_MAPGEN_MIN_LAND_HEIGHT = 2686, STR_MAPGEN_SIMPLEX_NOISE_OCTAVES = 2689, STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, STR_MAPGEN_SMOOTH_STRENGTH = 6045, @@ -927,7 +935,14 @@ namespace OpenRCT2 STR_MAPGEN_TREE_MIN_ALTITUDE = 6688, STR_MAPGEN_TREE_TO_LAND_RATIO = 6687, STR_MAPGEN_TREE_TO_LAND_RATIO_PCT = 6690, + STR_MAX_LAND_HEIGHT = 6693, + STR_MAX_TREE_ALTITUDE = 6697, + STR_MIN_LAND_HEIGHT = 6691, + STR_MIN_TREE_ALTITUDE = 6695, + STR_SIMPLEX_BASE_FREQUENCY = 6701, + STR_SIMPLEX_OCTAVES = 6703, STR_TERRAIN_LABEL = 2693, + STR_TREE_TO_LAND_RATIO = 6695, STR_WATER_LEVEL = 5185, STR_WATER_LEVEL_LABEL = 2692, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 99353989c9..e6cdad04ae 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -454,7 +454,9 @@ namespace OpenRCT2::Ui::Windows { SharedMouseUp(widgetIndex); - if (_settings.algorithm == MapGenAlgorithm::heightmapImage) + if (_settings.algorithm == MapGenAlgorithm::simplexNoise) + SimplexMouseUp(widgetIndex); + else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) HeightmapMouseUp(widgetIndex); switch (widgetIndex) @@ -549,18 +551,10 @@ namespace OpenRCT2::Ui::Windows } } - void BaseTextInput(WidgetIndex widgetIndex, std::string_view text) + void BaseTextInput(WidgetIndex widgetIndex, int32_t value) { - int32_t value; - char* end; - - const auto strText = u8string(text); - value = strtol(strText.c_str(), &end, 10); - - if (*end != '\0') - { - return; - } + if (_settings.algorithm == MapGenAlgorithm::simplexNoise) + SimplexTextInput(widgetIndex, value); switch (widgetIndex) { @@ -687,6 +681,39 @@ namespace OpenRCT2::Ui::Windows case WIDX_FORESTS_PLACE_TREES: _settings.trees ^= true; break; + + case WIDX_TREE_LAND_RATIO: + { + Formatter ft; + ft.Add(1); + ft.Add(50); + WindowTextInputOpen( + this, widgetIndex, STR_TREE_TO_LAND_RATIO, STR_ENTER_TREE_TO_LAND_RATIO, ft, STR_FORMAT_INTEGER, + _settings.treeToLandRatio, 2); + break; + } + + case WIDX_TREE_ALTITUDE_MIN: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MIN_TREE_ALTITUDE, STR_ENTER_MIN_TREE_ALTITUDE, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.minTreeAltitude), 6); + break; + } + + case WIDX_TREE_ALTITUDE_MAX: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MAX_TREE_ALTITUDE, STR_ENTER_MAX_TREE_ALTITUDE, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.maxTreeAltitude), 6); + break; + } } } @@ -731,6 +758,28 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_2); } + void ForestsTextInput(WidgetIndex widgetIndex, int32_t rawValue, int32_t value) + { + switch (widgetIndex) + { + case WIDX_TREE_LAND_RATIO: + _settings.treeToLandRatio = std::clamp(rawValue, 1, 50); + break; + + case WIDX_TREE_ALTITUDE_MIN: + _settings.minTreeAltitude = value; + _settings.maxTreeAltitude = std::max(_settings.minTreeAltitude, _settings.maxTreeAltitude); + break; + + case WIDX_TREE_ALTITUDE_MAX: + _settings.maxTreeAltitude = value; + _settings.minTreeAltitude = std::min(_settings.minTreeAltitude, _settings.maxTreeAltitude); + break; + } + + Invalidate(); + } + void ForestsPrepareDraw() { if (widgets != PageWidgets[WINDOW_MAPGEN_PAGE_FORESTS]) @@ -794,6 +843,34 @@ namespace OpenRCT2::Ui::Windows #pragma region Simplex settings, part of generator tab + void SimplexMouseUp(WidgetIndex widgetIndex) + { + switch (widgetIndex) + { + case WIDX_SIMPLEX_BASE_FREQ: + { + Formatter ft; + ft.Add(0); + ft.Add(1000); + WindowTextInputOpen( + this, widgetIndex, STR_SIMPLEX_BASE_FREQUENCY, STR_ENTER_BASE_FREQUENCY, ft, STR_FORMAT_COMMA2DP32, + _settings.simplex_base_freq, 4); + break; + } + + case WIDX_SIMPLEX_OCTAVES: + { + Formatter ft; + ft.Add(1); + ft.Add(10); + WindowTextInputOpen( + this, widgetIndex, STR_SIMPLEX_OCTAVES, STR_ENTER_OCTAVES, ft, STR_FORMAT_INTEGER, + _settings.simplex_octaves, 10); + break; + } + } + } + void SimplexMouseDown(WidgetIndex widgetIndex, Widget* widget) { switch (widgetIndex) @@ -846,6 +923,20 @@ namespace OpenRCT2::Ui::Windows STR_COMMA16, ft, { textColour }); } + void SimplexTextInput(WidgetIndex widgetIndex, int32_t value) + { + switch (widgetIndex) + { + case WIDX_SIMPLEX_BASE_FREQ: + _settings.simplex_base_freq = std::clamp(value, 0, 1000); + break; + + case WIDX_SIMPLEX_OCTAVES: + _settings.simplex_octaves = std::clamp(value, 1, 10); + break; + } + } + #pragma endregion #pragma region Heightmap settings, part of generator tab @@ -941,6 +1032,29 @@ namespace OpenRCT2::Ui::Windows BaseZToMetres(_settings.baseHeight), 6); break; } + + case WIDX_HEIGHTMAP_LOW: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MIN_LAND_HEIGHT, STR_ENTER_MIN_LAND, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.heightmapLow), 6); + break; + } + + case WIDX_HEIGHTMAP_HIGH: + { + Formatter ft; + ft.Add(BaseZToMetres(kMinimumLandHeight)); + ft.Add(BaseZToMetres(kMaximumLandHeight)); + WindowTextInputOpen( + this, widgetIndex, STR_MAX_LAND_HEIGHT, STR_ENTER_MAX_LAND, ft, STR_FORMAT_INTEGER, + BaseZToMetres(_settings.heightmapHigh), 6); + break; + } + case WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES: _settings.smoothTileEdges = !_settings.smoothTileEdges; SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); @@ -1000,32 +1114,22 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_3); } - void TerrainTextInput(WidgetIndex widgetIndex, std::string_view text) + void TerrainTextInput(WidgetIndex widgetIndex, int32_t value) { - const auto strText = u8string(text); - char* end; - int32_t value = strtol(strText.c_str(), &end, 10); - if (*end != '\0') - { - return; - } - - switch (Config::Get().general.MeasurementFormat) - { - case MeasurementFormat::Imperial: - value = FeetToMetres(value); - [[fallthrough]]; - - default: - value = std::clamp(MetresToBaseZ(value), kMinimumLandHeight, kMaximumLandHeight); - break; - } - switch (widgetIndex) { case WIDX_BASE_HEIGHT: _settings.baseHeight = value; break; + + case WIDX_HEIGHTMAP_LOW: + _settings.heightmapLow = value; + _settings.heightmapHigh = std::max(_settings.heightmapLow, _settings.heightmapHigh); + break; + + case WIDX_HEIGHTMAP_HIGH: + _settings.heightmapHigh = value; + _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh); break; } @@ -1250,30 +1354,8 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TAB_4); } - void WaterTextInput(WidgetIndex widgetIndex, std::string_view text) + void WaterTextInput(WidgetIndex widgetIndex, int32_t value) { - int32_t value; - char* end; - - const auto strText = u8string(text); - value = strtol(strText.c_str(), &end, 10); - - if (*end != '\0') - { - return; - } - - switch (Config::Get().general.MeasurementFormat) - { - case MeasurementFormat::Imperial: - value = FeetToMetres(value); - [[fallthrough]]; - - default: - value = std::clamp(MetresToBaseZ(value), kMinimumWaterHeight, kMaximumWaterHeight); - break; - } - switch (widgetIndex) { case WIDX_WATER_LEVEL: @@ -1428,14 +1510,46 @@ namespace OpenRCT2::Ui::Windows void OnTextInput(WidgetIndex widgetIndex, std::string_view text) override { + auto strText = std::string(text); + char* end; + + // Convert text to integer value + int32_t value{}; + if (page == WINDOW_MAPGEN_PAGE_BASE && widgetIndex == WIDX_SIMPLEX_BASE_FREQ) + value = 100 * strtof(strText.c_str(), &end); + else + value = strtol(strText.c_str(), &end, 10); + + if (*end != '\0') + return; + + // Take care of unit conversion + int32_t rawValue = value; + if (page != WINDOW_MAPGEN_PAGE_BASE) + { + switch (Config::Get().general.MeasurementFormat) + { + case MeasurementFormat::Imperial: + value = FeetToMetres(value); + [[fallthrough]]; + + default: + value = std::clamp(MetresToBaseZ(value), kMinimumLandHeight, kMaximumLandHeight); + break; + } + } + + // Pass on to the actual properties switch (page) { case WINDOW_MAPGEN_PAGE_BASE: - return BaseTextInput(widgetIndex, text); + return BaseTextInput(widgetIndex, value); case WINDOW_MAPGEN_PAGE_TERRAIN: - return TerrainTextInput(widgetIndex, text); + return TerrainTextInput(widgetIndex, value); case WINDOW_MAPGEN_PAGE_WATER: - return WaterTextInput(widgetIndex, text); + return WaterTextInput(widgetIndex, value); + case WINDOW_MAPGEN_PAGE_FORESTS: + return ForestsTextInput(widgetIndex, rawValue, value); } } From c7b4b46d9ab058b12bec6fa025a0a6c2f467ac0b Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Wed, 11 Sep 2024 23:26:15 +0200 Subject: [PATCH 28/39] Increase min/max land height and tree altitude more logically --- src/openrct2-ui/windows/MapGen.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index e6cdad04ae..d1b4a810b7 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -282,8 +282,8 @@ namespace OpenRCT2::Ui::Windows .waterLevel = 6, .landTexture = 0, .edgeTexture = 0, - .heightmapLow = 1, - .heightmapHigh = 20, + .heightmapLow = 14, + .heightmapHigh = 60, .smoothTileEdges = true, // Features (e.g. tree, rivers, lakes etc.) @@ -726,25 +726,25 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_TREE_LAND_RATIO); break; case WIDX_TREE_LAND_RATIO_DOWN: - _settings.treeToLandRatio = std::max(_settings.treeToLandRatio - 1, 10); + _settings.treeToLandRatio = std::max(_settings.treeToLandRatio - 1, 1); InvalidateWidget(WIDX_TREE_LAND_RATIO); break; case WIDX_TREE_ALTITUDE_MIN_UP: - _settings.minTreeAltitude = std::min(_settings.minTreeAltitude + 1, kMaximumLandHeight / 2 - 1); - _settings.maxTreeAltitude = std::max(_settings.maxTreeAltitude, _settings.minTreeAltitude + 1); + _settings.minTreeAltitude = std::min(_settings.minTreeAltitude + 2, kMaximumLandHeight / 2 - 1); + _settings.maxTreeAltitude = std::max(_settings.maxTreeAltitude, _settings.minTreeAltitude + 2); InvalidateWidget(WIDX_TREE_ALTITUDE_MIN); break; case WIDX_TREE_ALTITUDE_MIN_DOWN: - _settings.minTreeAltitude = std::max(_settings.minTreeAltitude - 1, 2); + _settings.minTreeAltitude = std::max(_settings.minTreeAltitude - 2, kMinimumLandHeight); InvalidateWidget(WIDX_TREE_ALTITUDE_MIN); break; case WIDX_TREE_ALTITUDE_MAX_UP: - _settings.maxTreeAltitude = std::min(_settings.maxTreeAltitude + 1, kMaximumLandHeight - 1); + _settings.maxTreeAltitude = std::min(_settings.maxTreeAltitude + 2, kMaximumLandHeight - 1); InvalidateWidget(WIDX_TREE_ALTITUDE_MAX); break; case WIDX_TREE_ALTITUDE_MAX_DOWN: - _settings.maxTreeAltitude = std::max(_settings.maxTreeAltitude - 1, 2 + 1); - _settings.minTreeAltitude = std::min(_settings.minTreeAltitude, _settings.maxTreeAltitude - 1); + _settings.maxTreeAltitude = std::max(_settings.maxTreeAltitude - 2, kMinimumLandHeight - 1); + _settings.minTreeAltitude = std::min(_settings.minTreeAltitude, _settings.maxTreeAltitude - 2); InvalidateWidget(WIDX_TREE_ALTITUDE_MAX); break; } @@ -1086,21 +1086,21 @@ namespace OpenRCT2::Ui::Windows LandTool::ShowEdgeStyleDropdown(this, widget, _settings.edgeTexture); break; case WIDX_HEIGHTMAP_LOW_UP: - _settings.heightmapLow = std::min(_settings.heightmapLow + 1, kMaximumLandHeight / 2 - 1); - _settings.heightmapHigh = std::max(_settings.heightmapHigh, _settings.heightmapLow + 1); + _settings.heightmapLow = std::min(_settings.heightmapLow + 2, kMaximumLandHeight / 2 - 1); + _settings.heightmapHigh = std::max(_settings.heightmapHigh, _settings.heightmapLow + 2); InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_LOW_DOWN: - _settings.heightmapLow = std::max(_settings.heightmapLow - 1, kMinimumLandHeight); + _settings.heightmapLow = std::max(_settings.heightmapLow - 2, kMinimumLandHeight); InvalidateWidget(WIDX_HEIGHTMAP_LOW); break; case WIDX_HEIGHTMAP_HIGH_UP: - _settings.heightmapHigh = std::min(_settings.heightmapHigh + 1, kMaximumLandHeight - 1); + _settings.heightmapHigh = std::min(_settings.heightmapHigh + 2, kMaximumLandHeight - 1); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; case WIDX_HEIGHTMAP_HIGH_DOWN: - _settings.heightmapHigh = std::max(_settings.heightmapHigh - 1, kMinimumLandHeight + 1); - _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh - 1); + _settings.heightmapHigh = std::max(_settings.heightmapHigh - 2, kMinimumLandHeight); + _settings.heightmapLow = std::min(_settings.heightmapLow, _settings.heightmapHigh - 2); InvalidateWidget(WIDX_HEIGHTMAP_HIGH); break; } From 9b11e69550a8e7c5516d30abd38fbd6bc742ff30 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Thu, 12 Sep 2024 17:30:00 +0200 Subject: [PATCH 29/39] Consolidate base height setting into min land height setting --- src/openrct2-ui/UiStringIds.h | 6 ++-- src/openrct2-ui/windows/MapGen.cpp | 57 +++++------------------------- src/openrct2/world/MapGen.cpp | 8 ++--- src/openrct2/world/MapGen.h | 1 - 4 files changed, 15 insertions(+), 57 deletions(-) diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 905768225e..be0a3b1884 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -897,11 +897,11 @@ namespace OpenRCT2 STR_SHOW_RIDES_STALLS_ON_MAP_TIP = 3144, // Window: MapGen - STR_BASE_HEIGHT = 5183, - STR_BASE_HEIGHT_LABEL = 2691, + STR_BASE_HEIGHT = 5183, // unused + STR_BASE_HEIGHT_LABEL = 2691, // unused STR_BEACHES_WATER_BODIES = 6677, STR_ENTER_BASE_FREQUENCY = 6702, - STR_ENTER_BASE_HEIGHT = 5184, + STR_ENTER_BASE_HEIGHT = 5184, // unused STR_ENTER_MAX_LAND = 6694, STR_ENTER_MAX_TREE_ALTITUDE = 6698, STR_ENTER_MIN_LAND = 6692, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index d1b4a810b7..633496b5d0 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -78,10 +78,7 @@ namespace OpenRCT2::Ui::Windows WIDX_HEIGHTMAP_STRENGTH_UP, WIDX_HEIGHTMAP_STRENGTH_DOWN, - WIDX_BASE_HEIGHT = TAB_BEGIN, - WIDX_BASE_HEIGHT_UP, - WIDX_BASE_HEIGHT_DOWN, - WIDX_HEIGHTMAP_LOW, + WIDX_HEIGHTMAP_LOW = TAB_BEGIN, WIDX_HEIGHTMAP_LOW_UP, WIDX_HEIGHTMAP_LOW_DOWN, WIDX_HEIGHTMAP_HIGH, @@ -145,13 +142,12 @@ namespace OpenRCT2::Ui::Windows static Widget TerrainWidgets[] = { SHARED_WIDGETS(STR_MAPGEN_CAPTION_TERRAIN), - MakeSpinnerWidgets({179, 52}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // NB: 3 widgets - MakeSpinnerWidgets({179, 70}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} - MakeSpinnerWidgets({179, 88}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} - MakeWidget ({179, 106}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), - MakeWidget ({236, 106}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), - MakeWidget ({ 10, 124}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), - MakeWidget ({ 10, 142}, {255, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES + MakeSpinnerWidgets({179, 52}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_LOW{,_UP,_DOWN} + MakeSpinnerWidgets({179, 70}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_HIGH{,_UP,_DOWN} + MakeWidget ({179, 88}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_BASE_LAND_TIP ), + MakeWidget ({236, 88}, { 47, 36}, WindowWidgetType::FlatBtn, WindowColour::Secondary, 0xFFFFFFFF, STR_CHANGE_VERTICAL_LAND_TIP), + MakeWidget ({ 10, 106}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_OPTION_RANDOM_TERRAIN ), + MakeWidget ({ 10, 122}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_TILE), // WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES kWidgetsEnd, }; @@ -210,8 +206,6 @@ namespace OpenRCT2::Ui::Windows (1uLL << WIDX_HEIGHTMAP_STRENGTH_UP) | (1uLL << WIDX_HEIGHTMAP_STRENGTH_DOWN), - (1uLL << WIDX_BASE_HEIGHT_UP) | - (1uLL << WIDX_BASE_HEIGHT_DOWN) | (1uLL << WIDX_HEIGHTMAP_LOW_UP) | (1uLL << WIDX_HEIGHTMAP_LOW_DOWN) | (1uLL << WIDX_HEIGHTMAP_HIGH_UP) | @@ -278,7 +272,6 @@ namespace OpenRCT2::Ui::Windows // Base .algorithm = MapGenAlgorithm::blank, .mapSize{ 150, 150 }, - .baseHeight = 12, .waterLevel = 6, .landTexture = 0, .edgeTexture = 0, @@ -1022,17 +1015,6 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { - case WIDX_BASE_HEIGHT: - { - Formatter ft; - ft.Add(BaseZToMetres(kMinimumLandHeight)); - ft.Add(BaseZToMetres(kMaximumLandHeight)); - WindowTextInputOpen( - this, WIDX_BASE_HEIGHT, STR_BASE_HEIGHT, STR_ENTER_BASE_HEIGHT, ft, STR_FORMAT_INTEGER, - BaseZToMetres(_settings.baseHeight), 6); - break; - } - case WIDX_HEIGHTMAP_LOW: { Formatter ft; @@ -1067,14 +1049,6 @@ namespace OpenRCT2::Ui::Windows { switch (widgetIndex) { - case WIDX_BASE_HEIGHT_UP: - _settings.baseHeight = std::min(_settings.baseHeight + 2, kMaximumLandHeight); - Invalidate(); - break; - case WIDX_BASE_HEIGHT_DOWN: - _settings.baseHeight = std::max(_settings.baseHeight - 2, kMinimumLandHeight); - Invalidate(); - break; case WIDX_RANDOM_TERRAIN: _randomTerrain = !_randomTerrain; Invalidate(); @@ -1118,10 +1092,6 @@ namespace OpenRCT2::Ui::Windows { switch (widgetIndex) { - case WIDX_BASE_HEIGHT: - _settings.baseHeight = value; - break; - case WIDX_HEIGHTMAP_LOW: _settings.heightmapLow = value; _settings.heightmapHigh = std::max(_settings.heightmapLow, _settings.heightmapHigh); @@ -1262,17 +1232,6 @@ namespace OpenRCT2::Ui::Windows const auto textColour = colours[1]; - // Base height label and value - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_BASE_HEIGHT].top + 1 }, STR_BASE_HEIGHT_LABEL, {}, - { textColour }); - - auto ft = Formatter(); - ft.Add(BaseZToMetres(_settings.baseHeight)); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_BASE_HEIGHT].left + 1, widgets[WIDX_BASE_HEIGHT].top + 1 }, - STR_RIDE_LENGTH_ENTRY, ft, { colours[1] }); - // Floor texture label DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, @@ -1283,7 +1242,7 @@ namespace OpenRCT2::Ui::Windows dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_MAPGEN_MIN_LAND_HEIGHT, {}, { textColour }); - ft = Formatter(); + auto ft = Formatter(); ft.Add(BaseZToMetres(_settings.heightmapLow)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_LOW].left + 1, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 516b5e81a9..e4894dc744 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -223,8 +223,8 @@ static void MapGenResetSurfaces(MapGenSettings* settings) { surfaceElement->SetSurfaceObjectIndex(surfaceTextureId); surfaceElement->SetEdgeObjectIndex(edgeTextureId); - surfaceElement->BaseHeight = settings->baseHeight; - surfaceElement->ClearanceHeight = settings->baseHeight; + surfaceElement->BaseHeight = settings->heightmapLow; + surfaceElement->ClearanceHeight = settings->heightmapLow; } } } @@ -695,8 +695,8 @@ static void MapGenSimplex(MapGenSettings* settings) float freq = settings->simplex_base_freq * (1.0f / _heightSize.x); int32_t octaves = settings->simplex_octaves; - int32_t low = settings->heightmapLow; - int32_t high = settings->heightmapHigh; + int32_t low = settings->heightmapLow / 2; + int32_t high = settings->heightmapHigh / 2 - low; NoiseRand(); for (int32_t y = 0; y < _heightSize.y; y++) diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index a20bdc6aa1..9bfbf245a2 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -25,7 +25,6 @@ struct MapGenSettings // Base MapGenAlgorithm algorithm; TileCoordsXY mapSize; - int32_t baseHeight; int32_t waterLevel; int32_t landTexture; int32_t edgeTexture; From 7a7472462bc3e75ac6c61484243d3f856448b9ab Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Thu, 12 Sep 2024 17:44:47 +0200 Subject: [PATCH 30/39] Merge simplex noise options into one Adjust heightmap source dropdown width; keep open --- data/language/en-GB.txt | 51 +++++++++++++++--------------- src/openrct2-ui/UiStringIds.h | 51 +++++++++++++++--------------- src/openrct2-ui/windows/MapGen.cpp | 46 ++++++--------------------- src/openrct2/world/MapGen.cpp | 3 +- src/openrct2/world/MapGen.h | 3 +- 5 files changed, 62 insertions(+), 92 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 57838fda54..086307c898 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3751,32 +3751,31 @@ STR_6676 :At least one peep names object must be selected STR_6677 :Add beaches around water bodies STR_6678 :Heightmap source: STR_6679 :Flatland -STR_6680 :Simplex noise (random) -STR_6681 :Simplex noise (custom) -STR_6682 :Heightmap file -STR_6683 :Map Generator - Generator -STR_6684 :Map Generator - Terrain -STR_6685 :Map Generator - Water -STR_6686 :Map Generator - Forests -STR_6687 :Tree to land ratio: -STR_6688 :Min. tree altitude: -STR_6689 :Max. tree altitude: -STR_6690 :{UINT16}% -STR_6691 :Minimum land height -STR_6692 :Enter min. land height between {COMMA16} and {COMMA16} -STR_6693 :Maximum land height -STR_6694 :Enter max. land height between {COMMA16} and {COMMA16} -STR_6695 :Minimum tree altitude -STR_6696 :Enter min. tree altitude between {COMMA16} and {COMMA16} -STR_6697 :Maximum tree altitude -STR_6698 :Enter max. tree altitude between {COMMA16} and {COMMA16} -STR_6699 :Tree to land ratio -STR_6700 :Enter tree to land ratio between {COMMA16} and {COMMA16} -STR_6701 :Simplex Base Frequency -STR_6702 :Enter Base Frequency between {COMMA2DP32} and {COMMA2DP32} -STR_6703 :Simplex Octaves -STR_6704 :Enter Octaves between {COMMA16} and {COMMA16} -STR_6705 :{COMMA2DP32} +STR_6680 :Simplex noise +STR_6681 :Heightmap file +STR_6682 :Map Generator - Generator +STR_6683 :Map Generator - Terrain +STR_6684 :Map Generator - Water +STR_6685 :Map Generator - Forests +STR_6686 :Tree to land ratio: +STR_6687 :Min. tree altitude: +STR_6688 :Max. tree altitude: +STR_6689 :{UINT16}% +STR_6690 :Minimum land height +STR_6691 :Enter min. land height between {COMMA16} and {COMMA16} +STR_6692 :Maximum land height +STR_6693 :Enter max. land height between {COMMA16} and {COMMA16} +STR_6694 :Minimum tree altitude +STR_6695 :Enter min. tree altitude between {COMMA16} and {COMMA16} +STR_6696 :Maximum tree altitude +STR_6697 :Enter max. tree altitude between {COMMA16} and {COMMA16} +STR_6698 :Tree to land ratio +STR_6699 :Enter tree to land ratio between {COMMA16} and {COMMA16} +STR_6700 :Simplex Base Frequency +STR_6701 :Enter Base Frequency between {COMMA2DP32} and {COMMA2DP32} +STR_6702 :Simplex Octaves +STR_6703 :Enter Octaves between {COMMA16} and {COMMA16} +STR_6704 :{COMMA2DP32} ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index be0a3b1884..9f8ffc0503 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -36,7 +36,7 @@ namespace OpenRCT2 STR_ENTER_PARK_NAME = 1719, STR_ENTER_SELECTION_SIZE = 5129, STR_ERROR_INVALID_CHARACTERS = 5243, - STR_FORMAT_COMMA2DP32 = 6705, + STR_FORMAT_COMMA2DP32 = 6704, STR_FORMAT_INTEGER = 5182, STR_GRAPH_LABEL = 2222, STR_LIGHTPINK_STRINGID = 5299, @@ -897,28 +897,27 @@ namespace OpenRCT2 STR_SHOW_RIDES_STALLS_ON_MAP_TIP = 3144, // Window: MapGen - STR_BASE_HEIGHT = 5183, // unused + STR_BASE_HEIGHT = 5183, // unused STR_BASE_HEIGHT_LABEL = 2691, // unused STR_BEACHES_WATER_BODIES = 6677, - STR_ENTER_BASE_FREQUENCY = 6702, + STR_ENTER_BASE_FREQUENCY = 6701, STR_ENTER_BASE_HEIGHT = 5184, // unused - STR_ENTER_MAX_LAND = 6694, - STR_ENTER_MAX_TREE_ALTITUDE = 6698, - STR_ENTER_MIN_LAND = 6692, - STR_ENTER_MIN_TREE_ALTITUDE = 6696, - STR_ENTER_OCTAVES = 6704, - STR_ENTER_TREE_TO_LAND_RATIO = 6700, + STR_ENTER_MAX_LAND = 6693, + STR_ENTER_MAX_TREE_ALTITUDE = 6697, + STR_ENTER_MIN_LAND = 6691, + STR_ENTER_MIN_TREE_ALTITUDE = 6695, + STR_ENTER_OCTAVES = 6703, + STR_ENTER_TREE_TO_LAND_RATIO = 6699, STR_ENTER_WATER_LEVEL = 5186, - STR_HEIGHTMAP_FILE = 6682, + STR_HEIGHTMAP_FILE = 6681, STR_HEIGHTMAP_FLATLAND = 6679, - STR_HEIGHTMAP_SIMPLEX_CUSTOM = 6681, STR_HEIGHTMAP_SIMPLEX_NOISE = 6680, STR_HEIGHTMAP_SOURCE = 6678, STR_MAPGEN_ACTION_GENERATE = 2694, - STR_MAPGEN_CAPTION_FORESTS = 6686, - STR_MAPGEN_CAPTION_GENERATOR = 6683, - STR_MAPGEN_CAPTION_TERRAIN = 6684, - STR_MAPGEN_CAPTION_WATER = 6685, + STR_MAPGEN_CAPTION_FORESTS = 6685, + STR_MAPGEN_CAPTION_GENERATOR = 6682, + STR_MAPGEN_CAPTION_TERRAIN = 6683, + STR_MAPGEN_CAPTION_WATER = 6684, STR_MAPGEN_MAX_LAND_HEIGHT = 2687, STR_MAPGEN_MIN_LAND_HEIGHT = 2686, STR_MAPGEN_NORMALIZE = 6046, @@ -931,18 +930,18 @@ namespace OpenRCT2 STR_MAPGEN_SMOOTH_HEIGHTMAP = 6044, STR_MAPGEN_SMOOTH_STRENGTH = 6045, STR_MAPGEN_SMOOTH_TILE = 6047, - STR_MAPGEN_TREE_MAX_ALTITUDE = 6689, - STR_MAPGEN_TREE_MIN_ALTITUDE = 6688, - STR_MAPGEN_TREE_TO_LAND_RATIO = 6687, - STR_MAPGEN_TREE_TO_LAND_RATIO_PCT = 6690, - STR_MAX_LAND_HEIGHT = 6693, - STR_MAX_TREE_ALTITUDE = 6697, - STR_MIN_LAND_HEIGHT = 6691, - STR_MIN_TREE_ALTITUDE = 6695, - STR_SIMPLEX_BASE_FREQUENCY = 6701, - STR_SIMPLEX_OCTAVES = 6703, + STR_MAPGEN_TREE_MAX_ALTITUDE = 6688, + STR_MAPGEN_TREE_MIN_ALTITUDE = 6687, + STR_MAPGEN_TREE_TO_LAND_RATIO = 6686, + STR_MAPGEN_TREE_TO_LAND_RATIO_PCT = 6689, + STR_MAX_LAND_HEIGHT = 6692, + STR_MAX_TREE_ALTITUDE = 6696, + STR_MIN_LAND_HEIGHT = 6690, + STR_MIN_TREE_ALTITUDE = 6694, + STR_SIMPLEX_BASE_FREQUENCY = 6700, + STR_SIMPLEX_OCTAVES = 6702, STR_TERRAIN_LABEL = 2693, - STR_TREE_TO_LAND_RATIO = 6695, + STR_TREE_TO_LAND_RATIO = 6694, STR_WATER_LEVEL = 5185, STR_WATER_LEVEL_LABEL = 2692, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 633496b5d0..b3b9eb1522 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -287,8 +287,8 @@ namespace OpenRCT2::Ui::Windows .beaches = true, // Simplex Noise Parameters - .simplex_base_freq = 60, - .simplex_octaves = 4, + .simplex_base_freq = 175, + .simplex_octaves = 6, // Height map _settings .smooth_height_map = false, @@ -408,6 +408,9 @@ namespace OpenRCT2::Ui::Windows void GenerateMap() { + if (_settings.algorithm == MapGenAlgorithm::heightmapImage && !_heightmapLoaded) + return; + MapGenSettings mapgenSettings = _settings; if (_randomTerrain) { @@ -415,28 +418,6 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.edgeTexture = -1; } - switch (mapgenSettings.algorithm) - { - case MapGenAlgorithm::blank: - break; - - case MapGenAlgorithm::simplexNoise: - mapgenSettings.heightmapLow = UtilRand() % 4; - mapgenSettings.heightmapHigh = 12 + (UtilRand() % (32 - 12)); - mapgenSettings.simplex_base_freq = 1.75f; - mapgenSettings.simplex_octaves = 6; - break; - - case MapGenAlgorithm::simplexCustom: - mapgenSettings.simplex_base_freq /= 100.00f; - break; - - case MapGenAlgorithm::heightmapImage: - if (!_heightmapLoaded) - return; - break; - } - MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); } @@ -470,7 +451,7 @@ namespace OpenRCT2::Ui::Windows void BaseMouseDown(WidgetIndex widgetIndex, Widget* widget) { - if (_settings.algorithm == MapGenAlgorithm::simplexCustom) + if (_settings.algorithm == MapGenAlgorithm::simplexNoise) SimplexMouseDown(widgetIndex, widget); else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) @@ -505,16 +486,15 @@ namespace OpenRCT2::Ui::Windows constexpr ItemExt items[] = { ToggleOption(0, STR_HEIGHTMAP_FLATLAND), ToggleOption(1, STR_HEIGHTMAP_SIMPLEX_NOISE), - ToggleOption(2, STR_HEIGHTMAP_SIMPLEX_CUSTOM), - ToggleOption(3, STR_HEIGHTMAP_FILE), + ToggleOption(2, STR_HEIGHTMAP_FILE), }; SetItems(items); Widget* ddWidget = &widgets[widgetIndex - 1]; - WindowDropdownShowText( + WindowDropdownShowTextCustomWidth( { windowPos.x + ddWidget->left, windowPos.y + ddWidget->top }, ddWidget->height() + 1, colours[1], 0, - std::size(items)); + Dropdown::Flag::StayOpen, std::size(items), ddWidget->width() - 2); SetChecked(EnumValue(_settings.algorithm), true); break; @@ -595,12 +575,6 @@ namespace OpenRCT2::Ui::Windows case MapGenAlgorithm::simplexNoise: sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_NOISE; - ToggleSimplexWidgets(false); - ToggleHeightmapWidgets(false); - break; - - case MapGenAlgorithm::simplexCustom: - sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_CUSTOM; ToggleSimplexWidgets(true); ToggleHeightmapWidgets(false); break; @@ -645,7 +619,7 @@ namespace OpenRCT2::Ui::Windows DrawWidgets(dpi); DrawTabImages(dpi); - if (_settings.algorithm == MapGenAlgorithm::simplexCustom) + if (_settings.algorithm == MapGenAlgorithm::simplexNoise) SimplexDraw(dpi); else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index e4894dc744..8136dfac8d 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -110,7 +110,6 @@ void MapGenGenerate(MapGenSettings* settings) break; case MapGenAlgorithm::simplexNoise: - case MapGenAlgorithm::simplexCustom: MapGenGenerateSimplex(settings); break; @@ -692,7 +691,7 @@ static float Grad(int32_t hash, float x, float y) static void MapGenSimplex(MapGenSettings* settings) { - float freq = settings->simplex_base_freq * (1.0f / _heightSize.x); + float freq = settings->simplex_base_freq / 100.0f * (1.0f / _heightSize.x); int32_t octaves = settings->simplex_octaves; int32_t low = settings->heightmapLow / 2; diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 9bfbf245a2..5e56f8af4a 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -16,7 +16,6 @@ enum class MapGenAlgorithm : uint8_t { blank, simplexNoise, - simplexCustom, heightmapImage, }; @@ -40,7 +39,7 @@ struct MapGenSettings bool beaches; // Simplex Noise Parameters - float simplex_base_freq; + int32_t simplex_base_freq; int32_t simplex_octaves; // Height map settings From 1b041e41beb2e3ae04d7a2077bb8da615192f037 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Thu, 12 Sep 2024 17:47:37 +0200 Subject: [PATCH 31/39] Auto-open mapgen window in editor when advancing to landscape step --- src/openrct2-ui/windows/EditorBottomToolbar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/openrct2-ui/windows/EditorBottomToolbar.cpp b/src/openrct2-ui/windows/EditorBottomToolbar.cpp index 279f62dc42..c157a50e8d 100644 --- a/src/openrct2-ui/windows/EditorBottomToolbar.cpp +++ b/src/openrct2-ui/windows/EditorBottomToolbar.cpp @@ -199,6 +199,7 @@ namespace OpenRCT2::Ui::Windows else { ContextOpenWindow(WindowClass::Map); + ContextOpenWindow(WindowClass::Mapgen); } } From 0be51dd56574003f771b0abcb2ac9e54488d4a87 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Thu, 12 Sep 2024 18:17:19 +0200 Subject: [PATCH 32/39] Move default settings to MapGen header --- src/openrct2-ui/windows/MapGen.cpp | 30 +------------------------ src/openrct2/world/MapGen.h | 36 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 47 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index b3b9eb1522..5796c55df0 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -267,35 +267,7 @@ namespace OpenRCT2::Ui::Windows private: ResizeDirection _resizeDirection{ ResizeDirection::Both }; bool _mapWidthAndHeightLinked{ true }; - - MapGenSettings _settings{ - // Base - .algorithm = MapGenAlgorithm::blank, - .mapSize{ 150, 150 }, - .waterLevel = 6, - .landTexture = 0, - .edgeTexture = 0, - .heightmapLow = 14, - .heightmapHigh = 60, - .smoothTileEdges = true, - - // Features (e.g. tree, rivers, lakes etc.) - .trees = true, - .treeToLandRatio = 25, - .minTreeAltitude = 10, - .maxTreeAltitude = 50, - .beaches = true, - - // Simplex Noise Parameters - .simplex_base_freq = 175, - .simplex_octaves = 6, - - // Height map _settings - .smooth_height_map = false, - .smooth_strength = 1, - .normalize_height = false, - }; - + MapGenSettings _settings{}; bool _randomTerrain = true; bool _heightmapLoaded = false; diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 5e56f8af4a..05c7456ae8 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -22,30 +22,30 @@ enum class MapGenAlgorithm : uint8_t struct MapGenSettings { // Base - MapGenAlgorithm algorithm; - TileCoordsXY mapSize; - int32_t waterLevel; - int32_t landTexture; - int32_t edgeTexture; - int32_t heightmapLow; - int32_t heightmapHigh; - bool smoothTileEdges; + MapGenAlgorithm algorithm = MapGenAlgorithm::blank; + TileCoordsXY mapSize{ 150, 150 }; + int32_t waterLevel = 6; + int32_t landTexture = 0; + int32_t edgeTexture = 0; + int32_t heightmapLow = 14; + int32_t heightmapHigh = 60; + bool smoothTileEdges = true; // Features (e.g. tree, rivers, lakes etc.) - bool trees; - int32_t treeToLandRatio; - int32_t minTreeAltitude; - int32_t maxTreeAltitude; - bool beaches; + bool trees = true; + int32_t treeToLandRatio = 25; + int32_t minTreeAltitude = 10; + int32_t maxTreeAltitude = 50; + bool beaches = true; // Simplex Noise Parameters - int32_t simplex_base_freq; - int32_t simplex_octaves; + int32_t simplex_base_freq = 175; + int32_t simplex_octaves = 6; // Height map settings - bool smooth_height_map; - uint32_t smooth_strength; - bool normalize_height; + bool smooth_height_map = true; + uint32_t smooth_strength = 1; + bool normalize_height = true; }; void MapGenGenerate(MapGenSettings* settings); From daba4310d19541bb272a5de451da165059186ddb Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Sun, 22 Sep 2024 11:16:50 +0200 Subject: [PATCH 33/39] Grey-out tree parameters when tree placement is unchecked --- src/openrct2-ui/windows/MapGen.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 5796c55df0..c656fba5db 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -619,6 +619,7 @@ namespace OpenRCT2::Ui::Windows { case WIDX_FORESTS_PLACE_TREES: _settings.trees ^= true; + Invalidate(); break; case WIDX_TREE_LAND_RATIO: @@ -732,6 +733,16 @@ namespace OpenRCT2::Ui::Windows pressed_widgets |= 1uLL << WIDX_FORESTS_PLACE_TREES; SetPressedTab(); + + SetWidgetDisabled(WIDX_TREE_LAND_RATIO, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_LAND_RATIO_UP, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_LAND_RATIO_DOWN, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MIN, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MIN_UP, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MIN_DOWN, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_UP, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_DOWN, !_settings.trees); } void ForestsDraw(DrawPixelInfo& dpi) @@ -739,7 +750,10 @@ namespace OpenRCT2::Ui::Windows DrawWidgets(dpi); DrawTabImages(dpi); - const auto textColour = colours[1]; + const auto enabledColour = colours[1]; + const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); + + const auto textColour = _settings.trees ? enabledColour : disabledColour; // Tree to land ratio, label and value DrawTextBasic( From b1540b84dcc8df05ca38190dfc0bf72a7a20612c Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Sun, 22 Sep 2024 21:28:15 +0200 Subject: [PATCH 34/39] Disable map size controls when height map images are used --- src/openrct2-ui/windows/MapGen.cpp | 52 ++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index c656fba5db..7ea4ae0c23 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -282,16 +282,6 @@ namespace OpenRCT2::Ui::Windows disabled_widgets = PageDisabledWidgets[newPage]; pressed_widgets = PressedWidgets[newPage]; - // Enable heightmap widgets if one is loaded - if (_settings.algorithm == MapGenAlgorithm::heightmapImage && _heightmapLoaded) - { - SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, true); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _settings.smooth_height_map); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _settings.smooth_height_map); - SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _settings.smooth_height_map); - } - InitScrollWidgets(); Invalidate(); } @@ -529,6 +519,25 @@ namespace OpenRCT2::Ui::Windows SetWidgetPressed(WIDX_MAP_SIZE_LINK, _mapWidthAndHeightLinked); SetWidgetDisabled(WIDX_MAP_SIZE_LINK, _settings.mapSize.x != _settings.mapSize.y); + bool isHeightMapImage = _settings.algorithm == MapGenAlgorithm::heightmapImage; + SetWidgetDisabled(WIDX_MAP_SIZE_Y, isHeightMapImage); + SetWidgetDisabled(WIDX_MAP_SIZE_Y_UP, isHeightMapImage); + SetWidgetDisabled(WIDX_MAP_SIZE_Y_DOWN, isHeightMapImage); + SetWidgetDisabled(WIDX_MAP_SIZE_LINK, isHeightMapImage); + SetWidgetDisabled(WIDX_MAP_SIZE_X, isHeightMapImage); + SetWidgetDisabled(WIDX_MAP_SIZE_X_UP, isHeightMapImage); + SetWidgetDisabled(WIDX_MAP_SIZE_X_DOWN, isHeightMapImage); + + // Enable heightmap widgets if one is loaded + if (isHeightMapImage) + { + SetWidgetEnabled(WIDX_HEIGHTMAP_NORMALIZE, _heightmapLoaded); + SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, _heightmapLoaded); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH, _heightmapLoaded && _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_UP, _heightmapLoaded && _settings.smooth_height_map); + SetWidgetEnabled(WIDX_HEIGHTMAP_STRENGTH_DOWN, _heightmapLoaded && _settings.smooth_height_map); + } + SetPressedTab(); // Push width (Y) and height (X) to the common formatter arguments for the map size spinners to use @@ -597,14 +606,21 @@ namespace OpenRCT2::Ui::Windows else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) HeightmapDraw(dpi); - const auto textColour = colours[1]; + const auto enabledColour = colours[1]; + const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); + { + auto textColour = IsWidgetDisabled(WIDX_MAP_SIZE_Y) ? disabledColour : enabledColour; + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_MAP_SIZE_Y].top + 1 }, STR_MAP_SIZE, {}, { textColour }); + } - DrawTextBasic( - dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_SOURCE].top + 1 }, STR_HEIGHTMAP_SOURCE, {}, - { textColour }); + { + auto textColour = enabledColour; + DrawTextBasic( + dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_SOURCE].top + 1 }, STR_HEIGHTMAP_SOURCE, {}, + { textColour }); + } } #pragma endregion @@ -951,7 +967,9 @@ namespace OpenRCT2::Ui::Windows const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); // Smooth strength label and value - const auto strengthColour = _settings.smooth_height_map ? enabledColour : disabledColour; + const bool strengthDisabled = IsWidgetDisabled(WIDX_HEIGHTMAP_STRENGTH) || !_settings.smooth_height_map; + const auto strengthColour = strengthDisabled ? disabledColour : enabledColour; + DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 24, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, { strengthColour }); From 297be375fbb189454f016bd7b980a89ecd8df7f0 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 23 Sep 2024 14:17:04 +0200 Subject: [PATCH 35/39] Disable widgets for irrelevant options in flatland terrain mode This disables the smooth tile edges, max terrain height, and max forest height widgets. --- src/openrct2-ui/windows/MapGen.cpp | 47 +++++++++++++++++------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 7ea4ae0c23..1e5f87f88b 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -750,15 +750,17 @@ namespace OpenRCT2::Ui::Windows SetPressedTab(); + const bool isFlatland = _settings.algorithm == MapGenAlgorithm::blank; + SetWidgetDisabled(WIDX_TREE_LAND_RATIO, !_settings.trees); SetWidgetDisabled(WIDX_TREE_LAND_RATIO_UP, !_settings.trees); SetWidgetDisabled(WIDX_TREE_LAND_RATIO_DOWN, !_settings.trees); SetWidgetDisabled(WIDX_TREE_ALTITUDE_MIN, !_settings.trees); SetWidgetDisabled(WIDX_TREE_ALTITUDE_MIN_UP, !_settings.trees); SetWidgetDisabled(WIDX_TREE_ALTITUDE_MIN_DOWN, !_settings.trees); - SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX, !_settings.trees); - SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_UP, !_settings.trees); - SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_DOWN, !_settings.trees); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX, !_settings.trees || isFlatland); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_UP, !_settings.trees || isFlatland); + SetWidgetDisabled(WIDX_TREE_ALTITUDE_MAX_DOWN, !_settings.trees || isFlatland); } void ForestsDraw(DrawPixelInfo& dpi) @@ -796,16 +798,19 @@ namespace OpenRCT2::Ui::Windows STR_RIDE_LENGTH_ENTRY, ft, { textColour }); // Maximum tree altitude, label and value + const bool isFlatland = _settings.algorithm == MapGenAlgorithm::blank; + const auto maxTreeTextColour = _settings.trees && !isFlatland ? enabledColour : disabledColour; + DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_TREE_ALTITUDE_MAX].top + 1 }, STR_MAPGEN_TREE_MAX_ALTITUDE, - {}, { textColour }); + {}, { maxTreeTextColour }); ft = Formatter(); ft.Add(BaseZToMetres(_settings.maxTreeAltitude)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_TREE_ALTITUDE_MAX].left + 1, widgets[WIDX_TREE_ALTITUDE_MAX].top + 1 }, - STR_RIDE_LENGTH_ENTRY, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { maxTreeTextColour }); } #pragma endregion @@ -1188,17 +1193,14 @@ namespace OpenRCT2::Ui::Windows SetCheckboxValue(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.smoothTileEdges); // Only allow floor and wall texture options if random terrain is disabled - if (!_randomTerrain) - { - SetWidgetEnabled(WIDX_FLOOR_TEXTURE, true); - SetWidgetEnabled(WIDX_WALL_TEXTURE, true); - } - else - { - SetWidgetEnabled(WIDX_FLOOR_TEXTURE, false); - SetWidgetEnabled(WIDX_WALL_TEXTURE, false); - } + SetWidgetEnabled(WIDX_FLOOR_TEXTURE, !_randomTerrain); + SetWidgetEnabled(WIDX_WALL_TEXTURE, !_randomTerrain); + // Max land height option is irrelevant for flatland + SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH, _settings.algorithm != MapGenAlgorithm::blank); + + // Only offer terrain edge smoothing if we don't use flatland terrain + SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.algorithm != MapGenAlgorithm::blank); SetPressedTab(); } @@ -1208,34 +1210,37 @@ namespace OpenRCT2::Ui::Windows DrawTabImages(dpi); DrawDropdownButtons(dpi, WIDX_FLOOR_TEXTURE, WIDX_WALL_TEXTURE); - const auto textColour = colours[1]; + const auto enabledColour = colours[1]; + const auto disabledColour = enabledColour.withFlag(ColourFlag::inset, true); // Floor texture label DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_FLOOR_TEXTURE].top + 1 }, STR_TERRAIN_LABEL, {}, - { textColour }); + { enabledColour }); // Minimum land height label and value DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, STR_MAPGEN_MIN_LAND_HEIGHT, {}, - { textColour }); + { enabledColour }); auto ft = Formatter(); ft.Add(BaseZToMetres(_settings.heightmapLow)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_LOW].left + 1, widgets[WIDX_HEIGHTMAP_LOW].top + 1 }, - STR_RIDE_LENGTH_ENTRY, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { enabledColour }); + + const auto maxLandColour = IsWidgetDisabled(WIDX_HEIGHTMAP_HIGH) ? disabledColour : enabledColour; // Maximum land height label and value DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, STR_MAPGEN_MAX_LAND_HEIGHT, {}, - { textColour }); + { maxLandColour }); ft = Formatter(); ft.Add(BaseZToMetres(_settings.heightmapHigh)); DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_HIGH].left + 1, widgets[WIDX_HEIGHTMAP_HIGH].top + 1 }, - STR_RIDE_LENGTH_ENTRY, ft, { textColour }); + STR_RIDE_LENGTH_ENTRY, ft, { maxLandColour }); } #pragma endregion From 0abfce9ba6d9d33f44141c5c6d2372f2e759b7cc Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 23 Sep 2024 14:49:52 +0200 Subject: [PATCH 36/39] Show current height map image file in window --- data/language/en-GB.txt | 3 +++ src/openrct2-ui/UiStringIds.h | 3 +++ src/openrct2-ui/windows/MapGen.cpp | 39 ++++++++++++++++++++---------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 086307c898..212e24f223 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3776,6 +3776,9 @@ STR_6701 :Enter Base Frequency between {COMMA2DP32} and {COMMA2DP32} STR_6702 :Simplex Octaves STR_6703 :Enter Octaves between {COMMA16} and {COMMA16} STR_6704 :{COMMA2DP32} +STR_6705 :Browse... +STR_6706 :{WINDOW_COLOUR_2}Current image file: {BLACK}{STRING} +STR_6707 :(none selected) ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 9f8ffc0503..84e726d306 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -19,6 +19,7 @@ namespace OpenRCT2 STR_ADJUST_LARGER_LAND_TIP = 2379, STR_ADJUST_SMALLER_LAND_TIP = 2378, STR_BROKEN = 3124, + STR_BROWSE = 6705, STR_CANCEL = 972, STR_CANT_INCREASE_FURTHER = 3264, STR_CANT_REDUCE_FURTHER = 3265, @@ -918,8 +919,10 @@ namespace OpenRCT2 STR_MAPGEN_CAPTION_GENERATOR = 6682, STR_MAPGEN_CAPTION_TERRAIN = 6683, STR_MAPGEN_CAPTION_WATER = 6684, + STR_MAPGEN_CURRENT_HEIGHTMAP_FILE = 6706, STR_MAPGEN_MAX_LAND_HEIGHT = 2687, STR_MAPGEN_MIN_LAND_HEIGHT = 2686, + STR_MAPGEN_NONE_SELECTED = 6707, STR_MAPGEN_NORMALIZE = 6046, STR_MAPGEN_OPTION_PLACE_TREES = 2696, STR_MAPGEN_OPTION_RANDOM_TERRAIN = 2695, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 1e5f87f88b..d77360db06 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -71,7 +72,7 @@ namespace OpenRCT2::Ui::Windows WIDX_SIMPLEX_OCTAVES_DOWN, WIDX_HEIGHTMAP_GROUP, - WIDX_HEIGHTMAP_SELECT, + WIDX_HEIGHTMAP_BROWSE, WIDX_HEIGHTMAP_NORMALIZE, WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP, WIDX_HEIGHTMAP_STRENGTH, @@ -132,11 +133,11 @@ namespace OpenRCT2::Ui::Windows MakeSpinnerWidgets({179, 107}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_BASE_FREQ{,_UP,_DOWN} MakeSpinnerWidgets({179, 125}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_SIMPLEX_OCTAVES{,_UP,_DOWN} - MakeWidget ({ 5, 90}, {290, 70}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_GROUP - MakeWidget ({179, 107}, {109, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_SELECT - MakeWidget ({ 10, 107}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE - MakeWidget ({ 10, 125}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP - MakeSpinnerWidgets({179, 141}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} + MakeWidget ({ 5, 90}, {290, 86}, WindowWidgetType::Groupbox, WindowColour::Secondary, STR_MAPGEN_SELECT_HEIGHTMAP), // WIDX_HEIGHTMAP_GROUP + MakeWidget ({223, 107}, { 65, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_BROWSE ), // WIDX_HEIGHTMAP_BROWSE + MakeWidget ({ 10, 125}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_NORMALIZE ), // WIDX_HEIGHTMAP_NORMALIZE + MakeWidget ({ 10, 141}, {150, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_MAPGEN_SMOOTH_HEIGHTMAP), // WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP + MakeSpinnerWidgets({179, 157}, {109, 12}, WindowWidgetType::Spinner, WindowColour::Secondary ), // WIDX_HEIGHTMAP_STRENGTH{,_UP,_DOWN} kWidgetsEnd, }; @@ -270,6 +271,7 @@ namespace OpenRCT2::Ui::Windows MapGenSettings _settings{}; bool _randomTerrain = true; bool _heightmapLoaded = false; + std::string _heightmapFilename{}; void SetPage(int32_t newPage) { @@ -586,7 +588,7 @@ namespace OpenRCT2::Ui::Windows { // clang-format off BaseWidgets[WIDX_HEIGHTMAP_GROUP].type = state ? WindowWidgetType::Groupbox : WindowWidgetType::Empty; - BaseWidgets[WIDX_HEIGHTMAP_SELECT].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; + BaseWidgets[WIDX_HEIGHTMAP_BROWSE].type = state ? WindowWidgetType::Button : WindowWidgetType::Empty; BaseWidgets[WIDX_HEIGHTMAP_NORMALIZE].type = state ? WindowWidgetType::Checkbox : WindowWidgetType::Empty; BaseWidgets[WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP].type = state ? WindowWidgetType::Checkbox : WindowWidgetType::Empty; BaseWidgets[WIDX_HEIGHTMAP_STRENGTH].type = state ? WindowWidgetType::Spinner : WindowWidgetType::Empty; @@ -935,7 +937,7 @@ namespace OpenRCT2::Ui::Windows switch (widgetIndex) { // Page widgets - case WIDX_HEIGHTMAP_SELECT: + case WIDX_HEIGHTMAP_BROWSE: { auto intent = Intent(WindowClass::Loadsave); intent.PutExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_LOAD | LOADSAVETYPE_HEIGHTMAP); @@ -975,17 +977,27 @@ namespace OpenRCT2::Ui::Windows const bool strengthDisabled = IsWidgetDisabled(WIDX_HEIGHTMAP_STRENGTH) || !_settings.smooth_height_map; const auto strengthColour = strengthDisabled ? disabledColour : enabledColour; + // Smooth strength label DrawTextBasic( dpi, windowPos + ScreenCoordsXY{ 24, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, STR_MAPGEN_SMOOTH_STRENGTH, {}, { strengthColour }); + // Smooth strength value auto ft = Formatter(); ft.Add(_settings.smooth_strength); - DrawTextBasic( - dpi, - windowPos - + ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_STRENGTH].left + 1, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }, - STR_COMMA16, ft, { strengthColour }); + auto pos = ScreenCoordsXY{ widgets[WIDX_HEIGHTMAP_STRENGTH].left + 1, widgets[WIDX_HEIGHTMAP_STRENGTH].top + 1 }; + DrawTextBasic(dpi, windowPos + pos, STR_COMMA16, ft, { strengthColour }); + + // Current heightmap image filename + ft = Formatter(); + if (!_heightmapLoaded) + ft.Add(LanguageGetString(STR_MAPGEN_NONE_SELECTED)); + else + ft.Add(_heightmapFilename.c_str()); + + pos = ScreenCoordsXY{ 10, widgets[WIDX_HEIGHTMAP_BROWSE].top + 1 }; + auto textWidth = widgets[WIDX_HEIGHTMAP_BROWSE].left - 11; + DrawTextEllipsised(dpi, windowPos + pos, textWidth, STR_MAPGEN_CURRENT_HEIGHTMAP_FILE, ft); } #pragma endregion @@ -1507,6 +1519,7 @@ namespace OpenRCT2::Ui::Windows // The window needs to be open while using the map _heightmapLoaded = true; + _heightmapFilename = fs::u8path(path).filename().string(); SetPage(WINDOW_MAPGEN_PAGE_BASE); } } From 717501c646aa0d075f53278c54bf43becffb6dbd Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 23 Sep 2024 14:55:04 +0200 Subject: [PATCH 37/39] Make smooth strength field clickable --- data/language/en-GB.txt | 2 ++ src/openrct2-ui/UiStringIds.h | 2 ++ src/openrct2-ui/windows/MapGen.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 212e24f223..cc572a5de9 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3779,6 +3779,8 @@ STR_6704 :{COMMA2DP32} STR_6705 :Browse... STR_6706 :{WINDOW_COLOUR_2}Current image file: {BLACK}{STRING} STR_6707 :(none selected) +STR_6708 :Smooth Strength +STR_6709 :Enter Smooth Strength between {COMMA16} and {COMMA16} ############# # Scenarios # diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 84e726d306..93f1086549 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -908,6 +908,7 @@ namespace OpenRCT2 STR_ENTER_MIN_LAND = 6691, STR_ENTER_MIN_TREE_ALTITUDE = 6695, STR_ENTER_OCTAVES = 6703, + STR_ENTER_SMOOTH_STRENGTH = 6708, STR_ENTER_TREE_TO_LAND_RATIO = 6699, STR_ENTER_WATER_LEVEL = 5186, STR_HEIGHTMAP_FILE = 6681, @@ -943,6 +944,7 @@ namespace OpenRCT2 STR_MIN_TREE_ALTITUDE = 6694, STR_SIMPLEX_BASE_FREQUENCY = 6700, STR_SIMPLEX_OCTAVES = 6702, + STR_SMOOTH_STRENGTH = 6709, STR_TERRAIN_LABEL = 2693, STR_TREE_TO_LAND_RATIO = 6694, STR_WATER_LEVEL = 5185, diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index d77360db06..017fa07e48 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -492,6 +492,8 @@ namespace OpenRCT2::Ui::Windows { if (_settings.algorithm == MapGenAlgorithm::simplexNoise) SimplexTextInput(widgetIndex, value); + else if (_settings.algorithm == MapGenAlgorithm::heightmapImage) + HeightmapTextInput(widgetIndex, value); switch (widgetIndex) { @@ -954,11 +956,23 @@ namespace OpenRCT2::Ui::Windows InvalidateWidget(WIDX_HEIGHTMAP_SMOOTH_HEIGHTMAP); InvalidateWidget(WIDX_HEIGHTMAP_STRENGTH); break; + case WIDX_HEIGHTMAP_NORMALIZE: _settings.normalize_height = !_settings.normalize_height; SetCheckboxValue(WIDX_HEIGHTMAP_NORMALIZE, _settings.normalize_height); InvalidateWidget(WIDX_HEIGHTMAP_NORMALIZE); break; + + case WIDX_HEIGHTMAP_STRENGTH: + { + Formatter ft; + ft.Add(1); + ft.Add(20); + WindowTextInputOpen( + this, widgetIndex, STR_SMOOTH_STRENGTH, STR_ENTER_SMOOTH_STRENGTH, ft, STR_FORMAT_INTEGER, + _settings.smooth_strength, 2); + break; + } } } @@ -1000,6 +1014,16 @@ namespace OpenRCT2::Ui::Windows DrawTextEllipsised(dpi, windowPos + pos, textWidth, STR_MAPGEN_CURRENT_HEIGHTMAP_FILE, ft); } + void HeightmapTextInput(WidgetIndex widgetIndex, int32_t value) + { + switch (widgetIndex) + { + case WIDX_HEIGHTMAP_STRENGTH: + _settings.smooth_strength = std::clamp(value, 1, 20); + break; + } + } + #pragma endregion #pragma region Terrain page From 9231870f6df9f84e8568ce959fd48eb7e5e53591 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 23 Sep 2024 15:07:15 +0200 Subject: [PATCH 38/39] Fix typo in constant STR_ERROR_HEIGHT_MAP_TOO_BIG --- src/openrct2/localisation/StringIds.h | 2 +- src/openrct2/world/MapGen.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index 759052e089..807da1e1ba 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -1420,7 +1420,7 @@ enum : StringId STR_ERROR_READING_PNG = 6049, STR_ERROR_READING_BITMAP = 6050, - STR_ERROR_HEIHGT_MAP_TOO_BIG = 6052, + STR_ERROR_HEIGHT_MAP_TOO_BIG = 6052, STR_ERROR_CANNOT_NORMALIZE = 6053, STR_ERROR_24_BIT_BITMAP = 6054, diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index 8136dfac8d..fa61cecd59 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -739,7 +739,7 @@ bool MapGenLoadHeightmapImage(const utf8* path) auto height = std::min(image.Height, kMaximumMapSizePractical); if (width != image.Width || height != image.Height) { - ContextShowError(STR_HEIGHT_MAP_ERROR, STR_ERROR_HEIHGT_MAP_TOO_BIG, {}); + ContextShowError(STR_HEIGHT_MAP_ERROR, STR_ERROR_HEIGHT_MAP_TOO_BIG, {}); } // Allocate memory for the height map values, one byte pixel From b1cbf014503f47ade288bb6adb7666fa59af2c3c Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Mon, 30 Sep 2024 20:02:59 +0200 Subject: [PATCH 39/39] Amend changelog --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index c3c12a7dd0..61bcd94915 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -6,6 +6,7 @@ - Feature: [#22694] Park graphs have tooltips and can be resized like finance graphs. - Feature: [#22758] The table of ‘real’ peep names can now be changed using Peep Names objects. - Improved: [#22470] Android: automatically detect RCT2 installs in /sdcard/rct2. +- Improved: [#22735] The map generator has a redesigned interface that is much more user friendly. - Improved: [#22777] Add long flat-to-steep track pieces to the Wooden and Classic Wooden Roller Coasters. - Improved: [#22815] Add long flat-to-steep track pieces to the Mine Train Coaster. - Change: [#22494] Themes window now displays colours and checkboxes vertically.