Blame view

src/adv/AdvBattle.lua 8.69 KB
19d8c401   zhouhaihai   大小写
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
46fac6f1   zhouahaihai   酱料
9
  	self.enemys = {} --怪
9687f887   zhouhaihai   建筑被动
10
  	self.builds = {} -- 建筑
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
11
  	self.cachePassiveEvent = {}
46fac6f1   zhouahaihai   酱料
12
13
14
  	self:initPlayer()
  	self:initEnemys()
  	self:initAfter()
02c4de8d   zhouahaihai   增加 固有技
15
16
  	if self.isNewPlayer then
  		self.player:triggerPassive(Passive.BORN_ONCE)
51718558   zhouhaihai   中继层初始经验
17
  		self.player:addExp((self.adv.level - 1) * 40)
02c4de8d   zhouahaihai   增加 固有技
18
  	end
46fac6f1   zhouahaihai   酱料
19
20
21
  end
  
  function Battle:initAfter()
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
22
23
24
25
26
  	self.player:initAfter(self.adv.owner:getProperty("advTeam").player)
  	for idx, mapEnemys in pairs(self.enemys) do
  		for _, enemy in ipairs(mapEnemys) do
  			enemy:initAfter(self.adv:getBlock(enemy.roomId, enemy.blockId, idx).event.enemy)
  		end
9687f887   zhouhaihai   建筑被动
27
28
29
30
31
  	end	
  	for idx, mapBuilds in pairs(self.builds) do
  		for _, build in ipairs(mapBuilds) do
  			build:initAfter(self.adv:getBlock(build.roomId, build.blockId, idx).event.build)
  		end
46fac6f1   zhouahaihai   酱料
32
  	end
46fac6f1   zhouahaihai   酱料
33
  end
b53593b5   zhouhaihai   羁绊加成
34
35
36
37
38
39
40
41
42
  --[[
  队伍总属性 = 基础属性 + 等级 × 成长率 	
  	基础属性:	固定属性,与章节、队伍够成、养成无关,由策划给出	
  	等级:	根据进入时的关卡,获得一个【初始等级】;消灭怪物获得经验后,累计N点会提升等级	
  	羁绊加成:	加成条件与“战斗”相同,加成目标改为【冒险队】	
  			
  	成长率:	由【队伍总生存力】决定	
  			成长率 =(总生存力 / 80^0.52 + INT(总角色等级 / 50* 1
  --]]
46fac6f1   zhouahaihai   酱料
43
  
6b5c9206   zhouhaihai   冒险资助升级属性奖励
44
45
46
47
48
49
50
51
52
53
54
55
  local function getAdvLvAttrUp(upAttrs, attrName, baseAttr)
  	-- 1=冒险队属性;1=点数/百分比=属性枚举=参数;属性枚举(1=生命上限/2=魔法上限/3=攻击/4=防御);点数/百分比(0=点数/1=百分比)
  	local Enem = {
  		hp = 1,
  		sp = 2,
  		atk = 3,
  		def = 4,
  	}
  	if not Enem[attrName] then return baseAttr end
  	return baseAttr + (upAttrs[Enem[attrName]] or 0)
  end
  
46fac6f1   zhouahaihai   酱料
56
  function Battle:initPlayer()
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
57
58
  	local advTeam = self.adv.owner:getProperty("advTeam")
  	if not next(advTeam.heros) then return end
bfd33de5   zhouhaihai   队长技
59
  	local leaderPassive = {}
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
60
61
  	local player = advTeam.player
  	if not player then
565b0ad0   zhouhaihai   bug
62
  		local advAddAttrs = self.adv.owner:getAdvLvAddAttrs()
6b5c9206   zhouhaihai   冒险资助升级属性奖励
63
  
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
64
  		player = {}
ccbafe67   zhouhaihai   冒险神器和buff
65
66
  		player.level = 1
  		player.exp = 0
6b5c9206   zhouhaihai   冒险资助升级属性奖励
67
  		player.sp = getAdvLvAttrUp(advAddAttrs, "sp", 100)
ccbafe67   zhouhaihai   冒险神器和buff
68
  		player.growth = {}
46fac6f1   zhouahaihai   酱料
69
  		player.passives = {}
ccbafe67   zhouhaihai   冒险神器和buff
70
  
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
71
  		for slot, heroId in pairs(advTeam.heros) do
bfd33de5   zhouhaihai   队长技
72
73
74
75
76
77
78
  			if heroId == advTeam.leader or heroId == advTeam.leader2 then
  				local hero = self.adv.owner.heros[heroId]
  				if hero then
  					local unit = csvdb["unitCsv"][self.adv.owner.heros[heroId]:getProperty("type")]
  					if unit.advCaptain ~= 0 then
  						table.insert(player.passives, {id = unit.advCaptain, level = 1})
  					end
46fac6f1   zhouahaihai   酱料
79
80
81
  				end
  			end
  		end
ccbafe67   zhouhaihai   冒险神器和buff
82
83
  
  		local attrs = self.adv.owner:getTeamBattleInfo(advTeam).heros
6b5c9206   zhouhaihai   冒险资助升级属性奖励
84
85
  
  
ccbafe67   zhouhaihai   冒险神器和buff
86
87
88
  		for attrName, _ in pairs(AdvAttsEnum) do
  			for _, hero in pairs(attrs) do
  				player[attrName] = (player[attrName] or 0) + hero[attrName]
b53593b5   zhouhaihai   羁绊加成
89
  			end
6b5c9206   zhouhaihai   冒险资助升级属性奖励
90
  			player[attrName] = getAdvLvAttrUp(advAddAttrs, attrName, player[attrName])
98761edc   zhouhaihai   buff 补充
91
  			player.growth[attrName] = player[attrName] * 0.025
b53593b5   zhouhaihai   羁绊加成
92
  		end
ccbafe67   zhouhaihai   冒险神器和buff
93
  
1b35c0a2   zhouhaihai   冒险
94
  		player.hpMax = player.hp or 0
02c4de8d   zhouahaihai   增加 固有技
95
  		self.isNewPlayer = true
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
96
  		advTeam.player = player
46fac6f1   zhouahaihai   酱料
97
  	end
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
98
  	self.player = Player.new(self, player)
46fac6f1   zhouahaihai   酱料
99
100
101
  end
  
  function Battle:initEnemys()
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
102
103
104
105
106
  	for idx, map in pairs(self.adv.maps) do
  		self:initMapEnemys(idx)
  	end
  end
  
9687f887   zhouhaihai   建筑被动
107
  
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
  function Battle:initMapEnemys(mapIdx)
  	self.enemys[mapIdx] = {}
  	local map = self.adv.maps[mapIdx]
  	if map then
  		for _, room in pairs(map.rooms) do
  			for _, block in pairs(room.blocks) do
  				self:addEnemy(room, block, mapIdx)	
  			end
  		end
  	end
  	if self.cachePassiveEvent[mapIdx] then
  		for _, passiveC in ipairs(self.cachePassiveEvent or {}) do
  			for _, enemy in ipairs(self.enemys[mapIdx]) do
  				enemy:triggerPassive(passiveC[1], passiveC[2])
  			end
9687f887   zhouhaihai   建筑被动
123
124
125
126
  
  			for _, build in ipairs(self.builds[mapIdx]) do
  				build:triggerPassive(passiveC[1], passiveC[2])
  			end
46fac6f1   zhouahaihai   酱料
127
128
  		end
  	end
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
129
  	self.cachePassiveEvent[mapIdx] = nil
46fac6f1   zhouahaihai   酱料
130
131
  end
  
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
132
133
134
135
  function Battle:addEnemy(room, block, mapIdx)
  	mapIdx = mapIdx or self.adv:getCurMapIdx()
  
  	if block:isMonster() then
46fac6f1   zhouahaihai   酱料
136
137
138
  		if not block.event.enemy then
  			local enemyCsv = csvdb["event_monsterCsv"][block.event.id]
  			local enemy = {}
eee37c88   zhouhaihai   楼层数据
139
140
141
142
  			local curFloorData = self.adv:getCurFloorData() or {}
  			for attrName, _ in pairs(AdvAttsEnum) do
  				enemy[attrName] = enemyCsv[attrName] * curFloorData[attrName]
  			end
46fac6f1   zhouahaihai   酱料
143
  			enemy.passives = {}
de3b786f   zhouhaihai   字段换名字
144
  			for _, id in ipairs(enemyCsv.mapPassive:toArray(true, "=")) do
46fac6f1   zhouahaihai   酱料
145
146
147
  				table.insert(enemy.passives, {id = id})
  			end
  			block.event.enemy = enemy
46fac6f1   zhouahaihai   酱料
148
  		end
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
149
150
  		local player = Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy, mapIdx)
  		table.insert(self.enemys[mapIdx], player)
02c4de8d   zhouahaihai   增加 固有技
151
  		return player
9687f887   zhouhaihai   建筑被动
152
153
154
155
156
157
158
159
160
161
162
163
164
  	elseif block:isBuild() then
  		if not block.event.build then
  			local buildCsv = csvdb["event_buildCsv"][block.event.id]
  			local build = {}
  			build.passives = {}
  			for _, id in ipairs(buildCsv.passive:toArray(true, "=")) do
  				table.insert(build.passives, {id = id})
  			end
  			block.event.build = build
  		end
  		local player = Build.new(self, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.build, mapIdx)
  		table.insert(self.builds[mapIdx], player)
  		return player
46fac6f1   zhouahaihai   酱料
165
166
167
  	end 
  end
  
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
168
169
170
  function Battle:getEnemy(roomId, blockId, mapIdx)
  	mapIdx = mapIdx or self.adv:getCurMapIdx()
  	for _, enemy in ipairs(self.enemys[mapIdx] or {}) do
36c30c5c   zhouahaihai   冒险
171
  		if enemy.roomId == roomId and enemy.blockId == blockId then
46fac6f1   zhouahaihai   酱料
172
173
174
175
176
  			return enemy
  		end
  	end
  end
  
9687f887   zhouhaihai   建筑被动
177
178
179
180
181
182
183
  function Battle:getBuild(roomId, blockId, mapIdx)
  	mapIdx = mapIdx or self.adv:getCurMapIdx()
  	for _, build in ipairs(self.builds[mapIdx] or {}) do
  		if build.roomId == roomId and build.blockId == blockId then
  			return build
  		end
  	end
d4720dfd   zhouhaihai   bug
184
  end
9687f887   zhouhaihai   建筑被动
185
  
46fac6f1   zhouahaihai   酱料
186
  function Battle:getEnemyById(id)
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
187
188
189
190
191
  	for idx, mapEnemys in pairs(self.enemys) do
  		for _, enemy in ipairs(mapEnemys) do
  			if enemy.id == id then
  				return enemy
  			end
46fac6f1   zhouahaihai   酱料
192
193
194
  		end
  	end
  end
39a6e08b   suhongyang   冒险战斗内逻辑调整
195
196
197
  
  function Battle:getRBByEnemyId(enemyId)
  	local enemy = self:getEnemyById(enemyId)
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
198
  	return enemy.roomId, enemy.blockId, enemy.mapIdx
39a6e08b   suhongyang   冒险战斗内逻辑调整
199
200
  end
  
39a6e08b   suhongyang   冒险战斗内逻辑调整
201
  
46fac6f1   zhouahaihai   酱料
202
  --触发全员被动技能
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
203
204
  function Battle:triggerPassive(condType, params, mapIdx)
  	mapIdx = mapIdx or self.adv:getCurMapIdx()
02c4de8d   zhouahaihai   增加 固有技
205
  	self.player:triggerPassive(condType, params)
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
206
207
208
209
210
211
212
213
  	if not self.enemys[mapIdx] then
  		-- 缓存一下
  		self.cachePassiveEvent[mapIdx] = self.cachePassiveEvent[mapIdx] or {}
  		table.insert(self.cachePassiveEvent[mapIdx], {condType, params})
  	else
  		for _, enemy in ipairs(self.enemys[mapIdx]) do
  			enemy:triggerPassive(condType, params)
  		end
9687f887   zhouhaihai   建筑被动
214
215
216
  		for _, build in ipairs(self.builds[mapIdx]) do
  			build:triggerPassive(condType, params)
  		end
02c4de8d   zhouahaihai   增加 固有技
217
  	end
46fac6f1   zhouahaihai   酱料
218
219
  end
  
4f0a5fae   zhouhaihai   营养剂
220
221
222
223
224
225
226
227
228
229
230
231
  -- 只是从战斗中移除  从地图中移除 在外面操作
  function Battle:removeEnemyById(id)
  	local mapIdx = self.adv:getCurMapIdx()
  	for i = #self.enemys[mapIdx], 1, -1 do
  		if self.enemys[mapIdx][i].id == id then
  			local enemy = table.remove(self.enemys[mapIdx], i)
  			enemy:clear()
  			break
  		end
  	end
  end
  
46fac6f1   zhouahaihai   酱料
232
233
  --回合
  function Battle:afterRound()
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
234
  	local mapIdx = self.adv:getCurMapIdx()
46fac6f1   zhouahaihai   酱料
235
  	self.player:afterRound()
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
236
  	table.sort(self.enemys[mapIdx], function(e1, e2)
46fac6f1   zhouahaihai   酱料
237
238
  		return e1.id < e2.id
  	end)
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
239
  	for _, enemy in ipairs(self.enemys[mapIdx]) do
46fac6f1   zhouahaihai   酱料
240
241
242
  		enemy:afterRound()
  	end
  	self.player:clearRound()
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
243
  	for _, enemy in ipairs(self.enemys[mapIdx]) do
46fac6f1   zhouahaihai   酱料
244
245
  		enemy:clearRound()
  	end
9687f887   zhouhaihai   建筑被动
246
247
248
  	for _, build in ipairs(self.builds[mapIdx]) do
  		build:clearRound()
  	end
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
249
250
  	for i = #self.enemys[mapIdx], 1, -1 do
  		if self.enemys[mapIdx][i].isDead then
4faef572   zhouhaihai   冒险任务,冒险扫荡, 冒险中继
251
  			local enemy = table.remove(self.enemys[mapIdx], i)
7828ffd0   zhouhaihai   冒险 连续选择点 和 地图因子
252
253
  			self.adv:enemyDead(enemy, enemy.isDead == 1)
  			enemy:clear()
46fac6f1   zhouahaihai   酱料
254
255
  		end
  	end
9687f887   zhouhaihai   建筑被动
256
257
258
259
260
261
  	for i = #self.builds[mapIdx], 1, -1 do
  		if self.builds[mapIdx][i].isDead then
  			local build = table.remove(self.builds[mapIdx], i)
  			build:clear()
  		end
  	end
ec87b4a5   zhouahaihai   冒险 完善
262
  
d3da3368   zhouhaihai   冒险地图被动技, buff 神器
263
264
  	self.player:triggerPassive(Passive.AFTER_ROUND)
  
46fac6f1   zhouahaihai   酱料
265
  	if self.player.isDead then
4b7c7c96   zhouahaihai   增加 清空 挂机 冒险gm 角色经验
266
  		self.adv:over(false)
46fac6f1   zhouahaihai   酱料
267
268
269
  	end
  end
  
e459a5fc   suhongyang   战斗回合检查同步以及回合数据缓存
270
  
12f7b52c   zhouhaihai   冒险战斗
271
272
273
274
275
276
277
  function Battle:battleBegin(roomId, blockId, params)
  	local enemy = self:getEnemy(roomId, blockId)
  	if not enemy then return end
  	local player = params.player
  	-- 玩家没死就是怪死了
  	if player.hp > 0 then
  		enemy:hurt(enemy.hp, self.player, {hurtType = 5})
e90b4d20   zhouhaihai   战斗buff
278
  		self.player:effectBattleBuff()
53e8037e   zhouhaihai   任务
279
280
  
  		self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId})
d3da3368   zhouhaihai   冒险地图被动技, buff 神器
281
282
283
  		if params.bySkill then
  			self.player:triggerPassive(Passive.SKILL_KILL)
  		end
12f7b52c   zhouhaihai   冒险战斗
284
  	end
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
285
286
287
288
289
290
291
  	if player.hp > self.player.hp then
  		self.player:recover(player.hp - self.player.hp, player)
  	else
  		self.player:hurt(math.max(0, math.ceil(self.player.hp - player.hp)), enemy, {hurtType = 5}) --战斗血量只会变少
  	end
  	
  	self.player:changeSp(math.floor(player.sp - self.player.sp) , 0) --战斗魔力只会变少
12f7b52c   zhouhaihai   冒险战斗
292
293
294
  end
  
  
46fac6f1   zhouahaihai   酱料
295
  --写入数据
43babcff   zhouhaihai   优化冒险结构 增加夹层功能
296
297
298
299
300
301
302
303
  function Battle:saveDB()
  	for idx, mapEnemys in pairs(self.enemys) do
  		for _, enemy in ipairs(mapEnemys) do
  			local block = self.adv:getBlock(enemy.roomId, enemy.blockId, idx)
  			if block and block:isMonster() then
  				block.event.enemy = enemy:getDB()
  			end
  		end
46fac6f1   zhouahaihai   酱料
304
  	end
46fac6f1   zhouahaihai   酱料
305
306
  end
  
36c30c5c   zhouahaihai   冒险
307
  return Battle