using System.Collections.Generic; using UnityEngine; public class HousingManager : MonoBehaviour { [Header("Housing Settings")] public int villagersPerHouse = 2; public float warningCheckInterval = 5f; private List houses = new List(); private float lastWarningCheck = 0f; private bool hasShownWarning = false; // Events public static System.Action OnHousingStatusChanged; // (housed villagers, total villagers) public static System.Action OnHousingWarning; void Start() { // Subscribe to building placement events BuildingSystem.OnBuildingPlaced += OnBuildingPlaced; // Initial check UpdateHousingStatus(); } void Update() { // Check housing status periodically if (Time.time - lastWarningCheck > warningCheckInterval) { CheckHousingWarnings(); lastWarningCheck = Time.time; } } void OnDestroy() { BuildingSystem.OnBuildingPlaced -= OnBuildingPlaced; } void OnBuildingPlaced(GameObject building) { Building buildingComponent = building.GetComponent(); if (buildingComponent != null && buildingComponent.buildingName == "House") { houses.Add(buildingComponent); UpdateHousingStatus(); Debug.Log($"New house added. Total houses: {houses.Count}"); } } void CheckHousingWarnings() { int totalVillagers = GetTotalVillagerCount(); int maxHousedVillagers = GetMaxHousedVillagers(); if (totalVillagers > maxHousedVillagers) { int homelessCount = totalVillagers - maxHousedVillagers; string warningMessage = $"Warning: {homelessCount} villager{(homelessCount > 1 ? "s" : "")} without housing!"; if (!hasShownWarning || homelessCount > 0) { OnHousingWarning?.Invoke(warningMessage); Debug.LogWarning(warningMessage); hasShownWarning = true; } } else { hasShownWarning = false; } UpdateHousingStatus(); } void UpdateHousingStatus() { int totalVillagers = GetTotalVillagerCount(); int maxHousedVillagers = GetMaxHousedVillagers(); OnHousingStatusChanged?.Invoke(maxHousedVillagers, totalVillagers); } int GetTotalVillagerCount() { if (GameManager.Instance?.villagerManager == null) return 0; return GameManager.Instance.villagerManager.GetAllVillagers().Count; } int GetMaxHousedVillagers() { // Remove null/destroyed houses houses.RemoveAll(house => house == null); return houses.Count * villagersPerHouse; } public bool HasAvailableHousing() { int totalVillagers = GetTotalVillagerCount(); int maxHousedVillagers = GetMaxHousedVillagers(); return maxHousedVillagers >= totalVillagers; } public int GetAvailableHousingSlots() { int totalVillagers = GetTotalVillagerCount(); int maxHousedVillagers = GetMaxHousedVillagers(); return Mathf.Max(0, maxHousedVillagers - totalVillagers); } public string GetHousingStatusText() { int totalVillagers = GetTotalVillagerCount(); int maxHousedVillagers = GetMaxHousedVillagers(); return $"Housing: {Mathf.Min(totalVillagers, maxHousedVillagers)}/{totalVillagers} villagers housed ({houses.Count} houses)"; } }