feat(mapgen): add room-and-corridor and bsp generators
This commit is contained in:
1 parent
e9cdb763ae
commit
eeb96205cf
2 files changed
+120
No files matched your search
@@ -0,0 +1,51 @@
|
||||
-- Non-overlapping rectangular rooms joined by L-shaped corridors. Returns a
|
||||
-- carved Map with map.rooms populated; stair, door and trap placement is the
|
||||
-- dungeon layer's job, not the generator's.
|
||||
|
||||
local Map = require("map")
|
||||
local Carve = require("gen.carve")
|
||||
|
||||
local Rooms = {}
|
||||
|
||||
local function overlaps(a, b)
|
||||
return a.x <= b.x + b.w and a.x + a.w >= b.x
|
||||
and a.y <= b.y + b.h and a.y + a.h >= b.y
|
||||
end
|
||||
|
||||
function Rooms.generate(width, height, rng, options)
|
||||
options = options or {}
|
||||
local maxRooms = options.maxRooms or 14
|
||||
local minSize = options.minRoomSize or 4
|
||||
local maxSize = options.maxRoomSize or 9
|
||||
local map = Map.new(width, height)
|
||||
|
||||
for _ = 1, maxRooms do
|
||||
local w = rng:range(minSize, maxSize)
|
||||
local h = rng:range(minSize, maxSize)
|
||||
local room = {
|
||||
x = rng:range(2, width - w - 1),
|
||||
y = rng:range(2, height - h - 1),
|
||||
w = w, h = h,
|
||||
}
|
||||
local fits = true
|
||||
for _, other in ipairs(map.rooms) do
|
||||
if overlaps(room, other) then
|
||||
fits = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if fits then
|
||||
Carve.rect(map, room.x, room.y, room.w, room.h)
|
||||
if #map.rooms > 0 then
|
||||
local prevX, prevY = Carve.center(map.rooms[#map.rooms])
|
||||
local newX, newY = Carve.center(room)
|
||||
Carve.corridor(map, prevX, prevY, newX, newY, rng)
|
||||
end
|
||||
map.rooms[#map.rooms + 1] = room
|
||||
end
|
||||
end
|
||||
|
||||
return map
|
||||
end
|
||||
|
||||
return Rooms
|
||||
Reference in new issue
Block a user