Refactor pyramid type selection
This commit is contained in:
parent
5abc9c1e47
commit
e0f929d8dd
82
init.lua
82
init.lua
@ -260,6 +260,54 @@ local function ground(pos, old)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Select the recommended type of pyramid to use, based on the environment.
|
||||||
|
-- One of sandstone, desert sandstone, desert stone.
|
||||||
|
local select_pyramid_type = function(minp, maxp)
|
||||||
|
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 p2
|
||||||
|
local psand = {}
|
||||||
|
local sand
|
||||||
|
local cnt = 0
|
||||||
|
local sand_cnt_max = 0
|
||||||
|
local sand_cnt_max_id
|
||||||
|
-- Look for sand or desert stone to place the pyramid on
|
||||||
|
for s=1, #sands do
|
||||||
|
cnt = 0
|
||||||
|
local sand_cnt = 0
|
||||||
|
sand = sands[s]
|
||||||
|
psand[s] = minetest.find_node_near(mpos, 25, sand)
|
||||||
|
while cnt < 5 do
|
||||||
|
cnt = cnt+1
|
||||||
|
mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
||||||
|
local spos = minetest.find_node_near(mpos, 25, sand)
|
||||||
|
if spos ~= nil then
|
||||||
|
sand_cnt = sand_cnt + 1
|
||||||
|
if psand[s] == nil then
|
||||||
|
psand[s] = spos
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if sand_cnt > sand_cnt_max then
|
||||||
|
sand_cnt_max = sand_cnt
|
||||||
|
sand_cnt_max_id = s
|
||||||
|
p2 = psand[s]
|
||||||
|
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.
|
-- Attempt to generate a pyramid in the generated area.
|
||||||
-- Up to one pyramid per mapchunk.
|
-- Up to one pyramid per mapchunk.
|
||||||
minetest.register_on_generated(function(minp, maxp, seed)
|
minetest.register_on_generated(function(minp, maxp, seed)
|
||||||
@ -290,39 +338,9 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
|||||||
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, bad dice roll. minp="..minetest.pos_to_string(minp))
|
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, bad dice roll. minp="..minetest.pos_to_string(minp))
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
local sand, p2
|
||||||
|
sand, p2 = select_pyramid_type(minp, maxp)
|
||||||
|
|
||||||
local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
|
||||||
|
|
||||||
local sands = {"default:sand", "default:desert_sand", "default:desert_stone"}
|
|
||||||
local p2
|
|
||||||
local psand = {}
|
|
||||||
local sand
|
|
||||||
local cnt = 0
|
|
||||||
local sand_cnt_max = 0
|
|
||||||
local sand_cnt_max_id
|
|
||||||
-- Look for sand or desert stone to place the pyramid on
|
|
||||||
for s=1, #sands do
|
|
||||||
cnt = 0
|
|
||||||
local sand_cnt = 0
|
|
||||||
sand = sands[s]
|
|
||||||
psand[s] = minetest.find_node_near(mpos, 25, sand)
|
|
||||||
while cnt < 5 do
|
|
||||||
cnt = cnt+1
|
|
||||||
mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
|
|
||||||
local spos = minetest.find_node_near(mpos, 25, sand)
|
|
||||||
if spos ~= nil then
|
|
||||||
sand_cnt = sand_cnt + 1
|
|
||||||
if psand[s] == nil then
|
|
||||||
psand[s] = spos
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if sand_cnt > sand_cnt_max then
|
|
||||||
sand_cnt_max = sand_cnt
|
|
||||||
sand_cnt_max_id = s
|
|
||||||
p2 = psand[s]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
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