summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEltrac <hi@guhub.cn>2025-03-14 14:44:41 +0800
committerEltrac <hi@guhub.cn>2025-03-14 14:44:41 +0800
commit85bb75d557a815fb28da8c8478f32adcea1f41ef (patch)
tree9eef69e89dafc9fa3805a5153fba39c4774690ca
parentf0472a953b2e3222600f91ed003208278f44dea4 (diff)
feat: delay each mob spawn in one wave
-rw-r--r--config.lua4
-rw-r--r--logic/MobSpawn.lua66
2 files changed, 70 insertions, 0 deletions
diff --git a/config.lua b/config.lua
index 46db5f3..22d06d2 100644
--- a/config.lua
+++ b/config.lua
@@ -39,6 +39,10 @@ config = {
size = 20,
},
+ wave = {
+ mobSummonDelay = 1,
+ },
+
initialMapSize = 7,
extendedMapSize = 5,
diff --git a/logic/MobSpawn.lua b/logic/MobSpawn.lua
new file mode 100644
index 0000000..6029fc4
--- /dev/null
+++ b/logic/MobSpawn.lua
@@ -0,0 +1,66 @@
+local Enemy = require "objects.Enemy"
+local roomData = require "data.roomData"
+local translator = require "i18n.translator"
+
+local MobSpawn = {}
+
+function MobSpawn.waveNumber(room)
+ return #roomData[room.dataName].waves
+end
+
+function MobSpawn.waves(room)
+ local data = roomData[room.dataName]
+ if data.waves then
+ -- initialize if no waves going on
+ if not room.currentWave then
+ room.currentWave = 1
+ elseif room.currentWave <= #data.waves then
+ local waveData = data.waves[room.currentWave]
+
+ -- pre-wave actions
+ if not room.waveStarted then
+ speaker.speak(translator.T(waveData.message or "waveStart"))
+ room.waveStarted = true
+ end
+
+ -- only when all enemies are spawned and killed
+ -- move on to next wave
+ local waveFinished = MobSpawn.doOneWave(waveData.mobs, room)
+ if waveFinished then
+ room.currentWave = room.currentWave + 1
+ room.waveStarted = false -- 重置状态
+ end
+ else
+ room.currentWave = nil
+ return true -- 所有波次完成
+ end
+ return false
+ end
+ return true
+end
+
+function MobSpawn.doOneWave(mobs, room)
+ if not room.currentWaveMobIndex then
+ room.currentWaveMobIndex = 1
+ room.doNotSummonTill = G.time
+ elseif room.currentWaveMobIndex <= #mobs and G.time >= room.doNotSummonTill then
+ local enemyName = mobs[room.currentWaveMobIndex]
+ if enemyName then
+ local enemy = Enemy:new(enemyName, "anyDoor")
+ table.insert(room.objects.enemies, enemy)
+ enemy:placeInRoom(room)
+ end
+ room.currentWaveMobIndex = room.currentWaveMobIndex + 1
+ room.doNotSummonTill = G.time + config.wave.mobSummonDelay
+ end
+
+ -- 如果所有怪物都已经生成,返回 true,通知 waves 进入下一波
+ if room.currentWaveMobIndex > #mobs
+ and #room.objects.enemies == 0 then
+ room.currentWaveMobIndex = nil
+ return true
+ end
+ return false
+end
+
+return MobSpawn