Add settingtypes.txt
[tsm_mines.git] / init.lua
blobcdc22378f2be4ed653978e1ee494524139adae8e
1 local MINE_DEEP_MIN = tonumber(minetest.setting_get("mines_deep_min"))
2 local MINE_DEEP_MAX = tonumber(minetest.setting_get("mines_deep_max"))
3 local MINE_FACTOR = tonumber(minetest.setting_get("mines_spawnfactor"))
5 if not MINE_DEEP_MIN then
6 MINE_DEEP_MIN = -64
7 end
8 if not MINE_DEEP_MAX then
9 MINE_DEEP_MAX = -380
10 end
11 if not MINE_FACTOR then
12 MINE_FACTOR = 1.5
13 end
15 minetest.register_node("tsm_mines:dummy", {
16 description = "Air (you hacker you!)",
17 inventory_image = "unknown_node.png",
18 wield_image = "unknown_node.png",
19 drawtype = "airlike",
20 paramtype = "light",
21 sunlight_propagates = true,
22 walkable = false,
23 pointable = false,
24 diggable = false,
25 buildable_to = true,
26 air_equivalent = true,
27 drop = "",
28 groups = {not_in_creative_inventory=1},
32 local ids = {
33 air = minetest.get_content_id("air"),
34 fence = minetest.get_content_id("default:fence_wood"),
35 wood = minetest.get_content_id("default:wood"),
36 dummy = minetest.get_content_id("tsm_mines:dummy")
39 local chest_stuff
40 if(minetest.get_modpath("farming")~=nil) then
41 chest_stuff = {
42 {name="default:apple", max = 3},
43 {name="farming:bread", max = 3},
44 {name="default:steel_ingot", max = 2},
45 {name="default:gold_ingot", max = 2},
46 {name="default:diamond", max = 1},
47 {name="default:pick_steel", max = 1},
48 {name="default:pick_diamond", max = 1}
50 else
51 chest_stuff = {
52 {name="default:apple", max = 3},
53 {name="default:steel_ingot", max = 2},
54 {name="default:gold_ingot", max = 2},
55 {name="default:diamond", max = 1},
56 {name="default:pick_steel", max = 1},
57 {name="default:pick_diamond", max = 1}
59 end
61 local function rotate_torch(pos)
62 minetest.after(8, function()
63 local n = minetest.get_node(pos)
64 if n ~= nil then
65 if n.name == "tsm_mines:dummy" then
66 minetest.set_node(pos, {name="default:torch",param2=1})
67 end
68 end
69 end)
70 end
72 local function fill_chest(pos)
73 minetest.after(5, function()
74 local n = minetest.get_node(pos)
75 if n ~= nil then
76 if n.name == "tsm_mines:dummy" then
77 minetest.set_node(pos, {name="default:chest"})
78 local meta = minetest.get_meta(pos)
79 local inv = meta:get_inventory()
80 inv:set_size("main", 8*4)
81 local stacks = {}
82 if(minetest.get_modpath("treasurer") ~= nil) then
83 stacks = treasurer.select_random_treasures(3,4,6,{"minetool", "food", "crafting_component"})
84 else
85 for i=0,2,1 do
86 local stuff = chest_stuff[math.random(1,#chest_stuff)]
87 table.insert(stacks,{name=stuff.name, count = math.random(1,stuff.max)})
88 end
89 end
90 for s=1, #stacks do
91 if not inv:contains_item("main", stacks[s]) then
92 inv:set_stack("main", math.random(1,32), stacks[s])
93 end
94 end
95 end
96 end
97 end)
98 end
100 local function check_dir(dir,old_dir)
101 if old_dir == 1 and dir == 3 then
102 return true
103 elseif old_dir == 3 and dir == 1 then
104 return true
105 elseif old_dir == 2 and dir == 4 then
106 return true
107 elseif old_dir == 4 and dir == 2 then
108 return true
110 return false
112 local function make_mine(mpos,p2,p3, vm_data, vx_area,cnt)
113 local pos = {x=mpos.x,y=mpos.y,z=mpos.z}
114 for j=0,12,1 do
115 local switch = cnt+1
116 local n_switch = math.random(1,4)
117 while check_dir(n_switch,switch) == true do
118 n_switch = math.random(1,4)
120 switch = n_switch
122 for i=0,20,1 do
123 local pillar = ids.air
124 local pillar_top = ids.air
125 if i==0 or i == 5 or i == 10 or i == 15 or i == 20 then
126 pillar = ids.fence
127 pillar_top = ids.wood
129 local x1, x2, x3, x4, x5
130 local z1, z2, z3, z4, z5
131 if switch == 1 then
132 x1 = pos.x+1
133 x2 = pos.x
134 x3 = pos.x-1
135 x4 = pos.x
136 x5 = pos.x+1
138 z1 = pos.z+i
139 z2 = pos.z+i
140 z3 = pos.z+i
141 z4 = pos.z+i-1
142 z5 = pos.z+i
143 elseif switch == 2 then
144 x1 = pos.x+i
145 x2 = pos.x+i
146 x3 = pos.x+i
147 x4 = pos.x+i-1
148 x5 = pos.x+i
150 z1 = pos.z+1
151 z2 = pos.z
152 z3 = pos.z-1
153 z4 = pos.z
154 z5 = pos.z+1
155 elseif switch == 3 then
156 x1 = pos.x+1
157 x2 = pos.x
158 x3 = pos.x-1
159 x4 = pos.x
160 x5 = pos.x+1
162 z1 = pos.z-i
163 z2 = pos.z-i
164 z3 = pos.z-i
165 z4 = pos.z-i-1
166 z5 = pos.z-i
167 else
168 x1 = pos.x-i
169 x2 = pos.x-i
170 x3 = pos.x-i
171 x4 = pos.x-i-1
172 x5 = pos.x-i
174 z1 = pos.z+1
175 z2 = pos.z
176 z3 = pos.z-1
177 z4 = pos.z
178 z5 = pos.z+1
180 vm_data[vx_area:indexp({x=x1, y=pos.y-1, z=z1})] = pillar
181 vm_data[vx_area:indexp({x=x2, y=pos.y-1, z=z2})] = ids.air
182 vm_data[vx_area:indexp({x=x3, y=pos.y-1, z=z3})] = pillar
184 vm_data[vx_area:indexp({x=x1, y=pos.y, z=z1})] = pillar
185 vm_data[vx_area:indexp({x=x2, y=pos.y, z=z2})] = ids.air
186 vm_data[vx_area:indexp({x=x3, y=pos.y, z=z3})] = pillar
188 vm_data[vx_area:indexp({x=x1, y=pos.y+1, z=z1})] = pillar_top
189 vm_data[vx_area:indexp({x=x2, y=pos.y+1, z=z2})] = pillar_top
190 vm_data[vx_area:indexp({x=x3, y=pos.y+1, z=z3})] = pillar_top
192 if math.random(0,6) == 3 then
193 vm_data[vx_area:indexp({x=x4, y=pos.y-1, z=z4})] = ids.dummy
194 rotate_torch({x=x4, y=pos.y-1, z=z4})
196 if math.random(0,60) == 13 then
197 local p = {x=x5, y=pos.y-1, z=z5}
198 if vm_data[vx_area:indexp(p)] ~= ids.fence then
199 vm_data[vx_area:indexp(p)] = ids.dummy
200 fill_chest(p)
204 if switch == 1 then
205 pos.z = pos.z+20
206 elseif switch == 2 then
207 pos.x = pos.x+20
208 elseif switch == 3 then
209 pos.z = pos.z-20
210 elseif switch == 4 then
211 pos.x = pos.x-20
214 if cnt == 0 then
215 minetest.log("action", "Created mine at ("..mpos.x..","..mpos.y..","..mpos.z..")")
216 local out2 = make_mine(p2,p3,mpos,vm_data,vx_area,1)
217 local out3 = make_mine(p3,p2,mpos,out2,vx_area,2)
218 return out3
219 else
220 return vm_data
224 local function find_cave(min,max,vm_data, vx_area)
225 local out = nil
226 for i in vx_area:iterp(min, max) do
227 if vm_data[i] == ids.air then
228 local p = vx_area:position(i)
229 if p.y <= MINE_DEEP_MIN then out = p end
230 end
232 return out
235 local cnt = 0
236 minetest.register_on_generated(function(minp, maxp, seed)
237 if minp.y > MINE_DEEP_MIN or minp.y < MINE_DEEP_MAX then
238 return
240 cnt = cnt+1
241 if cnt < 8/MINE_FACTOR then return end
242 cnt = 0
244 local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
245 local data = vm:get_data()
246 local va = VoxelArea:new{ MinEdge = emin, MaxEdge = emax }
247 local mpos = find_cave(emin,emax,data,va)
248 if mpos == nil then return end
249 local mpos2 = {x=mpos.x+math.random(0,3),y=mpos.y-1,z=mpos.z}
250 local mpos3 = {x=mpos.x,y=mpos.y-2,z=mpos.z+math.random(0,3)}
251 data = make_mine(mpos,mpos2,mpos3, data, va, 0)
252 vm:set_data(data)
253 vm:calc_lighting(emin,emax)
254 vm:update_liquids()
255 vm:write_to_map()
256 end)