using System; using System.Collections.Generic; using UnityEngine; namespace SpellBoundAR.Items.Inventories { [CreateAssetMenu(menuName = "Scriptable Objects/Gameplay/Items/Saved Inventory")] public class SavedInventoryScriptableObject : ScriptableObject, IInventory { public event Action OnEntriesChanged; public void InvokeOnEntriesChanged() => OnEntriesChanged?.Invoke(); [SerializeField] protected string id; [SerializeField] protected string directory = string.Empty; [Header("Cache")] private SavedInventory _savedInventory; protected virtual string Directory => directory; public SavedInventory SavedInventory { get; private set; } protected virtual void OnEnable() { SavedInventory ??= new SavedInventory(Directory, id); if (SavedInventory != null) SavedInventory.OnEntriesChanged += InvokeOnEntriesChanged; } protected virtual void OnDisable() { if (SavedInventory != null) SavedInventory.OnEntriesChanged -= InvokeOnEntriesChanged; } protected virtual void OnValidate() { if (SavedInventory != null) SavedInventory.Directory = Directory; else SavedInventory = new SavedInventory(Directory, id); } public virtual string ID => SavedInventory.ID; public virtual List GetAllEntries() => SavedInventory.GetAllEntries(); public virtual IInventoryEntry GetEntry(IItemTypeData itemTypeData) => SavedInventory.GetEntry(itemTypeData); public virtual void Add(IItemTypeData itemTypeData, int quantity) => SavedInventory.Add(itemTypeData, quantity); public virtual void Remove(IItemTypeData itemTypeData, int quantity) => SavedInventory.Remove(itemTypeData, quantity); public virtual void RemoveAll(IItemTypeData itemTypeData) => SavedInventory.RemoveAll(itemTypeData); public virtual void Clear() => SavedInventory.Clear(); } }