chenxin
2020-12-05 5bfd1103410659fbb523ad25f0e34413fe032ed2
Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
@@ -1,11 +1,8 @@
using System.Globalization;
using Core.Health;
using Core.Health;
using Core.Input;
using Core.Utilities;
using DG.Tweening;
using JetBrains.Annotations;
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using TowerDefense.Level;
@@ -15,7 +12,6 @@
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TowerDefense.Nodes;
using TowerDefense.Affectors;
using KTGMGemClient;
namespace TowerDefense.UI.HUD
@@ -127,11 +123,24 @@
        public TextMoveDoTween bloodCrit;
        /// <summary>
        /// 减速飘字
        /// </summary>
        public Image SlowDownWord;
        /// <summary>
        /// 暴击飘字
        /// </summary>
        public Image CritWord;
        /// <summary>
        /// 冰冻飘字
        /// </summary>
        public Image FrostWord;
        /// <summary>
        /// 购买塔防按钮上的Text.
        /// </summary>
        protected TextMeshProUGUI towerPriceText;
        //protected TextMeshProUGUI towerPriceText1;
        protected bool tdBuyDisable = false;
@@ -571,7 +580,7 @@
                if (tower.towerName != towerOld.towerName)
                    continue;
                newT = Instantiate(tower, transform);
                newT = tower;
                break;
            }
@@ -585,7 +594,7 @@
            SetToDragMode(newT);
            if (towerOld.towerFeature == EFeatureTower.Skill_Bomb)
                m_CurrentTower.SetAttackArea(dragTowerLevel, towerOld.attributeId);
                m_CurrentTower.SetAttackArea(dragTowerLevel, towerOld.ElfId);
        }
        /// <summary>
@@ -673,12 +682,16 @@
            if (!m_CurrentTower || !IsGhostAtValidPosition())
            {
                // 最大级别的Tower不能再合并了.
                if (towerToMove.isAtMaxLevel)
                if (towerToMove.IsMaxLevel)
                    return false;
                // 判断格子上的塔防:
                UIPointer pointer = WrapPointer(pinfo);
                Tower sTower = PickTowerInGrid(pointer);
                // 泡泡禁锢状态不允许合并
                if (sTower && sTower.IsStartBondage) return false;
                if (sTower && sTower != towerToMove)
                {
                    int testLvl = dragTowerLevel;
@@ -702,6 +715,9 @@
                // 判断格子上的塔防:
                UIPointer pointer = WrapPointer(pinfo);
                Tower sTower = PickTowerInGrid(pointer);
                // 泡泡禁锢状态不允许置换
                if (sTower && sTower.IsStartBondage) return false;
                if (sTower && sTower != towerToMove)
                {
@@ -863,6 +879,7 @@
            EndlessBossSkillManager.instance.ClearSkillList();
            EndlessBossHPManager.instance.SwitchHP(true);
            EndlessBossHPManager.instance.SetCurrentHP(0);
            EndlessLevelManager.instance.WaveManager.HideTunel();
            // 停止所有兵线的出兵
            for (int i = 0; i < TotalWaveLines; ++i)
@@ -1004,14 +1021,14 @@
                                if (bInAttackModeTower == null)
                                {
                                    bInAttackModeTower = checkTowerPlaceTower;
                                    bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                                    bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                                }
                                else if (bInAttackModeTower != checkTowerPlaceTower)
                                {
                                    bInAttackModeTower.currentTowerLevel.SetCanPlace(false);
                                    bInAttackModeTower.CurrentTowerLevel.SetCanPlace(false);
                                    bInAttackModeTower = checkTowerPlaceTower;
                                    bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                                    bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                                }
                            }
@@ -1023,14 +1040,14 @@
                        if (bInAttackModeTower == null)
                        {
                            bInAttackModeTower = checkTowerPlaceTower;
                            bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                            bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                        }
                        else if (bInAttackModeTower != checkTowerPlaceTower)
                        {
                            bInAttackModeTower.currentTowerLevel.SetCanPlace(false);
                            bInAttackModeTower.CurrentTowerLevel.SetCanPlace(false);
                            bInAttackModeTower = checkTowerPlaceTower;
                            bInAttackModeTower.currentTowerLevel.SetCanPlace(true);
                            bInAttackModeTower.CurrentTowerLevel.SetCanPlace(true);
                        }
                    }
                }
@@ -1069,7 +1086,7 @@
            dragTowerPlacement.CloseCanPlace();
            if (bInAttackModeTower != null)
            {
                bInAttackModeTower.currentTowerLevel.SetCanPlace(false);
                bInAttackModeTower.CurrentTowerLevel.SetCanPlace(false);
                bInAttackModeTower = null;
            }
        }
@@ -1162,7 +1179,7 @@
                }
                else
                {
                    GuideCtrl.Ins.EndDrag11_1();
                    GuideCtrl.Ins.EndDrag5_1();
                    CancelPlaceTower(pointerInfo);
                    Debug.Log("没有放置在火塔上");
                }
@@ -1178,7 +1195,7 @@
            }
            else if (isFreeAttackGrid(pointerInfo) && !bSkill)
            {
                if (!TryPlaceTower(pointerInfo, false, true))
                if (!TryPlaceTower(pointerInfo, false))
                {
                    CancelPlaceTower(pointerInfo);
                    Debug.Log("这里需要返回原位");
@@ -1193,6 +1210,8 @@
                    towerToMove.Sell();
                    towerToMove = null;
                }
                if (m_CurrentTower != null && m_CurrentTower.controller != null)
                    Destroy(m_CurrentTower.controller.gameObject);
            }
            else if (EndlessLevelManager.instanceExists && IsSubstitute(pointerInfo))
            {
@@ -1289,8 +1308,7 @@
            Tower controller = currentTower.controller;
            Tower createdTower = Instantiate(controller);
            createdTower.PlayWaveLineFlash = playEffect;
            createdTower.Initialize(m_CurrentArea, pos);
            createdTower.SetLevel(level - 1);
            createdTower.Initialize(m_CurrentArea, pos, level - 1);
            if (playEffect)
                PlayUpgradeEffect(createdTower);
@@ -1319,7 +1337,7 @@
                ray = m_Camera.ScreenPointToRay(tp.currentPosition)
            };
            int sId = towerToMove.attributeId;
            int sId = towerToMove.ElfId;
            int sLevel = towerToMove.currentLevel;
            // 火是列攻击:
@@ -1409,7 +1427,7 @@
        /// Attempt to position a tower at the given location
        /// </summary>
        /// <param name="pointerInfo">The pointer we're using to position the tower</param>
        public bool TryPlaceTower(PointerInfo pointerInfo, bool force = false, bool zeroCost = false)
        public bool TryPlaceTower(PointerInfo pointerInfo, bool force = false)
        {
            UIPointer pointer = WrapPointer(pointerInfo);
@@ -1420,7 +1438,7 @@
                return false;
            }
            return BuyTower(pointer, force, zeroCost);
            return BuyTower(pointer, force);
        }
        /// <summary>
@@ -1520,16 +1538,11 @@
            {
                throw new InvalidOperationException("Selected Tower is null");
            }
            if (currentSelectedTower.isAtMaxLevel)
            if (currentSelectedTower.IsMaxLevel)
            {
                return;
            }
            int upgradeCost = currentSelectedTower.GetCostForNextLevel();
            bool successfulUpgrade = EndlessLevelManager.instance.Currency.TryPurchase(upgradeCost);
            if (successfulUpgrade)
            {
                currentSelectedTower.UpgradeTower();
            }
            currentSelectedTower.UpgradeTower();
            DeselectTower();
        }
@@ -1546,7 +1559,7 @@
            {
                throw new InvalidOperationException("Selected Tower is null");
            }
            if (currentSelectedTower.isAtMaxLevel)
            if (currentSelectedTower.IsMaxLevel)
                return false;
            // 直接随机升级,零成本。
@@ -1586,15 +1599,10 @@
            {
                throw new InvalidOperationException("Selected Tower is null");
            }
            int sellValue = currentSelectedTower.GetSellLevel();
            if (EndlessLevelManager.instanceExists && sellValue > 0)
            {
                EndlessLevelManager.instance.Currency.AddCurrency(sellValue);
                currentSelectedTower.Sell();
            currentSelectedTower.Sell();
                // 从列表中删除Tower.
                delTower(currentSelectedTower);
            }
            // 从列表中删除Tower.
            delTower(currentSelectedTower);
            DeselectTower();
        }
@@ -1614,12 +1622,7 @@
            {
                return;
            }
            int cost = m_CurrentTower.controller.purchaseCost;
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(cost);
            if (successfulPurchase)
            {
                PlaceTower();
            }
            PlaceTower();
        }
        /// <summary>
@@ -1629,7 +1632,7 @@
        /// Throws exception when not in a build mode or when tower is not a valid position
        /// </exception>
        /// </summary>
        public bool BuyTower(UIPointer pointer, bool force = false, bool zeroCost = false)
        public bool BuyTower(UIPointer pointer, bool force = false)
        {
            if (!isBuilding) return false;
@@ -1678,10 +1681,7 @@
                return false;
            }
            int cost = m_CurrentTower.controller.purchaseCost;
            if (zeroCost)
                cost = 0;
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(cost);
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(0);
            if (successfulPurchase)
            {
                PlaceGhost(pointer);
@@ -1696,28 +1696,7 @@
        /// <param name="worldPos"></param>
        public void PlayUpgradeEffect(Tower newTower)
        {
            newTower.currentTowerLevel.PlayUpGradeEffect();
            // GameObject effect = TowerUpgradeEffectPrefab;
            // if (newTower.towerFeature == EFeatureTower.NULL)
            // {
            //     string path = $"UI/ToBattle_{newTower.attributeId}";
            //     GameObject prefab = Resources.Load<GameObject>(path);
            //     effect = Instantiate(prefab);
            // }
            // // 在sTower的位置播放升级特效
            // GameObject obj = Instantiate(effect);
            // obj.transform.position = newTower.transform.position;
            // Vector3 pos = obj.transform.position;
            // pos.y += 5f;
            // obj.transform.position = pos;
            // ParticleSystem ps = obj.GetComponent<ParticleSystem>();
            // if (ps == null)
            //     ps = obj.transform.GetChild(0).GetComponent<ParticleSystem>();
            // ps.Play();
            // Destroy(obj, ps.main.duration);
            newTower.CurrentTowerLevel.PlayUpGradeEffect();
        }
        /// <summary>
@@ -1776,7 +1755,7 @@
            if (m_CurrentTower == null || m_CurrentArea == null)
                return false;
            return EndlessLevelManager.instance.Currency.CanAfford(m_CurrentTower.controller.purchaseCost);
            return true;
        }
        /// <summary>
@@ -2049,16 +2028,45 @@
            if (tm)
            {
                tm.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), true);
                string bloodStr = "";
                if (doubleHit)
                    bloodStr += "Dble!";
                if (crit)
                    bloodStr += "Crt!";
                bloodStr += "-";
                string bloodStr = "-";
                bloodStr += ((Int64)val).ToString();
                tm.moveBloodText(spos.x, spos.y, bloodStr, crit);
            }
        }
        /// <summary>
        /// 减速飘字
        /// </summary>
        public void FloatSlowDownWord(Vector3 worldPos)
        {
            Vector3 screenPos = m_Camera.WorldToScreenPoint(worldPos);
            GameObject obj = Instantiate(SlowDownWord.gameObject);
            obj.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), false);
            obj.GetComponent<TextMoveDoTween>().FloatSlowDownWord(screenPos.x, screenPos.y);
        }
        /// <summary>
        /// 暴击飘字
        /// </summary>
        public void FloatCritWord(Vector3 worldPos)
        {
            Vector3 screenPos = m_Camera.WorldToScreenPoint(worldPos);
            GameObject obj = Instantiate(CritWord.gameObject);
            obj.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), false);
            obj.GetComponent<TextMoveDoTween>().FloatCritWord(screenPos.x, screenPos.y);
        }
        /// <summary>
        /// 冰冻飘字
        /// </summary>
        /// <param name="worldPos"></param>
        public void FloatFrostWord(Vector3 worldPos)
        {
            Vector3 screenPos = m_Camera.WorldToScreenPoint(worldPos);
            GameObject obj = Instantiate(FrostWord.gameObject);
            obj.GetComponent<Transform>().SetParent(GameObject.Find("MainUI/TextPanel").GetComponent<Transform>(), false);
            obj.GetComponent<TextMoveDoTween>().FloatFrostWord(screenPos.x, screenPos.y);
        }
        private void Start()
@@ -2233,6 +2241,9 @@
            var controller = output.collider.GetComponent<Tower>();
            if (controller != null)
            {
                // 泡泡禁锢状态不允许拖动
                if (controller.IsStartBondage) return;
                SelectTower(controller);
            }
@@ -2240,7 +2251,21 @@
            CalSelTowerScreenOffset(info, controller);
        }
        public void OnPressed(PointerInfo info)
        {
            UIPointer uiPointer = WrapPointer(info);
            RaycastHit output;
            bool hasHit = Physics.Raycast(uiPointer.ray, out output, float.MaxValue, towerSelectionLayer);
            if (uiPointer.overUI) return;
            if (hasHit)
            {
                Tower controller = output.collider.GetComponent<Tower>();
                if (controller != null)
                    controller.OnPressed();
            }
        }
        /// <summary>
        /// 鼠标选中一个Tower的时候,计算当前鼠标位置与当前Tower位置在屏幕上坐标位置的偏移量。
@@ -2315,22 +2340,6 @@
            m_Camera = GameObject.Find("SceneCamera3D").GetComponent<Camera>();
            //m_Camera = GetComponent<Camera>();
            TowerDestroyArr = new bool[5, AttackRowNumbers];
        }
        /// <summary>
        /// 战场内所有的Tower实例都需要升级相关的数据.
        /// 找到相同类型的所有Tower,然后进行局内升级的修改。
        /// </summary>
        /// <param name="td"></param>
        protected void towerUpgradeInBattle(TowerLevelUp tlu)
        {
            foreach (Tower tower in m_listTower)
            {
                if (tlu.towerName != tower.towerName)
                    continue;
                tower.upGradeInSceneTL();
            }
            return;
        }
        /// <summary>
@@ -2566,12 +2575,11 @@
                    // Place the ghost
                    Tower controller = m_CurrentTower.controller;
                    Tower createdTower = Instantiate(controller);
                    createdTower.Initialize(m_CurrentArea, m_GridPosition);
                    createdTower.SetLevel(dragTowerLevel);
                    createdTower.Initialize(m_CurrentArea, m_GridPosition, dragTowerLevel);
                    // ATTENTION TO FIX:是否应该加入List:
                    addTower(createdTower);
                    PlayToAttackEffect(createdTower.attributeId, createdTower.transform.position);
                    PlayToAttackEffect(createdTower.ElfId, createdTower.transform.position);
                    dragTowerLevel = 0;
                    CancelGhostPlacement();
                }
@@ -2581,11 +2589,11 @@
        /// <summary>
        /// 播放宝石上阵特效
        /// </summary>
        /// <param name="attributeId">101 火,105 水,109 木</param>
        /// <param name="ElfId">101 火,201 水,301 木</param>
        /// <param name="worldPos">世界坐标</param>
        public void PlayToAttackEffect(int attributeId, Vector3 worldPos)
        public void PlayToAttackEffect(int ElfId, Vector3 worldPos)
        {
            string path = $"UI/DengChang_{attributeId}";
            string path = $"UI/DengChang_{ElfId}";
            GameObject prefab = Resources.Load<GameObject>(path);
            GameObject obj = Instantiate(prefab);