2020-10-29 16:36:10 +08:00
|
|
|
|
local Effect = require("Modules/Battle/Logic/Base/Effect")
|
|
|
|
|
EffectCaster = {}
|
|
|
|
|
|
|
|
|
|
local effectPool = BattleObjectPool.New(function ()
|
|
|
|
|
return { type = 0, args = {}} -- type, {args, ...}
|
|
|
|
|
end)
|
|
|
|
|
local effectGroupPool = BattleObjectPool.New(function ()
|
|
|
|
|
return { chooseId = 0, effects = {}} -- chooseId, {effect1, effect2, ...}
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
function EffectCaster:New()
|
|
|
|
|
local o = {}
|
|
|
|
|
setmetatable(o, {__index = self})
|
|
|
|
|
return o
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EffectCaster:Init(skill, effects, targets)
|
|
|
|
|
self.skill = skill
|
|
|
|
|
self.targets = targets or {}
|
|
|
|
|
self.effectList = {}
|
|
|
|
|
for i=1, #effects do
|
|
|
|
|
local v = effects[i]
|
|
|
|
|
local effectGroup = effectGroupPool:Get() -- chooseId, {effect1, effect2, ...}
|
|
|
|
|
effectGroup.chooseId = v[1] -- chooseId
|
|
|
|
|
for j=2, #v do -- effectList
|
|
|
|
|
local effect = effectPool:Get() -- type, {args, ...}
|
|
|
|
|
effect.type = v[j][1]
|
|
|
|
|
for k=2, #v[j] do
|
|
|
|
|
effect.args[k-1] = v[j][k]
|
|
|
|
|
end
|
|
|
|
|
effectGroup.effects[j-1] = effect
|
|
|
|
|
end
|
|
|
|
|
table.insert(self.effectList, effectGroup)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function EffectCaster:DoEffect(caster, target, eff, duration, skill)
|
|
|
|
|
local e = {type = 0, args = {}}
|
|
|
|
|
e.type = eff.type
|
|
|
|
|
for i=1, #eff.args do
|
|
|
|
|
e.args[i] = eff.args[i]
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><><EFBFBD>ⱻ<EFBFBD><E2B1BB><EFBFBD><EFBFBD><EFBFBD>ܶԼ<DCB6><D4BC>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
local function _PassiveCheck(pe)
|
|
|
|
|
if pe then
|
|
|
|
|
e = pe
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
caster.Event:DispatchEvent(BattleEventName.SkillEffectBefore, skill, e, _PassiveCheck)
|
|
|
|
|
target.Event:DispatchEvent(BattleEventName.BeSkillEffectBefore, skill, e, _PassiveCheck)
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
if Effect[e.type] then
|
|
|
|
|
Effect[e.type](caster, target, e.args, duration, skill)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function EffectCaster:takeEffect(caster, target, effects, effectIndex, duration, skill)
|
|
|
|
|
for k=1, #effects do
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>еĵ<D0B5>һ<EFBFBD><D2BB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
if k ~= 1 and effectIndex == 1 then
|
|
|
|
|
if self:CheckTargetIsHit(target) then
|
|
|
|
|
self:DoEffect(caster, target, effects[k], duration, skill)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
self:DoEffect(caster, target, effects[k], duration, skill)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function EffectCaster:ChooseTarget()
|
|
|
|
|
--
|
|
|
|
|
self.effectTargets = {}
|
|
|
|
|
self.targetIsHit = {}
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD>Ŀ<EFBFBD><C4BF>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
for i=1, #self.effectList do
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>Ŀ<EFBFBD><C4BF>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
local isReTarget = true
|
|
|
|
|
if self.targets and self.targets[i] then
|
|
|
|
|
self.effectTargets[i] = self.targets[i]
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ЧĿ<D0A7><C4BF>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
for _, role in ipairs(self.effectTargets[i]) do
|
|
|
|
|
if not role:IsRealDead() then
|
|
|
|
|
isReTarget = false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>Ŀ<EFBFBD><C4BF>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
if isReTarget then
|
|
|
|
|
local effectGroup = self.effectList[i]
|
|
|
|
|
local chooseId = effectGroup.chooseId
|
|
|
|
|
self.effectTargets[i] = BattleUtil.ChooseTarget(self.skill.owner, chooseId)
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><><EFBFBD>ⱻ<EFBFBD><E2B1BB><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
if i == 1 then
|
|
|
|
|
local function _PassiveTarget(targets)
|
|
|
|
|
self.effectTargets[i] = targets
|
|
|
|
|
end
|
|
|
|
|
self.skill.owner.Event:DispatchEvent(BattleEventName.SkillTargetCheck, _PassiveTarget)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20>ͷż<CDB7><C5BC><EFBFBD>
|
|
|
|
|
-- func <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>ɻص<C9BB>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:Cast()
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- ѡ<><D1A1>Ŀ<EFBFBD><C4BF>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
self:ChooseTarget()
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>Ч<EFBFBD><D0A7>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
for i=1, #self.effectList do
|
|
|
|
|
local effectGroup = self.effectList[i]
|
|
|
|
|
local chooseId = effectGroup.chooseId
|
|
|
|
|
local arr = self.effectTargets[i]
|
|
|
|
|
if arr and #arr > 0 then
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- Ч<><D0A7><EFBFBD>ӳ<EFBFBD>1֡<31><D6A1>Ч
|
2020-10-29 16:36:10 +08:00
|
|
|
|
BattleLogic.WaitForTrigger(BattleLogic.GameDeltaTime, function()
|
|
|
|
|
local effects = effectGroup.effects
|
|
|
|
|
local weight = math.floor(chooseId % 10000 / 100)
|
|
|
|
|
local count = math.min(chooseId % 10, #arr)
|
|
|
|
|
if count == 0 then
|
|
|
|
|
count = #arr
|
|
|
|
|
end
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- ȫ<><C8AB>ͬʱ<CDAC><CAB1>Ч
|
2020-10-29 16:36:10 +08:00
|
|
|
|
for j=1, count do
|
|
|
|
|
if arr[j] and not arr[j]:IsRealDead() then
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
if i == 1 then
|
|
|
|
|
self.targetIsHit[arr[j]] = BattleUtil.CheckIsHit(self.skill.owner, arr[j])
|
|
|
|
|
end
|
|
|
|
|
self:takeEffect(self.skill.owner, arr[j], effects, i, self.skill.hitTime, self.skill)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:ForeachTargets(func)
|
|
|
|
|
local targets = self:GetDirectTargets()
|
|
|
|
|
for _, role in ipairs(targets) do
|
|
|
|
|
if func then
|
|
|
|
|
func(role)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><>ȡֱ<C8A1><D6B1>ѡ<EFBFBD><D1A1>Ŀ<EFBFBD><C4BF>Id
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:GetDirectChooseId()
|
|
|
|
|
local effectGroup = self.effectList[1]
|
|
|
|
|
local chooseId = effectGroup.chooseId
|
|
|
|
|
return chooseId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><>ȡ<EFBFBD><C8A1><EFBFBD>ܵ<EFBFBD>ֱ<EFBFBD><D6B1>Ŀ<EFBFBD>꣬<EFBFBD>Ͳ<CDB2><DFBB>涨<EFBFBD><E6B6A8>һ<EFBFBD><D2BB>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ϊֱ<CEAA><D6B1>Ч<EFBFBD><D0A7>Ŀ<EFBFBD><C4BF>,(<28><><EFBFBD><EFBFBD>miss<73><73>Ŀ<EFBFBD><C4BF>)
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:GetDirectTargets()
|
|
|
|
|
return self.effectTargets[1]
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><>ȡֱ<C8A1><D6B1>Ŀ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>miss<73><73>Ŀ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:GetDirectTargetsNoMiss()
|
|
|
|
|
local list = {}
|
|
|
|
|
for _, role in ipairs(self.effectTargets[1]) do
|
|
|
|
|
if self:CheckTargetIsHit(role) then
|
|
|
|
|
table.insert(list, role)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:GetMaxTargetNum()
|
|
|
|
|
local mainEffect = self.effectList[1]
|
|
|
|
|
if not mainEffect then
|
|
|
|
|
return 0
|
|
|
|
|
end
|
|
|
|
|
return BattleUtil.GetMaxTargetNum(mainEffect.chooseId)
|
|
|
|
|
end
|
|
|
|
|
|
2020-12-28 10:34:53 +08:00
|
|
|
|
-- <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
2020-10-29 16:36:10 +08:00
|
|
|
|
function EffectCaster:CheckTargetIsHit(role)
|
|
|
|
|
return self.targetIsHit[role]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function EffectCaster:Dispose()
|
|
|
|
|
for _, effectGroup in ipairs(self.effectList) do
|
|
|
|
|
for k=1, #effectGroup.effects do
|
|
|
|
|
local effect = effectGroup.effects[k]
|
|
|
|
|
for j=1, #effect.args do
|
|
|
|
|
effect.args[j] = nil
|
|
|
|
|
end
|
|
|
|
|
effectPool:Put(effect)
|
|
|
|
|
effectGroup.effects[k] = nil
|
|
|
|
|
end
|
|
|
|
|
effectGroupPool:Put(effectGroup)
|
|
|
|
|
end
|
|
|
|
|
self.effectList = {}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return EffectCaster
|