| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- using System.Collections.Generic;
- using UnityEngine;
- public class HousingManager : MonoBehaviour
- {
- [Header("Housing Settings")]
- public int villagersPerHouse = 2;
- public float warningCheckInterval = 5f;
- private List<Building> houses = new List<Building>();
- private float lastWarningCheck = 0f;
- private bool hasShownWarning = false;
- // Events
- public static System.Action<int, int> OnHousingStatusChanged; // (housed villagers, total villagers)
- public static System.Action<string> 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<Building>();
- 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)";
- }
- }
|