Blame view

src/adv/AdvBattle.lua 4.64 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
46fac6f1   zhouahaihai   酱料
9
10
11
12
  	self.enemys = {} --怪
  	self:initPlayer()
  	self:initEnemys()
  	self:initAfter()
02c4de8d   zhouahaihai   增加 固有技
13
14
15
  	if self.isNewPlayer then
  		self.player:triggerPassive(Passive.BORN_ONCE)
  	end
46fac6f1   zhouahaihai   酱料
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
  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
  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   挂机
41
  		player.atk = tonumber(string.format("%0.0f", player.hp * 0.1)) --todo 系数是临时的
e996b82a   zhouahaihai   冒险增加防御属性
42
  		player.def = 0
46fac6f1   zhouahaihai   酱料
43
44
45
  		player.miss = 0
  		player.hit = 100
  		self.adv.advTeam.player = player
02c4de8d   zhouahaihai   增加 固有技
46
  		self.isNewPlayer = true
46fac6f1   zhouahaihai   酱料
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  	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   冒险增加防御属性
68
  			enemy.def = enemyCsv.def + enemyCsv.leveldef * self.adv.advInfo.level
46fac6f1   zhouahaihai   酱料
69
70
71
72
73
  			enemy.passives = {}
  			for _, id in ipairs(enemyCsv.passive:toArray(true, "=")) do
  				table.insert(enemy.passives, {id = id})
  			end
  			block.event.enemy = enemy
46fac6f1   zhouahaihai   酱料
74
  		end
02c4de8d   zhouahaihai   增加 固有技
75
76
77
  		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   酱料
78
79
80
81
82
  	end 
  end
  
  function Battle:getEnemy(roomId, blockId)
  	for _, enemy in ipairs(self.enemys) do
36c30c5c   zhouahaihai   冒险
83
  		if enemy.roomId == roomId and enemy.blockId == blockId then
46fac6f1   zhouahaihai   酱料
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  			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
  --普通攻击
  function Battle:playerAtk(roomId, blockId)
  	local enemy = self:getEnemy(roomId, blockId)
  	if enemy then
821f2b60   suhongyang   冒险战斗完善,增加battlebe...
100
101
  		self.player:battleBegin()
  		enemy:battleBegin()
bedca62d   zhouahaihai   冒险
102
  		while not enemy.isDead and not self.player.isDead do
65de8cf1   suhongyang   被动逻辑进一步修缮
103
  			-- 玩家先出手
bedca62d   zhouahaihai   冒险
104
105
  			self.adv:backAtk(nil, enemy.id)
  			enemy:hurt(self.player:getHurtValue(), self.player, {hurtType = 1})
65de8cf1   suhongyang   被动逻辑进一步修缮
106
  			self.player:afterTurn()
bedca62d   zhouahaihai   冒险
107
108
109
110
  			--是否无法反击
  			if not enemy.isDead and not enemy:hadBuff(Buff.CANT_BACK_ATK) then
  				self.adv:backAtk(enemy.id, nil)
  				self.player:hurt(enemy:getHurtValue(), enemy, {hurtType = 1})
65de8cf1   suhongyang   被动逻辑进一步修缮
111
  				enemy:afterTurn()
bedca62d   zhouahaihai   冒险
112
  			end
46fac6f1   zhouahaihai   酱料
113
114
115
116
117
  		end
  	end
  end
  --触发全员被动技能
  function Battle:triggerPassive(condType, params)
02c4de8d   zhouahaihai   增加 固有技
118
119
120
121
  	self.player:triggerPassive(condType, params)
  	for _, enemy in ipairs(self.enemys) do
  		enemy:triggerPassive(condType, params)
  	end
46fac6f1   zhouahaihai   酱料
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
  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   冒险 完善
144
145
146
147
148
149
150
151
  
  	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   酱料
152
  	if self.player.isDead then
4b7c7c96   zhouahaihai   增加 清空 挂机 冒险gm 角色经验
153
  		self.adv:over(false)
46fac6f1   zhouahaihai   酱料
154
155
156
157
158
159
160
161
162
163
164
165
  	end
  end
  
  --写入数据
  function Battle:getDB()
  	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
  end
  
36c30c5c   zhouahaihai   冒险
166
  return Battle