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; } } }