From 39a6e08b788a76ce59ce7b83ce224e8e498127b5 Mon Sep 17 00:00:00 2001 From: suhongyang <1609423485@qq.com> Date: Mon, 8 Jul 2019 16:37:05 +0800 Subject: [PATCH] 冒险战斗内逻辑调整 --- src/GlobalVar.lua | 1 + src/ProtocolCode.lua | 1 + src/actions/AdvAction.lua | 11 ++++++++++- src/adv/Adv.lua | 34 ++++++++++++++++++++++++++++++++-- src/adv/AdvBattle.lua | 68 +++++++++++++++++++++++++++++++++++++++++++++++++------------------- src/adv/AdvPassive.lua | 2 +- src/adv/AdvPlayer.lua | 6 ++++++ 7 files changed, 100 insertions(+), 23 deletions(-) diff --git a/src/GlobalVar.lua b/src/GlobalVar.lua index 3eb73ce..8f23f8c 100644 --- a/src/GlobalVar.lua +++ b/src/GlobalVar.lua @@ -101,6 +101,7 @@ AdvBackEventType = { Dead = 11, --怪死亡 DefChange = 12, -- 防御变化 Passive = 13, -- 獲得被動 + TurnEnd = 14, -- 回合结束 } AdvScoreType = { diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index a0311c6..7116486 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -30,6 +30,7 @@ actionCodes = { Adv_useItemRpc = 154, Adv_useSkillRpc = 155, Adv_exitAdvRpc = 156, + Adv_nextTurnRpc = 157, Hero_loadInfos = 201, Hero_updateProperty = 202, diff --git a/src/actions/AdvAction.lua b/src/actions/AdvAction.lua index 2fa69a7..eb5c534 100644 --- a/src/actions/AdvAction.lua +++ b/src/actions/AdvAction.lua @@ -97,6 +97,15 @@ function _M.exitAdvRpc(agent, data) return true end - +--继续战斗 +function _M.nextTurnRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local adv = role:getAdvData() + local status = adv:nextBattleTurn() + if not status then return end + SendPacket(actionCodes.Adv_nextTurnRpc, MsgPack.pack({events = adv:popBackEvents()})) + return true +end return _M \ No newline at end of file diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index e86b6b4..c933b48 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -699,7 +699,7 @@ end --战斗 普通攻击 local function clickMonster(self, room, block, params) - self.battle:playerAtk(room.roomId, block.blockId) + self.battle:battleBegin(room.roomId, block.blockId) return true end @@ -881,7 +881,16 @@ function Adv:clickBlock(roomId, blockId, params) end end end - if status and (not clickEvent or (not block.event or block.event.etype ~= AdvEventType.Out)) then --出去了就不计算回合了 + local needChange = true + if clickEvent and block.event then + if block.event.etype == AdvEventType.Out then + needChange = false + end + if (block.event.etype == AdvEventType.Monster or block.event.etype == AdvEventType.BOSS) and not self.battle:isBattleEnd() then + needChange = false + end + end + if status and needChange then --出去了就不计算回合了 self:backBlockChange(roomId, blockId) self:afterRound() end @@ -889,6 +898,22 @@ function Adv:clickBlock(roomId, blockId, params) return status end +--继续战斗 +function Adv:nextBattleTurn() + local enemyId = self.battle.battleEnemyId + if not enemyId then + return + end + local roomId, blockId = self.battle:getRBByEnemyId(enemyId) + self.battle:doBattleTurn() + if self.battle:isBattleEnd() then + self:backBlockChange(roomId, blockId) + self:afterRound() + end + self:saveDB() + return true +end + --使用道具产生效果 function Adv:useItem(itemId, count, target) count = count or 1 @@ -1049,6 +1074,10 @@ function Adv:backDead(enemyId) self:pushBackEvent(AdvBackEventType.Dead, {enemyId = enemyId}) end +function Adv:backTurnEnd() + self:pushBackEvent(AdvBackEventType.TurnEnd, {}) +end + function Adv:scoreChange(scoreType, pms) local cutTypes = {} @@ -1100,6 +1129,7 @@ function Adv:afterRound() if self.battle then self.battle:afterRound() end + -- TODO 房间回合事件 end function Adv:saveDB() diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index 77f1e64..1a7b9a8 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -6,6 +6,7 @@ function Battle:ctor(adv) self.adv = adv self.player = nil --玩家 self.isNewPlayer = false + self.battleEnemyId = nil self.enemys = {} --怪 self:initPlayer() self:initEnemys() @@ -20,6 +21,7 @@ function Battle:initAfter() for _, enemy in pairs(self.enemys) do enemy:initAfter(self.adv.rooms[enemy.roomId].blocks[enemy.blockId].event.enemy) end + self.battleEnemyId = self.adv.advTeam.enemyId end function Battle:initPlayer() @@ -93,36 +95,63 @@ function Battle:getEnemyById(id) end end end ---普通攻击 -function Battle:playerAtk(roomId, blockId) + +function Battle:getRBByEnemyId(enemyId) + local enemy = self:getEnemyById(enemyId) + return enemy.roomId, enemy.blockId +end + +function Battle:isBattleEnd() + if not self.battleEnemyId then + return true + end +end + +--战斗开始 +function Battle:battleBegin(roomId, blockId) + if self.battleEnemyId then + self.battleEnemyId = nil + -- TODO 清理上次战斗遗留数据 + end local enemy = self:getEnemy(roomId, blockId) if enemy then + self.battleEnemyId = enemy.id self.player:battleBegin() enemy:battleBegin() - while not enemy.isDead and not self.player.isDead do - -- 玩家先出手 - self.adv:backAtk(nil, enemy.id) - self:doBattleTurn(self.player, enemy) - --是否无法反击 - if not enemy.isDead and not enemy:hadBuff(Buff.CANT_BACK_ATK) then - self.adv:backAtk(enemy.id, nil) - self:doBattleTurn(enemy, self.player) - end - end - if not self.player.isDead then - self.player:battleEnd() - elseif not enemy.isDead then - enemy:battleEnd() - end + self:doBattleTurn() + end +end + +-- 战斗内一回合 +function Battle:doBattleTurn() + local enemy = self:getEnemyById(self.battleEnemyId) + if not enemy then return end + -- 玩家先出手 + self.adv:backAtk(nil, enemy.id) + self:doPlayerTurn(self.player, enemy) + --是否无法攻击 + if not enemy.isDead and not enemy:hadBuff(Buff.CANT_BACK_ATK) then + self.adv:backAtk(enemy.id, nil) + self:doPlayerTurn(enemy, self.player) + end + -- 判定死亡 + if enemy.isDead or self.player.isDead then + local deadPlayer = enemy.isDead and enemy or self.player + deadPlayer:battleEnd() + self.battleEnemyId = nil + else + self.adv:backTurnEnd() end end ---战斗内回合逻辑 -function Battle:doBattleTurn(atkPlayer, hurtPlayer) + +--战斗内角色回合逻辑 +function Battle:doPlayerTurn(atkPlayer, hurtPlayer) atkPlayer:beforeTurn() hurtPlayer:hurt(atkPlayer:getHurtValue(), atkPlayer, {hurtType = 1}) atkPlayer:afterTurn() atkPlayer:clearTurn() end + --触发全员被动技能 function Battle:triggerPassive(condType, params) self.player:triggerPassive(condType, params) @@ -171,6 +200,7 @@ function Battle:getDB() local block = self.adv.rooms[enemy.roomId].blocks[enemy.blockId] block.event.enemy = enemy:getDB() end + self.adv.advTeam.enemyId = self.battleEnemyId end return Battle \ No newline at end of file diff --git a/src/adv/AdvPassive.lua b/src/adv/AdvPassive.lua index 432d60f..2ce77da 100644 --- a/src/adv/AdvPassive.lua +++ b/src/adv/AdvPassive.lua @@ -202,7 +202,7 @@ function Passive:ctor(owner, data) self.count = data.count or self.passiveData.count --触发剩余次数 self.delay = data.delay or self.passiveData.delayRound --触发延迟回合数 self.turn = 0 --战斗内回合数 - self.delayturn = self.passiveData.delayTurn --战斗内延迟回合数 + self.delayTurn = self.passiveData.delayTurn --战斗内延迟回合数 self.effects = self.passiveData.effect:toTableArray(true) self.filters = {} diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 9df6cd1..0ad286f 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -15,11 +15,15 @@ function BaseObject:ctor(battle) self.passives = {} --固有技能 self.buffs = {} --buff self.isDead = false + self.mpMax = 0 + self.mp = 0 end --初始化角色 function BaseObject:initData(data) self.hpMax = data.hpMax or data.hp self.hp = data.hp + self.mpMax = data.mpMax or data.mp + self.mp = data.mp --可变化的值 self.atk = data.atk self.miss = data.miss @@ -377,6 +381,8 @@ function BaseObject:getDB() local db = {} db.hpMax = self.hpMax db.hp = self.hp + db.mpMax = self.mpMax + db.mp = self.mp local baseAttr = {"atk", "miss", "hit", "def"} for _, field in pairs(baseAttr) do db[field] = self[field] -- libgit2 0.21.2