using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using Core.Utilities;
|
using TowerDefense.UI.HUD;
|
|
/**
|
* 无尽模式boss技能管理器
|
* @Author: chenxin
|
* @Date: 2020-11-02 16:46:12
|
*/
|
namespace KTGMGemClient
|
{
|
public class EndlessBossSkillManager : Singleton<EndlessBossSkillManager>
|
{
|
/// <summary>
|
/// boss技能id列表
|
/// </summary>
|
private List<int> skillIdList;
|
|
/// <summary>
|
/// 技能列表,所有的技能 cdList + waitList = skillList
|
/// </summary>
|
private List<EndlessBossSkill> skillList;
|
|
/// <summary>
|
/// 技能cd列表,技能冷却好了就放到这个队列
|
/// </summary>
|
private List<EndlessBossSkill> cdList;
|
|
/// <summary>
|
/// 正在等待冷却的技能队列
|
/// </summary>
|
private List<EndlessBossSkill> waitList;
|
|
/// <summary>
|
/// boss技能状态
|
/// </summary>
|
private EndlessBossSkillState skillState;
|
|
/// <summary>
|
/// 是否终止使用技能
|
/// </summary>
|
private bool isPaused { get; set; }
|
|
/// <summary>
|
/// 当前正在处理的技能
|
/// </summary>
|
private EndlessBossSkill currentSkill;
|
|
/// <summary>
|
/// 飘字是否完成
|
/// </summary>
|
private bool isFloatWordCompleted { get; set; } = true;
|
|
/// <summary>
|
/// boss技能动作是否完成
|
/// </summary>
|
private bool isSkillActionCompleted { get; set; } = true;
|
|
// Start is called before the first frame update
|
private void Start()
|
{
|
skillList = new List<EndlessBossSkill>();
|
cdList = new List<EndlessBossSkill>();
|
waitList = new List<EndlessBossSkill>();
|
}
|
|
// Update is called once per frame
|
private void Update()
|
{
|
if (isPaused || EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
|
|
switch (skillState)
|
{
|
case EndlessBossSkillState.Init:
|
break;
|
case EndlessBossSkillState.Wait:
|
HandleWait(Time.deltaTime);
|
break;
|
case EndlessBossSkillState.FloatWord:
|
if (isFloatWordCompleted)
|
{
|
EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessBossSummonEnd, OnEndlessBossActionEnd);
|
EndlessBossCtrl.instance.ChangeState(EndlessBossActionState.Summon);
|
isSkillActionCompleted = false;
|
ChangeState(EndlessBossSkillState.PerformAction);
|
}
|
break;
|
case EndlessBossSkillState.PerformAction:
|
if (isSkillActionCompleted)
|
ChangeState(EndlessBossSkillState.ReleaseSkill);
|
break;
|
case EndlessBossSkillState.ReleaseSkill:
|
if (currentSkill != null)
|
{
|
RemoveSkill(currentSkill);
|
currentSkill.ReleaseSkill();
|
currentSkill = null;
|
}
|
ChangeState(EndlessBossSkillState.Wait);
|
break;
|
}
|
}
|
|
/// <summary>
|
/// boss技能动作完成
|
/// </summary>
|
private void OnEndlessBossActionEnd()
|
{
|
EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSummonEnd, OnEndlessBossActionEnd);
|
isSkillActionCompleted = true;
|
}
|
|
private void HandleWait(float deltaTime)
|
{
|
for (int i = 0; i < skillList.Count; ++i)
|
{
|
skillList[i].Update(Time.deltaTime);
|
|
if (skillList[i].IsCDCompleted)
|
AddSkill(skillList[i]);
|
}
|
|
for (int i = 0; i < cdList.Count; ++i)
|
{
|
if (cdList[i].IsConditionOK)
|
{
|
currentSkill = cdList[i];
|
EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
|
EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitle);
|
isFloatWordCompleted = false;
|
ChangeState(EndlessBossSkillState.FloatWord);
|
break;
|
}
|
}
|
}
|
|
private void OnGlintTitleCompleted()
|
{
|
EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
|
isFloatWordCompleted = true;
|
}
|
|
private void ChangeState(EndlessBossSkillState newState)
|
{
|
if (newState == skillState) return;
|
|
skillState = newState;
|
}
|
|
/// <summary>
|
/// 更新关卡需要重新初始化boss技能
|
/// </summary>
|
/// <param name="idList"></param>
|
public void Init(List<int> idList)
|
{
|
Debug.Log("--------------------- 初始化boss技能列表 ---------------------");
|
skillIdList = idList;
|
|
for (int i = 0; i < idList.Count; ++i)
|
{
|
EndlessBossSkill skill = GetSkillInstanceByType(idList[i]);
|
|
if (skill != null)
|
{
|
skillList.Add(skill);
|
skill.Init();
|
}
|
}
|
|
isPaused = false;
|
ChangeState(EndlessBossSkillState.Wait);
|
}
|
|
/// <summary>
|
/// 关卡结束需要清理一下技能列表
|
/// </summary>
|
public void ClearSkillList()
|
{
|
Debug.Log("--------------------- 关卡结束,清空技能列表 ---------------------");
|
for (int i = 0; i < skillList.Count; ++i)
|
{
|
skillList[i].Clear();
|
}
|
|
skillList.Clear();
|
cdList.Clear();
|
waitList.Clear();
|
isPaused = true;
|
ChangeState(EndlessBossSkillState.Init);
|
ClearEvent();
|
}
|
|
/// <summary>
|
/// 波次更新时需要重置所有技能
|
/// </summary>
|
public void Reset()
|
{
|
if (isPaused) return;
|
|
for (int i = 0; i < skillList.Count; ++i)
|
{
|
skillList[i].Reset();
|
}
|
|
cdList.Clear();
|
waitList.Clear();
|
isPaused = true;
|
ChangeState(EndlessBossSkillState.Init);
|
ClearEvent();
|
}
|
|
private void ClearEvent()
|
{
|
if (!isFloatWordCompleted)
|
EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted);
|
|
if (!isSkillActionCompleted)
|
{
|
EventCenter.Ins.Remove((int)KTGMGemClient.EventType.EndlessBossSummonEnd, OnEndlessBossActionEnd);
|
EndlessBossCtrl.instance.ChangeState(EndlessBossActionState.Standing);
|
}
|
}
|
|
/// <summary>
|
/// 重新开始新的一波,重新启动技能
|
/// </summary>
|
public void Restart()
|
{
|
isPaused = false;
|
ChangeState(EndlessBossSkillState.Wait);
|
}
|
|
/// <summary>
|
/// 获取技能实例
|
/// </summary>
|
/// <param name="skillId">技能id</param>
|
/// <returns></returns>
|
private EndlessBossSkill GetSkillInstanceByType(int skillId)
|
{
|
boss_skill data = EndlessBossSkillData.GetDataById(skillId);
|
|
if (data == null)
|
{
|
Debug.LogError($"--------------------- skillId: {skillId},没有对应的技能数据 ---------------------");
|
return null;
|
}
|
|
switch ((EndlessBossSkillType)data.skill_class)
|
{
|
case EndlessBossSkillType.ShieldWall:
|
return new BossSkillShieldWall(data);
|
case EndlessBossSkillType.BubbleBomb:
|
return new BossSkillBubbleBomb(data);
|
case EndlessBossSkillType.WoodPile:
|
return new BossSkillWoodPile(data);
|
}
|
|
return null;
|
}
|
|
/// <summary>
|
/// 技能cd好了,加到cd列表
|
/// </summary>
|
/// <param name="skill"></param>
|
private void AddSkill(EndlessBossSkill skill)
|
{
|
waitList.Remove(skill);
|
cdList.Add(skill);
|
}
|
|
/// <summary>
|
/// 技能进入冷却状态,加到等待列表
|
/// </summary>
|
/// <param name="skill"></param>
|
private void RemoveSkill(EndlessBossSkill skill)
|
{
|
cdList.Remove(skill);
|
waitList.Add(skill);
|
}
|
}
|
}
|