using XGame.Database;
using XGame.Framework;
namespace FL.Battle.Buffs
{
///
/// 元素易伤debuff
///
public class ElementAddDebuff : Buff
{
private int _autoTickLayer = 3;
private int _elementTickLayer = 5;
//private EElementType _elementType;
protected override void OnInited()
{
//_elementType = (EElementType)(Table.BuffType / 10 % 10); // BuffType的十位数为元素类型
Assert.IsTrue((Table.BuffType / 10 % 10) == (int)ElementType, $"元素易伤配置错误. BuffType:{Table.BuffType} ElementType:{ElementType}");
_autoTickLayer = Table.BuffTypeNum[2];
_elementTickLayer = Table.BuffTypeNum[4];
}
protected override void OnDispose()
{
}
public bool IsReachLayer3()
{
return Layers >= _autoTickLayer;
}
///
/// 是否达到3层元素易伤条件
/// AddBuff时判定
///
///
///
public bool TryTickLayer3(ICombatCalculation attacker)
{
if (Layers < _autoTickLayer) return false;
if (Layers == _autoTickLayer)
{
var buffOrSkillId = Table.BuffTypeNum[3];
if (Table.BuffType == (int)EBuffType.ElementAddPoison)
{
var calculation = Context.Calculation.GetSkillTrigger(buffOrSkillId, attacker);
calculation?.TickSkill(buffOrSkillId, Context.Entity.EntityId);
}
else
{
var calculation = Context.Calculation.GetBuffTrigger(buffOrSkillId, attacker);
calculation?.TickBuff(buffOrSkillId);
}
}
return true;
}
///
/// 是否达到5层元素易伤条件
/// 攻击生效时判定
///
///
///
public bool IsReachLayer5(EElementType elementType)
{
return elementType == ElementType && _elementTickLayer == Layers;
}
public bool TryTickBuff(int damage, EElementType elementType, ICombatCalculation attacker)
{
if (elementType == EElementType.None)
return false;
var isReach = IsReachLayer5(elementType);
var isSkill = false;
var buffOrSkillId = isReach ? Table.BuffTypeNum[5] : Table.BuffTypeNum[0];
var probability = isReach ? TableUtils.Multiple : Table.BuffTypeNum[1];
var addLayer = 1;
switch (BuffType)
{
case EBuffType.ElementAddFire:
case EBuffType.ElementAddWind:
{
isSkill = isReach;
}
break;
case EBuffType.ElementAddThunder:
{
isSkill = true;
}
break;
case EBuffType.ElementAddIce:
{
if (!isReach)
return false;
// TODO 给主角加冰盾buff,
//probability = 0;
}
break;
case EBuffType.ElementAddPoison:
{
addLayer = isReach ? Table.BuffTypeNum[5] : Layers;
buffOrSkillId = Table.BuffTypeNum[0];
}
break;
}
if (isSkill)
{
var calculation = Context.Calculation.GetSkillTrigger(buffOrSkillId, attacker);
calculation?.TickSkill(buffOrSkillId, Context.Entity.EntityId, probability);
}
else
{
var calculation = Context.Calculation.GetBuffTrigger(buffOrSkillId, attacker);
calculation?.TickBuff(buffOrSkillId, probability, addLayer, damage);
}
if (isReach)
{
Listener?.OnCompleted(TableId);
}
return true;
}
}
}