Commit 12f7b52c5dc6dbe5f797fb2cce19d69bfa7220a4

Authored by zhouhaihai
1 parent de3b786f

冒险战斗

src/ProtocolCode.lua
... ... @@ -35,6 +35,8 @@ actionCodes = {
35 35 Adv_useItemRpc = 154,
36 36 Adv_usePotionRpc = 155,
37 37 Adv_exitAdvRpc = 156,
  38 + Adv_startBattleRpc = 157,
  39 + Adv_endBattleRpc = 158,
38 40  
39 41 Hero_loadInfos = 201,
40 42 Hero_updateProperty = 202,
... ...
src/actions/AdvAction.lua
... ... @@ -100,5 +100,59 @@ function _M.exitAdvRpc(agent, data)
100 100 return true
101 101 end
102 102  
  103 +--开始战斗
  104 +function _M.startBattleRpc(agent, data)
  105 + local role = agent.role
  106 + local msg = MsgPack.unpack(data)
  107 +
  108 + -- 校验一下信息
  109 + local roomId = msg.roomId
  110 + local blockId = msg.blockId
  111 + local monsterId = msg.monsterId
  112 + local enemyId = msg.enemyId
  113 + if not enemyId then return end
  114 +
  115 + local adv = role:getAdvData()
  116 + local enemy = adv.battle:getEnemyById(enemyId)
  117 +
  118 + if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId or enemy.lock or enemy.isDead then return end
  119 +
  120 + local key = tostring(math.random())
  121 + adv.__battleCache = {
  122 + enemyId = enemyId,
  123 + key = key
  124 + }
  125 + SendPacket(actionCodes.Adv_startBattleRpc, MsgPack.pack({key = key}))
  126 + return true
  127 +end
  128 +
  129 +-- 结束战斗
  130 +function _M.endBattleRpc(agent, data)
  131 + local role = agent.role
  132 + local msg = MsgPack.unpack(data)
  133 + local roomId = msg.roomId
  134 + local blockId = msg.blockId
  135 + local monsterId = msg.monsterId
  136 + local enemyId = msg.enemyId
  137 + local key = msg.key
  138 + local player = msg.player
  139 +
  140 + if not player or not player.hp or not player.sp or not enemyId or not key then return end
  141 + local adv = role:getAdvData()
  142 + -- 校验
  143 + if not adv.__battleCache then return end
  144 + if adv.__battleCache.enemyId ~= enemyId then return end
  145 + local enemy = adv.battle:getEnemyById(enemyId)
  146 + if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId then return end
  147 + adv.__battleCache = nil
  148 +
  149 +
  150 + local status = adv:clickBlock(roomId, blockId, {player = player})
  151 + if not status then return end
  152 + SendPacket(actionCodes.Adv_endBattleRpc, MsgPack.pack({events = adv:popBackEvents()}))
  153 + return true
  154 +end
  155 +
  156 +
103 157  
104 158 return _M
105 159 \ No newline at end of file
... ...
src/adv/Adv.lua
... ... @@ -720,7 +720,7 @@ end
720 720  
721 721 --战斗 普通攻击
722 722 local function clickMonster(self, room, block, params)
723   - self.battle:battleBegin(room.roomId, block.blockId, params.quick)
  723 + self.battle:battleBegin(room.roomId, block.blockId, params)
724 724 return true
725 725 end
726 726  
... ... @@ -933,9 +933,6 @@ function Adv:clickBlock(roomId, blockId, params)
933 933 if block.event.etype == AdvEventType.Out then
934 934 needChange = false
935 935 end
936   - if (block.event.etype == AdvEventType.Monster or block.event.etype == AdvEventType.BOSS) and not self.battle:isBattleEnd() then
937   - needChange = false
938   - end
939 936 end
940 937 if status and needChange then --出去了就不计算回合了
941 938 self:backBlockChange(roomId, blockId)
... ...
src/adv/AdvBattle.lua
... ... @@ -153,6 +153,19 @@ function Battle:afterRound()
153 153 end
154 154  
155 155  
  156 +function Battle:battleBegin(roomId, blockId, params)
  157 + local enemy = self:getEnemy(roomId, blockId)
  158 + if not enemy then return end
  159 + local player = params.player
  160 + -- 玩家没死就是怪死了
  161 + if player.hp > 0 then
  162 + enemy:hurt(enemy.hp, self.player, {hurtType = 5})
  163 + end
  164 + self.player:hurt(math.max(0, math.ceil(self.player.hp - player.hp)), enemy, {hurtType = 5}) --战斗血量只会变少
  165 + self.player:changeSp(math.min(0, math.floor(player.sp - self.player.sp)) , 0) --战斗魔力只会变少
  166 +end
  167 +
  168 +
156 169 --写入数据
157 170 function Battle:getDB()
158 171 self.adv.advTeam.player = self.player:getDB()
... ...
src/adv/AdvPlayer.lua
... ... @@ -205,7 +205,7 @@ function BaseObject:getInjuredValue(value)
205 205 end
206 206  
207 207 --最终伤害 = [ (敌方攻击 - 己方防御) * (1+伤害增加百分比-伤害减少百分比)*(1+受伤增加百分比-受伤减少百分比)+(伤害增加固定值-伤害增加固定值+受伤增加固定值-受伤增加固定值)]*(1+侍宠百分比)-侍宠固定值
208   --- params -- hurtType 1 普攻伤害 2 buff伤害 3 反弹伤害 4 真实伤害
  208 +-- params -- hurtType 1 普攻伤害 2 buff伤害 3 反弹伤害 4 真实伤害 5 客户端发回来的伤害 --直接作用
209 209 --进入这个方法之前计算好释放者加成的伤害
210 210 function BaseObject:hurt(value, releaser, params)
211 211 params = params or {}
... ... @@ -226,39 +226,41 @@ function BaseObject:hurt(value, releaser, params)
226 226 team:triggerPassive(Passive.TEAM_HURT, {trigger = releaser})
227 227 end
228 228 end
229   - if not params.hurtType or params.hurtType ~= 4 then
230   - value = self:getInjuredValue(value) --减伤计算
231   - end
232   - if value == 0 then return end
233   -
234   - -- 舍身和恃宠
235   - local team = self:getTeam(1)
236   - local transfer = {}
237   - local absorb = {}
238   - for _, one in ipairs(team) do
239   - local change1, count1 = one:getCommonBuffEffect(Buff.INJURED_CHANGE)
240   - local change2, count2 = one:getCommonBuffEffect(Buff.HURT_ABSORB)
241   - if count1 > 0 then
242   - table.insert(transfer, {one, change1, count1})
  229 + if params.hurtType ~= 5 then
  230 + if not params.hurtType or params.hurtType ~= 4 then
  231 + value = self:getInjuredValue(value) --减伤计算
243 232 end
244   - if count2 > 0 then
245   - table.insert(absorb, {one, change2, count2})
246   - end
247   - end
248   - if #absorb == 1 then --舍身优先级高 --舍身生效
249   - if absorb[1][1] ~= self then --舍身的人不是自己才有效
250   - local absorbV = (value - absorb[1][2][0]) * absorb[1][2][1] + absorb[1][2][0] --固定值先生效
251   - value = value - absorbV
252   - absorb[1][1]:hurt(absorbV, releaser, params)
  233 + if value == 0 then return end
  234 +
  235 + -- 舍身和恃宠
  236 + local team = self:getTeam(1)
  237 + local transfer = {}
  238 + local absorb = {}
  239 + for _, one in ipairs(team) do
  240 + local change1, count1 = one:getCommonBuffEffect(Buff.INJURED_CHANGE)
  241 + local change2, count2 = one:getCommonBuffEffect(Buff.HURT_ABSORB)
  242 + if count1 > 0 then
  243 + table.insert(transfer, {one, change1, count1})
  244 + end
  245 + if count2 > 0 then
  246 + table.insert(absorb, {one, change2, count2})
  247 + end
253 248 end
254   - else
255   - if #transfer == 1 and transfer[1][1] == self and #team > 1 then --侍宠 生效
256   - local transferValue = (value - transfer[1][2][0])* transfer[1][2][1] + transfer[1][2][0] --固定值先生效
257   - value = value - transferValue
258   - local oneValue = transferValue / (#team - 1)
259   - for _, one in ipairs(team) do
260   - if one ~= self then
261   - one:hurt(oneValue, releaser, params)
  249 + if #absorb == 1 then --舍身优先级高 --舍身生效
  250 + if absorb[1][1] ~= self then --舍身的人不是自己才有效
  251 + local absorbV = (value - absorb[1][2][0]) * absorb[1][2][1] + absorb[1][2][0] --固定值先生效
  252 + value = value - absorbV
  253 + absorb[1][1]:hurt(absorbV, releaser, params)
  254 + end
  255 + else
  256 + if #transfer == 1 and transfer[1][1] == self and #team > 1 then --侍宠 生效
  257 + local transferValue = (value - transfer[1][2][0])* transfer[1][2][1] + transfer[1][2][0] --固定值先生效
  258 + value = value - transferValue
  259 + local oneValue = transferValue / (#team - 1)
  260 + for _, one in ipairs(team) do
  261 + if one ~= self then
  262 + one:hurt(oneValue, releaser, params)
  263 + end
262 264 end
263 265 end
264 266 end
... ... @@ -267,7 +269,7 @@ function BaseObject:hurt(value, releaser, params)
267 269 value = math.max(0, math.ceil(value))
268 270 if value == 0 then return end
269 271 -- 反弹伤害
270   - if params.hurtType ~= 3 and releaser and not releaser.isDead then
  272 + if params.hurtType ~= 3 and params.hurtType ~= 5 and releaser and not releaser.isDead then
271 273 local backEffect = self:getBackHurtBuff(params.hurtType == 1)
272 274 local backValue = math.max(0, value * backEffect[1] + backEffect[0])
273 275 releaser:hurt(backValue, releaser, {hurtType = 3})
... ...