68 lines
5.1 KiB
Markdown
68 lines
5.1 KiB
Markdown
# Экономика
|
|
|
|
Ресурсы и производство: сколько у игрока дерева, еды, золота и остального, кто их добывает и тратит.
|
|
|
|
- **Сборка:** `Bogatyri.Economy`.
|
|
- **Папка:** `Assets/Scripts/Modules/Economy`.
|
|
- **Зависит от:** ядра.
|
|
|
|
## Контракт `IEconomy`
|
|
|
|
| Метод | Что делает |
|
|
| --- | --- |
|
|
| `Get(type)` | Сколько ресурса сейчас. |
|
|
| `Has(type, amount)` | Хватает ли. |
|
|
| `Add(type, amount)` | Добавить (или отнять отрицательным числом; в минус не уходит). |
|
|
| `TrySpend(type, amount)` | Потратить, если хватает. |
|
|
| `CanAfford(cost)` / `TrySpend(cost)` | Проверить и списать цену из нескольких ресурсов — всё или ничего. |
|
|
|
|
Получить: `GameServices.Get<IEconomy>()`.
|
|
|
|
## События
|
|
|
|
- **Публикует:** `ResourceChangedEvent` — при любом изменении ресурса (тип и новое значение).
|
|
- **Слушает:** ничего.
|
|
|
|
Для интерфейса остаётся C#-событие `ResourceManager.OnResourceChanged` (его слушает `ResourceUIText`).
|
|
|
|
## Сохранение
|
|
|
|
Секция `"economy"`: `{ "resources": [ { "type", "amount" } ] }` — имена полей как в старом `save.json`.
|
|
|
|
Сброс (`ResetState`): стартовые значения из Inspector `ResourceManager` (`startWood` и т.д.).
|
|
|
|
## Файлы
|
|
|
|
| Файл | Что это |
|
|
| --- | --- |
|
|
| `ResourceManager.cs` | Хранилище ресурсов, реализует `IEconomy` и `ISaveParticipant`. Живёт между сценами. |
|
|
| `ResourceProducer.cs` | Здание, добывающее ресурс по таймеру. |
|
|
| `ResourceCollector.cs` | Временная добыча по клику. Реализует `ILeveledBuilding`. |
|
|
|
|
Интерфейс экономики остаётся в слое приложения: `Assets/Scripts/Economy/ResourceUIText.cs`, `BuildingUI.cs`.
|
|
|
|
## Таблица баланса `EconomyConfig`
|
|
|
|
Все числа экономики — в ассете `Assets/Resources/EconomyConfig.asset` (класс `App/EconomyConfig.cs`, слой приложения). Меняются в Inspector без перекомпиляции. Разделы: население, стартовые ресурсы новой игры, производство T1, месторождения, цена солдата. Числа с пометкой «не утверждено» — временные.
|
|
|
|
Модули конфиг не видят: `App/GameModules` переводит его в правила модуля (например, `PopulationRules`). Нет ассета — берутся числа по умолчанию из `EconomyConfig.cs` и в консоли предупреждение.
|
|
|
|
Стартовые ресурсы новой игры выдаёт `App/GameModules` (при первой игре и после сброса): ресурс поднимается до стартового, если его меньше.
|
|
|
|
Ресурс `Population` («Люди») теперь отражает модуль Населения: `App/GameModules` держит его равным `IPopulation.Total`. Тратить его напрямую не нужно.
|
|
|
|
## Решения и план
|
|
|
|
- **Этап 1 (план разработки):** лимиты Склада и Амбара; `Gems` → `BlueCrystal`; `Power` убрать из ресурсов.
|
|
- **Решение команды от 19.10.2026:** у синего кристалла отдельный небольшой настраиваемый лимит хранения, не бесконечный. Переполнение — одно правило для наград и добычи. Число не утверждено.
|
|
- **Этап 3:** убрать кликер (`ResourceCollector`); производство = рабочие × норма × качество месторождения × бонус уровня.
|
|
- Все числа — из `EconomyConfig`, не в коде. Таблица создана 26.10.2026; производство, месторождения и цена солдата в ней уже есть, но используются начиная с этапов 3–5.
|
|
|
|
## Журнал изменений
|
|
|
|
| Дата | Кто | Что |
|
|
| --- | --- | --- |
|
|
| 26.10.2026 | Claude | Таблица баланса `EconomyConfig`. Стартовые ресурсы новой игры. Ресурс «Люди» отражает модуль Населения. |
|
|
| 19.10.2026 | Claude | `ResetState()`: при сбросе сохранений ресурсы возвращаются к стартовым. |
|
|
| 19.10.2026 | Claude | Модуль выделен: `ResourceManager`, `ResourceProducer`, `ResourceCollector` перенесены в `Modules/Economy`. `ResourceManager` реализует `IEconomy`, публикует `ResourceChangedEvent`, сам сохраняет секцию `"economy"`. |
|