using System; using System.Collections.Generic; using UnityEngine; using Colosseum.Stats; namespace Colosseum.Abnormalities { /// /// 런타임 활성 이상 상태 인스턴스 /// AbnormalityData의 인스턴스로, 실제 적용 중인 이상 상태를 관리합니다. /// public class ActiveAbnormality { /// /// 이상 상태 데이터 /// public AbnormalityData Data { get; } /// /// 효과를 건 대상 (버프/디버프 시전자) /// public GameObject Source { get; } /// /// 남은 지속 시간 /// public float RemainingDuration { get; set; } /// /// 적용된 스탯 수정자 목록 /// public List AppliedModifiers { get; } /// /// 주기적 효과 타이머 /// public float PeriodicTimer { get; set; } /// /// 고유 식별자 (네트워크 동기화용) /// public Guid Id { get; } /// /// 활성 이상 상태 생성 /// /// 이상 상태 데이터 /// 효과 시전자 public ActiveAbnormality(AbnormalityData data, GameObject source) { Data = data; Source = source; RemainingDuration = data.duration; PeriodicTimer = 0f; Id = Guid.NewGuid(); AppliedModifiers = new List(); } /// /// 지속 시간 갱신 /// public void RefreshDuration() { RemainingDuration = Data.duration; PeriodicTimer = 0f; } /// /// 시간 경과 처리 /// /// 경과 시간 /// 효과가 만료되었으면 true public bool Tick(float deltaTime) { // 영구 효과는 시간 감소 없음 if (Data.IsPermanent) return false; RemainingDuration -= deltaTime; // 주기적 효과 타이머 업데이트 if (Data.HasPeriodicEffect) { PeriodicTimer += deltaTime; } return RemainingDuration <= 0f; } /// /// 주기적 효과 발동 가능 여부 확인 /// /// 발동 가능하면 true public bool CanTriggerPeriodic() { if (!Data.HasPeriodicEffect) return false; if (PeriodicTimer >= Data.periodicInterval) { PeriodicTimer -= Data.periodicInterval; return true; } return false; } /// /// 진행률 (0~1) /// public float Progress { get { if (Data.IsPermanent) return 1f; return Mathf.Clamp01(1f - (RemainingDuration / Data.duration)); } } /// /// 남은 시간 비율 (1~0, UI 표시용) /// public float RemainingRatio { get { if (Data.IsPermanent) return 1f; return Mathf.Clamp01(RemainingDuration / Data.duration); } } } }