wangguan
2020-12-15 0d6a2e6d4b9de57a13c2bcb32148e1eb97ef1b1f
Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
@@ -6,7 +6,6 @@
using TowerDefense.Towers.Data;
using TowerDefense.Towers.Placement;
using UnityEngine;
using UnityEngine.UI;
using KTGMGemClient;
using System.Collections;
using System.Collections.Generic;
@@ -23,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;
@@ -137,6 +178,8 @@
        /// </summary>
        public List<Node> StartingNodeList;
        public List<Node> EndNodeList;
        /// <summary>
        /// 已经完成的关卡数量
        /// </summary>
@@ -147,13 +190,67 @@
        /// </summary>
        /// <value></value>
        public int SelectBuffNeddLevels { get; set; }
        // cx test
        // 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>
        /// 切换基地
@@ -241,6 +338,7 @@
        /// </summary>
        public virtual void StartLevel()
        {
            EndlessPortData.Init();
            ChangeLevelState(LevelState.SpawningEnemies);
            SelfPlacementArea.startCoinGenMode();
        }
@@ -272,18 +370,26 @@
            // Iterate through home bases and subscribe
            NumberOfHomeBases = HomeBases.Length;
            NumberOfHomeBasesLeft = NumberOfHomeBases;
            for (int i = 0; i < NumberOfHomeBases; i++)
            {
                HomeBases[i].homebaseIdx = i % MAX_TOWER;
                HomeBases[i].died += OnHomeBaseDestroyed;
            }
        }
        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)
            {
                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);
            }
        }
        /// <summary>
@@ -291,23 +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;
                WaveManager.StartWaves(CurrentLevel);
                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);
                // }
            }
        }
@@ -320,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>
@@ -334,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>
@@ -343,9 +494,6 @@
        {
            ++CurrentLevel;
            IsAllWaveCompleted = false;
            // 进入boss虚弱状态
            Debug.Log("--------------------- 进入boss虚弱状态 ---------------------");
            // 所有关卡全部结束
            if (CurrentLevel > EndlessPortData.MaxLevel)
@@ -357,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();
        }
@@ -371,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>
@@ -384,23 +581,40 @@
            if (list.Count == 0)
            {
                isBuffSelectCompleted = false;
                isPopDone = false;
                return;
            }
            EndlessUIStart.instance.Pause();
            EndlessBuffSelect.instance.Refresh(list);
            EndlessBuffSelect.instance.ShowBuffUI();
        }
        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)
        {
            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>
@@ -463,6 +677,7 @@
        /// </summary>
        protected virtual void SafelyCallLevelCompleted()
        {
            EndlessDropManager.instance.PickUpAllDrop();
            if (LevelCompleted != null)
                LevelCompleted();
        }
@@ -495,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);
        }
    }
}