miduo_server/luafight/Modules/Battle/Logic/Base/EffectCaster.lua

206 lines
6.0 KiB
Lua
Raw Normal View History

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><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