From 216db5aebaf230e80df37e4ac6b3388d39a9585a Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Thu, 30 May 2013 15:47:24 +0000 Subject: [PATCH] Cavern generator can place doors git-svn-id: http://svn.net-core.org/repos/t-engine4@6806 51575b47-30f0-44d4-a5cc-537603b46e54 --- .../default/engine/generator/map/Cavern.lua | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/game/engines/default/engine/generator/map/Cavern.lua b/game/engines/default/engine/generator/map/Cavern.lua index deec99cf9f..dc0b7ee59e 100644 --- a/game/engines/default/engine/generator/map/Cavern.lua +++ b/game/engines/default/engine/generator/map/Cavern.lua @@ -30,6 +30,7 @@ function _M:init(zone, map, level, data) self.hurst = data.hurst or 0.2 self.lacunarity = data.lacunarity or 4 self.octave = data.octave or 1 + self.door_chance = data.door_chance or nil self.min_floor = data.min_floor or 900 self.noise = data.noise or "simplex" end @@ -102,9 +103,46 @@ function _M:generate(lev, old_lev) return self:generate(lev, old_lev) end + if self.door_chance then + self:addDoors() + end + return self:makeStairsInside(lev, old_lev, {}) end +function _M:addDoors() + local possible = {} + for i = 1, self.map.w - 2 do + for j = 1, self.map.h - 2 do + local g4 = self.map:checkEntity(i-1, j, Map.TERRAIN, "block_move") + local g6 = self.map:checkEntity(i+1, j, Map.TERRAIN, "block_move") + local g2 = self.map:checkEntity(i, j+1, Map.TERRAIN, "block_move") + local g8 = self.map:checkEntity(i, j-1, Map.TERRAIN, "block_move") + + if g4 and g6 and not g2 and not g8 then possible[#possible+1] = {x=i, y=j, dir="46"} + elseif not g4 and not g6 and g2 and g8 then possible[#possible+1] = {x=i, y=j, dir="82"} end + end + end + + table.shuffle(possible) + + local delspot = function(x, y) + for i, d in ipairs(possible) do + if d.x == x and d.y == y then table.remove(possible, i) return end + end + end + + while #possible > 0 do + local d = table.remove(possible) + + if rng.percent(self.door_chance) then + self.map(d.x, d.y, Map.TERRAIN, self:resolve("door")) + delspot(d.x-1, d.y) delspot(d.x+1, d.y) + delspot(d.x, d.y-1) delspot(d.x, d.y+1) + end + end +end + --- Create the stairs inside the level function _M:makeStairsInside(lev, old_lev, spots) -- Put down stairs -- GitLab