- Ядро (Bogatyri.Core): контракты модулей, EventBus, GameServices, SaveRegistry - Модули: Экономика, Поселение, Армия, Глобальный мир, Боевая система, Сохранения (каждый — отдельный asmdef, видит только ядро) - App/GameModules: регистрация модулей и связь с GameProgress/Казармами - Сохранения v2 по секциям модулей, перенос старого save.json и походов из progress.json - Сброс сохранений: ISaveSystem.ResetAll, ResetState у модулей, меню Tools - EditMode-тесты модулей, документы по каждому модулю с журналом изменений Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
74 lines
2.7 KiB
C#
74 lines
2.7 KiB
C#
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();
|
|
}
|
|
}
|