From c5877684eb61cbb032fcf189009e8c731bd6e6f7 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sat, 17 Aug 2024 18:44:08 +0300 Subject: [PATCH] add 'below_sea_level' layer property --- res/generators/default.lua | 4 ++-- src/logic/scripting/scripting.cpp | 10 ++++++++-- src/world/generator/GeneratorDef.hpp | 1 + src/world/generator/WorldGenerator.cpp | 13 +++++++++++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/res/generators/default.lua b/res/generators/default.lua index 6ecf5f48..c35470a9 100644 --- a/res/generators/default.lua +++ b/res/generators/default.lua @@ -1,6 +1,6 @@ layers = { - {block="base:grass_block", height=1}, - {block="base:dirt", height=1}, + {block="base:grass_block", height=1, below_sea_level=false}, + {block="base:dirt", height=5, below_sea_level=false}, {block="base:stone", height=-1}, {block="base:bazalt", height=1}, } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 51345fbb..dd497b90 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -748,7 +748,13 @@ std::unique_ptr scripting::load_generator( lua::pop(L); lua::requirefield(L, "height"); int height = lua::tointeger(L, -1); - lua::pop(L, 2); + lua::pop(L); + bool below_sea_level = true; + if (lua::getfield(L, "below_sea_level")) { + below_sea_level = lua::toboolean(L, -1); + lua::pop(L); + } + lua::pop(L); if (hasResizeableLayer) { lastLayersHeight += height; @@ -759,7 +765,7 @@ std::unique_ptr scripting::load_generator( } hasResizeableLayer = true; } - layers.push_back(BlocksLayer {name, height, {}}); + layers.push_back(BlocksLayer {name, height, below_sea_level, {}}); } catch (const std::runtime_error& err) { lua::pop(L, 2); throw std::runtime_error( diff --git a/src/world/generator/GeneratorDef.hpp b/src/world/generator/GeneratorDef.hpp index 5bfd6717..263f8b4f 100644 --- a/src/world/generator/GeneratorDef.hpp +++ b/src/world/generator/GeneratorDef.hpp @@ -11,6 +11,7 @@ class Content; struct BlocksLayer { std::string block; int height; + bool below_sea_level; struct { blockid_t id; diff --git a/src/world/generator/WorldGenerator.cpp b/src/world/generator/WorldGenerator.cpp index d1b3884f..eb88c0f0 100644 --- a/src/world/generator/WorldGenerator.cpp +++ b/src/world/generator/WorldGenerator.cpp @@ -16,10 +16,11 @@ WorldGenerator::WorldGenerator( #include "util/timeutil.hpp" void WorldGenerator::generate(voxel* voxels, int chunkX, int chunkZ, int seed) { + timeutil::ScopeLogTimer log(555); auto heightmap = def.script->generateHeightmap( {chunkX*CHUNK_W, chunkZ*CHUNK_D}, {CHUNK_W, CHUNK_D} ); - timeutil::ScopeLogTimer log(555); + uint seaLevel = 64; auto values = heightmap->getValues(); const auto& layers = def.script->getLayers(); uint lastLayersHeight = def.script->getLastLayersHeight(); @@ -30,19 +31,27 @@ void WorldGenerator::generate(voxel* voxels, int chunkX, int chunkZ, int seed) { for (uint z = 0; z < CHUNK_D; z++) { for (uint x = 0; x < CHUNK_W; x++) { int height = values[z * CHUNK_W + x] * 255 + 10; - for (uint y = height+1; y < 64; y++) { + for (uint y = height+1; y <= seaLevel; y++) { voxels[vox_index(x, y, z)].id = baseWater; } uint y = height; + uint layerExtension = 0; for (const auto& layer : layers) { + if (y < seaLevel && !layer.below_sea_level) { + layerExtension = std::max(0, layer.height); + continue; + } uint layerHeight = layer.height; if (layerHeight == -1) { layerHeight = y - lastLayersHeight + 1; + } else { + layerHeight += layerExtension; } for (uint i = 0; i < layerHeight; i++, y--) { voxels[vox_index(x, y, z)].id = layer.rt.id; } + layerExtension = 0; } } }