Модуль Чата (Bogatyri.Chat, без Unity): - чат вынесен из Social в отдельный модуль; контракт IChat в ядре, событие ChatMessageReceivedEvent, LocalPlayer (id и имя игрока) - панель чата работает только через контракт и события - разворот чата на весь экран: кнопка «Развернуть/Свернуть» или Esc Модуль Круга (Bogatyri.Circle, без Unity): - основать Круг, вступить, выйти; роли главы и участника; 30 мест - уход главы передаёт главенство, последний участник распускает Круг - секция сохранения "circle", участвует в сбросе сохранений - окно «Круг» (кнопка внизу карты мира), демо-Круги до появления сервера - канал «Круг» в чате — только для участников Круга Прочее: - кнопка «Почта» привязана к правому краю нижней панели (в безопасной зоне она уезжала за экран) - тесты Чата и Круга; документы Chat.md, Circle.md, обновлены README, Core, Save Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.4 KiB
5.4 KiB
Игровое ядро
Общие данные, игровые правила взаимодействия и связь модулей. Ядро не содержит игровой логики — только «язык», на котором модули говорят друг с другом.
- Сборки:
Bogatyri.Core— чистый C#, без Unity (его можно взять на сервер);Bogatyri.Core.Unity— тонкая прослойка к движку.
- Папки:
Assets/Scripts/Modules/Core,Assets/Scripts/Modules/Core.Unity. - Зависимости: нет. От ядра зависят все модули.
Что внутри
| Файл | Что это |
|---|---|
Core/ResourceType.cs |
Перечисление ресурсов ResourceType и структура ResourceAmount (тип + количество). Числа enum не менять: они в сохранениях. |
Core/LocalPlayer.cs |
Id и имя локального игрока (пока без аккаунтов). |
Core/GameServices.cs |
Реестр модулей: Register<T>, Get<T>, TryGet<T>, Has<T>, Unregister<T>. |
Core/EventBus.cs |
Шина событий: Subscribe<T>, Unsubscribe<T>, Publish<T>. Ошибка одного подписчика не мешает остальным (уходит в OnHandlerError). |
Core/Contracts/ModuleContracts.cs |
Контракты всех модулей и SaveRegistry — см. таблицу ниже. |
Core/Events/GameEvents.cs |
Все события модулей. |
Core.Unity/CoreUnityBootstrap.cs |
При старте игры очищает реестр, шину и список сохраняемых, подключает ошибки шины к Debug.LogException. |
Core.Unity/UIBlocker.cs |
«Палец над интерфейсом?» — общая проверка для кликов по миру. |
Контракты
| Контракт | Реализует | Что умеет |
|---|---|---|
IEconomy |
Экономика (ResourceManager) |
Узнать, добавить, потратить ресурс; проверить и списать цену целиком. |
ISettlement |
Поселение (SettlementModule) |
Уровень Ратуши, число построек, открыт ли город. |
ILeveledBuilding |
Здания с уровнем (ResourceCollector) |
Уровень здания — его сохраняет Поселение. |
IArmy |
Армия (ArmyBridge.Service) |
Воины дома; забрать в поход; вернуть выживших. |
IWorld |
Мир (MarchManager) |
Сколько походов в пути; начать поход. |
IBattleSystem |
Бой (BattleSystem) |
Посчитать исход боя по BattleRequest. |
IChat |
Чат (ChatService) |
История каналов, можно ли писать в канал, отправка сообщения от локального игрока. |
ICircle |
Круг (CircleService) |
Круг игрока, список Кругов; основать, вступить, выйти. |
ISaveSystem |
Сохранения (SaveManager) |
Есть ли сохранение; сохранить сейчас; стереть; сбросить всё (ResetAll). |
ISaveParticipant |
Любой модуль с данными | Секция сохранения: ключ, Capture(), Restore(json), ResetState() — новая игра. |
Порядок запуска
SubsystemRegistration—CoreUnityBootstrapочищает ядро.AfterAssembliesLoaded—App/GameModulesиSettlementModuleрегистрируют сервисы и подписки.BeforeSceneLoad— создаётсяMarchManager(Мир).Awakeобъектов сцены —ResourceManager,SaveManagerрегистрируются сами.AfterSceneLoad— перенос старых походов изprogress.json.Start—GameBootstrapзагружает сохранение.
Решения и план
- Решение команды от 19.10.2026: единый источник истины для населения, армии и ресурсов. Новые контракты для этапов 1, 2 и 5 — население, гарнизон, голод, лимиты хранения — добавляются сюда, когда начинается соответствующий этап.
Журнал изменений
| Дата | Кто | Что |
|---|---|---|
| 19.10.2026 | Claude | Контракт ICircle и типы CircleInfo, CircleMember, CircleRole; события CircleJoinedEvent, CircleLeftEvent; IChat.CanWrite. |
| 19.10.2026 | Claude | Контракт IChat, типы ChatChannel и ChatMessage, событие ChatMessageReceivedEvent, LocalPlayer. |
| 19.10.2026 | Claude | Сброс сохранений: ISaveSystem.ResetAll(), ISaveParticipant.ResetState(), событие GameResetEvent. |
| 19.10.2026 | Claude | Создано ядро: реестр, шина событий, контракты шести модулей, события, SaveRegistry. ResourceType перенесён сюда из ResourceManager.cs, UIBlocker — из Meta/Core. |