87 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|