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

115 lines
4.3 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.Characters;
using SLSUtilities.General;
using UnityEngine;
namespace Cielonos.MainGame.Inventory.Collections
{
/// <summary>
/// “背水”协议 / Last Stand Protocol
/// 当玩家生命值低于一定百分比25%增加造成的伤害25%但同时也增加受到的伤害25%)。当生命值回升到阈值以上时,效果消失。
/// </summary>
public partial class LastStandProtocol : PassiveEquipmentBase
{
// 触发阈值(生命值百分比),从 passiveAttributeData 读取
private float HealthThreshold => passiveAttributeData.itemAttributes.GetValueOrDefault("HealthThreshold", 0.25f);
// Last Stand 激活时FinalDamageDealtMultiplier 的叠加量
private float DamageDealtBonus => passiveAttributeData.itemAttributes.GetValueOrDefault("DamageDealtBonus", 0.25f);
// Last Stand 激活时FinalDamageReceivedMultiplier 的叠加量(承受更多伤害)
private float DamageReceivedAmplifier => passiveAttributeData.itemAttributes.GetValueOrDefault("DamageReceivedAmplifier", 0.25f);
private bool _isActive;
private bool IsInLastStand => GetHealthPercentage() < HealthThreshold;
public override void OnObtained()
{
base.OnObtained();
Action<float> onHealthChanged = OnHealthChanged;
player.eventSm.onHealthChanged.Add("LastStandProtocol", onHealthChanged.ToPrioritized());
// 装备获取时立即检查当前状态
EvaluateState();
}
public override void OnDiscarded()
{
// 移除前先清理激活状态
if (_isActive)
{
DeactivateLastStand();
}
player.eventSm.onHealthChanged.Remove("LastStandProtocol");
base.OnDiscarded();
}
}
public partial class LastStandProtocol
{
private void OnHealthChanged(float delta)
{
EvaluateState();
}
/// <summary>
/// 根据当前生命值比例评估 Last Stand 状态,处理激活/关闭切换。
/// </summary>
private void EvaluateState()
{
bool shouldBeActive = IsInLastStand;
if (shouldBeActive && !_isActive)
{
ActivateLastStand();
}
else if (!shouldBeActive && _isActive)
{
DeactivateLastStand();
}
}
/// <summary>
/// 激活 Last Stand修改角色属性并刷新显示提示文本。
/// </summary>
private void ActivateLastStand()
{
_isActive = true;
passiveAttributeSm.chaAttrPercentageChangeOfAccumulation[CharacterAttribute.FinalDamageDealtMultiplier] = DamageDealtBonus;
passiveAttributeSm.chaAttrPercentageChangeOfAccumulation[CharacterAttribute.FinalDamageReceivedMultiplier] = DamageReceivedAmplifier;
player.attributeSm.RefreshAttribute(CharacterAttribute.FinalDamageDealtMultiplier);
player.attributeSm.RefreshAttribute(CharacterAttribute.FinalDamageReceivedMultiplier);
MainGameManager.BaseCollection.InfoText().Spawn(player.centerPosition, "Last Stand Protocol: On");
}
/// <summary>
/// 关闭 Last Stand还原角色属性修改并刷新显示提示文本。
/// </summary>
private void DeactivateLastStand()
{
_isActive = false;
passiveAttributeSm.chaAttrPercentageChangeOfAccumulation.Remove(CharacterAttribute.FinalDamageDealtMultiplier);
passiveAttributeSm.chaAttrPercentageChangeOfAccumulation.Remove(CharacterAttribute.FinalDamageReceivedMultiplier);
player.attributeSm.RefreshAttribute(CharacterAttribute.FinalDamageDealtMultiplier);
player.attributeSm.RefreshAttribute(CharacterAttribute.FinalDamageReceivedMultiplier);
MainGameManager.BaseCollection.InfoText().Spawn(player.centerPosition, "Last Stand Protocol: Off");
}
private float GetHealthPercentage()
{
float maxHealth = player.attributeSm[CharacterAttribute.MaximumHealth];
if (maxHealth <= 0f) return 1f;
return player.attributeSm[CharacterAttribute.Health] / maxHealth;
}
}
}