miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/Logic/SkillManager.lua

230 lines
6.3 KiB
Lua

SkillManager = {}
local this = SkillManager
local skillPool = BattleObjectPool.New(function ()
return Skill:New()
end)
--
this.DeadSkillList = {} -- 人物死亡后技能队列,死亡技能优先级最高
this.MonsterSkillList = {}
this.SkillList = {}
this.IsSkilling = false
this.MaxSkillCount = 20 -- 单个回合内最多释放20次技能
-- 初始化
function this.Init()
this.Clear()
end
function this.CheckMaxCount()
if not this.CurSkillCount then
this.CurSkillCount = 0
end
if this.CurSkillCount < this.MaxSkillCount then
this.CurSkillCount = this.CurSkillCount + 1
return true
end
return false
end
--
function this.AddMonsterSkill(skill)
-- 如果超出最大限制则不再追加技能
if not this.CheckMaxCount() then
return
end
if skill.type == BattleSkillType.Monster then
table.insert(this.MonsterSkillList, skill)
end
return skill
end
-- 向技能列表中追加技能
function this.AddSkill(caster, effectData, type, targets, isAdd, isRage)
-- 如果超出最大限制则不再追加技能
if not this.CheckMaxCount() then
return
end
local skill = skillPool:Get()
skill:Init(caster, effectData, type, targets, isAdd, isRage)
if type == BattleSkillType.DeadSkill then -- 死亡技能加入单独的对列
table.insert(this.DeadSkillList, skill)
else
table.insert(this.SkillList, skill)
end
return skill
end
-- 插入技能到技能列表首位
function this.InsertSkill(caster, effectData, type, targets, isAdd, isRage)
-- 如果超出最大限制则不再追加技能
if not this.CheckMaxCount() then
return
end
local skill = skillPool:Get()
skill:Init(caster, effectData, type, targets, isAdd, isRage)
if type == BattleSkillType.DeadSkill then -- 死亡技能加入单独的对列
table.insert(this.DeadSkillList, 1, skill)
else
table.insert(this.SkillList, 1, skill)
end
return skill
end
-- 获取是否拥有我的技能未释放
function this.HaveMySkill(role)
for _, skill in ipairs(this.DeadSkillList) do
if skill.owner == role then
return true
end
end
for _, skill in ipairs(this.SkillList) do
if skill.owner == role then
return true
end
end
return false
end
-- 设置用于轮转的方法
function this.SetTurnRoundFunc(func)
this.TurnRoundFunc = func
end
function this.CheckTurnRound()
-- 如果正在释放技能
if this.IsSkilling then
return
end
if this.MonsterSkillList and #this.MonsterSkillList > 0 then
return
end
-- 检测一次灵兽技能
-- this.CheckMonsterSkill(this.MonsterCheckFunc)
--
if this.DeadSkillList and #this.DeadSkillList > 0 then
return
end
if this.SkillList and #this.SkillList > 0 then
return
end
-- 没有技能释放的时候才轮转
if this.TurnRoundFunc then
BattleLogic.WaitForTrigger(0.3, function()
-- 清除数量限制
this.CurSkillCount = 0
--
this.TurnRoundFunc()
this.TurnRoundFunc = nil
end)
end
end
-- 检测是否需要等待灵兽技能
function this.CheckMonsterSkill(func)
this.MonsterCheckFunc = func
-- 判断是否可以向下执行
if not this.IsSkilling and (not this.MonsterSkillList or #this.MonsterSkillList == 0) then
--
if this.MonsterCheckFunc then
local func = this.MonsterCheckFunc
-- 置空方法放到回调之前,避免再会调中再次调用检测方法导致方法被删除
this.MonsterCheckFunc = nil
func()
end
end
end
--
function this.Update()
-- 如果正在引导战斗
if BattleManager and BattleManager.IsGuidePause() then
return
end
--
if this.IsSkilling then
return
end
if this.MonsterSkillList and #this.MonsterSkillList > 0 then
local skill = this.MonsterSkillList[1]
table.remove(this.MonsterSkillList, 1)
this.IsSkilling = true
if skill:canCastSkill() then
skill:Cast(function()
-- 检测一下轮转
this.IsSkilling = false
-- this.CheckTurnRound()
-- 检测一次灵兽技能
this.CheckMonsterSkill(this.MonsterCheckFunc)
end)
else
-- 检测一下轮转
this.IsSkilling = false
-- this.CheckTurnRound()
-- 检测一次灵兽技能
this.CheckMonsterSkill(this.MonsterCheckFunc)
end
return
end
-- 判断是否有死亡技能
-- 跟佳琦对的是角色死后只有死亡后释放的技能才能释放(DeadSkill) by:王振兴 2020/09/02 18:53
if this.DeadSkillList and #this.DeadSkillList > 0 then
local skill = this.DeadSkillList[1]
table.remove(this.DeadSkillList, 1)
this.IsSkilling = true
if skill.owner:IsDead() then
skill.owner:SkillCast(skill, function()
skill:Dispose()
skillPool:Put(skill)
this.IsSkilling = false
-- 检测一下轮转
this.CheckTurnRound()
end)
else
this.IsSkilling = false
this.CheckTurnRound()
end
return
end
-- 判断
if this.SkillList and #this.SkillList > 0 then
local skill = this.SkillList[1]
table.remove(this.SkillList, 1)
this.IsSkilling = true
-- 检测技能释放 只有角色不是死亡状态或角色身上有不灭
if (not skill.owner:IsDead() or BattleUtil.CheckIsNoDead(skill.owner)) then
skill.owner:SkillCast(skill, function()
skill:Dispose()
skillPool:Put(skill)
this.IsSkilling = false
-- 检测一下轮转
this.CheckTurnRound()
end)
else
this.IsSkilling = false
this.CheckTurnRound()
end
return
end
end
-- 清除
function this.Clear()
for _, skill in ipairs(this.SkillList) do
skill:Dispose()
skillPool:Put(skill)
end
this.MonsterSkillList = {}
this.DeadSkillList = {}
this.SkillList = {}
this.IsSkilling = false
end
return SkillManager