RobotFactoryIncrementalGame/Assets/Scripts/ResourceStorage.cs

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);
}
}