chenxin
2020-11-18 2ef9a95def81f3f47f302c86a5709140a6f39ce6
Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
@@ -32,37 +32,120 @@
        /// </summary>
        public float attackRise { get; set; }
        public void DealDamage(Targetable enemy)
        /// <summary>
        /// 基础增加暴击伤害率
        /// </summary>
        private float baseCritDamageRate = 0.5f;
        public Tower TowerPtr;
        /// <summary>
        /// 处理代理收到的伤害,这里需要判断代理的类型分别去处理
        /// </summary>
        /// <param name="enemy"></param>
        /// <param name="attributeId">子弹的属性id</param>
        public void DealDamage(Targetable enemy, int attributeId = -1)
        {
            switch ((enemy as Agent).AgentType)
            {
                case SpawnAgentType.Normal:
                    HandleNormal(enemy);
                    break;
                case SpawnAgentType.BubbleBomb:
                    HandleBubbleBomb(enemy);
                    break;
                case SpawnAgentType.WoodPile:
                    HandleWoodPile(enemy, attributeId);
                    break;
            }
        }
        /// <summary>
        /// 处理木桩墙壁收到的伤害
        /// </summary>
        /// <param name="enemy"></param>
        private void HandleWoodPile(Targetable enemy, int id)
        {
            float finalDamage = damager.finalDamage;
            bool crit = damager.isCrit;
            if (crit)
                finalDamage += finalDamage;
            // 精英怪和Boss双倍攻击.
            bool doubleHit = damager.doubleHit && enemy.bElit;
            if (doubleHit)
                finalDamage *= 2;
            // 处理光塔对应的攻击增加:
            if (attackRise > 0)
                finalDamage += (finalDamage * attackRise);
            // 破甲状态
            if (enemy.bShieldBreak)
                finalDamage += (finalDamage * 0.1f);
            // 处理PVE无尽模式,buff增加的伤害
            finalDamage += ProcessEndlessBuffAttack(finalDamage);
            // 提前处理非当前Enemy的爆炸攻击:
            if (chainAttackRate > 0)
                AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage);
            if (id == 10101)
                finalDamage *= (enemy as WoodPileAgent).FireHurtRate;
            int tid = enemy.liveID;
            Vector3 backPos = enemy.position;
            // 这里也可以把碰撞点传进来
            enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider);
            EndlessGameUI.instance.generateBloodText(backPos, finalDamage);
        }
        /// <summary>
        /// 处理泡泡炸弹收到的伤害
        /// </summary>
        /// <param name="enemy"></param>
        private void HandleBubbleBomb(Targetable enemy)
        {
            // 泡泡炸弹伤害是以次数计算的
            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillBubbleBombGetHit, (enemy as BubbleBombAgent).Id);
        }
        /// <summary>
        /// 判断本次伤害是否暴击
        /// </summary>
        /// <returns></returns>
        private bool IsCrit()
        {
            CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd);
            float crit = critProbabilityAdd.GetCrit(TowerPtr.attributeId);
            float random = UnityEngine.Random.Range(0, 1f);
            return random <= crit;
        }
        /// <summary>
        /// 获取暴击伤害增加比率
        /// </summary>
        /// <returns></returns>
        private float GetCritDamageRate()
        {
            CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd);
            return critDamageAdd.GetCritDamageRate(TowerPtr.attributeId);
        }
        /// <summary>
        /// 处理普通小怪和boss收到的伤害
        /// </summary>
        /// <param name="enemy"></param>
        private void HandleNormal(Targetable enemy)
        {
            float finalDamage = damager.finalDamage;
            bool crit = IsCrit();
            // 处理PVE无尽模式,buff增加的伤害
            finalDamage += ProcessEndlessBuffAttack(finalDamage);
            if (crit)
                finalDamage *= 1 + baseCritDamageRate + GetCritDamageRate();
            int deathCount = 0;
            // 提前处理非当前Enemy的爆炸攻击:
            if (chainAttackRate > 0)
                deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage);
            int tid = enemy.liveID;
            Vector3 backPos = enemy.position;
            // 这里也可以把碰撞点传进来
            enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider, 0);
            if (chainAttackRate > 0)
            {
                if (enemy.isDead)
                    ++deathCount;
                if (deathCount > 1)
                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount);
            }
            // 处理塔位的技能攻击:
            ProcessTowerAttributeAttack(enemy, finalDamage, attributeId);
@@ -70,9 +153,9 @@
            if (!enemy.opponentAgent)
            {
                if (GameUI.instanceExists)
                    GameUI.instance.generateBloodText(backPos, finalDamage, crit, doubleHit);
                    GameUI.instance.generateBloodText(backPos, finalDamage, crit);
                else if (EndlessGameUI.instanceExists)
                    EndlessGameUI.instance.generateBloodText(backPos, finalDamage, crit, doubleHit);
                    EndlessGameUI.instance.generateBloodText(backPos, finalDamage, crit);
            }
            // 播放受击动画:
@@ -89,7 +172,7 @@
            // 非无尽模式
            if (!EndlessBuffManager.instanceExists) return 0;
            List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.Attack, attributeId);
            List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, attributeId);
            if (list.Count == 0) return 0;
@@ -102,7 +185,7 @@
                add += list[i].Config.buff_effect[2];
            }
            return finalDamage * (1 + ratio / 100f) + add;
            return finalDamage * (ratio / 100f) + add;
        }
        /// <summary>
@@ -116,12 +199,13 @@
            switch (id)
            {
                case 2:  // 减速.
                    enemy.addSpeedSlowRate(0.25f);
                    SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown);
                    enemy.addSpeedSlowRate(0.25f + slowDown.GetSlowDownAdd(TowerPtr.attributeId));
                    enemy.SetTargetableMatColor(Color.blue);
                    break;
                case 3:  // 中毒
                    enemy.poisonAgent(damage, attid);
                    enemy.SetTargetableMatColor(Color.green);
                    // enemy.poisonAgent(damage, attid);
                    // enemy.SetTargetableMatColor(Color.green);
                    break;
                case 5:  // 破甲
                    enemy.bShieldBreak = true;