Commit 12f7b52c5dc6dbe5f797fb2cce19d69bfa7220a4
1 parent
de3b786f
冒险战斗
Showing
5 changed files
with
105 additions
and
37 deletions
Show diff stats
src/ProtocolCode.lua
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}) | ... | ... |