using Core.Utilities;
using System.Collections.Generic;
using UnityEngine;
namespace KTGMGemClient
{
///
/// 无尽模式buff管理器
///
public class EndlessBuffManager : Singleton
{
///
/// 玩家拥有的buff列表
///
public List BuffList;
///
/// buff处理类实例列表
///
private List instanceList;
private void Start()
{
BuffList = new List();
// 新增buff,需要把实例添加进来
instanceList = new List()
{
// 攻击力增加的buff没有什么需要处理的,如果需要新写个类继承EndlessBuff即可
new EndlessBuff(),
new GoldAdd(),
new ObtainTower(),
new DecreaseTowerAttackCD(),
new CritProbabilityAdd(),
new CritDamageAdd(),
new CritBulletAdd(),
new SlowDown(),
new FireRateAdd(),
new SkillLevelUp(),
new DecreaseWoodChargeTime(),
new FrostProbabilityAdd(),
new FrostDamageAdd(),
new FrostTimeAdd()
};
}
///
/// 玩家获得一个buff
///
public void AddBuff(EndlessBuffConfig buff)
{
Debug.Log($"--- 获得buff:id {buff.Config.id}, name:{buff.Config.name} description:{buff.Config.brief} ---");
++buff.SelectCount;
// 有出现次数限制的
if (buff.Config.get_times > 0 && buff.SelectCount >= buff.Config.get_times)
EndlessBuffData.RemoveFromBuffPool(buff.Config.id);
BuffList.Add(buff);
EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.PlayBuffPS, buff.Config.get_buff);
EndlessBuff endlessBuff = GetBuffInstanceByType((EndlessBuffEffectType)buff.Config.buff_effect[0]);
if (endlessBuff != null)
{
endlessBuff.BuffList.Add(buff);
endlessBuff.Handle();
// 如果是一次性生效的buff,直接移除掉
if (buff.LifeCycleType == EndlessBuffLifeCycleType.Once)
{
endlessBuff.BuffList.Remove(buff);
RemoveBuff(buff);
}
}
}
///
/// 直接从buff列表中移除某一个buff
///
///
public void RemoveBuff(EndlessBuffConfig buff)
{
BuffList.Remove(buff);
EndlessBuff endlessBuff = GetBuffInstanceByType((EndlessBuffEffectType)buff.Config.buff_effect[0]);
endlessBuff?.LoseEffect();
}
///
/// 更新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)
{
// 超过波次数量限制,移除掉
RemoveBuff(BuffList[i]);
len = BuffList.Count;
}
}
}
EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.EndlessBuffRefresh);
}
///
/// 根据buff效果类型获得buff列表数据
///
/// buff效果类型
/// 宝石技能id
public List GetBuffListByEffectType(EndlessBuffEffectType type, int id)
{
List ret = new List();
// 暂且先这么处理吧 如果1:火 2:水 3:木
int attributeId = (int)Mathf.Floor(id / 100f);
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;
}
///
/// 根据buff类型获得buff处理类实例
///
///
///
public EndlessBuff GetBuffInstanceByType(EndlessBuffEffectType type)
{
int tmp = (int)type - 1;
if ((int)type - 1 >= instanceList.Count) return null;
return instanceList[(int)type - 1];
}
///
/// 处理PVE无尽模式buff增加的伤害
///
///
public float ProcessEndlessBuffAttack(float finalDamage, int elfId)
{
List list = EndlessBuffManager.instance.GetBuffListByEffectType(EndlessBuffEffectType.AttackAdd, elfId);
if (list.Count == 0) return 0;
float ratio = 0;
float add = 0;
for (int i = 0; i < list.Count; ++i)
{
ratio += list[i].Config.buff_effect[1];
add += list[i].Config.buff_effect[2];
}
return finalDamage * (ratio / 100f) + add;
}
}
}