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