summaryrefslogtreecommitdiff
path: root/mods/vzxv_worldgen/biome.lua
diff options
context:
space:
mode:
Diffstat (limited to 'mods/vzxv_worldgen/biome.lua')
-rw-r--r--mods/vzxv_worldgen/biome.lua74
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