using System;
using Cielonos.MainGame.Characters;
using SLSUtilities.General;
using UnityEngine;
namespace Cielonos.MainGame.Inventory.Collections
{
///
/// “背水”协议 / Last Stand Protocol
/// 当玩家生命值低于一定百分比(25%)时,增加造成的伤害(25%)但同时也增加受到的伤害(25%)。当生命值回升到阈值以上时,效果消失。
///
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 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();
}
///
/// 根据当前生命值比例评估 Last Stand 状态,处理激活/关闭切换。
///
private void EvaluateState()
{
bool shouldBeActive = IsInLastStand;
if (shouldBeActive && !_isActive)
{
ActivateLastStand();
}
else if (!shouldBeActive && _isActive)
{
DeactivateLastStand();
}
}
///
/// 激活 Last Stand:修改角色属性并刷新,显示提示文本。
///
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");
}
///
/// 关闭 Last Stand:还原角色属性修改并刷新,显示提示文本。
///
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;
}
}
}