using System.Collections.Generic;
using UnityEngine;
using TowerDefense.Towers.Placement;
using TowerDefense.Towers;
using TowerDefense.UI.HUD;
/**
* 禁锢泡泡
* @Author: chenxin
* @Date: 2020-12-03 10:54:12
*/
namespace KTGMGemClient
{
public class BossSkillBondageBubble : EndlessBossSkill
{
public BossSkillBondageBubble(boss_skill param) : base(param) { }
///
/// 禁锢警告时间
///
private float BondageTime = 1f;
public override void Init()
{
base.Init();
Debug.Log("--------------------- 禁锢泡泡技能初始化 ---------------------");
}
///
/// 释放技能
///
public override void ReleaseSkill()
{
base.ReleaseSkill();
switch ((EndlessBossSkillUseTarget)SkillData.target[0])
{
case EndlessBossSkillUseTarget.Tower:
switch ((EndlessBossSkillTowerType)SkillData.target[1])
{
case EndlessBossSkillTowerType.All:
ReleaseAll();
break;
case EndlessBossSkillTowerType.Single:
ReleaseSingle();
break;
case EndlessBossSkillTowerType.Random:
ReleaseRandom();
break;
case EndlessBossSkillTowerType.MaxAttack:
ReleaseMaxAttack();
break;
default:
Debug.LogWarning($"---- 禁锢泡泡技能,目标参数不正确 Target[{SkillData.target[0]}, {SkillData.target[1]}] ----");
break;
}
break;
default:
Debug.LogWarning("---- 禁锢泡泡技能只支持作用在精灵塔上 ----");
break;
}
}
private void ReleaseAll()
{
List tunelIdList = GetTunelList();
int dy = TowerPlacementGridEndless.instance.dimensions.y;
int attackRows = TowerPlacementGridEndless.instance.AttackRowNumbers;
for (int i = 0; i < tunelIdList.Count; ++i)
{
for (int j = dy - attackRows; j < dy; ++j)
{
Tower tower = EndlessGameUI.instance.FindTowerWithGridIdx(tunelIdList[i] - 1, j);
if (tower != null && tower.gameObject.activeInHierarchy && !tower.IsBondage)
{
tower.IsBondage = true;
tower.IsStartBondage = true;
tower.BondageTime = SkillData.effect[0];
tower.BondageClickDecreaseTime = SkillData.effect[1];
tower.BondageWarningTime = BondageTime;
tower.BondageWarning();
}
}
}
}
private void ReleaseSingle()
{
List tunelIdList = GetTunelList();
int dy = TowerPlacementGridEndless.instance.dimensions.y;
int attackRows = TowerPlacementGridEndless.instance.AttackRowNumbers;
for (int i = 0; i < tunelIdList.Count; ++i)
{
// 只作用于第一排的塔
Tower tower = EndlessGameUI.instance.FindTowerWithGridIdx(tunelIdList[i] - 1, 3);
if (tower != null && tower.gameObject.activeInHierarchy && !tower.IsBondage)
{
tower.IsBondage = true;
tower.IsStartBondage = true;
tower.BondageTime = SkillData.effect[0];
tower.BondageClickDecreaseTime = SkillData.effect[1];
tower.BondageWarningTime = BondageTime;
tower.BondageWarning();
break;
}
}
}
private void ReleaseRandom()
{
List tunelIdList = GetTunelList();
int dy = TowerPlacementGridEndless.instance.dimensions.y;
int attackRows = TowerPlacementGridEndless.instance.AttackRowNumbers;
for (int i = 0; i < tunelIdList.Count; ++i)
{
List towerList = new List();
for (int j = dy - 1; j >= dy - attackRows; --j)
{
Tower tower = EndlessGameUI.instance.FindTowerWithGridIdx(tunelIdList[i] - 1, j);
if (tower != null && tower.gameObject.activeInHierarchy && !tower.IsBondage)
towerList.Add(tower);
}
if (towerList.Count > 0)
{
// 现在只作用于第一排的塔
// int random = UnityEngine.Random.Range(0, towerList.Count);
int random = 0;
towerList[random].IsBondage = true;
towerList[random].IsStartBondage = true;
towerList[random].BondageTime = SkillData.effect[0];
towerList[random].BondageClickDecreaseTime = SkillData.effect[1];
towerList[random].BondageWarningTime = BondageTime;
towerList[random].BondageWarning();
}
}
}
private void ReleaseMaxAttack()
{
List tunelIdList = GetTunelList();
int dy = TowerPlacementGridEndless.instance.dimensions.y;
int attackRows = TowerPlacementGridEndless.instance.AttackRowNumbers;
for (int i = 0; i < tunelIdList.Count; ++i)
{
Tower tower = null;
for (int j = dy - 1; j >= dy - attackRows; --j)
{
Tower tmp = EndlessGameUI.instance.FindTowerWithGridIdx(tunelIdList[i] - 1, j);
if (tmp != null && tmp.gameObject.activeInHierarchy && !tmp.IsBondage)
{
if (tower == null)
tower = tmp;
else
{
float tmpDamage = GetTowerDamage(tmp);
float towerDamage = GetTowerDamage(tower);
if (tmpDamage > towerDamage)
tower = tmp;
}
}
}
if (tower != null)
{
tower.IsBondage = true;
tower.IsStartBondage = true;
tower.BondageTime = SkillData.effect[0];
tower.BondageClickDecreaseTime = SkillData.effect[1];
tower.BondageWarningTime = BondageTime;
tower.BondageWarning();
}
}
}
///
/// 计算塔的攻击力
///
///
///
private float GetTowerDamage(Tower tower)
{
if (tower == null) return 0;
// 基础伤害 = elf_info 基础攻击力 * elf_upgrade 攻击比率 / 1000f
float basicDamage = ElfInfoData.GetBasicDamage(tower.ElfId, tower.currentLevel);
// 处理PVE无尽模式,buff增加的伤害
if (EndlessBuffManager.instanceExists)
basicDamage += EndlessBuffManager.instance.ProcessEndlessBuffAttack(basicDamage, tower.ElfId);
return basicDamage;
}
}
}