From 58cb0692ed67a4108b51e31b765db4c3483e3df7 Mon Sep 17 00:00:00 2001
From: wangguan <wangguan@kt007.com>
Date: Fri, 11 Dec 2020 21:42:55 +0800
Subject: [PATCH] 新手引导开宝箱音效

---
 Assets/Scripts/TowerDefense/Towers/Tower.cs |  777 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 572 insertions(+), 205 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Towers/Tower.cs b/Assets/Scripts/TowerDefense/Towers/Tower.cs
index 9b7d72b..bc7139a 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,9 @@
 using TowerDefense.Towers.Placement;
 using TowerDefense.UI.HUD;
 using UnityEngine;
+using TowerDefense.Agents;
+using System.Collections;
+using System.Collections.Generic;
 
 namespace TowerDefense.Towers
 {
@@ -25,6 +29,7 @@
         NULL,
         BULLET,   // 子弹塔
         ENERGY,   // 能量充能.
+        FREEZE, // 水精灵充能
         END
     }
 
@@ -33,9 +38,6 @@
     /// </summary>
     public class Tower : Targetable
     {
-        public readonly float INSCENE_TU_DAMAGE = 30f;
-        public static readonly int MAX_LEVEL = 4;
-
         /// <summary>
         /// A generalised name common to a levels
         /// </summary>
@@ -52,30 +54,31 @@
         public EFeatureTower towerFeature = EFeatureTower.NULL;
 
         /// <summary>
-        /// 当前塔防对应的MonsterMaterial,自身和对方显示不同的Mat.
-        /// </summary>
-        public Material materialMonsterSelf;
-        public Material materialMonsterOppo;
-
-        /// <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
         /// </summary>
-        public TowerLevel[] levels;
+        [SerializeField]
+        private TowerLevel towerLevel;
+
+        public TowerLevel CurrentTowerLevel { get; private set; }
 
         /// <summary>
-        /// 当前塔防对应的AttributeID.
+        /// 精灵id,一一对应 elf_info表中的id,唯一的区分每一种精灵塔
         /// </summary>
-        public int attributeId;
-
-        /// <summary>
-        /// 当前的Tower在游戏内UI界面上用到的Image数据,再以后应该是直接在表格内配置才合适
-        /// </summary>
-        public Sprite uiImage;
+        public int ElfId;
 
         /// <summary>
         /// The physics mask the tower searches on
@@ -85,19 +88,9 @@
         /// <summary>
         /// The current level of the tower
         /// </summary>
-        public int currentLevel { get; protected set; }
+        public int currentLevel { get; set; }
 
         protected bool m_bInAttackMode = false;
-
-        /// <summary>
-        /// 精英怪和Boss双倍伤害.
-        /// </summary>
-        public bool bDoubleHitElit = false;
-
-        /// <summary>
-        /// Reference to the data of the current level
-        /// </summary>
-        public TowerLevel currentTowerLevel { get; protected set; }
 
         /// <summary>
         /// 攻击增加
@@ -105,20 +98,74 @@
         public float attackRise { get; set; }
 
         /// <summary>
-        /// 塔防数据的局内升级
+        /// 用于界面部分的数据位移
         /// </summary>
-        public int inSceneTowerLevel
+        protected int progressOffset = 0;
+
+        public int FreezeBreathProgressOffset { get; set; }
+
+        public bool PlayWaveLineFlash { get; set; } = true;
+
+        private bool isBondage;
+
+        /// <summary>
+        /// 是否是泡泡禁锢状态
+        /// </summary>
+        /// <value></value>
+        public bool IsBondage
         {
-            get; set;
+            get { return isBondage; }
+            set
+            {
+                isBondage = value;
+                CanAttack = !value;
+            }
+        }
+
+        /// <summary>
+        /// 禁锢时间
+        /// </summary>
+        public float BondageTime { get; set; }
+
+        /// <summary>
+        /// 禁锢警告时间
+        /// </summary>
+        /// <value></value>
+        public float BondageWarningTime { get; set; }
+
+        /// <summary>
+        /// 泡泡禁锢期间,点击一次减少的时间
+        /// </summary>
+        public float BondageClickDecreaseTime { get; set; } = 1f;
+
+        /// <summary>
+        /// 是否是木属性蓄力状态
+        /// </summary>
+        public bool IsWoodCharge { get; set; }
+
+        /// <summary>
+        /// 木属性蓄力瞄准的目标
+        /// </summary>
+        public Agent WoodAimAgent;
+
+        public int uiProOffset
+        {
+            get { return progressOffset; }
+            set { progressOffset = value; }
         }
 
         /// <summary>
         /// Gets whether the tower can level up anymore
         /// </summary>
-        public bool isAtMaxLevel
+        public bool IsMaxLevel
         {
-            get { return currentLevel == levels.Length - 1; }
+            get { return currentLevel == ElfUpgradeData.MaxTowerLevel - 1; }
         }
+
+        /// <summary>
+        /// 是否可以攻击
+        /// </summary>
+        public bool CanAttack = true;
 
         /// <summary>
         /// 是否是对手塔防
@@ -126,90 +173,512 @@
         public bool opponentSide { get; set; }
 
         /// <summary>
+        /// 禁锢警告
+        /// </summary>
+        protected GameObject bondageWarningObj;
+
+        /// <summary>
+        /// 禁锢泡泡
+        /// </summary>
+        protected GameObject bondageObj;
+
+        private GameObject tapObj;
+
+        /// <summary>
+        /// 精灵被禁锢时点击次数
+        /// </summary>
+        public int BondageTapCount { get; private set; }
+
+        /// <summary>
+        /// 泡泡上升高度
+        /// </summary>
+        private float yAdd = 10f;
+
+        /// <summary>
+        /// 原始y值
+        /// </summary>
+        private float originY;
+
+        /// <summary>
+        /// 是否开始禁锢
+        /// </summary>
+        public bool IsStartBondage { get; set; }
+
+        private float bombDuration = 0.7f;
+
+        private float bombTime;
+
+        /// <summary>
+        /// 爆炸是否结束
+        /// </summary>
+        private bool isBombCompleted;
+
+        private void Start()
+        {
+            originY = transform.position.y;
+            promptDic = new Dictionary<string, bool>();
+        }
+
+        private void Update()
+        {
+            HandleBondageBubble();
+        }
+
+        private static Dictionary<string, bool> promptDic;
+
+        /// <summary>
+        /// 处理禁锢泡泡技能
+        /// </summary>
+        private void HandleBondageBubble()
+        {
+            if (IsStartBondage)
+            {
+                if (isBondage)
+                {
+                    if (transform.position.y < yAdd + originY && bondageObj != null)
+                    {
+                        // 上升状态
+                        Vector3 pos = transform.position;
+                        pos.y += 28f * Time.deltaTime;
+                        transform.position = pos;
+
+                        pos = bondageObj.transform.position;
+                        pos.y += 28f * Time.deltaTime;
+                        bondageObj.transform.position = pos;
+                    }
+                }
+                else
+                {
+                    if (!isBombCompleted)
+                    {
+                        bombTime += Time.deltaTime;
+
+                        if (bombTime > bombDuration)
+                        {
+                            // 爆炸结束开始下降
+                            isBombCompleted = true;
+                        }
+                    }
+                    else
+                    {
+                        if (transform.position.y > originY)
+                        {
+                            // 下降状态
+                            Vector3 pos = transform.position;
+                            pos.y -= 55f * Time.deltaTime;
+                            transform.position = pos;
+                        }
+                        else
+                        {
+                            // 下降结束
+                            IsStartBondage = false;
+                        }
+                    }
+                }
+            }
+
+            if (!IsBondage) return;
+
+            if (BondageWarningTime > 0)
+            {
+                BondageWarningTime -= Time.deltaTime;
+
+                if (BondageWarningTime <= 0)
+                {
+                    DestroyBondageWarningObj();
+                    StartBondage();
+                    ShowTapPrompt();
+                }
+            }
+            else
+            {
+                BondageTime -= Time.deltaTime;
+
+                if (BondageTime <= 0)
+                {
+                    DestroyBondageWarningObj();
+                    HideTapPrompt();
+                    IsBondage = false;
+                    Destroy(bondageObj);
+                    bondageObj = null;
+                    BondageBubbleBomb();
+                }
+            }
+        }
+
+        private void DestroyBondageWarningObj()
+        {
+            if (bondageWarningObj == null) return;
+
+            ParticleSystem ps = bondageWarningObj.transform.GetChild(0).GetComponent<ParticleSystem>();
+            ps.Stop();
+            ps.Clear();
+            Destroy(bondageWarningObj);
+            bondageWarningObj = null;
+        }
+
+        /// <summary>
+        /// 展示连续点击提示
+        /// </summary>
+        private void ShowTapPrompt()
+        {
+            string key = $"{gridPosition.x}";
+            if (promptDic.ContainsKey(key)) return;
+
+            promptDic.Add(key, true);
+            GameObject prefab = Resources.Load<GameObject>("Prefabs/Endless/BondageBubbleTap");
+            tapObj = Instantiate(prefab);
+            tapObj.transform.SetParent(TowerPlacementGridEndless.instance.GridContainer.transform, false);
+            Vector3 worldPos = TowerPlacementGridEndless.instance.GetGridWorldPos(gridPosition.x, 3);
+            ParticleSystem ps = tapObj.transform.GetChild(0).GetComponent<ParticleSystem>();
+            tapObj.transform.position = worldPos;
+            Vector3 pos = tapObj.transform.position;
+            pos.x += 5.8f;
+            pos.z += 3f;
+            pos.y = 20f;
+            tapObj.transform.position = pos;
+            ps?.Play();
+        }
+
+        private void HideTapPrompt()
+        {
+            if (tapObj != null)
+            {
+                ParticleSystem ps = tapObj.transform.GetChild(0).GetComponent<ParticleSystem>();
+                ps?.Stop();
+                Destroy(tapObj);
+                tapObj = null;
+
+                string key = $"{gridPosition.x}";
+                if (promptDic.ContainsKey(key))
+                    promptDic.Remove(key);
+            }
+        }
+
+        public void OnPressed()
+        {
+            if (!IsStartBondage || BondageWarningTime > 0) return;
+
+            ++BondageTapCount;
+
+            if (BondageTapCount >= 3)
+                HideTapPrompt();
+            BondageTime -= BondageClickDecreaseTime;
+        }
+
+        /// <summary>
+        /// 禁锢泡泡爆炸
+        /// </summary>
+        private void BondageBubbleBomb()
+        {
+            GameObject prefab = Resources.Load<GameObject>("Prefabs/Endless/BondageBubbleBomb");
+            GameObject obj = Instantiate(prefab);
+            obj.transform.SetParent(TowerPlacementGridEndless.instance.GridContainer.transform, false);
+            obj.transform.position = transform.position;
+            obj.transform.GetChild(0).GetComponent<ParticleSystem>().Play();
+            Destroy(obj, 1.2f);
+            AudioSourceManager.Ins.StopBossWaterSkill();
+
+        }
+
+        /// <summary>
+        /// 开始泡泡禁锢
+        /// </summary>
+        private void StartBondage()
+        {
+            bombTime = 0;
+            BondageTapCount = 0;
+            isBombCompleted = false;
+            GameObject prefab = Resources.Load<GameObject>("Prefabs/Endless/BondageBubble");
+            bondageObj = Instantiate(prefab);
+            bondageObj.transform.SetParent(TowerPlacementGridEndless.instance.GridContainer.transform, false);
+            bondageObj.transform.position = transform.position;
+            Vector3 pos = bondageObj.transform.position;
+            pos.y += gridPosition.y == 3 ? 2f : 1f;
+            bondageObj.transform.position = pos;
+            bondageObj.transform.GetChild(0).GetComponent<ParticleSystem>().Play();
+            AudioSourceManager.Ins.Play(AudioEnum.BossWaterSkill);
+
+        }
+
+        /// <summary>
+        /// 禁锢警告
+        /// </summary>
+        /// <param name="tower"></param>
+        public void BondageWarning()
+        {
+            GameObject prefab = Resources.Load<GameObject>("Prefabs/Endless/BondageBubbleWarning");
+            bondageWarningObj = Instantiate(prefab);
+            bondageWarningObj.transform.SetParent(TowerPlacementGridEndless.instance.GridContainer.transform, false);
+            bondageWarningObj.transform.position = TowerPlacementGridEndless.instance.GetGridWorldPos(gridPosition.x, gridPosition.y);
+            bondageWarningObj.transform.GetChild(0).GetComponent<ParticleSystem>().Play();
+        }
+
+        /// <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.SetAffectorState(m_bInAttackMode, gridPosition.x);
+                CurrentTowerLevel.SetAttackState(value);
+
                 if (value)
                 {
                     if (opponentSide)
-                        currentTowerLevel.SetTowerMonsterMat(materialMonsterOppo);
-                    else
-                        currentTowerLevel.SetTowerMonsterMat(materialMonsterSelf);
-
-                    if (opponentSide)
                     {
-                        OpponentMgr.instance.SetTowerAttID(gridPosition.x, attributeId, this.currentLevel);
+                        OpponentMgr.instance.SetTowerAttID(gridPosition.x, ElfId, currentLevel);
                     }
                     else
                     {
                         if (LevelManager.instanceExists)
                         {
-                            LevelManager.instance.SetTowerAttID(gridPosition.x, attributeId, this.currentLevel);
+                            LevelManager.instance.SetTowerAttID(gridPosition.x, ElfId, 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, ElfId, currentLevel);
+                            EndlessWaveLineManager.instance.AttackTowerFixed(gridPosition.x, PlayWaveLineFlash);
                         }
                     }
 
-                    // 
-                    // 根据是否是子弹塔防来决定是否显示相应的界面.WORK START: 处理出来下一步的子弹减少和对应的充子弹时间.
-                    if (this.eTowerFuntion == ETowerFuntion.BULLET)
-                    {
-                        BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x);
-                        if (buc)
-                            buc.gameObject.SetActive(true);
-                    }
+                    // 处理塔位边上的界面.
+                    OnTowerUICtrl();
                 }
-
             }
         }
 
         /// <summary>
-        /// 初始化当前塔防的局内升级,lvl从1开始.
+        /// 去掉当前Tower对应的界面数据.
         /// </summary>
-        /// <param name="lvl"></param>
-        public void initInSceneTowerLevel(int lvl)
+        public void DisableTowerUICtrl()
         {
-            inSceneTowerLevel = lvl;
-            if (lvl <= 1)
+            // 根据是否是子弹塔防来决定是否显示相应的界面
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
             {
-                ResetInSceneTowerLevel();
-                return;
+                buc.gameObject.SetActive(false);
+                bulletCtl = null;
             }
-            // 设置攻击数据的加强,暂时是测试数据,后面需要读取表格数据处理:
-            float damageAdd = (inSceneTowerLevel - 1) * this.INSCENE_TU_DAMAGE;
-            for (int ti = 0; ti < this.levels.Length; ti++)
+
+            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
+            if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
             {
-                if (levels[ti].levelDamager)
-                {
-                    levels[ti].levelDamager.doubleHit = bDoubleHitElit;
-                    levels[ti].levelDamager.inSceneUpGradeDamage = damageAdd;
-                }
+                // 设置数据
+                euc.gameObject.SetActive(false);
+                energyCtl = null;
+            }
+
+            FreezeBreath ctrl = placementArea.GetFreezeBreath(gridPosition.x, gridPosition.y);
+            if (eTowerFuntion == ETowerFuntion.FREEZE && ctrl != null)
+            {
+                ctrl.gameObject.SetActive(false);
+                ctrl = null;
             }
         }
 
-        protected void ResetInSceneTowerLevel()
+        public int GetTowerUICtrlProgress()
         {
-            for (int ti = 0; ti < this.levels.Length; ti++)
+            // 根据是否是子弹塔防来决定是否显示相应的界面
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+
+            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)
+        {
+            // 根据是否是子弹塔防来决定是否显示相应的界面
+            BulletUICtl buc = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
             {
-                if (levels[ti].levelDamager)
-                {
-                    levels[ti].levelDamager.inSceneUpGradeDamage = 0;
-                    levels[ti].levelDamager.doubleHit = bDoubleHitElit;
-                }
+                buc.SetCtlProcess(pro);
+                progressOffset = pro;
+                return;
             }
-            return;
+
+            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);
+
+            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 = placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
+
+            if (buc == null) return;
+
+            if ((eTowerFuntion == ETowerFuntion.BULLET) && (buc != null))
+            {
+                // 设置数据
+                buc.gameObject.SetActive(true);
+                bulletCtl = buc;
+                buc.ResetToMaxBullet();
+            }
+            else
+            {
+                // 清空数据
+                buc.gameObject.SetActive(false);
+                bulletCtl = null;
+            }
+        }
+
+        private void HandleEnergyUICtrl()
+        {
+            // 根据是否是能量充能来决定是否显示相应的界面.
+            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
+            if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
+            {
+                // 设置数据
+                euc.gameObject.SetActive(true);
+                energyCtl = euc;
+                euc.SetEnergyProgress(0);
+            }
+            else
+            {
+                // 清空数据
+                euc.gameObject.SetActive(false);
+                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>
+        /// This function is called when the behaviour becomes disabled or inactive.
+        /// </summary>
+        void OnDisable()
+        {
+            if (bulletCtl != null)
+            {
+                bulletCtl.gameObject.SetActive(false);
+            }
+
+            if (energyCtl != null)
+            {
+                energyCtl.gameObject.SetActive(false);
+            }
+
+            if (FreezeBreathCtrl != null)
+                FreezeBreathCtrl.gameObject.SetActive(false);
         }
 
         /// <summary>
@@ -217,25 +686,10 @@
         /// </summary>
         public void upGradeInSceneTL()
         {
-            inSceneTowerLevel++;
-
-            // 设置攻击数据的加强,暂时是测试数据,后面需要读取表格数据处理:
-            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;
-                }
-            }
-
             Debug.Log("Upgrade Tower name is:" + name);
 
             // 播放相关的特效
-            currentTowerLevel.PlayUpGradeEffect();
+            CurrentTowerLevel.PlayUpGradeEffect();
         }
 
         /// <summary>
@@ -243,7 +697,7 @@
         /// </summary>
         public TowerPlacementGhost towerGhostPrefab
         {
-            get { return levels[currentLevel].towerGhostPrefab; }
+            get { return towerLevel.towerGhostPrefab; }
         }
 
         /// <summary>
@@ -255,14 +709,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
@@ -292,38 +738,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>
@@ -334,11 +760,11 @@
         {
             if (vis)
             {
-                this.gameObject.SetActive(true);
+                gameObject.SetActive(true);
             }
             else
             {
-                this.gameObject.SetActive(false);
+                gameObject.SetActive(false);
             }
         }
 
@@ -352,42 +778,11 @@
         }
 
         /// <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>
         public virtual bool UpgradeTower()
         {
-            if (isAtMaxLevel)
+            if (IsMaxLevel)
             {
                 return false;
             }
@@ -422,10 +817,8 @@
         /// </returns>
         public virtual bool UpgradeTowerToLevel(int level)
         {
-            if (level < 0 || isAtMaxLevel || level >= levels.Length)
-            {
-                return false;
-            }
+            if (level < 0 || IsMaxLevel || level >= ElfUpgradeData.MaxTowerLevel) return false;
+
             SetLevel(level);
             return true;
         }
@@ -441,9 +834,6 @@
         public override void Remove()
         {
             base.Remove();
-
-            // 清空局内升级数据:
-            ResetInSceneTowerLevel();
             attackRise = 0.0f;
             placementArea.Clear(gridPosition, dimensions);
             Destroy(gameObject);
@@ -465,28 +855,25 @@
         /// <summary>
         /// Cache and update oftenly used data
         /// </summary>
-        public void SetLevel(int level)
+        protected void SetLevel(int level)
         {
-            if (level < 0 || level >= levels.Length)
-            {
-                return;
-            }
+            if (level < 0 || level >= ElfUpgradeData.MaxTowerLevel) return;
+
             currentLevel = level;
-            if (currentTowerLevel != null)
+
+            if (CurrentTowerLevel != null)
+                Destroy(CurrentTowerLevel.gameObject);
+
+            CurrentTowerLevel = Instantiate(towerLevel, transform);
+            CurrentTowerLevel.Initialize(this, enemyLayerMask, configuration.alignmentProvider);
+            CurrentTowerLevel.SetShowLevel(level + 1);
+
+            //if(gridPosition.y>=2)
             {
-                Destroy(currentTowerLevel.gameObject);
+                //Debug.Log("上阵状态,设置缩放");
+                CurrentTowerLevel.SetScale(level + 1);
             }
 
-            // instantiate the visual representation
-            currentTowerLevel = Instantiate(levels[currentLevel], transform);
-
-            // initialize TowerLevel
-            currentTowerLevel.Initialize(this, enemyLayerMask, configuration.alignmentProvider);
-
-            // health data
-            ScaleHealth();
-
-            // 
             // disable affectors
             LevelState levelState = LevelState.Intro;
             if (LevelManager.instanceExists)
@@ -495,26 +882,7 @@
                 levelState = EndlessLevelManager.instance.EndlessLeveltate;
             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);
-            }
+            CurrentTowerLevel.SetAffectorState(initialise, gridPosition.x);
         }
 
         /// <summary>
@@ -524,8 +892,7 @@
         {
             bool initialise = current == LevelState.AllEnemiesSpawned || current == LevelState.SpawningEnemies;
             initialise = false;
-            //currentTowerLevel.SetAffectorState(initialise);
-            currentTowerLevel.SetAffectorState(bInAttackMode, gridPosition.x);
+            CurrentTowerLevel.SetAffectorState(bInAttackMode, gridPosition.x);
         }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1