From 4bd5f1b6298c57a6a5c373d750f04d31e0dc130b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 19 Aug 2024 17:57:09 +0300 Subject: [PATCH] add biomes table --- res/generators/default.lua | 28 ++++++------ .../scripting/scripting_world_generation.cpp | 44 +++++++++++++------ src/world/generator/GeneratorDef.hpp | 2 +- src/world/generator/WorldGenerator.cpp | 3 +- 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/res/generators/default.lua b/res/generators/default.lua index af59f259..21fae723 100644 --- a/res/generators/default.lua +++ b/res/generators/default.lua @@ -4,19 +4,21 @@ sea_level = 64 -- 2 - humidity biome_parameters = 2 -biome = { - parameters = { - {value=0.5, weight=1.0}, - {value=0.5, weight=1.0}, - }, - sea_layers = { - {block="base:water", height=-1}, - }, - layers = { - {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}, +biomes = { + plains = { + parameters = { + {value=0.5, weight=1.0}, + {value=0.5, weight=1.0}, + }, + sea_layers = { + {block="base:water", height=-1}, + }, + layers = { + {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_world_generation.cpp b/src/logic/scripting/scripting_world_generation.cpp index 612346d6..d14a7fc8 100644 --- a/src/logic/scripting/scripting_world_generation.cpp +++ b/src/logic/scripting/scripting_world_generation.cpp @@ -11,17 +11,17 @@ class LuaGeneratorScript : public GeneratorScript { scriptenv env; - Biome biome; + std::vector biomes; uint biomeParameters; uint seaLevel; public: LuaGeneratorScript( scriptenv env, - Biome biome, + std::vector biomes, uint biomeParameters, uint seaLevel) : env(std::move(env)), - biome(std::move(biome)), + biomes(std::move(biomes)), biomeParameters(biomeParameters), seaLevel(seaLevel) {} @@ -46,16 +46,18 @@ public: } void prepare(const Content* content) override { - for (auto& layer : biome.groundLayers.layers) { - layer.rt.id = content->blocks.require(layer.block).rt.id; - } - for (auto& layer : biome.seaLayers.layers) { - layer.rt.id = content->blocks.require(layer.block).rt.id; + for (auto& biome : biomes) { + for (auto& layer : biome.groundLayers.layers) { + layer.rt.id = content->blocks.require(layer.block).rt.id; + } + for (auto& layer : biome.seaLayers.layers) { + layer.rt.id = content->blocks.require(layer.block).rt.id; + } } } - const Biome& getBiome() const override { - return biome; + const std::vector& getBiomes() const override { + return biomes; } uint getBiomeParameters() const override { @@ -160,14 +162,30 @@ std::unique_ptr scripting::load_generator( uint biomeParameters = lua::get_integer_field(L, "biome_parameters", 0, 0, 16); uint seaLevel = lua::get_integer_field(L, "sea_level", 0, 0, CHUNK_H); - lua::requirefield(L, "biome"); - Biome biome = load_biome(L, "default", biomeParameters, -1); + + std::vector biomes; + lua::requirefield(L, "biomes"); + if (!lua::istable(L, -1)) { + throw std::runtime_error("'biomes' must be a table"); + } + lua::pushnil(L); + while (lua::next(L, -2)) { + lua::pushvalue(L, -2); + std::string biomeName = lua::tostring(L, -1); + try { + biomes.push_back( + load_biome(L, biomeName, biomeParameters, -2)); + } catch (const std::runtime_error& err) { + throw std::runtime_error("biome "+biomeName+": "+err.what()); + } + lua::pop(L, 2); + } lua::pop(L); lua::pop(L); return std::make_unique( std::move(env), - std::move(biome), + std::move(biomes), biomeParameters, seaLevel); } diff --git a/src/world/generator/GeneratorDef.hpp b/src/world/generator/GeneratorDef.hpp index 2828ad42..dcc8220b 100644 --- a/src/world/generator/GeneratorDef.hpp +++ b/src/world/generator/GeneratorDef.hpp @@ -61,7 +61,7 @@ public: virtual std::shared_ptr generateHeightmap( const glm::ivec2& offset, const glm::ivec2& size, uint64_t seed) = 0; - virtual const Biome& getBiome() const = 0; + virtual const std::vector& getBiomes() const = 0; /// @return Number of biome parameters, that biome choosing depending on virtual uint getBiomeParameters() const = 0; diff --git a/src/world/generator/WorldGenerator.cpp b/src/world/generator/WorldGenerator.cpp index 3773b6f9..c18747eb 100644 --- a/src/world/generator/WorldGenerator.cpp +++ b/src/world/generator/WorldGenerator.cpp @@ -56,7 +56,8 @@ void WorldGenerator::generate( {chunkX * CHUNK_W, chunkZ * CHUNK_D}, {CHUNK_W, CHUNK_D}, seed ); auto values = heightmap->getValues(); - const auto& biome = def.script->getBiome(); + const auto& biomes = def.script->getBiomes(); + const auto& biome = biomes.at(0); const auto& groundLayers = biome.groundLayers; const auto& seaLayers = biome.seaLayers;