blob: 73df57e2028d5e9bdaf9b625086e9c3c2e221671 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
|