using UnityEngine;
namespace Colosseum.Combat
{
///
/// 피해가 방어/회피 규칙과 함께 전달될 때 사용하는 판정 등급입니다.
///
public enum DamageMitigationTier
{
Normal,
Unblockable,
Undodgeable,
}
///
/// 피해량과 출처, 방어 가능 여부를 함께 전달하는 런타임 컨텍스트입니다.
///
public readonly struct DamageContext
{
public DamageContext(float amount, object source = null, DamageMitigationTier mitigationTier = DamageMitigationTier.Normal)
{
Amount = Mathf.Max(0f, amount);
Source = source;
MitigationTier = mitigationTier;
}
///
/// 원본 피해량입니다.
///
public float Amount { get; }
///
/// 피해 출처입니다. GameObject 또는 Component가 일반적입니다.
///
public object Source { get; }
///
/// 방어/회피 허용 규칙입니다.
///
public DamageMitigationTier MitigationTier { get; }
///
/// 현재 피해가 방어 가능한지 여부입니다.
///
public bool CanBeGuarded => MitigationTier != DamageMitigationTier.Unblockable;
///
/// 현재 피해가 회피 가능한지 여부입니다.
///
public bool CanBeDodged => MitigationTier != DamageMitigationTier.Undodgeable;
///
/// 피해 출처를 GameObject로 해석합니다.
///
public GameObject SourceGameObject => ResolveSourceGameObject(Source);
///
/// 같은 메타데이터를 유지한 채 피해량만 교체합니다.
///
public DamageContext WithAmount(float amount)
{
return new DamageContext(amount, Source, MitigationTier);
}
///
/// object 기반 출처를 GameObject로 변환합니다.
///
public static GameObject ResolveSourceGameObject(object source)
{
return source switch
{
GameObject sourceObject => sourceObject,
Component component => component.gameObject,
_ => null,
};
}
}
}