From 1e7896240ae1d42323d7d434eb9a496001b95768 Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Wed, 18 Nov 2020 14:20:32 +0800 Subject: [PATCH] 新的 buff 效果 --- src/adv/AdvBlock.lua | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- src/adv/AdvBuff.lua | 13 ++++++++++++- src/adv/AdvMap.lua | 12 ++++++++++++ src/adv/AdvPassive.lua | 4 +--- src/adv/AdvPlayer.lua | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------- 5 files changed, 133 insertions(+), 28 deletions(-) diff --git a/src/adv/AdvBlock.lua b/src/adv/AdvBlock.lua index fa0a261..6e921bf 100644 --- a/src/adv/AdvBlock.lua +++ b/src/adv/AdvBlock.lua @@ -48,6 +48,8 @@ function Block:updateEvent(event, isInit) end end end + local oldet = self:getEventType() + self.event = event if not isInit and self.event then -- 判断下类型是不是错的 @@ -59,18 +61,48 @@ function Block:updateEvent(event, isInit) self:randomEvent() end self:quickDrop() + + if not isInit and self.isOpen then + local newet = self:getEventType() + if oldet ~= newet then + local em = {} + if oldet then + em[oldet] =1 + end + if newet then + em[oldet] =1 + end + + local player = self.room.map.adv.battle.player + player:attrChangeCondBuffCheck(4, em) + for _, monster in pairs(player:getTeam(2)) do + monster:attrChangeCondBuffCheck(4, em) + end + end + end end function Block:clear() - if self:getEventType() == AdvEventType.Trap then + local et = self:getEventType() + if et == AdvEventType.Trap then self.trapId = self.event.id - elseif self:getEventType() == AdvEventType.Build then + elseif et == AdvEventType.Build then local build = self.room.map.adv.battle:getBuild(self.room.roomId, self.blockId, self.room.map.mapIdx) if build then build.isDead = true end end self.event = nil + + + if et then + local em = {[et] = 1} + local player = self.room.map.adv.battle.player + player:attrChangeCondBuffCheck(4, em) + for _, monster in pairs(player:getTeam(2)) do + monster:attrChangeCondBuffCheck(4, em) + end + end end @@ -91,8 +123,10 @@ function Block:randomEvent() enemy:triggerPassive(Passive.BORN_ONCE) adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy}) + adv.battle.player:attrChangeCondBuffCheck(3, enemy:getClassify()) for _, monster in pairs(adv.battle.player:getTeam(2)) do - adv.battle.player:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy}) + monster:triggerPassive(Passive.OPEN_MONSTER, {trigger = enemy}) + monster:attrChangeCondBuffCheck(3, enemy:getClassify()) end end randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] @@ -272,6 +306,16 @@ function Block:open() self.isOpen = true self:randomEvent() self:quickDrop() + + local et = self:getEventType() + if et then + local em = {[et] = 1} + local player = self.room.map.adv.battle.player + player:attrChangeCondBuffCheck(4, em) + for _, monster in pairs(player:getTeam(2)) do + monster:attrChangeCondBuffCheck(4, em) + end + end return true end diff --git a/src/adv/AdvBuff.lua b/src/adv/AdvBuff.lua index 748ed3b..612d259 100644 --- a/src/adv/AdvBuff.lua +++ b/src/adv/AdvBuff.lua @@ -89,13 +89,24 @@ local function commonAttCond(_Buff, attrName) if buff then effectCount = buff.layer end + elseif self.buffData.effectValue4 == 3 then + local classify = tonumber(self.buffData.effectValue5) -- 怪标签 + local enemy = self.owner.battle.player:getTeam(2) + for _, one in pairs(enemy) do + if one.isClassify and one:isClassify(classify) then + effectCount = effectCount + 1 + end + end + elseif self.buffData.effectValue4 == 4 then + local eventType = tonumber(self.buffData.effectValue5) -- event 类型 + effectCount = #self.owner.battle.adv:getCurMap():getEventTypeAllMap(eventType) end return self.buffData.effectValue2 * effectCount end _Buff.getEffectBy = function(self) local cond = nil - if self.buffData.effectValue4 == 2 then + if self.buffData.effectValue4 == 2 or self.buffData.effectValue4 == 3 or self.buffData.effectValue4 == 4 then cond = tonumber(self.buffData.effectValue5) end return self.buffData.effectValue4, attrName, cond diff --git a/src/adv/AdvMap.lua b/src/adv/AdvMap.lua index 51fc2c9..aeeeee4 100644 --- a/src/adv/AdvMap.lua +++ b/src/adv/AdvMap.lua @@ -463,6 +463,18 @@ function Map:getEnemysBySize(roomId, blockId, size) return enemys end +function Map:getEventTypeAllMap(eventType) + local blocks = {} + if not eventType then return blocks end + for roomId, room in pairs(self.rooms) do + for blockId, block in pairs(room.blocks) do + if block.isOpen and block:getEventType() == eventType then + table.insert(blocks, block) + end + end + end + return blocks +end -----------------------------随机地图----------------------------- -- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入 diff --git a/src/adv/AdvPassive.lua b/src/adv/AdvPassive.lua index ceb0831..086d979 100644 --- a/src/adv/AdvPassive.lua +++ b/src/adv/AdvPassive.lua @@ -60,9 +60,7 @@ end FilterFactory[Filter.CLASSIFY] = function (_Filter) _Filter._execute = function (self, target) - if not target.monsterId then return end - local classify = csvdb["event_monsterCsv"][target.monsterId].classify - return classify and classify:sismember(self.value, " ") + return target.isClassify and target:isClassify(self.value) end end diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 9fb86cf..ddee770 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -165,6 +165,7 @@ function BaseObject:addBuff(buffId, releaser) end self:triggerPassive(Passive.GET_BUFF, {trigger = releaser, buffId = buffId}) self:triggerPassive(Passive.PLAYER_BUFF_CLASSIFY, {trigger = releaser, classify = buffData.classify}) + self:attrChangeCondBuffCheck(2, buffId) return true end @@ -424,6 +425,12 @@ function BaseObject:hurt(value, releaser, params) self.battle.adv:checkAchievement(self.battle.adv.AchievType.KillByBuff, 1, params.buffId) end self.isDead = true + if self:is("Enemy") then + self.battle.player:attrChangeCondBuffCheck(3, self:getClassify()) + for _, monster in pairs(self.battle.player:getTeam(2)) do + monster:attrChangeCondBuffCheck(3, self:getClassify()) + end + end end self:triggerPassive(Passive.HURT_PERCENT_SELF, {value = value / self.hpMax}) for _, team in ipairs(self:getTeam(1, true)) do @@ -505,6 +512,50 @@ function BaseObject:getTeam(nType, noSelf, mapIdx, includeLock) return team end +function BaseObject:attrChangeCondBuffCheck(etype, cond) + local effect = {} + if etype == 3 then + if type(cond) ~= "string" then + return + end + local temp = cond:toArray(true, " ") + cond = {} + for _, one in pairs(temp) do + cond[one] = 1 + end + elseif etype == 4 then + if not cond then + cond = {} + end + if type(cond) == "number" then + cond = {[cond] = 1} + end + end + for _, buff in ipairs(self.buffs) do + if not buff:isHide() and (buff:getType() == Buff.ATTR_CHANGE_COND) then + local _et, _attr, _co = buff:getEffectBy() + if etype == _et then + if etype == 3 or etype == 4 then + if cond[_co] then + effect[_attr] = 1 + end + else + if (not _co or _co == cond) then + effect[_attr] = 1 + end + end + end + end + end + for attrName, _ in pairs(effect) do + if attrName == "hp" then + self:reSetHpMax() + else + self:reSetAttr(attrName) + end + end +end + function BaseObject:getDB() local db = {} db.hp = self.hp @@ -565,6 +616,16 @@ function Enemy:getObstacle() return obstacle end +function Enemy:isClassify(check) + local classify = self:getClassify() + return classify and classify:sismember(check, " ") +end + +function Enemy:getClassify() + return csvdb["event_monsterCsv"][self.monsterId].classify +end + + function Enemy:kill() self:hurt(self.hp, self.battle.player, {hurtType = 5}) end @@ -704,7 +765,6 @@ end function Player:addBuff(buffId, releaser) local status = Player.super.addBuff(self, buffId, releaser) if status then - self.battle.player:attrChangeCondBuffCheck(2, buffId) self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId) self.battle.adv:pushBackEvent(AdvBackEventType.Buff, {buffId = buffId}) self.battle:triggerPassive(Passive.PLAYER_BUFF, {buffId = buffId}) @@ -716,26 +776,6 @@ function Player:addBuff(buffId, releaser) return status end -function Player:attrChangeCondBuffCheck(etype, cond) - local effect = {} - for _, buff in ipairs(self.buffs) do - if not buff:isHide() 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 - for attrName, _ in pairs(effect) do - if attrName == "hp" then - self:reSetHpMax() - else - self:reSetAttr(attrName) - end - end -end - function Player:isPlayer() return true end -- libgit2 0.21.2