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