using System;
using System.Collections.Generic;
using UnityEngine;
namespace Colosseum.Combat
{
///
/// 전투 중 생성하는 위협 배율을 관리합니다.
/// 탱커 스킬이 짧은 시간 동안 위협 생성량을 높이는 데 사용합니다.
///
[DisallowMultipleComponent]
public class ThreatController : MonoBehaviour
{
[Serializable]
private class TimedThreatModifier
{
[Min(0f)] public float multiplier = 1f;
[Min(0f)] public float endTime;
}
[Header("Threat")]
[Tooltip("기본 위협 생성 배율")]
[Min(0f)] [SerializeField] private float baseThreatMultiplier = 1f;
[Tooltip("디버그 로그 출력 여부")]
[SerializeField] private bool debugMode = false;
[Header("Debug")]
[Tooltip("현재 적용 중인 위협 생성 배율")]
[Min(0f)] [SerializeField] private float currentThreatMultiplier = 1f;
private readonly List activeModifiers = new List();
///
/// 현재 적용 중인 위협 생성 배율
///
public float CurrentThreatMultiplier => currentThreatMultiplier;
private void Awake()
{
RecalculateThreatMultiplier();
}
private void Update()
{
if (activeModifiers.Count == 0)
return;
bool changed = false;
for (int i = activeModifiers.Count - 1; i >= 0; i--)
{
if (Time.time < activeModifiers[i].endTime)
continue;
activeModifiers.RemoveAt(i);
changed = true;
}
if (changed)
{
RecalculateThreatMultiplier();
}
}
///
/// 일정 시간 동안 위협 생성 배율을 추가합니다.
///
public void ApplyThreatMultiplier(float multiplier, float duration)
{
if (multiplier <= 0f || duration <= 0f)
return;
activeModifiers.Add(new TimedThreatModifier
{
multiplier = multiplier,
endTime = Time.time + duration,
});
RecalculateThreatMultiplier();
if (debugMode)
{
Debug.Log($"[Threat] {gameObject.name} 위협 배율 적용: x{multiplier:F2} / {duration:F2}s");
}
}
///
/// 모든 임시 위협 배율을 제거합니다.
///
public void ClearThreatModifiers()
{
if (activeModifiers.Count == 0)
return;
activeModifiers.Clear();
RecalculateThreatMultiplier();
}
private void RecalculateThreatMultiplier()
{
float nextMultiplier = Mathf.Max(0f, baseThreatMultiplier);
for (int i = 0; i < activeModifiers.Count; i++)
{
nextMultiplier *= Mathf.Max(0f, activeModifiers[i].multiplier);
}
currentThreatMultiplier = nextMultiplier;
}
}
}