Модуль Армии (Bogatyri.Army, без Unity): - ArmyService — единственное хранилище войск (4 типа), секция сохранения "army" - IArmy расширен: войска по типам, обучение (AddTroops), потери (LoseFraction), войска в походах - событие TroopsChangedEvent — по нему перерисовываются панели HUD - GameProgress и панели работают с войсками только через IArmy - перенос из progress.json (troops, sashaMarchUnits) при первой загрузке; старые данные удаляются только после записи save.json (флаг armyInModule) - ArmyBridge удалён: контракты и перенос сохранений проверены тестами - тесты: поход не создаёт и не теряет солдат, потери по типам, сохранение, перенос, сброс Окно «ВОЙСКО ВЕРНУЛОСЬ» в городе (UI/MarchReturnPopup): - куда ходили, победа/поражение, сколько вернулось из скольких, добыча - показывается и за походы, закончившиеся пока игра была закрыта; несколько — по очереди - в MarchReturnedEvent добавлены Sent, TargetName, LootText GameLoadedEvent публикуется и без файла сохранения. Документы Army, Core, Save, World, README обновлены. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Модульная система «Богатырей»
Игра собрана из восьми модулей вокруг общего Игрового ядра. Модули общаются только через контракты и события ядра и не управляют внутренним кодом друг друга. Это правило проверяет сам Unity: каждый модуль — отдельная сборка (.asmdef), которая видит только ядро, поэтому прямое обращение к соседнему модулю не скомпилируется.
Игровое ядро (Bogatyri.Core)
контракты (IEconomy, IArmy...) · события (EventBus) · реестр (GameServices)
┌───────────┬────────────┬───────────┬──────────────┬───────────────┬────────────┬──────────┬──────────┐
Экономика Поселение Армия Глобальный мир Боевая система Сохранения Чат Круг
ресурсы, здания, войска, карта, урон, потери, игровое мир и объединение
производство развитие характеристики перемещения исход состояние Круг игроков
▲
App/GameModules — точка сборки: регистрирует модули и соединяет их события
со старыми системами (GameProgress, Казармы, панели UI)
| Модуль | Сборка | Папка | Документ |
|---|---|---|---|
| Игровое ядро | Bogatyri.Core (без Unity), Bogatyri.Core.Unity |
Assets/Scripts/Modules/Core, Core.Unity |
Core.md |
| Экономика | Bogatyri.Economy |
Assets/Scripts/Modules/Economy |
Economy.md |
| Поселение | Bogatyri.Settlement |
Assets/Scripts/Modules/Settlement |
Settlement.md |
| Армия | Bogatyri.Army (без Unity) |
Assets/Scripts/Modules/Army |
Army.md |
| Глобальный мир | Bogatyri.World, Bogatyri.World.Simulation (без Unity) |
Assets/Scripts/Modules/World |
World.md |
| Боевая система | Bogatyri.Battle (без Unity) |
Assets/Scripts/Modules/Battle |
Battle.md |
| Сохранения | Bogatyri.Save |
Assets/Scripts/Modules/Save |
Save.md |
| Чат | Bogatyri.Chat (без Unity) |
Assets/Scripts/Modules/Chat |
Chat.md |
| Круг | Bogatyri.Circle (без Unity) |
Assets/Scripts/Modules/Circle |
Circle.md |
Правила
- Модуль ссылается только на ядро. Нужен соседний модуль — получи его контракт:
GameServices.Get<IEconomy>(). НикакихResourceManager.Instanceвнутри модулей. - Факты — событиями. Случилось что-то, о чём другим стоит знать, —
EventBus.Publish(new ...Event{...}). Подписчик обязан отписаться вOnDestroy. - Каждый модуль сам сохраняет свои данные — реализует
ISaveParticipantи регистрируется вSaveRegistry. Модуль Сохранений не знает, что внутри секций. - Правила игры — без Unity и без
float, где это возможно (Армия, Бой, симуляция Мира). Этот код без изменений сможет работать на сервере. - Слой приложения (
Assets/Scripts, внеModules) — интерфейс, панели,GameProgress. Ему можно обращаться к модулям напрямую. Переносить оттуда логику в модули — постепенно, по плану. - Вся «проводка» — в
App/GameModules.cs. Новую связь между модулем и остальной игрой добавляй туда, а не внутрь модуля.
Как вести документы модулей
- Изменил модуль — обнови его документ в том же коммите. Новый метод контракта, событие, секция сохранения, файл — всё это в разделах документа.
- В «Журнал изменений» добавляй строку сверху: дата, кто, что изменилось. Так видно историю модуля без чтения кода.
- Решение команды, которое касается модуля, записывай в раздел «Решения и план» со ссылкой на источник (например, «план от 19.10.2026»).
- Новый модуль — новый файл по образцу
Economy.mdи строка в таблице выше.
Тесты
EditMode-тесты: Assets/Scripts/Modules/Tests/ModuleTests.cs. Запуск: Window → General → Test Runner → EditMode → Run All.
Уже есть: Армия (поход не создаёт и не теряет солдат, потери по типам, сохранение, перенос старых данных, сброс), Круг (основание, вступление, выход, полный Круг, сохранение), канал «Круг» в чате только для участников, чат (пустое сообщение, обрезка длинного, событие, предел истории), деление войск без двойного учёта и без потерь, бой (больше солдат — победа, ничья — защитнику), поход с офлайн-прогрессом, шина событий (ошибка подписчика не ломает остальных), реестр модулей.
Добавить вместе с этапами 1, 2 и 5 (решение команды от 19.10.2026):
- лимит жилья: 300 жителей при лимите 300 — прирост стоит, построен Дом — прирост идёт;
- нельзя призвать ниже гражданского резерва: 150 свободных, резерв 30 → призвать можно не больше 120;
- назначение гарнизона: 30 солдат, 10 в гарнизон → 20 доступны, всего по-прежнему 30 (основа — тест «один солдат в одном месте» для походов уже есть);
- голод и восстановление: еда кончилась → дебаффы, в том числе у защитников; еда вернулась → снятие по правилу;
- предел синих кристаллов: кристаллы не копятся бесконечно, сверх лимита — по общему правилу.
Журнал изменений
| Дата | Кто | Что |
|---|---|---|
| 23.10.2026 | Claude | Окно «ВОЙСКО ВЕРНУЛОСЬ» в городе (UI/MarchReturnPopup.cs), обновлён World. |
| 23.10.2026 | Claude | Войска переехали в модуль Армии (ArmyService, секция army), ArmyBridge удалён. Обновлены Army, Core, Save. |
| 19.10.2026 | Claude | Оставлена одна карта мира (сцена WorldMap). Маленькая карта Meta/World удалена с переносом солдат из её походов. Обновлены World и Army. |
| 19.10.2026 | Claude | Добавлен модуль Круга (Bogatyri.Circle, Circle.md): основать, вступить, выйти, роли, окно «Круг» на карте мира. Канал «Круг» в чате привязан к Кругу игрока. |
| 19.10.2026 | Claude | Добавлен модуль Чата (Bogatyri.Chat, Chat.md) с разворотом на весь экран. В сцене города кнопка «ПОЧТА» привязана к правому краю нижней панели — в безопасной зоне она уезжала за экран. |
| 19.10.2026 | Claude | Слой приложения: HUD города и карты мира учитывает Safe Area (UI/SafeArea.cs, UI/SafeAreaInstaller.cs). Элементы, растянутые на весь экран, остаются на весь экран. |
| 19.10.2026 | Claude | Добавлен сброс сохранений (Настройки, меню Tools, ISaveSystem.ResetAll). Обновлены Core, Economy, Settlement, World, Save. |
| 19.10.2026 | Claude | Создана модульная система: ядро, шесть модулей, точка сборки App/GameModules, тесты, документы модулей. Ветка feature/modules. |