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