diff options
Diffstat (limited to 'logic/MobSpawn.lua')
| -rw-r--r-- | logic/MobSpawn.lua | 66 |
1 files changed, 66 insertions, 0 deletions
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 |
