Blame view

src/adv/AdvBattle.lua 6.28 KB
36c30c5c   zhouahaihai   冒险
1
  local Player, Enemy = table.unpack(require "adv.advPlayer")
46fac6f1   zhouahaihai   酱料
2
  local Buff = require "adv.AdvBuff"
32bca13b   zhouahaihai   bug
3
  local Passive = require "adv.AdvPassive"
36c30c5c   zhouahaihai   冒险
4
  local Battle = class("Battle")
46fac6f1   zhouahaihai   酱料
5
6
7
  function Battle:ctor(adv)
  	self.adv = adv
  	self.player = nil --玩家
02c4de8d   zhouahaihai   增加 固有技
8
  	self.isNewPlayer = false
a734980c   suhongyang   冒险战斗数据打完以前不存储
9
  	self.enemy = nil
46fac6f1   zhouahaihai   酱料
10
  	self.enemys = {} --怪
e459a5fc   suhongyang   战斗回合检查同步以及回合数据缓存
11
  	self.tempData = {} -- 临时回合数据
46fac6f1   zhouahaihai   酱料
12
13
14
  	self:initPlayer()
  	self:initEnemys()
  	self:initAfter()
02c4de8d   zhouahaihai   增加 固有技
15
16
17
  	if self.isNewPlayer then
  		self.player:triggerPassive(Passive.BORN_ONCE)
  	end
46fac6f1   zhouahaihai   酱料
18
19
20
21
22
23
24
  end
  
  function Battle:initAfter()
  	self.player:initAfter(self.adv.advTeam.player)
  	for _, enemy in pairs(self.enemys) do
  		enemy:initAfter(self.adv.rooms[enemy.roomId].blocks[enemy.blockId].event.enemy)
  	end
ae20365b   suhongyang   Revert "修改冒险战斗逻辑"
25
26
27
28
  	if self.adv.advTeam.enemyId then
  		local enemy = self:getEnemyById(self.adv.advTeam.enemyId)
  		self.enemy = enemy
  	end
46fac6f1   zhouahaihai   酱料
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  end
  
  function Battle:initPlayer()
  	if not next(self.adv.advTeam.heros) then return end
  	if not self.adv.advTeam.player then
  		local hp = 0
  		local player = {}
  		player.passives = {}
  		for slot, heroId in pairs(self.adv.advTeam.heros) do
  			if self.adv.owner.heros[heroId] then
  				hp = hp + self.adv.owner.heros[heroId]:getProperty("battleV")
  				local advSkillId = csvdb["unitCsv"][self.adv.owner.heros[heroId]:getSkinId()]["adv"]
  				if advSkillId > 1000 then
  					table.insert(player.passives, {id = advSkillId, level = self.adv.owner.heros[heroId]:getSkillLevel(4)})
  				end
  			end
  		end
  		player.hp = hp
384bb077   zhouahaihai   挂机
47
  		player.atk = tonumber(string.format("%0.0f", player.hp * 0.1)) --todo 系数是临时的
e996b82a   zhouahaihai   冒险增加防御属性
48
  		player.def = 0
46fac6f1   zhouahaihai   酱料
49
50
51
  		player.miss = 0
  		player.hit = 100
  		self.adv.advTeam.player = player
02c4de8d   zhouahaihai   增加 固有技
52
  		self.isNewPlayer = true
46fac6f1   zhouahaihai   酱料
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  	end
  	self.player = Player.new(self, self.adv.advTeam.player)
  end
  
  function Battle:initEnemys()
  	for _, room in pairs(self.adv.rooms) do
  		for _, block in pairs(room.blocks) do
  			self:addEnemy(room, block)	
  		end
  	end
  end
  
  function Battle:addEnemy(room, block)
  	if block.event and (block.event.etype == AdvEventType.BOSS or block.event.etype == AdvEventType.Monster) then
  		if not block.event.enemy then
  			local enemyCsv = csvdb["event_monsterCsv"][block.event.id]
  			local enemy = {}
  			enemy.hp = enemyCsv.hp + enemyCsv.levelhp * self.adv.advInfo.level
  			enemy.atk = enemyCsv.atk + enemyCsv.levelatk * self.adv.advInfo.level
  			enemy.hit = enemyCsv.hit + enemyCsv.levelhit * self.adv.advInfo.level
  			enemy.miss = enemyCsv.miss + enemyCsv.levelmiss * self.adv.advInfo.level
e996b82a   zhouahaihai   冒险增加防御属性
74
  			enemy.def = enemyCsv.def + enemyCsv.leveldef * self.adv.advInfo.level
46fac6f1   zhouahaihai   酱料
75
76
77
78
79
  			enemy.passives = {}
  			for _, id in ipairs(enemyCsv.passive:toArray(true, "=")) do
  				table.insert(enemy.passives, {id = id})
  			end
  			block.event.enemy = enemy
46fac6f1   zhouahaihai   酱料
80
  		end
02c4de8d   zhouahaihai   增加 固有技
81
82
83
  		local player = Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy)
  		table.insert(self.enemys, player)
  		return player
46fac6f1   zhouahaihai   酱料
84
85
86
87
88
  	end 
  end
  
  function Battle:getEnemy(roomId, blockId)
  	for _, enemy in ipairs(self.enemys) do
36c30c5c   zhouahaihai   冒险
89
  		if enemy.roomId == roomId and enemy.blockId == blockId then
46fac6f1   zhouahaihai   酱料
90
91
92
93
94
95
96
97
98
99
100
101
  			return enemy
  		end
  	end
  end
  
  function Battle:getEnemyById(id)
  	for _, enemy in ipairs(self.enemys) do
  		if enemy.id == id then
  			return enemy
  		end
  	end
  end
39a6e08b   suhongyang   冒险战斗内逻辑调整
102
103
104
105
106
107
  
  function Battle:getRBByEnemyId(enemyId)
  	local enemy = self:getEnemyById(enemyId)
  	return enemy.roomId, enemy.blockId
  end
  
ae20365b   suhongyang   Revert "修改冒险战斗逻辑"
108
109
110
111
112
113
114
  function Battle:isBattleEnd()
  	if not self.enemy then
  		return true
  	end
  end
  
  --战斗开始
ae9a74b5   suhongyang   返回miss,快速战斗逻辑
115
  function Battle:battleBegin(roomId, blockId, isQuick)
e459a5fc   suhongyang   战斗回合检查同步以及回合数据缓存
116
  	self.tempData = {} -- 清理上次战斗数据
ae20365b   suhongyang   Revert "修改冒险战斗逻辑"
117
  	if self.enemy then
e459a5fc   suhongyang   战斗回合检查同步以及回合数据缓存
118
  		self.player:reset(self.adv.advTeam.player)
ae20365b   suhongyang   Revert "修改冒险战斗逻辑"
119
120
  		self.enemy:reset(self.adv.rooms[self.enemy.roomId].blocks[self.enemy.blockId].event.enemy)
  	end
46fac6f1   zhouahaihai   酱料
121
122
  	local enemy = self:getEnemy(roomId, blockId)
  	if enemy then
8cec27ce   suhongyang   战斗开始
123
  		self.adv:backBattleBegin()
a734980c   suhongyang   冒险战斗数据打完以前不存储
124
  		self.enemy = enemy
821f2b60   suhongyang   冒险战斗完善,增加battlebe...
125
  		self.player:battleBegin()
a734980c   suhongyang   冒险战斗数据打完以前不存储
126
  		self.enemy:battleBegin()
ae9a74b5   suhongyang   返回miss,快速战斗逻辑
127
128
129
130
131
132
133
  		if not isQuick then
  			self:doBattleTurn()
  			return
  		end
  		while not enemy.isDead and not self.player.isDead do
  			self:doBattleTurn()
  		end
39a6e08b   suhongyang   冒险战斗内逻辑调整
134
135
136
  	end
  end
  
e459a5fc   suhongyang   战斗回合检查同步以及回合数据缓存
137
138
139
140
141
142
143
  -- 检查回合数同步
  function Battle:checkTurn(turn)
  	if self.tempData[turn] then
  		return true
  	end
  end
  
39a6e08b   suhongyang   冒险战斗内逻辑调整
144
145
  -- 战斗内一回合
  function Battle:doBattleTurn()
a734980c   suhongyang   冒险战斗数据打完以前不存储
146
  	local enemy = self.enemy
39a6e08b   suhongyang   冒险战斗内逻辑调整
147
148
149
150
151
152
153
154
155
156
157
158
  	-- 玩家先出手
  	self.adv:backAtk(nil, enemy.id)
  	self:doPlayerTurn(self.player, enemy)
  	--是否无法攻击
  	if not enemy.isDead and not enemy:hadBuff(Buff.CANT_BACK_ATK) then
  		self.adv:backAtk(enemy.id, nil)
  		self:doPlayerTurn(enemy, self.player)
  	end
  	-- 判定死亡
  	if enemy.isDead or self.player.isDead then
  		local deadPlayer = enemy.isDead and enemy or self.player
  		deadPlayer:battleEnd()
a734980c   suhongyang   冒险战斗数据打完以前不存储
159
  		self.enemy = nil
ae20365b   suhongyang   Revert "修改冒险战斗逻辑"
160
161
  	else
  		self.adv:backTurnEnd()
46fac6f1   zhouahaihai   酱料
162
  	end
a88a35fd   suhongyang   Fix bug
163
  	self:getTempDB()
46fac6f1   zhouahaihai   酱料
164
  end
39a6e08b   suhongyang   冒险战斗内逻辑调整
165
166
167
  
  --战斗内角色回合逻辑
  function Battle:doPlayerTurn(atkPlayer, hurtPlayer)
7c55db1f   suhongyang   Buff逻辑完善,buff生效次数...
168
  	atkPlayer:beforeTurn()
42f2d1d3   suhongyang   战斗内技能序列逻辑
169
170
171
172
173
  	if #(atkPlayer.skillOrder) > 0 then
  		atkPlayer:releaseSpecialSkill()
  	else
  		hurtPlayer:hurt(atkPlayer:getHurtValue(), atkPlayer, {hurtType = 1})
  	end
7c55db1f   suhongyang   Buff逻辑完善,buff生效次数...
174
175
176
  	atkPlayer:afterTurn()
  	atkPlayer:clearTurn()
  end
39a6e08b   suhongyang   冒险战斗内逻辑调整
177
  
46fac6f1   zhouahaihai   酱料
178
179
  --触发全员被动技能
  function Battle:triggerPassive(condType, params)
02c4de8d   zhouahaihai   增加 固有技
180
181
182
183
  	self.player:triggerPassive(condType, params)
  	for _, enemy in ipairs(self.enemys) do
  		enemy:triggerPassive(condType, params)
  	end
46fac6f1   zhouahaihai   酱料
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
  end
  
  --回合
  function Battle:afterRound()
  	self.player:afterRound()
  	table.sort(self.enemys, function(e1, e2)
  		return e1.id < e2.id
  	end)
  	for _, enemy in ipairs(self.enemys) do
  		enemy:afterRound()
  	end
  	self.player:clearRound()
  	for _, enemy in ipairs(self.enemys) do
  		enemy:clearRound()
  	end
  	for i = #self.enemys, 1, -1 do
  		if self.enemys[i].isDead then
  			self.adv:enemyDead(self.enemys[i].roomId, self.enemys[i].blockId)
  			self.enemys[i]:clear()
  			table.remove(self.enemys, i)
  		end
  	end
ec87b4a5   zhouahaihai   冒险 完善
206
207
208
209
210
211
  
  	if self.adv.advInfo.power > 0 then
  		self.adv:changePower(-1)
  	else
  		self.player:hurt(self.player.hpMax / 10, nil, {hurtType = 4})
  	end
46fac6f1   zhouahaihai   酱料
212
  	if self.player.isDead then
4b7c7c96   zhouahaihai   增加 清空 挂机 冒险gm 角色经验
213
  		self.adv:over(false)
46fac6f1   zhouahaihai   酱料
214
215
216
  	end
  end
  
e459a5fc   suhongyang   战斗回合检查同步以及回合数据缓存
217
218
219
220
221
222
223
224
225
226
  -- 写入临时数据
  function Battle:getTempDB()
  	local turnDB = {}
  	if self.enemy then
  		turnDB.enemy = self.enemy:getDB()
  	end
  	turnDB.player = self.player:getDB()
  	table.insert(self.tempData, turnDB)
  end
  
46fac6f1   zhouahaihai   酱料
227
228
  --写入数据
  function Battle:getDB()
ae20365b   suhongyang   Revert "修改冒险战斗逻辑"
229
230
231
232
233
234
  	if not self.enemy then
  		self.adv.advTeam.enemyId = nil
  	else
  		self.adv.advTeam.enemyId = self.enemy.id
  		return
  	end
46fac6f1   zhouahaihai   酱料
235
236
237
238
239
  	self.adv.advTeam.player = self.player:getDB()
  	for _, enemy in ipairs(self.enemys) do
  		local block = self.adv.rooms[enemy.roomId].blocks[enemy.blockId]
  		block.event.enemy = enemy:getDB()
  	end
46fac6f1   zhouahaihai   酱料
240
241
  end
  
36c30c5c   zhouahaihai   冒险
242
  return Battle