From e36f2a3ac098d6e89d3882f3354ec69c07e71e16 Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Tue, 01 Dec 2020 15:55:40 +0800
Subject: [PATCH] 代码结构修改

---
 Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs |  122 +++++++++++++++++++++++++++++-----------
 1 files changed, 89 insertions(+), 33 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
index e7e3dca..f017a43 100644
--- a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs
@@ -3,7 +3,6 @@
 using TowerDefense.Agents;
 using TowerDefense.UI.HUD;
 using UnityEngine;
-using TowerDefense.Level;
 using System.Collections.Generic;
 using KTGMGemClient;
 
@@ -33,22 +32,50 @@
         public float attackRise { get; set; }
 
         /// <summary>
+        /// 基础增加暴击伤害率
+        /// </summary>
+        private float baseCritDamageRate = 0.5f;
+
+        public Tower TowerPtr;
+
+        /// <summary>
         /// 处理代理收到的伤害,这里需要判断代理的类型分别去处理
         /// </summary>
         /// <param name="enemy"></param>
-        public void DealDamage(Targetable enemy)
+        /// <param name="attributeId">子弹的属性id</param>
+        public void DealDamage(Targetable enemy, int attributeId = -1, bool isEnhancedBullet = false)
         {
             switch ((enemy as Agent).AgentType)
             {
                 case SpawnAgentType.Normal:
-                    HandleNormal(enemy);
+                    HandleNormal(enemy, isEnhancedBullet);
                     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;
+
+            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>
@@ -62,40 +89,66 @@
         }
 
         /// <summary>
+        /// 判断本次伤害是否暴击
+        /// </summary>
+        /// <returns></returns>
+        private bool IsCrit()
+        {
+            CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd);
+
+            if (critProbabilityAdd == null) return false;
+
+            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 == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.attributeId);
+        }
+
+        /// <summary>
         /// 处理普通小怪和boss收到的伤害
         /// </summary>
         /// <param name="enemy"></param>
-        private void HandleNormal(Targetable enemy)
+        private void HandleNormal(Targetable enemy, bool isEnhancedBullet)
         {
             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);
+            bool crit = IsCrit();
 
             // 处理PVE无尽模式,buff增加的伤害
             finalDamage += ProcessEndlessBuffAttack(finalDamage);
 
+            if (crit)
+                finalDamage *= 1 + baseCritDamageRate + GetCritDamageRate();
+
+            int deathCount = 0;
+
             // 提前处理非当前Enemy的爆炸攻击:
             if (chainAttackRate > 0)
-                AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage);
+                deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage);
 
             int tid = enemy.liveID;
             Vector3 backPos = enemy.position;
 
             // 这里也可以把碰撞点传进来
-            enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider);
+            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);
@@ -103,14 +156,20 @@
             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);
             }
 
             // 播放受击动画:
-            if ((!enemy.isDead) && (enemy.liveID == tid))
+            if (!enemy.isDead && enemy.liveID == tid)
+            {
                 (enemy as Agent).PlayOnHit();
+
+                // 如果是玉米强化子弹的攻击,要处理击退的效果
+                if (TowerPtr != null && isEnhancedBullet)
+                    (enemy as Agent).AgentBeRepelled();
+            }
         }
 
         /// <summary>
@@ -122,7 +181,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;
 
@@ -135,7 +194,7 @@
                 add += list[i].Config.buff_effect[2];
             }
 
-            return finalDamage * (1 + ratio / 100f) + add;
+            return finalDamage * (ratio / 100f) + add;
         }
 
         /// <summary>
@@ -149,15 +208,12 @@
             switch (id)
             {
                 case 2:  // 减速.
-                    enemy.addSpeedSlowRate(0.25f);
-                    enemy.SetTargetableMatColor(Color.blue);
+                    SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown);
+                    (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.attributeId) : 0));
                     break;
                 case 3:  // 中毒
-                    enemy.poisonAgent(damage, attid);
-                    enemy.SetTargetableMatColor(Color.green);
-                    break;
-                case 5:  // 破甲
-                    enemy.bShieldBreak = true;
+                    // enemy.poisonAgent(damage, attid);
+                    // enemy.SetTargetableMatColor(Color.green);
                     break;
             }
             return;

--
Gitblit v1.9.1