127 lines
3.1 KiB
C#
127 lines
3.1 KiB
C#
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<string, StoredResource> resources = new Dictionary<string, StoredResource>();
|
|
|
|
private List<Action> changeCallbacks = new List<Action>();
|
|
|
|
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<Resource>();
|
|
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);
|
|
}
|
|
}
|