using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Entity { /// /// 角色的护盾,对不同的魔法类型有不同值 /// public class Shield { /// /// 绑定到特效的护盾对象。键为特效,值为对应的护盾对象。 /// public Dictionary ShieldOfEffects { get; } = []; /// /// 物理护盾 /// public double Physical { get; set; } = 0; /// /// 无属性魔法护盾 /// public double None { get; set; } = 0; /// /// 星痕魔法护盾 /// public double Starmark { get; set; } = 0; /// /// 纯粹结晶护盾 /// public double PurityNatural { get; set; } = 0; /// /// 纯现代结晶护盾 /// public double PurityContemporary { get; set; } = 0; /// /// 光护盾 /// public double Bright { get; set; } = 0; /// /// 影护盾 /// public double Shadow { get; set; } = 0; /// /// 元素护盾 /// public double Element { get; set; } = 0; /// /// 紫宛护盾 /// public double Aster { get; set; } = 0; /// /// 时空护盾 /// public double SpatioTemporal { get; set; } = 0; /// /// 混合护盾 /// public double Mix { get; set; } = 0; /// /// 总计混合护盾 /// public double TotalMix => Mix + ShieldOfEffects.Values.Where(soe => soe.ShieldType == ShieldType.Mix && soe.Shield > 0).Sum(soe => soe.Shield); /// /// 总计物理护盾 /// public double TotalPhysical => Physical + ShieldOfEffects.Values.Where(soe => soe.ShieldType == ShieldType.Physical && soe.Shield > 0).Sum(soe => soe.Shield); /// /// 总计魔法护盾 /// public double TotalMagical => None + Starmark + PurityNatural + PurityContemporary + Bright + Shadow + Element + Aster + SpatioTemporal + ShieldOfEffects.Values.Where(soe => soe.ShieldType == ShieldType.Magical && soe.Shield > 0).Sum(soe => soe.Shield); /// /// 获取或设置护盾值 /// /// /// /// public double this[bool isMagic, MagicType type = MagicType.None] { get { if (isMagic) { return type switch { MagicType.Starmark => Starmark, MagicType.PurityNatural => PurityNatural, MagicType.PurityContemporary => PurityContemporary, MagicType.Bright => Bright, MagicType.Shadow => Shadow, MagicType.Element => Element, MagicType.Aster => Aster, MagicType.SpatioTemporal => SpatioTemporal, _ => None }; } return Physical; } set { if (isMagic) { switch (type) { case MagicType.Starmark: Starmark = value; break; case MagicType.PurityNatural: PurityNatural = value; break; case MagicType.PurityContemporary: PurityContemporary = value; break; case MagicType.Bright: Bright = value; break; case MagicType.Shadow: Shadow = value; break; case MagicType.Element: Element = value; break; case MagicType.Aster: Aster = value; break; case MagicType.SpatioTemporal: SpatioTemporal = value; break; default: None = value; break; } } else { Physical = value; } } } /// /// 添加一个绑定到特效的护盾,注意:如果特效已经存在护盾,则会覆盖原有护盾。 /// /// public void AddShieldOfEffect(ShieldOfEffect soe) { ShieldOfEffects[soe.Effect] = soe; } /// /// 移除某个特效的护盾 /// /// public void RemoveShieldOfEffect(Effect effect) { ShieldOfEffects.Remove(effect); } /// /// 计算并更新特效的护盾值,如果护盾值小于等于 0,则移除该特效的护盾。 /// /// /// /// public double CalculateShieldOfEffect(Effect effect, double damage) { if (ShieldOfEffects.TryGetValue(effect, out ShieldOfEffect? soe)) { soe.Calculate(damage); if (soe.Shield <= 0) { soe.Shield = 0; ShieldOfEffects.Remove(effect); } } return soe?.Shield ?? 0; } /// /// 复制一个护盾对象。注意:不会复制绑定到特效的护盾对象。 /// /// public Shield Copy() { return new() { Physical = Physical, None = None, Starmark = Starmark, PurityNatural = PurityNatural, PurityContemporary = PurityContemporary, Bright = Bright, Shadow = Shadow, Element = Element, Aster = Aster, SpatioTemporal = SpatioTemporal, Mix = Mix }; } } /// /// 绑定到特效的护盾对象。这个类没有 JSON 转换器支持。 /// /// /// /// /// public class ShieldOfEffect(Effect effect, double shield, ShieldType shieldType, MagicType magicType = MagicType.None) { public Effect Effect { get; } = effect; public ShieldType ShieldType { get; set; } = shieldType; public MagicType MagicType { get; set; } = magicType; public double Shield { get; set; } = shield; public double Calculate(double damage) { Shield -= damage; return Shield; } } }