From e36f2a3ac098d6e89d3882f3354ec69c07e71e16 Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Tue, 01 Dec 2020 15:55:40 +0800
Subject: [PATCH] 代码结构修改

---
 Assets/Scripts/TowerDefense/Towers/Tower.cs |  395 +++++++++++++++++++++++++------------------------------
 1 files changed, 179 insertions(+), 216 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Towers/Tower.cs b/Assets/Scripts/TowerDefense/Towers/Tower.cs
index 1b0fae9..2462681 100644
--- a/Assets/Scripts/TowerDefense/Towers/Tower.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Tower.cs
@@ -1,4 +1,5 @@
-using System;
+using KTGMGemClient;
+using System;
 using ActionGameFramework.Health;
 using Core.Utilities;
 using TowerDefense.Level;
@@ -6,6 +7,7 @@
 using TowerDefense.Towers.Placement;
 using TowerDefense.UI.HUD;
 using UnityEngine;
+using TowerDefense.Agents;
 
 namespace TowerDefense.Towers
 {
@@ -25,6 +27,7 @@
         NULL,
         BULLET,   // 子弹塔
         ENERGY,   // 能量充能.
+        FREEZE, // 水精灵充能
         END
     }
 
@@ -33,7 +36,6 @@
     /// </summary>
     public class Tower : Targetable
     {
-        public readonly float INSCENE_TU_DAMAGE = 30f;
         public static readonly int MAX_LEVEL = 4;
 
         /// <summary>
@@ -55,27 +57,22 @@
         /// 当前塔防对应的MonsterMaterial,自身和对方显示不同的Mat.
         /// </summary>
         public Material materialMonsterSelf;
+
         public Material materialMonsterOppo;
-
-        /// <summary>
-        /// 当前塔防对应的攻击和等待Mat.
-        /// </summary>
-        public Material materialTowerAttackSelf;
-        public Material materialTowerWaitSelf;
-        public Material materialTowerAttackOppo;
-        public Material materialTowerWaitOppo;
-
-        /// <summary>
-        /// 0 空状态  1 等待状态  2 攻击状态.
-        /// </summary>
-        protected int curActionState = 0;
 
         /// <summary>
         /// 塔防对应的充能状态.
         /// </summary>
         public ETowerFuntion eTowerFuntion = ETowerFuntion.NULL;
+
+        [HideInInspector]
         public BulletUICtl bulletCtl = null;
+
+        [HideInInspector]
         public EnergyUICtl energyCtl = null;
+
+        [HideInInspector]
+        public FreezeBreath FreezeBreathCtrl = null;
 
         /// <summary>
         /// The tower levels associated with this tower
@@ -124,6 +121,20 @@
         /// </summary>
         protected int progressOffset = 0;
 
+        public int FreezeBreathProgressOffset { get; set; }
+
+        public bool PlayWaveLineFlash { get; set; } = true;
+
+        /// <summary>
+        /// 是否是木属性蓄力状态
+        /// </summary>
+        public bool IsWoodCharge { get; set; }
+
+        /// <summary>
+        /// 木属性蓄力瞄准的目标
+        /// </summary>
+        public Agent WoodAimAgent;
+
         /// <summary>
         /// 塔防数据的局内升级
         /// </summary>
@@ -134,9 +145,9 @@
 
         public int uiProOffset
         {
-            get { return this.progressOffset; } 
+            get { return progressOffset; }
+            set { progressOffset = value; }
         }
-
 
         /// <summary>
         /// Gets whether the tower can level up anymore
@@ -146,39 +157,10 @@
             get { return currentLevel == levels.Length - 1; }
         }
 
-        public void setTowerState(bool attack)
-        {
-            if (!materialTowerAttackSelf) return;
-
-            if (opponentSide)
-            {
-                if (attack && (this.curActionState != 2))
-                {
-                    currentTowerLevel.SetTowerMonsterMat(materialTowerAttackOppo);
-                    this.curActionState = 2;
-                }
-
-                if ((!attack) && (this.curActionState != 1))
-                {
-                    currentTowerLevel.SetTowerMonsterMat(materialTowerWaitOppo);
-                    this.curActionState = 1;
-                }
-            }
-            else
-            {
-                if (attack && (this.curActionState != 2))
-                {
-                    currentTowerLevel.SetTowerMonsterMat(materialTowerAttackSelf);
-                    this.curActionState = 2;
-                }
-
-                if ((!attack) && (this.curActionState != 1))
-                {
-                    currentTowerLevel.SetTowerMonsterMat(materialTowerWaitSelf);
-                    this.curActionState = 1;
-                }
-            }
-        }
+        /// <summary>
+        /// 是否可以攻击
+        /// </summary>
+        public bool CanAttack = true;
 
         /// <summary>
         /// 是否是对手塔防
@@ -186,49 +168,83 @@
         public bool opponentSide { get; set; }
 
         /// <summary>
+        /// 播放充能状态特效.
+        /// </summary>
+        /// <param name="play"></param>
+        public void PlayEnergyEffect(bool play, bool isClose = true)
+        {
+            if (energyCtl && isClose)
+                energyCtl.gameObject.SetActive(!play);
+            else if (!isClose)
+            {
+
+            }
+
+            if (!opponentSide)
+            {
+                if (GameUI.instanceExists)
+                    ((TowerPlacementGrid)GameUI.instance.selfTowerPlaceArea).PlayEnergyEffect(gridPosition.x, play);
+                else if (EndlessGameUI.instanceExists)
+                    ((TowerPlacementGridEndless)EndlessGameUI.instance.selfTowerPlaceArea).PlayEnergyEffect(gridPosition.x, gridPosition.y, play);
+            }
+            else
+                ((TowerPlacementGrid)OpponentMgr.instance.m_CurrentArea).PlayEnergyEffect(gridPosition.x, play);
+        }
+
+        /// <summary>
+        /// 播放水精灵充能满了特效
+        /// </summary>
+        /// <param name="play"></param>
+        /// <param name="isClose"></param>
+        public void PlayFreezeBreathEffect(bool play, bool isClose = true)
+        {
+            if (FreezeBreathCtrl && isClose)
+                FreezeBreathCtrl.gameObject.SetActive(!play);
+
+            if (!opponentSide)
+            {
+                if (EndlessGameUI.instanceExists)
+                    ((TowerPlacementGridEndless)EndlessGameUI.instance.selfTowerPlaceArea).PlayFreezeBreathEffect(gridPosition.x, gridPosition.y, play);
+            }
+        }
+
+        /// <summary>
         /// 当前是否处于攻击模式
         /// </summary>
         public bool bInAttackMode
         {
-            get { return this.m_bInAttackMode; }
+            get { return m_bInAttackMode; }
 
             // 设置是否处于攻击状态:
             set
             {
                 m_bInAttackMode = value;
                 currentTowerLevel.SetAffectorState(m_bInAttackMode, gridPosition.x);
+                currentTowerLevel.SetAttackState(value);
+
                 if (value)
                 {
                     if (opponentSide)
-                        currentTowerLevel.SetTowerMonsterMat(materialMonsterOppo);
-                    else
-                        currentTowerLevel.SetTowerMonsterMat(materialMonsterSelf);
-
-                    // 处理Tower
-                    this.setTowerState(false);
-
-                    if (opponentSide)
                     {
-                        OpponentMgr.instance.SetTowerAttID(gridPosition.x, attributeId, this.currentLevel);
+                        OpponentMgr.instance.SetTowerAttID(gridPosition.x, attributeId, currentLevel);
                     }
                     else
                     {
                         if (LevelManager.instanceExists)
                         {
-                            LevelManager.instance.SetTowerAttID(gridPosition.x, attributeId, this.currentLevel);
+                            LevelManager.instance.SetTowerAttID(gridPosition.x, attributeId, currentLevel);
                             WaveLineSelMgr.instance.attackTowerFixed(gridPosition.x);
                         }
                         else if (EndlessLevelManager.instanceExists)
                         {
-                            EndlessLevelManager.instance.SetTowerAttID(gridPosition.x, attributeId, this.currentLevel);
-                            EndlessWaveLineManager.instance.AttackTowerFixed(gridPosition.x);
+                            EndlessLevelManager.instance.SetTowerAttID(gridPosition.x, attributeId, currentLevel);
+                            EndlessWaveLineManager.instance.AttackTowerFixed(gridPosition.x, PlayWaveLineFlash);
                         }
                     }
 
                     // 处理塔位边上的界面.
                     OnTowerUICtrl();
                 }
-
             }
         }
 
@@ -238,12 +254,12 @@
         public void DisableTowerUICtrl()
         {
             // 根据是否是子弹塔防来决定是否显示相应的界面
-            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
 
-            if ((this.eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
             {
                 buc.gameObject.SetActive(false);
-                this.bulletCtl = null;
+                bulletCtl = null;
             }
 
             EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
@@ -251,130 +267,171 @@
             {
                 // 设置数据
                 euc.gameObject.SetActive(false);
-                this.energyCtl = null;
+                energyCtl = null;
             }
 
-            return;
-       }
+            FreezeBreath ctrl = placementArea.GetFreezeBreath(gridPosition.x, gridPosition.y);
+            if (eTowerFuntion == ETowerFuntion.FREEZE && ctrl != null)
+            {
+                ctrl.gameObject.SetActive(false);
+                ctrl = null;
+            }
+        }
 
         public int GetTowerUICtrlProgress()
         {
             // 根据是否是子弹塔防来决定是否显示相应的界面
-            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
 
-            if ((this.eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
                 return buc.GetCtlProgress();
 
             EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
             if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
                 return euc.GetCtlProgress();
 
+            FreezeBreath ctrl = placementArea.GetFreezeBreath(gridPosition.x, gridPosition.y);
+
+            if (eTowerFuntion == ETowerFuntion.FREEZE && ctrl != null)
+                return ctrl.CurrentProgress;
+
             return 0;
         }
 
-        public void SetTowerUICtlProcess( int pro)
+        public void SetTowerUICtlProcess(int pro)
         {
             // 根据是否是子弹塔防来决定是否显示相应的界面
-            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
 
-            if ((this.eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
             {
                 buc.SetCtlProcess(pro);
                 progressOffset = pro;
+                return;
             }
 
-                EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
+            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
             if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
             {
                 euc.SetCtlProcess(pro);
                 progressOffset = pro;
                 if (progressOffset == 10)
                     progressOffset = 0;
+                return;
             }
 
+            FreezeBreath ctrl = placementArea.GetFreezeBreath(gridPosition.x, gridPosition.y);
 
-
-                return;
+            if (eTowerFuntion == ETowerFuntion.FREEZE && ctrl != null)
+            {
+                ctrl.SetCtrlProgress(pro);
+                FreezeBreathProgressOffset = pro;
+                if (FreezeBreathProgressOffset == 10)
+                    FreezeBreathProgressOffset = 0;
+            }
         }
-
-
 
         /// <summary>
         /// 充能技能相关的代码开关。包括子弹充能和时间充能
         /// </summary>
         protected void OnTowerUICtrl()
         {
+            HandleBulletUICtrl();
+            HandleEnergyUICtrl();
+            HandleFreezeBreathCtrl();
+        }
+
+        private void HandleBulletUICtrl()
+        {
             // 根据是否是子弹塔防来决定是否显示相应的界面
-            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
 
             if (buc == null) return;
 
-            if ((this.eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
             {
                 // 设置数据
                 buc.gameObject.SetActive(true);
-                this.bulletCtl = buc;
-                buc.resetToMaxBullet();
+                bulletCtl = buc;
+                buc.ResetToMaxBullet();
             }
             else
             {
                 // 清空数据
                 buc.gameObject.SetActive(false);
-                this.bulletCtl = null;
+                bulletCtl = null;
             }
+        }
 
+        private void HandleEnergyUICtrl()
+        {
             // 根据是否是能量充能来决定是否显示相应的界面.
             EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
             if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
             {
                 // 设置数据
                 euc.gameObject.SetActive(true);
-                this.energyCtl = euc;
+                energyCtl = euc;
                 euc.SetEnergyProgress(0);
             }
             else
             {
                 // 清空数据
                 euc.gameObject.SetActive(false);
-                this.energyCtl = null;
+                energyCtl = null;
             }
+        }
+
+        private void HandleFreezeBreathCtrl()
+        {
+            FreezeBreath ctrl = placementArea.GetFreezeBreath(gridPosition.x, gridPosition.y);
+
+            if (eTowerFuntion == ETowerFuntion.FREEZE && ctrl != null)
+            {
+                ctrl.gameObject.SetActive(true);
+                FreezeBreathCtrl = ctrl;
+                ctrl.SetProgress(0);
+            }
+            else
+            {
+                ctrl.gameObject.SetActive(false);
+                FreezeBreathCtrl = null;
+            }
+        }
+
+        public void CheckCtrl()
+        {
+            if (bulletCtl != null)
+            {
+                bulletCtl.gameObject.SetActive(true);
+            }
+
+            if (energyCtl != null)
+            {
+                energyCtl.gameObject.SetActive(true);
+            }
+
+            if (FreezeBreathCtrl != null)
+                FreezeBreathCtrl.gameObject.SetActive(true);
         }
 
         /// <summary>
-        /// 初始化当前塔防的局内升级,lvl从1开始.
+        /// This function is called when the behaviour becomes disabled or inactive.
         /// </summary>
-        /// <param name="lvl"></param>
-        public void initInSceneTowerLevel(int lvl)
+        void OnDisable()
         {
-            inSceneTowerLevel = lvl;
-            if (lvl <= 1)
+            if (bulletCtl != null)
             {
-                ResetInSceneTowerLevel();
-                return;
+                bulletCtl.gameObject.SetActive(false);
             }
-            // 设置攻击数据的加强,暂时是测试数据,后面需要读取表格数据处理:
-            float damageAdd = (inSceneTowerLevel - 1) * this.INSCENE_TU_DAMAGE;
-            for (int ti = 0; ti < this.levels.Length; ti++)
-            {
-                if (levels[ti].levelDamager)
-                {
-                    levels[ti].levelDamager.doubleHit = bDoubleHitElit;
-                    levels[ti].levelDamager.inSceneUpGradeDamage = damageAdd;
-                }
-            }
-        }
 
-        protected void ResetInSceneTowerLevel()
-        {
-            for (int ti = 0; ti < this.levels.Length; ti++)
+            if (energyCtl != null)
             {
-                if (levels[ti].levelDamager)
-                {
-                    levels[ti].levelDamager.inSceneUpGradeDamage = 0;
-                    levels[ti].levelDamager.doubleHit = bDoubleHitElit;
-                }
+                energyCtl.gameObject.SetActive(false);
             }
-            return;
+
+            if (FreezeBreathCtrl != null)
+                FreezeBreathCtrl.gameObject.SetActive(false);
         }
 
         /// <summary>
@@ -384,18 +441,9 @@
         {
             inSceneTowerLevel++;
 
+            // cx test
             // 设置攻击数据的加强,暂时是测试数据,后面需要读取表格数据处理:
-            float damageAdd = inSceneTowerLevel * this.INSCENE_TU_DAMAGE;
-
-            for (int ti = 0; ti < this.levels.Length; ti++)
-            {
-                if (levels[ti].levelDamager)
-                {
-                    levels[ti].levelDamager.inSceneUpGradeDamage = damageAdd;
-                    levels[ti].levelDamager.towerName = name;
-                    levels[ti].levelDamager.bSet = true;
-                }
-            }
+            float damageAdd = inSceneTowerLevel;
 
             Debug.Log("Upgrade Tower name is:" + name);
 
@@ -420,14 +468,6 @@
         /// The placement area we've been built on
         /// </summary>
         public IPlacementArea placementArea { get; private set; }
-
-        /// <summary>
-        /// The purchase cost of the tower
-        /// </summary>
-        public int purchaseCost
-        {
-            get { return levels[0].cost; }
-        }
 
         /// <summary>
         /// The event that fires off when a player deletes a tower
@@ -457,38 +497,18 @@
             }
 
             SetLevel(lvl);
+
             if (LevelManager.instanceExists)
-            {
                 LevelManager.instance.levelStateChanged += OnLevelStateChanged;
-            }
             else if (EndlessLevelManager.instanceExists)
                 EndlessLevelManager.instance.LevelStateChanged += OnLevelStateChanged;
 
             // 查找Targetter:
-            Targetter target = this.GetComponentInChildren<Targetter>();
+            Targetter target = GetComponentInChildren<Targetter>();
             if (target)
-            {
-                target.bOpponent = this.opponentSide;
-            }
+                target.bOpponent = opponentSide;
             else
                 Debug.Log("在当前的Tower中找不到Targetter.");
-
-            // 
-            // 初始化当前的局内Tower等级数据
-            this.initInSceneTowerLevel(SceneTowerLvl.getInSceneTowerLvl(this.towerName));
-        }
-
-        /// <summary>
-        /// Provides information on the cost to upgrade
-        /// </summary>
-        /// <returns>Returns -1 if the towers is already at max level, other returns the cost to upgrade</returns>
-        public int GetCostForNextLevel()
-        {
-            if (isAtMaxLevel)
-            {
-                return -1;
-            }
-            return levels[currentLevel + 1].cost;
         }
 
         /// <summary>
@@ -499,11 +519,11 @@
         {
             if (vis)
             {
-                this.gameObject.SetActive(true);
+                gameObject.SetActive(true);
             }
             else
             {
-                this.gameObject.SetActive(false);
+                gameObject.SetActive(false);
             }
         }
 
@@ -515,38 +535,7 @@
             // Invoke base kill method
             Kill();
         }
-
-        /// <summary>
-        /// Provides the value recived for selling this tower
-        /// </summary>
-        /// <returns>A sell value of the tower</returns>
-        public int GetSellLevel()
-        {
-            return GetSellLevel(currentLevel);
-        }
-
-        /// <summary>
-        /// Provides the value recived for selling this tower of a particular level
-        /// </summary>
-        /// <param name="level">Level of tower</param>
-        /// <returns>A sell value of the tower</returns>
-        public int GetSellLevel(int level)
-        {
-            // sell for full price if waves haven't started yet
-            if (LevelManager.instanceExists && LevelManager.instance.levelState == LevelState.Building
-                || EndlessLevelManager.instanceExists && EndlessLevelManager.instance.EndlessLeveltate == LevelState.Building)
-            {
-                int cost = 0;
-                for (int i = 0; i <= level; i++)
-                {
-                    cost += levels[i].cost;
-                }
-
-                return cost;
-            }
-            return levels[currentLevel].sell;
-        }
-
+        
         /// <summary>
         /// Used to (try to) upgrade the tower data
         /// </summary>
@@ -606,9 +595,6 @@
         public override void Remove()
         {
             base.Remove();
-
-            // 清空局内升级数据:
-            ResetInSceneTowerLevel();
             attackRise = 0.0f;
             placementArea.Clear(gridPosition, dimensions);
             Destroy(gameObject);
@@ -648,10 +634,6 @@
             // initialize TowerLevel
             currentTowerLevel.Initialize(this, enemyLayerMask, configuration.alignmentProvider);
 
-            // health data
-            ScaleHealth();
-
-            // 
             // disable affectors
             LevelState levelState = LevelState.Intro;
             if (LevelManager.instanceExists)
@@ -661,25 +643,6 @@
             bool initialise = levelState == LevelState.AllEnemiesSpawned || levelState == LevelState.SpawningEnemies;
             initialise = false;
             currentTowerLevel.SetAffectorState(initialise, gridPosition.x);
-        }
-
-        /// <summary>
-        /// Scales the health based on the previous health
-        /// Requires override when the rules for scaling health on upgrade changes
-        /// </summary>
-        protected virtual void ScaleHealth()
-        {
-            configuration.SetMaxHealth(currentTowerLevel.maxHealth);
-
-            if (currentLevel == 0)
-            {
-                configuration.SetHealth(currentTowerLevel.maxHealth);
-            }
-            else
-            {
-                int currentHealth = Mathf.FloorToInt(configuration.normalisedHealth * currentTowerLevel.maxHealth);
-                configuration.SetHealth(currentHealth);
-            }
         }
 
         /// <summary>

--
Gitblit v1.9.1