miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/Logic/Buff/Shield.lua

135 lines
4.5 KiB
Lua
Raw Normal View History

2020-05-09 13:31:21 +08:00
Shield = Buff:New()
-- 无敌吸血盾的免疫状态
local immune0 = function(buff)
return buff.type == BuffName.Control or buff.isDeBuff or buff.type == BuffName.DOT
end
--初始化Buff通过传入一些自定义参数控制成长相关的数值
function Shield:SetData(...)
self.shieldType, -- 护盾类型(1 固定减伤盾 2 百分比减伤盾 3 无敌盾)
self.shieldValue, -- 护盾值(固定减伤盾:减伤值 百分比减伤盾:减伤百分比 无敌盾:吸血率)
self.dmgReboundFactor = ... --伤害反弹系数
self.damageSum = 0 --记录承受的伤害
self.isBuff = true
self.atk=nil --每次扣除护盾时,记录破盾的对象
self.cover = self.shieldType ~= ShieldTypeName.NormalReduce -- 除固定减伤盾外都不能叠加
-- 刷新排序等级
self.sort = 4
end
--初始化后调用一次
function Shield:OnStart()
self.target.shield:Add(self)
if self.shieldType == ShieldTypeName.AllReduce then
self.target.buffFilter:Add(immune0)
-- 清除所有负面buff
BattleLogic.BuffMgr:ClearBuff(self.target, function (buff)
return buff.type == BuffName.Control or buff.type == BuffName.Dot
end)
end
end
--间隔N帧触发返回true时表示继续触发返回false立刻触发OnEnd
function Shield:OnTrigger()
return true
end
-- 计算护盾
function Shield:CountShield(damage, atkRole)
self.atk = atkRole
local finalDamage = 0
if self.shieldType == ShieldTypeName.NormalReduce then
if damage < self.shieldValue then
self.shieldValue = self.shieldValue - damage
self.damageSum = self.damageSum + damage
else
self.damageSum = self.damageSum + self.shieldValue
finalDamage = damage - self.shieldValue
self.shieldValue = 0
self.disperse = true
end
elseif self.shieldType == ShieldTypeName.RateReduce then
local reduceDamage = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
finalDamage = damage - reduceDamage
self.damageSum = self.damageSum + reduceDamage
elseif self.shieldType == ShieldTypeName.AllReduce then
finalDamage = 0
--TODO 计算吸血
if self.shieldValue ~= 0 then
local treatValue = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
BattleUtil.ApplyTreat(self.target, self.target, treatValue)
end
end
return finalDamage
end
-- 改变护盾值(固定减伤盾:减伤值 百分比减伤盾:减伤百分比 无敌盾:吸血率)
function Shield:ChangeShieldValue(type, value)
-- 计算
local finalValue = BattleUtil.ErrorCorrection(BattleUtil.CountValue(self.shieldValue, value, type))
self.shieldValue = finalValue
-- 发送事件
self.caster.Event:DispatchEvent(BattleEventName.ShildValueChange, self)
end
--效果结束时调用一次
function Shield:OnEnd()
-- 计算反伤
if self.shieldType == ShieldTypeName.NormalReduce then
for i = 1, self.target.shield.size do
if self.target.shield.buffer[i] == self then
local arr = RoleManager.Query(function (r) return r.camp ~= self.target.camp end)
for j = 1, #arr do
BattleUtil.ApplyDamage(nil, self.target, arr[j], math.floor(self.dmgReboundFactor * self.damageSum))
end
self.target.shield:Remove(i)
break
end
end
elseif self.shieldType == ShieldTypeName.RateReduce then
for i = 1, self.target.shield.size do
if self.target.shield.buffer[i] == self then
self.target.shield:Remove(i)
break
end
end
elseif self.shieldType == ShieldTypeName.AllReduce then
for i = 1, self.target.shield.size do
if self.target.shield.buffer[i] == self then
self.target.shield:Remove(i)
break
end
end
-- 移除免疫效果
for i = 1, self.target.buffFilter.size do
if self.target.buffFilter.buffer[i] == immune0 then
self.target.buffFilter:Remove(i)
break
end
end
end
end
--只有当cover字段为true时触发返回true则被新效果覆盖
function Shield:OnCover(newBuff)
return true
end
-- 比较buff
function Shield:OnCompare(buff)
return self.shieldType == buff.shieldType
end
return Shield