mirror of
http://repo.or.cz/minetest_pyramids/tsm_pyramids.git
synced 2024-12-22 15:30:19 +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
|
||||
|
||||
-- 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
|
||||
|
||||
-- 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 = {}
|
||||
@ -323,6 +296,51 @@ minetest.register_on_generated(function(minp, maxp, seed)
|
||||
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
|
||||
minetest.log("verbose", "[tsm_pyramids] Pyramid not placed, no suitable surface. minp="..minetest.pos_to_string(minp))
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user