using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using TowerDefense.Level;
using Core.Utilities;
using TowerDefense.Agents;
using Core.Health;
using TowerDefense.UI.HUD;
using TowerDefense.Towers;
using TowerDefense.Towers.Projectiles;
/**
* 水精灵技能-冷冻气息控制脚本
* @Author: chenxin
* @Date: 2020-11-12 14:41:23
*/
namespace KTGMGemClient
{
public class FreezeBreath : MonoBehaviour
{
public Image ProgressImg;
private int currentProgress;
///
/// 充能时间(s)
///
public static float ChargeTime { get; private set; } = 10f;
///
/// 伤害时间
///
public float EffectTime { get; private set; } = 2f;
///
/// 伤害结算次数
///
///
public int DamageCount { get; private set; } = 6;
///
/// 整个技能时间
///
public float SkillTime { get; private set; } = 2.5f;
///
/// 当前的充能进度
///
public int CurrentProgress { get; private set; }
///
/// 喷冰特效
///
public GameObject FreezeJet;
public int ReleaseCount { get; set; }
public void SetCtrlProgress(int progress)
{
if (progress == (int)Mathf.Floor(ChargeTime))
progress = 0;
ProgressImg.rectTransform.DOKill();
SetProgress(progress, false);
}
public void SetProgress(int progress, bool ani = true)
{
if (CurrentProgress == progress) return;
CurrentProgress = progress;
ProgressImg.rectTransform.DOScaleY(progress / ChargeTime, ani ? 0.3f : 0);
}
public void SetProgress(float progress)
{
ProgressImg.rectTransform.DOScaleY(progress / ChargeTime, 0);
CurrentProgress = (int)Mathf.Floor(progress);
}
///
/// 释放冷冻气息
///
/// 哪条兵线
/// 伤害值
public void ReleaseFreeze(int waveLineId, Tower tower, IAlignmentProvider alignmentProvider)
{
WaveLineAgentInsMgr[] agentInsMgrs = AgentInsManager.instance.GetWaveLineList();
WaveLineAgentInsMgr waveLineAgentInsMgr = agentInsMgrs[waveLineId];
List list = waveLineAgentInsMgr.listAgent;
if (list.Count == 0) return;
List agentList = new List();
for (int i = 0; i < list.Count; ++i)
{
agentList.Add(list[i]);
}
// 一次性死亡数量
int deathCount = 0;
while (agentList.Count > 0)
{
Agent agent = agentList[0];
agentList.Remove(agentList[0]);
if (agent.isDead) continue;
if (agent.AgentType == SpawnAgentType.Normal)
{
float damage = GetFinalDamage(tower, agent);
bool needFrost = BallisticAttack.HandleWaterFrost(201, agent, ref damage);
agent.addSpeedSlowRate(0.15f);
agent.PlayOnHitImmediately();
if (!agent.HasSlowDownText)
{
EndlessGameUI.instance.FloatSlowDownWord(agent.position);
agent.HasSlowDownText = true;
}
agent.TakeDamage(damage, agent.position, alignmentProvider);
if (agent.isDead)
++deathCount;
else if (needFrost)
{
agent.IsFrost = true;
agent.FrostRemainTime = FrostTimeAdd.DefaultFrostTime;
FrostTimeAdd frostTimeAdd = (FrostTimeAdd)EndlessBuffManager.instance.GetBuffInstanceByType(EndlessBuffEffectType.FrostTimeAdd);
if (frostTimeAdd != null)
agent.FrostRemainTime = frostTimeAdd.GetFrostTime(201);
}
}
else if (agent.AgentType == SpawnAgentType.BubbleBomb)
EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBossSkillBubbleBombGetHit, (agent as BubbleBombAgent).Id);
}
if (deathCount > 1)
EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessOneTimeKillCount, deathCount);
}
private float GetFinalDamage(Tower tower, Agent agent)
{
if (tower == null || agent == null) return 0;
int elfId = 201;
// 基础伤害 = elf_info 基础攻击力 * elf_upgrade 攻击比率 / 1000f
float basicDamage = ElfInfoData.GetBasicDamage(elfId, tower.currentLevel);
elf_info info = ElfInfoData.GetDataById(elfId);
// 处理PVE无尽模式,buff增加的伤害
if (EndlessBuffManager.instanceExists)
basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, elfId);
bool crit = BallisticAttack.IsCrit(elfId);
if (crit)
{
float basicCritDamageRate = info != null ? info.b_critdmg / 1000f : 0f;
basicDamage *= 1 + basicCritDamageRate + BallisticAttack.GetCritDamageRate(elfId);
}
return basicDamage;
}
public void PlayFreezeEffect(int waveLineId)
{
WaveLineAgentInsMgr[] agentInsMgrs = AgentInsManager.instance.GetWaveLineList();
WaveLineAgentInsMgr waveLineAgentInsMgr = agentInsMgrs[waveLineId];
List list = waveLineAgentInsMgr.listAgent;
if (list.Count == 0) return;
GameObject obj = Poolable.TryGetPoolable(FreezeJet);
ParticleSystem ps = obj.GetComponent();
if (ps == null) ps = obj.transform.GetChild(0).GetComponent();
ps.transform.position = EndlessLevelManager.instance.WaveManager.GetWaveEndPos(waveLineId);
ps.Play();
}
}
}