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}) | ... | ... |