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) if caster.isTeam then --异妖不走效果命中公式 return baseRandom end 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 () local buff = Buff.Create(caster, BuffName.PropertyChange, f2, propertyList[pro1], f1, ct) if f2 == 0 then buff.cover = true end target:AddBuff(buff) 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.roleData.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.roleData.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.roleData.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.roleData.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 brand = Buff.Create(caster, BuffName.Brand, f3, "weak") brand.exDmg = f2 brand.coverFunc = function (oldBuff) brand.exDmg = brand.exDmg + oldBuff.exDmg end local trigger = function(atkRole, damagingFunc, damageType) BattleUtil.RandomAction(f1, function () damagingFunc(brand.exDmg) end) end target.Event:AddEvent(BattleEventName.RoleBeDamagedBefore, trigger) brand.endFunc = function () brand.exDmg = nil target.Event:RemoveEvent(BattleEventName.RoleBeDamagedBefore, trigger) end target:AddBuff(brand) 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]%的[g][h] --a[float],b[伤害类型],c[float],d[属性],e[改变类型],f[float],g[属性],h[改变类型] [44] = function(caster, target, args, interval) local f1 = args[1] local dt = args[2] local f2 = args[3] local pro1 = args[4] local ct1 = args[5] local f3 = args[6] local pro2 = args[7] local ct2 = args[8] casterBulletEffect(caster, target, interval) BattleLogic.WaitForTrigger(interval, function () local proTran1 = {proName = propertyList[pro1], tranProName = propertyList[pro1], tranFactor = f2, changeType = ct1} local proTran2 = {proName = propertyList[pro2], tranProName = propertyList[pro2], tranFactor = f3, changeType = ct2} 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.roleData.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:RemoveEvent(BattleEventName.SkillCast, OnSkillCast) caster.Event:AddEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd) caster.Event:AddEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging) end OnSkillCastEnd = function(skill) BattleLogic.WaitForTrigger(BattleLogic.GameDeltaTime, function () --延迟一帧移除事件,防止触发帧和结束帧为同一帧时,被动未移除 caster.Event:RemoveEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd) caster.Event:RemoveEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging) end) end caster.Event:AddEvent(BattleEventName.SkillCast, OnSkillCast) 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, --增加[c]层缚灵印记,每层使受到的伤害增加[d],减少[e]%的受治疗效果,最大[f]层(0为无限) --c[int],d[float],e[float],f[int] [51] = function(caster, target, args, interval) local i1 = args[1] local f2 = args[2] local f3 = args[3] local i2 = args[4] local flag = "fuling"..caster.uid BattleLogic.WaitForTrigger(interval, function () for i=1, i1 do local brand brand = Buff.Create(caster, BuffName.Brand, 0, flag) brand.exDmg = f2 brand.exHeal = f3 brand.maxLayer = i2 brand.coverFunc = function (oldBuff) if i2 == 0 or oldBuff.layer < i2 then brand.exDmg = brand.exDmg + oldBuff.exDmg brand.exHeal = brand.exHeal + oldBuff.exHeal else brand.exDmg = oldBuff.exDmg brand.exHeal = oldBuff.exHeal end end local trigger = function(atkRole, damagingFunc, damageType) damagingFunc(brand.exDmg) end local OnPassiveBeTreated = function(treatingFunc) treatingFunc(-brand.exHeal) end target.Event:AddEvent(BattleEventName.RoleBeDamagedBefore, trigger) target.Event:AddEvent(BattleEventName.PassiveBeTreated, OnPassiveBeTreated) brand.endFunc = function () brand.exDmg = nil brand.exHeal = nil target.Event:RemoveEvent(BattleEventName.RoleBeDamagedBefore, trigger) target.Event:RemoveEvent(BattleEventName.PassiveBeTreated, OnPassiveBeTreated) end target:AddBuff(brand) end 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[pro2], floor(caster:GetRoleData(propertyList[pro1]) * 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) elseif ct == 5 then --持续伤害 BattleLogic.BuffMgr:ClearBuff(target, function (buff) return buff.type == BuffName.DOT end) end end) end, --造成目标当前生命[a]%的真实伤害,为我方角色回复此技能所有由此效果带来的伤害,平均分配给我方生命最低的[b]个角色。 --a[float],b[int] [56] = function(caster, target, args, interval) local f1 = args[1] local i1 = args[2] casterBulletEffect(caster, target, interval) BattleLogic.WaitForTrigger(interval, function () local damage = BattleUtil.ApplyDamage(caster, target, floor(target:GetRoleData(RoleDataName.Hp) * f1)) local arr = BattleUtil.ChooseTarget(caster, 10110) local count = min(#arr, i1) local heal = floor(damage / count) for i=1, count do BattleUtil.CalTreat(caster, arr[i], heal) end end) end, } return effectList