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 resourceAmounts; public static ResourceManager Instance { get; private set; } public List perTurnResourceAmounts = new List(); 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; }