| | |
| | | /// </summary> |
| | | public float attackRise { get; set; } |
| | | |
| | | public void DealDamage(Targetable enemy) |
| | | /// <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) |
| | | { |
| | | switch ((enemy as Agent).AgentType) |
| | | { |
| | | case SpawnAgentType.Normal: |
| | | HandleNormal(enemy); |
| | | 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; |
| | | 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); |
| | | |
| | | // 处理PVE无尽模式,buff增加的伤害 |
| | | finalDamage += ProcessEndlessBuffAttack(finalDamage); |
| | | |
| | | // 提前处理非当前Enemy的爆炸攻击: |
| | | if (chainAttackRate > 0) |
| | | AgentInsManager.instance.StartExplodeAttack((Agent)enemy, 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> |
| | | /// 处理泡泡炸弹收到的伤害 |
| | | /// </summary> |
| | | /// <param name="enemy"></param> |
| | | private void HandleBubbleBomb(Targetable enemy) |
| | | { |
| | | // 泡泡炸弹伤害是以次数计算的 |
| | | EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillBubbleBombGetHit, (enemy as BubbleBombAgent).Id); |
| | | } |
| | | |
| | | /// <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 = IsCrit(); |
| | | |
| | | // 处理PVE无尽模式,buff增加的伤害 |
| | | finalDamage += ProcessEndlessBuffAttack(finalDamage); |
| | | |
| | | if (crit) |
| | | finalDamage *= 1 + baseCritDamageRate + GetCritDamageRate(); |
| | | |
| | | int deathCount = 0; |
| | | |
| | | // 提前处理非当前Enemy的爆炸攻击: |
| | | if (chainAttackRate > 0) |
| | | deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, finalDamage); |
| | | |
| | | int tid = enemy.liveID; |
| | | Vector3 backPos = enemy.position; |
| | | |
| | | // 这里也可以把碰撞点传进来 |
| | | 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); |
| | |
| | | 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 (!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; |
| | | |
| | |
| | | add += list[i].Config.buff_effect[2]; |
| | | } |
| | | |
| | | return finalDamage * (1 + ratio / 100f) + add; |
| | | return finalDamage * (ratio / 100f) + add; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | 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; |