Files
Cielonos/Assets/Scripts/MainGame/Items/PassiveEquipments/AdaptiveArmor.cs
SoulliesOfficial 649b7a5ddc 更新
2026-05-23 08:27:50 -04:00

99 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using Cielonos.MainGame.Buffs;
using Cielonos.MainGame.Buffs.Character;
using SLSUtilities.General;
namespace Cielonos.MainGame.Inventory.Collections
{
/// <summary>
/// 自适应装甲 / Adaptive Armor
/// 玩家受到伤害时获得一个持续10秒的护甲+5的Buff最高可叠加5层每次叠加刷新持续时间。
/// </summary>
public partial class AdaptiveArmor : PassiveEquipmentBase
{
private const string EventKey = "AdaptiveArmor";
public override void OnObtained()
{
base.OnObtained();
Action<AttackAreaBase, Attack.Result> onAfterGetAttacked = OnAfterGetAttacked;
player.eventSm.onAfterGetAttacked.Add(EventKey, onAfterGetAttacked.ToPrioritized());
}
public override void OnDiscarded()
{
player.eventSm.onAfterGetAttacked.Remove(EventKey);
// 移除残留的 Buff
if (player.buffSm.TryGetBuff(out TemporaryArmor existingBuff))
{
existingBuff.Remove();
}
base.OnDiscarded();
}
/// <summary>
/// 玩家被攻击后触发,施加或叠加临时护甲 Buff。
/// </summary>
private void OnAfterGetAttacked(AttackAreaBase attackArea, Attack.Result result)
{
float armorPerStack = passiveAttributeSm.GetItemAttribute("ArmorPerStack");
float duration = passiveAttributeSm.GetItemAttribute("BuffDuration");
int maxStacks = (int)passiveAttributeSm.GetItemAttribute("BuffMaxStacks");
if (armorPerStack <= 0f || duration <= 0f || maxStacks <= 0) return;
new TemporaryArmor(armorPerStack, duration, maxStacks).Apply(player, player, this);
}
}
public partial class AdaptiveArmor
{
/// <summary>
/// 自适应装甲的Buff。
/// 默认持续时间为10秒每层提供指定点护甲最多叠加指定层。每次受到伤害时如果已经有该Buff则刷新持续时间并增加一层。
/// </summary>
public class TemporaryArmor : CharacterBuffBase
{
private readonly float _armorPerStack;
public TemporaryArmor(float armorPerStack, float duration, int maxStacks)
{
Initialize(BuffType.Positive, BuffDispelLevel.Basic);
_armorPerStack = armorPerStack;
this.contentSubmodule = new ContentSubmodule(this);
this.timeSubmodule = new TimeSubmodule(this, duration);
this.unitedStackSubmodule = new UnitedStackSubmodule(this, true, maxStacks);
this.attributeSubmodule = new AttributeSubmodule(this);
}
public override bool OnBuffApply(out CharacterBuffBase existingBuff)
{
if (FindExistingSameBuff(out TemporaryArmor existing))
{
existingBuff = existing;
existing.timeSubmodule.RefreshDuration();
existing.unitedStackSubmodule.AddStack(1);
existing.UpdateArmorValue(existing.unitedStackSubmodule.stackAmount);
return false;
}
existingBuff = null;
UpdateArmorValue(unitedStackSubmodule.stackAmount);
return true;
}
/// <summary>
/// 根据当前层数更新护甲加成数值。
/// </summary>
private void UpdateArmorValue(int stacks)
{
attributeSubmodule.numericChange[CharacterAttribute.Armor] = stacks * _armorPerStack;
attributeSubmodule.RefreshAllModifiedAttributes();
}
}
}
}