# Экономика Ресурсы и производство: сколько у игрока дерева, еды, золота и остального, кто их добывает и тратит. - **Сборка:** `Bogatyri.Economy`. - **Папка:** `Assets/Scripts/Modules/Economy`. - **Зависит от:** ядра. ## Контракт `IEconomy` | Метод | Что делает | | --- | --- | | `Get(type)` | Сколько ресурса сейчас. | | `Has(type, amount)` | Хватает ли. | | `Add(type, amount)` | Добавить (или отнять отрицательным числом; в минус не уходит). | | `TrySpend(type, amount)` | Потратить, если хватает. | | `CanAfford(cost)` / `TrySpend(cost)` | Проверить и списать цену из нескольких ресурсов — всё или ничего. | Получить: `GameServices.Get()`. ## События - **Публикует:** `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"`. |