using System; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UIElements; public class StoredResource { public Resource Resource { get; private set; } public int Amount { get; internal set; } public bool Unlocked { get; internal set; } public StoredResource(Resource resource) { Resource = resource; Amount = 0; Unlocked = false; } } public class ResourceStorage : MonoBehaviour { public static ResourceStorage Instance { get; private set; } private Dictionary resources = new Dictionary(); private List changeCallbacks = new List(); public static readonly Metal Metal = new Metal(); public static readonly Electronics Electronics = new Electronics(); public static readonly Energy Energy = new Energy(); public static readonly Money Money = new Money(); public static Resource[] RegisteredResources { get { var list = new List(); list.Add(Metal); list.Add(Electronics); list.Add(Energy); list.Add(Money); return list.ToArray(); } } public static Type[] RegisteredResourceTypes => RegisteredResources.Select(r => r.GetType()).ToArray(); public ResourceStorage() { AddResource(Metal, true); AddResource(Electronics, true); // TODO lock back AddResource(Energy, true); // TODO lock back AddResource(Money, true); // TODO lock back Instance = this; } private void AddResource(Resource resource, bool unlocked = false) { resources.Add(resource.Name, new StoredResource(resource) { Unlocked = unlocked }); } public StoredResource GetResource(Resource resource) { return resources[resource.Name]; } public void AddResource(Resource resource, int amount) { var res = GetResource(resource); if (res != null) { res.Amount += amount; InvokeOnChange(); } } public void RemoveResource(Resource resource, int amount) { var res = GetResource(resource); if (res != null && res.Amount >= amount) { res.Amount -= amount; InvokeOnChange(); } } public void UnlockResource(Resource resource) { var res = GetResource(resource); if (res != null) { res.Unlocked = true; InvokeOnChange(); } } private void InvokeOnChange() { // Debug.Log( // $"Resources: {String.Join("; ", resources.Values.ToArray().Select(r => r.Resource.Name + "=" + r.Amount + (r.Unlocked ? "" : "(locked)")))}" // ); changeCallbacks.ForEach(a => { try { a.Invoke(); } catch { } }); } public void RegisterOnChangeCallback(Action callback) { changeCallbacks.Add(callback); } public void UnregisterOnChangeCallback(Action callback) { changeCallbacks.Remove(callback); } }