using System;
using UnityEngine;
using BaseGames.Combat;
using BaseGames.Core.Events;
namespace BaseGames.Equipment
{
///
/// 命中触发效果类型。
///
public enum OnHitEffectType
{
ApplyPoison,
ApplyFire,
KnockbackBoost
}
///
/// 命中触发护符效果(架构 09_ProgressionModule §5)。
/// 订阅 HitConfirmedEventChannelSO("EVT_HitConfirmed") 并按概率对命中目标施加状态效果。
/// KnockbackBoost 类型通过 DamageInfo.KnockbackForce 标记,由 HurtBox 流水线读取。
///
[Serializable]
public class OnHitEffect : ICharmEffect
{
public OnHitEffectType effectType;
[Range(0f, 1f)]
public float chance; // 触发概率(0~1)
private HitConfirmedEventChannelSO _onHitChannel;
private EventSubscription _sub;
public void OnEquip(EquipmentContext ctx)
{
_onHitChannel = ctx.Events?.Get("EVT_HitConfirmed");
_sub = _onHitChannel?.Subscribe(HandleHit);
}
public void OnUnequip(EquipmentContext ctx)
{
_sub?.Dispose();
_sub = null;
_onHitChannel = null;
}
private void HandleHit(HitInfo info)
{
if (UnityEngine.Random.value > chance) return;
switch (effectType)
{
case OnHitEffectType.ApplyPoison:
info.HitTransform?.GetComponentInParent()
?.ApplyStatusEffect(DamageType.Poison);
break;
case OnHitEffectType.ApplyFire:
info.HitTransform?.GetComponentInParent()
?.ApplyStatusEffect(DamageType.Fire);
break;
case OnHitEffectType.KnockbackBoost:
// KnockbackBoost 在 HitBox 构建 DamageInfo 前生效,
// 此处为命中后的反馈(可在此播放特效;实际击退已在 HurtBox 流水线处理)。
break;
}
}
public string GetEffectDescription() => $"命中时 {chance * 100:0}% 概率附加 {effectType}";
}
}