战斗同步

back_recharge
lvxinran 2020-04-16 15:10:04 +08:00
parent 7d40e3d2fd
commit 9fb69b69bf
11 changed files with 696 additions and 432 deletions

View File

@ -270,7 +270,7 @@ function BuffManager:TurnUpdate(sort)
buff.target.Event:DispatchEvent(BattleEventName.BuffTrigger, buff)
end
elseif buff.roundInterval < 0 then
if buff.roundPass > buff.roundDuration then
if buff.roundPass >= buff.roundDuration then
buff.disperse = true
end
else
@ -280,7 +280,7 @@ function BuffManager:TurnUpdate(sort)
end
buff.target.Event:DispatchEvent(BattleEventName.BuffTrigger, buff)
end
if buff.roundPass > buff.roundDuration then
if buff.roundPass >= buff.roundDuration then
buff.disperse = true
end
end

View File

@ -1903,13 +1903,22 @@ local effectList = {
local dt = args[2]
local i1 = args[3]
local f2 = args[4]
local roleList =BattleLogic.Query(function (r) return r.camp == target.camp end)
local deadNum = 6 - #roleList
local level = math.floor(deadNum/i1)
local extra = level * f2 + 1
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
BattleLogic.WaitForTrigger(interval, function ()
local roleList =BattleLogic.Query(function (r) return r.camp == target.camp and r.isDead end, true)
local deadNum = #roleList
local level = math.floor(deadNum/i1)
local extra = (level * f2 + 1) * f1
BattleUtil.CalDamage(skill, caster, target, dt, extra)
local OnPassiveDamaging = function(damagingFunc, defRole, damage)
if damagingFunc then
damagingFunc(-floor(damage * extra))
end
end
caster.Event:AddEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging)
BattleUtil.CalDamage(skill, caster, target, dt, f1)
caster.Event:RemoveEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging)
end)
end,
@ -1919,25 +1928,23 @@ local effectList = {
[100] = function(caster, target, args, interval, skill)
local ct = args[1]
local i1 = args[2]
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
-- caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
BattleLogic.WaitForTrigger(interval, function ()
target:AddRage(i1, ct)
end)
end,
-- 造成[a]%的[b]伤害,然后对仇恨目标追加一次1技能追加的1技能不回怒气【aoe】
-- 组合技能
-- 对仇恨目标追加一次1技能追加的1技能不回怒气
-- a[float],b[伤害类型]
[101] = function(caster, target, args, interval, skill)
local f1 = args[1]
local dt = args[2]
-- caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
local i1 = args[1]
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(skill, caster, target, dt, f1)
-- 对仇恨目标追加一次技能
for i = 1, i1 do
caster:AddSkill(BattleSkillType.Normal, false, true, {{target}})
end
end)
-- 对仇恨目标追加一次技能
caster:AddSkill(BattleSkillType.Normal, false, true, {target})
end,
-- 造成[a]%的[b]伤害,如果目标数量大于[c]个,增加自身[d]点怒气(主动 + 被动167联合实现
@ -1967,7 +1974,7 @@ local effectList = {
BattleLogic.WaitForTrigger(interval, function ()
local OnBeHit = function(atkRole, damage, bCrit, finalDmg, damageType)
local arr = BattleLogic.Query(function (r) return r.camp == caster.camp end)
arr = BattleUtil.SortByProp(arr, RoleDataName.Hp, 0)
arr = BattleUtil.SortByProp(arr, RoleDataName.Hp, 1)
-- 治疗血量最低队友实际伤害的f2%
BattleUtil.ApplyTreat(caster, arr[1], floor(finalDmg*f2))
end
@ -1988,22 +1995,25 @@ local effectList = {
end)
end,
--造成[a]%的[b]伤害如目标[c]则[d]改变自身[e]%的[f]
-- a[float]b[伤害类型]c[持续伤害状态]d[改变类型]e[float]f[属性]
-- 造成[a]%的[b]伤害如目标[c]则本次技能造成伤害增加[d]%
-- a[float]b[伤害类型]c[持续伤害状态]d[float]
[105] = function(caster, target, args, interval, skill)
local f1 = args[1]
local dt = args[2]
local dot = args[3]
local ct = args[4]
local f2 = args[5]
local pro1 = args[6]
local f2 = args[4]
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
BattleLogic.WaitForTrigger(interval, function ()
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
caster:AddBuff(Buff.Create(caster, BuffName.PropertyChange, 0, propertyList[pro1], f2, ct))
local OnPassiveDamaging = function(damagingFunc, defRole, damage)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function (buff) return dot == 0 or buff.damageType == dot end) then
if damagingFunc then
damagingFunc(-floor(damage * f2))
end
end
end
caster.Event:AddEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging)
BattleUtil.CalDamage(skill, caster, target, dt, f1)
caster.Event:RemoveEvent(BattleEventName.PassiveDamaging, OnPassiveDamaging)
end)
end,
@ -2103,19 +2113,20 @@ local effectList = {
-- 造成[a]%的[b]伤害然后对仇恨目标追加一次1技能追加的1技能不回怒气技能101的弹道特效版
-- 造成[a]%的[b]伤害然后对仇恨目标追加一次1技能追加的1技能不回怒气技能101的弹道特效版(删除)
-- a[float],b[伤害类型]
[112] = function(caster, target, args, interval, skill)
local f1 = args[1]
local dt = args[2]
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
BattleLogic.WaitForTrigger(interval, function ()
BattleUtil.CalDamage(skill, caster, target, dt, f1)
end)
-- [112] = function(caster, target, args, interval, skill)
-- local f1 = args[1]
-- local dt = args[2]
-- caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
-- BattleLogic.WaitForTrigger(interval, function ()
-- BattleUtil.CalDamage(skill, caster, target, dt, f1)
-- end)
-- -- 对仇恨目标追加一次技能
-- caster:AddSkill(BattleSkillType.Normal, false, true, {{target}})
-- end,
-- 对仇恨目标追加一次技能
caster:AddSkill(BattleSkillType.Normal, false, true, {target})
end,
--造成[a]%的[b]伤害,对[c]有[d]%造成[e],持续[f]秒 技能21的弹道特效版
--a[float],b[伤害类型,]c[持续伤害状态],d[float],e[控制状态],f[int]
[113] = function(caster, target, args, interval, skill)
@ -2133,6 +2144,26 @@ local effectList = {
end
end)
end,
-- 造成[a]%的[b]伤害如目标[c]则本次技能暴击率提高[d]%
-- a[float]b[伤害类型]c[持续伤害状态]d[float]
[114] = function(caster, target, args, interval, skill)
local f1 = args[1]
local dt = args[2]
local dot = args[3]
local f2 = args[4]
caster.Event:DispatchEvent(BattleEventName.RoleViewBullet, skill, target)
BattleLogic.WaitForTrigger(interval, function ()
local index, tran
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(buff) return buff.damageType == dot end) then
index, tran = caster:AddPropertyTransfer(RoleDataName.Crit, f2, RoleDataName.Crit, 1)
end
BattleUtil.CalDamage(skill, caster, target, dt, f1)
if index and tran then
caster:RemovePropertyTransfer(index, tran)
end
end)
end,
}
return effectList

View File

@ -1509,12 +1509,13 @@ local passivityList = {
end,
-- [a]增加[b]
-- [a]增加[b], [c]改变
-- a[属性]b[float]
[90] = function(role, args)
local pro = args[1]
local f1 = args[2]
role.data:AddValue(propertyList[pro], f1)
local ct = args[3]
role.data:CountValue(propertyList[pro], f1, ct)
end,
-- 技能伤害增加[a]
@ -1528,31 +1529,33 @@ local passivityList = {
end
local OnSkillCast = function(skill)
if skill.type == BattleSkillType.Special then
role.Event:AddEvent(RoleDataName.PassiveDamaging, passivityDamaging)
role.Event:AddEvent(BattleEventName.PassiveDamaging, passivityDamaging)
end
end
local OnSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Special then
role.Event:RemoveEvent(RoleDataName.PassiveDamaging, passivityDamaging)
role.Event:RemoveEvent(BattleEventName.PassiveDamaging, passivityDamaging)
end
end
role.Event:AddEvent(RoleDataName.OnSkillCast, OnSkillCast)
role.Event:AddEvent(RoleDataName.OnSkillCastEnd, OnSkillCastEnd)
role.Event:AddEvent(BattleEventName.SkillCast, OnSkillCast)
role.Event:AddEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd)
end,
-- (直接伤害(目前没有明确定义直接伤害))击杀目标自身增加[a][b]
-- a[int]b[属性]
-- (直接伤害(目前没有明确定义直接伤害))直接伤害击杀目标自身增加[a]点怒气
-- a[int]
[92] = function(role, args)
local i1 = args[1]
local pro = args[2]
local OnKill = function(defRole)
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], i1, 1)
buff.cover = true -- 可以叠加
buff.clear = false -- 不可驱散
role:AddBuff(buff)
local OnRoleHit = function(defRole)
-- local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], i1, 1)
-- buff.cover = true -- 可以叠加
-- buff.clear = false -- 不可驱散
-- role:AddBuff(buff)
if defRole.isDead then
role:AddRage(i1, CountTypeName.Add)
end
end
role.Event:AddEvent(BattleEventName.RoleKill, OnKill)
role.Event:AddEvent(BattleEventName.RoleHit, OnRoleHit)
end,
-- 技能治疗量增加[a]
@ -1564,27 +1567,28 @@ local passivityList = {
end
local OnSkillCast = function(skill)
if skill.type == BattleSkillType.Special then
role.Event:AddEvent(RoleDataName.PassiveTreating, passiveTreating)
role.Event:AddEvent(BattleEventName.PassiveTreating, passiveTreating)
end
end
local OnSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Special then
role.Event:RemoveEvent(RoleDataName.PassiveTreating, passiveTreating)
role.Event:RemoveEvent(BattleEventName.PassiveTreating, passiveTreating)
end
end
role.Event:AddEvent(RoleDataName.OnSkillCast, OnSkillCast)
role.Event:AddEvent(RoleDataName.OnSkillCastEnd, OnSkillCastEnd)
role.Event:AddEvent(BattleEventName.SkillCast, OnSkillCast)
role.Event:AddEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd)
end,
-- 全体上阵武将增加[a][b]
-- a[float]b[属性]
-- 全体上阵武将增加[a][b] [c]改变
-- a[float]b[属性]c[改变类型]
[94] = function(role, args)
local f1 = args[1]
local pro = args[2]
local ct = args[3]
local list = BattleLogic.Query(function(v) return role.camp == v.camp end)
for _, r in pairs(list) do
role.data:AddPencentValue(propertyList[pro], f1)
r.data:CountValue(propertyList[pro], f1, ct)
end
end,
@ -1610,16 +1614,16 @@ local passivityList = {
end
local OnSkillCast = function(skill)
if skill.type == BattleSkillType.Normal then
role.Event:AddEvent(RoleDataName.PassiveDamaging, passivityDamaging)
role.Event:AddEvent(BattleEventName.PassiveDamaging, passivityDamaging)
end
end
local OnSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Normal then
role.Event:RemoveEvent(RoleDataName.PassiveDamaging, passivityDamaging)
role.Event:RemoveEvent(BattleEventName.PassiveDamaging, passivityDamaging)
end
end
role.Event:AddEvent(RoleDataName.OnSkillCast, OnSkillCast)
role.Event:AddEvent(RoleDataName.OnSkillCastEnd, OnSkillCastEnd)
role.Event:AddEvent(BattleEventName.SkillCast, OnSkillCast)
role.Event:AddEvent(BattleEventName.SkillCastEnd, OnSkillCastEnd)
end,
@ -1645,16 +1649,15 @@ local passivityList = {
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillEnd)
end,
-- 释放技能[a]概率不消耗[b]
-- a[float]b[属性]
-- 释放技能[a]概率不消耗怒气
-- a[float]
[98] = function(role, args)
local f1 = args[1]
local prop = args[2] -- 目前只是怒气
local onRageCost = function(noCostRate, costRage, func)
local finalRate = f1
local finalCost = costRage
if func then func(finalRate, finalCost) end
local dRate = f1
local dCost = 0
if func then func(dRate, dCost) end
end
role.Event:AddEvent(BattleEventName.RoleRageCost, onRageCost)
end,
@ -1666,7 +1669,7 @@ local passivityList = {
local f1 = args[1]
local OnHit = function(atkRole, damage, bCrit, finalDmg, damageType)
local arr = BattleLogic.Query(function (r) return r.camp == role.camp end)
arr = BattleUtil.SortByProp(arr, RoleDataName.Hp, 0)
arr = BattleUtil.SortByProp(arr, RoleDataName.Hp, 1)
-- 治疗血量最低队友实际伤害的f1%
BattleUtil.ApplyTreat(role, arr[1], floor(BattleUtil.ErrorCorrection(finalDmg*f1)))
end
@ -1681,9 +1684,10 @@ local passivityList = {
local f1 = args[2]
local onRageCost = function(noCostRate, costRage, func)
local finalRate = BattleUtil.CountValue(noCostRate, f1, ct)
local finalCost = costRage
if func then func(finalRate, finalCost) end
local dRate = BattleUtil.CountValue(noCostRate, f1, ct) - noCostRate
dRate = BattleUtil.ErrorCorrection(dRate)
local dCost = 0
if func then func(dRate, dCost) end
end
role.Event:AddEvent(BattleEventName.RoleRageCost, onRageCost)
end,
@ -1740,8 +1744,8 @@ local passivityList = {
-- 释放技能后
local onRoleHit = function(defRole)
if defRole.isDead then
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], CountTypeName.AddPencent, f1)
buff.cover = true
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], f1, CountTypeName.AddPencent)
-- buff.cover = true
role:AddBuff(buff)
end
end
@ -1758,7 +1762,7 @@ local passivityList = {
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Special then
local list = BattleLogic.Query(function(v) return v.camp == role.camp end)
list = BattleUtil.SortByProp(list, RoleDataName.Hp, 0)
list = BattleUtil.SortByProp(list, RoleDataName.Hp, 1)
local target = nil
for i = 1, #list do
if not list[i].isDead and list[i] ~= role then
@ -1803,7 +1807,7 @@ local passivityList = {
local onBeHit = function(caster, damage)
local list = BattleLogic.Query(function(v) return v.camp == role.camp end)
list = BattleUtil.SortByProp(list, propertyList[pro], 0)
list = BattleUtil.SortByProp(list, propertyList[pro], 1)
for i = 1, i1 do
local r = list[i]
if r and not r.isDead then
@ -1832,9 +1836,11 @@ local passivityList = {
-- a[float]
[108] = function(role, args)
local f1 = args[1]
local onBeHit = function(caster, damage)
local rDamage = floor(BattleUtil.ErrorCorrection(f1 * damage))
BattleUtil.ApplyDamage(nil, role, caster, rDamage)
local onBeHit = function(caster, damage, bCrit, finalDmg, damageType, skill)
if skill then --技能造成的直接伤害
local rDamage = floor(BattleUtil.ErrorCorrection(f1 * damage))
BattleUtil.ApplyDamage(nil, role, caster, rDamage)
end
end
role.Event:AddEvent(BattleEventName.RoleBeHit, onBeHit)
end,
@ -1858,9 +1864,11 @@ local passivityList = {
-- 释放技能后
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Special then
for i = 1, #skill.effectTargets do
local r = skill.effectTargets[i]
r:AddRage(i1, CountTypeName.Sub)
local list = skill:GetDirectTargets()
if list then
for i = 1, #list do
list[i]:AddRage(i1, CountTypeName.Sub)
end
end
end
end
@ -1888,32 +1896,38 @@ local passivityList = {
-- a[int]
[112] = function(role, args)
local i1 = args[1]
BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange, function(curRound)
local onRoleDamageBefore = function(target)
local function onRoleDamageAfter(target)
target.isFlagCrit = false
role.Event:RemoveEvent(BattleEventName.RoleDamageAfter, onRoleDamageAfter)
end
local function onRoleDamageBefore(target)
if BattleLogic.GetCurRound() == i1 then
target.isFlagCrit = true
role.Event:AddEvent(BattleEventName.RoleDamageAfter, onRoleDamageAfter)
end
local onRoleDamageAfter = function(target)
target.isFlagCrit = false
end
-- 在第 i1 回合必定暴击
if curRound == i1 then
role.Event:AddEvent(BattleEventName.RoleDamageBefore, onRoleDamageBefore)
role.Event:AddEvent(BattleEventName.onRoleDamageAfter, onRoleDamageAfter)
else
role.Event:RemoveEvent(BattleEventName.RoleDamageBefore, onRoleDamageBefore)
role.Event:RemoveEvent(BattleEventName.onRoleDamageAfter, onRoleDamageAfter)
end
end)
end
role.Event:AddEvent(BattleEventName.RoleDamageBefore, onRoleDamageBefore)
end,
--TODO
-- 追加的普攻[a]%概率暴击
-- a[float]
-- [113] = {},
[113] = function(role, args)
local f1 = args[1]
local function onSkillCast(skill)
if skill.type == BattleSkillType.Normal and skill.isAdd then
role.data:AddValue(RoleDataName.Crit, f1)
end
end
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
local function onSkillCastEnd(skill)
if skill.type == BattleSkillType.Normal and skill.isAdd then
role.data:SubValue(RoleDataName.Crit, f1)
end
end
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
end,
-- 直接伤害击杀目标后追加[a]次普攻
-- a[int]
@ -1969,16 +1983,28 @@ local passivityList = {
local ct = args[1] -- 对方阵营中死亡数量
local i1 = args[2]
local f1 = args[3]
--
local onRoleDamageBefore = function(target, func)
local roleList =BattleLogic.Query(function (r) return r.camp == target.camp and r.isDead end, true)
local deadNum = #roleList
local level = math.floor(deadNum/i1)
local extra = BattleUtil.ErrorCorrection(level * f1)
if func then func(extra) end
-- 每次释放技能时提前计算额外加成的伤害
local extra = 0
local onSkillCast = function(skill)
extra = 0
if skill and skill.type == BattleSkillType.Special then
local roleList =BattleLogic.Query(function (r) return r.camp ~= role.camp end)
local deadNum = 6 - #roleList
local level = math.floor(deadNum/i1)
extra = BattleUtil.ErrorCorrection(level * f1)
end
end
role.Event:AddEvent(BattleEventName.RoleDamageBefore, onRoleDamageBefore)
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
-- 如果是技能的伤害则判断加成
local onPassiveDamaging = function(func, target, damage, skill)
if skill and skill.type == BattleSkillType.Special then
if func then func(-floor(BattleUtil.ErrorCorrection(extra*damage))) end
end
end
role.Event:AddEvent(BattleEventName.PassiveDamaging, onPassiveDamaging)
end,
@ -2021,7 +2047,7 @@ local passivityList = {
-- 释放技能后
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Normal then
local buff = Buff.Create(role, BuffName.PropertyChange, i1, propertyList[pro], ct, f1)
local buff = Buff.Create(role, BuffName.PropertyChange, i1, propertyList[pro], f1, ct)
buff.cover = true
role:AddBuff(buff)
end
@ -2094,7 +2120,7 @@ local passivityList = {
if skill.type == BattleSkillType.Special then
local list = BattleLogic.Query(function(v) return v.camp == role.camp and v.position <= 3 end)
for _, role in ipairs(list) do
BuffManager:QueryBuff(role, function(buff)
BattleLogic.BuffMgr:QueryBuff(role, function(buff)
if buff.type == BuffName.Shield and buff.ShieldType == ShieldTypeName.RateReduce then
buff:ChangeShieldValue(ct, f1)
end
@ -2128,7 +2154,7 @@ local passivityList = {
-- 释放技能后
local onRoleHit = function(target)
if target.isDead then
local buff = Buff.Create(role, BuffName.PropertyChange, 1, propertyList[RoleDataName.Crit], CountTypeName.Add, f1)
local buff = Buff.Create(role, BuffName.PropertyChange, 1, RoleDataName.Crit, f1, CountTypeName.Add)
role:AddBuff(buff)
end
end
@ -2136,9 +2162,27 @@ local passivityList = {
end,
-- TODO
-- 战斗中自身[a]每[b]改变[c]%[d]就[e]改变[f]%
-- a[属性]b[改变类型]c[float]d[属性]e[改变类型]f[float]
[126] = {},
-- 战斗中生命每减少[c]%[d]就[e]改变[f]%
-- c[float]d[属性]e[改变类型]f[float]
[126] = function(role, args)
local f1 = args[1]
local pro = args[2]
local dt = args[3]
local f2 = args[4]
local levelDamage = floor(role:GetRoleData(RoleDataName.MaxHp)*f1)
local curDamage = 0
-- 释放技能后
local onRoleBeDamaged = function(caster, damage)
curDamage = curDamage + damage
if curDamage >= levelDamage then
curDamage = curDamage - levelDamage
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], f2, dt)
role:AddBuff(buff)
end
end
role.Event:AddEvent(BattleEventName.RoleBeDamaged, onRoleBeDamaged)
end,
-- 与48相同
@ -2151,9 +2195,11 @@ local passivityList = {
-- 普攻后
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Normal then
local list = skill.effectTargets
for _, r in ipairs(list) do
r:AddRage(i1, CountTypeName.Sub)
local list = skill:GetDirectTargets()
if list then
for _, r in ipairs(list) do
r:AddRage(i1, CountTypeName.Sub)
end
end
end
end
@ -2174,7 +2220,7 @@ local passivityList = {
-- [130] = {},
-- 敌方每[a]改变[b]人自身[c]就[d]改变[e]%
-- 敌方每[a]改变[b]人自身[c]就[d]改变[e]% (敌方每死亡i1个则自身属性改变)
-- a[改变类型]b[int]c[属性]d[改变类型]e[float]
[131] = function(role, args)
local ct1 = args[1]
@ -2190,7 +2236,7 @@ local passivityList = {
deadNum = deadNum + 1
if deadNum >= i1 then
deadNum = 0
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], ct2, f1)
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], f1, ct2)
role:AddBuff(buff)
end
end
@ -2202,7 +2248,7 @@ local passivityList = {
-- [132] = {},
-- 攻击时若目标[a]则[b][c]改变[d]%
-- 攻击时若目标[a]则当次攻击自身[b][c]改变[d]%
-- a[持续伤害状态]b[属性]c[改变类型]d[float}
[133] = function(role, args)
local dot = args[1]
@ -2210,14 +2256,20 @@ local passivityList = {
local ct = args[3]
local f1 = args[4]
local index, tran
local OnRoleDamageBefore = function(target)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(buff) return buff.damageType == dot end) then
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], ct, f1)
role:AddBuff(buff)
index, tran = role:AddPropertyTransfer(propertyList[pro], f1, propertyList[pro], ct)
end
end
BattleLogic.Event:AddEvent(BattleEventName.RoleDamageBefore, OnRoleDamageBefore)
local OnRoleDamageAfter = function()
if index and tran then
role:RemovePropertyTransfer(index, tran)
end
end
role.Event:AddEvent(BattleEventName.RoleDamageBefore, OnRoleDamageBefore)
role.Event:AddEvent(BattleEventName.RoleDamageAfter, OnRoleDamageAfter)
end,
@ -2259,15 +2311,17 @@ local passivityList = {
-- 普攻后
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Normal then
local list = skill.effectTargets
local attack = role:GetRoleData(RoleDataName.Attack)
local damage = floor(BattleUtil.ErrorCorrection(attack * 0.2))
for _, r in ipairs(list) do
BattleUtil.RandomAction(f1, function()
local buff = Buff.Create(role, BuffName.DOT, i1, 1, dot, damage)
buff.isRealDamage = true
r:AddBuff(buff)
end)
local list = skill:GetDirectTargets()
if list then
local attack = role:GetRoleData(RoleDataName.Attack)
local damage = floor(BattleUtil.ErrorCorrection(attack * 0.2))
for _, r in ipairs(list) do
BattleUtil.RandomAction(f1, function()
local buff = Buff.Create(role, BuffName.DOT, i1, 1, dot, damage)
buff.isRealDamage = true
r:AddBuff(buff)
end)
end
end
end
end
@ -2308,14 +2362,16 @@ local passivityList = {
-- 技能后后
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Special then
local list = skill.effectTargets
local tv = floor(BattleUtil.ErrorCorrection(role:GetRoleData(pro) * f1))
for _, r in ipairs(list) do
local auraBuff = Buff.Create(role, BuffName.Aura, i1, function (tr)
BattleUtil.CalTreat(tr, tr, tv)
end)
auraBuff.interval = 1
r:AddBuff(auraBuff)
local list = skill:GetDirectTargets()
if list then
local tv = floor(BattleUtil.ErrorCorrection(role:GetRoleData(pro) * f1))
for _, r in ipairs(list) do
local auraBuff = Buff.Create(role, BuffName.Aura, i1, function (tr)
BattleUtil.CalTreat(tr, tr, tv)
end)
auraBuff.interval = 1
r:AddBuff(auraBuff)
end
end
end
end
@ -2331,14 +2387,16 @@ local passivityList = {
-- 技能后后
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Normal then
local list = skill.effectTargets
local tv = floor(BattleUtil.ErrorCorrection(role:GetRoleData(pro) * f1))
for _, r in ipairs(list) do
local auraBuff = Buff.Create(role, BuffName.Aura, i1, function (tr)
BattleUtil.CalTreat(tr, tr, tv)
end)
auraBuff.interval = 1
r:AddBuff(auraBuff)
local list = skill:GetDirectTargets()
if list then
local tv = floor(BattleUtil.ErrorCorrection(role:GetRoleData(pro) * f1))
for _, r in ipairs(list) do
local auraBuff = Buff.Create(role, BuffName.Aura, i1, function (tr)
BattleUtil.CalTreat(tr, tr, tv)
end)
auraBuff.interval = 1
r:AddBuff(auraBuff)
end
end
end
end
@ -2348,7 +2406,23 @@ local passivityList = {
-- TODO
-- 释放技能后给目标附加治疗效果[a]改变[b]%
-- a[改变类型]b[float]
-- [139] = {},
[139] = function(role, args)
local dt = args[1]
local f1 = args[2]
local tFactor = function(factorFunc)
factorFunc(dt, f1)
end
role.Event:AddEvent(BattleEventName.SkillCast, function(skill)
if skill.type == BattleSkillType.Special then
role.Event:AddEvent(BattleEventName.PassiveTreatingFactor, tFactor)
end
end)
role.Event:AddEvent(BattleEventName.SkillCastEnd, function(skill)
if skill.type == BattleSkillType.Special then
role.Event:RemoveEvent(BattleEventName.PassiveTreatingFactor, tFactor)
end
end)
end,
-- 受到[a]状态敌人攻击时受到伤害[b]改变[c]%
-- a[持续伤害状态]b[改变类型]c[float]
@ -2408,7 +2482,6 @@ local passivityList = {
local onSkillControl = function(target, buff, rate, func)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(b) return b.damageType == dot end) then
if buff.type == BuffName.Control and buff.ctrlType == ctrl then
local finalRate = BattleUtil.CountValue(rate, f1, ct)
if func then func(finalRate) end
@ -2436,46 +2509,53 @@ local passivityList = {
-- [144] =
-- 技能对[a]目标[b]额外提升[c]%
-- a[持续伤害状态]b[属性]c[float]
-- 技能对[a]目标[b]额外提升[c]%(当次),[d]改变
-- a[持续伤害状态]b[属性]c[float]d[改变类型]
[145] = function(role, args)
local dot = args[1]
local pro = args[2]
local f1 = args[3]
local ct = args[4]
-- 技能后后
local onSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Special then
local list = skill.effectTargets
for _, target in ipairs(list) do
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(b) return b.damageType == dot end) then
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], f1, CountTypeName.AddPencent)
end
end
local index, tran
local OnRoleDamageBefore = function(target, factorFunc, damageType, skill)
if skill.type == BattleSkillType.Special and
BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(buff) return buff.damageType == dot end) then
index, tran = role:AddPropertyTransfer(propertyList[pro], f1, propertyList[pro], ct)
end
end
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
local OnRoleDamageAfter = function()
if index and tran then
role:RemovePropertyTransfer(index, tran)
end
end
role.Event:AddEvent(BattleEventName.RoleDamageBefore, OnRoleDamageBefore)
role.Event:AddEvent(BattleEventName.RoleDamageAfter, OnRoleDamageAfter)
end,
-- 普攻对[a]目标[b]额外提升[c]%
-- a[持续伤害状态]b[属性]c[float]
-- 普攻对[a]目标伤害额外增加[b]%(当次),[c]改变
-- a[持续伤害状态]b[float]c[改变类型]
[146] = function(role, args)
local dot = args[1]
local pro = args[2]
local f1 = args[3]
local f1 = args[2]
local ct = args[3]
-- 技能后后
local onSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Normal then
local list = skill.effectTargets
for _, target in ipairs(list) do
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(b) return b.damageType == dot end) then
local buff = Buff.Create(role, BuffName.PropertyChange, 0, propertyList[pro], f1, CountTypeName.AddPencent)
target:AddBuff(buff)
end
end
local onPassiveDamaging = function(damagingFunc, defRole, damage)
if damagingFunc then
damagingFunc(-floor(BattleUtil.FP_Mul(f1, damage)))
end
end
local onSkillCast = function(skill)
if skill.type == BattleSkillType.Special then
role.Event:AddEvent(BattleEventName.PassiveDamaging, onPassiveDamaging)
end
end
local onSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Special then
role.Event:RemoveEvent(BattleEventName.PassiveDamaging, onPassiveDamaging)
end
end
role.Event:AddEvent(BattleEventName.SkillCast, onSkillCast)
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
end,
@ -2500,10 +2580,26 @@ local passivityList = {
end,
-- TODO
-- 直接伤害击杀[a]目标回复[b]%的最大生命
-- a[持续伤害状态]b[float]
-- [148]
[148] = function(role, args)
local dot = args[1]
local f1 = args[2]
local function onHit(target)
if target.isDead then
local maxHp = role:GetRoleData(RoleDataName.MaxHp)
local value = floor(BattleUtil.ErrorCorrection(maxHp* f1))
BattleUtil.ApplyTreat(role, role, value)
end
role.Event:RemoveEvent(BattleEventName.RoleHit, onHit)
end
local onDamaging = function(func, target)
if BattleLogic.BuffMgr:HasBuff(target, BuffName.DOT, function(buff) return buff.damageType == dot end) then
role.Event:AddEvent(BattleEventName.RoleHit, onHit)
end
end
role.Event:AddEvent(BattleEventName.PassiveDamaging, onDamaging)
end,
-- TODO
@ -2529,34 +2625,54 @@ local passivityList = {
-- 技能后后
local onSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Special then
local list = skill.effectTargets
for _, r in ipairs(list) do
BattleUtil.RandomAction(f1, function()
local buff = Buff.Create(role, BuffName.Control, i1, ctrl)
r:AddBuff(buff)
end)
local targets = skill:GetDirectTargets()
if targets then
for _, r in ipairs(targets) do
BattleUtil.RandomAction(f1, function()
local buff = Buff.Create(role, BuffName.Control, i1, ctrl)
r:AddBuff(buff)
end)
end
end
end
end
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
end,
-- TODO
-- 直接伤害击杀目标回复自身[a]点怒气
-- a[int]
-- [153]
[153] = function(role, args)
local i1 = args[1]
local onHit = function(target, damage, bCrit, finalDmg)
if target.isDead then
role:AddRage(i1, CountTypeName.Add)
end
end
role.Event:AddEvent(BattleEventName.RoleHit, onHit)
end,
-- TODO
-- 复活友方第[a]位阵亡的英雄并回复其[b]%的生命每场战斗触发[c]次
-- a[int]b[float]c[int]
-- [154]
-- TODO
-- 目标[a]每[b]改变[c]%,对其[d]就[e]改变[f]%
-- a[属性]b[改变类型]c[float]d[属性]e[改变类型]f[float]
-- [155]
-- 目标血量每降低[c]%(只看当前血量),对其治疗量就[e]改变[f]%
-- c[float]e[改变类型]f[float]
[155] = function(role, args)
local f1 = args[1]
local ct = args[2]
local f2 = args[3]
local function onPassiveTreatingFactor(treatFactorFunc, targetRole)
local lf = targetRole:GetRoleData(RoleDataName.Hp)/targetRole:GetRoleData(RoleDataName.MaxHp)
local df = 1 - lf -- 血量降低百分比 = 1 - 当前血量百分比
local level = floor(df/f1)
if treatFactorFunc then
treatFactorFunc(ct, BattleUtil.ErrorCorrection(level*f2))
end
end
role.Event:AddEvent(BattleEventName.PassiveTreatingFactor, onPassiveTreatingFactor)
end,
-- 受到普攻后降低攻击自己武将的[c]点怒气
-- c[int]
@ -2564,17 +2680,26 @@ local passivityList = {
local i1 = args[1]
local onBeSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Normal then
skill.ower:AddRage(i1, CountTypeName.Sub)
skill.owner:AddRage(i1, CountTypeName.Sub)
end
end
role.Event:AddEvent(RoleDataName.BeSkillCastEnd, onBeSkillCastEnd)
role.Event:AddEvent(BattleEventName.BeSkillCastEnd, onBeSkillCastEnd)
end,
-- TODO 奸商盾
-- 减伤盾减伤比例[a]改变[b]%
-- a[改变类型]b[float]
-- [157]
[157] = function(role, args)
local ct = args[1]
local f1 = args[2]
local OnBuffCaster = function(buff)
if buff.type == BuffName.Shield and buff.shieldType == ShieldTypeName.RateReduce then
buff:ChangeShieldValue(ct, f1)
end
end
role.Event:AddEvent(BattleEventName.BuffCaster, OnBuffCaster)
end,
-- 释放技能后回复当前本方阵容最靠前武将[a]点怒气
-- a[int]
@ -2586,12 +2711,15 @@ local passivityList = {
list = table.sort(list, function(a, b)
return a.position < b.position
end)
if list[1] and list[1].isDead then
list[1]:AddRage(i1, CountTypeName.Add)
for i= 1, #list do
if list[i] and not list[i].isDead then
list[i]:AddRage(i1, CountTypeName.Add)
break
end
end
end
end
role.Event:AddEvent(RoleDataName.SkillCastEnd, onSkillCastEnd)
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
end,
@ -2611,18 +2739,18 @@ local passivityList = {
local i1 = args[3]
-- 技能后后
local onSkillCastEnd = function(skill)
local onBeSkillCastEnd = function(skill)
if skill.type == BattleSkillType.Normal then
BattleUtil.RandomAction(f1, function()
local attack = role:GetRoleData(RoleDataName.Attack)
local damage = floor(BattleUtil.ErrorCorrection(attack * f2))
local buff = Buff.Create(role, BuffName.DOT, i1, 1, dot, damage)
buff.isRealDamage = true
caster:AddBuff(buff)
skill.owner:AddBuff(buff)
end)
end
end
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillCastEnd)
role.Event:AddEvent(BattleEventName.BeSkillCastEnd, onBeSkillCastEnd)
end,
@ -2662,14 +2790,14 @@ local passivityList = {
local i2 = args[2]
-- 释放技能后
local onSkillEnd = function(skill)
if #skill.effectTargets > i1 then
local targets = skill:GetDirectTargets()
if targets and #targets > i1 then
role:AddRage(i2, 1)
end
end
role.Event:AddEvent(BattleEventName.SkillCastEnd, onSkillEnd)
end,
-- TODO 无敌吸血盾
-- 释放技能后给当前血量最少的2名队友附加无敌吸血盾持续[a]回合
-- a[int]
[168] = function(role, args)
@ -2678,10 +2806,10 @@ local passivityList = {
local onSkillEnd = function(skill)
if skill.type == BattleSkillType.Special then
local list = BattleLogic.Query(function(v) return v.camp == role.camp end)
list = BattleUtil.SortByProp(list, RoleDataName.Hp, 0)
list = BattleUtil.SortByProp(list, RoleDataName.Hp, 1)
local index = 0
for i = 1, #list do
if not list[i].isDead and list[i] ~= role and index < 2 then
if not list[i].isDead and index < 2 then
index = index + 1
-- 吸血率%25 策划说写死
list[i]:AddBuff(Buff.Create(role, BuffName.Shield, i1, ShieldTypeName.AllReduce, 0.25, 0))

View File

@ -15,9 +15,10 @@ end
function RoleData:Init(role, data)
self.role = role
for i=1, #data do
self.data[i] = BattleUtil.ErrorCorrection(data[i])
self.orginData[i] = BattleUtil.ErrorCorrection(data[i])
local max = max(#data, #self.data)
for i=1, max do
self.data[i] = BattleUtil.ErrorCorrection(data[i] or 0)
self.orginData[i] = BattleUtil.ErrorCorrection(data[i] or 0)
end
end
@ -101,6 +102,18 @@ function RoleData:SubPencentValue(name, pencent)
return 0
end
function RoleData:CountValue(name, value, ct)
if ct == 1 then
self:AddValue(name, value)
elseif ct == 2 then
self:AddPencentValue(name, value)
elseif ct == 3 then
self:SubValue(name, value)
elseif ct == 4 then
self:SubPencentValue(name, value)
end
end
--Debug
function RoleData:Foreach(func)
for k,v in ipairs(self.data) do

View File

@ -86,11 +86,35 @@ function Skill:Cast(func, targets, isAdd)
self.castDoneFunc = func
self.effectTargets = {}
self.isAdd = isAdd
-- 先计算出技能的目标
for i=1, self.effectList.size do
-- 是否重新选择目标
local isReTarget = true
if targets and targets[i] then
self.effectTargets[i] = targets[i]
-- 判断是否有有效目标
for _, role in ipairs(self.effectTargets[i]) do
if not role.isDead then
isReTarget = false
end
end
end
-- 重新选择目标
if isReTarget then
local effectGroup = self.effectList.buffer[i]
local chooseId = effectGroup.chooseId
self.effectTargets[i] = BattleUtil.ChooseTarget(self.owner, chooseId)
end
end
-- 对目标造成相应的效果
for i=1, self.effectList.size do
local effectGroup = self.effectList.buffer[i]
local chooseId = effectGroup.chooseId
local arr = targets or BattleUtil.ChooseTarget(self.owner, chooseId)
if #arr > 0 then
local arr = self.effectTargets[i]
if arr and #arr > 0 then
--效果延迟1帧生效
BattleLogic.WaitForTrigger(BattleLogic.GameDeltaTime, function()
local duration = effectGroup.duration
@ -100,111 +124,42 @@ function Skill:Cast(func, targets, isAdd)
if count == 0 then
count = #arr
end
-- 全部同时生效
for j=1, count do
if arr[j] and not arr[j].isDead then
takeEffect(self.owner, arr[j], effects, duration, self)
-- 加入目标列表
table.insert(self.effectTargets, arr[j])
end
end
-- if chooseId == 100000 or chooseId == 200000 then --10000 我方aoe 20000 敌方aoe
-- local camp = chooseId == 100000 and self.owner.camp or 1 - self.owner.camp
-- self.owner.Event:DispatchEvent(BattleEventName.AOE, camp)
-- for j=1, count do
-- takeEffect(self.owner, arr[j], effects, duration, self)
-- -- 加入目标列表
-- table.insert(self.effectTargets, arr[j])
-- end
-- elseif weight == 7 then --对位相邻的目标同时触发效果
-- for j=1, count do
-- takeEffect(self.owner, arr[j], effects, duration, self)
-- -- 加入目标列表
-- table.insert(self.effectTargets, arr[j])
-- end
-- else
-- for j = 1, count do
-- local index = j
-- local r = arr[index]
-- -- if not r or r.isDead then --当被选取的目标已经死亡或者没有,则重新选取,若重新选取的目标也死亡或者没有,则从之前的目标中选取第一个不死亡的
-- -- if not targets then -- 如果是指定目标释放的则不再选取目标
-- -- arr = BattleUtil.ChooseTarget(self.owner, chooseId)
-- -- r = arr[index]
-- -- if not r then --当没有新增的被选取目标时,可能为空
-- -- for i=1, #arr do
-- -- if not arr[i].isDead then
-- -- r = arr[i]
-- -- break
-- -- end
-- -- end
-- -- end
-- -- end
-- -- end
-- --
-- if r and not r.isDead then
-- takeEffect(self.owner, r, effects, duration, self)
-- -- 加入目标列表
-- table.insert(self.effectTargets, r)
-- end
-- end
-- end
end)
end
end
-- 计算技能CD的没有用了
-- if not self.isTeamSkill then
-- local type = BattleLogic.Type
-- local isPVEMonster = self.owner.camp == 1 and (type == 1 or type == 2 or type == 4 or type == 5 or type == 8)
-- local time = 0
-- if isPVEMonster then
-- if self.owner.superSkill == self then
-- --怪物绝技读条时间=max10-速度/8*(等级+10,2)
-- time = max(10-self.owner:GetRoleData(RoleDataName.Speed)/(8*(self.owner:GetRoleData(RoleDataName.Level)+10)), 2)
-- else
-- --怪物普技读条时间==max9-速度/8*(等级+10,1)
-- time = max(9-self.owner:GetRoleData(RoleDataName.Speed)/(8*(self.owner:GetRoleData(RoleDataName.Level)+10)), 1)
-- end
-- else
-- if self.owner.superSkill == self then
-- --绝技读条时间=max9-速度/8*(等级+10,3)
-- time = max(9-self.owner:GetRoleData(RoleDataName.Speed)/(8*(self.owner:GetRoleData(RoleDataName.Level)+10)), 3)
-- else
-- --普技读条时间=max7-速度/8*(等级+10,1.5)
-- time = max(7-self.owner:GetRoleData(RoleDataName.Speed)/(8*(self.owner:GetRoleData(RoleDataName.Level)+10)), 1.5)
-- end
-- end
-- self.owner.sp = 0
-- self.owner.spPass = floor(BattleUtil.ErrorCorrection(time) * BattleLogic.GameFrameRate)
-- else
-- self.owner.curSkill = self
-- end
--
if self.isTeamSkill then
self.owner.curSkill = self
end
-- 延时一帧执行,避免战斗还没开始就释放了技能
-- BattleLogic.WaitForTrigger(BattleLogic.GameDeltaTime, function()
self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self)
BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self)
-- end)
-- 释放技能开始
self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self)
BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self)
-- 只对效果1的目标发送事件效果1是技能的直接伤害目标
for _, tr in ipairs(self.effectTargets[1]) do
tr.Event:DispatchEvent(BattleEventName.BeSkillCast, self)
end
BattleLogic.SetSkillUsable(self.owner.camp, false)
--技能的施法时间计算根据当前目标id关联的持续时间取其中时间最长的一个
local duration = 0
for i=1, self.effectList.size do
duration = max(duration, self.effectList.buffer[i].duration)
end
BattleLogic.SetSkillUsable(self.owner.camp, false)
BattleLogic.WaitForTrigger(duration, function()
-- 结算时间向后延长0.2秒,避免在效果结算完成前就结束了技能释放
BattleLogic.WaitForTrigger(duration + 0.2, function()
BattleLogic.SetSkillUsable(self.owner.camp, true)
self.owner.Event:DispatchEvent(BattleEventName.SkillCastEnd, self)
BattleLogic.Event:DispatchEvent(BattleEventName.SkillCastEnd, self)
for _, tr in ipairs(self.effectTargets) do
-- 只对效果1的目标发送事件效果1是技能的直接伤害目标
for _, tr in ipairs(self.effectTargets[1]) do
tr.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self)
end
-- 技能结束
@ -213,17 +168,21 @@ function Skill:Cast(func, targets, isAdd)
end
-- 获取技能的直接目标,和策划规定第一个效果的目标为直接效果目标
function Skill:GetDirectTargets()
return self.effectTargets[1]
end
-- 结束技能
function Skill:EndSkill()
-- 技能后摇
-- 技能结束后摇后结束技能释放
-- if self.isAdd then
-- if self.castDoneFunc then self.castDoneFunc() end
-- else
-- 非追加技能加入技能后摇
BattleLogic.WaitForTrigger(0.5, function()
if self.castDoneFunc then self.castDoneFunc() end
end)
-- end
BattleLogic.WaitForTrigger(0.3, function()
-- 结束回调
if self.castDoneFunc then self.castDoneFunc() end
end)
--
self.effectTargets = {}
self.isAdd = nil

View File

@ -2,7 +2,7 @@ BattleLogic = {}
local floor = math.floor
local min = math.min
local objList = BattleDictionary.New()
-- local objList = BattleDictionary.New()
local removeObjList = BattleList.New()
local MaxRound = 20
@ -117,11 +117,13 @@ function BattleLogic.StartOrder()
MyTeamSkillCastIndex = 1
EnemyTeamSkillCastIndex = 1
for i=1, #fightData.playerData do
BattleLogic.AddRole(fightData.playerData[i], i)
local playerData = fightData.playerData
local enemyData = fightData.enemyData[BattleLogic.CurOrder]
for i=1, #playerData do
BattleLogic.AddRole(playerData[i], playerData[i].position)
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder] do
BattleLogic.AddRole(fightData.enemyData[BattleLogic.CurOrder][i], i)
for i=1, #enemyData do
BattleLogic.AddRole(enemyData[i], enemyData[i].position)
end
for i=1,3 do
@ -130,14 +132,14 @@ function BattleLogic.StartOrder()
playerTeamSkillList[i]=nil
end
end
for i=1, #fightData.playerData.teamSkill do
for i=1, #playerData.teamSkill do
local skill = skillPool:Get()
skill:Init(playerTeamDummyRole, fightData.playerData.teamSkill[i], 0)
skill:Init(playerTeamDummyRole, playerData.teamSkill[i], 0)
playerTeamSkillList[i] = skill
end
for i=1, #fightData.playerData.teamPassive do
for j=1, #fightData.playerData.teamPassive[i] do
local v = fightData.playerData.teamPassive[i][j]
for i=1, #playerData.teamPassive do
for j=1, #playerData.teamPassive[i] do
local v = playerData.teamPassive[i][j]
local id = v[1]
local args = {}
for k = 2, #v do
@ -153,14 +155,14 @@ function BattleLogic.StartOrder()
enemyTeamSkillList[i]=nil
end
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder].teamSkill do
for i=1, #enemyData.teamSkill do
local skill = skillPool:Get()
skill:Init(enemyTeamDummyRole, fightData.enemyData[BattleLogic.CurOrder].teamSkill[i], 0)
skill:Init(enemyTeamDummyRole, enemyData.teamSkill[i], 0)
enemyTeamSkillList[i] = skill
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive do
for j=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive[i] do
local v = fightData.enemyData[BattleLogic.CurOrder].teamPassive[i][j]
for i=1, #enemyData.teamPassive do
for j=1, #enemyData.teamPassive[i] do
local v = enemyData.teamPassive[i][j]
local id = v[1]
local args = {}
for k = 2, #v do
@ -171,22 +173,23 @@ function BattleLogic.StartOrder()
end
else
BattleLogic.ClearOrder()
for i=1, #fightData.enemyData[BattleLogic.CurOrder] do
BattleLogic.AddRole(fightData.enemyData[BattleLogic.CurOrder][i], i)
local orderList = fightData.enemyData[BattleLogic.CurOrder]
for i=1, #orderList do
BattleLogic.AddRole(orderList[i], orderList[i].position)
end
for i=1, #enemyTeamSkillList do
skillPool:Put(enemyTeamSkillList[i])
enemyTeamSkillList[i]=nil
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder].teamSkill do
for i=1, #orderList.teamSkill do
local skill = skillPool:Get()
skill:Init(enemyTeamDummyRole, fightData.enemyData[BattleLogic.CurOrder].teamSkill[i], 0)
skill:Init(enemyTeamDummyRole, orderList.teamSkill[i], 0)
enemyTeamSkillList[i] = skill
end
for i=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive do
for j=1, #fightData.enemyData[BattleLogic.CurOrder].teamPassive[i] do
local v = fightData.enemyData[BattleLogic.CurOrder].teamPassive[i][j]
for i=1, #orderList.teamPassive do
for j=1, #orderList.teamPassive[i] do
local v = orderList.teamPassive[i][j]
local id = v[1]
local args = {}
for k = 2, #v do
@ -294,9 +297,12 @@ end
-- 触发异妖被动
function BattleLogic.TakeTeamPassivity(teamCaster, id, args)
objList:Foreach(function(k, v)
for _, v in pairs(PosList) do
BattleUtil.Passivity[id](v, args)
end)
end
-- objList:Foreach(function(k, v)
-- BattleUtil.Passivity[id](v, args)
-- end)
end
-- 获取当前等待释放技能的异妖的序号
@ -369,7 +375,7 @@ function BattleLogic.AddRole(roleData, position)
curUid = curUid + 1
local role = rolePool:Get()
role:Init(curUid, roleData, position)
objList:Add(curUid, role)
-- objList:Add(curUid, role)
if roleData.camp == 0 then
PosList[position] = role -- 1-6 我方英雄
else
@ -433,10 +439,6 @@ function BattleLogic.GetTeamSkillCaster(camp)
return camp == 0 and playerTeamDummyRole or enemyTeamDummyRole
end
function BattleLogic.HasObj(obj)
return obj and objList:Get(obj.uid)
end
function BattleLogic.CurFrame()
return curFrame
end
@ -445,12 +447,18 @@ function BattleLogic.Query(func, inCludeDeadRole)
local list = {}
local index = 1
if func then
objList:Foreach(function(k, v)
for pos, v in pairs(PosList) do
if func(v) and (inCludeDeadRole or not v.isDead) then
list[index] = v
index = index + 1
end
end)
end
-- objList:Foreach(function(k, v)
-- if func(v) and (inCludeDeadRole or not v.isDead) then
-- list[index] = v
-- index = index + 1
-- end
-- end)
end
return list
end
@ -462,11 +470,17 @@ function BattleLogic.BattleEnd(result)
end
function BattleLogic.Clear()
while objList.size > 0 do
objList.vList[objList.size]:Dispose()
removeObjList:Add(objList.vList[objList.size])
objList:Remove(objList.vList[objList.size].uid)
-- while objList.size > 0 do
-- objList.vList[objList.size]:Dispose()
-- removeObjList:Add(objList.vList[objList.size])
-- objList:Remove(objList.vList[objList.size].uid)
-- end
for _, obj in pairs(PosList) do
obj:Dispose()
removeObjList:Add(obj)
end
PosList = {}
while removeObjList.size > 0 do
rolePool:Put(removeObjList.buffer[removeObjList.size])
removeObjList:Remove(removeObjList.size)
@ -478,17 +492,30 @@ function BattleLogic.Clear()
end
function BattleLogic.ClearOrder()
local index = 1
while index <= objList.size do
if objList.vList[index].camp == 1 then
BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, objList.vList[index])
objList.vList[index]:Dispose()
removeObjList:Add(objList.vList[index])
objList:Remove(objList.vList[index].uid)
else
index = index + 1
local removePos = {}
for pos, obj in pairs(PosList) do
if obj.camp == 1 then
removePos[pos] = 1
BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, obj)
obj:Dispose()
removeObjList:Add(obj)
end
end
for pos, _ in pairs(removePos) do
PosList[pos] = nil
end
-- local index = 1
-- while index <= objList.size do
-- if objList.vList[index].camp == 1 then
-- BattleLogic.Event:DispatchEvent(BattleEventName.RemoveRole, objList.vList[index])
-- objList.vList[index]:Dispose()
-- removeObjList:Add(objList.vList[index])
-- objList:Remove(objList.vList[index].uid)
-- else
-- index = index + 1
-- end
-- end
end
function BattleLogic.Update()
@ -530,7 +557,7 @@ function BattleLogic.Update()
bMyAllDead = true
bEnemyAllDead = true
objList:Foreach(function(k, v)
for _, v in pairs(PosList) do
if not v.isDead then
v:Update()
if v.camp == 0 then
@ -539,7 +566,17 @@ function BattleLogic.Update()
bEnemyAllDead = false
end
end
end)
end
-- objList:Foreach(function(k, v)
-- if not v.isDead then
-- v:Update()
-- if v.camp == 0 then
-- bMyAllDead = false
-- else
-- bEnemyAllDead = false
-- end
-- end
-- end)
if bEnemyAllDead then
BattleLogic.Event:DispatchEvent(BattleEventName.BattleOrderEnd, BattleLogic.CurOrder)
end
@ -547,32 +584,65 @@ end
--对位规则: 1敌方相同对位 2若死亡或不存在选取相邻阵位最近且阵位索引最小的
function BattleLogic.GetAggro(role)
local minNeighbor = 100
local index = 100
-- 计算开始位置
local startPos = role.position
startPos = startPos > 3 and startPos - 3 or startPos
local target
local enemyCamp = role.camp == 0 and 1 or 0
objList:Foreach(function(k, v)
if v.camp == enemyCamp and not v.isDead then
if role.position == v.position then
minNeighbor = 0
index = v.position
target = v
return "break" --终止foreach
else
local neighbor = math.abs(role.position - v.position)
if neighbor < minNeighbor then
minNeighbor = neighbor
index = v.position
target = v
elseif neighbor == minNeighbor and v.position < index then
minNeighbor = neighbor
index = v.position
target = v
end
-- 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
end)
return target
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若死亡或不存在选取相邻阵位最近且阵位索引最小的
function BattleLogic.GetArrAggroList(role, arr)
-- 重构数据
local plist = {}
for _, role in ipairs(arr) do
plist[role.position] = role
end
-- 计算开始位置
local startPos = role.position
startPos = startPos > 3 and startPos - 3 or startPos
local targetList = {}
-- c=0 前排 c=1 后排
for c = 0, 1 do
startPos = startPos + c*3
-- 向左
for i = startPos, c*3+1, -1 do
local pos = i
if plist[pos] and not plist[pos].isDead then
table.insert(targetList, plist[pos])
end
end
-- 向右
for i = startPos + 1, c*3+3 do
local pos = i
if plist[pos] and not plist[pos].isDead then
table.insert(targetList, plist[pos])
end
end
end
return targetList
end
--获取对位相邻站位的人 chooseType 1 我方 2 敌方(对位的敌人受到嘲讽的影响,若对位的敌人死亡,则选取相邻最近的作为目标)
function BattleLogic.GetNeighbor(role, chooseType)
@ -590,8 +660,12 @@ function BattleLogic.GetNeighbor(role, chooseType)
if target then
local list = BattleLogic.Query(function (r) return r.camp == target.camp end)
for i=1, #list do
if not list[i].isDead and math.abs(target.position - list[i].position) <= 1 then
table.insert(posList, list[i])
if not list[i].isDead then
if list[i].position == target.position + 3 -- 后排的人
or list[i].position == target.position - 3 -- 前排的人
or math.abs(target.position - list[i].position) <= 1 then -- 旁边的人和自己
table.insert(posList, list[i])
end
end
end
end
@ -622,18 +696,18 @@ end
-- end
--Debug专用
function BattleLogic.SetRoleValue(uid, name, value)
if objList.kvList[uid] then
objList.kvList[uid].data:SetValue(name, value)
end
end
-- function BattleLogic.SetRoleValue(uid, name, value)
-- if objList.kvList[uid] then
-- objList.kvList[uid].data:SetValue(name, value)
-- end
-- end
--Debug专用
function BattleLogic.SetRoleDebug(uid, isDebug)
if objList.kvList[uid] then
objList.kvList[uid].IsDebug = isDebug
end
end
-- --Debug专用
-- function BattleLogic.SetRoleDebug(uid, isDebug)
-- if objList.kvList[uid] then
-- objList.kvList[uid].IsDebug = isDebug
-- end
-- end
--Record专用
function BattleLogic.GetRecord()

View File

@ -13,7 +13,7 @@ end
function Control:OnStart()
if self.ctrlType == 1 then --眩晕
self.target.enable = false
self.target.ctrl_dizzy = true
elseif self.ctrlType == 2 then --沉默
self.target.ctrl_slient = true
elseif self.ctrlType == 3 then --嘲讽(包括沉默)
@ -39,7 +39,7 @@ end
function Control:OnEnd()
if self.ctrlType == 1 then --眩晕
self.target.enable = true
self.target.ctrl_dizzy = false
elseif self.ctrlType == 2 then --沉默
self.target.ctrl_slient = false
elseif self.ctrlType == 3 then --嘲讽(包括沉默)

View File

@ -6,7 +6,7 @@ function PropertyChange:SetData(...)
self.propertyName,
self.Value,
self.changeType = ...
self.cover = false --默认不可叠加
self.cover = false --默认不覆盖(可叠加
self.layer = 1
self.maxLayer = 0

View File

@ -1,5 +1,8 @@
Shield = Buff:New()
-- 无敌吸血盾的免疫状态
local immune0 = function(buff)
return buff.type == BuffName.Control or buff.isDeBuff or buff.type == BuffName.DOT
end
--初始化Buff通过传入一些自定义参数控制成长相关的数值
function Shield:SetData(...)
@ -10,6 +13,7 @@ function Shield:SetData(...)
self.isBuff = true
self.atk=nil --每次扣除护盾时,记录破盾的对象
self.cover = self.shieldType ~= ShieldTypeName.NormalReduce -- 除固定减伤盾外都不能叠加
-- 刷新排序等级
self.sort = 4
end
@ -18,6 +22,9 @@ end
function Shield:OnStart()
self.target.shield:Add(self)
if self.shieldType == ShieldTypeName.AllReduce then
self.target.buffFilter:Add(immune0)
end
end
--间隔N帧触发返回true时表示继续触发返回false立刻触发OnEnd
@ -49,10 +56,11 @@ function Shield:CountShield(damage, atkRole)
elseif self.shieldType == ShieldTypeName.AllReduce then
finalDamage = 0
--TODO 计算吸血
local treatValue = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
BattleUtil.ApplyTreat(self.target, self.target, treatValue)
--TODO 计算吸血
if self.shieldValue ~= 0 then
local treatValue = math.floor(BattleUtil.ErrorCorrection(damage * self.shieldValue))
BattleUtil.ApplyTreat(self.target, self.target, treatValue)
end
end
return finalDamage
@ -98,6 +106,13 @@ function Shield:OnEnd()
break
end
end
-- 移除免疫效果
for i = 1, self.target.buffFilter.size do
if self.target.buffFilter.buffer[i] == immune0 then
self.target.buffFilter:Remove(i)
break
end
end
end
end

View File

@ -18,7 +18,7 @@ function RoleLogic.New()
exCalDmgList=BattleList.New(),
proTranList=BattleList.New(),
buffFilter=BattleList.New(),
Event=BattleEvent:New(),passiveList={},isDead=false,IsDebug=false,enable=false}
Event=BattleEvent:New(),passiveList={},isDead=false,IsDebug=false}
setmetatable(instance, RoleLogic)
return instance
end
@ -54,11 +54,6 @@ function RoleLogic:Init(uid, data, position)
local time = self:GetRoleData(RoleDataName.Speed)/(20*(self:GetRoleData(RoleDataName.Level)+10))
self.spPass = floor( BattleUtil.ErrorCorrection(time) * BattleLogic.GameFrameRate)
-- 怒气值
self.Rage = 4 -- 当前怒气值
self.RageGrow = 2 -- 普通技能怒气成长
self.SuperSkillRage = 4 -- 技能需要释放的怒气值
self.NoRageRate = 0 -- 不消耗怒气值的概率
-- 技能释放列表 技能改为按列表顺序释放 方便添加追加技能
self.SkillList = {}
@ -80,6 +75,12 @@ function RoleLogic:Init(uid, data, position)
end
end
-- 初始化怒气值默认2
self.Rage = 2 + self:GetRoleData(RoleDataName.InitRage)-- 当前怒气值
self.RageGrow = 2 -- 普通技能怒气成长
self.SuperSkillRage = 4 -- 技能需要释放的怒气值
self.NoRageRate = 0 -- 不消耗怒气值的概率
self.aiOrder = data.ai
self.aiIndex = 1
@ -87,18 +88,18 @@ function RoleLogic:Init(uid, data, position)
self.IsDebug = false
self.enable = true --眩晕
self.ctrl_slient = false --沉默
self.lockTarget = nil --嘲讽
self.ctrl_dizzy = false --眩晕 不能释放所有技能
self.ctrl_slient = false --沉默 只能1技能
self.ctrl_palsy = false --麻痹 只能2技能
self.ctrl_noheal = false --禁疗
self.ctrl_blind = false --致盲
self.ctrl_palsy = false --麻痹
end
-- 添加一个被动技能
function RoleLogic:AddPassive(id, args, isCover)
function RoleLogic:AddPassive(id, args, isRepeat)
--判断是否可以叠加
if not isCover then
if not isRepeat then
-- 不可以叠加, 如果重复则不再加入
for _, pst in ipairs(self.passiveList) do
if pst[1] == id then
@ -161,6 +162,8 @@ function RoleLogic:AddRage(value, type)
elseif type == 4 then --乘减算(百分比属性减算)
delta = -floor(value * self.SuperSkillRage)
end
--
self.Event:DispatchEvent(BattleEventName.RoleRageChange, delta)
--怒气值不可为负值
self.Rage = max(self.Rage + delta, 0)
end
@ -193,10 +196,23 @@ function RoleLogic:AddPropertyTransfer(proA, factor, proB, ct, duration)
local proTran = {proName = proB, tranProName = proA, tranFactor = factor, changeType = ct}
self.proTranList:Add(proTran)
local index = self.proTranList.size
BattleLogic.WaitForTrigger(duration, function ()
self.proTranList:Remove(index)
end)
if duration then
BattleLogic.WaitForTrigger(duration, function ()
self:RemovePropertyTransfer(index, proTran)
end)
end
return index, proTran
end
-- 删除临时属性
function RoleLogic:RemovePropertyTransfer(index, tran)
if index <= self.proTranList.size and tran == self.proTranList.buffer[index] then
self.proTranList:Remove(index)
end
end
function RoleLogic:AddBuff(buff)
if self.isDead then
@ -228,8 +244,16 @@ end
-- 判断角色是否可以释放技能
function RoleLogic:IsAvailable()
-- 眩晕 -- 麻痹 -- 死亡
if not self.enable or self.ctrl_palsy or self.isDead then
-- 眩晕 -- 死亡
if self.ctrl_dizzy or self.isDead then
return false
end
-- 沉默麻痹同时存在
if self.ctrl_palsy and self.ctrl_slient then
return false
end
-- 麻痹同时怒气不足
if self.ctrl_palsy and self.Rage < self.SuperSkillRage then
return false
end
return true
@ -254,8 +278,8 @@ function RoleLogic:CheckCastSkill()
local _CheckNext = function ()
self:CheckCastSkill()
end
-- 释放普通攻击
if skill.type == BattleSkillType.Normal and self.skill then
-- 没有麻痹,释放普通攻击
if skill.type == BattleSkillType.Normal and not self.ctrl_palsy then
-- 释放普技
self.skill:Cast(_CheckNext, skill.targets, skill.isAdd)
-- 后成长怒气
@ -269,16 +293,21 @@ function RoleLogic:CheckCastSkill()
--
self.Rage = self.Rage + grow
end
-- 释放大技能
elseif skill.type == BattleSkillType.Special and self.superSkill then
-- 没有沉默,释放大技能
elseif skill.type == BattleSkillType.Special and not self.ctrl_slient then
-- 先消耗怒气
if skill.isRage then
if self.Rage < self.SuperSkillRage then
-- 怒气值不足不能释放技能
_CheckNext()
return
end
-- 检测被动技能对怒气消耗的影响
local costRage = self.SuperSkillRage
local noRageRate = self.NoRageRate
local _RageCostPassivity = function(finalRate, finalCost)
noRageRate = finalRate
costRage = finalCost
local _RageCostPassivity = function(rate, cost)
noRageRate = noRageRate + rate
costRage = costRage + cost
end
self.Event:DispatchEvent(BattleEventName.RoleRageCost, costRage, noRageRate, _RageCostPassivity)
-- 计算消耗怒气的概率,并消耗怒气
@ -320,28 +349,46 @@ function RoleLogic:CastSkill(func)
self.SkillList = {}
self.CurSkillCastIndex = 0
self.SkillCastDoneFunc = func
-- 沉默 怒气值不足 没有绝技 释放普通技能
if self.ctrl_slient or self.Rage < self.SuperSkillRage or not self.superSkill then
self:AddSkill(BattleSkillType.Normal, true, false, nil)
-- 没有沉默
if not self.ctrl_slient and self.Rage >= self.SuperSkillRage then
-- 释放大技能
self:AddSkill(BattleSkillType.Special, true, false, nil)
self:CheckCastSkill()
return
end
-- 没有麻痹 释放普通技能
if not self.ctrl_palsy then
self:AddSkill(BattleSkillType.Normal, true, false, nil)
self:CheckCastSkill()
return
end
-- 释放大技能 消耗怒气值
self:AddSkill(BattleSkillType.Special, true, false, nil)
self:CheckCastSkill()
end
-- 强制释放技能,追加技能时使用
-- 强制释放技能,测试技能时使用
-- type 追加的技能类型 1=普技 2=特殊技
-- targets 追加技能的目标 nil则自动选择目标
-- func 追加技能释放完成回调
function RoleLogic:ForceCastSkill(type, targets, func)
self.SkillList = {}
self.CurSkillCastIndex = 0
self.SkillCastDoneFunc = func
-- 清除技能控制
self.ctrl_dizzy = false --眩晕 不能释放技能
self.ctrl_slient = false --沉默 只能1技能
self.ctrl_palsy = false --麻痹 只能2技能
-- 释放技能
if type == 1 and self.skill then
self.skill:Cast(func)
self:AddSkill(BattleSkillType.Normal, true, false, nil)
self:CheckCastSkill()
elseif type == 2 and self.superSkill then
self.superSkill:Cast(func)
if self.Rage < self.SuperSkillRage then
self.Rage = self.SuperSkillRage
end
self:AddSkill(BattleSkillType.Special, true, false, nil)
self:CheckCastSkill()
else
if func then func() end
end
@ -358,8 +405,4 @@ function RoleLogic:SkillCastDone()
end
function RoleLogic:Update()
if not self.enable then
return
end
-- self.updateFunc()
end

View File

@ -146,7 +146,8 @@ public enum ErrorCode implements IErrorCode {
ANNOUNCE_SIZE(112,"公会宣言长度不符"),
ALREADY_LIKE(113,"今天已经给他点过赞了"),
RED_PACKAGE_NOT(114,"该红包已不存在"),
NO_FRIEND_APPLY(115,"暂无可添加好友")
NO_FRIEND_APPLY(115,"暂无可添加好友"),
NO_USE_SAME_HERO(116,"不可上阵重复英雄")
;