Files
MVP1/Assets/Scripts/Modules/Settlement/TownHall.cs
T

74 lines
2.7 KiB
C#
Raw Normal View History

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<IEconomy>().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();
}
}