Files
MVP1/Assets/Scripts/Modules/Settlement/BuildingData.cs
T
AlexanderandClaude Opus 5.5 964cb23d9d Модульная система: игровое ядро + 6 модулей, документы Docs/Modules
- Ядро (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>
2026-10-19 18:39:28 +02:00

54 lines
1.8 KiB
C#

using UnityEngine;
[System.Serializable]
public class ResourceCost
{
public ResourceType type;
public float amount;
}
[CreateAssetMenu(fileName = "NewBuilding", menuName = "Game/Building Data")]
public class BuildingData : ScriptableObject
{
[Header("Основное")]
public string buildingName;
public Sprite icon;
public GameObject prefab;
[Header("Требования")]
[Tooltip("Необходимый уровень ратуши")]
public int requiredTownHallLevel = 1;
[Header("Стоимость")]
public ResourceCost[] cost;
// Проверка - хватает ли ресурсов? (только проверяет)
// Ресурсы -- модуль Экономики, поэтому только через контракт IEconomy
public bool CanAfford()
{
return GameServices.TryGet(out IEconomy economy) && economy.CanAfford(ToAmounts(cost));
}
// Списывает стоимость постройки. Вызывать только после CanAfford() == true
public void PayCost()
{
if (GameServices.TryGet(out IEconomy economy)) economy.TrySpend(ToAmounts(cost));
}
public static ResourceAmount[] ToAmounts(ResourceCost[] costs)
{
var result = new ResourceAmount[costs?.Length ?? 0];
for (int i = 0; i < result.Length; i++) result[i] = new ResourceAmount(costs[i].type, costs[i].amount);
return result;
}
// Текст стоимости для UI, например "50 Wood, 20 Stone"
public string GetCostText()
{
string result = "";
for (int i = 0; i < cost.Length; i++)
{
result += $"{cost[i].amount} {cost[i].type}";
if (i < cost.Length - 1) result += ", ";
}
return result;
}
}