wangguan
2020-12-10 a9bf69ea82070c8e9723e610cb7cea430f2daa11
Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
@@ -1,9 +1,7 @@
using ActionGameFramework.Health;
using System;
using TowerDefense.Agents;
using TowerDefense.UI.HUD;
using UnityEngine;
using System.Collections.Generic;
using KTGMGemClient;
namespace TowerDefense.Towers.Projectiles
@@ -57,7 +55,7 @@
        {
            float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel);
            if (TowerPtr.ElfId == 101)
            if (TowerPtr.ElfId == 301)
                basicDamage *= (enemy as WoodPileAgent).FireHurtRate;
            int tid = enemy.liveID;
@@ -65,6 +63,9 @@
            // 这里也可以把碰撞点传进来
            enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider);
            if (TowerPtr.ElfId == 301)
                EndlessGameUI.instance.FloatRestrainWord(enemy.position);
        }
        /// <summary>
@@ -81,9 +82,9 @@
        /// 判断本次伤害是否暴击
        /// </summary>
        /// <returns></returns>
        private bool IsCrit()
        public static bool IsCrit(int elfId)
        {
            elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId);
            elf_info info = ElfInfoData.GetDataById(elfId);
            float crit = 0f;
            if (info != null)
@@ -92,7 +93,7 @@
            CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd);
            if (critProbabilityAdd != null)
                crit = critProbabilityAdd.GetCrit(TowerPtr.ElfId, crit);
                crit = critProbabilityAdd.GetCrit(elfId, crit);
            float random = UnityEngine.Random.Range(0, 1f);
@@ -103,11 +104,11 @@
        /// 获取暴击伤害增加比率
        /// </summary>
        /// <returns></returns>
        private float GetCritDamageRate()
        public static float GetCritDamageRate(int elfId)
        {
            CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd);
            return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.ElfId);
            return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(elfId);
        }
        /// <summary>
@@ -121,15 +122,22 @@
            elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId);
            // 处理PVE无尽模式,buff增加的伤害
            basicDamage += ProcessEndlessBuffAttack(basicDamage);
            if (EndlessBuffManager.instanceExists)
                basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, TowerPtr.ElfId);
            bool crit = IsCrit();
            bool crit = IsCrit(TowerPtr.ElfId);
            if (crit)
            {
                float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f;
                basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate();
                basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(TowerPtr.ElfId);
            }
            // 玉米强化子弹10倍伤害
            if (isEnhancedBullet)
                basicDamage *= 10f;
            bool needFrost = HandleWaterFrost(TowerPtr.ElfId, (enemy as Agent), ref basicDamage);
            int deathCount = 0;
@@ -159,7 +167,20 @@
                if (GameUI.instanceExists)
                    GameUI.instance.generateBloodText(backPos, basicDamage, crit);
                else if (EndlessGameUI.instanceExists && crit)
                {
                    EndlessGameUI.instance.generateBloodText(backPos, basicDamage, true);
                    EndlessGameUI.instance.FloatCritWord(backPos);
                }
            }
            if (!enemy.isDead && needFrost)
            {
                (enemy as Agent).IsFrost = true;
                (enemy as Agent).FrostRemainTime = FrostTimeAdd.DefaultFrostTime;
                FrostTimeAdd frostTimeAdd = (FrostTimeAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostTimeAdd);
                if (frostTimeAdd != null)
                    (enemy as Agent).FrostRemainTime = frostTimeAdd.GetFrostTime(TowerPtr.ElfId);
            }
            // 播放受击动画:
@@ -174,45 +195,57 @@
        }
        /// <summary>
        /// 处理PVE无尽模式buff增加的伤害
        /// 处理水精灵冰冻
        /// </summary>
        /// <param name="finalDamage"></param>
        protected float ProcessEndlessBuffAttack(float finalDamage)
        /// <param name="elfId"></param>
        /// <param name="enemy"></param>
        /// <param name="basicDamage"></param>
        /// <returns>是否需要冰冻,如果直接被打死就无所谓了,也不要飘字</returns>
        public static bool HandleWaterFrost(int elfId, Agent enemy, ref float basicDamage)
        {
            // 非无尽模式
            if (!EndlessBuffManager.instanceExists) return 0;
            bool needFrost = false;
            List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, TowerPtr.ElfId);
            if (elfId != 201) return needFrost;
            if (list.Count == 0) return 0;
            float ratio = 0;
            float add = 0;
            for (int i = 0; i < list.Count; ++i)
            // 处理冰冻状态中的额外伤害
            if (enemy.IsFrost)
            {
                ratio += list[i].Config.buff_effect[1];
                add += list[i].Config.buff_effect[2];
                FrostDamageAdd frostDamageAdd = (FrostDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostDamageAdd);
                if (frostDamageAdd != null)
                    basicDamage *= (1 + frostDamageAdd.GetFrostDamageAdd(elfId));
            }
            else
            {
                FrostProbabilityAdd frostProbabilityAdd = (FrostProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostProbabilityAdd);
                if (frostProbabilityAdd != null)
                {
                    float probaility = frostProbabilityAdd.GetFrostProbaility(elfId);
                    float random = UnityEngine.Random.Range(0f, 1f);
                    if (random <= probaility)
                        needFrost = true;
                }
            }
            return finalDamage * (ratio / 100f) + add;
            return needFrost;
        }
        /// <summary>
        /// 处理塔位的属性攻击
        /// </summary>
        /// <param name="enemy"></param>
        /// <param name="attid"></param>
        protected void ProcessTowerAttributeAttack(Targetable enemy, float damage, int attid)
        /// <param name="elfId">精灵Id</param>
        protected void ProcessTowerAttributeAttack(Targetable enemy, float damage, int elfId)
        {
            int id = (int)Math.Floor(attid / 10000.0f);
            switch (id)
            switch (elfId)
            {
                case 2:  // 减速.
                case 201:  // 减速.
                    SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown);
                    (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.ElfId) : 0));
                    break;
                case 3:  // 中毒
                case 301:  // 中毒
                    // enemy.poisonAgent(damage, attid);
                    // enemy.SetTargetableMatColor(Color.green);
                    break;