mirror of
http://repo.or.cz/minetest_pyramids/tsm_pyramids.git
synced 2025-01-08 23:40:18 +01:00
Refactor pyramid type selection
This commit is contained in:
parent
5abc9c1e47
commit
e0f929d8dd
80
init.lua
80
init.lua
@ -260,39 +260,12 @@ local function ground(pos, old)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Attempt to generate a pyramid in the generated area.
|
-- Select the recommended type of pyramid to use, based on the environment.
|
||||||
-- Up to one pyramid per mapchunk.
|
-- One of sandstone, desert sandstone, desert stone.
|
||||||
minetest.register_on_generated(function(minp, maxp, seed)
|
local select_pyramid_type = function(minp, maxp)
|
||||||
if maxp.y < PYRA_MIN_Y then return end
|
|
||||||
|
|
||||||
-- TODO: Use Minetests pseudo-random tools
|
|
||||||
math.randomseed(seed)
|
|
||||||
|
|
||||||
if not perlin1 then
|
|
||||||
perlin1 = minetest.get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1)
|
|
||||||
end
|
|
||||||
--[[ Make sure the pyramid doesn't bleed outside of maxp,
|
|
||||||
so it doesn't get placed incompletely by the mapgen.
|
|
||||||
This creates a bias somewhat, as this means there are some coordinates in
|
|
||||||
which pyramids cannot spawn. But it's still better to have broken pyramids.
|
|
||||||
]]
|
|
||||||
local limit = function(pos, maxp)
|
|
||||||
pos.x = math.min(pos.x, maxp.x - PYRA_W+1)
|
|
||||||
pos.y = math.min(pos.y, maxp.y - PYRA_Wh)
|
|
||||||
pos.z = math.min(pos.z, maxp.z - PYRA_W+1)
|
|
||||||
return pos
|
|
||||||
end
|
|
||||||
local noise1 = perlin1:get_2d({x=minp.x,y=minp.y})
|
|
||||||
|
|
||||||
if noise1 > 0.25 or noise1 < -0.26 then
|
|
||||||
-- Need a bit of luck to place a pyramid
|
|
||||||
if math.random(0,10) > 7 then
|
|
||||||
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, bad dice roll. minp="..minetest.pos_to_string(minp))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
||||||
|
|
||||||
|
local sand
|
||||||
local sands = {"default:sand", "default:desert_sand", "default:desert_stone"}
|
local sands = {"default:sand", "default:desert_sand", "default:desert_stone"}
|
||||||
local p2
|
local p2
|
||||||
local psand = {}
|
local psand = {}
|
||||||
@ -323,6 +296,51 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Select the material type by the most prominent node type
|
||||||
|
-- E.g. if desert sand is most prominent, we place a desert sandstone pyramid
|
||||||
|
if sand_cnt_max_id then
|
||||||
|
sand = sands[sand_cnt_max_id]
|
||||||
|
else
|
||||||
|
sand = nil
|
||||||
|
p2 = nil
|
||||||
|
end
|
||||||
|
return sand, p2
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Attempt to generate a pyramid in the generated area.
|
||||||
|
-- Up to one pyramid per mapchunk.
|
||||||
|
minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
|
if maxp.y < PYRA_MIN_Y then return end
|
||||||
|
|
||||||
|
-- TODO: Use Minetests pseudo-random tools
|
||||||
|
math.randomseed(seed)
|
||||||
|
|
||||||
|
if not perlin1 then
|
||||||
|
perlin1 = minetest.get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1)
|
||||||
|
end
|
||||||
|
--[[ Make sure the pyramid doesn't bleed outside of maxp,
|
||||||
|
so it doesn't get placed incompletely by the mapgen.
|
||||||
|
This creates a bias somewhat, as this means there are some coordinates in
|
||||||
|
which pyramids cannot spawn. But it's still better to have broken pyramids.
|
||||||
|
]]
|
||||||
|
local limit = function(pos, maxp)
|
||||||
|
pos.x = math.min(pos.x, maxp.x - PYRA_W+1)
|
||||||
|
pos.y = math.min(pos.y, maxp.y - PYRA_Wh)
|
||||||
|
pos.z = math.min(pos.z, maxp.z - PYRA_W+1)
|
||||||
|
return pos
|
||||||
|
end
|
||||||
|
local noise1 = perlin1:get_2d({x=minp.x,y=minp.y})
|
||||||
|
|
||||||
|
if noise1 > 0.25 or noise1 < -0.26 then
|
||||||
|
-- Need a bit of luck to place a pyramid
|
||||||
|
if math.random(0,10) > 7 then
|
||||||
|
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, bad dice roll. minp="..minetest.pos_to_string(minp))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local sand, p2
|
||||||
|
sand, p2 = select_pyramid_type(minp, maxp)
|
||||||
|
|
||||||
if p2 == nil then
|
if p2 == nil then
|
||||||
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, no suitable surface. minp="..minetest.pos_to_string(minp))
|
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, no suitable surface. minp="..minetest.pos_to_string(minp))
|
||||||
return
|
return
|
||||||
|
Loading…
Reference in New Issue
Block a user