| | |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using UnityEngine; |
| | | using Core.Utilities; |
| | | using TowerDefense.UI.HUD; |
| | | |
| | | /** |
| | | * 无尽模式boss技能管理器 |
| | |
| | | private List<EndlessBossSkill> waitList; |
| | | |
| | | /// <summary> |
| | | /// boss技能状态 |
| | | /// </summary> |
| | | private EndlessBossSkillState skillState; |
| | | |
| | | /// <summary> |
| | | /// 是否终止使用技能 |
| | | /// </summary> |
| | | /// <value></value> |
| | | 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() |
| | |
| | | // Update is called once per frame |
| | | private void Update() |
| | | { |
| | | if (isPaused) return; |
| | | if (isPaused || EndlessGameUI.instance.state == EndlessGameUI.State.GameOver || !EndlessUIStart.instance.IsGameRunning) return; |
| | | |
| | | 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 < waitList.Count; ++i) |
| | | { |
| | | if (waitList[i].IsCDCompleted) |
| | | AddSkill(waitList[i]); |
| | | } |
| | | |
| | | 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 < cdList.Count; ++i) |
| | | { |
| | | if (cdList[i].IsConditionOK) |
| | | { |
| | | cdList[i].ReleaseSkill(); |
| | | RemoveSkill(cdList[i]); |
| | | currentSkill = cdList[i]; |
| | | EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitleCompleted, OnGlintTitleCompleted); |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillGlintTitle, (int)cdList[i].SkillType); |
| | | isFloatWordCompleted = false; |
| | | ChangeState(EndlessBossSkillState.FloatWord); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 飘字闪烁完成 |
| | | /// </summary> |
| | | 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> |
| | |
| | | /// <param name="idList"></param> |
| | | public void Init(List<int> idList) |
| | | { |
| | | Debug.Log("--------------------- 初始化boss技能列表 ---------------------"); |
| | | skillIdList = idList; |
| | | |
| | | for (int i = 0; i < idList.Count; ++i) |
| | |
| | | { |
| | | skillList.Add(skill); |
| | | skill.Init(); |
| | | waitList.Add(skill); |
| | | } |
| | | } |
| | | |
| | | isPaused = false; |
| | | ChangeState(EndlessBossSkillState.Wait); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | public void ClearSkillList() |
| | | { |
| | | Debug.Log("--------------------- 关卡结束,清空技能列表 ---------------------"); |
| | | for (int i = 0; i < skillList.Count; ++i) |
| | | { |
| | | skillList[i].Clear(); |
| | |
| | | cdList.Clear(); |
| | | waitList.Clear(); |
| | | isPaused = true; |
| | | ChangeState(EndlessBossSkillState.Init); |
| | | ClearEvent(); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | public void Reset() |
| | | { |
| | | for (int i = 0; i < skillList.Count; ++i) |
| | | { |
| | | skillList[i].Reset(); |
| | | } |
| | | if (isPaused) return; |
| | | |
| | | cdList.Clear(); |
| | | waitList.Clear(); |
| | | |
| | | for (int i = 0; i < skillList.Count; ++i) |
| | | { |
| | | skillList[i].Reset(); |
| | | waitList.Add(skillList[i]); |
| | | } |
| | | |
| | | 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> |
| | |
| | | public void Restart() |
| | | { |
| | | isPaused = false; |
| | | ChangeState(EndlessBossSkillState.Wait); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | return new BossSkillBubbleBomb(data); |
| | | case EndlessBossSkillType.WoodPile: |
| | | return new BossSkillWoodPile(data); |
| | | case EndlessBossSkillType.BondageBubble: |
| | | return new BossSkillBondageBubble(data); |
| | | } |
| | | |
| | | return null; |