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:
@@ -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 #
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ struct MapGenSettings
|
||||
|
||||
// Features (e.g. tree, rivers, lakes etc.)
|
||||
bool trees;
|
||||
bool beaches;
|
||||
|
||||
// Simplex Noise Parameters
|
||||
int32_t simplex_low;
|
||||
|
||||
Reference in New Issue
Block a user