summaryrefslogtreecommitdiff
path: root/logic/MapGenerator.lua
diff options
context:
space:
mode:
authorEltrac <hi@guhub.cn>2025-03-14 08:54:33 +0800
committerEltrac <hi@guhub.cn>2025-03-14 08:54:33 +0800
commit78b207c925554d45de804c8e85efa23bbc32d8d4 (patch)
tree0b817864c7379843fbadac46ba399183851879c4 /logic/MapGenerator.lua
parent0b61a40f7b81327f3266db3f8c198b83b7b72b10 (diff)
refactor: separate map generation logic
Diffstat (limited to 'logic/MapGenerator.lua')
-rw-r--r--logic/MapGenerator.lua57
1 files changed, 57 insertions, 0 deletions
diff --git a/logic/MapGenerator.lua b/logic/MapGenerator.lua
new file mode 100644
index 0000000..f1f45df
--- /dev/null
+++ b/logic/MapGenerator.lua
@@ -0,0 +1,57 @@
+local Room = require "objects.room"
+
+local mapGenerator = {}
+
+function mapGenerator.generate(roomCount, initial)
+ local firstRoom = Room:new(initial and "initialRoom" or nil)
+ local map = { firstRoom }
+ local available = utils.copy(map)
+
+ for i = 2, (roomCount or config.initialMapSize) do
+ -- connect the room with a new room
+ local newRoom = Room:new()
+ local prevRoom = utils.any(available)
+ prevRoom:connect(newRoom)
+
+ if prevRoom:isDoorFull() then
+ table.remove(available, utils.indexof(available, prevRoom))
+ end
+
+ table.insert(map, newRoom)
+ table.insert(available, newRoom)
+ end
+
+ return map
+end
+
+function mapGenerator.continue(roomCount, from)
+ -- continue game by extending the map
+ local newMap = mapGenerator.generate(roomCount or config.extendedMapSize, true)
+ local room = from or G.currentRoom
+
+ -- try extending from the last room
+ local entranceDoor, exitDoor = room:connect(newMap[1])
+ if not entranceDoor or not exitDoor then
+ -- if not doorless direction available in this room
+ -- try extend from a random Room
+ repeat
+ room = utils.any(G.allRooms)
+ if room ~= from and not room:isDoorFull() then
+ print("extended from a random room")
+ entranceDoor, exitDoor = room:connect(newMap[1])
+ break
+ end
+ until false
+ end
+ if exitDoor then
+ newMap[1]:removeDoor(exitDoor.location)
+ end
+
+ for _, newRoom in ipairs(newMap) do
+ table.insert(G.allRooms, newRoom)
+ end
+
+ G.mapExpanded = true
+end
+
+return mapGenerator