miduo_server/luafight/Modules/Battle/Logic/Base/Effect.lua

955 lines
38 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

local floor = math.floor
local min = math.min
local max = math.max
--local RoleDataName = RoleDataName
--local BattleLogic = BattleLogic
--local BattleUtil = BattleUtil
--属性编号
local propertyList = {
RoleDataName.Attack,
RoleDataName.PhysicalDefence,
RoleDataName.MagicDefence,
RoleDataName.Speed,
RoleDataName.DamageBocusFactor,
RoleDataName.DamageReduceFactor,
RoleDataName.Hit,
RoleDataName.Dodge,
RoleDataName.Crit,
RoleDataName.CritDamageFactor,
RoleDataName.TreatFacter,
RoleDataName.MaxHp,
RoleDataName.Hp,
RoleDataName.CureFacter,
RoleDataName.Tenacity,
}
local function buffRandomAction(random, caster, target, buffType, duration, ...)
local b = Random.Range01() <= random
if b then
target:AddBuff(Buff.Create(caster, buffType, duration, ...))
else
target.Event:DispatchEvent(BattleEventName.BuffDodge, caster, buffType, ...)
end
end
local function casterBulletEffect(caster, target, interval)
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, interval, target)
if caster.camp == 0 and target.camp == 1 then
BattleLogic.Event:DispatchEvent(BattleEventName.ZoomChange, target, interval)
end
end
local function calBuffHit(caster, target, baseRandom)
local hit = (1 + caster:GetRoleData(RoleDataName.Hit) / (1 + target:GetRoleData(RoleDataName.Dodge)))
return BattleUtil.ErrorCorrection(hit * baseRandom)
end
--效果表
local effectList = {
--造成[a]%的[b]伤害
--a[float],b[伤害类型]
[1] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--造成[a]%的[b]伤害【AOE】
--a[float],b[伤害类型]
[2] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--[a]%概率[b],持续[c]秒
--a[float],b[控制状态],c[float]
[3] = function(caster, target, args, interval)
local f1 = calBuffHit(caster, target, args[1])
local cb1 = args[2]
local f2 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
buffRandomAction(f1, caster, target, BuffName.Control, f2, cb1)
end)
end,
--[d]改变[a]属性[b]%,持续[c]秒
--a[属性],b[float],c[int],d[改变类型]
[4] = function(caster, target, args, interval)
local pro1 = args[1]
local f1 = args[2]
local f2 = args[3]
local ct = args[4]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.PropertyChange, f2, propertyList[pro1], f1, ct))
end)
end,
--持续恢复[a]*[b]%生命,持续[c]秒
--a[属性],b[float],c[int]
[5] = function(caster, target, args, interval)
local pro1 = args[1]
local f1 = args[2]
local f2 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.HOT, f2, 1, floor(caster:GetRoleData(propertyList[pro1]) * f1)))
end)
end,
--造成[a]到[b]次[c]%的[d]伤害
--a[int],b[int],c[float],d[伤害类型]
[6] = function(caster, target, args, interval)
local i1 = args[1]
local i2 = args[2]
local f1 = args[3]
local dt = args[4]
local count = Random.RangeInt(i1, i2)
local d = interval / count
if caster.camp == 0 and target.camp == 1 then
BattleLogic.Event:DispatchEvent(BattleEventName.ZoomChange, target, d)
end
for i=1, count do
BattleLogic.WaitForTrigger(d * (i-1), function ()
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, d, target)
BattleLogic.WaitForTrigger(d, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end)
end
end,
--造成[a]到[b]次[c]%的[d]伤害【AOE】
--a[int],b[int],c[float],d[伤害类型]
[7] = function(caster, target, args, interval)
local i1 = args[1]
local i2 = args[2]
local f1 = args[3]
local dt = args[4]
local count = Random.RangeInt(i1, i2)
local d = interval / count
for i=1, count do
BattleLogic.WaitForTrigger(d * (i-1), function ()
BattleLogic.WaitForTrigger(d, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end)
end
end,
--[b]%改变[c]下次重击技能CD[a]秒
--a[float],b[float],c[改变类型]
[8] = function(caster, target, args, interval)
local f1 = args[1]
local f2 = calBuffHit(caster, target, args[2])
local ct = args[3]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.RandomAction(f2, function ()
target:AddSkillCD(f1, ct)
end)
end)
end,
--添加[a]的[b]%护盾,持续[c]秒,盾消失的时候反射吸收伤害的[d]%
--a[属性],b[float],c[int],d[float]
[9] = function(caster, target, args, interval)
local pro1 = args[1]
local f1 = args[2]
local f2 = args[3]
local f3 = args[4]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.Shield, f2, floor(caster:GetRoleData(propertyList[pro1]) * f1), f3))
end)
end,
--造成[a]%的[b]伤害,自身恢复造成伤害[c]%的生命
--a[float],b[伤害类型],c[float]
[10] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local dmg = BattleUtil.CalDamage(caster, target, dt, f1)
BattleUtil.CalTreat(caster, caster, floor(dmg * f2))
end)
end,
--造成[a]%的[b]伤害,对[c]造成额外[d]%伤害
--a[float],b[伤害类型,]c[职业],d[float]
[11] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local i1 = args[3]
local f2 = args[4]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if target.professionId == i1 then
f1 = f1 + f2
end
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--每秒造成[a]的[b]的伤害,持续[c]秒
--a[float],b[伤害类型],c[int]
[12] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.DOT, f2, 1, 0, dt, f1))
end)
end,
--造成[a],每秒造成[b]的[c]的伤害,持续[d]秒
--a[持续伤害状态].b[float],c[伤害类型],d[int]
[13] = function(caster, target, args, interval)
local d1 = args[1]
local f1 = args[2]
local dt = args[3]
local f2 = args[4]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.DOT, f2, 1, d1, dt, f1))
end)
end,
--造成[a]%的[b]伤害,[c]%概率[d]专属伤害加深印记(如果有印记,[a]*1+印记数量*[e]),印记最多[f]层
--a[float],b[伤害类型],c[float],d[角色id],e[float],f[int]
[14] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = calBuffHit(caster, target, args[3])
local rid = args[4]
local f3 = args[5]
local i1 = args[6]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local layer
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Brand, function (buff)
local b = buff.flag == rid
if b then
layer = buff.layer
end
return b
end) then
BattleUtil.CalDamage(caster, target, dt,f1 * (1 + min(layer, i1) * f3))
else
BattleUtil.CalDamage(caster, target, dt, f1)
end
buffRandomAction(f2, caster, target, BuffName.Brand, 0, rid)
end)
end,
--造成[a]%的[b]伤害,如果击杀,则其他人再受到此次伤害的[c]%的伤害
--a[float],b[伤害类型],c[float]
[15] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local dmg, crit = BattleUtil.CalDamage(caster, target, dt, f1)
if target.isDead then
local arr = BattleLogic.Query(function (r) return r.camp ~= caster.camp and r.uid ~= target.uid end)
for i=1, #arr do
BattleUtil.ApplyDamage(caster, arr[i], floor(dmg * f2))
end
end
end)
end,
--吸取[a]%的[b],持续[c]秒(属于增益),累积不高于自身该属性的[d]%
--a[float],b[属性],c[float],d[float]
[16] = function(caster, target, args, interval)
local f1 = args[1]
local pro = args[2]
local f2 = args[3]
local f3 = args[4]
BattleLogic.WaitForTrigger(interval, function ()
--计算上限值
local total = caster.data:GetOrginData(propertyList[pro]) * (1 + f3)
--计算预期吸取后的值
local targetValue = caster:GetRoleData(propertyList[pro]) + target:GetRoleData(propertyList[pro]) * f1
--计算有效吸收值
local delta = min(targetValue, total) - caster:GetRoleData(propertyList[pro])
if delta > 0 then
target:AddBuff(Buff.Create(caster, BuffName.PropertyChange, f2, propertyList[pro], delta, 3))
caster:AddBuff(Buff.Create(caster, BuffName.PropertyChange, f2, propertyList[pro], delta, 1))
end
end)
end,
--造成[a]%的[b]伤害,如果是[c],有[d]%必定暴击
--a[float],b[伤害类型],c[职业],d[float]
[17] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local i1 = args[3]
local f2 = calBuffHit(caster, target, args[4])
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local dmg = floor(caster:GetRoleData(propertyList[dt]) * f1)
if target.professionId == i1 then
BattleUtil.RandomAction(f2, function ()
target.isFlagCrit = true
BattleUtil.CalDamage(caster, target, dmg)
target.isFlagCrit = false
end)
else
BattleUtil.CalDamage(caster, target, dmg)
end
end)
end,
--造成[a]%的[b]伤害若暴击则减少下次发动技能CD[c]秒。
--a[float],b[伤害类型],c[float]
[18] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local d, crit = BattleUtil.CalDamage(caster, target, dt, f1)
if crit then
if target.skill then
target.skill.sp = target.skill.sp + floor(f2 * BattleLogic.GameFrameRate)
end
end
end)
end,
--造成[a]%的[b]伤害,有[c]%的概率追加伤害,最多可追加[d]次。(0无限追加)
--a[float],b[伤害类型],c[float],d[int]
[19] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
local i1 = args[4]
if i1 == 0 then
i1 = floor(interval * BattleLogic.GameFrameRate)
end
local count = 1
while Random.Range01() <= f2 and count <= i1 do
count = count + 1
end
local d = interval / count
if caster.camp == 0 and target.camp == 1 then
BattleLogic.Event:DispatchEvent(BattleEventName.ZoomChange, target, d)
end
for i=1, count do
BattleLogic.WaitForTrigger(d * (i-1), function ()
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, d, target)
BattleLogic.WaitForTrigger(d, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end)
end
end,
--造成[a]%的[b]伤害,对[c]造成额外[d]%伤害
--a[float],b[伤害类型,]c[控制状态],d[float]
[20] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local i1 = args[3]
local f2 = args[4]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Control, function (buff) return i1 == 0 or buff.ctrlType == i1 end) then
f1 = f1 + f2
end
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--造成[a]%的[b]伤害,对[c]有[d]%造成[e],持续[f]秒【AOE】
--a[float],b[伤害类型,]c[持续伤害状态],d[float],e[控制状态],f[int]
[21] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local dot = args[3]
local f2 = calBuffHit(caster, target, args[4])
local ct = args[5]
local f3 = args[6]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
buffRandomAction(f2, caster, target, BuffName.Control, f3, ct)
end
end)
end,
--造成[a]%的[b]伤害,对[c]造成额外[d]%伤害【AOE】
--a[float],b[伤害类型,]c[持续伤害状态],d[float]
[22] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local dot = args[3]
local f2 = args[4]
BattleLogic.WaitForTrigger(interval, function ()
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
f1 = f1 + f2
end
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--造成[a]%的[b]伤害,对[c]造成额外[d]%伤害
--a[float],b[伤害类型,]c[持续回复状态],d[float]
[23] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local ht = args[3]
local f2 = args[4]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if BattleLogic.BuffMgr:HasBuff(target, BuffName.HOT, function (buff) return true end) then
f1 = f1 + f2
end
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--瞬间恢复[a]*[b]%生命
--a[属性],b[float]
[24] = function(caster, target, args, interval)
local pro1 = args[1]
local f1 = args[2]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalTreat(caster, target, floor(caster:GetRoleData(propertyList[pro1]) * f1))
end)
end,
--对[a]的伤害[b]%,持续[c]秒
--a[持续伤害状态],b[float],c[int]
[25] = function(caster, target, args, interval)
local dot = args[1]
local f1 = args[2]
local f2 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
local func = function(damage)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
damage = damage + floor(damage * f1)
end
return damage
end
target.exCalDmgList:Add(func)
if f2 > 0 then
BattleLogic.WaitForTrigger(f2, function ()
for i=1, target.exCalDmgList.size do
if target.exCalDmgList.buffer[i] == func then
target.exCalDmgList:Remove(i)
break
end
end
end)
end
end)
end,
--造成[a]的伤害【AOE】(真实伤害)
--a[int]
[26] = function(caster, target, args, interval)
local d = args[1]
BattleLogic.WaitForTrigger(interval, function ()
if not target.isDead then
BattleUtil.ApplyDamage(caster, target, d)
end
end)
end,
--每秒造成[d]的伤害,持续[f]秒【AOE】真实伤害
--d[float],f[int]
[27] = function(caster, target, args, interval)
local d1 = args[1]
local d2 = args[2]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.DOT, d2, 1, 0, d1, 1))
end)
end,
--造成[a]%的[b]伤害,对[c]造成额外[d]%伤害
--a[float],b[伤害类型,]c[持续伤害状态],d[float]
[28] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local dot = args[3]
local f2 = args[4]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
f1 = f1 + f2
end
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end,
--造成[a]到[b]次[c]%的[d]伤害,对[e]造成额外[f]%伤害
--a[int],b[int],c[float],d[伤害类型],e[职业],f[float]
[29] = function(caster, target, args, interval)
local i1 = args[1]
local i2 = args[2]
local f1 = args[3]
local dt = args[4]
local pt = args[5]
local f2 = args[6]
local count = Random.RangeInt(i1, i2)
local d = interval / count
if caster.camp == 0 and target.camp == 1 then
BattleLogic.Event:DispatchEvent(BattleEventName.ZoomChange, target, d)
end
for i=1, count do
BattleLogic.WaitForTrigger(d * (i-1), function ()
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, d, target)
BattleLogic.WaitForTrigger(d, function ()
if target.professionId == pt then
f1 = f1 + f2
end
BattleUtil.CalDamage(caster, target, dt, f1)
end)
end)
end
end,
--造成[a]%的[b]伤害,若为[c],则无视敌人[d]%的防御
--a[float],b[伤害类型,]c[控制状态],d[float]
[30] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local ct = args[3]
local f2 = args[4]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Control, function (buff) return ct == 0 or buff.ctrlType == ct end) then
BattleUtil.CalDamage(caster, target, dt, f1, f2)
else
BattleUtil.CalDamage(caster, target, dt, f1)
end
end)
end,
--[a]%概率[b],持续[c]秒
--a[float],b[免疫buff],c[int]
[31] = function(caster, target, args, interval)
local f1 = calBuffHit(caster, target, args[1])
local ib1 = args[2]
local f2 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
buffRandomAction(f1, caster, target, BuffName.Immune, f2, ib1)
end)
end,
--[b]%改变[d]重击技能CD[a]秒 ,持续[c]秒 0代表清除所有
--a[float],b[float],c[改变类型]
[32] = function(caster, target, args, interval)
local f1 = args[1]
local f2 = calBuffHit(caster, target, args[2])
local ct = args[3]
local d = args[4]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.RandomAction(f2, function ()
target:AddSkillCD(f1, ct)
local trigger = function(skill) --新增监听事件在印记技能结束回调时移除印记buff可覆盖旧buff
target:AddSkillCD(f1, ct)
end
target.Event:AddEvent(BattleEventName.SkillCast, trigger)
target:AddBuff(Buff.Create(caster, BuffName.Brand, d, "cd", function ()
target.Event:RemoveEvent(BattleEventName.SkillCast, trigger)
end))
end)
end)
end,
--造成[a]%的[b]伤害,[c]%概率添加[d]的印记,该角色在攻击拥有印记的目标时,额外获得(印记层数*[e])的暴击伤害,印记最多叠加[f]层。
--a[folat],b[伤害类型],c[float],d[角色id],e[float],f[float]
[33] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = calBuffHit(caster, target, args[3])
local rid = args[4]
local f3 = args[5]
local i1 = args[6]
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, interval, target)
BattleLogic.WaitForTrigger(interval, function ()
local layer
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Brand, function (buff)
local b = buff.flag == rid
if b then
layer = buff.layer
end
return b
end) then
local OnPassiveCriting = function(crit)
crit(min(layer, i1) * f3)
end
caster.Event:AddEvent(BattleEventName.PassiveCriting, OnPassiveCriting)
BattleUtil.CalDamage(caster, target, dt, f1)
caster.Event:RemoveEvent(BattleEventName.PassiveCriting, OnPassiveCriting)
else
BattleUtil.CalDamage(caster, target, dt, f1)
end
buffRandomAction(f2, caster, target, BuffName.Brand, 0, rid)
end)
end,
--对[a]职业,[e]改变目标的[b]属性[c]%,持续[d]秒
--a[职业],b[属性],c[float],d[int],e[改变类型]
[34] = function(caster, target, args, interval)
local pt = args[1]
local pro1 = args[2]
local f1 = args[3]
local f2 = args[4]
local ct = args[5]
BattleLogic.WaitForTrigger(interval, function ()
if target.professionId == pt then
target:AddBuff(Buff.Create(caster, BuffName.PropertyChange, f2, propertyList[pro1], f1, ct))
end
end)
end,
--对[a]的伤害[b]%,持续[c]秒
--a[控制状态],b[float],c[int]
[35] = function(caster, target, args, interval)
local ct = args[1]
local f1 = args[2]
local f2 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
local func = function(damage)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Control, function (buff) return ct == 0 or buff.ctrlType == ct end) then
damage = damage + floor(damage * f1)
end
return damage
end
target.exCalDmgList:Add(func)
if f2 > 0 then
BattleLogic.WaitForTrigger(f2, function ()
for i=1, target.exCalDmgList.size do
if target.exCalDmgList.buffer[i] == func then
target.exCalDmgList:Remove(i)
break
end
end
end)
end
end)
end,
--[d]改变[a]属性[b]%,最大叠加[c]层
--a[属性],b[float],c[int],d[改变类型]
[36] = function(caster, target, args, interval)
local pro1 = args[1]
local f1 = args[2]
local i1 = args[3]
local ct = args[4]
BattleLogic.WaitForTrigger(interval, function ()
local changeBuff = Buff.Create(caster, BuffName.PropertyChange, 0, propertyList[pro1], f1, ct)
changeBuff.cover = true
changeBuff.maxLayer = i1
target:AddBuff(changeBuff)
end)
end,
--清除[a]状态
--a[控制状态]
[37] = function(caster, target, args, interval)
local ct = args[1]
BattleLogic.WaitForTrigger(interval, function ()
BattleLogic.BuffMgr:ClearBuff(target, function (buff)
return buff.type == BuffName.Control and (ct == 0 or buff.ctrlType == ct)
end)
end)
end,
--造成[a]的伤害(真实伤害)
--a[int]
[38] = function(caster, target, args, interval)
local d = args[1]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if not target.isDead then
BattleUtil.ApplyDamage(caster, target, d)
end
end)
end,
--每秒造成[d]的伤害,持续[f]秒(真实伤害)
--d[float],f[int]
[39] = function(caster, target, args, interval)
local d1 = args[1]
local d2 = args[2]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.DOT, d2, 1, 0, d1, 1))
end)
end,
--添加[a]的伤害吸收护盾,持续[b]秒,盾消失的时候反射吸收伤害的[c]%
--a[int],b[int],c[float]
[40] = function(caster, target, args, interval)
local f1 = args[1]
local f2 = args[2]
local f3 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.Shield, f2, f1, f3))
end)
end,
--造成[a]%的[b]伤害,同时有[c]%的概率对该敌人造成[d]%的伤害,若该技能造成击杀,则有[e]%的概率清除自身CD
--a[folat],b[伤害类型],c[float],d[float],e[float]
[41] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = calBuffHit(caster, target, args[3])
local f3 = args[4]
local f4 = calBuffHit(caster, target, args[5])
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.RandomAction(f2, function ()
f1 = f1 + f3
end)
BattleUtil.CalDamage(caster, target, dt, f1)
if target.isDead then
BattleUtil.RandomAction(f4, function ()
caster:AddSkillCD(0)
end)
end
end)
end,
--进入虚弱状态,有[a]%的概率受到额外[b]%的伤害,状态持续[c]秒
--a[folat],b[float],c[int]
[42] = function(caster, target, args, interval)
local f1 = calBuffHit(caster, target, args[1])
local f2 = args[2]
local f3 = args[3]
BattleLogic.WaitForTrigger(interval, function ()
local trigger = function(atkRole, damagingFunc, damageType)
BattleUtil.RandomAction(f1, function ()
damagingFunc(f2)
end)
end
target.Event:AddEvent(BattleEventName.RoleBeDamagedBefore, trigger)
target:AddBuff(Buff.Create(caster, BuffName.Brand, f3, "weak", function ()
target.Event:RemoveEvent(BattleEventName.RoleBeDamagedBefore, trigger)
end))
end)
end,
--瞬间恢复[a]的生命
--a[int]
[43] = function(caster, target, args, interval)
local i1 = args[1]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalTreat(caster, target, i1)
end)
end,
--造成[a]%的[b]伤害,计算伤害时,额外计算[c]%的[d]和[e]%的[f]
--a[float],b[伤害类型],c[float],d[属性],e[float],f[属性]
[44] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
local pro1 = args[4]
local f3 = args[5]
local pro2 = args[6]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local proTran1 = {proName = propertyList[pro1], tranProName = propertyList[pro1], tranFactor = f2}
local proTran2 = {proName = propertyList[pro2], tranProName = propertyList[pro2], tranFactor = f3}
caster.proTranList:Add(proTran1)
caster.proTranList:Add(proTran2)
BattleUtil.CalDamage(caster, target, dt, f1)
caster.proTranList:Remove(caster.proTranList.size)
caster.proTranList:Remove(caster.proTranList.size)
end)
end,
--[e][a]%概率改变[b]属性[c]%,持续[d]秒
--a[float],b[属性],c[float],d[int],e[改变类型]
[45] = function(caster, target, args, interval)
local f3 = calBuffHit(caster, target, args[1])
local pro1 = args[2]
local f1 = args[3]
local f2 = args[4]
local ct = args[5]
BattleLogic.WaitForTrigger(interval, function ()
buffRandomAction(f3, caster, target, BuffName.PropertyChange, f2, propertyList[pro1], f1, ct)
end)
end,
--造成[a]%的[b]伤害,如果击杀,则永久增加[c]%的[d],最大[e]层0为无限
--a[float],b[伤害类型],c[float],d[属性],e[int]
[46] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
local pro1 = args[4]
local i1 = args[5]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
local dmg, crit = BattleUtil.CalDamage(caster, target, dt, f1)
if target.isDead then
local buff = Buff.Create(caster, BuffName.PropertyChange, 0, propertyList[pro1], f2, 2)
buff.cover = true
buff.maxLayer = i1
caster:AddBuff(buff)
end
end)
end,
--造成[a]%的[b]伤害,若为[c],则无视[d]%的防御,并造成额外[e]%伤害
--a[float],b[伤害类型,]c[职业],d[float],e[float]
[47] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local pt = args[3]
local f2 = args[4]
local f3 = args[5]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if target.professionId == pt then
BattleUtil.CalDamage(caster, target, dt, f1+f3, f2)
else
BattleUtil.CalDamage(caster, target, dt, f1)
end
end)
end,
--造成[a]*[b]%的伤害(真实伤害)
--a[属性],b[float]
[48] = function(caster, target, args, interval)
local pro = args[1]
local d = args[2]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.ApplyDamage(caster, target, floor(caster:GetRoleData(propertyList[pro]) * d))
end)
end,
--造成[a]%的[b]伤害,提升自身下个技能[c]%的伤害
--a[float],b[伤害类型],c[float]
[49] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
local OnPassiveDamaging = function(damagingFunc, defRole, damage)
damagingFunc(-floor(f2 * damage))
end
local OnSkillCast, OnSkillCastEnd
OnSkillCast = function(skill)
caster.Event:AddEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging)
caster.Event:RemoveEvent(BattleEventName.SkillCast, OnSkillCast)
end
OnSkillCastEnd = function(skill)
caster.Event:RemoveEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging)
caster.Event:RemoveEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd)
end
caster.Event:AddEvent(BattleEventName.SkillCast, OnSkillCast)
caster.Event:AddEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd)
end)
end,
--造成[a]%的[b]伤害,如果目标受到此次伤害前,生命低于最大生命[c]%,则直接击杀。
--a[float],b[伤害类型],c[float]
[50] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
casterBulletEffect(caster, target, interval)
BattleLogic.WaitForTrigger(interval, function ()
if BattleUtil.GetHPPencent(target) < f2 then
BattleUtil.ApplyDamage(caster, target, target:GetRoleData(RoleDataName.Hp))
else
BattleUtil.CalDamage(caster, target, dt, f1)
end
end)
end,
--造成[a]%的[b]伤害,增加[c]层缚灵印记,每层印记[f]改变[d]属性[e]%[i]改变[g]属性[h]%,最大[j]层0为无限
--a[float],b[伤害类型],c[int],d[属性],e[float],f[改变类型],g[属性],h[float],i[改变类型],j[int]
[51] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local i1 = args[3]
local pro1 = args[4]
local f2 = args[5]
local ct1 = args[6]
local pro2 = args[7]
local f3 = args[8]
local ct2 = args[9]
local i2 = args[10]
casterBulletEffect(caster, target, interval)
local flag = "fuling"..caster.uid
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
local changeBuff1 = Buff.Create(target, BuffName.PropertyChange, 0, propertyList[pro1], f2*i1, ct1)
changeBuff1.cover = true
changeBuff1.maxLayer = i2
local changeBuff2 = Buff.Create(target, BuffName.PropertyChange, 0, propertyList[pro2], f3*i1, ct2)
changeBuff2.cover = true
changeBuff2.maxLayer = i2
target:AddBuff(changeBuff1)
target:AddBuff(changeBuff2)
local brandBuff
brandBuff = Buff.Create(caster, BuffName.Brand, 0, flag, function ()
brandBuff.linkBuff1 = nil
brandBuff.linkBuff2 = nil
end)
brandBuff.linkBuff1 = changeBuff1
brandBuff.linkBuff2 = changeBuff2
target:AddBuff(brandBuff)
end)
end,
--造成[a]%的[b]伤害,引爆目标身上所有缚灵印记,每层造成攻击*[c]的真实伤害。
--a[float],b[伤害类型],c[float]
[52] = function(caster, target, args, interval)
local f1 = args[1]
local dt = args[2]
local f2 = args[3]
casterBulletEffect(caster, target, interval)
local flag = "fuling"..caster.uid
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(caster, target, dt, f1)
local layer, brandBuff
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Brand, function (buff)
local b = buff.flag == flag
if b then
layer = buff.layer
brandBuff = buff
end
return b
end) then
BattleUtil.ApplyDamage(caster, target, floor(caster:GetRoleData(RoleDataName.Attack) * f2 * layer))
brandBuff.disperse = true
if brandBuff.linkBuff1 then
brandBuff.linkBuff1.disperse = true
end
if brandBuff.linkBuff2 then
brandBuff.linkBuff2.disperse = true
end
end
end)
end,
--若目标生命低于最大生命的[a]%,则有[b]%概率[c],持续[d]秒
--a[float],b[float],c[控制状态],d[int]
[53] = function(caster, target, args, interval)
local f1 = args[1]
local f2 = calBuffHit(caster, target, args[2])
local ct = args[3]
local f3 = args[4]
BattleLogic.WaitForTrigger(interval, function ()
if BattleUtil.GetHPPencent(target) < f1 then
buffRandomAction(f2, caster, target, BuffName.Control, f3, ct)
end
end)
end,
--[e]改变[a]属性[b]%的[c],持续[d]秒
--a[属性],b[float],c[属性],d[int],e[改变类型]
[54] = function(caster, target, args, interval)
local pro1 = args[1]
local f1 = args[2]
local pro2 = args[3]
local f2 = args[4]
local ct = args[5]
BattleLogic.WaitForTrigger(interval, function ()
target:AddBuff(Buff.Create(caster, BuffName.PropertyChange, f2, propertyList[pro1], floor(caster:GetRoleData(propertyList[pro2]) * f1), ct))
end)
end,
--清除[a]状态
--a[清除状态]
[55] = function(caster, target, args, interval)
local ct = args[1]
BattleLogic.WaitForTrigger(interval, function ()
if ct == 1 then --持续恢复
BattleLogic.BuffMgr:ClearBuff(target, function (buff)
return buff.type == BuffName.HOT
end)
elseif ct == 2 then --护盾
BattleLogic.BuffMgr:ClearBuff(target, function (buff)
return buff.type == BuffName.Shield
end)
elseif ct == 3 then --增益状态
BattleLogic.BuffMgr:ClearBuff(target, function (buff)
return buff.isBuff == true
end)
elseif ct == 4 then --减益状态
BattleLogic.BuffMgr:ClearBuff(target, function (buff)
return buff.isDeBuff == true
end)
end
end)
end,
}
return effectList