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;