| | |
| | | public float chainAttackRate = 0; |
| | | |
| | | /// <summary> |
| | | /// 当前攻击塔位对应的属性ID |
| | | /// </summary> |
| | | public int attributeId = 0; |
| | | |
| | | /// <summary> |
| | | /// The Damager attached to the object |
| | | /// </summary> |
| | | protected Damager damager; |
| | |
| | | /// </summary> |
| | | public float attackRise { get; set; } |
| | | |
| | | /// <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, bool isEnhancedBullet = false) |
| | | public void DealDamage(Targetable enemy, bool isEnhancedBullet = false) |
| | | { |
| | | switch ((enemy as Agent).AgentType) |
| | | { |
| | |
| | | HandleBubbleBomb(enemy); |
| | | break; |
| | | case SpawnAgentType.WoodPile: |
| | | HandleWoodPile(enemy, attributeId); |
| | | HandleWoodPile(enemy); |
| | | break; |
| | | } |
| | | } |
| | |
| | | /// 处理木桩墙壁收到的伤害 |
| | | /// </summary> |
| | | /// <param name="enemy"></param> |
| | | private void HandleWoodPile(Targetable enemy, int id) |
| | | private void HandleWoodPile(Targetable enemy) |
| | | { |
| | | float finalDamage = damager.finalDamage; |
| | | float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel); |
| | | |
| | | if (id == 10101) |
| | | finalDamage *= (enemy as WoodPileAgent).FireHurtRate; |
| | | if (TowerPtr.ElfId == 101) |
| | | basicDamage *= (enemy as WoodPileAgent).FireHurtRate; |
| | | |
| | | int tid = enemy.liveID; |
| | | Vector3 backPos = enemy.position; |
| | | |
| | | // 这里也可以把碰撞点传进来 |
| | | enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider); |
| | | EndlessGameUI.instance.generateBloodText(backPos, finalDamage); |
| | | enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider); |
| | | EndlessGameUI.instance.generateBloodText(backPos, basicDamage); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <returns></returns> |
| | | private bool IsCrit() |
| | | { |
| | | elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId); |
| | | float crit = 0f; |
| | | |
| | | if (info != null) |
| | | crit = info.b_crit / 1000f; |
| | | |
| | | CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd); |
| | | |
| | | if (critProbabilityAdd == null) return false; |
| | | if (critProbabilityAdd != null) |
| | | crit = critProbabilityAdd.GetCrit(TowerPtr.ElfId, crit); |
| | | |
| | | float crit = critProbabilityAdd.GetCrit(TowerPtr.attributeId); |
| | | float random = UnityEngine.Random.Range(0, 1f); |
| | | |
| | | return random <= crit; |
| | |
| | | { |
| | | CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd); |
| | | |
| | | return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.attributeId); |
| | | return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(TowerPtr.ElfId); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="enemy"></param> |
| | | private void HandleNormal(Targetable enemy, bool isEnhancedBullet) |
| | | { |
| | | float finalDamage = damager.finalDamage; |
| | | bool crit = IsCrit(); |
| | | // 基础伤害 = elf_info 基础攻击力 * elf_upgrade 攻击比率 / 1000f |
| | | float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel); |
| | | elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId); |
| | | |
| | | // 处理PVE无尽模式,buff增加的伤害 |
| | | finalDamage += ProcessEndlessBuffAttack(finalDamage); |
| | | basicDamage += ProcessEndlessBuffAttack(basicDamage); |
| | | |
| | | bool crit = IsCrit(); |
| | | |
| | | if (crit) |
| | | finalDamage *= 1 + baseCritDamageRate + GetCritDamageRate(); |
| | | { |
| | | float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f; |
| | | basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(); |
| | | } |
| | | |
| | | int deathCount = 0; |
| | | |
| | | // 提前处理非当前Enemy的爆炸攻击: |
| | | if (chainAttackRate > 0) |
| | | deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage); |
| | | deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, basicDamage); |
| | | |
| | | int tid = enemy.liveID; |
| | | Vector3 backPos = enemy.position; |
| | | |
| | | // 这里也可以把碰撞点传进来 |
| | | enemy.TakeDamage(finalDamage, enemy.position, damager.alignmentProvider, 0); |
| | | enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider, 0); |
| | | |
| | | if (chainAttackRate > 0) |
| | | { |
| | |
| | | } |
| | | |
| | | // 处理塔位的技能攻击: |
| | | ProcessTowerAttributeAttack(enemy, finalDamage, attributeId); |
| | | ProcessTowerAttributeAttack(enemy, basicDamage, TowerPtr.ElfId); |
| | | |
| | | if (!enemy.opponentAgent) |
| | | { |
| | | if (GameUI.instanceExists) |
| | | GameUI.instance.generateBloodText(backPos, finalDamage, crit); |
| | | GameUI.instance.generateBloodText(backPos, basicDamage, crit); |
| | | else if (EndlessGameUI.instanceExists) |
| | | EndlessGameUI.instance.generateBloodText(backPos, finalDamage, crit); |
| | | EndlessGameUI.instance.generateBloodText(backPos, basicDamage, crit); |
| | | } |
| | | |
| | | // 播放受击动画: |
| | |
| | | // 非无尽模式 |
| | | if (!EndlessBuffManager.instanceExists) return 0; |
| | | |
| | | List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, attributeId); |
| | | List<EndlessBuffConfig> list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, TowerPtr.ElfId); |
| | | |
| | | if (list.Count == 0) return 0; |
| | | |
| | |
| | | { |
| | | case 2: // 减速. |
| | | SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown); |
| | | (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.attributeId) : 0)); |
| | | (enemy as Agent).addSpeedSlowRate(0.15f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.ElfId) : 0)); |
| | | break; |
| | | case 3: // 中毒 |
| | | // enemy.poisonAgent(damage, attid); |