From 2ef9a95def81f3f47f302c86a5709140a6f39ce6 Mon Sep 17 00:00:00 2001 From: chenxin <chenxin6991@163.com> Date: Wed, 18 Nov 2020 12:28:51 +0800 Subject: [PATCH] 新增buff验证测试 --- Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs | 101 ++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 76 insertions(+), 25 deletions(-) diff --git a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs index e7e3dca..6b86165 100644 --- a/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs +++ b/Assets/Scripts/TowerDefense/Towers/Projectiles/BallisticAttack.cs @@ -33,10 +33,18 @@ 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) { switch ((enemy as Agent).AgentType) { @@ -47,8 +55,28 @@ 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 +90,62 @@ } /// <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 = 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,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); } // 播放受击动画: @@ -122,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; @@ -135,7 +185,7 @@ add += list[i].Config.buff_effect[2]; } - return finalDamage * (1 + ratio / 100f) + add; + return finalDamage * (ratio / 100f) + add; } /// <summary> @@ -149,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; -- Gitblit v1.9.1