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, }; } } }