diff options
Diffstat (limited to 'mods/vzxv_worldgen/biome.lua')
-rw-r--r-- | mods/vzxv_worldgen/biome.lua | 74 |
1 files changed, 65 insertions, 9 deletions
diff --git a/mods/vzxv_worldgen/biome.lua b/mods/vzxv_worldgen/biome.lua index 69f7533..fe573bf 100644 --- a/mods/vzxv_worldgen/biome.lua +++ b/mods/vzxv_worldgen/biome.lua @@ -13,15 +13,24 @@ end local noise_params = { elevation = { - seed = 1, - offset = -50, - scale = 50, - spread = {x=2500,y=2500,z=500}, + seed = 0xA410, + offset = -175, + scale = 100, + spread = {x=3500,y=3500,z=500}, octaves = 5, persistence = 0.8, lacunarity = 2.0, flags = "defaults, absvalue", }, + temperature = { + seed = 0xBEE, + offset = 30, + scale = 13, + spread = {x=5000,y=5000,z=500}, + octaves = 3, + persistence = 0.3, + lacunarity = 0.5, + }, } function vzxv.biome_generator:noisemap(mapname, pos) @@ -55,11 +64,20 @@ function vzxv.biome_generator:noisemap_3d(mapname, pos) return map[z][y][x] end -local water_level = 14 +local water_level = -45 + +function vzxv.biome_generator:humidity(pos) + local height = self:noisemap("elevation", pos) + local temperature = self:noisemap("temperature", pos) + local humidity = 1 - math.min((height - water_level) / 86, 1) + humidity = humidity / (math.min(temperature / 25, 1)) + return humidity +end +local bee = 0 function vzxv.biome_generator:get_biome(pos) -- TODO: underground biomes - if pos.y < -75 then + if pos.y < -175 then return "underground" -- TODO: sky biomes elseif pos.y > 120 then @@ -68,8 +86,19 @@ function vzxv.biome_generator:get_biome(pos) if self:noisemap("elevation", pos) <= water_level + 2 then return "sea" else - -- TODO: surface biomes - return "surface" + local temp = self:noisemap("temperature", pos) + local humidity = self:humidity(pos) + bee = bee + 1 + if bee % (16 * 16) == 0 then + print(temp, humidity) + end + if temp > 35 then + return "desert" + end + if humidity < 0.5 then + return "plains" + end + return "forest" end end end @@ -78,7 +107,7 @@ local id = minetest.get_content_id local biomes = {} -function biomes.surface(pos, gen) +function biomes.forest(pos, gen) local height = gen:noisemap("elevation", pos) if pos.y > height then return @@ -106,6 +135,21 @@ function biomes.surface(pos, gen) end end +function biomes.plains(pos, gen) + local height = gen:noisemap("elevation", pos) + if pos.y > height then + return + elseif pos.y == math.floor(height) then + return id "vzxv:grass" + elseif pos.y > height - 3 then + return id "vzxv:dirt" + elseif pos.y > height - 5 and math.random(2) == 1 then + return id "vzxv:dirt" + else + return id "vzxv:stone" + end +end + function biomes.sea(pos, gen) local height = gen:noisemap("elevation", pos) if pos.y > height then @@ -125,6 +169,18 @@ function biomes.sea(pos, gen) end end +function biomes.desert(pos, gen) + local height = gen:noisemap("elevation", pos) + if pos.y > height then + return + elseif pos.y > height - 4 then + return id "vzxv:sand" + else + -- sandstone? + return id "vzxv:stone" + end +end + function biomes.underground(pos) return id "vzxv:stone" end |