diff --git a/src/adv/AdvPassive.lua b/src/adv/AdvPassive.lua index 20ef130..1f2dcaf 100644 --- a/src/adv/AdvPassive.lua +++ b/src/adv/AdvPassive.lua @@ -1,3 +1,51 @@ +local Filter = class("Filter") + +Filter.HP_UP_WITH_EQUAL = 1 -- 血量>=value% + +local FilterFactory = {} +FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter) + _Filter._execute = function (self, target) + return target.hp >= self.value * target.hpMax / 100 + end +end + +function Filter:ctor(params) + self.owner = params.owner + self.skill = params.skill + self.fType = params.fType -- 筛选类型 + self.oType = params.oType -- 主体类型 0:owner 1:trigger 2:releaser + self.value = params.value -- 筛选值 + + if FilterFactory[self.fType] then + FilterFactory[self.fType](self) + end +end + +function Filter:getTarget(params) + local target + if self.oType == 0 then + target = self.owner + end + if self.oType == 1 and params.trigger then + target = params.trigger + end + if self.oType == 2 and params.releaser then + target = params.releaser + end + return target +end + +function Filter:execute(params) + local target = self:getTarget(params) + if not target then + return + end + if self:_execute(target) then + return self:_execute(target) + end +end + +-->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> local Passive = class("Passive") -- 每回合触发的使用 afterRound @@ -124,19 +172,30 @@ function Passive:ctor(owner, data) self.count = data.count or 0 --触发剩余次数 self.effects = self.passiveData.effect:toTableArray(true) + self.filters = {} if PassiveCondFactory[self.passiveData.condition] then PassiveCondFactory[self.passiveData.condition](self) end + self:initFilter() if self._initDB then self:_initDB(data) end end +function Passive:initFilter() + local filterList = self.passiveData.filter:toTableArray(true) + for _, fParams in ipairs(filterList) do + local filter = Filter.new({owner = self.owner, skill = self, oType = fParams[1], fType = fParams[2], value = fParams[3] }) + table.insert(self.filters, filter) + end +end + function Passive:getCondType() return self.passiveData.condition, self.passiveData.value end +-- effect 生效篩選 function Passive:canEffect(effType, effValue) if self.owner.lock and effType ~= 3 then -- 锁定的只能触发翻开自己格子的固有技 return @@ -145,21 +204,13 @@ function Passive:canEffect(effType, effValue) end function Passive:effect(trigger) - if math.randomInt(1, 100) > self.passiveData.chance then - return - end - local effNum = 0 for _, effect in pairs(self.effects) do local effType = effect[1] local effValue = effect[2] if self:canEffect(effType, effValue) then self["effect" .. effType](self, effValue, trigger) - effNum = effNum + 1 end end - if effNum < 1 then - return - end --次数为 -1 一局只能触发一次,触发过后删掉就可以 if self.count == -1 then self.isDel = true @@ -196,6 +247,12 @@ function Passive:trigger(condType, params) --触发检查 if self._trigger then if not self:_trigger(params) then return end --检查 end + if not self:filter(params) then + return + end + if math.randomInt(1, 100) > self.passiveData.chance then + return + end self.round = self.passiveData.delay --首次 self.count = self.passiveData.count --次数 -- 没有延迟就直接触发 @@ -204,6 +261,15 @@ function Passive:trigger(condType, params) --触发检查 end end +function Passive:filter(params) + for _, filter in ipairs(self.filters) do + if not filter:execute(params) then + return + end + end + return true +end + function Passive:getDB() local db = {} if self._getDB then -- libgit2 0.21.2