wangguan
2020-12-29 452c75675679c44cc39b04bdb7d330d7c5c14d5c
Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
@@ -189,6 +189,9 @@
        /// </summary>
        Camera m_Camera;
        //Camera m_CameraBG;
        /// <summary>
        /// Current tower placeholder. Will be null if not in the <see cref="State.Building" /> state.
        /// </summary>
@@ -277,12 +280,12 @@
        //首次购买宝石特效
        public GameObject fireAppearEffect1;
        public GameObject fireAppearEffect2;
        //public GameObject fireAppearEffect2;
        public GameObject waterAppearEffect1;
        public GameObject waterAppearEffect2;
        //public GameObject waterAppearEffect2;
        public GameObject woodAppearEffect1;
        public GameObject woodAppearEffect2;
        //public GameObject woodAppearEffect2;
        /// <summary>
        /// 保存所有生成或合成的塔的最小等级
        /// </summary>
@@ -334,6 +337,44 @@
                disableRandomTowerBtn();
        }
        public void PlayBuffPS(int get_buffID)
        {
            //Debug.Log("开始播放特效");
            int targetID = 0;
            switch (get_buffID)
            {
                case 0:
                    //无特效
                    break;
                case 1:
                    for (int i = 0; i < m_listTower.Count; i++)
                    {
                        m_listTower[i].CurrentTowerLevel.ShowBuffPS();
                    }
                    break;
                case 2:
                    targetID = 101;
                    break;
                case 3:
                    targetID = 201;
                    break;
                case 4:
                    targetID = 301;
                    break;
            }
            if (targetID > 1)
            {
                for (int i = 0; i < m_listTower.Count; i++)
                {
                    if (m_listTower[i].ElfId == targetID)
                    {
                        m_listTower[i].CurrentTowerLevel.ShowBuffPS();
                    }
                }
            }
        }
        /// <summary>
        /// 根据塔位索引位置,查找位置上是否有对应的塔防数据。
        /// </summary>
@@ -348,6 +389,25 @@
                    return lt;
            }
            return null;
        }
        /// <summary>
        /// 根据塔位索引位置,查找位置上是否有对应的塔防数据。
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int GetTowerNum()
        {
            int num = 0;
            foreach (Tower lt in m_listTower)
            {
                if (lt.gridPosition.y == 0 || lt.gridPosition.y == 1)
                {
                    num++;
                }
            }
            return num;
        }
        public bool towerInList(Tower t)
@@ -491,6 +551,13 @@
            {
                return;
            }
            if (state == State.GameOver)
            {
                CommonDebugHelper.DebugError("已经游戏结束了,为什么还在修改状态");
                return;
            }
            CommonDebugHelper.Debug($"设置了状态 state:{state} newState:{newState} ");
            State oldState = state;
            if (oldState == State.Paused || oldState == State.GameOver)
            {
@@ -526,6 +593,8 @@
        /// </summary>
        public void GameOver()
        {
            CommonDebugHelper.Debug("游戏结束了");
            SetState(State.GameOver);
        }
@@ -643,7 +712,7 @@
            if ((m_GridPosition.x >= 0) && (m_GridPosition.y >= 0))
            {
                if (m_CurrentArea.isFreeAtackPos(m_GridPosition.x, m_GridPosition.y))
                if ((m_CurrentArea as TowerPlacementGridEndless).isFreeAtackPos(m_GridPosition.x, m_GridPosition.y))
                {
                    return true;
                }
@@ -793,7 +862,9 @@
                    PlayUpgradeEffect(m_listTower[i]);
                }
            }
            GameConfig.IsUpgradeTowerLevel = true;
            UpdateMinLevelArr();
            EndlessRandomTower.instance.UpdateDescDisplay();
        }
        /// <summary>
@@ -1119,28 +1190,32 @@
                {
                    if (m_GridPosition.y == 0 || m_GridPosition.y == 1)
                    {
                        Debug.Log("未上阵区域,不管有没有塔,都强行吸附");
                        //Debug.Log("未上阵区域,不管有没有塔,都强行吸附");
                        (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, "");
                        m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions);
                        m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y);
                        //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions);
                    }
                    else if (m_GridPosition.y == 2 || m_GridPosition.y == 3)
                    {
                        //Debug.Log("已上阵区域,如果是空格子就强行吸附,先判断是否有塔");
                        //pointerInfo.currentPosition += new Vector2(0, -25f);
                        checkTowerPlaceTower = isFreeAttackGridOnDrag(pointerInfo);
                        if (checkTowerPlaceTower != null)
                        {
                            Debug.Log(checkTowerPlaceTower.name);
                            //Debug.Log(checkTowerPlaceTower.name);
                            //Debug.Log($"checkTowerPlaceTower.name:{checkTowerPlaceTower.name}  m_GridPosition:{m_GridPosition}");
                            if (m_CurrentTower.controller.towerFeature == EFeatureTower.NULL)
                            {
                                if (checkTowerPlaceTower.bInAttackMode)
                                {
                                    //Debug.Log("检测到了塔");
                                    //鼠标检测到了塔
                                    (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, false, "");
                                    (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(checkTowerPlaceTower.gridPosition.x, checkTowerPlaceTower.gridPosition.y, false, "");
                                }
                                else
                                {
@@ -1161,7 +1236,11 @@
                                        }
                                    }
                                }
                                m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(checkTowerPlaceTower.gridPosition, m_CurrentTower.controller.dimensions);
                                m_CurrentTower.SetGridPosition(checkTowerPlaceTower.gridPosition.x, checkTowerPlaceTower.gridPosition.y);
                                //Debug.Log("未上阵区域,不管有没有塔,都强行吸附" + checkTowerPlaceTower.gridPosition);
                                //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(checkTowerPlaceTower.gridPosition, m_CurrentTower.controller.dimensions);
                            }
                        }
                        else if ((m_CurrentArea as TowerPlacementGridEndless).isFreeAtackPos(m_GridPosition.x, m_GridPosition.y))
@@ -1170,7 +1249,9 @@
                            (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, towerToMove.towerName);
                            m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions);
                            m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y);
                            //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions);
                        }
                        else
@@ -1184,13 +1265,21 @@
                                (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, towerToMove.towerName);
                                m_CurrentTower.transform.position = towerToMove.position;
                                //m_CurrentTower.transform.position = towerToMove.position;
                                m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y);
                            }
                            else
                            {
                                CloseCanPlace();
                                //CloseCanPlace();
                                //Debug.Log("上阵区域,没有开放的塔位");
                                (m_CurrentArea as TowerPlacementGridEndless).CheckCanPlaceUpdate(m_GridPosition.x, m_GridPosition.y, true, "");
                                m_CurrentTower.SetGridPosition(m_GridPosition.x, m_GridPosition.y);
                                //m_CurrentTower.transform.position = (m_CurrentArea as TowerPlacementGridEndless).GridToWorld(m_GridPosition, m_CurrentTower.controller.dimensions);
                            }
                        }
                    }
@@ -1200,7 +1289,8 @@
            else
            {
                dragTowerPlacement.CloseCanPlace();
                m_CurrentTower.SetGridPosition(-1, -1);
                //Debug.Log("没有检测到");
            }
        }
@@ -1298,14 +1388,65 @@
                return;
            }
            if (m_CurrentTower.gridPositionX != -1)
            {
                IntVector2 moveV2 = new IntVector2(m_CurrentTower.gridPositionX, m_CurrentTower.gridPositionY);
                //判断是否未开塔
                if (!dragTowerPlacement.IsGridOpen(moveV2.x, moveV2.y))
                {
                    //Debug.Log("未开塔");
                    CancelPlaceTower(pointerInfo);
                }
                else if (moveV2 == towerToMove.gridPosition)
                {
                    //Debug.Log($"在原位 moveV2:{moveV2}   towerToMove.gridPosition:{towerToMove.gridPosition}");
                    CancelPlaceTower(pointerInfo);
                }
                else
                {
                    //判断是否有塔
                    Tower tmpT = null;
                    for (int i = 0; i < m_listTower.Count; i++)
                    {
                        if (m_listTower[i].gridPosition == moveV2)
                        {
                            tmpT = m_listTower[i];
                            break;
                        }
                    }
                    if (tmpT != null)
                    {
                        //Debug.Log("释放的时候有塔");
                        DragBuyTower(tmpT);
                    }
                    else
                    {
                        //Debug.Log("释放的时候是空格子");
                        DragBuyTower(moveV2);
                    }
                }
            }
            else
            {
                //Debug.Log("不在区域内");
                CancelPlaceTower(pointerInfo);
            }
            return;
            // 判断目标位置是否有Tower且类型和等级一致,如果没有,则GhostTower删除,原Tower显示。
            if (isValidateCombineTarget(pointerInfo))
            {
                //Debug.Log("目标位置是否有同等级同类型的Tower.");
                TryPlaceTower(pointerInfo);
                EndlessRandomTower.instance.UpdateDescDisplay();
            }
            else if (isFreeAttackGrid(pointerInfo))
            {
                //Debug.Log("isFreeAttackGrid:" + m_GridPosition);
                if (!TryPlaceTower(pointerInfo, false))
                {
                    CancelPlaceTower(pointerInfo);
@@ -1326,6 +1467,8 @@
            }
            else if (EndlessLevelManager.instanceExists && IsSubstitute(pointerInfo))
            {
                //Debug.Log("交换");
                CheckCanChangePos(pointerInfo);
            }
            else
@@ -1341,7 +1484,7 @@
            if (sTower == null)
                return false;
            Debug.Log("开始检测是否可以交换塔");
            //Debug.Log("开始检测是否可以交换塔");
            //if (sTower.bInAttackMode == towerToMove.bInAttackMode)
            {
                IntVector2 v1 = new IntVector2(towerToMove.gridPosition.x, towerToMove.gridPosition.y);
@@ -1554,6 +1697,7 @@
            return controller;
        }
        private Vector2 dragOffect = new Vector2(0, -55f);
        /// <summary>
        /// Position the ghost tower at the given pointer
        /// </summary>
@@ -1566,15 +1710,29 @@
                return;
                //throw new InvalidOperationException("Trying to move the tower ghost when we don't have one");
            }
            // 我操,终于可以了!ATTENTION TO OPP:
            PointerInfo tp = new PointerActionInfo();
            tp.currentPosition = pointerInfo.currentPosition + dragOffect;
            tp.previousPosition = pointerInfo.previousPosition;
            tp.delta = pointerInfo.delta;
            tp.startedOverUI = pointerInfo.startedOverUI;
            UIPointer pointer = WrapPointer(pointerInfo);
            UIPointer npt = new UIPointer
            {
                overUI = false,
                pointer = tp,
                overWaveLine = false,
                ray = m_Camera.ScreenPointToRay(tp.currentPosition)
            };
            //UIPointer pointer = WrapPointer(tp);
            // Do nothing if we're over UI
            if (pointer.overUI && hideWhenInvalid)
            if (npt.overUI && hideWhenInvalid)
            {
                m_CurrentTower.Hide();
                return;
            }
            MoveGhost(pointer, hideWhenInvalid);
            MoveGhost(npt, hideWhenInvalid);
        }
        /// <summary>
@@ -1731,6 +1889,7 @@
        {
            if (!isBuilding) return false;
            //Debug.Log("开始造塔" + m_GridPosition);
            // 判断是否格子上重复放置塔防
            if (!m_CurrentTower || !IsGhostAtValidPosition())
            {
@@ -1763,6 +1922,7 @@
                        CancelGhostPlacement();
                        return false;
                    }
                    PlaceGhost(pointer);
                }
                return true;
@@ -1783,6 +1943,81 @@
            }
            return true;
        }
        private void DragBuyTower(Tower sTower)
        {
            Tower curTower = m_CurrentTower.controller;
            int testLvl = dragTowerLevel;
            if ((sTower.currentLevel == testLvl) &&
                (sTower.towerName == curTower.towerName))
            {
                // 先释放掉当前的Ghost塔防.
                CancelGhostPlacement();
                // 升级目标位置的塔防.
                currentSelectedTower = sTower;
                SetState(State.Normal);
                // 新的代码,合并升级为随机塔防类型.
                randomUpgradeTower();
            }
            else
            {
                IntVector2 v1 = new IntVector2(towerToMove.gridPosition.x, towerToMove.gridPosition.y);
                IntVector2 v2 = new IntVector2(sTower.gridPosition.x, sTower.gridPosition.y);
                Tower newTower1 = PlaceTowerForce(EndlessRandomTower.instance.getTowerByName(sTower.towerName), v1, sTower.currentLevel + 1, false);
                Tower newTower2 = PlaceTowerForce(m_CurrentTower.controller, v2, towerToMove.currentLevel + 1, false);
                if (towerToMove != null)
                {
                    delTower(towerToMove);
                    towerToMove.showTower(true);
                    towerToMove.Sell();
                    towerToMove = null;
                }
                delTower(sTower);
                sTower.showTower(true);
                sTower.Sell();
                sTower = null;
                CancelGhostPlacement();
                newTower1.placementArea.Occupy(newTower1.gridPosition, newTower1.dimensions);
                newTower2.placementArea.Occupy(newTower2.gridPosition, newTower2.dimensions);
                //强制交换塔的时候检查自身充能条
                newTower1.CheckCtrl();
                newTower2.CheckCtrl();
                //Debug.Log($"newTower1:{newTower1.towerName}  newTower2:{newTower2.towerName}");
                TowerPlacementGridEndless.instance.PlayPutPs(newTower2.gridPosition.x, newTower2.gridPosition.y);
            }
        }
        private void DragBuyTower(IntVector2 dragGridPosition)
        {
            Tower controller = m_CurrentTower.controller;
            Tower createdTower = Instantiate(controller);
            createdTower.Initialize(m_CurrentArea, dragGridPosition, dragTowerLevel);
            // ATTENTION TO FIX:是否应该加入List:
            addTower(createdTower);
            PlayToAttackEffect(createdTower.ElfId, createdTower.transform.position);
            dragTowerLevel = 0;
            CancelGhostPlacement();
            // 删除towerToMove,确保塔防数据不再出现多个
            if (towerToMove != null)
            {
                delTower(towerToMove);
                towerToMove.showTower(true);
                towerToMove.Sell();
                towerToMove = null;
            }
            if (m_CurrentTower != null && m_CurrentTower.controller != null)
                Destroy(m_CurrentTower.controller.gameObject);
        }
        /// <summary>
@@ -1910,7 +2145,7 @@
            {
                //火元素
                PlayAppearEffect(worldPos, fireAppearEffect1);
                PlayAppearEffect(worldPos, fireAppearEffect2);
                //PlayAppearEffect(worldPos, fireAppearEffect2);
                if (Application.platform == RuntimePlatform.WindowsEditor)
                {
                    //UnityEditor.EditorApplication.isPaused = true;
@@ -1920,14 +2155,14 @@
            {
                //木元素
                PlayAppearEffect(worldPos, woodAppearEffect1);
                PlayAppearEffect(worldPos, woodAppearEffect2);
                //PlayAppearEffect(worldPos, woodAppearEffect2);
            }
            else if (towerName.StartsWith("CopyCatTower"))
            {
                //水元素
                PlayAppearEffect(worldPos, waterAppearEffect1);
                PlayAppearEffect(worldPos, waterAppearEffect2);
                //PlayAppearEffect(worldPos, waterAppearEffect2);
            }
        }
        void PlayAppearEffect(Vector3 worldPos, GameObject prefab)
@@ -2188,6 +2423,8 @@
            }
            //placeObj = GameObject.FindGameObjectWithTag("PlaceTowerOpponent");
            EventCenter.Ins.Add((int)KTGMGemClient.EventType.EndlessHeartAllLose, AllHeartLose);
            EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.PlayBuffPS, PlayBuffPS);
        }
        /// <summary>
@@ -2273,7 +2510,6 @@
            bool successfulPurchase = EndlessLevelManager.instance.Currency.TryPurchase(cost);
            if (!successfulPurchase) return false;
            EndlessRandomTower.instance.UpdateDescDisplay();
            SetUpGhostTower(tow);
            //Debug.Log("设置影子塔防.");
            m_CurrentTower.Show();
@@ -2446,6 +2682,8 @@
            state = State.Normal;
            m_Camera = GameObject.Find("SceneCamera3D").GetComponent<Camera>();
            //m_Camera = GameObject.Find("BackCamera").GetComponent<Camera>();
            //m_Camera = GetComponent<Camera>();
            TowerDestroyArr = new bool[5, AttackRowNumbers];
        }
@@ -2561,7 +2799,7 @@
            // WORK START: 从这里开始,移动的时候与场景内的WaveSelEffect射线做碰撞。  
            // Raycast onto placement layer
            PlacementAreaRaycast(ref npt);
            //Debug.Log("npt.raycast:" + npt.raycast);
            if (npt.raycast != null)
            {
                MoveGhostWithRaycastHit(npt.raycast.Value);
@@ -2625,6 +2863,7 @@
                return;
            }
            m_GridPosition = m_CurrentArea.WorldToGrid(raycast.point, m_CurrentTower.controller.dimensions);
            //Debug.Log("修改了m_GridPosition:" + m_GridPosition);
            TowerFitStatus fits = m_CurrentArea.Fits(m_GridPosition, m_CurrentTower.controller.dimensions);
            m_CurrentTower.Show();
@@ -2675,10 +2914,12 @@
        /// <exception cref="InvalidOperationException">If we're not in the correct state</exception>
        protected void PlaceGhost(UIPointer pointer)
        {
            MoveGhost(pointer);
            //MoveGhost(pointer);
            if (m_CurrentArea != null)
            {
                //Debug.Log("开始检测PlaceGhost:" + m_GridPosition);
                TowerFitStatus fits = m_CurrentArea.Fits(m_GridPosition, m_CurrentTower.controller.dimensions);
                if (fits == TowerFitStatus.Fits)
@@ -2841,10 +3082,6 @@
            m_CurrentTower = Instantiate(towerToBuild.towerGhostPrefab);
            m_CurrentTower.Initialize(towerToBuild);
            Debug.Log("SetUpGhostTower:" + towerToBuild.gridPosition);
            Debug.Log("SetUpGhostTower:" + m_CurrentTower.controller.gridPosition);
        }
        /// <summary>