From b71a819081da541ad962158706e1cd3656390e8e Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Fri, 6 Mar 2020 17:07:13 +0800 Subject: [PATCH] 动态改变 一些buff --- src/adv/Adv.lua | 12 ++++++++++-- src/adv/AdvBuff.lua | 87 ++++++++++++++++++++++++++++++++++----------------------------------------------------- src/adv/AdvPlayer.lua | 39 +++++++++++++++++++++++++++++++++++---- 3 files changed, 79 insertions(+), 59 deletions(-) diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 914dfbd..d585131 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -115,7 +115,7 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify, isRelay, isEnt self.maps = {} self.maps[1] = AdvMap.new(self, 1, mapId, isEnter, isNewRelay) - self:initBattle() + self:initBattle(true) self:initLayerTask() @@ -371,7 +371,7 @@ function Adv:clearAdvUnlockCache() self.cacheUnlock = {} end -function Adv:initBattle() +function Adv:initBattle(notDb) self.battle = require("adv.AdvBattle").new(self) for _, passiveC in ipairs(self.cachePassiveEvent or {}) do self.battle:triggerPassive(passiveC[1], passiveC[2]) @@ -382,6 +382,10 @@ function Adv:initBattle() for idx, map in pairs(self.maps) do map:initBattleAfter() end + --下层 + if notDb and self.level ~= 1 then + self.battle.player:attrChangeCondBuffCheck(1) + end end function Adv:triggerPassive(condType, params) @@ -758,6 +762,10 @@ function Adv:award(gift, params) if items ~= oldItems then self.owner:updateProperty({field = "advItems", value = items, notNotify = params.notNotify}) end + + if tgift[ItemId.OldCoin] then + self.battle.player:attrChangeCondBuffCheck(0) + end return tgift end diff --git a/src/adv/AdvBuff.lua b/src/adv/AdvBuff.lua index 90567c0..f6810b0 100644 --- a/src/adv/AdvBuff.lua +++ b/src/adv/AdvBuff.lua @@ -35,7 +35,7 @@ Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物 --角色一些属性的变化 local function commonAttr(_Buff, attrName) - _Buff._init = function(self, data) --初始化变化值 + _Buff._init = function(self) --初始化变化值 self.owner:reSetAttr(attrName) end _Buff._effectValue = function(self) @@ -55,38 +55,19 @@ local function commonAttr(_Buff, attrName) end end local function commonAttCond(_Buff, attrName) - _Buff._init = function(self, data) --初始化变化值 - self._changeV = self:_calculate() - self:_reSetAttr(true) + _Buff._init = function(self) --初始化变化值 + self:_reSetAttr() end _Buff._overlay = function(self) - self._changeV = (self._changeV or 0) + self:_calculate() - self:_reSetAttr(true) + self:_reSetAttr() end _Buff._uncover = function(self) - self._changeV = self._changeV - self._changeV / (self.layer + 1) self:_reSetAttr() end - _Buff._hpChange = function(self) - local oldHpMax = self.owner.hpMax - self.owner:reSetHpMax() - - local curValue = self.owner.hpMax - oldHpMax - if curValue > 0 then - self.owner:recover(curValue, self.release) -- 防止release不存在,地图点buff - elseif curValue < 0 then - self.owner:hurt(self.release and self.release:getHurtValue(-curValue) or -curValue, self.release, {hurtType = 2, buffId = self.id}) - end - end - - _Buff._reSetAttr = function(self, isInit) + _Buff._reSetAttr = function(self) if attrName == "hp" then - if isInit then - self:_hpChange() - else - self.owner:reSetHpMax() - end + self.owner:reSetHpMax() else self.owner:reSetAttr(attrName) end @@ -95,27 +76,37 @@ local function commonAttCond(_Buff, attrName) _Buff._calculate = function(self) local effectCount = 0 if self.buffData.effectValue4 == 0 then - effectCount = self.owner.battle.adv.owner:getProperty("advItems"):getv(ItemId.OldCoin, 0) + effectCount = self.owner.battle.adv.owner:getProperty("advItems"):getv(ItemId.OldCoin, 0) / tonumber(self.buffData.effectValue5) + elseif self.buffData.effectValue4 == 1 then + effectCount = self.owner.battle.adv.level + elseif self.buffData.effectValue4 == 2 then + local buff = self.owner.battle.player:getBuffById(tonumber(self.buffData.effectValue5)) + effectCount = buff.layer end - return self.buffData.effectValue2 * effectCount / tonumber(self.buffData.effectValue5) + return self.buffData.effectValue2 * effectCount end - _Buff._initDB = function(self, data) - self._changeV = data.cv + + _Buff.getEffectBy = function(self) + local cond = nil + if self.buffData.effectValue4 == 2 then + cond = tonumber(self.buffData.effectValue5) + end + return self.buffData.effectValue4, attrName, cond end + _Buff._effectValue = function(self) - return self.buffData.effectValue1, self._changeV, attrName + print(self:_calculate() * self.layer) + return self.buffData.effectValue1, self:_calculate() * self.layer, attrName end + _Buff._endBuff = function(self, data) self:_reSetAttr() end - _Buff._getDB = function(self) - return {cv = self._changeV} - end end local BuffFactory = { [Buff.HP_CHANGE] = function(_Buff) - _Buff._init = function(self, data) --初始化变化值 + _Buff._init = function(self) --初始化变化值 self._changeV = self:_calculate() end _Buff._overlay = function(self) @@ -161,13 +152,13 @@ local BuffFactory = { end, [Buff.HP_MAX_CHANGE] = function(_Buff) - _Buff._init = function(self, data) --初始化变化值 + _Buff._init = function(self) --初始化变化值 self._changeV = self:_calculate() - self:_hpChange() + self.owner:reSetHpMax() end _Buff._overlay = function(self) self._changeV = (self._changeV or 0) + self:_calculate() - self:_hpChange() + self.owner:reSetHpMax() end _Buff._uncover = function(self) @@ -175,19 +166,6 @@ local BuffFactory = { self.owner:reSetHpMax() end - -- 提高生命上限的时候要相应提高生命值 - _Buff._hpChange = function(self) - local oldHpMax = self.owner.hpMax - self.owner:reSetHpMax() - - local curValue = self.owner.hpMax - oldHpMax - if curValue > 0 then - self.owner:recover(curValue, self.release) -- 防止release不存在,地图点buff - elseif curValue < 0 then - self.owner:hurt(self.release and self.release:getHurtValue(-curValue) or -curValue, self.release, {hurtType = 2, buffId = self.id}) - end - end - _Buff._calculate = function(self) local curValue = 0 if self.buffData.effectValue1 == 0 then --固定值 @@ -258,7 +236,7 @@ local BuffFactory = { end, [Buff.CLEAR_BUFF] = function(_Buff) - _Buff._init = function(self, data) + _Buff._init = function(self) for _, buff in ipairs(self.owner.buffs) do -- 挂上就清除一下子 if not buff.isDel and self:canEffect(buff.id) and not self.isDel then if not buff.isDel and not self.isDel then @@ -326,7 +304,7 @@ local BuffFactory = { end, [Buff.SP_MAX_CHANGE] = function(_Buff) - _Buff._init = function(self, data) --初始化变化值 + _Buff._init = function(self) --初始化变化值 self:_spChange() end _Buff._overlay = function(self) @@ -444,8 +422,11 @@ function Buff:initNew(release, data) if self.buffData.effectTime > 0 then self.count = self.buffData.effectTime end +end + +function Buff:createAfter() if self._init then - self:_init(data) + self:_init() end end diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index b5b7b4b..15ba5b4 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -68,9 +68,13 @@ function BaseObject:clearRound() end for i = #self.buffs, 1, -1 do if self.buffs[i].isDel then - self.battle.adv:backBuff(self.monsterId, self.buffs[i].id, true) - self.buffs[i]:endBuff() + local buff = self.buffs[i] + self.battle.adv:backBuff(self.monsterId, buff.id, true) table.remove(self.buffs, i) + buff:endBuff() + if self.attrChangeCondBuffCheck then + self:attrChangeCondBuffCheck(2, buff.id) + end end end end @@ -142,7 +146,9 @@ function BaseObject:addBuff(buffId, releaser) buffData = buffData, releaseId = releaser and releaser.monsterId or nil }) then return end - table.insert(self.buffs, Buff.create(self, releaser, {id = buffId})) + local buff = Buff.create(self, releaser, {id = buffId}) + table.insert(self.buffs, buff) + buff:createAfter() end self:triggerPassive(Passive.GET_BUFF, {buffId = buffId}) self.battle.adv:backBuff(self.monsterId, buffId) @@ -160,8 +166,11 @@ function BaseObject:delBuffById(bId) for idx, buff in ipairs(self.buffs) do if buff.id == bId then self.battle.adv:backBuff(self.monsterId, buff.id, true) - buff:endBuff() table.remove(self.buffs, idx) + buff:endBuff() + if self.attrChangeCondBuffCheck then + self:attrChangeCondBuffCheck(2, bId) + end return buff end end @@ -639,9 +648,31 @@ end function Player:addBuff(buffId, releaser) Player.super.addBuff(self, buffId, releaser) + self.battle.player:attrChangeCondBuffCheck(2, buffId) self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId) end +function Player:attrChangeCondBuffCheck(etype, cond) + local effect = {} + for _, buff in ipairs(self.buffs) do + if not buff.isDel and (buff:getType() == Buff.ATTR_CHANGE_COND) then + local _et, _attr, _co = buff:getEffectBy() + if etype == _et and (not _co or _co == cond) then + effect[_attr] = 1 + end + + end + end + dump(effect) + for attrName, _ in pairs(effect) do + if attrName == "hp" then + self:reSetHpMax() + else + self:reSetAttr(attrName) + end + end +end + function Player:getDB() local db = Player.super.getDB(self) for _ , field in pairs({"level", "exp", "growth", "sp", "spMax"}) do -- libgit2 0.21.2