| | |
| | | using ActionGameFramework.Health; |
| | | using System; |
| | | using TowerDefense.Agents; |
| | | using TowerDefense.UI.HUD; |
| | | using UnityEngine; |
| | | using System.Collections.Generic; |
| | | using KTGMGemClient; |
| | | |
| | | namespace TowerDefense.Towers.Projectiles |
| | |
| | | { |
| | | float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel); |
| | | |
| | | if (TowerPtr.ElfId == 101) |
| | | if (TowerPtr.ElfId == 301) |
| | | basicDamage *= (enemy as WoodPileAgent).FireHurtRate; |
| | | |
| | | int tid = enemy.liveID; |
| | |
| | | |
| | | // 这里也可以把碰撞点传进来 |
| | | enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider); |
| | | EndlessGameUI.instance.generateBloodText(backPos, basicDamage); |
| | | |
| | | if (TowerPtr.ElfId == 301) |
| | | EndlessGameUI.instance.FloatRestrainWord(enemy.position); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// 判断本次伤害是否暴击 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private bool IsCrit() |
| | | public static bool IsCrit(int elfId) |
| | | { |
| | | elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId); |
| | | elf_info info = ElfInfoData.GetDataById(elfId); |
| | | float crit = 0f; |
| | | |
| | | if (info != null) |
| | |
| | | CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd); |
| | | |
| | | if (critProbabilityAdd != null) |
| | | crit = critProbabilityAdd.GetCrit(TowerPtr.ElfId, crit); |
| | | crit = critProbabilityAdd.GetCrit(elfId, crit); |
| | | |
| | | float random = UnityEngine.Random.Range(0, 1f); |
| | | |
| | |
| | | /// 获取暴击伤害增加比率 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | private float GetCritDamageRate() |
| | | public static float GetCritDamageRate(int elfId) |
| | | { |
| | | CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd); |
| | | |
| | | return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.ElfId); |
| | | return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(elfId); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId); |
| | | |
| | | // 处理PVE无尽模式,buff增加的伤害 |
| | | basicDamage += ProcessEndlessBuffAttack(basicDamage); |
| | | if (EndlessBuffManager.instanceExists) |
| | | basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, TowerPtr.ElfId); |
| | | |
| | | bool crit = IsCrit(); |
| | | bool crit = IsCrit(TowerPtr.ElfId); |
| | | |
| | | if (crit) |
| | | { |
| | | float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f; |
| | | basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(); |
| | | basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(TowerPtr.ElfId); |
| | | } |
| | | |
| | | // 玉米强化子弹10倍伤害 |
| | | if (isEnhancedBullet) |
| | | basicDamage *= 10f; |
| | | |
| | | bool needFrost = HandleWaterFrost(TowerPtr.ElfId, (enemy as Agent), ref basicDamage); |
| | | |
| | | int deathCount = 0; |
| | | |
| | |
| | | { |
| | | if (GameUI.instanceExists) |
| | | GameUI.instance.generateBloodText(backPos, basicDamage, crit); |
| | | else if (EndlessGameUI.instanceExists) |
| | | EndlessGameUI.instance.generateBloodText(backPos, basicDamage, crit); |
| | | else if (EndlessGameUI.instanceExists && crit) |
| | | { |
| | | EndlessGameUI.instance.generateBloodText(backPos, basicDamage, true); |
| | | EndlessGameUI.instance.FloatCritWord(backPos); |
| | | } |
| | | } |
| | | |
| | | if (!enemy.isDead && needFrost) |
| | | { |
| | | (enemy as Agent).IsFrost = true; |
| | | (enemy as Agent).FrostRemainTime = FrostTimeAdd.DefaultFrostTime; |
| | | FrostTimeAdd frostTimeAdd = (FrostTimeAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostTimeAdd); |
| | | |
| | | if (frostTimeAdd != null) |
| | | (enemy as Agent).FrostRemainTime = frostTimeAdd.GetFrostTime(TowerPtr.ElfId); |
| | | } |
| | | |
| | | // 播放受击动画: |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理PVE无尽模式buff增加的伤害 |
| | | /// 处理水精灵冰冻 |
| | | /// </summary> |
| | | /// <param name="finalDamage"></param> |
| | | protected float ProcessEndlessBuffAttack(float finalDamage) |
| | | /// <param name="elfId"></param> |
| | | /// <param name="enemy"></param> |
| | | /// <param name="basicDamage"></param> |
| | | /// <returns>是否需要冰冻,如果直接被打死就无所谓了,也不要飘字</returns> |
| | | public static bool HandleWaterFrost(int elfId, Agent enemy, ref float basicDamage) |
| | | { |
| | | // 非无尽模式 |
| | | if (!EndlessBuffManager.instanceExists) return 0; |
| | | bool needFrost = false; |
| | | |
| | | List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, TowerPtr.ElfId); |
| | | if (elfId != 201) return needFrost; |
| | | |
| | | if (list.Count == 0) return 0; |
| | | |
| | | float ratio = 0; |
| | | float add = 0; |
| | | |
| | | for (int i = 0; i < list.Count; ++i) |
| | | // 处理冰冻状态中的额外伤害 |
| | | if (enemy.IsFrost) |
| | | { |
| | | ratio += list[i].Config.buff_effect[1]; |
| | | add += list[i].Config.buff_effect[2]; |
| | | FrostDamageAdd frostDamageAdd = (FrostDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostDamageAdd); |
| | | |
| | | if (frostDamageAdd != null) |
| | | basicDamage *= (1 + frostDamageAdd.GetFrostDamageAdd(elfId)); |
| | | } |
| | | else |
| | | { |
| | | FrostProbabilityAdd frostProbabilityAdd = (FrostProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostProbabilityAdd); |
| | | |
| | | if (frostProbabilityAdd != null) |
| | | { |
| | | float probaility = frostProbabilityAdd.GetFrostProbaility(elfId); |
| | | float random = UnityEngine.Random.Range(0f, 1f); |
| | | |
| | | if (random <= probaility) |
| | | needFrost = true; |
| | | } |
| | | } |
| | | |
| | | return finalDamage * (ratio / 100f) + add; |
| | | return needFrost; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理塔位的属性攻击 |
| | | /// </summary> |
| | | /// <param name="enemy"></param> |
| | | /// <param name="attid"></param> |
| | | protected void ProcessTowerAttributeAttack(Targetable enemy, float damage, int attid) |
| | | /// <param name="elfId">精灵Id</param> |
| | | protected void ProcessTowerAttributeAttack(Targetable enemy, float damage, int elfId) |
| | | { |
| | | int id = (int)Math.Floor(attid / 10000.0f); |
| | | switch (id) |
| | | switch (elfId) |
| | | { |
| | | case 2: // 减速. |
| | | case 201: // 减速. |
| | | SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown); |
| | | (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.ElfId) : 0)); |
| | | break; |
| | | case 3: // 中毒 |
| | | case 301: // 中毒 |
| | | // enemy.poisonAgent(damage, attid); |
| | | // enemy.SetTargetableMatColor(Color.green); |
| | | break; |