Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Common subdirectories: /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/locale and ../games/ENLIVEN/mods/codercore/tsm_pyramids/locale
- Common subdirectories: /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/models and ../games/ENLIVEN/mods/codercore/tsm_pyramids/models
- Common subdirectories: /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/sounds and ../games/ENLIVEN/mods/codercore/tsm_pyramids/sounds
- Common subdirectories: /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/src and ../games/ENLIVEN/mods/codercore/tsm_pyramids/src
- Common subdirectories: /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/textures and ../games/ENLIVEN/mods/codercore/tsm_pyramids/textures
- Only in ../games/Bucket_Game/mods/codercore/tsm_pyramids: 00README
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/baseinit.lua /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/baseinit.lua
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/baseinit.lua 2019-06-29 04:19:19.000000000 -0400
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/baseinit.lua 2020-03-07 00:17:37.000000000 -0500
- @@ -1,177 +1,474 @@
- -pyramids = {}
- +local S = minetest.get_translator("tsm_pyramids")
- +
- +-- Pyramid width (must be an odd number)
- +local PYRA_W = 23
- +-- Pyramid width minus 1
- +local PYRA_Wm = PYRA_W - 1
- +-- Half of (Pyramid width minus 1)
- +local PYRA_Wh = PYRA_Wm / 2
- +
- +-- Minimum and maximum spawn heights
- +local PYRA_MIN_Y = 3
- +local PYRA_MAX_Y = 500
- +
- +tsm_pyramids = {}
- dofile(minetest.get_modpath("tsm_pyramids").."/mummy.lua")
- dofile(minetest.get_modpath("tsm_pyramids").."/nodes.lua")
- dofile(minetest.get_modpath("tsm_pyramids").."/room.lua")
- -local chest_stuff = {
- - {name="default:apple", max = 3},
- - {name="farming:bread", max = 3},
- - {name="default:steel_ingot", max = 2},
- - {name="default:gold_ingot", max = 2},
- - {name="default:diamond", max = 1},
- - {name="default:pick_steel", max = 1},
- - {name="default:pick_diamond", max = 1}
- +local mg_name = minetest.get_mapgen_setting("mg_name")
- +local chest_stuff = {
- + normal = {
- + {name="default:steel_ingot", max = 3},
- + {name="default:copper_ingot", max = 3},
- + {name="default:gold_ingot", max = 2},
- + {name="default:diamond", max = 1},
- + {name="default:pick_steel", max = 1},
- + },
- + desert_stone = {
- + {name="default:mese_crystal", max = 4},
- + {name="default:gold_ingot", max = 10},
- + {name="default:pick_diamond", max = 1},
- + },
- + desert_sandstone = {
- + {name="default:apple", max = 1},
- + {name="default:stick", max = 64},
- + {name="default:acacia_bush_sapling", max = 1},
- + {name="default:paper", max = 9},
- + {name="default:shovel_bronze", max = 1},
- + {name="default:pick_mese", max = 1},
- + },
- + sandstone = {
- + {name="default:obsidian_shard", max = 5},
- + {name="default:apple", max = 3},
- + {name="default:blueberries", max = 9},
- + {name="default:glass", max = 64},
- + {name="default:bush_sapling", max = 1},
- + {name="default:pick_bronze", max = 1},
- + },
- }
- -function pyramids.fill_chest(pos)
- - minetest.after(2, function()
- - local n = minetest.get_node(pos)
- - if n and n.name and n.name == "default:chest" then
- - local meta = minetest.get_meta(pos)
- - local inv = meta:get_inventory()
- - inv:set_size("main", 8*4)
- - if math.random(1,10) < 7 then return end
- - local stacks = {}
- - if minetest.get_modpath("treasurer") ~= nil then
- - stacks = treasurer.select_random_treasures(3,7,9,{"minetool", "food", "crafting_component"})
- - else
- - for i=0,2,1 do
- - local stuff = chest_stuff[math.random(1,#chest_stuff)]
- - if stuff.name == "farming:bread" and not minetest.get_modpath("farming") then stuff = chest_stuff[1] end
- - table.insert(stacks, {name=stuff.name, count = math.random(1,stuff.max)})
- - end
- - end
- - for s=1,#stacks do
- - if not inv:contains_item("main", stacks[s]) then
- - inv:set_stack("main", math.random(1,32), stacks[s])
- - end
- - end
- -
- - end
- - end)
- -end
- -
- -local function add_spawner(pos)
- - minetest.set_node(pos, {name="tsm_pyramids:spawner_mummy"})
- - if not minetest.setting_getbool("only_peaceful_mobs") then pyramids.spawn_mummy({x=pos.x,y=pos.y,z=pos.z-2},2) end
- +if minetest.get_modpath("farming") then
- + table.insert(chest_stuff.desert_sandstone, {name="farming:bread", max = 3})
- + table.insert(chest_stuff.sandstone, {name="farming:bread", max = 4})
- + table.insert(chest_stuff.normal, {name="farming:cotton", max = 32})
- + table.insert(chest_stuff.desert_sandstone, {name="farming:seed_cotton", max = 3})
- + table.insert(chest_stuff.desert_sandstone, {name="farming:hoe_stone", max = 1})
- +else
- + table.insert(chest_stuff.normal, {name="farming:apple", max = 8})
- + table.insert(chest_stuff.normal, {name="farming:apple", max = 3})
- +end
- +if minetest.get_modpath("tnt") then
- + table.insert(chest_stuff.normal, {name="tnt:gunpowder", max = 6})
- + table.insert(chest_stuff.desert_stone, {name="tnt:gunpowder", max = 6})
- +else
- + table.insert(chest_stuff.normal, {name="farming:apple", max = 3})
- +end
- +
- +function tsm_pyramids.fill_chest(pos, stype, flood_sand, treasure_chance)
- + local sand = "default:sand"
- + if not treasure_chance then
- + treasure_chance = 100
- + end
- + if stype == "desert_sandstone" or stype == "desert_stone" then
- + sand = "default:desert_sand"
- + end
- + local n = minetest.get_node(pos)
- + local treasure_added = false
- + if n and n.name and n.name == "default:chest" then
- + local meta = minetest.get_meta(pos)
- + local inv = meta:get_inventory()
- + inv:set_size("main", 8*4)
- + local stacks = {}
- + -- Fill with sand in sand-flooded pyramids
- + if flood_sand then
- + table.insert(stacks, {name=sand, count = math.random(1,32)})
- + end
- + -- Add treasures
- + if math.random(1,100) <= treasure_chance then
- + if minetest.get_modpath("treasurer") ~= nil then
- + stacks = treasurer.select_random_treasures(3,7,9,{"minetool", "food", "crafting_component"})
- + else
- + for i=0,2,1 do
- + local stuff = chest_stuff.normal[math.random(1,#chest_stuff.normal)]
- + table.insert(stacks, {name=stuff.name, count = math.random(1,stuff.max)})
- + end
- + if math.random(1,100) <= 75 then
- + local stuff = chest_stuff[stype][math.random(1,#chest_stuff[stype])]
- + table.insert(stacks, {name=stuff.name, count = math.random(1,stuff.max)})
- + end
- + treasure_added = true
- + end
- + end
- + for s=1,#stacks do
- + if not inv:contains_item("main", stacks[s]) then
- + inv:set_stack("main", math.random(1,32), stacks[s])
- + end
- + end
- + end
- + return treasure_added
- +end
- +
- +local function add_spawner(pos, mummy_offset)
- + minetest.set_node(pos, {name="tsm_pyramids:spawner_mummy"})
- + if not minetest.settings:get_bool("only_peaceful_mobs") then
- + for i=1,2 do
- + tsm_pyramids.attempt_mummy_spawn(pos, false)
- + end
- + end
- end
- local function can_replace(pos)
- - local n = minetest.get_node_or_nil(pos)
- - if n and n.name and minetest.registered_nodes[n.name] and not minetest.registered_nodes[n.name].walkable then
- - return true
- - elseif not n then
- - return true
- - else
- - return false
- - end
- -end
- -
- -local function underground(pos)
- - local p2 = pos
- - local cnt = 0
- - local mat = "desert_sand"
- - p2.y = p2.y-1
- - while can_replace(p2)==true do
- - cnt = cnt+1
- - if cnt > 25 then break end
- - if cnt>math.random(2,4) then mat = "desert_stone"end
- - minetest.set_node(p2, {name="default:"..mat})
- - p2.y = p2.y-1
- - end
- -end
- -
- -local function make_entrance(pos)
- - local gang = {x=pos.x+10,y=pos.y, z=pos.z}
- - for iy=2,3,1 do
- - for iz=0,6,1 do
- - minetest.remove_node({x=gang.x+1,y=gang.y+iy,z=gang.z+iz})
- - if iz >=3 and iy == 3 then
- - minetest.set_node({x=gang.x,y=gang.y+iy+1,z=gang.z+iz}, {name="default:sandstonebrick"})
- - minetest.set_node({x=gang.x+1,y=gang.y+iy+1,z=gang.z+iz}, {name="default:sandstonebrick"})
- - minetest.set_node({x=gang.x+2,y=gang.y+iy+1,z=gang.z+iz}, {name="default:sandstonebrick"})
- - end
- - end
- - end
- -end
- -
- -local function make(pos)
- - minetest.log("action", "Created pyramid at ("..pos.x..","..pos.y..","..pos.z..")")
- - for iy=0,10,1 do
- - for ix=iy,22-iy,1 do
- - for iz=iy,22-iy,1 do
- - if iy <1 then underground({x=pos.x+ix,y=pos.y,z=pos.z+iz}) end
- - minetest.set_node({x=pos.x+ix,y=pos.y+iy,z=pos.z+iz}, {name="default:sandstonebrick"})
- - for yy=1,10-iy,1 do
- - local n = minetest.get_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz})
- - if n and n.name and n.name == "default:desert_stone" then minetest.set_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz},{name="default:desert_sand"}) end
- - end
- - end
- - end
- - end
- -
- - pyramids.make_room(pos)
- - minetest.after(2, pyramids.make_traps, pos)
- - add_spawner({x=pos.x+11,y=pos.y+2, z=pos.z+17})
- - make_entrance({x=pos.x,y=pos.y, z=pos.z})
- + local n = minetest.get_node_or_nil(pos)
- + if n and n.name and minetest.registered_nodes[n.name] and not minetest.registered_nodes[n.name].walkable then
- + return true
- + elseif not n then
- + return true
- + else
- + return false
- + end
- +end
- +
- +local function make_foundation_part(pos, set_to_stone)
- + local p2 = pos
- + local cnt = 0
- + p2.y = p2.y-1
- + while can_replace(p2)==true do
- + cnt = cnt+1
- + if cnt > 25 then
- + break
- + end
- + table.insert(set_to_stone, table.copy(p2))
- + p2.y = p2.y-1
- + end
- end
- -local perl1 = {SEED1 = 9130, OCTA1 = 1, PERS1 = 0.5, SCAL1 = 25} -- Values should match minetest mapgen V7 desert noise.
- +local function make_entrance(pos, rot, brick, sand, flood_sand)
- + local roffset_arr = {
- + { x=0, y=0, z=1 }, -- front
- + { x=-1, y=0, z=0 }, -- left
- + { x=0, y=0, z=-1 }, -- back
- + { x=1, y=0, z=0 }, -- right
- + }
- + local roffset = roffset_arr[rot + 1]
- + local way
- + if rot == 0 then
- + way = vector.add(pos, {x=PYRA_Wh, y=0, z=0})
- + elseif rot == 1 then
- + way = vector.add(pos, {x=PYRA_Wm, y=0, z=PYRA_Wh})
- + elseif rot == 2 then
- + way = vector.add(pos, {x=PYRA_Wh, y=0, z=PYRA_Wm})
- + else
- + way = vector.add(pos, {x=0, y=0, z=PYRA_Wh})
- + end
- + local max_sand_height = math.random(1,3)
- + for ie=0,6,1 do
- + local sand_height = math.random(1,max_sand_height)
- + for iy=2,3,1 do
- + -- dig hallway
- + local way_dir = vector.add(vector.add(way, {x=0,y=iy,z=0}), vector.multiply(roffset, ie))
- + if flood_sand and sand ~= "ignore" and iy <= sand_height and ie >= 3 then
- + minetest.set_node(way_dir, {name=sand})
- + else
- + minetest.remove_node(way_dir)
- + end
- + -- build decoration above entrance
- + if ie == 3 and iy == 3 then
- + local deco = {x=way_dir.x, y=way_dir.y+1,z=way_dir.z}
- + minetest.set_node(deco, {name=brick})
- + if rot == 0 or rot == 2 then
- + minetest.set_node(vector.add(deco, {x=-1, y=0, z=0}), {name=brick})
- + minetest.set_node(vector.add(deco, {x=1, y=0, z=0}), {name=brick})
- + else
- + minetest.set_node(vector.add(deco, {x=0, y=0, z=-1}), {name=brick})
- + minetest.set_node(vector.add(deco, {x=0, y=0, z=1}), {name=brick})
- + end
- + end
- + end
- + end
- +end
- +
- +local function make_pyramid(pos, brick, sandstone, stone, sand)
- + local set_to_brick = {}
- + local set_to_stone = {}
- + -- Build pyramid
- + for iy=0,math.random(10,PYRA_Wh),1 do
- + for ix=iy,PYRA_W-1-iy,1 do
- + for iz=iy,PYRA_W-1-iy,1 do
- + if iy < 1 then
- + make_foundation_part({x=pos.x+ix,y=pos.y,z=pos.z+iz}, set_to_stone)
- + end
- + table.insert(set_to_brick, {x=pos.x+ix,y=pos.y+iy,z=pos.z+iz})
- + end
- + end
- + end
- + minetest.bulk_set_node(set_to_stone , {name=stone})
- + minetest.bulk_set_node(set_to_brick, {name=brick})
- +end
- +
- +local function make(pos, brick, sandstone, stone, sand, ptype, room_id)
- + local bpos = table.copy(pos)
- + -- Build pyramid
- + make_pyramid(bpos, brick, sandstone, stone, sand)
- +
- + local rot = math.random(0, 3)
- + -- Build room
- + local ok, msg, flood_sand = tsm_pyramids.make_room(bpos, ptype, room_id, rot)
- + -- Place mummy spawner
- + local r = math.random(1,3)
- + -- 4 possible spawner positions
- + local spawner_posses = {
- + -- front
- + {{x=bpos.x+PYRA_Wh,y=bpos.y+2, z=bpos.z+5}, {x=0, y=0, z=2}},
- + -- left
- + {{x=bpos.x+PYRA_Wm-5,y=bpos.y+2, z=bpos.z+PYRA_Wh}, {x=-2, y=0, z=0}},
- + -- back
- + {{x=bpos.x+PYRA_Wh,y=bpos.y+2, z=bpos.z+PYRA_W-5}, {x=0, y=0, z=-2}},
- + -- right
- + {{x=bpos.x+5,y=bpos.y+2, z=bpos.z+PYRA_Wh}, {x=2, y=0, z=0}},
- + }
- + -- Delete the spawner position in which the entrance will be placed
- + table.remove(spawner_posses, (rot % 4) + 1)
- + add_spawner(spawner_posses[r][1], spawner_posses[r][2])
- + -- Build entrance
- + make_entrance(bpos, rot, brick, sand, flood_sand)
- + -- Done
- + minetest.log("action", "[tsm_pyramids] Created pyramid at "..minetest.pos_to_string(bpos)..".")
- + return ok, msg
- +end
- +
- +local perl1 = { SEED1 = 9130, OCTA1 = 1, PERS1 = 0.5, SCAL1 = 25 } -- Values should match minetest mapgen V7 desert noise
- +
- +local perlin1 -- perlin noise buffer
- local function hlp_fnct(pos, name)
- - local n = minetest.get_node_or_nil(pos)
- - if n and n.name and n.name == name then
- - return true
- - else
- - return false
- - end
- + local n = minetest.get_node_or_nil(pos)
- + if n and n.name and n.name == name then
- + return true
- + else
- + return false
- + end
- end
- local function ground(pos, old)
- - local p2 = pos
- - while hlp_fnct(p2, "air") do
- - p2.y = p2.y -1
- - end
- - if p2.y < old.y then
- - return p2
- - else
- - return old
- - end
- + local p2 = table.copy(pos)
- + while hlp_fnct(p2, "air") do
- + p2.y = p2.y -1
- + end
- + if p2.y < old.y then
- + return {x=old.x, y=p2.y, z=old.z}
- + else
- + return old
- + 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.
- +-- Up to one pyramid per mapchunk.
- minetest.register_on_generated(function(minp, maxp, seed)
- - if maxp.y < 0 or maxp.y > 50 then return end
- - math.randomseed(seed)
- - local cnt = 0
- -
- - local perlin1 = minetest.env:get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1)
- - local noise1 = perlin1:get2d({x=minp.x,y=minp.y})--,z=minp.z})
- -
- - if noise1 > 0.25 or noise1 < -0.26 then
- - local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
- -
- - local p2 = minetest.find_node_near(mpos, 10, {"default:desert_sand"})
- - while p2 == nil and 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)}
- - p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"})
- - end
- - if p2 == nil then return end
- - if p2.y < 0 then return end
- -
- - local off = 0
- - local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22}
- - local opos2 = {x=p2.x+22,y=p2.y-1,z=p2.z}
- - local opos3 = {x=p2.x,y=p2.y-1,z=p2.z+22}
- - local opos1_n = minetest.get_node_or_nil(opos1)
- - local opos2_n = minetest.get_node_or_nil(opos2)
- - local opos3_n = minetest.get_node_or_nil(opos3)
- - if opos1_n and opos1_n.name and opos1_n.name == "air" then
- - p2 = ground(opos1, p2)
- - end
- - if opos2_n and opos2_n.name and opos2_n.name == "air" then
- - p2 = ground(opos2, p2)
- - end
- - if opos3_n and opos3_n.name and opos3_n.name == "air" then
- - p2 = ground(opos3, p2)
- - end
- - p2.y = p2.y - 3
- - if p2.y < 0 then p2.y = 0 end
- - if minetest.find_node_near(p2, 85, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 85, {"default:sandstonebrick"}) ~= nil then return end
- -
- - if math.random(0,10) > 7 then return end
- - minetest.after(0.8,make,p2)
- - end
- + if maxp.y < PYRA_MIN_Y or maxp.y > PYRA_MAX_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
- + 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]
- + end
- + if p2.y < PYRA_MIN_Y or p2.y > PYRA_MAX_Y then
- + minetest.log("info", "[tsm_pyramids] Not placed, Y out of range. p2="..minetest.pos_to_string(p2))
- + return
- + end
- + -- Now sink the pyramid until each corner of it is no longer floating in mid-air
- + p2 = limit(p2, maxp)
- + local oposses = {
- + {x=p2.x,y=p2.y-1,z=p2.z},
- + {x=p2.x+PYRA_Wm,y=p2.y-1,z=p2.z+PYRA_Wm},
- + {x=p2.x+PYRA_Wm,y=p2.y-1,z=p2.z},
- + {x=p2.x,y=p2.y-1,z=p2.z+PYRA_Wm},
- + }
- + for o=1, #oposses do
- + local opos = oposses[o]
- + local n = minetest.get_node_or_nil(opos)
- + if n and n.name and n.name == "air" then
- + local old = table.copy(p2)
- + p2 = ground(opos, p2)
- + end
- + end
- + -- Random bonus sinking
- + p2.y = math.max(p2.y - math.random(0,3), PYRA_MIN_Y)
- +
- + -- Bad luck, we have hit the chunk border!
- + if p2.y < minp.y then
- + minetest.log("info", "[tsm_pyramids] Pyramid not placed, sunken too much. p2="..minetest.pos_to_string(p2))
- + return
- + end
- +
- + -- Make sure the pyramid is not near a "killer" node, like water
- + local middle = vector.add(p2, {x=PYRA_Wh, y=0, z=PYRA_Wh})
- + if minetest.find_node_near(p2, 5, {"default:water_source"}) ~= nil or
- + minetest.find_node_near(vector.add(p2, {x=PYRA_W, y=0, z=0}), 5, {"default:water_source"}) ~= nil or
- + minetest.find_node_near(vector.add(p2, {x=0, y=0, z=PYRA_W}), 5, {"default:water_source"}) ~= nil or
- + minetest.find_node_near(vector.add(p2, {x=PYRA_W, y=0, z=PYRA_W}), 5, {"default:water_source"}) ~= nil or
- +
- + minetest.find_node_near(middle, PYRA_W, {"default:dirt_with_grass"}) ~= nil or
- + minetest.find_node_near(middle, 52, {"default:sandstonebrick", "default:desert_sandstone_brick", "default:desert_stonebrick"}) ~= nil or
- + minetest.find_node_near(middle, PYRA_Wh + 3, {"default:cactus", "group:leaves", "group:tree"}) ~= nil then
- + minetest.log("info", "[tsm_pyramids] Pyramid not placed, inappropriate node nearby. p2="..minetest.pos_to_string(p2))
- + return
- + end
- +
- + -- Bonus chance to spawn a sandstone pyramid in v6 desert because otherwise they would be too rare in v6
- + if (mg_name == "v6" and sand == "default:desert_sand" and math.random(1, 2) == 1) then
- + sand = "default:sand"
- + end
- +
- + -- Desert stone pyramids only generate in areas with almost no sand
- + if sand == "default:desert_stone" then
- + local nodes = minetest.find_nodes_in_area(vector.add(p2, {x=-1, y=-2, z=-1}), vector.add(p2, {x=PYRA_W+1, y=PYRA_Wh, z=PYRA_W+1}), {"group:sand"})
- + if #nodes > 5 then
- + sand = "default:desert_sand"
- + end
- + end
- +
- + -- Generate the pyramid!
- + if sand == "default:desert_sand" then
- + -- Desert sandstone pyramid
- + make(p2, "default:desert_sandstone_brick", "default:desert_sandstone", "default:desert_stone", "default:desert_sand", "desert_sandstone")
- + elseif sand == "default:sand" then
- + -- Sandstone pyramid
- + make(p2, "default:sandstonebrick", "default:sandstone", "default:sandstone", "default:sand", "sandstone")
- + else
- + -- Desert stone pyramid
- + make(p2, "default:desert_stonebrick", "default:desert_stone_block", "default:desert_stone", "ignore", "desert_stone")
- + end
- + end
- end)
- +
- +-- Add backwards-compability for nodes from the original pyramids mod
- +if minetest.get_modpath("pyramids") == nil then
- + -- Nodes
- + minetest.register_alias("pyramids:trap", "tsm_pyramids:trap")
- + minetest.register_alias("pyramids:trap_2", "tsm_pyramids:trap_2")
- + minetest.register_alias("pyramids:deco_stone1", "tsm_pyramids:deco_stone1")
- + minetest.register_alias("pyramids:deco_stone2", "tsm_pyramids:deco_stone2")
- + minetest.register_alias("pyramids:deco_stone3", "tsm_pyramids:deco_stone3")
- + minetest.register_alias("pyramids:spawner_mummy", "tsm_pyramids:spawner_mummy")
- +end
- +
- +minetest.register_chatcommand("spawnpyramid", {
- + description = S("Generate a pyramid"),
- + params = S("[<room_type>]"),
- + privs = { server = true },
- + func = function(name, param)
- + local player = minetest.get_player_by_name(name)
- + if not player then
- + return false, S("No player.")
- + end
- + local pos = player:get_pos()
- + pos = vector.round(pos)
- + local s = math.random(1,3)
- + local r = tonumber(param)
- + local room_id
- + if r then
- + room_id = r
- + end
- + local ok, msg
- + pos = vector.add(pos, {x=-PYRA_Wh, y=-1, z=0})
- + if s == 1 then
- + -- Sandstone
- + ok, msg = make(pos, "default:sandstonebrick", "default:sandstone", "default:sandstone", "default:sand", "sandstone", room_id)
- + elseif s == 2 then
- + -- Desert sandstone
- + ok, msg = make(pos, "default:desert_sandstone_brick", "default:desert_sandstone", "default:desert_stone", "default:desert_sand", "desert_sandstone", room_id)
- + else
- + -- Desert stone
- + ok, msg = make(pos, "default:desert_stonebrick", "default:desert_stone_block", "default:desert_stone", "ignore", "desert_stone", room_id)
- + end
- + if ok then
- + return true, S("Pyramid generated at @1.", minetest.pos_to_string(pos))
- + else
- + return false, msg
- + end
- + end,
- + }
- +)
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/bucket-tsm_pyramids.patch /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/bucket-tsm_pyramids.patch
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/bucket-tsm_pyramids.patch 2019-06-29 04:17:47.000000000 -0400
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/bucket-tsm_pyramids.patch 2020-03-07 00:03:19.000000000 -0500
- @@ -1,50 +1,46 @@
- --- tsm_pyramids.old/init.lua
- +++ tsm_pyramids/init.lua
- -@@ -132,7 +132,7 @@
- +@@ -6,8 +6,10 @@
- + local PYRA_Wm = PYRA_W - 1
- + -- Half of (Pyramid width minus 1)
- + local PYRA_Wh = PYRA_Wm / 2
- +--- Minimum spawn height
- ++
- ++-- Minimum and maximum spawn heights
- + local PYRA_MIN_Y = 3
- ++local PYRA_MAX_Y = 500
- + tsm_pyramids = {}
- - minetest.register_on_generated(function(minp, maxp, seed)
- -- if maxp.y < 0 then return end
- -+ if maxp.y < 0 or maxp.y > 500 then return end
- - math.randomseed(seed)
- - local cnt = 0
- -
- -====== end of patch ======
- ---- tsm_pyramids.old/init.lua
- -+++ tsm_pyramids/init.lua
- -@@ -108,7 +108,7 @@
- - make_entrance({x=pos.x,y=pos.y, z=pos.z})
- +@@ -237,7 +239,8 @@
- + return ok, msg
- end
- -local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise.
- -+local perl1 = {SEED1 = 9130, OCTA1 = 1, PERS1 = 0.5, SCAL1 = 25} -- Values should match minetest mapgen V7 desert noise.
- ++local perl1 = { SEED1 = 9130, OCTA1 = 1, PERS1 = 0.5, SCAL1 = 25 } -- Values should match minetest mapgen V7 desert noise
- ++
- + local perlin1 -- perlin noise buffer
- local function hlp_fnct(pos, name)
- - local n = minetest.get_node_or_nil(pos)
- -@@ -132,7 +132,7 @@
- -
- +@@ -310,8 +313,9 @@
- + -- 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 < 0 or maxp.y > 500 then return end
- -+ if maxp.y < 0 or maxp.y > 50 then return end
- - math.randomseed(seed)
- - local cnt = 0
- +- if maxp.y < PYRA_MIN_Y then return end
- ++ if maxp.y < PYRA_MIN_Y or maxp.y > PYRA_MAX_Y then return end
- -@@ -142,7 +142,7 @@
- - if noise1 > 0.25 or noise1 < -0.26 then
- - local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)}
- -
- -- local p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"})
- -+ local p2 = minetest.find_node_near(mpos, 10, {"default:desert_sand"})
- - while p2 == nil and 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)}
- -@@ -169,7 +169,7 @@
- + -- TODO: Use Minetests pseudo-random tools
- + math.randomseed(seed)
- +@@ -350,8 +354,8 @@
- + if sand_cnt_max_id then
- + sand = sands[sand_cnt_max_id]
- + end
- +- if p2.y < PYRA_MIN_Y then
- +- minetest.log("info", "[tsm_pyramids] Pyramid not placed, too deep. p2="..minetest.pos_to_string(p2))
- ++ if p2.y < PYRA_MIN_Y or p2.y > PYRA_MAX_Y then
- ++ minetest.log("info", "[tsm_pyramids] Not placed, Y out of range. p2="..minetest.pos_to_string(p2))
- + return
- end
- - p2.y = p2.y - 3
- - if p2.y < 0 then p2.y = 0 end
- -- if minetest.find_node_near(p2, 25, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 52, {"default:sandstonebrick"}) ~= nil then return end
- -+ if minetest.find_node_near(p2, 85, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 85, {"default:sandstonebrick"}) ~= nil then return end
- -
- - if math.random(0,10) > 7 then return end
- - minetest.after(0.8,make,p2)
- + -- Now sink the pyramid until each corner of it is no longer floating in mid-air
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/depends.txt /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/depends.txt
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/depends.txt 2019-03-16 19:53:10.000000000 -0400
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/depends.txt 2020-03-07 00:17:26.000000000 -0500
- @@ -1,3 +1,7 @@
- +awards?
- +cmi?
- default
- +doc_items?
- farming?
- +tnt?
- treasurer?
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/init.lua /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/init.lua
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/init.lua 2018-12-22 00:56:36.000000000 -0500
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/init.lua 2020-03-07 00:22:26.000000000 -0500
- @@ -1,7 +1,6 @@
- local modname = minetest.get_current_modname()
- local modpath = minetest.get_modpath (modname)
- -if minetest.setting_getbool("enable_tsm_pyramids") or
- - minetest.setting_getbool("enable_wonder" ) then
- +if minetest.setting_getbool ("enable_tsm_pyramids") then
- dofile (modpath .. "/baseinit.lua")
- end
- Only in /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids: locale
- Common subdirectories: ../games/Bucket_Game/mods/codercore/tsm_pyramids/models and /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/models
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/mummy.lua /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/mummy.lua
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/mummy.lua 2015-02-07 09:12:28.000000000 -0500
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/mummy.lua 2019-09-02 14:45:11.000000000 -0400
- @@ -1,4 +1,6 @@
- ---pyramids = {}
- +local S = minetest.get_translator("tsm_pyramids")
- +
- +local mod_cmi = minetest.get_modpath("cmi") ~= nil
- local mummy_walk_limit = 1
- local mummy_chillaxin_speed = 1
- @@ -16,24 +18,24 @@
- local sound_hit = "mummy_hurt"
- local sound_dead = "mummy_death"
- -local spawner_range = 17
- +local spawner_check_range = 17
- local spawner_max_mobs = 6
- local function get_animations()
- - return {
- - stand_START = 74,
- - stand_END = 74,
- - sit_START = 81,
- - sit_END = 160,
- - lay_START = 162,
- - lay_END = 166,
- - walk_START = 74,
- - walk_END = 105,
- - mine_START = 74,
- - mine_END = 105,
- - walk_mine_START = 74,
- - walk_mine_END = 105
- - }
- + return {
- + stand_START = 74,
- + stand_END = 74,
- + sit_START = 81,
- + sit_END = 160,
- + lay_START = 162,
- + lay_END = 166,
- + walk_START = 74,
- + walk_END = 105,
- + mine_START = 74,
- + mine_END = 105,
- + walk_mine_START = 74,
- + walk_mine_END = 105
- + }
- end
- local npc_model = {}
- @@ -46,292 +48,312 @@
- local ANIM_WALK_MINE = 5
- local ANIM_MINE = 6
- -function hit(self)
- - prop = {
- - mesh = mummy_mesh,
- - textures = {"tsm_pyramids_mummy.png^tsm_pyramids_hit.png"},
- - }
- - self.object:set_properties(prop)
- - minetest.after(0.4, function()
- - prop = {textures = mummy_texture,}
- - self.object:set_properties(prop)
- - end)
- -end
- -
- -function mummy_update_visuals_def(self)
- - --local name = get_player_name()
- - visual = default_model_def
- - npc_anim = 0 -- Animation will be set further below immediately
- - --npc_sneak[name] = false
- - prop = {
- - mesh = mummy_mesh,
- - textures = mummy_texture,
- - --visual_size = {x=1, y=1, z=1},
- - }
- - self.object:set_properties(prop)
- -end
- -
- -MUMMY_DEF = {
- - physical = true,
- - collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4},
- - visual = "mesh",
- - visual_size = {x=8,y=8},
- - mesh = mummy_mesh,
- - textures = mummy_texture,
- - makes_footstep_sound = true,
- - npc_anim = 0,
- - timer = 0,
- - turn_timer = 0,
- - vec = 0,
- - yaw = 0,
- - yawwer = 0,
- - state = 1,
- - jump_timer = 0,
- - punch_timer = 0,
- - sound_timer = 0,
- - attacker = "",
- - attacking_timer = 0,
- - mob_name = "mummy"
- +local function hit(self)
- + local prop = {
- + mesh = mummy_mesh,
- + textures = {"tsm_pyramids_mummy.png^tsm_pyramids_hit.png"},
- + }
- + self.object:set_properties(prop)
- + minetest.after(0.4, function(self)
- + local prop = {textures = mummy_texture,}
- + if self ~= nil and self.object ~= nil then
- + self.object:set_properties(prop)
- + end
- + end, self)
- +end
- +
- +local function mummy_update_visuals_def(self)
- + npc_anim = 0 -- Animation will be set further below immediately
- + local prop = {
- + mesh = mummy_mesh,
- + textures = mummy_texture,
- + }
- + self.object:set_properties(prop)
- +end
- +
- +local MUMMY_DEF = {
- + hp_max = mummy_hp,
- + physical = true,
- + collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4},
- + visual = "mesh",
- + visual_size = {x=8,y=8},
- + mesh = mummy_mesh,
- + textures = mummy_texture,
- + makes_footstep_sound = true,
- + npc_anim = 0,
- + timer = 0,
- + turn_timer = 0,
- + vec = 0,
- + yaw = 0,
- + yawwer = 0,
- + state = 1,
- + jump_timer = 0,
- + punch_timer = 0,
- + sound_timer = 0,
- + envdmg_timer = 0,
- + attacker = "",
- + attacking_timer = 0,
- +
- + -- CMI stuff
- + -- Track last cause of damage for cmi.notify_die
- + last_damage_cause = { type = "unknown" },
- + _cmi_is_mob = true,
- + description = S("Mummy"),
- }
- -spawner_DEF = {
- - hp_max = 1,
- - physical = true,
- - collisionbox = {0,0,0,0,0,0},
- - visual = "mesh",
- - visual_size = {x=3.3,y=3.3},
- - mesh = mummy_mesh,
- - textures = mummy_texture,
- - makes_footstep_sound = false,
- - timer = 0,
- - automatic_rotate = math.pi * 2.9,
- - m_name = "dummy"
- +local spawner_DEF = {
- + hp_max = 1,
- + physical = false,
- + pointable = false,
- + visual = "mesh",
- + visual_size = {x=3.3,y=3.3},
- + mesh = mummy_mesh,
- + textures = mummy_texture,
- + makes_footstep_sound = false,
- + timer = 0,
- + automatic_rotate = math.pi * 2.9,
- }
- spawner_DEF.on_activate = function(self)
- - mummy_update_visuals_def(self)
- - self.object:setvelocity({x=0, y=0, z=0})
- - self.object:setacceleration({x=0, y=0, z=0})
- - self.object:set_armor_groups({immortal=1})
- + mummy_update_visuals_def(self)
- + self.object:set_velocity({x=0, y=0, z=0})
- + self.object:set_acceleration({x=0, y=0, z=0})
- + self.object:set_armor_groups({immortal=1})
- end
- spawner_DEF.on_step = function(self, dtime)
- - self.timer = self.timer + 0.01
- - local n = minetest.get_node_or_nil(self.object:getpos())
- - if self.timer > 1 then
- - if n and n.name and n.name ~= "tsm_pyramids:spawner_mummy" then
- - self.object:remove()
- - end
- - end
- + self.timer = self.timer + 0.01
- + local n = minetest.get_node_or_nil(self.object:get_pos())
- + if self.timer > 1 then
- + if n and n.name and n.name ~= "tsm_pyramids:spawner_mummy" then
- + self.object:remove()
- + end
- + end
- end
- spawner_DEF.on_punch = function(self, hitter)
- end
- -MUMMY_DEF.on_activate = function(self)
- - mummy_update_visuals_def(self)
- - self.anim = get_animations()
- - self.object:set_animation({x=self.anim.stand_START,y=self.anim.stand_END}, mummy_animation_speed, mummy_animation_blend)
- - self.npc_anim = ANIM_STAND
- - self.object:setacceleration({x=0,y=-20,z=0})--20
- - self.state = 1
- - self.object:set_hp(mummy_hp)
- - self.object:set_armor_groups({fleshy=130})
- -end
- -
- -MUMMY_DEF.on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir)
- -
- - --attack as group
- - --[[for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 5)) do
- - if not object:is_player() then
- - if object:get_luaentity().name == "peaceful_npc:npc_def" then
- - object:get_luaentity().state = 3
- - object:get_luaentity().attacker = puncher:get_player_name()
- - end
- - end
- - end]]
- -
- - --if self.state ~= 3 then
- - --self.state = 3
- - self.attacker = puncher--:get_player_name()
- - --end
- -
- - if puncher ~= nil then
- - local sound = sound_hit
- - if self.object:get_hp() == 0 then sound = sound_dead end
- - minetest.sound_play(sound, {to_player = puncher:get_player_name(), loop = false, gain = 0.3})
- - if time_from_last_punch >= 0.45 then
- - hit(self)
- - --local dir = puncher:get_look_dir()
- - --self.direction = dir
- - self.direction = {x=self.object:getvelocity().x, y=self.object:getvelocity().y, z=self.object:getvelocity().z}
- - self.punch_timer = 0
- - self.object:setvelocity({x=dir.x*mummy_chillaxin_speed,y=5,z=dir.z*mummy_chillaxin_speed})--self.object:setvelocity({x=dir.x*4,y=5,z=dir.z*4})
- - if self.state == 1 then
- - self.state = 8
- - elseif self.state >= 2 then
- - self.state = 9
- - end
- - end
- - end
- -
- - if self.object:get_hp() == 0 then
- - local obj = minetest.env:add_item(self.object:getpos(), mummy_drop.." "..math.random(0,3))
- - end
- +MUMMY_DEF.on_activate = function(self, staticdata, dtime_s)
- + if mod_cmi then
- + cmi.notify_activate(self, dtime_s)
- + end
- + mummy_update_visuals_def(self)
- + self.anim = get_animations()
- + self.object:set_animation({x=self.anim.stand_START,y=self.anim.stand_END}, mummy_animation_speed, mummy_animation_blend)
- + self.npc_anim = ANIM_STAND
- + self.object:set_acceleration({x=0,y=-20,z=0})--20
- + self.state = 1
- + self.object:set_armor_groups({fleshy=130})
- +end
- +
- +MUMMY_DEF.on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
- + if mod_cmi then
- + cmi.notify_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
- + end
- + self.attacker = puncher
- +
- + if damage > 0 then
- + self.last_damage = {
- + type = "punch",
- + puncher = puncher,
- + }
- + end
- + if puncher ~= nil then
- + minetest.sound_play(sound_hit, {pos = self.object:get_pos(), loop = false, max_hear_distance = 10, gain = 0.4})
- + if time_from_last_punch >= 0.45 then
- + hit(self)
- + self.direction = {x=self.object:get_velocity().x, y=self.object:get_velocity().y, z=self.object:get_velocity().z}
- + self.punch_timer = 0
- + self.object:set_velocity({x=dir.x*mummy_chillaxin_speed,y=5,z=dir.z*mummy_chillaxin_speed})
- + if self.state == 1 then
- + self.state = 8
- + elseif self.state >= 2 then
- + self.state = 9
- + end
- + end
- + end
- +end
- +
- +MUMMY_DEF.on_death = function(self, killer)
- + minetest.sound_play(sound_dead, {pos = self.object:get_pos(), max_hear_distance = 10 , gain = 0.3})
- + -- Drop item on death
- + local count = math.random(0,3)
- + if count > 0 then
- + local pos = self.object:get_pos()
- + pos.y = pos.y + 1.0
- + minetest.add_item(pos, mummy_drop .. " " .. count)
- + end
- + if mod_cmi then
- + cmi.notify_die(self, self.last_damage)
- + end
- end
- - local cnt1 = 0
- - local cnt2 = 0
- -
- MUMMY_DEF.on_step = function(self, dtime)
- - self.timer = self.timer + 0.01
- - self.turn_timer = self.turn_timer + 0.01
- - self.jump_timer = self.jump_timer + 0.01
- - self.punch_timer = self.punch_timer + 0.01
- - self.attacking_timer = self.attacking_timer + 0.01
- - self.sound_timer = self.sound_timer + 0.01
- -
- - local current_pos = self.object:getpos()
- - local current_node = minetest.env:get_node(current_pos)
- - if self.time_passed == nil then
- - self.time_passed = 0
- - end
- -
- - --self.time_passed = self.time_passed + dtime
- - if self.object:get_hp() == 0 then-- self.object:remove() end
- -
- - --if self.time_passed >= 5 then
- - minetest.sound_play(sound_dead, {pos = current_pos, max_hear_distance = 10 , gain = 0.3})
- - self.object:remove()
- - end--else
- - if current_node.name == "default:water_source" or current_node.name == "default:water_flowing" or current_node.name == "default:lava_source" or current_node.name == "default:lava_flowing" then
- - --self.time_passed = self.time_passed + dtime
- - self.sound_timer = self.sound_timer + dtime
- - if self.sound_timer >= 0.8 then
- - self.sound_timer = 0
- - self.object:set_hp(self.object:get_hp()-5)
- - hit(self)
- - minetest.sound_play(sound_hit, {pos = current_pos, max_hear_distance = 10, gain = 0.3})
- - end
- - else
- - self.time_passed = 0
- - end
- - --end
- -
- - --update moving state every 1 or 2 seconds
- - if self.state < 3 then
- - if self.timer > math.random(1,2) then
- - if self.attacker == "" then
- - self.state = math.random(1,2)
- - else self.state = 1 end
- - self.timer = 0
- - end
- - end
- -
- - --play sound
- - if self.sound_timer > math.random(5,35) then
- - minetest.sound_play(sound_normal, {pos = current_pos, max_hear_distance = 10, gain = 0.2})
- - self.sound_timer = 0
- - end
- -
- - --after punched
- - if self.state >= 8 then
- - if self.punch_timer > 0.15 then
- - --self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- - if self.state == 9 then
- - self.object:setvelocity({x=self.direction.x*mummy_chillaxin_speed,y=-20,z=self.direction.z*mummy_chillaxin_speed})
- - self.state = 2
- - elseif self.state == 8 then
- - self.object:setvelocity({x=0,y=-20,z=0})
- - self.state = 1
- - end
- - end
- - end
- -
- - --STANDING
- - if self.state == 1 then
- - self.yawwer = true
- - self.attacker = ""
- - for _,object in ipairs(minetest.env:get_objects_inside_radius(self.object:getpos(), 4)) do
- - if object:is_player() then
- - self.yawwer = false
- - NPC = self.object:getpos()
- - PLAYER = object:getpos()
- - self.vec = {x=PLAYER.x-NPC.x, y=PLAYER.y-NPC.y, z=PLAYER.z-NPC.z}
- - self.yaw = math.atan(self.vec.z/self.vec.x)+math.pi^2
- - if PLAYER.x > NPC.x then
- - self.yaw = self.yaw + math.pi
- - end
- - self.yaw = self.yaw - 2
- - self.object:setyaw(self.yaw)
- - self.attacker = object--:get_player_name()
- - end
- - end
- -
- - if self.attacker == "" and self.turn_timer > math.random(1,4) then--and yawwer == true then
- - self.yaw = 360 * math.random()
- - self.object:setyaw(self.yaw)
- - self.turn_timer = 0
- - self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- - end
- - self.object:setvelocity({x=0,y=self.object:getvelocity().y,z=0})
- - if self.npc_anim ~= ANIM_STAND then
- - self.anim = get_animations()
- - self.object:set_animation({x=self.anim.stand_START,y=self.anim.stand_END}, mummy_animation_speed, mummy_animation_blend)
- - self.npc_anim = ANIM_STAND
- - end
- - if self.attacker ~= "" then
- - self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- - self.state = 2
- - end
- - end
- - --WALKING
- - if self.state == 2 then
- -
- - if self.direction ~= nil then
- - self.object:setvelocity({x=self.direction.x*mummy_chillaxin_speed,y=self.object:getvelocity().y,z=self.direction.z*mummy_chillaxin_speed})
- - end
- - if self.turn_timer > math.random(1,4) and not self.attacker then
- - self.yaw = 360 * math.random()
- - self.object:setyaw(self.yaw)
- - self.turn_timer = 0
- - self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- - --self.object:setvelocity({x=self.direction.x,y=self.object:getvelocity().y,z=direction.z})
- - --self.object:setacceleration(self.direction)
- - end
- - if self.npc_anim ~= ANIM_WALK then
- - self.anim = get_animations()
- - self.object:set_animation({x=self.anim.walk_START,y=self.anim.walk_END}, mummy_animation_speed, mummy_animation_blend)
- - self.npc_anim = ANIM_WALK
- - end
- - --[[jump
- - if self.direction ~= nil then
- - if self.jump_timer > 0.3 then
- - if minetest.env:get_node({x=self.object:getpos().x + self.direction.x,y=self.object:getpos().y-1,z=self.object:getpos().z + self.direction.z}).name ~= "air" then
- - self.object:setvelocity({x=self.object:getvelocity().x,y=5,z=self.object:getvelocity().z})
- - self.jump_timer = 0
- - end
- - end
- - end]]
- -
- - if self.attacker ~= "" and minetest.setting_getbool("enable_damage") then
- - local s = self.object:getpos()
- - local p = self.attacker:getpos()
- - if (s ~= nil and p ~= nil) then
- - local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5
- -
- - if dist < 2 and self.attacking_timer > 0.6 then
- - self.attacker:punch(self.object, 1.0, {
- - full_punch_interval=1.0,
- - damage_groups = {fleshy=1}
- - })
- - self.attacking_timer = 0
- - end
- - end
- - end
- - end
- + if mod_cmi then
- + cmi.notify_step(self, dtime)
- + end
- + self.timer = self.timer + 0.01
- + self.turn_timer = self.turn_timer + 0.01
- + self.jump_timer = self.jump_timer + 0.01
- + self.punch_timer = self.punch_timer + 0.01
- + self.attacking_timer = self.attacking_timer + 0.01
- + self.sound_timer = self.sound_timer + dtime + 0.01
- +
- + local current_pos = self.object:get_pos()
- + local current_node = minetest.get_node(current_pos)
- + if self.time_passed == nil then
- + self.time_passed = 0
- + end
- +
- + -- Environment damage
- + local def = minetest.registered_nodes[current_node.name]
- + local dps = def.damage_per_second
- + local dmg = 0
- + local dmg_node, dmg_pos
- + if dps ~= nil and dps > 0 then
- + dmg = dps
- + end
- + -- Damage from node
- + if dmg < 4 and (minetest.get_item_group(current_node.name, "water") ~= 0 or minetest.get_item_group(current_node.name, "lava") ~= 0) then
- + dmg = 4
- + end
- + -- Damage by suffocation
- + if (def.walkable == nil or def.walkable == true)
- + and (def.drowning == nil or def.drowning == 0)
- + and (def.damage_per_second == nil or def.damage_per_second <= 0)
- + and (def.collision_box == nil or def.collision_box.type == "regular")
- + and (def.node_box == nil or def.node_box.type == "regular")
- + and (def.groups and def.groups.disable_suffocation ~= 1) then
- + dmg = dmg + 1
- + end
- + self.envdmg_timer = self.envdmg_timer + dtime
- + if dmg > 0 then
- + if self.envdmg_timer >= 1 then
- + self.envdmg_timer = 0
- + self.object:set_hp(self.object:get_hp()-dmg)
- + self.last_damage = {
- + type = "environment",
- + pos = current_pos,
- + node = current_node,
- + }
- + if self.object:get_hp() <= 0 then
- + if self.on_death then
- + self.on_death(self)
- + end
- + self.object:remove()
- + else
- + hit(self)
- + self.sound_timer = 0
- + minetest.sound_play(sound_hit, {pos = current_pos, max_hear_distance = 10, gain = 0.4})
- + end
- + end
- + else
- + self.time_passed = 0
- + end
- +
- + --update moving state every 1 or 2 seconds
- + if self.state < 3 then
- + if self.timer > math.random(1,2) then
- + if self.attacker == "" then
- + self.state = math.random(1,2)
- + else self.state = 1 end
- + self.timer = 0
- + end
- + end
- +
- + --play sound
- + if self.sound_timer > math.random(5,35) then
- + minetest.sound_play(sound_normal, {pos = current_pos, max_hear_distance = 10, gain = 0.2})
- + self.sound_timer = 0
- + end
- +
- + --after punched
- + if self.state >= 8 then
- + if self.punch_timer > 0.15 then
- + if self.state == 9 then
- + self.object:set_velocity({x=self.direction.x*mummy_chillaxin_speed,y=-20,z=self.direction.z*mummy_chillaxin_speed})
- + self.state = 2
- + elseif self.state == 8 then
- + self.object:set_velocity({x=0,y=-20,z=0})
- + self.state = 1
- + end
- + end
- + end
- +
- + --STANDING
- + if self.state == 1 then
- + self.yawwer = true
- + self.attacker = ""
- + for _,object in ipairs(minetest.get_objects_inside_radius(self.object:get_pos(), 4)) do
- + if object:is_player() then
- + self.yawwer = false
- + local NPC = self.object:get_pos()
- + local PLAYER = object:get_pos()
- + self.vec = {x=PLAYER.x-NPC.x, y=PLAYER.y-NPC.y, z=PLAYER.z-NPC.z}
- + self.yaw = math.atan(self.vec.z/self.vec.x)+math.pi^2
- + if PLAYER.x > NPC.x then
- + self.yaw = self.yaw + math.pi
- + end
- + self.yaw = self.yaw - 2
- + self.object:set_yaw(self.yaw)
- + self.attacker = object
- + end
- + end
- +
- + if self.attacker == "" and self.turn_timer > math.random(1,4) then
- + self.yaw = 360 * math.random()
- + self.object:set_yaw(self.yaw)
- + self.turn_timer = 0
- + self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- + end
- + self.object:set_velocity({x=0,y=self.object:get_velocity().y,z=0})
- + if self.npc_anim ~= ANIM_STAND then
- + self.anim = get_animations()
- + self.object:set_animation({x=self.anim.stand_START,y=self.anim.stand_END}, mummy_animation_speed, mummy_animation_blend)
- + self.npc_anim = ANIM_STAND
- + end
- + if self.attacker ~= "" then
- + self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- + self.state = 2
- + end
- + end
- + --WALKING
- + if self.state == 2 then
- +
- + if self.direction ~= nil then
- + self.object:set_velocity({x=self.direction.x*mummy_chillaxin_speed,y=self.object:get_velocity().y,z=self.direction.z*mummy_chillaxin_speed})
- + end
- + if self.turn_timer > math.random(1,4) and not self.attacker then
- + self.yaw = 360 * math.random()
- + self.object:set_yaw(self.yaw)
- + self.turn_timer = 0
- + self.direction = {x = math.sin(self.yaw)*-1, y = -20, z = math.cos(self.yaw)}
- + end
- + if self.npc_anim ~= ANIM_WALK then
- + self.anim = get_animations()
- + self.object:set_animation({x=self.anim.walk_START,y=self.anim.walk_END}, mummy_animation_speed, mummy_animation_blend)
- + self.npc_anim = ANIM_WALK
- + end
- +
- + if self.attacker ~= "" and minetest.settings:get_bool("enable_damage") then
- + local s = self.object:get_pos()
- + local p = self.attacker:get_pos()
- + if (s ~= nil and p ~= nil) then
- + local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5
- +
- + if dist < 2 and self.attacking_timer > 0.6 then
- + self.attacker:punch(self.object, 1.0, {
- + full_punch_interval=1.0,
- + damage_groups = {fleshy=1}
- + })
- + self.attacking_timer = 0
- + end
- + end
- + end
- + end
- end
- minetest.register_entity("tsm_pyramids:mummy", MUMMY_DEF)
- @@ -341,71 +363,163 @@
- --spawn-egg/spawner
- minetest.register_craftitem("tsm_pyramids:spawn_egg", {
- - description = "Mummy spawn-egg",
- - inventory_image = "tsm_pyramids_mummy_egg.png",
- - liquids_pointable = false,
- - stack_max = 99,
- - on_place = function(itemstack, placer, pointed_thing)
- - if pointed_thing.type == "node" then
- - minetest.env:add_entity(pointed_thing.above,"tsm_pyramids:mummy")
- - if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end
- - return itemstack
- - end
- - end,
- + description = S("Mummy Spawn Egg"),
- + _doc_items_longdesc = S("Can be used to create a hostile mummy."),
- + _doc_items_usagehelp = S("Place the egg to create a mummy on this spot. Careful, it will probably attack immediately!"),
- + inventory_image = "tsm_pyramids_mummy_egg.png",
- + liquids_pointable = false,
- + stack_max = 99,
- + on_place = function(itemstack, placer, pointed_thing)
- + if pointed_thing.type ~= "node" then
- + return itemstack
- + end
- +
- + -- am I clicking on something with existing on_rightclick function?
- + local node = minetest.get_node(pointed_thing.under)
- + if placer and not placer:get_player_control().sneak then
- + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
- + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
- + end
- + end
- +
- + minetest.add_entity(pointed_thing.above,"tsm_pyramids:mummy")
- + if not minetest.settings:get_bool("creative_mode") then
- + itemstack:take_item()
- + end
- + return itemstack
- + end,
- })
- -function pyramids.spawn_mummy (pos, number)
- - for i=0,number do
- - minetest.env:add_entity(pos,"tsm_pyramids:mummy")
- - end
- +-- Spawn a mummy at position
- +function tsm_pyramids.spawn_mummy_at(pos, number)
- + local node = minetest.get_node(pos)
- + if node.name ~= "air" then
- + return
- + end
- + for _=1, number do
- + minetest.add_entity(pos,"tsm_pyramids:mummy")
- + end
- +end
- +
- +local spawnersounds
- +if default.node_sound_metal_defaults then
- + spawnersounds = default.node_sound_metal_defaults()
- +else
- + spawnersounds = default.node_sound_stone_defaults()
- end
- minetest.register_node("tsm_pyramids:spawner_mummy", {
- - description = "Mummy spawner",
- - paramtype = "light",
- - tiles = {"tsm_pyramids_spawner.png"},
- - is_ground_content = true,
- - drawtype = "allfaces",--_optional",
- - groups = {cracky=1,level=1},
- - drop = "",
- - on_construct = function(pos)
- - pos.y = pos.y - 0.28
- - minetest.env:add_entity(pos,"tsm_pyramids:mummy_spawner")
- - end,
- - on_destruct = function(pos)
- - for _,obj in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do
- - if not obj:is_player() then
- - if obj ~= nil and obj:get_luaentity().m_name == "dummy" then
- - obj:remove()
- - end
- - end
- - end
- - end
- + description = S("Mummy Spawner"),
- + _doc_items_longdesc = S("A mummy spawner causes hostile mummies to appear in its vicinity as long it exists."),
- + paramtype = "light",
- + tiles = {"tsm_pyramids_spawner.png"},
- + is_ground_content = false,
- + drawtype = "allfaces",
- + groups = {cracky=1,level=1},
- + drop = "",
- + on_construct = function(pos)
- + pos.y = pos.y - 0.28
- + minetest.add_entity(pos,"tsm_pyramids:mummy_spawner")
- + end,
- + on_destruct = function(pos)
- + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
- + if not obj:is_player() then
- + if obj ~= nil and obj:get_luaentity().name == "tsm_pyramids:mummy_spawner" then
- + obj:remove()
- + end
- + end
- + end
- + end,
- + sounds = spawnersounds,
- })
- -if not minetest.setting_getbool("only_peaceful_mobs") then
- - minetest.register_abm({
- - nodenames = {"tsm_pyramids:spawner_mummy"},
- - interval = 2.0,
- - chance = 20,
- - action = function(pos, node, active_object_count, active_object_count_wider)
- - local player_near = false
- - local mobs = 0
- - for _,obj in ipairs(minetest.env:get_objects_inside_radius(pos, spawner_range)) do
- - if obj:is_player() then
- - player_near = true
- - else
- - if obj:get_luaentity().mob_name == "mummy" then mobs = mobs + 1 end
- - end
- - end
- - if player_near then
- - if mobs < spawner_max_mobs then
- - pos.x = pos.x+1
- - local p = minetest.find_node_near(pos, 5, {"air"})
- - minetest.env:add_entity(p,"tsm_pyramids:mummy")
- - end
- - end
- - end
- - })
- +
- +-- Attempt to spawn a mummy at a random appropriate position around pos.
- +-- Criteria:
- +-- * Must be close to pos
- +-- * Not in sunlight
- +-- * Must be air on top of a non-air block
- +-- * No more than 6 mummies in area
- +-- * Player must be near is player_near_required is true
- +function tsm_pyramids.attempt_mummy_spawn(pos, player_near_required)
- + local player_near = false
- + local mobs = 0
- + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, spawner_check_range)) do
- + if obj:is_player() then
- + player_near = true
- + else
- + if obj:get_luaentity() and obj:get_luaentity().name == "tsm_pyramids:mummy" then
- + mobs = mobs + 1
- + end
- + end
- + end
- + if player_near or (not player_near_required) then
- + if mobs < spawner_max_mobs then
- + local offset = {x=5,y=2,z=5}
- + local nposses = minetest.find_nodes_in_area(vector.subtract(pos, offset), vector.add(pos,offset), "air")
- + local tries = math.min(6, #nposses)
- + for i=1, tries do
- + local r = math.random(1, #nposses)
- + local npos = nposses[r]
- + -- Check if mummy has 2 nodes of free space
- + local two_space = false
- + -- Check if mummy has something to walk on
- + local footing = false
- + -- Find the lowest node
- + for y=-1, -5, -1 do
- + npos.y = npos.y - 1
- + local below = minetest.get_node(npos)
- + if minetest.registered_items[below.name].liquidtype ~= "none" then
- + break
- + end
- + if below.name ~= "air" then
- + if y < -1 then
- + two_space = true
- + end
- + npos.y = npos.y + 1
- + footing = true
- + break
- + end
- + end
- + local light = minetest.get_node_light(npos, 0.5)
- + if not two_space then
- + local above = minetest.get_node({x=npos.x, y=npos.y+1, z=npos.z})
- + if above.name == "air" then
- + two_space = true
- + end
- + end
- + if footing and two_space and light < 15 then
- + tsm_pyramids.spawn_mummy_at(npos, 1)
- + break
- + else
- + table.remove(nposses, r)
- + end
- + end
- + end
- + end
- +end
- +
- +if not minetest.settings:get_bool("only_peaceful_mobs") then
- + minetest.register_abm({
- + nodenames = {"tsm_pyramids:spawner_mummy"},
- + interval = 2.0,
- + chance = 20,
- + action = function(pos, node, active_object_count, active_object_count_wider)
- + tsm_pyramids.attempt_mummy_spawn(pos, true)
- + end,
- + })
- +end
- +
- +if minetest.get_modpath("awards") then
- + awards.register_achievement("tsm_pyramids_no_mummy_spawner", {
- + title = S("No more mummies!"),
- + description = S("Destroy a mummy spawner by digging."),
- + secret = true,
- + icon = "tsm_pyramids_spawner.png",
- + trigger = {
- + type = "dig",
- + node = "tsm_pyramids:spawner_mummy",
- + target = 1
- + }
- + })
- end
- -
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/nodes.lua /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/nodes.lua
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/nodes.lua 2015-02-07 09:12:28.000000000 -0500
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/nodes.lua 2019-09-02 14:45:11.000000000 -0400
- @@ -1,48 +1,98 @@
- -local img = {"eye", "men", "sun"}
- +local S = minetest.get_translator("tsm_pyramids")
- -for i=1,3 do
- - minetest.register_node("tsm_pyramids:deco_stone"..i, {
- - description = "Sandstone with "..img[i],
- - tiles = {"default_sandstone.png^tsm_pyramids_"..img[i]..".png"},
- - is_ground_content = true,
- - groups = {crumbly=2,cracky=3},
- - sounds = default.node_sound_stone_defaults(),
- - })
- +local img = {
- + "eye", "men", "sun",
- + "ankh", "scarab", "cactus"
- +}
- +local desc = {
- + S("Sandstone with Eye Engraving"), S("Sandstone with Man Engraving"), S("Sandstone with Sun Engraving"),
- + S("Desert Sandstone with Ankh Engraving"), S("Desert Sandstone with Scarab Engraving"), S("Desert Sandstone with Cactus Engraving")
- +}
- +
- +local decodesc = ""
- +if minetest.get_modpath("doc_items") then
- + decodesc = doc.sub.items.temp.deco
- +end
- +
- +for i=1, #img do
- + local sandstone_img, basenode
- + if i > 3 then
- + sandstone_img = "default_desert_sandstone.png"
- + basenode = "default:desert_sandstone"
- + else
- + sandstone_img = "default_sandstone.png"
- + basenode = "default:sandstone"
- + end
- + minetest.register_node("tsm_pyramids:deco_stone"..i, {
- + description = desc[i],
- + _doc_items_longdesc = decodesc,
- + is_ground_content = false,
- + tiles = {sandstone_img, sandstone_img, sandstone_img.."^tsm_pyramids_"..img[i]..".png"},
- + groups = minetest.registered_nodes[basenode].groups,
- + sounds = minetest.registered_nodes[basenode].sounds,
- + })
- end
- -trap_on_timer = function (pos, elapsed)
- - local objs = minetest.env:get_objects_inside_radius(pos, 2)
- - for i, obj in pairs(objs) do
- - if obj:is_player() then
- - local n = minetest.get_node(pos)
- - if n and n.name and minetest.registered_nodes[n.name].crack < 2 then
- - minetest.set_node(pos, {name="tsm_pyramids:trap_2"})
- - nodeupdate(pos)
- - end
- - end
- - end
- - return true
- +local trap_on_timer = function(pos, elapsed)
- + local n = minetest.get_node(pos)
- + if not (n and n.name) then
- + return true
- + end
- + -- Drop trap stone when player is nearby
- + local objs = minetest.get_objects_inside_radius(pos, 2)
- + for i, obj in pairs(objs) do
- + if obj:is_player() then
- + if minetest.registered_nodes[n.name]._tsm_pyramids_crack and minetest.registered_nodes[n.name]._tsm_pyramids_crack < 2 then
- + -- 70% chance to ignore player to make the time of falling less predictable
- + if math.random(1, 10) >= 3 then
- + return true
- + end
- + if n.name == "tsm_pyramids:trap" then
- + minetest.set_node(pos, {name="tsm_pyramids:trap_2"})
- + minetest.check_for_falling(pos)
- + elseif n.name == "tsm_pyramids:desert_trap" then
- + minetest.set_node(pos, {name="tsm_pyramids:desert_trap_2"})
- + minetest.check_for_falling(pos)
- + end
- + return true
- + end
- + end
- + end
- + return true
- +end
- +
- +local register_trap_stone = function(basename, desc_normal, desc_falling, base_tile, drop)
- + minetest.register_node("tsm_pyramids:"..basename, {
- + description = desc_normal,
- + _doc_items_longdesc = S("This brick is old, porous and unstable and is barely able to hold itself. One should be careful not to disturb it."),
- + tiles = { base_tile .. "^tsm_pyramids_crack.png" },
- + is_ground_content = false,
- + groups = {crumbly=3,cracky=3},
- + sounds = default.node_sound_stone_defaults(),
- + on_construct = function(pos)
- + minetest.get_node_timer(pos):start(0.1)
- + end,
- + _tsm_pyramids_crack = 1,
- + on_timer = trap_on_timer,
- + drop = drop,
- + })
- +
- + minetest.register_node("tsm_pyramids:"..basename.."_2", {
- + description = desc_falling,
- + _doc_items_longdesc = S("This old porous brick falls under its own weight."),
- + tiles = { base_tile .. "^tsm_pyramids_crack2.png" },
- + is_ground_content = false,
- + groups = {crumbly=3,cracky=3,falling_node=1,not_in_creative_inventory=1},
- + sounds = default.node_sound_stone_defaults(),
- + drop = drop,
- + })
- end
- -minetest.register_node("tsm_pyramids:trap", {
- - description = "Cracked sandstone brick",
- - tiles = {"default_sandstone_brick.png^tsm_pyramids_crack.png"},
- - is_ground_content = true,
- - groups = {crumbly=2,cracky=3},
- - sounds = default.node_sound_stone_defaults(),
- - on_construct = function(pos)
- - minetest.env:get_node_timer(pos):start(0.1)
- - end,
- - crack = 1,
- - on_timer = trap_on_timer,
- - drop = "",
- -})
- -
- -minetest.register_node("tsm_pyramids:trap_2", {
- - description = "trapstone",
- - tiles = {"default_sandstone_brick.png^tsm_pyramids_crack.png^[transformR90"},
- - is_ground_content = true,
- - groups = {crumbly=2,cracky=3,falling_node=1,not_in_creative_inventory=1},
- - sounds = default.node_sound_stone_defaults(),
- - drop = "",
- -})
- +register_trap_stone("trap",
- + S("Cracked Sandstone Brick"), S("Falling Cracked Sandstone Brick"),
- + "default_sandstone_brick.png",
- + { items = { { items = { "default:sand" }, rarity = 1 }, { items = { "default:sand" }, rarity = 2 }, } })
- +register_trap_stone("desert_trap",
- + S("Cracked Desert Sandstone Brick"), S("Falling Cracked Desert Sandstone Brick"),
- + "default_desert_sandstone_brick.png",
- + { items = { { items = { "default:desert_sand" }, rarity = 1 }, { items = { "default:desert_sand" }, rarity = 2 }, } })
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/oldcoder.txt /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/oldcoder.txt
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/oldcoder.txt 2019-07-03 05:59:38.000000000 -0400
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/oldcoder.txt 2020-03-07 00:23:04.000000000 -0500
- @@ -4,24 +4,36 @@
- ----------------------------------------------------------------------
- -1. This version runs if and only if either of the following conf-file
- -settings is used:
- +1. Starting point:
- + http://repo.or.cz/w/minetest_pyramids/tsm_pyramids.git/\
- +snapshot/1.0.0.zip
- +
- +----------------------------------------------------------------------
- +
- +2. This version runs if and only if the following conf-file setting is
- +used:
- enable_tsm_pyramids = true
- - enable_wonder = true
- ----------------------------------------------------------------------
- -2. Partial list of changes:
- +3. Partial list of changes:
- -2a. Applied the following patch file, which is included with this file
- +3a. Applied the following patch file, which is included with this file
- (oldcoder.txt):
- bucket-tsm_pyramids.patch
- -2b. Renamed "init.lua" to "baseinit.lua". Added a new "init.lua" file
- +3b. Detabbed "*.lua".
- +
- +3c. Renamed "init.lua" to "baseinit.lua". Added a new "init.lua" file
- that conditionally loads "baseinit.lua".
- -2c. Added the files "00README" and "oldcoder.txt" (this file).
- +3d. Replaced egg texture with a new Poikilos version.
- +
- +3e. Removed ".gitattributes", ".gitignore", "mod.conf", and screenshot
- +file(s).
- +
- +3f. Added an appropriate "depends.txt" file.
- -2d. Replaced egg texture with a new Poikilos version.
- +3g. Added the files "00README" and "oldcoder.txt" (this file).
- Only in /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids: README.md
- Only in ../games/Bucket_Game/mods/codercore/tsm_pyramids: README.txt
- diff -u ../games/Bucket_Game/mods/codercore/tsm_pyramids/room.lua /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/room.lua
- --- ../games/Bucket_Game/mods/codercore/tsm_pyramids/room.lua 2015-02-07 09:12:28.000000000 -0500
- +++ /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/room.lua 2019-09-02 14:45:11.000000000 -0400
- @@ -1,78 +1,1172 @@
- -local room = {"a","a","a","a","a","a","a","a","a",
- - "a","c","a","c","a","c","a","c","a",
- - "a","s","a","s","a","s","a","s","a",
- - "a","a","a","a","a","a","a","a","a",
- - "a","a","a","a","a","a","a","a","a",
- - "a","a","a","a","a","a","a","a","a",
- - "a","s","a","s","a","s","a","s","a",
- - "a","c","a","c","a","c","a","c","a",
- - "a","a","a","a","a","a","a","a","a"}
- -
- -local trap = {"b","b","b","b","b","b","b","b","b",
- - "l","b","l","b","l","b","l","b","b",
- - "l","b","l","b","l","b","l","b","b",
- - "l","b","l","l","l","b","l","l","b",
- - "l","l","b","l","b","l","l","b","b",
- - "l","b","l","l","l","l","l","l","b",
- - "l","b","l","b","l","b","l","b","b",
- - "l","b","l","b","l","b","l","b","b",
- - "b","b","b","b","b","b","b","b","b"}
- -
- -local code = {}
- -code["s"] = "sandstone"
- -code["eye"] = "deco_stone1"
- -code["men"] = "deco_stone2"
- -code["sun"] = "deco_stone3"
- -code["c"] = "chest"
- -code["b"] = "sandstonebrick"
- -code["a"] = "air"
- -code["l"] = "lava_source"
- -code["t"] = "trap"
- -
- -local function replace(str,iy)
- - local out = "default:"
- - if iy < 4 and str == "c" then str = "a" end
- - if iy == 0 and str == "s" then out = "tsm_pyramids:" str = "sun" end
- - if iy == 3 and str == "s" then out = "tsm_pyramids:" str = "men" end
- - if str == "a" then out = "" end
- - return out..code[str]
- -end
- -
- -local function replace2(str,iy)
- - local out = "default:"
- - if iy == 0 and str == "l" then out = "tsm_pyramids:" str = "t"
- - elseif iy < 3 and str == "l" then str = "a" end
- -
- - if str == "a" then out = "" end
- - return out..code[str]
- -end
- -
- -function pyramids.make_room(pos)
- - local loch = {x=pos.x+7,y=pos.y+5, z=pos.z+7}
- - for iy=0,4,1 do
- - for ix=0,8,1 do
- - for iz=0,8,1 do
- - local n_str = room[tonumber(ix*9+iz+1)]
- - local p2 = 0
- - if n_str == "c" then
- - if ix < 3 then p2 = 1 else p2 = 3 end
- - pyramids.fill_chest({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz})
- - end
- - minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace(n_str,iy), param2=p2})
- - end
- - end
- - end
- -end
- -
- -function pyramids.make_traps(pos)
- - local loch = {x=pos.x+7,y=pos.y, z=pos.z+7}
- - for iy=0,4,1 do
- - for ix=0,8,1 do
- - for iz=0,8,1 do
- - local n_str = trap[tonumber(ix*9+iz+1)]
- - local p2 = 0
- - minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace2(n_str,iy), param2=p2})
- - end
- - end
- - end
- +local S = minetest.get_translator("tsm_pyramids")
- +
- +-- ROOM LAYOUTS
- +
- +local ROOM_WIDTH = 9
- +
- +local room_types = {
- + -- Pillar room
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","^"," ","^"," ","^"," ","^"," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " ","v"," ","v"," ","v"," ","v"," ",
- + " "," "," "," "," "," "," "," "," "
- + },
- + traps = true,
- + },
- + -- Hieroglyph walls
- + {
- + style = "yrepeat",
- + layout = {
- + "s","h","h","h","h","h","h","h","s",
- + "h"," "," "," "," "," "," "," ","h",
- + "h"," "," "," "," "," "," "," ","h",
- + "h"," "," "," "," "," "," "," ","h",
- + " "," "," "," ","<"," "," "," ","h",
- + "h"," "," "," "," "," "," "," ","h",
- + "h"," "," "," "," "," "," "," ","h",
- + "h"," "," "," "," "," "," "," ","h",
- + "s","h","h","h","h","h","h","h","s"
- + },
- + },
- + -- 4 large pillars
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," ","v"," "," "," "," ",
- + " ","c","c"," "," "," ","c","c"," ",
- + " ","c","c"," "," "," ","c","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," ","<",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c","c"," "," "," ","c","c"," ",
- + " ","c","c"," "," "," ","c","c"," ",
- + " "," "," "," ","^"," "," "," "," "
- + },
- + traps = true,
- + },
- + -- hidden room
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","c","S","c","S","c"," "," ",
- + " "," ","S"," "," "," ","S"," "," ",
- + " "," ","c"," ",">"," ","c"," ","<",
- + " "," ","S"," "," "," ","S"," "," ",
- + " "," ","c","S","c","S","c"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," "
- + },
- + },
- + -- spiral 1
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," ","c","c","c"," ","S"," ",
- + " ","S"," ","c","v","c"," ","S"," ",
- + "S","S"," ","c"," ","c"," ","S"," ",
- + "S","S"," ","c"," "," "," ","S"," ",
- + "v","S"," ","S","S","S","S","S"," ",
- + " ","S"," "," "," "," "," "," "," "
- + },
- + },
- + -- spiral 2
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " "," "," ","c"," "," "," ","S"," ",
- + "S","S"," ","c"," ","c"," ","S"," ",
- + " ","S"," ","c","^","c"," ","S"," ",
- + " ","S"," ","c","c","c"," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," "
- + },
- + },
- + -- pillar mania
- + {
- + style = "yrepeat",
- + layout = {
- + " "," ","v"," ","v"," ","v"," ","v",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " "," ","^"," ","^"," ","^"," ","^",
- + },
- + traps = true,
- + },
- + -- plusses
- + {
- + style = "yrepeat",
- + layout = {
- + "c"," "," "," "," "," "," "," ","c",
- + " "," ","c",">"," ","<","c"," "," ",
- + " ","c","s","c"," ","c","s","c"," ",
- + " "," ","c"," "," "," ","c"," "," ",
- + " "," "," "," ","<"," "," "," "," ",
- + " "," ","c"," "," "," ","c"," "," ",
- + " ","c","s","c"," ","c","s","c"," ",
- + " "," ","c",">"," ","<","c"," "," ",
- + "c"," "," "," "," "," "," "," ","c",
- + },
- + traps = true,
- + },
- + -- diamond
- + {
- + style = "yrepeat",
- + layout = {
- + ">","s","s","c","c","c","s","s","s",
- + "s","s","c"," "," "," ","c","s","s",
- + "s","c"," "," "," "," "," ","c","s",
- + "c"," "," "," "," "," "," "," ","c",
- + " "," "," "," "," "," "," ","<","c",
- + "c"," "," "," "," "," "," "," ","c",
- + "s","c"," "," "," "," "," ","c","s",
- + "s","s","c"," "," "," ","c","s","s",
- + ">","s","s","c","c","c","s","s","s",
- + },
- + },
- + -- square
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S","^","S","S","S"," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " ","S","S","S","S","S","S",">"," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " ","S","S","S","v","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + },
- + -- hallway 2
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S",">"," "," "," "," ",
- + "S","S","S","S","S","^","S","S"," ",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S","S","S","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," ",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S","S","S","v","S","S"," ",
- + "S","S","S","S",">"," "," "," "," ",
- + },
- + },
- + -- hallway 3
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S","S"," "," "," "," ",
- + "S","S","S","S","c",">"," "," "," ",
- + "S","c","S","c","S","c","S"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + "S","c","S","c","S","c","S"," "," ",
- + "S","S","S","S","c",">"," "," "," ",
- + "S","S","S","S","S"," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- hallway 4
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S","S","v","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "c","S","c","S","c","S","c","S","c",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," ","<",
- + " "," "," "," "," "," "," "," "," ",
- + "c","S","c","S","c","S","c","S","c",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","^","S","S","S",
- + },
- + },
- + -- tiny
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S","S","S","S","S","v",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S"," "," "," ","S","S"," ",
- + " "," "," "," ","<"," ","S","S"," ",
- + "S","S","S"," "," "," ","S","S"," ",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S","S","S","S","S","S"," ",
- + "S","S","S","S","S","S","S","S","^",
- + },
- + },
- + -- small
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S"," ","v"," ","v"," ","S","S",
- + "S","S",">"," "," "," ","<","S"," ",
- + " "," "," "," ","c"," "," ","S"," ",
- + "S","S",">"," "," "," ","<","S"," ",
- + "S","S"," ","^"," ","^"," ","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + },
- + },
- + -- small 2
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " ","S"," "," ","v"," "," ","S"," ",
- + "S","S"," "," "," "," "," ","S"," ",
- + " "," "," "," "," "," ","<","S"," ",
- + "S","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," ","^"," "," ","S"," ",
- + " ","S","S","S","S","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + },
- + -- big pillar
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","^"," "," "," "," ",
- + " "," "," ","c","c","c"," "," "," ",
- + " "," ","<","c","S","c",">"," "," ",
- + " "," "," ","c","c","c"," "," "," ",
- + " "," "," "," ","v"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- pacman
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," ","c","c","c"," "," "," ",
- + " "," ","c","c","v","c","c"," "," ",
- + " "," ","c",">"," "," "," "," "," ",
- + " "," ","c","c","^","c","c"," "," ",
- + " "," "," ","c","c","c"," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- the wall
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S","S","S","S"," ","<",
- + "s","c","s","c","s","c","s"," ","c",
- + "c"," "," "," "," "," ","c"," ","<",
- + "s"," "," "," "," "," ","s"," ","c",
- + " "," "," "," "," ","<","c"," ","<",
- + "s"," "," "," "," "," ","s"," ","c",
- + "c"," "," "," "," "," ","c"," ","<",
- + "s","c","s","c","s","c","s"," ","c",
- + "S","S","S","S","S","S","S"," ","<",
- + },
- + traps = true,
- + },
- + -- split
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," ","^"," ","^"," "," "," ",
- + " "," "," ","c"," ","c"," "," "," ",
- + " "," "," ","v"," ","v"," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- 4 small pillars
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","^"," "," "," "," ",
- + " "," "," "," ","c"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","<","c"," "," "," ","c",">"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","c"," "," "," "," ",
- + " "," "," "," ","v"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- 6 pillars
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","^"," ","^"," ","^"," "," ",
- + " "," ","c"," ","c"," ","c"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","c"," ","c"," ","c"," "," ",
- + " "," ","v"," ","v"," ","v"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- stripes
- + {
- + style = "yrepeat",
- + layout = {
- + " ","S","v","S","v","S","v","S","v",
- + " ","S"," ","S"," ","S"," ","S"," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " ","S"," ","S"," ","S"," ","S"," ",
- + " ","S","^","S","^","S","^","S","^",
- + },
- + traps = true,
- + },
- + -- inside
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," "," "," "," "," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," ","c","S","c"," "," "," ",
- + " "," "," ","S",">"," "," "," "," ",
- + " "," "," ","c","S","c"," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c"," "," "," "," "," ","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + },
- + -- 1 chest
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","<"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- 2 chests
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," ","<",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," ","<",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- X
- + {
- + style = "yrepeat",
- + layout = {
- + "c"," "," "," "," "," "," "," ","c",
- + "c","c",">"," "," "," ","<","c","c",
- + " ","c","c"," "," "," ","c","c"," ",
- + " "," ","c","c"," ","c","c"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","c","c"," ","c","c"," "," ",
- + " ","c","c"," "," "," ","c","c"," ",
- + "c","c",">"," "," "," ","<","c","c",
- + "c"," "," "," "," "," "," "," ","c",
- + },
- + },
- + -- split 2
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S"," "," "," "," "," "," ",
- + "S","S","S"," "," "," "," "," "," ",
- + "S","S","S"," "," ","^","^","^","^",
- + " "," "," "," "," ","c","c","c","c",
- + "S","S","S"," "," ","v","v","v","v",
- + "S","S","S"," "," "," "," "," "," ",
- + "S","S","S"," "," "," "," "," "," ",
- + "S","S","S","S","S","S","S","S","S",
- + },
- + },
- + -- split 3
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","^"," ","^"," ","^"," ","^"," ",
- + " ","c"," ","c"," ","c"," ","c"," ",
- + " ","v"," ","v"," ","v"," ","v"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- diamond 2
- + {
- + style = "yrepeat",
- + layout = {
- + "S","S"," "," "," "," "," ","S","S",
- + "S"," "," "," ","c"," "," "," ","S",
- + " "," ","<","S","S","S",">"," "," ",
- + " "," ","S","S","S","S","S"," "," ",
- + " ","c","S","S","S","S","S","c"," ",
- + " "," ","S","S","S","S","S"," "," ",
- + " "," ","<","S","S","S",">"," "," ",
- + "S"," "," "," ","c"," "," "," ","S",
- + "S","S"," "," "," "," "," ","S","S",
- + },
- + traps = true,
- + },
- + -- ultra pillars
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " ","c","^","c"," ","c","^","c"," ",
- + " ","c","c","c"," ","c","c","c"," ",
- + " ","c","c","c"," ","c","c","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","c","c","c"," ","c","c","c"," ",
- + " ","c","c","c"," ","c","c","c"," ",
- + " ","c","v","c"," ","c","v","c"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + },
- + -- vstripes
- + {
- + style = "yrepeat",
- + layout = {
- + "S"," "," "," "," "," "," "," "," ",
- + "S"," "," ","^"," "," ","^"," "," ",
- + "S"," "," ","c"," "," ","c"," "," ",
- + "S"," "," "," "," "," "," "," "," ",
- + " "," "," ","c"," "," ","c"," "," ",
- + "S"," "," "," "," "," "," "," "," ",
- + "S"," "," ","c"," "," ","c"," "," ",
- + "S"," "," ","v"," "," ","v"," "," ",
- + "S"," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- sides
- + {
- + style = "yrepeat",
- + layout = {
- + "c"," ","c"," ","c"," ","c"," ","c",
- + " "," ","v"," ","v"," ","v"," "," ",
- + "c"," "," "," "," "," "," "," ","c",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," ","c",
- + " "," "," "," "," "," "," "," "," ",
- + "c"," "," "," "," "," "," "," ","c",
- + " "," ","^"," ","^"," ","^"," "," ",
- + "c"," ","c"," ","c"," ","c"," ","c",
- + },
- + traps = true,
- + },
- + -- 9 pillars
- + {
- + style = "yrepeat",
- + layout = {
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","^"," ","^"," ","^"," "," ",
- + " "," ","c"," ","c"," ","c"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","c"," ","c"," ","c"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","c"," ","c"," ","c"," "," ",
- + " "," ","v"," ","v"," ","v"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },
- + traps = true,
- + },
- + -- Ankh statue
- + {
- + style = "stacked",
- + layout = { {
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","s",">"," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","s"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + }},
- + stype = "desert_sandstone",
- + wall = {
- + "S","S","S","S","S","S","S","S","S",
- + "s","1","s","1","s","1","s","1","s",
- + "S","S","S","S","S","S","S","S","S",
- + "1","s","1","s","1","s","1","s","1",
- + "S","S","S","S","S","S","S","S","S",
- + },
- + },
- +--[[
- + -- Cactus room 1
- + {
- + style = "stacked",
- + layout_offset = -1,
- + layout_height = 5,
- + layout = {{
- + "s","s","s","s","s","s","s","s","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","a","a","a","a","a","a","a","s",
- + "s","s","s","s","s","s","s","s","s",
- + },{
- + " "," "," "," "," "," "," "," ","<",
- + " ","C"," ","C"," ","C"," ","C"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","C"," ","C"," ","C"," ","C"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","C"," ","C"," ","C"," ","C"," ",
- + " "," "," "," "," "," "," "," "," ",
- + " ","C"," ","C"," ","C"," ","C"," ",
- + " "," "," "," "," "," "," "," ","<",
- +
- + }},
- + wall = {
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "s","3","s","3","s","3","s","3","s",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + },
- + stype = "desert_sandstone",
- + },
- +]]
- + -- Cactus room 2
- + {
- + style = "stacked",
- + layout_offset = -1,
- + layout_height = 5,
- + layout = {{
- + "S","S","S","S","S","S","S","S","S",
- + "S","s","s","s","s","s","s","s","S",
- + "S","s","a","a","a","a","a","s","S",
- + "S","s","a","a","a","a","a","s","S",
- + "S","s","a","a","a","a","a","s","S",
- + "S","s","a","a","a","a","a","s","S",
- + "S","s","a","a","a","a","a","s","S",
- + "S","s","s","s","s","s","s","s","S",
- + "S","S","S","S","S","S","S","S","S",
- + },{
- + " "," "," "," "," "," "," "," ","<",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","C"," ","C"," ","C"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","C"," ","C"," ","C"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," ","C"," ","C"," ","C"," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," ","<",
- +
- + }},
- + wall = {
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "s","3","s","3","s","3","s","3","s",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + },
- + stype = "desert_sandstone",
- + },
- + -- Sun room
- + {
- + style = "stacked",
- + layout_offset = 0,
- + layout_height = 8,
- + layout = {{
- + "n","s","s","s","s","s","s","s","n",
- + "s","n","s","s","s","s","s","n","s",
- + "s","s","n","n","n","n","n","s","s",
- + "s","s","n","s","s","s","n","s","s",
- + "s","s","n","s","s","s","n","s","s",
- + "s","s","n","s","s","s","n","s","s",
- + "s","s","n","n","n","n","n","s","s",
- + "s","n","s","s","s","s","s","n","s",
- + "n","s","s","s","s","s","s","s","n",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," ","<"," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + "n","s","s","s","s","s","s","s","n",
- + "s","n","s","s","s","s","s","n","s",
- + "s","s","n","n","n","n","n","s","s",
- + "s","s","n","s","s","s","n","s","s",
- + "s","s","n","s","s","s","n","s","s",
- + "s","s","n","s","s","s","n","s","s",
- + "s","s","n","n","n","n","n","s","s",
- + "s","n","s","s","s","s","s","n","s",
- + "n","s","s","s","s","s","s","s","n",
- + }},
- + wall = {
- + "S","S","S","S","S","S","S","S","S",
- + "s","3","s","3","s","3","s","3","s",
- + "S","S","S","S","S","S","S","S","S",
- + "3","s","3","s","3","s","3","s","3",
- + "S","S","S","S","S","S","S","S","S",
- + },
- + stype = "sandstone",
- + open_roof = true,
- + },
- + -- Attic
- + {
- + style = "stacked",
- + layout_height = 6,
- + layout_offset = 1,
- + layout = { {
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S"," ","S","S","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " "," "," "," ","c",">"," "," "," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S","S","S"," ","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S"," ","S","S","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " "," "," "," ","c"," "," "," "," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S","S","S"," ","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + " "," "," "," "," "," "," "," "," ",
- + " ","S","S","S"," ","S","S","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " "," "," "," ","c"," "," "," "," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S"," "," "," "," "," ","S"," ",
- + " ","S","S","S"," ","S","S","S"," ",
- + " "," "," "," "," "," "," "," "," ",
- + },{
- + "s","s","s","s","s","s","s","s","s",
- + "s","S","S","S","S","S","S","S","s",
- + "s","S","s","s","s","s","s","S","s",
- + "s","S","s","s","s","s","s","S","s",
- + "s","S","s","s","s","s","s","S","s",
- + "s","S","s","s","s","s","s","S","s",
- + "s","S","s","s","s","s","s","S","s",
- + "s","S","S","S","S","S","S","S","c",
- + "s","s","s","s","s","s","s","s","s",
- + },{
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","v","S","S","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S",">"," "," "," "," "," ","<","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S","S","S","^","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + },{
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S"," "," "," "," "," ","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + "S","S","S","S","S","S","S","S","S",
- + }},
- + },
- +}
- +
- +local layout_traps_template = {
- + "S","S","S","S","S","S","S","S","S",
- + "?","?","?","?","?","?","?","?","S",
- + "?","?","?","?","?","?","?","?","S",
- + "?","?","?","?","?","?","?","?","S",
- + "?","?","?","?","?","?","?","?","S", -- << entrance on left side
- + "?","?","?","?","?","?","?","?","S",
- + "?","?","?","?","?","?","?","?","S",
- + "?","?","?","?","?","?","?","?","S",
- + "S","S","S","S","S","S","S","S","S"
- +}
- +
- +local code_sandstone = {
- + [" "] = "air",
- + ["c"] = "default:sandstone",
- + ["s"] = "default:sandstone",
- + ["n"] = "default:desert_sandstone",
- + ["h"] = "default:sandstone",
- + ["S"] = "default:sandstonebrick",
- + ["1"] = "tsm_pyramids:deco_stone1",
- + ["2"] = "tsm_pyramids:deco_stone2",
- + ["3"] = "tsm_pyramids:deco_stone3",
- + ["^"] = "default:chest",
- + ["<"] = "default:chest",
- + [">"] = "default:chest",
- + ["v"] = "default:chest",
- + ["~"] = "default:lava_source",
- + ["t"] = "tsm_pyramids:trap",
- + ["C"] = "default:large_cactus_seedling",
- + ["a"] = "default:sand",
- +}
- +local code_desert_sandstone = table.copy(code_sandstone)
- +code_desert_sandstone["c"] = "default:desert_sandstone"
- +code_desert_sandstone["s"] = "default:desert_sandstone"
- +code_desert_sandstone["n"] = "default:sandstone"
- +code_desert_sandstone["h"] = "default:desert_sandstone"
- +code_desert_sandstone["1"] = "tsm_pyramids:deco_stone4"
- +code_desert_sandstone["2"] = "tsm_pyramids:deco_stone5"
- +code_desert_sandstone["3"] = "tsm_pyramids:deco_stone6"
- +code_desert_sandstone["S"] = "default:desert_sandstone_brick"
- +code_desert_sandstone["t"] = "tsm_pyramids:desert_trap"
- +code_desert_sandstone["a"] = "default:desert_sand"
- +
- +local code_desert_stone = table.copy(code_sandstone)
- +code_desert_stone["c"] = "default:desert_stone_block"
- +code_desert_stone["s"] = "default:desert_stone_block"
- +code_desert_stone["n"] = "default:desert_stone_block"
- +code_desert_stone["h"] = "default:desert_stone_block"
- +code_desert_stone["1"] = "default:desert_stone_block"
- +code_desert_stone["2"] = "default:desert_stone_block"
- +code_desert_stone["3"] = "default:desert_stone_block"
- +code_desert_stone["S"] = "default:desert_stonebrick"
- +code_desert_stone["t"] = "air"
- +code_desert_stone["a"] = "default:desert_sand"
- +
- +local function replace(str, iy, code_table, deco, column_style)
- + if iy < 4 and (str == "<" or str == ">" or str == "^" or str == "v") then str = " " end
- + if str == "h" then
- + local r = math.random(0,3)
- + if r > 0 then
- + str = deco[r]
- + else
- + str = "c"
- + end
- + elseif column_style == 1 or column_style == 2 then
- + if iy == 0 and str == "c" then str = deco[1] end
- + if iy == 3 and str == "c" then str = deco[2] end
- + elseif column_style == 3 then
- + if iy == 0 and str == "c" then str = deco[1] end
- + if iy == 2 and str == "c" then str = deco[2] end
- + elseif column_style == 4 then
- + if iy == 2 and str == "c" then str = deco[1] end
- + end
- + return code_table[str]
- +end
- +
- +local function replace2(str, iy, depth, code_table, trap_node)
- + if iy == depth then
- + -- Sandstone at the bottom-most layer
- + str = "s"
- + elseif iy == depth-1 then
- + -- Brick at the layer above
- + str = "S"
- + elseif iy == 0 and str == "~" then
- + -- Trap stones at the top layer
- + str = "t"
- + elseif str == "~" then
- + if iy < depth-3 then
- + -- Air below the trap stones
- + str = " "
- + else
- + str = trap_node
- + end
- + end
- + -- Everything else is untouched (will stay pyramid material)
- +
- + return code_table[str]
- +end
- +
- +local function get_flat_index(x, y, width)
- + return 1 + x + y * width
- +end
- +
- +local function rotate_layout_single(layout, width)
- + local size = width*width
- + local new_layout = {}
- + for x=0, width-1 do
- + for y=0, width-1 do
- + local symbol = layout[get_flat_index((width-1) - y, x, width)]
- + -- Rotate chest
- + if symbol == "^" then
- + symbol = "<"
- + elseif symbol == "<" then
- + symbol = "v"
- + elseif symbol == "v" then
- + symbol = ">"
- + elseif symbol == ">" then
- + symbol = "^"
- + end
- + new_layout[get_flat_index(x, y, width)] = symbol
- + end
- + end
- + return new_layout
- +end
- +
- +local function rotate_layout(layout, width, rotations)
- + local new_layout = table.copy(layout)
- + for r=1, rotations do
- + new_layout = rotate_layout_single(new_layout, width)
- + end
- + return new_layout
- +end
- +
- +-- pos: Position to spawn pyramid
- +-- stype: Sand type ("sandstone" or "desert")
- +-- room_id: Room layout identified (see list of rooms above)
- +-- rotations: Number of times to rotate the room (0-3)
- +function tsm_pyramids.make_room(pos, stype, room_id, rotations)
- + local code_table = code_sandstone
- + if stype == "desert_sandstone" then
- + code_table = code_desert_sandstone
- + elseif stype == "desert_stone" then
- + code_table = code_desert_stone
- + end
- + -- Select random deco block
- + local deco_ids = {"1", "2", "3"}
- + local deco = {}
- + for i=1, 3 do
- + local r = math.random(1, #deco_ids)
- + table.insert(deco, deco_ids[r])
- + table.remove(deco_ids, r)
- + end
- + local hole = {x=pos.x+7,y=pos.y+5, z=pos.z+7}
- + if room_id == nil then
- + room_id = math.random(1, #room_types)
- + end
- + local room
- + if room_id < 1 or room_id > #room_types then
- + return false, S("Incorrect room type ID: @1", room_id)
- + end
- + local room = table.copy(room_types[room_id])
- + local tries = 0
- + while tries < #room_types do
- + if room.stype and room.stype ~= stype then
- + room_id = room_id + 1
- + if room_id > #room_types then
- + room_id = 1
- + end
- + room = table.copy(room_types[room_id])
- + else
- + break
- + end
- + tries = tries + 1
- + end
- + local chests = {}
- + local column_style
- + if stype == "desert_stone" then
- + column_style = 0
- + else
- + column_style = math.random(0,4)
- + end
- + -- Custom room walls
- + if room.wall then
- + for iy=0,4,1 do
- + for ie=0,8,1 do
- + local nn = code_table[room.wall[iy*9+ie+1]]
- + minetest.set_node({x=hole.x+ie, y=hole.y-iy, z=hole.z-1}, {name=nn})
- + minetest.set_node({x=hole.x-1, y=hole.y-iy, z=hole.z+ie}, {name=nn})
- +
- + minetest.set_node({x=hole.x+ie, y=hole.y-iy, z=hole.z+9}, {name=nn})
- + minetest.set_node({x=hole.x+9, y=hole.y-iy, z=hole.z+ie}, {name=nn})
- + end
- + end
- + end
- + local layout
- + -- Place the room nodes
- + if room.style == "yrepeat" then
- + layout = rotate_layout(room.layout, ROOM_WIDTH, rotations)
- + for iy=0,4,1 do
- + for ix=0,8,1 do
- + for iz=0,8,1 do
- + local n_str = layout[ix*9+iz+1]
- + local p2 = 0
- + if n_str == "<" then
- + p2 = 0
- + elseif n_str == ">" then
- + p2 = 2
- + elseif n_str == "^" then
- + p2 = 1
- + elseif n_str == "v" then
- + p2 = 3
- + end
- + local cpos = {x=hole.x+ix,y=hole.y-iy,z=hole.z+iz}
- + local nn = replace(n_str, iy, code_table, deco, column_style)
- + minetest.set_node(cpos, {name=nn, param2=p2})
- + if nn == "default:chest" then
- + table.insert(chests, cpos)
- + end
- + end
- + end
- + end
- + elseif room.style == "stacked" then
- + local layout_list = room.layout
- + local layout
- + local layout_offset = room.layout_offset
- + local layout_height = room.layout_height
- + if not layout_offset then
- + layout_offset = 0
- + end
- + if not layout_height then
- + layout_height = 5
- + end
- + for iy=0,layout_height-1,1 do
- + layout = nil
- + if layout_list[layout_height-iy] then
- + layout = rotate_layout(layout_list[layout_height-iy], ROOM_WIDTH, rotations)
- + end
- + for ix=0,8,1 do
- + for iz=0,8,1 do
- + local n_str
- + if layout then
- + n_str = layout[ix*9+iz+1]
- + else
- + n_str = " "
- + end
- + local p2 = 0
- + if n_str == "<" then
- + p2 = 0
- + elseif n_str == ">" then
- + p2 = 2
- + elseif n_str == "^" then
- + p2 = 1
- + elseif n_str == "v" then
- + p2 = 3
- + end
- + local cpos = {x=hole.x+ix,y=hole.y-iy+layout_offset,z=hole.z+iz}
- + local nn = code_table[n_str]
- + minetest.set_node(cpos, {name=nn, param2=p2})
- + if nn == "default:chest" then
- + table.insert(chests, cpos)
- + end
- + end
- + end
- + end
- + else
- + minetest.log("error", "Invalid pyramid room style! room type ID="..r)
- + end
- + local sanded = room.flood_sand ~= false and stype ~= "desert_stone" and math.random(1,8) == 1
- + if #chests > 0 then
- + -- Make at least 8 attempts to fill chests
- + local filled = 0
- + local chests_with_treasure = 0
- + while filled < 8 do
- + for c=1, #chests do
- + local has_treasure = tsm_pyramids.fill_chest(chests[c], stype, sanded, 30)
- + if has_treasure then
- + chests_with_treasure = chests_with_treasure + 1
- + end
- + filled = filled + 1
- + end
- + end
- + -- If no chests were filled with treasure so far, fill a random chest guaranteed
- + if chests_with_treasure == 0 then
- + tsm_pyramids.fill_chest(chests[math.random(1, #chests)], stype, sanded, 100)
- + end
- + end
- + if room.traps and math.random(1,4) == 1 then
- + tsm_pyramids.make_traps(pos, stype, rotations, layout)
- + end
- + if sanded then
- + tsm_pyramids.flood_sand(pos, stype)
- + end
- + return true, nil, sanded
- +end
- +
- +local shuffle_traps = function(layout_traps, layout_room, chance)
- + for a=1, #layout_traps do
- + -- Delete trap if this space of the room is occupied
- + if layout_room[a] ~= " " then
- + layout_traps[a] = "S"
- + -- Randomly turn tile into a trap, or not
- + elseif layout_traps[a] == "?" then
- + -- percentage for a trap
- + if math.random(1,100) <= chance then
- + layout_traps[a] = "~"
- + else
- + layout_traps[a] = "S"
- + end
- + end
- + end
- +end
- +
- +function tsm_pyramids.make_traps(pos, stype, rotations, layout_room)
- + local code_table = code_sandstone
- + if stype == "desert_sandstone" then
- + code_table = code_desert_sandstone
- + elseif stype == "desert_stone" then
- + code_table = code_desert_stone
- + end
- + local layout_traps = table.copy(layout_traps_template)
- + layout_traps = rotate_layout(layout_traps, ROOM_WIDTH, rotations)
- + shuffle_traps(layout_traps, layout_room, math.random(10,100))
- + -- Depth is total depth of trap area:
- + -- * top layer with trap stones
- + -- * followed by air layers
- + -- * followed by 2 layers of lava
- + -- * and 2 layers of sandstone/brick at the bottom (to prevent lava escaping)
- + -- The depth of air between trap stones and lava layer is <depth> - 4
- + local deep_trap = math.random(1,2) == 1
- + local trap_node
- + if deep_trap then
- + trap_node = " "
- + depth = 14
- + else
- + trap_node = "~"
- + depth = 7
- + end
- + local wmin, wmax = -1,9
- + local hole = {x=pos.x+7,y=pos.y, z=pos.z+7}
- + for iy=0,depth,1 do
- + for ix=wmin,wmax,1 do
- + for iz=wmin,wmax,1 do
- + local n_str
- + if ix == wmin or ix == wmax or iz == wmin or iz == wmax then
- + -- Walls around room
- + if iy == depth then
- + n_str = code_table["s"]
- + else
- + n_str = code_table["S"]
- + end
- + minetest.set_node({x=hole.x+ix,y=hole.y-iy,z=hole.z+iz}, {name=n_str})
- + else
- + n_str = layout_traps[ix*9+iz+1]
- + minetest.set_node({x=hole.x+ix,y=hole.y-iy,z=hole.z+iz}, {name=replace2(n_str, iy, depth, code_table, trap_node)})
- + end
- + end
- + end
- + end
- +end
- +
- +function tsm_pyramids.flood_sand(pos, stype)
- + local set_to_sand = {}
- + local nn = "default:sand"
- + if stype == "desert_sandstone" or stype == "desert_stone" then
- + nn = "default:desert_sand"
- + end
- + local hole = {x=pos.x+7,y=pos.y+1, z=pos.z+7}
- + local maxh = math.random(1,4)
- + local chance = math.random(1,7)
- + for ix=0,8,1 do
- + for iz=0,8,1 do
- + if math.random(1,chance) == 1 then
- + local h = math.random(1,maxh)
- + for iy=0,h,1 do
- + local p = {x=hole.x+ix,y=hole.y+iy,z=hole.z+iz}
- + if minetest.get_node(p).name == "air" then
- + table.insert(set_to_sand, p)
- + end
- + end
- + end
- + end
- + end
- + minetest.bulk_set_node(set_to_sand, {name=nn})
- end
- Common subdirectories: ../games/Bucket_Game/mods/codercore/tsm_pyramids/sounds and /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/sounds
- Only in /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids: src
- Common subdirectories: ../games/Bucket_Game/mods/codercore/tsm_pyramids/textures and /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids/textures
- Only in /home/owner/Downloads/minetest.org/insider-prerelease/EN00356/tsm_pyramids: TODO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement