using System; using System.Collections.Generic; using SepCore.Definition; using UnityEngine; namespace SepCore.Components { public class StatComponent : MonoBehaviour { private Dictionary> _statModifiers; private Dictionary> _statModifierCallbacks; public void OnInit() { _statModifiers = new Dictionary>(); _statModifierCallbacks = new Dictionary>(); } public void OnReset() { _statModifiers.Clear(); _statModifierCallbacks.Clear(); } public void AddModifier(modifier modifier) { if (!_statModifiers.TryGetValue(modifier.StatType, out var modifiers)) { _statModifiers.Add(modifier.StatType, modifiers = new List()); modifiers.Add(modifier); } else { modifiers.Add(modifier); } if (_statModifierCallbacks.TryGetValue(modifier.StatType, out var callbacks)) callbacks?.Invoke(modifier, true); } public void RemoveModifier(modifier modifier) { if (_statModifiers.TryGetValue(modifier.StatType, out var modifiers)) { _statModifiers[modifier.StatType].Remove(modifier); } if (_statModifierCallbacks.TryGetValue(modifier.StatType, out var callbacks)) callbacks?.Invoke(modifier, false); } public void Subscribe(StatType statType, Action callback) { if (!_statModifierCallbacks.TryAdd(statType, callback)) { _statModifierCallbacks[statType] += callback; } } public void Unsubscribe(StatType statType, Action callback) { if (!_statModifierCallbacks.TryGetValue(statType, out var callbacks)) { return; } callbacks -= callback; if (callbacks == null) { _statModifierCallbacks.Remove(statType); } } public StatProperty GetStat(StatType statType) { var result = new StatProperty(); if (!_statModifiers.TryGetValue(statType, out var modifiers)) return result; foreach (var modifier in modifiers) { if (modifier.IsPercent) result.Percent += modifier.RealValue; else result.Value += modifier.RealValue; } return result; } public void UpdateStat(StatProperty stat, modifier modifier, bool isApply) { float coef = isApply ? 1f : -1f; if (modifier.IsPercent) { stat.Percent += modifier.RealValue * coef; } else { stat.Value += modifier.RealValue * coef; } } } }