working mapgen
This commit is contained in:
parent
a932670ce5
commit
1e8a0a7fc9
1
init.lua
1
init.lua
@ -15,6 +15,7 @@ dofile(MP .. "/build.lua")
|
||||
dofile(MP .. "/remove.lua")
|
||||
dofile(MP .. "/chat.lua")
|
||||
dofile(MP .. "/tools.lua")
|
||||
dofile(MP .. "/mapgen.lua")
|
||||
|
||||
if minetest.get_modpath("mtt") and mtt.enabled then
|
||||
dofile(MP .. "/build.spec.lua")
|
||||
|
83
mapgen.lua
Normal file
83
mapgen.lua
Normal file
@ -0,0 +1,83 @@
|
||||
|
||||
local function select_biome(biomes, temperature, humidity)
|
||||
local selected_score = -1
|
||||
local selected_biome
|
||||
|
||||
for _, biome in ipairs(biomes) do
|
||||
local score = math.abs(temperature - biome.temperature) + math.abs(humidity - biome.humidity)
|
||||
if not selected_biome or score > selected_score then
|
||||
selected_biome = biome
|
||||
end
|
||||
end
|
||||
|
||||
return selected_biome
|
||||
end
|
||||
|
||||
function building_lib.create_mapgen(opts)
|
||||
assert(#opts.biomes > 0)
|
||||
|
||||
local map_lengths_xyz = {x=1, y=1, z=1}
|
||||
|
||||
opts.height_params = opts.height_params or {
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x=64, y=64, z=64},
|
||||
seed = 5477835,
|
||||
octaves = 2,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
opts.temperature_params = opts.temperature_params or {
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x=64, y=64, z=64},
|
||||
seed = 952995,
|
||||
octaves = 2,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
opts.humidity_params = opts.humidity_params or {
|
||||
offset = 0,
|
||||
scale = 1,
|
||||
spread = {x=128, y=128, z=128},
|
||||
seed = 2946271,
|
||||
octaves = 2,
|
||||
persist = 0.5
|
||||
}
|
||||
|
||||
local height_perlin, temperature_perlin, humidity_perlin
|
||||
|
||||
return function(minp, maxp)
|
||||
local min_mapblock = mapblock_lib.get_mapblock(minp)
|
||||
local max_mapblock = mapblock_lib.get_mapblock(maxp)
|
||||
|
||||
height_perlin = height_perlin or minetest.get_perlin_map(opts.height_params, map_lengths_xyz)
|
||||
temperature_perlin = temperature_perlin or minetest.get_perlin_map(opts.temperature_params, map_lengths_xyz)
|
||||
humidity_perlin = humidity_perlin or minetest.get_perlin_map(opts.humidity_params, map_lengths_xyz)
|
||||
|
||||
for z=min_mapblock.z,max_mapblock.z do
|
||||
for x=min_mapblock.x,max_mapblock.x do
|
||||
for y=min_mapblock.y,max_mapblock.y do
|
||||
local mapblock_pos = { x=x, y=y, z=z }
|
||||
local height_perlin_map = {}
|
||||
local temperature_perlin_map = {}
|
||||
local humidity_perlin_map = {}
|
||||
|
||||
height_perlin:get_2d_map_flat({x=mapblock_pos.x, y=mapblock_pos.z}, height_perlin_map)
|
||||
temperature_perlin:get_2d_map_flat({x=mapblock_pos.x, y=mapblock_pos.z}, temperature_perlin_map)
|
||||
humidity_perlin:get_2d_map_flat({x=mapblock_pos.x, y=mapblock_pos.z}, humidity_perlin_map)
|
||||
|
||||
local height = math.floor(math.abs(height_perlin_map[1]) * 6) -1
|
||||
local temperature = math.floor(math.abs(temperature_perlin_map[1]) * 100)
|
||||
local humidity = math.floor(math.abs(humidity_perlin_map[1]) * 100)
|
||||
|
||||
local biome = select_biome(opts.biomes, temperature, humidity)
|
||||
|
||||
if mapblock_pos.y <= height then
|
||||
building_lib.do_build_mapgen(mapblock_pos, biome.buildings.full, 0)
|
||||
end
|
||||
end --y
|
||||
end --x
|
||||
end --z
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user