summaryrefslogtreecommitdiff
path: root/objects
diff options
context:
space:
mode:
authorEltrac <hi@guhub.cn>2025-03-14 11:42:34 +0800
committerEltrac <hi@guhub.cn>2025-03-14 11:42:34 +0800
commit6b6588aceffd0a1b42457cbdb400e8b472bafc72 (patch)
tree82cab8d770c7546ab95ed9db4bf5e9af33e7db29 /objects
parent91d1a77866019d358434d70ad967e27b5f1d8d31 (diff)
feat: wave mechanism
Diffstat (limited to 'objects')
-rw-r--r--objects/room.lua61
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