1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-15 11:03:00 +01:00

Make beaches around water bodies a general option for all generators

This commit is contained in:
Aaron van Geffen
2024-09-10 12:41:28 +02:00
parent 44268fd758
commit 710fbfbf9a
5 changed files with 45 additions and 19 deletions

View File

@@ -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 #

View File

@@ -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,

View File

@@ -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();
}

View File

@@ -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<std::string_view> 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<std::string_view> 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);
}
}

View File

@@ -31,6 +31,7 @@ struct MapGenSettings
// Features (e.g. tree, rivers, lakes etc.)
bool trees;
bool beaches;
// Simplex Noise Parameters
int32_t simplex_low;