From d273ea8e325cd8cc7da10212078eba257e39ad9b Mon Sep 17 00:00:00 2001 From: DualFroz Date: Mon, 7 Sep 2026 12:08:31 +0200 Subject: [PATCH] feat: extend level with Level:entityById and Level:shrineAt --- src/level.lua | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/src/level.lua b/src/level.lua index 994e2ee..b3d92ff 100644 --- a/src/level.lua +++ b/src/level.lua @@ -18,6 +18,25 @@ function Level.new(fields) floorItems = fields.floorItems or {}, traps = fields.traps or {}, lights = fields.lights or {}, + hazards = fields.hazards or {}, + shrines = fields.shrines or {}, + questBoards = fields.questBoards or {}, + cauldrons = fields.cauldrons or {}, + nodes = fields.nodes or {}, + corpses = fields.corpses or {}, + chests = fields.chests or {}, + captives = fields.captives or {}, + vaultLevers = fields.vaultLevers or {}, + vaultDoors = fields.vaultDoors or {}, + secretDoors = fields.secretDoors or {}, + blocks = fields.blocks or {}, + plates = fields.plates or {}, + gates = fields.gates or {}, + prefabVaults = fields.prefabVaults or {}, + rifts = fields.rifts or {}, + weather = fields.weather, + biome = fields.biome, + event = fields.event, dark = fields.dark or false, explored = fields.explored or {}, upX = fields.upX, upY = fields.upY, @@ -34,6 +53,13 @@ function Level:entityAt(x, y) return nil end +function Level:entityById(id) + for _, entity in ipairs(self.entities) do + if entity.id == id then return entity end + end + return nil +end + function Level:trapAt(x, y) for _, trap in ipairs(self.traps) do if trap.x == x and trap.y == y then return trap end @@ -41,6 +67,90 @@ function Level:trapAt(x, y) return nil end +function Level:shrineAt(x, y) + for _, shrine in ipairs(self.shrines) do + if shrine.x == x and shrine.y == y then return shrine end + end + return nil +end + +function Level:questBoardAt(x, y) + for _, board in ipairs(self.questBoards) do + if board.x == x and board.y == y then return board end + end + return nil +end + +function Level:cauldronAt(x, y) + for _, cauldron in ipairs(self.cauldrons) do + if cauldron.x == x and cauldron.y == y then return cauldron end + end + return nil +end + +function Level:nodeAt(x, y) + for _, node in ipairs(self.nodes) do + if node.x == x and node.y == y then return node end + end + return nil +end + +function Level:corpseAt(x, y) + for _, corpse in ipairs(self.corpses) do + if corpse.x == x and corpse.y == y then return corpse end + end + return nil +end + +function Level:chestAt(x, y) + for _, chest in ipairs(self.chests) do + if chest.x == x and chest.y == y then return chest end + end + return nil +end + +function Level:captiveAt(x, y) + for _, captive in ipairs(self.captives) do + if captive.x == x and captive.y == y then return captive end + end + return nil +end + +function Level:vaultLeverAt(x, y) + for _, lever in ipairs(self.vaultLevers) do + if lever.x == x and lever.y == y then return lever end + end + return nil +end + +function Level:blockAt(x, y) + for _, block in ipairs(self.blocks) do + if block.x == x and block.y == y then return block end + end + return nil +end + +function Level:plateAt(x, y) + for _, plate in ipairs(self.plates) do + if plate.x == x and plate.y == y then return plate end + end + return nil +end + +function Level:gateAt(x, y) + for _, gate in ipairs(self.gates) do + if gate.x == x and gate.y == y then return gate end + end + return nil +end + +function Level:riftAt(x, y) + for _, rift in ipairs(self.rifts) do + if rift.x == x and rift.y == y then return rift end + end + return nil +end + function Level:itemsAt(x, y) local here = {} for _, ground in ipairs(self.floorItems) do @@ -79,6 +189,25 @@ function Level:toData() floorItems = self.floorItems, traps = self.traps, lights = self.lights, + hazards = self.hazards, + shrines = self.shrines, + questBoards = self.questBoards, + cauldrons = self.cauldrons, + nodes = self.nodes, + corpses = self.corpses, + chests = self.chests, + captives = self.captives, + vaultLevers = self.vaultLevers, + vaultDoors = self.vaultDoors, + secretDoors = self.secretDoors, + blocks = self.blocks, + plates = self.plates, + gates = self.gates, + prefabVaults = self.prefabVaults, + rifts = self.rifts, + weather = self.weather, + biome = self.biome, + event = self.event, dark = self.dark, explored = explored, upX = self.upX, upY = self.upY, @@ -103,6 +232,25 @@ function Level.fromData(snapshot) floorItems = snapshot.floorItems, traps = snapshot.traps, lights = snapshot.lights, + hazards = snapshot.hazards, + shrines = snapshot.shrines, + questBoards = snapshot.questBoards, + cauldrons = snapshot.cauldrons, + nodes = snapshot.nodes, + corpses = snapshot.corpses, + chests = snapshot.chests, + captives = snapshot.captives, + vaultLevers = snapshot.vaultLevers, + vaultDoors = snapshot.vaultDoors, + secretDoors = snapshot.secretDoors, + blocks = snapshot.blocks, + plates = snapshot.plates, + gates = snapshot.gates, + prefabVaults = snapshot.prefabVaults, + rifts = snapshot.rifts, + weather = snapshot.weather, + biome = snapshot.biome, + event = snapshot.event, dark = snapshot.dark, explored = explored, upX = snapshot.upX, upY = snapshot.upY,