2019-03-12 14:05:45 +08:00
|
|
|
|
Buff = {}
|
|
|
|
|
|
|
|
|
|
local floor = math.floor
|
2019-03-21 14:33:56 +08:00
|
|
|
|
local buffPoolList = {}
|
|
|
|
|
|
|
|
|
|
local getBuff = function(type)
|
|
|
|
|
if not buffPoolList[type] then
|
|
|
|
|
buffPoolList[type] = BattleObjectPool.New(function (type)
|
|
|
|
|
return require("Modules/Battle/Logic/Buff/"..type):New()
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
return buffPoolList[type]:Get(type)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local putBuff = function(buff)
|
|
|
|
|
if buffPoolList[buff.type] then
|
|
|
|
|
buffPoolList[buff.type]:Put(buff)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-16 14:32:11 +08:00
|
|
|
|
local buffListPool = BattleObjectPool.New(function ()
|
|
|
|
|
return BattleList.New()
|
|
|
|
|
end)
|
|
|
|
|
|
2019-03-12 14:05:45 +08:00
|
|
|
|
function Buff:New()
|
|
|
|
|
local o = {}
|
|
|
|
|
setmetatable(o, self)
|
|
|
|
|
self.__index = self
|
|
|
|
|
return o
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Buff.Create(caster, type, duration, ...)
|
2019-03-21 14:33:56 +08:00
|
|
|
|
local buff = getBuff(type)
|
|
|
|
|
buff.type = type
|
|
|
|
|
buff.id = BattleLogic.GenerateBuffId()
|
|
|
|
|
buff.caster = caster
|
|
|
|
|
buff.disperse = false
|
|
|
|
|
buff.cover = false
|
|
|
|
|
|
|
|
|
|
buff.duration = duration --持续时间为0时buff永久存在
|
|
|
|
|
buff.interval = -1 --间隔帧为0时每帧触发,小于0不触发 默认不触发OnTrigger
|
|
|
|
|
buff.framePass = 0
|
|
|
|
|
|
|
|
|
|
buff:SetData(...)
|
|
|
|
|
return buff
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
BuffManager = {}
|
|
|
|
|
BuffManager.__index = BuffManager
|
|
|
|
|
|
2019-03-21 14:33:56 +08:00
|
|
|
|
function BuffManager.New()
|
2019-03-22 15:00:06 +08:00
|
|
|
|
local instance = {owner=0, buffQueue = BattleQueue.New(), buffList = BattleDictionary.New()}
|
2019-03-12 14:05:45 +08:00
|
|
|
|
setmetatable(instance, BuffManager)
|
|
|
|
|
return instance
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-16 14:32:11 +08:00
|
|
|
|
function BuffManager:Init()
|
2019-04-17 21:04:32 +08:00
|
|
|
|
while self.buffQueue.size > 0 do
|
|
|
|
|
putBuff:Put(self.buffQueue:Dequeue())
|
2019-04-16 14:32:11 +08:00
|
|
|
|
end
|
|
|
|
|
for i = 1, self.buffList.size do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local list = self.buffList.vList[i]
|
2019-04-16 14:32:11 +08:00
|
|
|
|
for j=1, list.size do
|
2019-06-28 11:28:45 +08:00
|
|
|
|
list.buffer[j]:OnEnd()
|
2019-04-16 14:32:11 +08:00
|
|
|
|
putBuff(list.buffer[j])
|
|
|
|
|
end
|
|
|
|
|
list:Clear()
|
|
|
|
|
buffListPool:Put(list)
|
|
|
|
|
end
|
2019-03-21 14:33:56 +08:00
|
|
|
|
self.buffList:Clear()
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-16 14:32:11 +08:00
|
|
|
|
function BuffManager:AddBuff(target, buff)
|
|
|
|
|
buff.target = target
|
2019-03-12 14:05:45 +08:00
|
|
|
|
self.buffQueue:Enqueue(buff)
|
|
|
|
|
if not buff.exCtrlTime then
|
|
|
|
|
buff.exCtrlTime = 0
|
|
|
|
|
end
|
|
|
|
|
buff.frameDuration = floor(buff.duration * (1 + buff.exCtrlTime) * BattleLogic.GameFrameRate)
|
|
|
|
|
--if buff.isBuff then --TODO:增益buff持续时间加成
|
|
|
|
|
-- local buffBocus = buff.caster:GetRoleData(RoleDataName.BuffBocus)
|
|
|
|
|
-- buff.frameDuration = floor(buff.duration * (1 + buffBocus + buff.exCtrlTime) * BattleLogic.GameFrameRate)
|
|
|
|
|
--end
|
|
|
|
|
--
|
|
|
|
|
--if buff.isDeBuff then --TODO:减益buff持续时间减免
|
|
|
|
|
-- local debuffReduce = self.owner:GetRoleData(RoleDataName.DebuffReduce)
|
|
|
|
|
-- buff.frameDuration = floor(buff.duration * (1 - debuffReduce - buff.exCtrlTime) * BattleLogic.GameFrameRate)
|
|
|
|
|
--end
|
|
|
|
|
|
|
|
|
|
buff.frameInterval = floor(buff.interval * BattleLogic.GameFrameRate)
|
2019-05-13 09:51:36 +08:00
|
|
|
|
buff.caster.Event:DispatchEvent(BattleEventName.BuffCaster, buff)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
|
2019-04-16 14:32:11 +08:00
|
|
|
|
function BuffManager:HasBuff(target, type, checkFunc)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
if self.buffList.kvList[type] then
|
|
|
|
|
local buffList = self.buffList.kvList[type]
|
|
|
|
|
for i=1, buffList.size do
|
|
|
|
|
local v = buffList.buffer[i]
|
|
|
|
|
if v.target == target then
|
|
|
|
|
if (not checkFunc or (checkFunc and checkFunc(v))) then
|
|
|
|
|
return true
|
|
|
|
|
end
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-16 14:32:11 +08:00
|
|
|
|
function BuffManager:ClearBuff(target, func)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
for i = 1, self.buffList.size do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local list = self.buffList.vList[i]
|
2019-04-16 14:32:11 +08:00
|
|
|
|
if list.size > 0 then
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local idx = 1
|
2019-04-16 14:32:11 +08:00
|
|
|
|
while idx <= list.size do
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local buff = list.buffer[idx]
|
2019-04-16 14:32:11 +08:00
|
|
|
|
if buff.target == target and (not func or (func and func(buff))) then
|
|
|
|
|
buff:OnEnd()
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffEnd, buff)
|
|
|
|
|
putBuff(buff)
|
|
|
|
|
list:Remove(idx)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
else
|
|
|
|
|
idx = idx + 1
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-04-17 21:04:32 +08:00
|
|
|
|
function BuffManager:GetBuffCount(type)
|
|
|
|
|
if self.buffList[type] then
|
|
|
|
|
return self.buffList[type].size
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
return 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function BuffManager:Update()
|
2019-04-17 21:04:32 +08:00
|
|
|
|
while self.buffQueue.size > 0 do
|
2019-03-12 14:05:45 +08:00
|
|
|
|
local buff = self.buffQueue:Dequeue()
|
|
|
|
|
local buffList
|
2019-04-17 21:04:32 +08:00
|
|
|
|
if not self.buffList.kvList[buff.type] then
|
2019-04-16 14:32:11 +08:00
|
|
|
|
buffList = buffListPool:Get()
|
2019-04-17 21:04:32 +08:00
|
|
|
|
self.buffList:Add(buff.type, buffList)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
else
|
2019-04-17 21:04:32 +08:00
|
|
|
|
buffList = self.buffList.kvList[buff.type]
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
2019-04-01 19:49:18 +08:00
|
|
|
|
if buff.cover and buffList.size > 0 then
|
2019-04-17 21:04:32 +08:00
|
|
|
|
local isCovered = false
|
|
|
|
|
for i=1, buffList.size do
|
|
|
|
|
local oldBuff = buffList.buffer[i]
|
2019-05-07 20:01:07 +08:00
|
|
|
|
if oldBuff.cover and oldBuff.target == buff.target and oldBuff:OnCover(buff) then --判定该效果能否被覆盖
|
2019-04-17 21:04:32 +08:00
|
|
|
|
oldBuff:OnEnd()
|
2019-04-18 13:25:01 +08:00
|
|
|
|
oldBuff.target.Event:DispatchEvent(BattleEventName.BuffEnd, oldBuff)
|
|
|
|
|
putBuff(oldBuff)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
buffList.buffer[i] = buff
|
|
|
|
|
buff:OnStart()
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffStart, buff)
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffCover, buff)
|
|
|
|
|
isCovered = true
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
2019-05-07 20:01:07 +08:00
|
|
|
|
if not isCovered then
|
2019-04-17 21:04:32 +08:00
|
|
|
|
buffList:Add(buff)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
buff:OnStart()
|
2019-04-16 14:32:11 +08:00
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffStart, buff)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
else
|
2019-05-07 20:01:07 +08:00
|
|
|
|
buffList:Add(buff)
|
|
|
|
|
buff:OnStart()
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffStart, buff)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
2019-04-17 21:04:32 +08:00
|
|
|
|
for i=1, self.buffList.size do
|
|
|
|
|
local buffList = self.buffList.vList[i]
|
|
|
|
|
if buffList.size > 0 then
|
|
|
|
|
local index = 1
|
|
|
|
|
while index <= buffList.size do
|
|
|
|
|
local buff = buffList.buffer[index]
|
2019-03-12 14:05:45 +08:00
|
|
|
|
--印记类型的buff不处理更新逻辑
|
|
|
|
|
if buff.frameDuration == 0 and buff.frameInterval < 0 then
|
|
|
|
|
else
|
|
|
|
|
buff.framePass = buff.framePass + 1
|
|
|
|
|
if buff.frameDuration == 0 then
|
|
|
|
|
if buff.frameInterval == 0 or buff.framePass % buff.frameInterval == 0 then
|
|
|
|
|
if not buff:OnTrigger() then
|
|
|
|
|
buff.disperse = true
|
|
|
|
|
end
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffTrigger, buff)
|
|
|
|
|
end
|
|
|
|
|
elseif buff.frameInterval < 0 then
|
|
|
|
|
if buff.framePass > buff.frameDuration then
|
|
|
|
|
buff.disperse = true
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if buff.frameInterval == 0 or buff.framePass % buff.frameInterval == 0 then
|
|
|
|
|
if not buff:OnTrigger() then
|
|
|
|
|
buff.disperse = true
|
|
|
|
|
end
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffTrigger, buff)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if buff.framePass > buff.frameDuration then
|
|
|
|
|
buff.disperse = true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if buff.disperse then
|
|
|
|
|
buff:OnEnd()
|
|
|
|
|
buff.target.Event:DispatchEvent(BattleEventName.BuffEnd, buff)
|
2019-04-16 14:32:11 +08:00
|
|
|
|
putBuff(buff)
|
2019-04-17 21:04:32 +08:00
|
|
|
|
buffList:Remove(index)
|
2019-03-12 14:05:45 +08:00
|
|
|
|
else
|
2019-04-17 21:04:32 +08:00
|
|
|
|
index = index + 1
|
2019-03-12 14:05:45 +08:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|