Add farming as optional dependency
[tsm_mines.git] / init.lua
blobb01a60162745d30c62e068db5305da0ff6a540e0
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 if(minetest.get_modpath("farming")~=nil) then
40 local chest_stuff = {
41 {name="default:apple", max = 3},
42 {name="farming:bread", max = 3},
43 {name="default:steel_ingot", max = 2},
44 {name="default:gold_ingot", max = 2},
45 {name="default:diamond", max = 1},
46 {name="default:pick_steel", max = 1},
47 {name="default:pick_diamond", max = 1}
49 else
50 local chest_stuff = {
51 {name="default:apple", max = 3},
52 {name="default:steel_ingot", max = 2},
53 {name="default:gold_ingot", max = 2},
54 {name="default:diamond", max = 1},
55 {name="default:pick_steel", max = 1},
56 {name="default:pick_diamond", max = 1}
58 end
60 local function rotate_torch(pos)
61 minetest.after(8, function()
62 local n = minetest.get_node(pos)
63 if n ~= nil then
64 if n.name == "tsm_mines:dummy" then
65 minetest.set_node(pos, {name="default:torch",param2=1})
66 end
67 end
68 end)
69 end
71 local function fill_chest(pos)
72 minetest.after(5, function()
73 local n = minetest.get_node(pos)
74 if n ~= nil then
75 if n.name == "tsm_mines:dummy" then
76 minetest.set_node(pos, {name="default:chest"})
77 local meta = minetest.get_meta(pos)
78 --meta:set_string("formspec",default.chest_formspec)
79 --meta:set_string("infotext", "Chest")
80 local inv = meta:get_inventory()
81 inv:set_size("main", 8*4)
82 for i=0,2,1 do
83 local stuff = chest_stuff[math.random(1,#chest_stuff)]
84 local stack = {name=stuff.name, count = math.random(1,stuff.max)}
85 if not inv:contains_item("main", stack) then
86 inv:set_stack("main", math.random(1,32), stack)
87 end
88 end
89 end
90 end
91 end)
92 end
94 local function check_dir(dir,old_dir)
95 if old_dir == 1 and dir == 3 then
96 --n_switch = 2
97 return true
98 elseif old_dir == 3 and dir == 1 then
99 --n_switch = 4
100 return true
101 elseif old_dir == 2 and dir == 4 then
102 --n_switch = 1
103 return true
104 elseif old_dir == 4 and dir == 2 then
105 --n_switch = 3
106 return true
108 return false
110 local function make_mine(mpos,p2,p3, vm_data, vx_area,cnt)
111 local pos = {x=mpos.x,y=mpos.y,z=mpos.z}
112 for j=0,12,1 do
113 local switch = cnt+1
114 n_switch = math.random(1,4)
115 while check_dir(n_switch,switch) == true do
116 n_switch = math.random(1,4)
118 switch = n_switch
120 for i=0,20,1 do
121 local pillar = ids.air
122 local pillar_top = ids.air
123 if i==0 or i == 5 or i == 10 or i == 15 or i == 20 then
124 pillar = ids.fence
125 pillar_top = ids.wood
127 local x1
128 local x2
129 local x3
130 local x4
131 local z1
132 local z2
133 local z3
134 local z4
135 if switch == 1 then
136 x1 = pos.x+1
137 x2 = pos.x
138 x3 = pos.x-1
139 x4 = pos.x
140 x5 = pos.x+1
142 z1 = pos.z+i
143 z2 = pos.z+i
144 z3 = pos.z+i
145 z4 = pos.z+i-1
146 z5 = pos.z+i
147 elseif switch == 2 then
148 x1 = pos.x+i
149 x2 = pos.x+i
150 x3 = pos.x+i
151 x4 = pos.x+i-1
152 x5 = pos.x+i
154 z1 = pos.z+1
155 z2 = pos.z
156 z3 = pos.z-1
157 z4 = pos.z
158 z5 = pos.z+1
159 elseif switch == 3 then
160 x1 = pos.x+1
161 x2 = pos.x
162 x3 = pos.x-1
163 x4 = pos.x
164 x5 = pos.x+1
166 z1 = pos.z-i
167 z2 = pos.z-i
168 z3 = pos.z-i
169 z4 = pos.z-i-1
170 z5 = pos.z-i
171 else
172 x1 = pos.x-i
173 x2 = pos.x-i
174 x3 = pos.x-i
175 x4 = pos.x-i-1
176 x5 = pos.x-i
178 z1 = pos.z+1
179 z2 = pos.z
180 z3 = pos.z-1
181 z4 = pos.z
182 z5 = pos.z+1
184 vm_data[vx_area:indexp({x=x1, y=pos.y-1, z=z1})] = pillar
185 vm_data[vx_area:indexp({x=x2, y=pos.y-1, z=z2})] = ids.air
186 vm_data[vx_area:indexp({x=x3, y=pos.y-1, z=z3})] = pillar
188 vm_data[vx_area:indexp({x=x1, y=pos.y, z=z1})] = pillar
189 vm_data[vx_area:indexp({x=x2, y=pos.y, z=z2})] = ids.air
190 vm_data[vx_area:indexp({x=x3, y=pos.y, z=z3})] = pillar
192 vm_data[vx_area:indexp({x=x1, y=pos.y+1, z=z1})] = pillar_top
193 vm_data[vx_area:indexp({x=x2, y=pos.y+1, z=z2})] = pillar_top
194 vm_data[vx_area:indexp({x=x3, y=pos.y+1, z=z3})] = pillar_top
196 if math.random(0,6) == 3 then
197 vm_data[vx_area:indexp({x=x4, y=pos.y-1, z=z4})] = ids.dummy
198 rotate_torch({x=x4, y=pos.y-1, z=z4})
200 if math.random(0,60) == 13 then
201 local p = {x=x5, y=pos.y-1, z=z5}
202 if vm_data[vx_area:indexp(p)] ~= ids.fence then
203 vm_data[vx_area:indexp(p)] = ids.dummy
204 fill_chest(p)
208 if switch == 1 then
209 pos.z = pos.z+20
210 --pos.x = pos.x+step
211 elseif switch == 2 then
212 pos.x = pos.x+20
213 --pos.z = pos.z+step
214 elseif switch == 3 then
215 pos.z = pos.z-20
216 --pos.x = pos.x+step
217 elseif switch == 4 then
218 pos.x = pos.x-20
219 --pos.z = pos.z+step
222 if cnt == 0 then
223 minetest.log("action", "Created mine at ("..mpos.x..","..mpos.y..","..mpos.z..")")
224 local out2 = make_mine(p2,p3,mpos,vm_data,vx_area,1)
225 local out3 = make_mine(p3,p2,mpos,out2,vx_area,2)
226 return out3
227 else
228 return vm_data
232 local function find_cave(min,max,vm_data, vx_area)
233 local out = nil
234 for i in vx_area:iterp(min, max) do
235 if vm_data[i] == ids.air then
236 local p = vx_area:position(i)
237 if p.y <= MINE_DEEP_MIN then out = p end
238 end
240 return out
243 local cnt = 0
244 minetest.register_on_generated(function(minp, maxp, seed)
245 if minp.y > MINE_DEEP_MIN or minp.y < MINE_DEEP_MAX then
246 return
248 cnt = cnt+1
249 if cnt < 8/MINE_FACTOR then return end
250 cnt = 0
252 --if math.random(0,100) > 85 then return end
253 local vm, emin, emax = minetest.get_mapgen_object("voxelmanip")
254 local data = vm:get_data()
255 local va = VoxelArea:new{ MinEdge = emin, MaxEdge = emax }
256 local mpos = find_cave(emin,emax,data,va)
257 if mpos == nil then return end
258 local mpos2 = {x=mpos.x+math.random(0,3),y=mpos.y-1,z=mpos.z}
259 local mpos3 = {x=mpos.x,y=mpos.y-2,z=mpos.z+math.random(0,3)}
260 data = make_mine(mpos,mpos2,mpos3, data, va, 0)
261 vm:set_data(data)
262 vm:calc_lighting(emin,emax)
263 vm:update_liquids()
264 vm:write_to_map()
265 end)