Files
CityBuilder/Assets/Scripts/ResourceManager.cs
2025-08-04 10:36:55 +01:00

145 lines
5.6 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, power, powerPerDay }
public List<ResourceAmount> resourceAmounts;
public static ResourceManager Instance { get; private set; }
public List<ResourceAmount> perTurnResourceAmounts = new List<ResourceAmount>();
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this.gameObject);
}
else
{
Instance = this;
}
// Initialize missing resources with default values
foreach (ResourceTypes type in System.Enum.GetValues(typeof(ResourceTypes)))
{
if (!resourceAmounts.Exists(r => r.resourceType == type))
{
resourceAmounts.Add(new ResourceAmount { resourceType = type, resourceAmount = 0 });
}
// Initialize perTurnResourceAmounts
if (!perTurnResourceAmounts.Exists(r => r.resourceType == type))
{
perTurnResourceAmounts.Add(new ResourceAmount { resourceType = type, resourceAmount = 0 });
}
}
// Ensure all per-day resources are present in resourceAmounts
ResourceTypes[] perDayTypes = {
ResourceTypes.faithPerDay,
ResourceTypes.moneyPerDay,
ResourceTypes.woodPerDay,
ResourceTypes.steelPerDay,
ResourceTypes.waterPerDay,
ResourceTypes.foodPerDay,
ResourceTypes.populationPerDay
};
foreach (var perDayType in perDayTypes)
{
if (!resourceAmounts.Exists(r => r.resourceType == perDayType))
{
resourceAmounts.Add(new ResourceAmount { resourceType = perDayType, resourceAmount = 0 });
}
}
}
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, float amount)
{
var res = GetResourceAmount(type);
res.resourceAmount += amount;
ClampResource(type);
}
// Clamp resource to prevent negative values for certain types
private void ClampResource(ResourceTypes type)
{
var res = GetResourceAmount(type);
// Clamp to zero for all 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:
if (res.resourceAmount < 0)
res.resourceAmount = 0;
break;
case ResourceTypes.Population:
if (res.resourceAmount < 0)
res.resourceAmount = 0;
var maxPop = GetResourceAmount(ResourceTypes.maxPopulation).resourceAmount;
if (res.resourceAmount > maxPop)
res.resourceAmount = maxPop;
break;
default:
break;
}
}
public void SetResource(ResourceTypes type, float amount)
{
var res = GetResourceAmount(type);
res.resourceAmount = amount;
}
public void ApplyDailyResourceChanges()
{
// Update per-day resource values in resourceAmounts from perTurnResourceAmounts
ResourceTypes[] perDayTypes = {
ResourceTypes.faithPerDay,
ResourceTypes.moneyPerDay,
ResourceTypes.woodPerDay,
ResourceTypes.steelPerDay,
ResourceTypes.waterPerDay,
ResourceTypes.foodPerDay,
ResourceTypes.populationPerDay
};
foreach (var perDayType in perDayTypes)
{
var perTurn = perTurnResourceAmounts.Find(r => r.resourceType == perDayType);
var main = resourceAmounts.Find(r => r.resourceType == perDayType);
if (perTurn != null && main != null)
{
main.resourceAmount = perTurn.resourceAmount;
}
}
// 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);
AddResource(ResourceTypes.power, GetResourceAmount(ResourceTypes.powerPerDay).resourceAmount);
}
}
[System.Serializable]
public class ResourceAmount
{
public ResourceManager.ResourceTypes resourceType;
public float resourceAmount;
}