using System;
using System.Collections.Generic;
namespace Colosseum.Stats
{
///
/// 개별 스탯 클래스. 기본값과 수정자를 관리하고 최종 값을 계산.
///
[Serializable]
public class CharacterStat
{
[UnityEngine.Tooltip("기본 값")]
[UnityEngine.SerializeField] private float baseValue = 10f;
private readonly List modifiers = new List();
private bool isDirty = true;
private float cachedValue;
public float BaseValue
{
get => baseValue;
set
{
baseValue = value;
isDirty = true;
}
}
public CharacterStat() { }
public CharacterStat(float baseValue)
{
this.baseValue = baseValue;
}
///
/// 최종 스탯 값. 수정자 적용 후 계산.
///
public float FinalValue
{
get
{
if (!isDirty) return cachedValue;
float finalValue = baseValue;
// 1. Flat 수정자 적용
for (int i = 0; i < modifiers.Count; i++)
{
if (modifiers[i].Type == StatModType.Flat)
finalValue += modifiers[i].Value;
}
// 2. PercentAdd 수정자 적용 (합산 후 곱셈)
float percentAdd = 0f;
for (int i = 0; i < modifiers.Count; i++)
{
if (modifiers[i].Type == StatModType.PercentAdd)
percentAdd += modifiers[i].Value;
}
finalValue *= (1f + percentAdd);
// 3. PercentMult 수정자 적용 (개별 곱셈)
for (int i = 0; i < modifiers.Count; i++)
{
if (modifiers[i].Type == StatModType.PercentMult)
finalValue *= modifiers[i].Value;
}
cachedValue = finalValue;
isDirty = false;
return cachedValue;
}
}
///
/// 수정자 추가
///
public void AddModifier(StatModifier modifier)
{
modifiers.Add(modifier);
isDirty = true;
}
///
/// 수정자 제거
///
public bool RemoveModifier(StatModifier modifier)
{
bool removed = modifiers.Remove(modifier);
if (removed) isDirty = true;
return removed;
}
///
/// 특정 출처의 모든 수정자 제거
///
public void RemoveAllModifiersFromSource(object source)
{
modifiers.RemoveAll(m => m.Source == source);
isDirty = true;
}
///
/// 모든 수정자 제거
///
public void ClearModifiers()
{
modifiers.Clear();
isDirty = true;
}
}
}