chenxin
2020-12-02 cc7ed63c3efab2640c9cc56225519ab187fd7cbc
Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
@@ -17,11 +17,6 @@
        public float chainAttackRate = 0;
        /// <summary>
        /// 当前攻击塔位对应的属性ID
        /// </summary>
        public int attributeId = 0;
        /// <summary>
        /// The Damager attached to the object
        /// </summary>
        protected Damager damager;
@@ -31,11 +26,6 @@
        /// </summary>
        public float attackRise { get; set; }
        /// <summary>
        /// 基础增加暴击伤害率
        /// </summary>
        private float baseCritDamageRate = 0.5f;
        public Tower TowerPtr;
        /// <summary>
@@ -43,7 +33,7 @@
        /// </summary>
        /// <param name="enemy"></param>
        /// <param name="attributeId">子弹的属性id</param>
        public void DealDamage(Targetable enemy, int attributeId = -1, bool isEnhancedBullet = false)
        public void DealDamage(Targetable enemy, bool isEnhancedBullet = false)
        {
            switch ((enemy as Agent).AgentType)
            {
@@ -54,7 +44,7 @@
                    HandleBubbleBomb(enemy);
                    break;
                case SpawnAgentType.WoodPile:
                    HandleWoodPile(enemy, attributeId);
                    HandleWoodPile(enemy);
                    break;
            }
        }
@@ -63,19 +53,19 @@
        /// 处理木桩墙壁收到的伤害
        /// </summary>
        /// <param name="enemy"></param>
        private void HandleWoodPile(Targetable enemy, int id)
        private void HandleWoodPile(Targetable enemy)
        {
            float finalDamage = damager.finalDamage;
            float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel);
            if (id == 10101)
                finalDamage *= (enemy as WoodPileAgent).FireHurtRate;
            if (TowerPtr.ElfId == 101)
                basicDamage *= (enemy as WoodPileAgent).FireHurtRate;
            int tid = enemy.liveID;
            Vector3 backPos = enemy.position;
            // 这里也可以把碰撞点传进来
            enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider);
            EndlessGameUI.instance.generateBloodText(backPos, finalDamage);
            enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider);
            EndlessGameUI.instance.generateBloodText(backPos, basicDamage);
        }
        /// <summary>
@@ -94,11 +84,17 @@
        /// <returns></returns>
        private bool IsCrit()
        {
            elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId);
            float crit = 0f;
            if (info != null)
                crit = info.b_crit / 1000f;
            CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd);
            if (critProbabilityAdd == null) return false;
            if (critProbabilityAdd != null)
                crit = critProbabilityAdd.GetCrit(TowerPtr.ElfId, crit);
            float crit = critProbabilityAdd.GetCrit(TowerPtr.attributeId);
            float random = UnityEngine.Random.Range(0, 1f);
            return random <= crit;
@@ -112,7 +108,7 @@
        {
            CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd);
            return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.attributeId);
            return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.ElfId);
        }
        /// <summary>
@@ -121,26 +117,32 @@
        /// <param name="enemy"></param>
        private void HandleNormal(Targetable enemy, bool isEnhancedBullet)
        {
            float finalDamage = damager.finalDamage;
            bool crit = IsCrit();
            // 基础伤害 = elf_info 基础攻击力 * elf_upgrade 攻击比率 / 1000f
            float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel);
            elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId);
            // 处理PVE无尽模式,buff增加的伤害
            finalDamage += ProcessEndlessBuffAttack(finalDamage);
            basicDamage += ProcessEndlessBuffAttack(basicDamage);
            bool crit = IsCrit();
            if (crit)
                finalDamage *= 1 + baseCritDamageRate + GetCritDamageRate();
            {
                float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f;
                basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate();
            }
            int deathCount = 0;
            // 提前处理非当前Enemy的爆炸攻击:
            if (chainAttackRate > 0)
                deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage);
                deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, basicDamage);
            int tid = enemy.liveID;
            Vector3 backPos = enemy.position;
            // 这里也可以把碰撞点传进来
            enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider, 0);
            enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider, 0);
            if (chainAttackRate > 0)
            {
@@ -151,14 +153,14 @@
            }
            // 处理塔位的技能攻击:
            ProcessTowerAttributeAttack(enemy, finalDamage, attributeId);
            ProcessTowerAttributeAttack(enemy, basicDamage, TowerPtr.ElfId);
            if (!enemy.opponentAgent)
            {
                if (GameUI.instanceExists)
                    GameUI.instance.generateBloodText(backPos, finalDamage, crit);
                    GameUI.instance.generateBloodText(backPos, basicDamage, crit);
                else if (EndlessGameUI.instanceExists)
                    EndlessGameUI.instance.generateBloodText(backPos, finalDamage, crit);
                    EndlessGameUI.instance.generateBloodText(backPos, basicDamage, crit);
            }
            // 播放受击动画:
@@ -181,7 +183,7 @@
            // 非无尽模式
            if (!EndlessBuffManager.instanceExists) return 0;
            List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, attributeId);
            List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, TowerPtr.ElfId);
            if (list.Count == 0) return 0;
@@ -209,7 +211,7 @@
            {
                case 2:  // 减速.
                    SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown);
                    (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.attributeId) : 0));
                    (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.ElfId) : 0));
                    break;
                case 3:  // 中毒
                    // enemy.poisonAgent(damage, attid);