using System; using UnityEngine; // МОДУЛЬ ПОСЕЛЕНИЯ. Документ: Docs/Modules/Settlement.md // Вешается на объект Ратуши, который уже стоит на карте. // Хранит текущий уровень -- от него зависит, какие здания разблокированы в BuildManager. // Тап по Ратуше открывает окно Ратуши (слой приложения подписан на Tapped), улучшение -- кнопкой в окне. public class TownHall : MonoBehaviour { public static TownHall Instance { get; private set; } // Тап по Ратуше: интерфейс откроет её окно (модуль про интерфейс не знает) public static event Action Tapped; [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}!"); } Vector3 downPos; void OnMouseDown() { downPos = Input.mousePosition; } // Отпустил палец на Ратуше, почти не сдвинув (а не тащил камеру) -- окно Ратуши. Раньше тап сразу улучшал void OnMouseUpAsButton() { if (UIBlocker.IsPointerOverUI()) return; // клик по панели HUD не должен проходить на Ратушу под ней if ((Input.mousePosition - downPos).magnitude > 25f) return; Tapped?.Invoke(this); } }