using Core.Utilities; using System.Collections.Generic; using KTGMGemClient; using UnityEngine; using TowerDefense.Towers; namespace TowerDefense.Level { /// /// 无尽模式buff管理器 /// public class EndlessBuffManager : Singleton { /// /// 玩家拥有的buff列表 /// public List BuffList; protected override void Awake() { base.Awake(); BuffList = new List(); } /// /// 玩家获得一个buff /// public void AddBuff(EndlessBuffConfig buff) { if (buff.LifeCycleType == EndlessBuffLifeCycleType.Once) { switch (buff.EffectType) { case EndlessBuffEffectType.Gold: // 一次性增加金币 EndlessLevelManager.instance.Currency.AddCurrency(buff.Config.buff_effect[1]); break; case EndlessBuffEffectType.ObtainTower: // 是否到了技能时间 bool canSkill = EndlessUIStart.instance.GameStartTime <= EndlessRandomTower.SKILL_TOWER_TIME; Tower newTower = EndlessRandomTower.instance.GetRandomTower(canSkill); if (!EndlessRandomTower.instance.RandomPlaceTower(newTower, buff.Config.buff_effect[1] - 1, 0)) EndlessLevelManager.instance.Currency.AddCurrency(buff.Config.buff_effect[2]); break; } return; } BuffList.Add(buff); } /// /// 直接从buff列表中移除某一个buff /// /// public void RemoveBuff(EndlessBuffConfig buff) { BuffList.Remove(buff); } /// /// 更新buff列表,以波为单位,一个波次结束后调用此方法去更新buff列表 /// 这个方法主要是处理buff的生命周期,把无效的移除掉 /// /// 一次更新的波数,默认以一波为一个节点去更新 public void UpdateBuffList(int waves = 1) { int len = BuffList.Count; for (int i = 0; i < len; ++i) { if (BuffList[i].LifeCycleType == EndlessBuffLifeCycleType.LimitedWave) { BuffList[i].TackEffectWaves += waves; if (BuffList[i].TackEffectWaves >= BuffList[i].TotalEffectWaves) { // 超过波次数量限制,移除掉 BuffList.Remove(BuffList[i]); len = BuffList.Count; } } } } /// /// 根据buff效果类型获得buff列表数据 /// /// buff效果类型 /// 宝石技能id public List GetBuffListByEffectType(EndlessBuffEffectType type, int id) { List ret = new List(); // 暂且先这么处理吧 如果1:火 2:水 3:木 int attributeId = (int)Mathf.Floor(id / 10000f); for (int i = 0; i < BuffList.Count; ++i) { if (BuffList[i].EffectType == type) { bool isWork = false; switch (BuffList[i].UseTarget) { case EndlessBuffUseTarget.All: isWork = true; break; case EndlessBuffUseTarget.Element: isWork = attributeId == BuffList[i].Config.target_type[1]; break; case EndlessBuffUseTarget.Designated: isWork = id == BuffList[i].Config.target_type[1]; break; } if (isWork) ret.Add(BuffList[i]); } } return ret; } } }