From d6161eec964b2eeb23bd93c84c29f8ffd3a2d06f Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Thu, 05 Nov 2020 17:26:39 +0800
Subject: [PATCH] Merge commit '323055bb1b4c9b5669676dd799238050279b7d7a' into master

---
 Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs |  106 +++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 102 insertions(+), 4 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
index 5a757bb..fc25a5a 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessBossSkill/EndlessBossSkillManager.cs
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using UnityEngine;
 using Core.Utilities;
+using TowerDefense.UI.HUD;
 
 /**
  * 无尽模式boss技能管理器
@@ -33,10 +34,29 @@
         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()
@@ -49,8 +69,51 @@
         // Update is called once per frame
         private void Update()
         {
-            if (isPaused) return;
+            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);
@@ -63,10 +126,27 @@
             {
                 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);
+                    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>
@@ -90,6 +170,7 @@
             }
 
             isPaused = false;
+            ChangeState(EndlessBossSkillState.Wait);
         }
 
         /// <summary>
@@ -107,6 +188,8 @@
             cdList.Clear();
             waitList.Clear();
             isPaused = true;
+            ChangeState(EndlessBossSkillState.Init);
+            ClearEvent();
         }
 
         /// <summary>
@@ -122,6 +205,20 @@
             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>
@@ -130,6 +227,7 @@
         public void Restart()
         {
             isPaused = false;
+            ChangeState(EndlessBossSkillState.Wait);
         }
 
         /// <summary>

--
Gitblit v1.9.1