From 42f2d1d368dd279752916367db67258110595636 Mon Sep 17 00:00:00 2001 From: suhongyang <1609423485@qq.com> Date: Wed, 10 Jul 2019 11:27:29 +0800 Subject: [PATCH] 战斗内技能序列逻辑 --- src/ProtocolCode.lua | 1 + src/actions/AdvAction.lua | 12 +++++++++++- src/adv/Adv.lua | 22 ++++++++++++++++++++-- src/adv/AdvBattle.lua | 6 +++++- src/adv/AdvPlayer.lua | 11 +++++++++++ 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index 7116486..dd263a1 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -31,6 +31,7 @@ actionCodes = { Adv_useSkillRpc = 155, Adv_exitAdvRpc = 156, Adv_nextTurnRpc = 157, + Adv_battleSkillRpc = 158, Hero_loadInfos = 201, Hero_updateProperty = 202, diff --git a/src/actions/AdvAction.lua b/src/actions/AdvAction.lua index 911716c..f441395 100644 --- a/src/actions/AdvAction.lua +++ b/src/actions/AdvAction.lua @@ -75,7 +75,7 @@ function _M.useItemRpc(agent, data) return true end ---使用技能 +--使用营养技能 function _M.useSkillRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) @@ -86,6 +86,16 @@ function _M.useSkillRpc(agent, data) return true end +--使用战斗技能 +function _M.battleSkillRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + local adv = role:getAdvData() + local status = adv:releaseBattleSkill(msg.skillId) + if not status then return end + SendPacket(actionCodes.Adv_useSkillRpc, MsgPack.pack({events = {}})) + return true +end --退出 function _M.exitAdvRpc(agent, data) diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index a43357a..6d8db88 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -942,10 +942,9 @@ function Adv:useItem(itemId, count, target) return true end ---使用技能 +--使用技能 -- TODO 改表了,估计要重写 function Adv:useSkill(skillId, target) local skillLevel = nil - if skillId > 1000 then return end for slot, heroId in pairs(self.advTeam.heros) do if self.owner.heros[heroId] then if csvdb["unitCsv"][self.owner.heros[heroId]:getSkinId()]["adv"] == skillId then @@ -971,6 +970,25 @@ function Adv:useSkill(skillId, target) return true end +--使用战斗技能 +function Adv:releaseBattleSkill(skillId) + if not csvdb["adv_skill_specialCsv"][skillId] or self.battle:isBattleEnd() then return end + local skillLevel = nil + for slot, heroId in pairs(self.advTeam.heros) do + if self.owner.heros[heroId] then + if csvdb["unitCsv"][self.owner.heros[heroId]:getSkinId()]["adv"] == skillId then + skillLevel = self.owner.heros[heroId]:getSkillLevel(4) + break + end + end + end + if not skillLevel or not csvdb["adv_skill_specialCsv"][skillId][skillLevel] then return end + local skillData = csvdb["adv_skill_specialCsv"][skillId][skillLevel] + local enemy = self.battle.enemy + self.battle.player:addSpecialSkill(skillId, skillLevel, enemy) + return true +end + --敌人死亡 function Adv:enemyDead(roomId, blockId, escape) local room = self.rooms[roomId] diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index ea7b969..41206b6 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -159,7 +159,11 @@ end --战斗内角色回合逻辑 function Battle:doPlayerTurn(atkPlayer, hurtPlayer) atkPlayer:beforeTurn() - hurtPlayer:hurt(atkPlayer:getHurtValue(), atkPlayer, {hurtType = 1}) + if #(atkPlayer.skillOrder) > 0 then + atkPlayer:releaseSpecialSkill() + else + hurtPlayer:hurt(atkPlayer:getHurtValue(), atkPlayer, {hurtType = 1}) + end atkPlayer:afterTurn() atkPlayer:clearTurn() end diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 0cc5afa..d00421c 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -14,6 +14,7 @@ function BaseObject:ctor(battle) self.lock = nil self.passives = {} --固有技能 self.buffs = {} --buff + self.skillOrder = {} --战斗内技能序列 self.isDead = false self.mpMax = 0 self.mp = 0 @@ -329,6 +330,16 @@ function BaseObject:recover(value, releaser, params) self.battle.adv:backHpChange(self.id, value) end +function BaseObject:addSpecialSkill(skillId, skillLevel, target) + local skillData = {id = skillId, level = skillLevel, target = target} + table.insert(self.skillOrder, skillData) +end + +function BaseObject:releaseSpecialSkill() + local skillData = table.remove(self.skillOrder, 1) + self:releaseSkill(skillData.id, skillData.level, skillData.target) +end + function BaseObject:releaseSkill(skillId, skillLevel, target) if self:hadBuff(Buff.CANT_SKILL) then return end -- 针对 怪物 local skill = Skill.new(self, {id = skillId, level = skillLevel, target = target}) -- libgit2 0.21.2