using ActionGameFramework.Health;
|
using TowerDefense.Agents;
|
using TowerDefense.UI.HUD;
|
using UnityEngine;
|
using KTGMGemClient;
|
|
namespace TowerDefense.Towers.Projectiles
|
{
|
[RequireComponent(typeof(Damager))]
|
public class BallisticAttack : MonoBehaviour
|
{
|
/// <summary>
|
/// 链式攻击的概率,目前只有一个链式攻击的模式,暂时不需要处理细节,先测试起来
|
/// </summary>
|
public float chainAttackRate = 0;
|
|
/// <summary>
|
/// The Damager attached to the object
|
/// </summary>
|
protected Damager damager;
|
|
/// <summary>
|
/// 攻击增加.
|
/// </summary>
|
public float attackRise { get; set; }
|
|
public Tower TowerPtr;
|
|
/// <summary>
|
/// 处理代理收到的伤害,这里需要判断代理的类型分别去处理
|
/// </summary>
|
/// <param name="enemy"></param>
|
/// <param name="attributeId">子弹的属性id</param>
|
public void DealDamage(Targetable enemy, Damager damager = null)
|
{
|
switch ((enemy as Agent).AgentType)
|
{
|
case SpawnAgentType.Normal:
|
HandleNormal(enemy, damager);
|
break;
|
case SpawnAgentType.BubbleBomb:
|
HandleBubbleBomb(enemy);
|
break;
|
case SpawnAgentType.WoodPile:
|
HandleWoodPile(enemy);
|
break;
|
}
|
}
|
|
/// <summary>
|
/// 处理木桩墙壁收到的伤害
|
/// </summary>
|
/// <param name="enemy"></param>
|
private void HandleWoodPile(Targetable enemy)
|
{
|
float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel);
|
|
if (TowerPtr.ElfId == 301)
|
basicDamage *= (enemy as WoodPileAgent).FireHurtRate;
|
|
int tid = enemy.liveID;
|
Vector3 backPos = enemy.position;
|
|
// 这里也可以把碰撞点传进来
|
enemy.TakeDamage(basicDamage, enemy.position, damager.alignmentProvider);
|
|
if (TowerPtr.ElfId == 301)
|
EndlessGameUI.instance.FloatRestrainWord(enemy.position);
|
}
|
|
/// <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>
|
public static bool IsCrit(int elfId)
|
{
|
elf_info info = ElfInfoData.GetDataById(elfId);
|
float crit = 0f;
|
|
if (info != null)
|
crit = info.b_crit / 1000f;
|
|
CritProbabilityAdd critProbabilityAdd = (CritProbabilityAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritProbabilityAdd);
|
|
if (critProbabilityAdd != null)
|
crit = critProbabilityAdd.GetCrit(elfId, crit);
|
|
float random = UnityEngine.Random.Range(0, 1f);
|
|
return random <= crit;
|
}
|
|
/// <summary>
|
/// 获取暴击伤害增加比率
|
/// </summary>
|
/// <returns></returns>
|
public static float GetCritDamageRate(int elfId)
|
{
|
CritDamageAdd critDamageAdd = (CritDamageAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.CritDamageAdd);
|
|
return critDamageAdd == null ? 0 : critDamageAdd.GetCritDamageRate(elfId);
|
}
|
|
/// <summary>
|
/// 处理普通小怪和boss收到的伤害
|
/// </summary>
|
/// <param name="enemy"></param>
|
private void HandleNormal(Targetable enemy, Damager damager)
|
{
|
// 保证强化子弹只会击退一个不会击退多个
|
if (TowerPtr != null && damager.IsEnhancedBullet && damager.IsRepeled) return;
|
|
// 基础伤害 = elf_info 基础攻击力 * elf_upgrade 攻击比率 / 1000f
|
float basicDamage = ElfInfoData.GetBasicDamage(TowerPtr.ElfId, TowerPtr.currentLevel);
|
elf_info info = ElfInfoData.GetDataById(TowerPtr.ElfId);
|
|
// 处理PVE无尽模式,buff增加的伤害
|
if (EndlessBuffManager.instanceExists)
|
basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, TowerPtr.ElfId);
|
|
bool crit = IsCrit(TowerPtr.ElfId);
|
|
if (crit)
|
{
|
float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f;
|
basicDamage *= 1 + basicCritDamageRate + GetCritDamageRate(TowerPtr.ElfId);
|
}
|
|
// 玉米强化子弹10倍伤害
|
if (damager.IsEnhancedBullet)
|
basicDamage *= 10f;
|
|
bool needFrost = HandleWaterFrost(TowerPtr.ElfId, (enemy as Agent), ref basicDamage);
|
|
int deathCount = 0;
|
|
// 提前处理非当前Enemy的爆炸攻击:
|
if (chainAttackRate > 0)
|
deathCount = AgentInsManager.instance.StartExplodeAttack((Agent)enemy, basicDamage);
|
|
int tid = enemy.liveID;
|
Vector3 backPos = enemy.position;
|
|
// 这里也可以把碰撞点传进来
|
enemy.TakeDamage(basicDamage, 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, basicDamage, TowerPtr.ElfId);
|
|
if (!enemy.opponentAgent)
|
{
|
if (GameUI.instanceExists)
|
GameUI.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);
|
}
|
|
// 播放受击动画:
|
if (!enemy.isDead && enemy.liveID == tid)
|
{
|
(enemy as Agent).PlayOnHit();
|
|
// 如果是玉米强化子弹的攻击,要处理击退的效果
|
if (TowerPtr != null && damager.IsEnhancedBullet && !damager.IsRepeled)
|
{
|
damager.IsRepeled = true;
|
(enemy as Agent).AgentBeRepelled();
|
}
|
}
|
}
|
|
/// <summary>
|
/// 处理水精灵冰冻
|
/// </summary>
|
/// <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)
|
{
|
bool needFrost = false;
|
|
if (elfId != 201) return needFrost;
|
|
// 处理冰冻状态中的额外伤害
|
if (enemy.IsFrost)
|
{
|
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 needFrost;
|
}
|
|
/// <summary>
|
/// 处理塔位的属性攻击
|
/// </summary>
|
/// <param name="enemy"></param>
|
/// <param name="elfId">精灵Id</param>
|
protected void ProcessTowerAttributeAttack(Targetable enemy, float damage, int elfId)
|
{
|
switch (elfId)
|
{
|
case 201: // 减速.
|
SlowDown slowDown = (SlowDown)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.SlowDown);
|
(enemy as Agent).addSpeedSlowRate(0.2f + (slowDown != null ? slowDown.GetSlowDownAdd(TowerPtr.ElfId) : 0));
|
break;
|
case 301: // 中毒
|
// enemy.poisonAgent(damage, attid);
|
// enemy.SetTargetableMatColor(Color.green);
|
break;
|
}
|
return;
|
}
|
|
/// <summary>
|
/// Cache the damager component attached to this object
|
/// </summary>
|
protected virtual void Awake()
|
{
|
damager = GetComponent<Damager>();
|
attackRise = 0.0f;
|
}
|
}
|
}
|