战斗逻辑

lvxinran 2020-05-11 11:53:05 +08:00
parent 930669b6b3
commit ba0f7f91aa
10 changed files with 378 additions and 118 deletions

View File

@ -164,6 +164,23 @@ function BuffManager:QueryBuff(target, checkFunc)
end end
end end
function BuffManager:GetBuff(target, checkFunc)
local blist = {}
for i=1, self.buffDic.size do
local list = self.buffDic.vList[i]
for j=1, list.size do
local buff = list.buffer[j]
if buff.target == target then
if not checkFunc or checkFunc(buff)then
table.insert(blist, buff)
end
end
end
end
return blist
end
function BuffManager:HasBuff(target, type, checkFunc) function BuffManager:HasBuff(target, type, checkFunc)
if self.buffDic.kvList[type] then if self.buffDic.kvList[type] then
local buffList = self.buffDic.kvList[type] local buffList = self.buffDic.kvList[type]

View File

@ -2117,7 +2117,18 @@ local effectList = {
local f1 = args[1] local f1 = args[1]
local i1 = args[2] local i1 = args[2]
BattleLogic.WaitForTrigger(interval, function () BattleLogic.WaitForTrigger(interval, function ()
local buff = Buff.Create(caster, BuffName.Curse, i1, CurseTypeName.ShareDamage, f1)
local cl = {}
local function _CallBack(v, ct)
if v then
table.insert(cl, {v, ct})
end
end
caster.Event:DispatchEvent(BattleEventName.Curse_ShareDamage, _CallBack)
target.Event:DispatchEvent(BattleEventName.Be_Curse_ShareDamage, _CallBack)
local f = BattleUtil.CountChangeList(f1, cl)
local buff = Buff.Create(caster, BuffName.Curse, i1, CurseTypeName.ShareDamage, f)
target:AddBuff(buff) target:AddBuff(buff)
end) end)
end, end,

View File

@ -1127,7 +1127,7 @@ local passivityList = {
BattleLogic.WaitForTrigger(f4, function () BattleLogic.WaitForTrigger(f4, function ()
triggerUid[atkRole.uid] = atkRole.uid triggerUid[atkRole.uid] = atkRole.uid
BattleUtil.CalDamage(nil, role, atkRole, dt, f2) BattleUtil.CalDamage(nil, role, atkRole, dt, f2)
atkRole:AddBuff(Buff.Create(role, BuffName.Control, f3, ct)) BattleUtil.RandomControl(1, ct, role, atkRole, f3)
triggerUid[atkRole.uid] = nil triggerUid[atkRole.uid] = nil
end) end)
end) end)
@ -1213,7 +1213,7 @@ local passivityList = {
end end
if defRole.camp == role.camp then if defRole.camp == role.camp then
BattleUtil.CalDamage(nil, role, atkRole, dt, f1) BattleUtil.CalDamage(nil, role, atkRole, dt, f1)
atkRole:AddBuff(Buff.Create(role, BuffName.Control, f2, 1)) BattleUtil.RandomControl(1, ControlType.Dizzy, role, atkRole, f2)
end end
end) end)
end, end,
@ -1245,7 +1245,7 @@ local passivityList = {
BattleLogic.WaitForTrigger(f3, function () BattleLogic.WaitForTrigger(f3, function ()
local arr = BattleUtil.ChooseTarget(role, 20000) local arr = BattleUtil.ChooseTarget(role, 20000)
for i=1, #arr do for i=1, #arr do
arr[i]:AddBuff(Buff.Create(role, BuffName.Control, f2, 1)) BattleUtil.RandomControl(1, ControlType.Dizzy, role, arr[i], f2)
end end
end) end)
end) end)
@ -1635,16 +1635,18 @@ local passivityList = {
local dt = args[3] local dt = args[3]
-- 释放技能后 -- 释放技能后
local onSkillEnd = function(skill) local onSkillEnd = function(skill)
BattleUtil.RandomAction(f1, function() if skill and skill.type == BattleSkillType.Special then
BattleLogic.WaitForTrigger(0.1, function() BattleUtil.RandomAction(f1, function()
local list = RoleManager.Query(function(v) BattleLogic.WaitForTrigger(0.1, function()
return v.camp == (role.camp + 1) % 2 local list = RoleManager.Query(function(v)
return v.camp == (role.camp + 1) % 2
end)
for _, r in ipairs(list) do
BattleUtil.CalDamage(nil, role, r, dt, f2)
end
end) end)
for _, r in ipairs(list) do
BattleUtil.CalDamage(nil, role, r, dt, f2)
end
end) end)
end) end
end end
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillEnd) role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillEnd)
end, end,
@ -1667,15 +1669,35 @@ local passivityList = {
-- a[float] -- a[float]
[99] = function(role, args) [99] = function(role, args)
local f1 = args[1] local f1 = args[1]
local OnHit = function(atkRole, damage, bCrit, finalDmg, damageType)
local arr = RoleManager.Query(function (r) return r.camp == role.camp end) local allDamage = 0
BattleUtil.SortByHpFactor(arr, 1) local OnHit = function(atkRole, damage, bCrit, finalDmg, damageType, skill)
-- 检测技能伤害治疗加成 if skill and skill.type == BattleSkillType.Special then
local f = BattleUtil.CheckSkillDamageHeal(f1, role, arr[1]) allDamage = allDamage + finalDmg
-- 治疗血量最低队友实际伤害的f1% end
BattleUtil.ApplyTreat(role, arr[1], floor(BattleUtil.ErrorCorrection(finalDmg*f)))
end end
role.Event:AddEvent(BattleEventName.RoleHit, OnHit) local function onSkillCast(skill)
if skill.type == BattleSkillType.Special then
allDamage = 0
role.Event:AddEvent(BattleEventName.RoleHit, OnHit)
end
end
local function onSkillCastEnd(skill)
if skill.type == BattleSkillType.Special then
role.Event:RemoveEvent(BattleEventName.RoleHit, OnHit)
local arr = RoleManager.Query(function (r) return r.camp == role.camp end)
BattleUtil.SortByHpFactor(arr, 1)
-- 检测技能伤害治疗加成
local f = BattleUtil.CheckSkillDamageHeal(f1, role, arr[1])
-- 治疗血量最低队友实际伤害的f1%
BattleUtil.ApplyTreat(role, arr[1], floor(BattleUtil.ErrorCorrection(allDamage*f)))
-- 清空伤害记录
allDamage = 0
end
end
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
end, end,
@ -1849,10 +1871,10 @@ local passivityList = {
table.insert(cl, {v, ct}) table.insert(cl, {v, ct})
end end
end end
caster.Event:DispatchEvent(BattleEventName.PassiveRebackDamage, _CallBack) role.Event:DispatchEvent(BattleEventName.PassiveRebackDamage, _CallBack)
caster.Event:DispatchEvent(BattleEventName.PassiveBeRebackDamage, _CallBack)
rDamage = floor(BattleUtil.ErrorCorrection(BattleUtil.CountChangeList(rDamage, cl))) rDamage = floor(BattleUtil.ErrorCorrection(BattleUtil.CountChangeList(rDamage, cl)))
BattleUtil.ApplyDamage(nil, role, caster, rDamage) BattleUtil.ApplyDamage(nil, role, caster, rDamage)
end end
end end
@ -2117,7 +2139,6 @@ local passivityList = {
end, end,
-- TODO 减伤盾效果未添加
-- 释放技能后给己方前排武将附加减伤盾持续时间[a]改变[b]回合 -- 释放技能后给己方前排武将附加减伤盾持续时间[a]改变[b]回合
-- a[改变类型]b[int] -- a[改变类型]b[int]
[122] = function(role, args) [122] = function(role, args)
@ -2140,7 +2161,6 @@ local passivityList = {
end, end,
--TODO 减伤盾效果未添加
-- 释放技能后给己方前排附加减伤盾效果[a]改变[b]% -- 释放技能后给己方前排附加减伤盾效果[a]改变[b]%
-- a[改变类型]b[float] -- a[改变类型]b[float]
[123] = function(role, args) [123] = function(role, args)
@ -2516,7 +2536,7 @@ local passivityList = {
local dt = args[1] local dt = args[1]
local f1 = args[2] local f1 = args[2]
local tFactor = function(factorFunc) local tFactor = function(factorFunc)
factorFunc(dt, f1) factorFunc(f1, dt)
end end
role.Event:AddEvent(BattleEventName.SkillCast, function(skill) role.Event:AddEvent(BattleEventName.SkillCast, function(skill)
if skill.type == BattleSkillType.Special then if skill.type == BattleSkillType.Special then
@ -2750,14 +2770,14 @@ local passivityList = {
local onBattleRoundChange = function(func, caster) local onBattleRoundChange = function(func, caster)
attor = {} attor = {}
end end
role.Event:AddEvent(BattleEventName.BattleRoundChange, onBattleRoundChange) BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, onBattleRoundChange)
-- 被动技能加伤害 -- 被动技能加伤害
local onDamaging = function(func, target, damage, skill) local onDamaging = function(func, target, damage, skill)
if attor[target.position] and skill and func then if attor[target.position] and skill and skill.type == BattleSkillType.Special and func then
local df = f1 local df = f1
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(buff) return buff.damageType == dot end) then if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(buff) return buff.damageType == dot end) then
df = df + f2 df = f2
end end
local dd = BattleUtil.CountValue(damage, df, ct) - damage local dd = BattleUtil.CountValue(damage, df, ct) - damage
func(-floor(BattleUtil.ErrorCorrection(dd))) func(-floor(BattleUtil.ErrorCorrection(dd)))
@ -2805,10 +2825,10 @@ local passivityList = {
local f2 = args[3] local f2 = args[3]
-- --
local onRoleHit = function(defRole, damage, bCrit, finalDmg, damageType, skill) local onRoleHit = function(defRole, damage, bCrit, finalDmg, damageType, skill)
if skill and skill.type == BattleSkillType.Normal then if skill and skill.type == BattleSkillType.Normal and not skill.isAdd and not defRole:IsDead() then
if BattleLogic.BuffMgr:HasBuff(defRole, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then if BattleLogic.BuffMgr:HasBuff(defRole, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
-- 检测被动技能对秒杀参数得影响 -- 检测被动技能对秒杀参数得影响
local bf, kf = BattleUtil.CheckSeckill(f1, f2, caster, target) local bf, kf = BattleUtil.CheckSeckill(f1, f2, role, defRole)
-- --
local ft = defRole:GetRoleData(RoleDataName.Hp)/defRole:GetRoleData(RoleDataName.MaxHp) local ft = defRole:GetRoleData(RoleDataName.Hp)/defRole:GetRoleData(RoleDataName.MaxHp)
if ft < bf then if ft < bf then
@ -2887,7 +2907,7 @@ local passivityList = {
local df = 1 - lf -- 血量降低百分比 = 1 - 当前血量百分比 local df = 1 - lf -- 血量降低百分比 = 1 - 当前血量百分比
local level = floor(df/f1) local level = floor(df/f1)
if treatFactorFunc then if treatFactorFunc then
treatFactorFunc(ct, BattleUtil.ErrorCorrection(level*f2)) treatFactorFunc(BattleUtil.ErrorCorrection(level*f2), ct)
end end
end end
role.Event:AddEvent(BattleEventName.PassiveTreatingFactor, onPassiveTreatingFactor) role.Event:AddEvent(BattleEventName.PassiveTreatingFactor, onPassiveTreatingFactor)
@ -2989,7 +3009,7 @@ local passivityList = {
[161] = function(role, args) [161] = function(role, args)
local f1 = args[1] local f1 = args[1]
local function onPassiveDamaging(damagingFunc, target, damage) local function onPassiveDamaging(damagingFunc, target, damage)
local list = BattleLogic.BuffMgr:QueryBuff(target, function(buff) local list = BattleLogic.BuffMgr:GetBuff(target, function(buff)
return buff.type == BuffName.DOT or buff.type == BuffName.Control return buff.type == BuffName.DOT or buff.type == BuffName.Control
end) end)
if list and damagingFunc then if list and damagingFunc then
@ -3001,6 +3021,47 @@ local passivityList = {
role.Event:AddEvent(BattleEventName.PassiveDamaging, onPassiveDamaging) role.Event:AddEvent(BattleEventName.PassiveDamaging, onPassiveDamaging)
end, end,
-- 当敌方目标处于链接符状态(主动技能110效果时受到链接符传导效果提高[a]%
-- a[float]
[162] = function(role, args)
local f1 = args[1]
local onCurse_ShareDamage = function(func)
if func then func(f1, CountTypeName.Add) end
end
role.Event:AddEvent(BattleEventName.Curse_ShareDamage, onCurse_ShareDamage)
end,
-- 每当对方拥有链接符的目标死亡时,都会使己方输出型武将技能伤害提高[a]%[b]元素输出武将提高[c]%)
-- a[float]b[元素]c[float]
[163] = function(role, args)
local f1 = args[1]
local ele = args[2]
local f2 = args[3]
-- 死亡数量
local num = 0
local onBattleRoleDead = function(defRole)
--
if BattleLogic.BuffMgr:HasBuff(defRole, BuffName.Curse, function(buff) return buff.curseType == CurseTypeName.ShareDamage end) then
num = num + 1
end
end
BattleLogic.Event:AddEvent(BattleEventName.BattleRoleDead, onBattleRoleDead)
-- 伤害提高
local function onPassiveDamaging(damagingFunc, atkRole, defRole, damage)
if atkRole.professionId == 2 and atkRole.camp == role.camp then
-- 地元素特殊
local f = atkRole.element == ele and f2 or f1
local dd = BattleUtil.CountValue(damage, f * num, CountTypeName.AddPencent) - damage
damagingFunc(-floor(BattleUtil.ErrorCorrection(dd)))
end
end
BattleLogic.Event:AddEvent(BattleEventName.PassiveDamaging, onPassiveDamaging)
end,
-- 爆伤减免增加[a]%[b]改变 -- 爆伤减免增加[a]%[b]改变
-- a[float]b[改变类型] -- a[float]b[改变类型]
@ -3086,7 +3147,7 @@ local passivityList = {
local onSkillEnd = function(skill) local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Special then if skill.type == BattleSkillType.Special then
local list = RoleManager.Query(function(v) return v.camp == role.camp end) local list = RoleManager.Query(function(v) return v.camp == role.camp end)
BattleUtil.SortByHpFactor(list, 1) BattleUtil.SortByProp(list, RoleDataName.Hp, 1)
local index = 0 local index = 0
for i = 1, #list do for i = 1, #list do
if not list[i]:IsRealDead() and index < 2 then if not list[i]:IsRealDead() and index < 2 then
@ -3122,8 +3183,8 @@ local passivityList = {
local f1 = args[1] local f1 = args[1]
local dt = args[2] local dt = args[2]
-- 直接伤害后 -- 直接伤害后
local onRoleHit = function(target) local onRoleHit = function(target, damage, bCrit, finalDmg, damageType, skill)
if target:IsDead() then if skill and not skill.isAdd and target:IsDead() then
local list = RoleManager.Query(function(v) return v.camp ~= role.camp end) local list = RoleManager.Query(function(v) return v.camp ~= role.camp end)
BattleUtil.SortByHpFactor(list, 1) BattleUtil.SortByHpFactor(list, 1)
local index = 0 local index = 0
@ -3155,7 +3216,7 @@ local passivityList = {
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast) role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
local onPassiveRandomControl = function(func, ctrl2) local onPassiveRandomControl = function(func, ctrl2)
if ctrl == ctrl2 then if ctrl == 0 or ctrl == ctrl2 then
if func then func(af, ct) end if func then func(af, ct) end
end end
end end
@ -3179,7 +3240,7 @@ local passivityList = {
local f1 = args[1] local f1 = args[1]
local ct = args[2] local ct = args[2]
local PassiveSkillDamageHeal = function(func) local onPassiveSkillDamageHeal = function(func)
if func then func(f1, ct) end if func then func(f1, ct) end
end end
role.Event:AddEvent(BattleEventName.PassiveSkillDamageHeal, onPassiveSkillDamageHeal) role.Event:AddEvent(BattleEventName.PassiveSkillDamageHeal, onPassiveSkillDamageHeal)
@ -3228,13 +3289,13 @@ local passivityList = {
end end
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast) role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
local onPassiveShield = function(func, shieldType)
local onPassiveRandomDot = function(func, dot2) if shieldType == ShieldTypeName.RateReduce then
if dot == dot2 then
if func then func(af, ct) end if func then func(af, ct) end
end end
end end
role.Event:AddEvent(BattleEventName.PassiveRandomDot, onPassiveRandomDot) role.Event:AddEvent(BattleEventName.PassiveShield, onPassiveShield)
end, end,
-- 技能治疗效果提升[a]%, 同时为每个技能目标附加减伤盾,减伤效果[b]%,持续[c]回合 -- 技能治疗效果提升[a]%, 同时为每个技能目标附加减伤盾,减伤效果[b]%,持续[c]回合
@ -3284,12 +3345,12 @@ local passivityList = {
end end
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast) role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
local onPassiveShield = function(func, shieldType) local onPassiveRandomDot = function(func, dot2)
if shieldType == ShieldTypeName.RateReduce then if dot == dot2 then
if func then func(af, ct) end if func then func(af, ct) end
end end
end end
role.Event:AddEvent(BattleEventName.PassiveShield, onPassiveShield) role.Event:AddEvent(BattleEventName.PassiveRandomDot, onPassiveRandomDot)
end, end,
-- 对别人造成的中毒伤害的[a]%用于治疗自己 -- 对别人造成的中毒伤害的[a]%用于治疗自己
@ -3315,7 +3376,7 @@ local passivityList = {
local ct = args[3] local ct = args[3]
local onPassiveBeRandomControl = function(func, ctrl2, target) local onPassiveBeRandomControl = function(func, ctrl2, target)
if ctrl == ctrl2 then if ctrl == 0 or ctrl == ctrl2 then
if func then func(f1, ct) end if func then func(f1, ct) end
end end
end end
@ -3369,8 +3430,8 @@ local passivityList = {
local dot = args[1] local dot = args[1]
local onBuffCaster = function(buff) local onBuffCaster = function(buff)
if buff.type == BuffName.DOT and buff.dotType == dot then if buff.type == BuffName.DOT and buff.damageType == dot then
role:AddBuff(Buff.Create(role, BuffName.Control, buff.duration, ControlType.NoHeal)) BattleUtil.RandomControl(1, ControlType.NoHeal, role, buff.target, buff.duration)
end end
end end
role.Event:AddEvent(BattleEventName.BuffCaster, onBuffCaster) role.Event:AddEvent(BattleEventName.BuffCaster, onBuffCaster)
@ -3383,7 +3444,7 @@ local passivityList = {
local i1 = args[2] local i1 = args[2]
local onBuffCaster = function(buff) local onBuffCaster = function(buff)
if buff.type == BuffName.DOT and buff.dotType == dot then if buff.type == BuffName.DOT and buff.damageType == dot then
buff:ChangeBuffDuration(CountTypeName.Add, i1) buff:ChangeBuffDuration(CountTypeName.Add, i1)
end end
end end
@ -3398,13 +3459,34 @@ local passivityList = {
local onRoleHit = function(target) local onRoleHit = function(target)
if target:IsDead() then if target:IsDead() then
local target = RoleManager.GetAggro(role) local target = RoleManager.GetAliveAggro(role)
BattleUtil.CalDamage(nil, role, target, 1, f1) BattleUtil.CalDamage(nil, role, target, 1, f1)
end end
end end
role.Event:AddEvent(BattleEventName.RoleHit, onRoleHit) role.Event:AddEvent(BattleEventName.RoleHit, onRoleHit)
end, end,
-- 直接伤害击杀目标对仇恨目标追加一次造成[a]%物理伤害的技能
-- a[float]
-- [185] = function(role, args)
-- local f1 = args[1]
-- local onRoleHit = function(target)
-- if target:IsDead() then
-- local skill = {
-- role.skill[1], -- 技能id
-- {
-- 400000, -- chooseId
-- role.skill[2][2], -- 效果时间
-- {1, f1, 1} -- 效果id及参数
-- }
-- }
-- SkillManager.AddSkill(role, skill, BattleSkillType.Normal, nil, true, false)
-- end
-- end
-- role.Event:AddEvent(BattleEventName.RoleHit, onRoleHit)
-- end,
-- 攻击纵排目标时额外降低目标[a]点怒气 -- 攻击纵排目标时额外降低目标[a]点怒气
-- a[int] -- a[int]
@ -3487,8 +3569,10 @@ local passivityList = {
damagingFunc(floor(BattleUtil.ErrorCorrection(damage - (unFenDamage + fd)))) damagingFunc(floor(BattleUtil.ErrorCorrection(damage - (unFenDamage + fd))))
end end
-- 平分给别人 -- 平分给别人
for i = 2, #targets do if fd > 0 then
BattleUtil.FinalDamage(skill, atkRole, targets[i], fd, nil, 0, dotType) for i = 2, #targets do
BattleUtil.FinalDamage(skill, atkRole, targets[i], fd, nil, 0, dotType)
end
end end
end end
end end
@ -3502,13 +3586,30 @@ local passivityList = {
local dot = args[1] local dot = args[1]
local onBuffCaster = function(buff) local onBuffCaster = function(buff)
if buff.type == BuffName.DOT and buff.dotType == dot then if buff.type == BuffName.DOT and buff.damageType == dot then
role:AddBuff(Buff.Create(role, BuffName.Immune, buff.duration, 4)) buff.target:AddBuff(Buff.Create(role, BuffName.Immune, buff.duration, 3))
end end
end end
role.Event:AddEvent(BattleEventName.BuffCaster, onBuffCaster) role.Event:AddEvent(BattleEventName.BuffCaster, onBuffCaster)
end, end,
-- 所有攻击优先攻击敌方[a]最少的单位
-- a[属性]
[190] = function(role, args)
local pro = args[1]
local function onSkillTargetCheck(func)
local list = RoleManager.Query(function(r)
return r.camp == (role.camp + 1) % 2
end)
list = BattleUtil.SortByProp(list, BattlePropList[pro], 1)
if list and #list > 0 then
if func then func({list[1]}) end
end
end
role.Event:AddEvent(BattleEventName.SkillTargetCheck, onSkillTargetCheck)
end,
-- 技能直接伤害[a]%转化为生命治疗自己 -- 技能直接伤害[a]%转化为生命治疗自己
-- a[float] -- a[float]
[191] = function(role, args) [191] = function(role, args)
@ -3571,7 +3672,8 @@ local passivityList = {
if not arr then return end if not arr then return end
for i = 1, 3 do for i = 1, 3 do
if arr[i] and arr[i] == target then if arr[i] and arr[i] == target then
treatingFunc(f1, ct) local atk = role:GetRoleData(RoleDataName.Attack)
treatingFunc(atk * f1, ct)
end end
end end
end end
@ -3584,7 +3686,7 @@ local passivityList = {
[194] = function(role, args) [194] = function(role, args)
local f1 = args[1] local f1 = args[1]
local OnSkillCastEnd = function(skill) local OnRoleDamageBefore = function(defRole, factorFunc, damageType, skill)
local targets = skill:GetDirectTargets() local targets = skill:GetDirectTargets()
if not targets or #targets == 0 then return end if not targets or #targets == 0 then return end
local cf = f1/#targets local cf = f1/#targets
@ -3596,16 +3698,16 @@ local passivityList = {
end) end)
end end
end end
role.Event:AddEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd) role.Event:AddEvent(BattleEventName.RoleDamageBefore, OnRoleDamageBefore)
end, end,
-- 首回合免疫[a]效果 -- 首回合免疫[a]效果
-- a[控制状态] -- a[控制状态]
[195] = function(role, args) [195] = function(role, args)
local dot = args[1] local ctrl = args[1]
local immune = function(buff) local immune = function(buff)
return buff.type == BuffName.DOT and (dot == 0 or buff.dotType == dot) return buff.type == BuffName.Control and (ctrl == 0 or buff.ctrlType == ctrl)
end end
BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, function(curRound) BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, function(curRound)
@ -3632,21 +3734,21 @@ local passivityList = {
local onDamageBeShare = function(func) local onDamageBeShare = function(func)
if func then func(f1, CountTypeName.Sub) end if func then func(f1, CountTypeName.Sub) end
end end
role.Event:DispatchEvent(BattleEventName.PassiveDamageBeShare, onDamageBeShare) role.Event:AddEvent(BattleEventName.PassiveDamageBeShare, onDamageBeShare)
end, end,
-- 技能直接击杀敌方目标时有[a]%概率获得目标剩余所有怒气(输出武将佩戴) -- 技能直接击杀敌方目标时有[a]%概率获得目标剩余所有怒气(输出武将佩戴)
-- a[float] -- a[float]
[197] = function(role, args) [197] = function(role, args)
local f1 = args[1] local f1 = args[1]
local onRoleHit = function(target) local onRoleHit = function(target, damage, bCrit, finalDmg, damageType, skill)
if target:IsDead() then if skill and skill.type == BattleSkillType.Special and target:IsDead() then
BattleUtil.RandomAction(f1, function() BattleUtil.RandomAction(f1, function()
role:AddRage(target.rage, CountTypeName.Add) role:AddRage(target.Rage, CountTypeName.Add)
end) end)
end end
end end
role.Event:DispatchEvent(BattleEventName.RoleHit, onRoleHit) role.Event:AddEvent(BattleEventName.RoleHit, onRoleHit)
end, end,
-- 受到的[a]效果伤害降低[b]%(与减伤盾原理相同)[c]改变 -- 受到的[a]效果伤害降低[b]%(与减伤盾原理相同)[c]改变
@ -3657,13 +3759,13 @@ local passivityList = {
local ct = args[3] local ct = args[3]
-- 释放技能后 -- 释放技能后
local onPassiveDamaging = function(damagingFunc, defRole, damage, skill, dotType) local onPassiveBeDamaging = function(damagingFunc, defRole, damage, skill, dotType)
if dotType and (dotType == dot or dot == 0) then if dotType and (dotType == dot or dot == 0) then
local dd = damage - BattleUtil.CountValue(damage, f1, ct) local dd = damage - BattleUtil.CountValue(damage, f1, ct)
damagingFunc(floor(BattleUtil.ErrorCorrection(dd))) damagingFunc(floor(BattleUtil.ErrorCorrection(dd)))
end end
end end
role.Event:AddEvent(BattleEventName.PassiveDamaging, onPassiveDamaging) role.Event:AddEvent(BattleEventName.PassiveBeDamaging, onPassiveBeDamaging)
end, end,
@ -3674,18 +3776,16 @@ local passivityList = {
local f1 = args[1] local f1 = args[1]
local curDamage = 0 local curDamage = 0
local function onBattleRoundChange() local function onRoundChange()
curDamage = 0 curDamage = 0
end end
BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, onBattleRoundChange) BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, onRoundChange)
local function onFinalBeDamage(damagingFunc, atkRole, damage, skill, dotType, bCrit, damageType) local function onFinalBeDamage(damagingFunc, atkRole, damage, skill, dotType, bCrit, damageType)
local maxDamage = role:GetRoleData(RoleDataName.MaxHp) * f1 local maxDamage = role:GetRoleData(RoleDataName.MaxHp) * f1
curDamage = curDamage + damage curDamage = curDamage + damage
if curDamage < maxDamage then if curDamage > maxDamage then
if damagingFunc then damagingFunc(damage) end
else
-- 计算免除的伤害值 -- 计算免除的伤害值
local md = curDamage - maxDamage local md = curDamage - maxDamage
if md > damage then if md > damage then
@ -3699,12 +3799,32 @@ local passivityList = {
end, end,
-- 同阵营武将受到直接伤害时该伤害[a]%转移给有此锦囊的武将转移伤害属于直接伤害(无法触发任何特性)
-- a[float]
[200] = function(role, args)
local f1 = args[1]
local onFinalDamage = function(damagingFunc, atkRole, defRole, damage, skill, dotType, bCrit, damageType)
if skill and role.position ~= defRole.position and defRole.camp == role.camp and defRole.element == role.element then
local shareDamage = floor(BattleUtil.ErrorCorrection(damage * f1))
-- 被攻击武将自身伤害
if damagingFunc then
damagingFunc(shareDamage)
end
-- 分担伤害
BattleUtil.ApplyDamage(nil, atkRole, role, shareDamage)
end
end
BattleLogic.Event:AddEvent(BattleEventName.FinalDamage, onFinalDamage)
end,
-- 初始怒气增加[a]点并且目标血量低于[b]%时即有概率秒杀(对应秒杀技能) -- 初始怒气增加[a]点并且目标血量低于[b]%时即有概率秒杀(对应秒杀技能)
-- a[int]b[float] -- a[int]b[float]
[200] = function(role, args) [201] = function(role, args)
local i1 = args[1] local i1 = args[1]
local f1 = args[2] local f1 = args[2]
role.data:CountValue(RoleDataName.InitRage, i1, CountTypeName.Add) role:AddRage(i1, CountTypeName.Add)
local function onPassiveSeckill(func) local function onPassiveSeckill(func)
if func then func(f1, CountTypeName.Cover) end if func then func(f1, CountTypeName.Cover) end
@ -3714,7 +3834,7 @@ local passivityList = {
-- 秒杀概率增加[a]%直接伤害击杀的[b]目标有[c]%概率无法复活触发秒杀的目标[d]%无法复活,秒杀概率[e]改变 -- 秒杀概率增加[a]%直接伤害击杀的[b]目标有[c]%概率无法复活触发秒杀的目标[d]%无法复活,秒杀概率[e]改变
-- a[float]b[持续伤害状态]c[float]d[float]e[改变类型] -- a[float]b[持续伤害状态]c[float]d[float]e[改变类型]
[201] = function(role, args) [202] = function(role, args)
local f1 = args[1] local f1 = args[1]
local dot = args[2] local dot = args[2]
local f2 = args[3] local f2 = args[3]
@ -3730,7 +3850,7 @@ local passivityList = {
-- 直接伤害概率无法复活 -- 直接伤害概率无法复活
local function onRoleHit(target) local function onRoleHit(target)
if target:IsDead() then if target:IsDead() then
if not BattleLogic.BuffMgr:HasBuff(role, BuffName.DOT, function (buff) return buff.dotType == dot or dot == 0 end) then if not BattleLogic.BuffMgr:HasBuff(role, BuffName.DOT, function (buff) return buff.damageType == dot or dot == 0 end) then
BattleUtil.RandomAction(f2, function() BattleUtil.RandomAction(f2, function()
target:SetReliveFilter(false) target:SetReliveFilter(false)
end) end)
@ -3753,6 +3873,45 @@ local passivityList = {
-- 初始怒气增加[a]点敌方处于连接符状态的目标在回合结束时有[b]概率减少[c]点怒气
-- a[int]b[int]
[203] = function(role, args)
local i1 = args[1]
local f1 = args[2]
local i2 = args[3]
-- 初始怒气增加
role:AddRage(i1, CountTypeName.Add)
-- 死亡数量
local onRoleTurnEnd = function(target)
if not target:IsDead() and BattleLogic.BuffMgr:HasBuff(target, BuffName.Curse, function(buff) return buff.curseType == CurseTypeName.ShareDamage end) then
BattleUtil.RandomAction(f1, function()
target:AddRage(i2, CountTypeName.Sub)
end)
end
end
BattleLogic.Event:AddEvent(BattleEventName.RoleTurnEnd, onRoleTurnEnd)
end,
-- 敌方处于连接符状态的目标在获得无敌盾时有[a]%概率获取失败
-- a[float]
[204] = function(role, args)
local f1 = args[1]
-- 死亡数量
local onRoleAddBuffMiss = function(func, target, buff)
-- 无敌盾
if buff.type == BuffName.Shield and buff.shieldType == ShieldTypeName.AllReduce then
-- 有连接符
if BattleLogic.BuffMgr:HasBuff(target, BuffName.Curse, function(buff) return buff.curseType == CurseTypeName.ShareDamage end) then
-- 提高miss概率
if func then func(f1, CountTypeName.Add) end
end
end
end
BattleLogic.Event:AddEvent(BattleEventName.RoleAddBuffMiss, onRoleAddBuffMiss)
end,
-- 伤害增加[a]%[b]改变 -- 伤害增加[a]%[b]改变
-- a[float]b[改变类型] -- a[float]b[改变类型]

View File

@ -122,6 +122,13 @@ function Skill:Cast(func)
local effectGroup = self.effectList.buffer[i] local effectGroup = self.effectList.buffer[i]
local chooseId = effectGroup.chooseId local chooseId = effectGroup.chooseId
self.effectTargets[i] = BattleUtil.ChooseTarget(self.owner, chooseId) self.effectTargets[i] = BattleUtil.ChooseTarget(self.owner, chooseId)
-- 检测被动对攻击目标的影响
if i == 1 then
local function _PassiveTarget(targets)
self.effectTargets[i] = targets
end
self.owner.Event:DispatchEvent(BattleEventName.SkillTargetCheck, _PassiveTarget)
end
end end
end end

View File

@ -209,7 +209,8 @@ function BattleLogic.TurnRound(debugTurn)
end end
-- 行动 -- 行动
SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnStart) -- 开始行动 SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnStart, SkillRole) -- 开始行动
BattleLogic.Event:DispatchEvent(BattleEventName.RoleTurnStart, SkillRole) -- 开始行动
BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量 BattleLogic.BuffMgr:TurnUpdate(1) -- 计算恢复血量
BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血) BattleLogic.BuffMgr:TurnUpdate(2) -- 计算持续伤害(除去流血)
-- 释放技能后,递归交换阵营 -- 释放技能后,递归交换阵营
@ -217,7 +218,8 @@ function BattleLogic.TurnRound(debugTurn)
BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血) BattleLogic.BuffMgr:TurnUpdate(3) -- 计算持续伤害(流血)
BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff BattleLogic.BuffMgr:TurnUpdate(4) -- 计算其他buff
BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数 BattleLogic.BuffMgr:PassUpdate() -- 计算buff轮数
SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnEnd) -- 行动结束 SkillRole.Event:DispatchEvent(BattleEventName.RoleTurnEnd, SkillRole) -- 行动结束
BattleLogic.Event:DispatchEvent(BattleEventName.RoleTurnEnd, SkillRole) -- 开始行动
BattleLogic.TurnRoundNextFrame() BattleLogic.TurnRoundNextFrame()
end) end)
end end

View File

@ -11,7 +11,7 @@ function Curse:SetData(curseType, ...)
self.sort = 4 self.sort = 4
end end
-- --
function Curse:ShareDamageTrigger(atkRole, defRole, damage, skill, dotType, bCrit, damageType) function Curse:ShareDamageTrigger(damagingFunc, atkRole, defRole, damage, skill, dotType, bCrit, damageType)
if skill and defRole.camp == self.target.camp then if skill and defRole.camp == self.target.camp then
-- 没有此印记的队友收到伤害 -- 没有此印记的队友收到伤害
if not BattleLogic.BuffMgr:HasBuff(defRole, BuffName.Curse, function(buff) return buff.curseType == CurseTypeName.ShareDamage end) then if not BattleLogic.BuffMgr:HasBuff(defRole, BuffName.Curse, function(buff) return buff.curseType == CurseTypeName.ShareDamage end) then
@ -23,7 +23,9 @@ function Curse:ShareDamageTrigger(atkRole, defRole, damage, skill, dotType, bCri
-- 计算收到的伤害 -- 计算收到的伤害
local f1 = self.args[1] --平分伤害的百分比 local f1 = self.args[1] --平分伤害的百分比
local sd = math.floor(BattleUtil.ErrorCorrection(damage * f1 / #sdList)) local sd = math.floor(BattleUtil.ErrorCorrection(damage * f1 / #sdList))
BattleUtil.ApplyDamage(nil, atkRole, self.target, sd) if sd ~= 0 then
BattleUtil.ApplyDamage(nil, atkRole, self.target, sd)
end
end end
end end
end end

View File

@ -70,6 +70,7 @@ BattleEventName = {
PassiveBeRandomDot = indexAdd(), PassiveBeRandomDot = indexAdd(),
PassiveRebackDamage = indexAdd(), PassiveRebackDamage = indexAdd(),
PassiveBeRebackDamage = indexAdd(),
PassiveSkillDamageHeal = indexAdd(), PassiveSkillDamageHeal = indexAdd(),
PassiveBeSkillDamageHeal = indexAdd(), PassiveBeSkillDamageHeal = indexAdd(),
@ -90,6 +91,8 @@ BattleEventName = {
RoleViewBullet = indexAdd(), --弹道飞行击中表现 RoleViewBullet = indexAdd(), --弹道飞行击中表现
RoleAddBuffMiss = indexAdd(),
BuffCaster = indexAdd(), BuffCaster = indexAdd(),
BuffStart = indexAdd(), BuffStart = indexAdd(),
BuffDodge = indexAdd(), BuffDodge = indexAdd(),
@ -102,8 +105,12 @@ BattleEventName = {
ShildValueChange = indexAdd(), ShildValueChange = indexAdd(),
Curse_ShareDamage = indexAdd(),
Be_Curse_ShareDamage = indexAdd(),
SkillTargetCheck = indexAdd(),
DebugStop = indexAdd(), DebugStop = indexAdd(),
} }

View File

@ -289,14 +289,18 @@ function BattleUtil.Seckill(skill, atkRole, defRole)
atkRole.Event:DispatchEvent(BattleEventName.RoleKill, defRole) atkRole.Event:DispatchEvent(BattleEventName.RoleKill, defRole)
BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoleDead, defRole, atkRole) BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoleDead, defRole, atkRole)
atkRole.Event:DispatchEvent(BattleEventName.SecKill, defRole) atkRole.Event:DispatchEvent(BattleEventName.Seckill, defRole)
defRole.Event:DispatchEvent(BattleEventName.BeSecKill, atkRole) defRole.Event:DispatchEvent(BattleEventName.BeSeckill, atkRole)
BattleLogic.Event:DispatchEvent(BattleEventName.SecKill, atkRole, defRole) BattleLogic.Event:DispatchEvent(BattleEventName.Seckill, atkRole, defRole)
end end
atkRole.Event:DispatchEvent(BattleEventName.RoleDamage, defRole, damage, false, finalDmg, 0, false, skill) atkRole.Event:DispatchEvent(BattleEventName.RoleDamage, defRole, damage, false, finalDmg, 0, false, skill)
defRole.Event:DispatchEvent(BattleEventName.RoleBeDamaged, atkRole, damage, false, finalDmg, 0, false, skill) defRole.Event:DispatchEvent(BattleEventName.RoleBeDamaged, atkRole, damage, false, finalDmg, 0, false, skill)
BattleLogic.Event:DispatchEvent(BattleEventName.RoleDamage, atkRole, defRole, damage, false, finalDmg, 0, false, skill) BattleLogic.Event:DispatchEvent(BattleEventName.RoleDamage, atkRole, defRole, damage, false, finalDmg, 0, false, skill)
BattleLogic.Event:DispatchEvent(BattleEventName.RoleBeDamaged, defRole, atkRole, damage, false, finalDmg, 0, false, skill) BattleLogic.Event:DispatchEvent(BattleEventName.RoleBeDamaged, defRole, atkRole, damage, false, finalDmg, 0, false, skill)
if skill then
atkRole.Event:DispatchEvent(BattleEventName.RoleHit, defRole, damage, nil, finalDmg, nil, skill)
defRole.Event:DispatchEvent(BattleEventName.RoleBeHit, atkRole, damage, nil, finalDmg, nil, skill)
end
end end
end end
@ -321,6 +325,7 @@ function BattleUtil.ApplyDamage(skill, atkRole, defRole, damage, bCrit, damageTy
end end
atkRole.Event:DispatchEvent(BattleEventName.PassiveDamaging, damagingFunc, defRole, damage, skill, dotType, bCrit) atkRole.Event:DispatchEvent(BattleEventName.PassiveDamaging, damagingFunc, defRole, damage, skill, dotType, bCrit)
defRole.Event:DispatchEvent(BattleEventName.PassiveBeDamaging, damagingFunc, atkRole, damage, skill, dotType, bCrit) defRole.Event:DispatchEvent(BattleEventName.PassiveBeDamaging, damagingFunc, atkRole, damage, skill, dotType, bCrit)
BattleLogic.Event:DispatchEvent(BattleEventName.PassiveDamaging, damagingFunc, atkRole, defRole, damage, skill, dotType, bCrit)
-- 计算护盾减伤 -- 计算护盾减伤
damage = BattleUtil.CalShield(atkRole, defRole, damage) damage = BattleUtil.CalShield(atkRole, defRole, damage)
@ -332,40 +337,37 @@ function BattleUtil.ApplyDamage(skill, atkRole, defRole, damage, bCrit, damageTy
end end
atkRole.Event:DispatchEvent(BattleEventName.FinalDamage, damagingFunc, defRole, damage, skill, dotType, bCrit, damageType) atkRole.Event:DispatchEvent(BattleEventName.FinalDamage, damagingFunc, defRole, damage, skill, dotType, bCrit, damageType)
defRole.Event:DispatchEvent(BattleEventName.FinalBeDamage, damagingFunc, atkRole, damage, skill, dotType, bCrit, damageType) defRole.Event:DispatchEvent(BattleEventName.FinalBeDamage, damagingFunc, atkRole, damage, skill, dotType, bCrit, damageType)
BattleLogic.Event:DispatchEvent(BattleEventName.FinalDamage, atkRole, defRole, damage, skill, dotType, bCrit, damageType) BattleLogic.Event:DispatchEvent(BattleEventName.FinalDamage, damagingFunc, atkRole, defRole, damage, skill, dotType, bCrit, damageType)
-- --
return BattleUtil.FinalDamage(skill, atkRole, defRole, damage, bCrit, damageType, dotType) return BattleUtil.FinalDamage(skill, atkRole, defRole, damage, bCrit, damageType, dotType)
end end
function BattleUtil.FinalDamage(skill, atkRole, defRole, damage, bCrit, damageType, dotType) function BattleUtil.FinalDamage(skill, atkRole, defRole, damage, bCrit, damageType, dotType)
if damage >= 0 then if damage < 0 then damage = 0 end
local finalDmg = defRole.data:SubValue(RoleDataName.Hp, damage) local finalDmg = defRole.data:SubValue(RoleDataName.Hp, damage)
if finalDmg >= 0 then if finalDmg >= 0 then
if defRole:GetRoleData(RoleDataName.Hp) <= 0 and not defRole:IsDead() then if defRole:GetRoleData(RoleDataName.Hp) <= 0 and not defRole:IsDead() then
defRole:SetDead() defRole:SetDead()
defRole.Event:DispatchEvent(BattleEventName.RoleDead, atkRole) defRole.Event:DispatchEvent(BattleEventName.RoleDead, atkRole)
atkRole.Event:DispatchEvent(BattleEventName.RoleKill, defRole) atkRole.Event:DispatchEvent(BattleEventName.RoleKill, defRole)
BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoleDead, defRole, atkRole) BattleLogic.Event:DispatchEvent(BattleEventName.BattleRoleDead, defRole, atkRole)
end end
atkRole.Event:DispatchEvent(BattleEventName.RoleDamage, defRole, damage, bCrit, finalDmg, damageType, dotType, skill) atkRole.Event:DispatchEvent(BattleEventName.RoleDamage, defRole, damage, bCrit, finalDmg, damageType, dotType, skill)
defRole.Event:DispatchEvent(BattleEventName.RoleBeDamaged, atkRole, damage, bCrit, finalDmg, damageType, dotType, skill) defRole.Event:DispatchEvent(BattleEventName.RoleBeDamaged, atkRole, damage, bCrit, finalDmg, damageType, dotType, skill)
BattleLogic.Event:DispatchEvent(BattleEventName.RoleDamage, atkRole, defRole, damage, bCrit, finalDmg, damageType, dotType, skill) BattleLogic.Event:DispatchEvent(BattleEventName.RoleDamage, atkRole, defRole, damage, bCrit, finalDmg, damageType, dotType, skill)
BattleLogic.Event:DispatchEvent(BattleEventName.RoleBeDamaged, defRole, atkRole, damage, bCrit, finalDmg, damageType, dotType, skill) BattleLogic.Event:DispatchEvent(BattleEventName.RoleBeDamaged, defRole, atkRole, damage, bCrit, finalDmg, damageType, dotType, skill)
if bCrit then if bCrit then
atkRole.Event:DispatchEvent(BattleEventName.RoleCrit, defRole, damage, bCrit, finalDmg, damageType, skill) atkRole.Event:DispatchEvent(BattleEventName.RoleCrit, defRole, damage, bCrit, finalDmg, damageType, skill)
defRole.Event:DispatchEvent(BattleEventName.RoleBeCrit, atkRole, damage, bCrit, finalDmg, damageType, skill) defRole.Event:DispatchEvent(BattleEventName.RoleBeCrit, atkRole, damage, bCrit, finalDmg, damageType, skill)
end end
if not dotType then if skill then
atkRole.Event:DispatchEvent(BattleEventName.RoleHit, defRole, damage, bCrit, finalDmg, damageType, skill) atkRole.Event:DispatchEvent(BattleEventName.RoleHit, defRole, damage, bCrit, finalDmg, damageType, skill)
defRole.Event:DispatchEvent(BattleEventName.RoleBeHit, atkRole, damage, bCrit, finalDmg, damageType, skill) defRole.Event:DispatchEvent(BattleEventName.RoleBeHit, atkRole, damage, bCrit, finalDmg, damageType, skill)
end
end end
return finalDmg
else
return damage
end end
return finalDmg
end end
--执行完整的命中,伤害,暴击计算,返回命中,暴击 --执行完整的命中,伤害,暴击计算,返回命中,暴击
@ -483,7 +485,7 @@ function BattleUtil.ApplyTreat(castRole, targetRole, value, baseFactor)
local hp = targetRole:GetRoleData(RoleDataName.Hp) local hp = targetRole:GetRoleData(RoleDataName.Hp)
-- 计算被动对治疗系数的影响 -- 计算被动对治疗系数的影响
local treatFactorFunc = function(dt, df) local treatFactorFunc = function(df, dt)
baseFactor = BattleUtil.CountValue(baseFactor, df, dt) baseFactor = BattleUtil.CountValue(baseFactor, df, dt)
end end
castRole.Event:DispatchEvent(BattleEventName.PassiveTreatingFactor, treatFactorFunc, targetRole) castRole.Event:DispatchEvent(BattleEventName.PassiveTreatingFactor, treatFactorFunc, targetRole)
@ -491,7 +493,7 @@ function BattleUtil.ApplyTreat(castRole, targetRole, value, baseFactor)
local factor = castRole.isTeam and 1 or castRole:GetRoleData(RoleDataName.TreatFacter) --释放者为team则不计算治疗加成属性 local factor = castRole.isTeam and 1 or castRole:GetRoleData(RoleDataName.TreatFacter) --释放者为team则不计算治疗加成属性
local factor2 = targetRole:GetRoleData(RoleDataName.CureFacter) local factor2 = targetRole:GetRoleData(RoleDataName.CureFacter)
local baseTreat = floor(BattleUtil.FP_Mul(value, baseFactor, factor, factor2) + 0.5) local baseTreat = BattleUtil.FP_Mul(value, baseFactor, factor, factor2)
--加入被动效果 --加入被动效果
local cl = {} local cl = {}
@ -506,7 +508,8 @@ function BattleUtil.ApplyTreat(castRole, targetRole, value, baseFactor)
baseTreat = BattleUtil.CountChangeList(baseTreat, cl) baseTreat = BattleUtil.CountChangeList(baseTreat, cl)
-- 取整
local baseTreat = floor(baseTreat + 0.5)
local treat = min(baseTreat, maxHp - hp) local treat = min(baseTreat, maxHp - hp)
if treat > 0 then if treat > 0 then

View File

@ -1,4 +1,3 @@
RoleLogic = {} RoleLogic = {}
RoleLogic.__index = RoleLogic RoleLogic.__index = RoleLogic
--local RoleLogic = RoleLogic --local RoleLogic = RoleLogic
@ -36,6 +35,7 @@ function RoleLogic:Init(uid, data, position)
self.camp = data.camp --阵营 0我方 1敌方 self.camp = data.camp --阵营 0我方 1敌方
self.name = data.name self.name = data.name
self.element = data.element self.element = data.element
self.professionId = data.professionId
self.shield:Clear() --护盾列表 self.shield:Clear() --护盾列表
self.exCalDmgList:Clear() --额外计算伤害列表 self.exCalDmgList:Clear() --额外计算伤害列表
@ -54,7 +54,7 @@ function RoleLogic:Init(uid, data, position)
-- 初始化怒气值默认2 -- 初始化怒气值默认2
self.Rage = 2 + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值 self.Rage = 2
self.RageGrow = 2 -- 普通技能怒气成长 self.RageGrow = 2 -- 普通技能怒气成长
self.SuperSkillRage = 4 -- 技能需要释放的怒气值默认为4 self.SuperSkillRage = 4 -- 技能需要释放的怒气值默认为4
self.NoRageRate = 0 -- 不消耗怒气值的概率 self.NoRageRate = 0 -- 不消耗怒气值的概率
@ -79,6 +79,10 @@ function RoleLogic:Init(uid, data, position)
end end
end end
-- 初始怒气值放在被动之后计算,使被动对初始怒气的影响生效
self.Rage = self.Rage + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值
--
self.aiOrder = data.ai self.aiOrder = data.ai
self.aiIndex = 1 self.aiIndex = 1
self.aiTempCount = 0 self.aiTempCount = 0
@ -221,13 +225,28 @@ function RoleLogic:AddBuff(buff)
BattleLogic.BuffMgr:PutBuff(buff) BattleLogic.BuffMgr:PutBuff(buff)
return return
end end
for i=1, self.buffFilter.size do -- buff的miss率
if self.buffFilter.buffer[i](buff) then local missF = 0
BattleLogic.BuffMgr:PutBuff(buff) -- 检测被动对miss概率的影响
return local cl = {}
local function _CallBack(v, ct)
if v then
table.insert(cl, {v, ct})
end end
end end
BattleLogic.BuffMgr:AddBuff(self, buff) BattleLogic.Event:DispatchEvent(BattleEventName.RoleAddBuffMiss, _CallBack, self, buff)
missF = BattleUtil.CountChangeList(missF, cl)
-- 如果概率为0 或者没有miss
if missF == 0 or not BattleUtil.RandomAction(missF, function() BattleLogic.BuffMgr:PutBuff(buff) end) then
for i=1, self.buffFilter.size do
if self.buffFilter.buffer[i](buff) then
BattleLogic.BuffMgr:PutBuff(buff)
return
end
end
BattleLogic.BuffMgr:AddBuff(self, buff)
end
end end
function RoleLogic:Dispose() function RoleLogic:Dispose()
@ -401,6 +420,8 @@ end
function RoleLogic:GoDead() function RoleLogic:GoDead()
if self:IsCanDead() then if self:IsCanDead() then
self.isRealDead = true self.isRealDead = true
self.Rage = 0
BattleLogic.BuffMgr:ClearBuff(self)
self.Event:DispatchEvent(BattleEventName.RoleRealDead, self) self.Event:DispatchEvent(BattleEventName.RoleRealDead, self)
BattleLogic.Event:DispatchEvent(BattleEventName.RoleRealDead, self) BattleLogic.Event:DispatchEvent(BattleEventName.RoleRealDead, self)
return true return true
@ -415,7 +436,6 @@ end
-- 要死了 -- 要死了
function RoleLogic:SetDead() function RoleLogic:SetDead()
self.isDead = true self.isDead = true
BattleLogic.BuffMgr:ClearBuff(self)
RoleManager.AddDeadRole(self) RoleManager.AddDeadRole(self)
end end
-- 判断是否死亡 -- 判断是否死亡

View File

@ -184,6 +184,38 @@ function this.GetAggro(role)
if target then return target end if target then return target end
end end
end end
-- 获取没有进入死亡状态的仇恨目标
function this.GetAliveAggro(role)
-- 计算开始位置
local startPos = role.position
startPos = startPos > 3 and startPos - 3 or startPos
local target
local enemyCamp = role.camp == 0 and 1 or 0
-- c=0 前排 c=1 后排
for c = 0, 1 do
startPos = startPos + c*3
-- 向左
for i = startPos, c*3+1, -1 do
local pos = i + enemyCamp * 6
if PosList[pos] and not PosList[pos]:IsDead() then
target = PosList[pos]
break
end
end
if target then return target end
-- 向右
for i = startPos + 1, c*3+3 do
local pos = i + enemyCamp * 6
if PosList[pos] and not PosList[pos]:IsDead() then
target = PosList[pos]
break
end
end
if target then return target end
end
end
--对位规则: 1敌方相同对位 2若死亡或不存在选取相邻阵位最近且阵位索引最小的 --对位规则: 1敌方相同对位 2若死亡或不存在选取相邻阵位最近且阵位索引最小的
function this.GetArrAggroList(role, arr) function this.GetArrAggroList(role, arr)
-- 重构数据 -- 重构数据