From 7c55db1f30c88e6393b799a121199f43c773c6df Mon Sep 17 00:00:00 2001 From: suhongyang <1609423485@qq.com> Date: Mon, 1 Jul 2019 17:40:41 +0800 Subject: [PATCH] Buff逻辑完善,buff生效次数和争斗内buff生命周期逻辑新增 --- src/adv/AdvBattle.lua | 13 +++++++++---- src/adv/AdvBuff.lua | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------ src/adv/AdvPlayer.lua | 41 ++++++++++++++++++++++++++++------------- 3 files changed, 171 insertions(+), 59 deletions(-) diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index d18d28a..71cc9f3 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -102,17 +102,22 @@ function Battle:playerAtk(roomId, blockId) while not enemy.isDead and not self.player.isDead do -- 玩家先出手 self.adv:backAtk(nil, enemy.id) - enemy:hurt(self.player:getHurtValue(), self.player, {hurtType = 1}) - self.player:afterTurn() + 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.player:hurt(enemy:getHurtValue(), enemy, {hurtType = 1}) - enemy:afterTurn() + self:doBattleTurn(enemy, self.player) end end end end +--战斗内回合逻辑 +function Battle:doBattleTurn(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) diff --git a/src/adv/AdvBuff.lua b/src/adv/AdvBuff.lua index 406ab8d..5719eb2 100644 --- a/src/adv/AdvBuff.lua +++ b/src/adv/AdvBuff.lua @@ -51,13 +51,17 @@ local BuffFactory = { _Buff._initDB = function(self, data) self._changeV = data.cv end - _Buff._afterRount = function(self) - if self._changeV > 0 then - self.owner:recover(self._changeV, self.release) - elseif self._changeV < 0 then - self.owner:hurt(-self._changeV, self.release, {hurtType = 2}) + _Buff._afterRound = function(self) + local value = self:effect() + if value > 0 then + self.owner:recover(value, self.release) + elseif value < 0 then + self.owner:hurt(-value, self.release, {hurtType = 2}) end end + _Buff._effectValue = function(self) + return self._changeV + end _Buff._getDB = function(self) return {cv = self._changeV} end @@ -146,43 +150,73 @@ local BuffFactory = { _Buff._init = function(self, data) self.count = self.buffData.effectValue3 end - _Buff._effectValue = function(self) - return self.buffData.effectValue1, self.buffData.effectValue2 + _Buff._canEffect = function(self, buffId, buffGroup) + local cType, aim = self.buffData.effectValue1, self.buffData.effectValue2 + if (cType == 0 and buffId == aim) or (cType == 1 and buffGroup == aim) then + return true + end end end, [Buff.CLEAR_BUFF] = function(_Buff) _Buff._init = function(self, data) self.count = self.buffData.effectValue3 - self:_afterRount() -- 挂上就清除一下子 + self:_afterRound() -- 挂上就清除一下子 end - _Buff._afterRount = function(self) - local cType, aim = self:effectValue() + _Buff._afterRound = function(self) for _, buff in ipairs(self.buffs) do - if not buff.isDel and ((cType == 0 and buff.id == aim) or (cType == 1 and buff:getGroup() == aim)) then + if not buff.isDel and self:canEffect(buff.id, buff:getGroup()) then buff.isDel = true - self:decCount() + self:effect() end end end - _Buff._effectValue = function(self) - return self.buffData.effectValue1, self.buffData.effectValue2 + _Buff._canEffect = function(self, buffId, buffGroup) + local cType, aim = self.buffData.effectValue1, self.buffData.effectValue2 + if (cType == 0 and buffId == aim) or (cType == 1 and buffGroup == aim) then + return true + end end end, [Buff.OPEN_BLOCK] = function(_Buff) - _Buff._afterRount = function(self) - self.owner.battle.adv:openBlockRand(self.buffData.effectValue1) + _Buff._afterRound = function(self) + local roomNum = self:effect() + self.owner.battle.adv:openBlockRand(roomNum) + end + _Buff._effectValue = function(self) + return self.buffData.effectValue1 end end, [Buff.POWER_CHANGE] = function(_Buff) - _Buff._afterRount = function(self) - self.owner.battle.adv:changePower(self.buffData.effectValue2, self.buffData.effectValue1) + --cType 0 or nil 值 1 百分比 + _Buff._afterRound = function(self) + local value, cType = self:effect() + self.owner.battle.adv:changePower(value, cType) + end + _Buff._effectValue = function(self) + return self.buffData.effectValue1, self.buffData.effectValue2 end end } +function Buff:ctor(owner, id) + self.owner = owner + self.id = id + self.buffData = csvdb["adv_buffCsv"][self.id] + self.isDel = false + self.ifRoundEnd = false + self.roundSpace = 0 --生效间隔 + self.turnSpace = 0 --生效间隔 + self.round = 0 --剩余的回合 + self.turn = 0 --剩余战斗内回合 + self.count = -1 -- 可生效的次数 -1 无次数限制 + + if BuffFactory[self.buffData.type] then + BuffFactory[self.buffData.type](self) + end +end function Buff.create(owner, release, data) local buff = Buff.new(owner, data.id) @@ -196,16 +230,15 @@ function Buff.load(owner, data) return buff end -function Buff:ctor(owner, id) - self.owner = owner - self.id = id - self.buffData = csvdb["adv_buffCsv"][self.id] - self.isDel = false - self.round = 0 --剩余的回合 - self.count = -1 -- 可生效的次数 -1 无次数限制 - - if BuffFactory[self.buffData.type] then - BuffFactory[self.buffData.type](self) +function Buff:initNew(release, data) + self.release = release + self.round = self.buffData.round + self.turn = self.buffData.turn + if self.buffData.effectTime > 0 then + self.count = self.buffData.effectTime + end + if self._init then + self:_init(data) end end @@ -218,6 +251,7 @@ function Buff:initByDB(data) end end self.round = data.round + self.roundSpace = data.roundSp -- 可以优化为0的时候不记录 if data.count then self.count = data.count end @@ -227,32 +261,89 @@ function Buff:initByDB(data) end end -function Buff:initNew(release, data) - self.release = release - self.round = self.buffData.round - if self._init then - self:_init(data) +function Buff:battleBegin() + self.turn = self.buffData.turn + self.ifRoundEnd = self.buffData.turn ~= 0 -- turn类型buff战斗结束后移除 +end + +function Buff:beforeTurn() + if self.isDel or self.owner.isDead then return end + if self.turnSpace > 0 then + return + end + if self._beforeTurn then + self:_beforeTurn() + end +end + +function Buff:afterTurn() + if self.isDel or self.owner.isDead then return end + if self.turnSpace > 0 then + self.turnSpace = self.turnSpace - 1 + self:decTurn() + return + end + if self._afterTurn then + self:_afterTurn() + end + if self.buffData.turnTime > 0 then + self.turnSpace = self.buffData.turnTime + end + self:decTurn() +end + +function Buff:decTurn() + if self.buffData.turn == 0 then + return + end + self.turn = self.turn - 1 + if self.turn <= 0 then + self.isDel = true end end function Buff:afterRound() - if self.isDel or self.owner.isDead then return end - if self._afterRount then - self:_afterRount() + if self.isDel or self.owner.isDead then return end + if self.roundSpace > 0 then + self.roundSpace = self.turnSpace - 1 + self:decRound() + return + end + if self._afterRound then + self:_afterRound() + end + if self.ifRoundEnd then -- turn类型buff战斗结束后移除 + self.isDel = true + return end + if self.buffData.roundTime > 0 then + self.turnSpace = self.buffData.roundTime + end + self:decRound() +end - if self.buffData.round ~= 0 then - self.round = self.round - 1 - if self.round <= 0 then - self.isDel = true - end +function Buff:decRound() + if self.buffData.round == 0 then + return + end + self.round = self.round - 1 + if self.round <= 0 then + self.isDel = true + end +end + +function Buff:canEffect(...) + if not self._canEffect then + return true end + return self:_canEffect(...) end -function Buff:effectValue() +function Buff:effect() if self._effectValue then return self:_effectValue() end + self:decCount() end --删除buff 时调用 function Buff:endBuff() @@ -289,6 +380,7 @@ function Buff:getDB() if self.buffData.round ~= 0 then db.round = self.round end + db.roundSp = self.roundSpace if self.count ~= -1 then db.count = self.count end diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index b5c5e4e..9a42c84 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -40,13 +40,19 @@ function BaseObject:initAfter(data) end end +function BaseObject:beforeTurn() + for _, buff in ipairs(self.buffs) do + buff:beforeTurn() + end +end + function BaseObject:afterTurn() for _, passive in ipairs(self.passives) do passive:afterTurn() end - -- for _, buff in ipairs(self.buffs) do - -- buff:afterTurn(self) - -- end + for _, buff in ipairs(self.buffs) do + buff:afterTurn() + end end function BaseObject:afterRound() @@ -58,6 +64,16 @@ function BaseObject:afterRound() end end +function BaseObject:clearTurn() + for i = #self.buffs, 1, -1 do + if self.buffs[i].isDel then + self.battle.adv:backBuff(self.id, self.buffs[i].id, true) + self.buffs[i]:endBuff() + table.remove(self.buffs, i) + end + end +end + function BaseObject:clearRound() for i = #self.passives, 1, -1 do if self.passives[i].isDel then @@ -82,9 +98,9 @@ function BaseObject:battleBegin() for _, passive in ipairs(self.passives) do passive:battleBegin() end - -- for _, buff in ipairs(self.buffs) do - -- buff:afterRound(self) - -- end + for _, buff in ipairs(self.buffs) do + buff:battleBegin() + end end function BaseObject:addPassive(params) @@ -102,10 +118,9 @@ function BaseObject:addBuff(buffId, releaser) local buffData = csvdb["adv_buffCsv"][buffId] if not buffData then return end for _, buff in ipairs(self.buffs) do - if not buff.isDel and (buff:getType() == CLEAR_BUFF or buff:getType() == IMMNUE_BUFF) then - local cType, aim = buff:effectValue() -- 0=buffid 1=buff组 - if (cType == 0 and buffId == aim) or (cType == 1 and buffData.group == aim) then -- buff 剔除 - buff:decCount() --减少次数 + if not buff.isDel and (buff:getType() == Buff.CLEAR_BUFF or buff:getType() == Buff.IMMNUE_BUFF) then + if buff:canEffect(buffId, buffData.group) then + buff:effect() return end end @@ -136,7 +151,7 @@ function BaseObject:getCommonBuffEffect(bType) local effect, count = {[0] = 0, [1] = 0}, 0 for _, buff in ipairs(self.buffs) do if not buff.isDel and buff:getType() == bType then - local cType, value = buff:effectValue() + local cType, value = buff:effect() if cType then effect[cType] = effect[cType] + value count = count + 1 @@ -151,7 +166,7 @@ function BaseObject:getBackHurtBuff(isAtk) local effect = {[0] = 0, [1] = 0} for _, buff in ipairs(self.buffs) do if not buff.isDel and buff:getType() == Buff.BACK_HURT then - local cType, value, aType = buff:effectValue() -- aType 0 全部 1 普通攻击 + local cType, value, aType = buff:effect() -- aType 0 全部 1 普通攻击 if cType then if aType == 0 or isAtk then effect[cType] = effect[cType] + value @@ -176,7 +191,7 @@ end function BaseObject:reSetAttr(field) local old = self[field] self[field] = self["_" .. field] --重置一下 - local fieldToBuff = {atk = Buff.IMMNUE_ATK, hit = Buff.HIT_CHANGE, miss = Buff.MISS_CHANGE, def = Buff.DEF_CHANGE} + local fieldToBuff = {atk = Buff.ATK_CHANGE, hit = Buff.HIT_CHANGE, miss = Buff.MISS_CHANGE, def = Buff.DEF_CHANGE} local effect = self:getCommonBuffEffect(fieldToBuff[field]) self[field] = math.ceil((self[field] + effect[0]) * (1 + effect[1])) local delta = self[field] - old -- libgit2 0.21.2