955 lines
38 KiB
Lua
955 lines
38 KiB
Lua
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 |