| | |
| | | using TowerDefense.Towers.Projectiles; |
| | | using UnityEngine; |
| | | using KTGMGemClient; |
| | | using TowerDefense.Towers.TowerLaunchers; |
| | | using TowerDefense.Level; |
| | | |
| | | namespace TowerDefense.Affectors |
| | | { |
| | |
| | | /// </summary> |
| | | protected float m_FireTimer; |
| | | |
| | | protected float freezeBreathTimer; |
| | | |
| | | /// <summary> |
| | | /// Reference to the current tracked enemy |
| | | /// </summary> |
| | |
| | | protected float fillBulletTime = 0.0f; |
| | | |
| | | /// <summary> |
| | | /// 充能时间 |
| | | /// 火精灵充能时间 |
| | | /// </summary> |
| | | protected float energyCalTime = 0; |
| | | |
| | | protected float fInEnergy = 0; |
| | | |
| | | protected float fBackupTimer = 0.0f; |
| | | |
| | | /// <summary> |
| | | /// 水精灵的充能时间 |
| | | /// </summary> |
| | | protected float freezeBreathCallTime = 0; |
| | | |
| | | protected float inFreezeBreath = 0; |
| | | |
| | | protected float freezeBreathBackTimer = 0; |
| | | |
| | | /// <summary> |
| | | /// Gets the search rate from the targetter |
| | | /// </summary> |
| | |
| | | bool fireState = false; |
| | | protected void updateTowerSkillData() |
| | | { |
| | | // |
| | | HandleBullet(); |
| | | HandleEnergy(); |
| | | HandleFreezeBreath(); |
| | | } |
| | | |
| | | // 处理木精灵装填子弹 |
| | | private void HandleBullet() |
| | | { |
| | | // 预留出来装填子弹的时间. |
| | | if (fillBulletTime > 0) |
| | | { |
| | |
| | | fillBulletTime = 0; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // |
| | | // 处理火精灵充能 |
| | | private void HandleEnergy() |
| | | { |
| | | // 充能时间的处理 |
| | | if (towerPtr && towerPtr.energyCtl) |
| | | { |
| | | if (this.fInEnergy <= 0) |
| | | if (fInEnergy <= 0) |
| | | { |
| | | this.energyCalTime += Time.deltaTime; |
| | | energyCalTime += Time.deltaTime; |
| | | float process = energyCalTime % 11.0f; |
| | | int proint = (int)Math.Floor(process); |
| | | proint += towerPtr.uiProOffset; |
| | |
| | | fireState = false; |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd); |
| | | fInEnergy = 0.0f; |
| | | this.energyCalTime = 0.0f; |
| | | energyCalTime = 0.0f; |
| | | towerPtr.energyCtl.SetEnergyProgress(0); |
| | | |
| | | // 恢复正常攻击速度 |
| | |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 处理水精灵的充能 |
| | | private void HandleFreezeBreath() |
| | | { |
| | | if (towerPtr && towerPtr.FreezeBreathCtrl) |
| | | { |
| | | Damager damager = projectile.gameObject.GetComponent<Damager>(); |
| | | float finalDamage = damager.damage; |
| | | |
| | | List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.Attack, towerPtr.attributeId); |
| | | float ratio = 0; |
| | | float add = 0; |
| | | |
| | | if (list.Count > 0) |
| | | { |
| | | for (int i = 0; i < list.Count; ++i) |
| | | { |
| | | ratio += list[i].Config.buff_effect[1]; |
| | | add += list[i].Config.buff_effect[2]; |
| | | } |
| | | } |
| | | |
| | | finalDamage += (ratio / 100f) * finalDamage + add; |
| | | |
| | | if (inFreezeBreath <= 0) |
| | | { |
| | | freezeBreathCallTime += Time.deltaTime; |
| | | float process = freezeBreathCallTime % (FreezeBreath.ChargeTime + 1); |
| | | int processInt = (int)Mathf.Floor(process); |
| | | processInt += towerPtr.FreezeBreathProgressOffset; |
| | | towerPtr.FreezeBreathCtrl.SetProgress(process); |
| | | |
| | | if (processInt == (int)Mathf.Floor(FreezeBreath.ChargeTime)) |
| | | { |
| | | inFreezeBreath = FreezeBreath.EffectTime; |
| | | towerPtr.FreezeBreathProgressOffset = 0; |
| | | towerPtr.PlayFreezeBreathEffect(true); |
| | | towerPtr.FreezeBreathCtrl.ReleaseCount = 1; |
| | | towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | inFreezeBreath -= Time.deltaTime; |
| | | |
| | | if (inFreezeBreath <= FreezeBreath.EffectTime / 2 && towerPtr.FreezeBreathCtrl.ReleaseCount != 2) |
| | | { |
| | | towerPtr.FreezeBreathCtrl.ReleaseCount = 2; |
| | | towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider); |
| | | return; |
| | | } |
| | | |
| | | if (inFreezeBreath <= 0) |
| | | { |
| | | inFreezeBreath = 0; |
| | | freezeBreathCallTime = 0; |
| | | towerPtr.FreezeBreathCtrl.SetProgress(0); |
| | | towerPtr.PlayFreezeBreathEffect(false); |
| | | towerPtr.FreezeBreathCtrl.ReleaseCount = 3; |
| | | towerPtr.FreezeBreathCtrl.ReleaseFreeze(waveLineID, finalDamage, damager.alignmentProvider); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | towerPtr.PlayEnergyEffect(false, false); |
| | | } |
| | | |
| | | if (towerPtr && towerPtr.FreezeBreathCtrl) |
| | | towerPtr.PlayFreezeBreathEffect(false, false); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// Update the timers |
| | | /// </summary> |
| | | protected virtual void LateUpdate() |
| | | protected virtual void Update() |
| | | { |
| | | if (m_Launcher == null) return; |
| | | |
| | |
| | | |
| | | towerLevel.FireSpeed = fInEnergy > 0 ? 5f : 1f; |
| | | |
| | | if (towerPtr && (towerPtr.bulletCtl != null)) |
| | | if (towerPtr && towerPtr.bulletCtl != null) |
| | | { |
| | | int bnum = towerPtr.bulletCtl.GetCtlProgress(); |
| | | if (bnum == 0) return; |
| | | } |
| | | |
| | | if (towerPtr && towerPtr.FreezeBreathCtrl != null) |
| | | { |
| | | // 冷冻气息期间不攻击 |
| | | if (inFreezeBreath > 0.0001f) return; |
| | | } |
| | | |
| | | towerLevel.ChangeState(TowerActionState.Attack); |
| | |
| | | } |
| | | else |
| | | { |
| | | if (this.towerPtr) |
| | | if (towerPtr) |
| | | towerPtr.setTowerState(true); |
| | | } |
| | | |
| | |
| | | { |
| | | List<Targetable> enemies = towerTargetter.GetAllTargets(); |
| | | if ((enemies != null) && (Targetter.bSearchTarget)) |
| | | m_Launcher.Launch(enemies, projectile, projectilePoints, this.maxAttackNum); |
| | | m_Launcher.Launch(enemies, projectile, projectilePoints, maxAttackNum); |
| | | } |
| | | else |
| | | { |