Blame view

src/adv/AdvBattle.lua 4.53 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
bedca62d   zhouahaihai   冒险
100
101
102
103
104
105
106
107
  		while not enemy.isDead and not self.player.isDead do
  			self.adv:backAtk(nil, enemy.id)
  			enemy:hurt(self.player:getHurtValue(), self.player, {hurtType = 1})
  			--是否无法反击
  			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})
  			end
46fac6f1   zhouahaihai   酱料
108
109
110
111
112
  		end
  	end
  end
  --触发全员被动技能
  function Battle:triggerPassive(condType, params)
02c4de8d   zhouahaihai   增加 固有技
113
114
115
116
  	self.player:triggerPassive(condType, params)
  	for _, enemy in ipairs(self.enemys) do
  		enemy:triggerPassive(condType, params)
  	end
46fac6f1   zhouahaihai   酱料
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  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   冒险 完善
139
140
141
142
143
144
145
146
  
  	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   酱料
147
  	if self.player.isDead then
4b7c7c96   zhouahaihai   增加 清空 挂机 冒险gm 角色经验
148
  		self.adv:over(false)
46fac6f1   zhouahaihai   酱料
149
150
151
152
153
154
155
156
157
158
159
160
  	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   冒险
161
  return Battle