using System; using System.Collections.Generic; using IVDataFormat; using UnityEngine; [Serializable] public class StatEffect { [SerializeField] eEffectType key; [SerializeReference, SubclassSelector] public KeyCompare subKey = new DefaultKey(); [SerializeField] ValueModifier value; public eEffectType Key => key; public KeyCompare SubKey => subKey; public ValueModifier Value => value; public string NameKey => FormatString.StringFormat("efc{0}", (int)key); } [Serializable] public struct BuffProperty { public StringKey key; public StatEffect[] effects; public float duration; } public class BuffData { static readonly float _infiniteDuration = 0; BuffProperty property; float elapsedDuration = 0.0f; public IReadOnlyList Effects => property.effects; public StringKey NameKey => property.key; public string IconImgAtlasName => GameProperty.Instance.BuffIconAtlasName; public string IconImgNameInAtlas => property.key; public float Duration => property.duration; public float ElapsedDuration => elapsedDuration; public float RemainTime => !IsInfiniteDuration ? Mathf.Max(0, property.duration - elapsedDuration) : float.MaxValue; public bool IsInfiniteDuration => property.duration == _infiniteDuration; public BuffData(BuffProperty property, object from) { this.property = property; for(int i = 0; i < Effects.Count; i++) { Effects[i].Value.From = from; } } public bool UpdateDuration(float deltaTime) { if (IsInfiniteDuration) return true; elapsedDuration += deltaTime; return elapsedDuration < property.duration; } public void ResetDuration() { elapsedDuration = 0.0f; } public bool TryGetEffect(eEffectType key, object subKey, out StatEffect result) { result = null; for (int i = 0; i < property.effects.Length; i++) { var effect = property.effects[i]; if (effect.Key == key && effect.subKey.Match(subKey)) { result = Effects[i]; break; } } return result != null; } public bool HasEffect(eEffectType key, object subKey) => Array.Exists(property.effects, e => e.Key == key && e.subKey.Match(subKey)); }