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

87 lines
3.3 KiB
C#

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