diff options
| author | Eltrac <hi@guhub.cn> | 2025-03-14 11:42:34 +0800 |
|---|---|---|
| committer | Eltrac <hi@guhub.cn> | 2025-03-14 11:42:34 +0800 |
| commit | 6b6588aceffd0a1b42457cbdb400e8b472bafc72 (patch) | |
| tree | 82cab8d770c7546ab95ed9db4bf5e9af33e7db29 /objects | |
| parent | 91d1a77866019d358434d70ad967e27b5f1d8d31 (diff) | |
feat: wave mechanism
Diffstat (limited to 'objects')
| -rw-r--r-- | objects/room.lua | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/objects/room.lua b/objects/room.lua index e060c77..1ccaab4 100644 --- a/objects/room.lua +++ b/objects/room.lua @@ -3,16 +3,19 @@ local roomData = require "data.roomData" local roomNames = require "data.roomNames" local roomType = require "data.roomType" local Door = require "objects.door" - +local Enemy = require "objects.enemy" local audio = require "utils.audio" local mapHelper = require "utils.mapHelper" +local translator = require "i18n.translator" local Room = {} Room.__index = Room function Room:new(name) - local data = roomData[name or utils.any(roomNames)] + local dataName = name or utils.any(roomNames) + local data = roomData[dataName] local obj = { + dataName = dataName, name = data.name or "Initial Room", type = data.type or roomType.INITIAL, width = data.width or 0.85, @@ -29,10 +32,6 @@ function Room:new(name) isCleared = false, music = data.music or nil, - - events = { - beforeClear = data.beforeClear or nil - } } setmetatable(obj, Room) @@ -108,7 +107,26 @@ function Room:getLocation(location, offset) local doorLocations = {} for _, door in pairs(self.doors) do - table.insert(doorLocations, { x=door.x, y=door.y }) + local doorX, doorY = door.x, door.y + local doorW, doorH = door.w, door.h + + local lookupTable = { + [Direction.LEFT] = { + x = doorX + doorW, y = doorY + }, + [Direction.RIGHT] = { + x = doorX - doorW, y = doorY + }, + [Direction.TOP] = { + x = doorX, y = doorY + doorH + }, + [Direction.BOTTOM] = { + x = doorX, y = doorY - doorH + }, + } + + local pos = lookupTable[door.location] + table.insert(doorLocations, { x=pos.x, y=pos.y }) end preset.anyDoor = utils.any(doorLocations) @@ -209,6 +227,35 @@ function Room:addWalls() return walls end +function Room:spawnWave(wave) + speaker.speak(translator.T("waveStart")) + for _, enemyName in ipairs(wave) do + local enemy = Enemy:new(enemyName, "anyDoor") + table.insert(self.objects.enemies, enemy) + enemy:placeInRoom(self) + end +end + +function Room:beforeClear() + local data = roomData[self.dataName] + -- if waves are set, handle waves + if data.waves then + if not self.currentWave then + self.currentWave = 1 + -- spawn next wave + elseif self.currentWave <= #data.waves then + self:spawnWave(data.waves[self.currentWave]) + self.currentWave = self.currentWave + 1 + else + self.currentWave = nil + return true -- return true if all waves are cleared + end + return false + end + + return true +end + function Room:init() -- handle objects that need to be placed for _, group in pairs(self.objects) do |
