Files
CityBuilder/Assets/Scripts/ResourceManager.cs

85 lines
3.0 KiB
C#

using System.Collections.Generic;
using UnityEngine;
public class ResourceManager : MonoBehaviour
{
public enum ResourceTypes { Steel, Wood, Water, Population, Food, Faith, Money, Jobs, maxPopulation, faithPerDay, moneyPerDay, woodPerDay, steelPerDay, waterPerDay, foodPerDay, populationPerDay }
public List<ResourceAmount> resourceAmounts;
public static ResourceManager Instance { get; private set; }
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this.gameObject);
}
else
{
Instance = this;
}
}
public ResourceAmount GetResourceAmount(ResourceTypes resource)
{
var found = resourceAmounts.Find(r => r.resourceType == resource);
if (found == null)
{
Debug.LogWarning($"Resource {resource} not found!");
return new ResourceAmount { resourceType = resource, resourceAmount = 0 };
}
return found;
}
public void AddResource(ResourceTypes type, int amount)
{
var res = GetResourceAmount(type);
res.resourceAmount += amount;
ClampResource(type);
}
// Clamp resource to prevent negative values for certain types
private void ClampResource(ResourceTypes type)
{
// Only clamp for resources that should not go negative
switch (type)
{
case ResourceTypes.Food:
case ResourceTypes.Money:
case ResourceTypes.Wood:
case ResourceTypes.Steel:
case ResourceTypes.Water:
case ResourceTypes.Faith:
case ResourceTypes.Population:
var res = GetResourceAmount(type);
if (res.resourceAmount < 0)
res.resourceAmount = 0;
break;
default:
break;
}
}
public void SetResource(ResourceTypes type, int amount)
{
var res = GetResourceAmount(type);
res.resourceAmount = amount;
}
public void ApplyDailyResourceChanges()
{
// For each resource type that has a corresponding per-day value, add it to the main resource
AddResource(ResourceTypes.Faith, GetResourceAmount(ResourceTypes.faithPerDay).resourceAmount);
AddResource(ResourceTypes.Money, GetResourceAmount(ResourceTypes.moneyPerDay).resourceAmount);
AddResource(ResourceTypes.Wood, GetResourceAmount(ResourceTypes.woodPerDay).resourceAmount);
AddResource(ResourceTypes.Steel, GetResourceAmount(ResourceTypes.steelPerDay).resourceAmount);
AddResource(ResourceTypes.Water, GetResourceAmount(ResourceTypes.waterPerDay).resourceAmount);
AddResource(ResourceTypes.Food, GetResourceAmount(ResourceTypes.foodPerDay).resourceAmount);
AddResource(ResourceTypes.Population, GetResourceAmount(ResourceTypes.populationPerDay).resourceAmount);
}
}
[System.Serializable]
public class ResourceAmount
{
public ResourceManager.ResourceTypes resourceType;
public int resourceAmount;
}