From 0d6a2e6d4b9de57a13c2bcb32148e1eb97ef1b1f Mon Sep 17 00:00:00 2001
From: wangguan <wangguan@kt007.com>
Date: Tue, 15 Dec 2020 16:53:34 +0800
Subject: [PATCH] 玩家通关打点位置修改为结算的时候统计

---
 Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs |  348 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 295 insertions(+), 53 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs b/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
index f8f85e9..39b6abd 100644
--- a/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
+++ b/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
@@ -6,11 +6,11 @@
 using TowerDefense.Towers.Data;
 using TowerDefense.Towers.Placement;
 using UnityEngine;
-using UnityEngine.UI;
 using KTGMGemClient;
 using System.Collections;
 using System.Collections.Generic;
 using TowerDefense.Nodes;
+using TowerDefense.UI.HUD;
 
 namespace TowerDefense.Level
 {
@@ -22,9 +22,51 @@
     public class EndlessLevelManager : Singleton<EndlessLevelManager>
     {
         /// <summary>
+        /// 起始关卡
+        /// </summary>
+        protected int startLevel { get; set; } = 1;
+
+        /// <summary>
         /// 当前的关卡等级
         /// </summary>
         public int CurrentLevel { get; set; } = 1;
+
+        private float dropRate;
+
+        /// <summary>
+        /// 当前金币掉率
+        /// </summary>
+        /// <value></value>
+        public float DropRate
+        {
+            get
+            {
+                return dropRate;
+            }
+            set
+            {
+                dropRate = value;
+                Debug.Log("设置了掉率" + dropRate);
+            }
+        }
+
+        private int dropCoin;
+
+        /// <summary>
+        /// 当前金币
+        /// </summary>
+        /// <value></value>
+        public int DropCoin
+        {
+            get
+            {
+                return dropCoin;
+            }
+            set
+            {
+                dropCoin = value;
+            }
+        }
 
         protected static readonly int MAX_TOWER = 5;
 
@@ -110,11 +152,6 @@
         public event Action LevelCompleted;
 
         /// <summary>
-        /// Fired when all of the home bases are destroyed
-        /// </summary>
-        public event Action LevelFailed;
-
-        /// <summary>
         /// Fired when the level state is changed - first parameter is the old state, second parameter is the new state
         /// </summary>
         public event Action<LevelState, LevelState> LevelStateChanged;
@@ -141,6 +178,8 @@
         /// </summary>
         public List<Node> StartingNodeList;
 
+        public List<Node> EndNodeList;
+
         /// <summary>
         /// 已经完成的关卡数量
         /// </summary>
@@ -151,12 +190,67 @@
         /// </summary>
         /// <value></value>
         public int SelectBuffNeddLevels { get; set; }
-        // public int SelectBuffNeddLevels { get; set; } = 2;
 
         /// <summary>
-        /// buff是否选择完成
+        /// 弹框完成
         /// </summary>
-        private bool isBuffSelectCompleted = true;
+        private bool isPopDone = true;
+
+        /// <summary>
+        /// 新手第一关是否完成
+        /// </summary>
+        private bool isFirstLevelCompleted = false;
+        private bool isSecondLevelCompleted = false;
+        private bool isThirdLevelCompleted = false;
+
+        private bool isStopSecondWaveCompleted = false;
+
+        /// <summary>
+        /// 赛道长度
+        /// </summary>
+        private float tunelLength;
+
+        private List<Vector3> homeBasePositionList;
+
+        private ElfUpgrade elfPanelUpgrade;
+
+        /// <summary>
+        /// 根据赛道id(1~5)获得基地坐标
+        /// </summary>
+        /// <param name="tunelId"></param>
+        /// <returns></returns>
+        public Vector3 GetHomeBasePosition(int tunelId)
+        {
+            return homeBasePositionList[tunelId - 1];
+        }
+
+        /// <summary>
+        /// 根据赛道id(1~5)和赛道类型获得世界坐标
+        /// </summary>
+        /// <param name="tunelId"></param>
+        /// <param name="tunelType"></param>
+        public Vector3 GetTunelWorldPosition(int tunelId, EndlessBossSkillTunelType tunelType)
+        {
+            Vector3 startPos = StartingNodeList[tunelId - 1].transform.position;
+            Vector3 ret = new Vector3(startPos.x, startPos.y, startPos.z);
+            float add = 0;
+
+            switch (tunelType)
+            {
+                case EndlessBossSkillTunelType.Top:
+                    break;
+                case EndlessBossSkillTunelType.Center:
+                    add = -(tunelLength / 2);
+                    break;
+                case EndlessBossSkillTunelType.Bottom:
+                    add = -tunelLength;
+                    break;
+            }
+
+            ret.z += add;
+
+            return ret;
+        }
 
         /// <summary>
         /// 切换基地
@@ -244,6 +338,7 @@
         /// </summary>
         public virtual void StartLevel()
         {
+            EndlessPortData.Init();
             ChangeLevelState(LevelState.SpawningEnemies);
             SelfPlacementArea.startCoinGenMode();
         }
@@ -275,11 +370,25 @@
             // Iterate through home bases and subscribe
             NumberOfHomeBases = HomeBases.Length;
             NumberOfHomeBasesLeft = NumberOfHomeBases;
+        }
 
-            for (int i = 0; i < NumberOfHomeBases; i++)
+        private void Start()
+        {
+            EndlessBuffSelect.instance.BuffSelectCompleted += OnBuffSelectCompleted;
+            EndlessGameUI.instance.GameOverEvent += SafelyCallLevelCompleted;
+            EventCenter.Ins.Add((int)KTGMGemClient.EventType.ElfUpgradePanelClosed, ElfUpgradePanelClosed);
+
+            homeBasePositionList = new List<Vector3>();
+            tunelLength = Mathf.Abs(StartingNodeList[0].transform.position.z - EndNodeList[0].transform.position.z);
+
+            for (int i = 0; i < StartingNodeList.Count; ++i)
             {
-                HomeBases[i].homebaseIdx = i % MAX_TOWER;
-                HomeBases[i].died += OnHomeBaseDestroyed;
+                Vector3 startPos = StartingNodeList[i].transform.position;
+                Vector3 pos = new Vector3();
+                pos.x = startPos.x;
+                pos.y = startPos.y;
+                pos.z = startPos.z - tunelLength;
+                homeBasePositionList.Add(pos);
             }
         }
 
@@ -288,22 +397,44 @@
         /// </summary>
         protected virtual void Update()
         {
+            if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
+
             if (alwaysGainCurrency || !alwaysGainCurrency && EndlessLeveltate != LevelState.Building && EndlessLeveltate != LevelState.Intro)
             {
                 CurrencyGainer.Tick(Time.deltaTime);
             }
 
-            if (!isBuffSelectCompleted)
+            if (!isPopDone)
             {
-                isBuffSelectCompleted = true;
+                isPopDone = true;
+                if (CurrentLevel > startLevel)
+                    WaveManager.InitPort(CurrentLevel);
+                EndlessUIStart.instance.Restart();
                 WaveManager.StartWaves(CurrentLevel);
             }
 
             // 本关卡所有波次全部生成完成 && 敌人全部被清理了,然后就去尝试进入下一关
             if (EndlessLeveltate == LevelState.SpawningEnemies && IsAllWaveCompleted && NumberOfEnemies == 0)
             {
-                if (!UpdateLevel())
-                    ChangeLevelState(LevelState.AllEnemiesSpawned);
+                // 新手的话,第一关完了暂停
+                if (!GameConfig.IsNewbie)
+                {
+                    if (!UpdateLevel())
+                        ChangeLevelState(LevelState.AllEnemiesSpawned);
+                }
+                // else if (!isFirstLevelCompleted)
+                // {
+                //     isFirstLevelCompleted = true;
+                //     EndlessUIStart.instance.Pause();
+                //     // 第一关的怪全部被杀光
+                //     EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillDone);
+                // }
+                // else if (!isSecondLevelCompleted)
+                // {
+                //     Debug.Log("开始第三关???");
+                //     isSecondLevelCompleted = true;
+                //     //EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateThirdWave);
+                // }
             }
         }
 
@@ -316,12 +447,6 @@
 
             if (WaveManager != null)
                 WaveManager.AllWaveCompleted -= AllWaveCompleted;
-
-            // Iterate through home bases and unsubscribe
-            for (int i = 0; i < NumberOfHomeBases; i++)
-            {
-                HomeBases[i].died -= OnHomeBaseDestroyed;
-            }
         }
 
         /// <summary>
@@ -330,6 +455,36 @@
         protected virtual void AllWaveCompleted()
         {
             IsAllWaveCompleted = true;
+            int score = EndlessPortData.GetLevelScore(CurrentLevel);
+            Debug.Log($"--------------------- 通过第{CurrentLevel}关,+{score}分 ---------------------");
+            // 关卡通过,加分
+            EndlessScoreManager.instance.AddScore(score);
+            EndlessBossSkillManager.instance.ClearSkillList();
+            EndlessBossCtrl.instance.ChangeState(EndlessBossActionState.Death);
+
+            if (GameConfig.IsNewbie)
+            {
+                if (!isFirstLevelCompleted)
+                {
+                    isFirstLevelCompleted = true;
+                    EndlessUIStart.instance.Pause();
+                    // 第一关的怪全部被杀光
+                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillDone);
+                }
+                else if (!isSecondLevelCompleted)
+                {
+                    //Debug.Log("开始第三关???");
+                    isSecondLevelCompleted = true;
+                    EndlessUIStart.instance.Pause();
+                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillSecondDone);
+                }
+                else if (isFirstLevelCompleted && isSecondLevelCompleted && !isThirdLevelCompleted)
+                {
+                    isThirdLevelCompleted = true;
+                    EndlessUIStart.instance.Pause();
+                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillThirdDone);
+                }
+            }
         }
 
         /// <summary>
@@ -339,9 +494,6 @@
         {
             ++CurrentLevel;
             IsAllWaveCompleted = false;
-
-            // 进入boss虚弱状态
-            Debug.Log("--------------------- 进入boss虚弱状态 ---------------------");
 
             // 所有关卡全部结束
             if (CurrentLevel > EndlessPortData.MaxLevel)
@@ -353,12 +505,24 @@
         }
 
         /// <summary>
+        /// 新手更新关卡
+        /// </summary>
+        public void NewbieUpdateLevel()
+        {
+            ++CurrentLevel;
+            WaveManager.InitPort(CurrentLevel);
+            IsAllWaveCompleted = false;
+            EndlessUIStart.instance.Restart();
+            WaveManager.StartWaves(CurrentLevel);
+        }
+
+        /// <summary>
         /// 延迟进入下一关
         /// </summary>
         /// <returns></returns>
         private IEnumerator DelayToNextLevel()
         {
-            yield return new WaitForSeconds(5f);
+            yield return new WaitForSeconds(2f);
             BeginLevel();
         }
 
@@ -367,7 +531,44 @@
         /// </summary>
         private void BeginLevel()
         {
-            ShowSelectBuffUI();
+            if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
+
+            EndlessBossCtrl.instance.ClearBoss();
+
+            if (CurrentLevel == startLevel)
+                WaveManager.InitPort(CurrentLevel);
+
+            if (!GameConfig.IsNewbie)
+            {
+                // buff池的初始化要从正式关卡算起,不算新手关
+                EndlessBuffData.InitEndlessBuffPool(GameConfig.IsNewbieStart ? CurrentLevel - EndlessPortData.NewbieTotalLevel : CurrentLevel);
+                PopUpPanel();
+                EndlessRandomTower.instance.SetCountDown(false);
+            }
+            else
+            {
+                EndlessUIStart.instance.Restart();
+                WaveManager.StartWaves(CurrentLevel);
+            }
+        }
+
+        /// <summary>
+        /// 弹出面板
+        /// </summary>
+        private void PopUpPanel()
+        {
+            EndlessUIStart.instance.Pause();
+            List<List<EndlessPortConfig>> list = EndlessPortData.GetLevelWaveData(CurrentLevel);
+
+            if (list.Count > 0)
+            {
+                int level = list[0][0].Config.evolution_lv;
+
+                if (level > 0)
+                    ShowElfUpgradePanel(level);
+                else
+                    ShowSelectBuffUI();
+            }
         }
 
         /// <summary>
@@ -380,29 +581,40 @@
 
             if (list.Count == 0)
             {
-                isBuffSelectCompleted = false;
+                isPopDone = false;
                 return;
             }
 
-            EndlessUIStart.instance.SelectBuffUI.SetActive(true);
+            EndlessBuffSelect.instance.Refresh(list);
+            EndlessBuffSelect.instance.ShowBuffUI();
+        }
 
-            for (int i = 0; i < 3; ++i)
-            {
-                GameObject descObj = GameObject.Find($"BuffDesc{i}");
-                Text obj = descObj.GetComponent<Text>();
-                obj.text = list[i].Config.brief;
-            }
+        private void ShowElfUpgradePanel(int level)
+        {
+            GameObject elfUpgradeObj = Instantiate(Resources.Load<GameObject>("UI/ElfUpgrade/ElfUpgradePanel"), GameObject.Find("UICamera/BottomCanvas/Panel").transform);
+            elfPanelUpgrade = elfUpgradeObj.GetComponent<ElfUpgrade>();
+            elfPanelUpgrade.SetUpgradeLevel(level);
         }
 
         /// <summary>
         /// buff选择完成
         /// </summary>
         /// <param name="index"></param>
-        public void OnBuffSelectCompleted(int index)
+        private void OnBuffSelectCompleted(int index)
         {
-            EndlessUIStart.instance.SelectBuffUI.SetActive(false);
-            isBuffSelectCompleted = false;
+            isPopDone = false;
             EndlessBuffManager.instance.AddBuff(EndlessBuffData.GetBuffByIndex(index));
+            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBuffRefresh);
+        }
+
+        /// <summary>
+        /// 关闭了精灵升级界面
+        /// </summary>
+        private void ElfUpgradePanelClosed()
+        {
+            isPopDone = false;
+            EndlessGameUI.instance.UpgradeAllTowerMinLevel(elfPanelUpgrade.GetUpgradeLevel() - 1);
+            EndlessRandomTower.instance.SetCountDown(true, true);
         }
 
         /// <summary>
@@ -430,7 +642,7 @@
                     ChangeLevelState(LevelState.Win);
                     break;
                 case LevelState.Lose:
-                    SafelyCallLevelFailed();
+                    SafelyCallLevelCompleted();
                     break;
                 case LevelState.Win:
                     SafelyCallLevelCompleted();
@@ -453,11 +665,11 @@
                 homeBaseDestroyed();
             }
 
-            // If there are no home bases left and the level is not over then set the level to lost
-            if ((NumberOfHomeBasesLeft < 3) && !isGameOver)
-            {
-                ChangeLevelState(LevelState.Lose);
-            }
+            // // If there are no home bases left and the level is not over then set the level to lost
+            // if ((NumberOfHomeBasesLeft < 3) && !isGameOver)
+            // {
+            //     ChangeLevelState(LevelState.Lose);
+            // }
         }
 
         /// <summary>
@@ -465,6 +677,7 @@
         /// </summary>
         protected virtual void SafelyCallLevelCompleted()
         {
+            EndlessDropManager.instance.PickUpAllDrop();
             if (LevelCompleted != null)
                 LevelCompleted();
         }
@@ -485,15 +698,6 @@
         }
 
         /// <summary>
-        /// Calls the <see cref="levelFailed"/> event
-        /// </summary>
-        protected virtual void SafelyCallLevelFailed()
-        {
-            if (LevelFailed != null)
-                LevelFailed();
-        }
-
-        /// <summary>
         /// 兵线的所有基地都已经被摧毁,停止某一条兵线的出兵
         /// </summary>
         /// <param name="index"></param>
@@ -506,5 +710,43 @@
                 --WaveManager.TotalWaveLines;
             }
         }
+
+        /// <summary>
+        /// 暂停波次,小怪停止移动,塔停止攻击
+        /// </summary>
+        public void PauseWave()
+        {
+            EndlessUIStart.instance.Pause();
+            AgentInsManager.instance.SetWaveLineCanMove(-1, false, false);
+            WaveManager.PauseAllWave();
+            EndlessGameUI.instance.SetAttackingTowerState(false);
+        }
+
+        /// <summary>
+        /// 恢复波次,小怪
+        /// </summary>
+        public void RestartWave()
+        {
+            EndlessUIStart.instance.Restart();
+            AgentInsManager.instance.SetWaveLineCanMove(-1, true, false);
+            WaveManager.RestartAllWave();
+            EndlessGameUI.instance.SetAttackingTowerState(true);
+        }
+
+        /// <summary>
+        /// 停止第二关波次
+        /// </summary>
+        public void StopSecondWave()
+        {
+            if (!isStopSecondWaveCompleted)
+            {
+                isStopSecondWaveCompleted = true;
+                PauseWave();
+            }
+            //EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.SkillStep);
+            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.DragStep);
+        }
+
+
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1