using UnityEngine; // МОДУЛЬ ПОСЕЛЕНИЯ. Документ: Docs/Modules/Settlement.md // Вешается на объект Ратуши, который уже стоит на карте. // Хранит текущий уровень -- от него зависит, какие здания разблокированы в BuildManager. public class TownHall : MonoBehaviour { public static TownHall Instance { get; private set; } [Header("Уровень")] public int currentLevel = 1; public int maxLevel = 10; [Header("Стоимость апгрейда (растёт с каждым уровнем)")] public ResourceCost[] baseUpgradeCost; [Tooltip("Во сколько раз дорожает апгрейд за каждый следующий уровень")] public float costMultiplierPerLevel = 1.5f; void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; } // Стоимость апгрейда на текущем уровне (растёт по экспоненте) public ResourceCost[] GetUpgradeCost() { ResourceCost[] scaled = new ResourceCost[baseUpgradeCost.Length]; float multiplier = Mathf.Pow(costMultiplierPerLevel, currentLevel - 1); for (int i = 0; i < baseUpgradeCost.Length; i++) { scaled[i] = new ResourceCost { type = baseUpgradeCost[i].type, amount = baseUpgradeCost[i].amount * multiplier }; } return scaled; } public bool CanUpgrade() { if (currentLevel >= maxLevel) return false; return GameServices.TryGet(out IEconomy economy) && economy.CanAfford(BuildingData.ToAmounts(GetUpgradeCost())); } public void Upgrade() { if (!CanUpgrade()) { Debug.Log("[РАТУША] Не хватает ресурсов на апгрейд или максимальный уровень."); return; } GameServices.Get().TrySpend(BuildingData.ToAmounts(GetUpgradeCost())); currentLevel++; EventBus.Publish(new TownHallLevelChangedEvent { Level = currentLevel }); Debug.Log($"[РАТУША] Улучшена до уровня {currentLevel}!"); } void OnMouseDown() { if (UIBlocker.IsPointerOverUI()) return; // клик по панели HUD не должен улучшать Ратушу под ней Debug.Log($"[Ратуша] Клик! текущий уровень: {currentLevel}. Улучшение..."); Upgrade(); } }