add biomes table

This commit is contained in:
MihailRis
2024-08-19 17:57:09 +03:00
parent c3831afd19
commit 4bd5f1b629
4 changed files with 49 additions and 28 deletions
+15 -13
View File
@@ -4,19 +4,21 @@ sea_level = 64
-- 2 - humidity -- 2 - humidity
biome_parameters = 2 biome_parameters = 2
biome = { biomes = {
parameters = { plains = {
{value=0.5, weight=1.0}, parameters = {
{value=0.5, weight=1.0}, {value=0.5, weight=1.0},
}, {value=0.5, weight=1.0},
sea_layers = { },
{block="base:water", height=-1}, sea_layers = {
}, {block="base:water", height=-1},
layers = { },
{block="base:grass_block", height=1, below_sea_level=false}, layers = {
{block="base:dirt", height=5, below_sea_level=false}, {block="base:grass_block", height=1, below_sea_level=false},
{block="base:stone", height=-1}, {block="base:dirt", height=5, below_sea_level=false},
{block="base:bazalt", height=1}, {block="base:stone", height=-1},
{block="base:bazalt", height=1},
}
} }
} }
@@ -11,17 +11,17 @@
class LuaGeneratorScript : public GeneratorScript { class LuaGeneratorScript : public GeneratorScript {
scriptenv env; scriptenv env;
Biome biome; std::vector<Biome> biomes;
uint biomeParameters; uint biomeParameters;
uint seaLevel; uint seaLevel;
public: public:
LuaGeneratorScript( LuaGeneratorScript(
scriptenv env, scriptenv env,
Biome biome, std::vector<Biome> biomes,
uint biomeParameters, uint biomeParameters,
uint seaLevel) uint seaLevel)
: env(std::move(env)), : env(std::move(env)),
biome(std::move(biome)), biomes(std::move(biomes)),
biomeParameters(biomeParameters), biomeParameters(biomeParameters),
seaLevel(seaLevel) seaLevel(seaLevel)
{} {}
@@ -46,16 +46,18 @@ public:
} }
void prepare(const Content* content) override { void prepare(const Content* content) override {
for (auto& layer : biome.groundLayers.layers) { for (auto& biome : biomes) {
layer.rt.id = content->blocks.require(layer.block).rt.id; 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& layer : biome.seaLayers.layers) {
layer.rt.id = content->blocks.require(layer.block).rt.id;
}
} }
} }
const Biome& getBiome() const override { const std::vector<Biome>& getBiomes() const override {
return biome; return biomes;
} }
uint getBiomeParameters() const override { uint getBiomeParameters() const override {
@@ -160,14 +162,30 @@ std::unique_ptr<GeneratorScript> scripting::load_generator(
uint biomeParameters = lua::get_integer_field(L, "biome_parameters", 0, 0, 16); 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); 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<Biome> 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);
lua::pop(L); lua::pop(L);
return std::make_unique<LuaGeneratorScript>( return std::make_unique<LuaGeneratorScript>(
std::move(env), std::move(env),
std::move(biome), std::move(biomes),
biomeParameters, biomeParameters,
seaLevel); seaLevel);
} }
+1 -1
View File
@@ -61,7 +61,7 @@ public:
virtual std::shared_ptr<Heightmap> generateHeightmap( virtual std::shared_ptr<Heightmap> generateHeightmap(
const glm::ivec2& offset, const glm::ivec2& size, uint64_t seed) = 0; const glm::ivec2& offset, const glm::ivec2& size, uint64_t seed) = 0;
virtual const Biome& getBiome() const = 0; virtual const std::vector<Biome>& getBiomes() const = 0;
/// @return Number of biome parameters, that biome choosing depending on /// @return Number of biome parameters, that biome choosing depending on
virtual uint getBiomeParameters() const = 0; virtual uint getBiomeParameters() const = 0;
+2 -1
View File
@@ -56,7 +56,8 @@ void WorldGenerator::generate(
{chunkX * CHUNK_W, chunkZ * CHUNK_D}, {CHUNK_W, CHUNK_D}, seed {chunkX * CHUNK_W, chunkZ * CHUNK_D}, {CHUNK_W, CHUNK_D}, seed
); );
auto values = heightmap->getValues(); 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& groundLayers = biome.groundLayers;
const auto& seaLayers = biome.seaLayers; const auto& seaLayers = biome.seaLayers;