Files
MVP1/Docs/Modules/Core.md
T
Alexander b11b97607f Слита ветка товарища feature/storage-workers: склады и лимиты, добыча через рабочих
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	Assets/Scripts/App/DebugPanel.cs
#	Docs/Modules/Core.md
#	Docs/Modules/README.md
#	Docs/Modules/Save.md
2026-10-27 16:57:28 +01:00

7.9 KiB
Raw Blame History

Игровое ядро

Общие данные, игровые правила взаимодействия и связь модулей. Ядро не содержит игровой логики — только «язык», на котором модули говорят друг с другом.

  • Сборки:
    • 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/WorkJob.cs Профессии рабочих WorkJob и WorkJobs (какой ресурс добывает профессия, русское название). Числа enum не менять: они в сохранениях.
Core/GameClock.cs Часы игры: UnixNow = реальное время + сдвиг. Advance(секунд) — перемотка для отладки, публикует GameTimeAdvancedEvent. Сдвиг не сохраняется. Модули берут время только отсюда.
Core/EventBus.cs Шина событий: Subscribe<T>, Unsubscribe<T>, Publish<T>. Ошибка одного подписчика не мешает остальным (уходит в OnHandlerError).
Core/Contracts/ModuleContracts.cs Контракты всех модулей и SaveRegistry — см. таблицу ниже.
Core/Events/GameEvents.cs Все события модулей.
Core.Unity/CoreUnityBootstrap.cs При старте игры очищает реестр, шину и список сохраняемых, сбрасывает перемотку GameClock, подключает ошибки шины к Debug.LogException.
Core.Unity/UIBlocker.cs «Палец над интерфейсом?» — общая проверка для кликов по миру.

Контракты

Контракт Реализует Что умеет
IEconomy Экономика (ResourceManager) Узнать, добавить, потратить ресурс; проверить и списать цену целиком; лимит склада.
IProduction Экономика (ProductionService) Места для рабочих по профессиям, эффективность, добыча в час; Produce — добыть за время.
ISettlement Поселение (SettlementModule) Уровень Ратуши, число построек, открыт ли город.
ILeveledBuilding Здания с уровнем (ResourceCollector) Уровень здания — его сохраняет Поселение.
IPopulation Население (PopulationService) Жители, рабочие по профессиям, воины, предел жилья, расход еды и прирост в час, голод; Tick — досчитать до момента.
IArmy Армия (ArmyService) Войска по типам, в городе и в походах; обучение, потери; забрать в поход, вернуть выживших.
IWorld Мир (MarchManager) Сколько походов в пути; начать поход.
IBattleSystem Бой (BattleSystem) Посчитать исход боя по BattleRequest: состав сторон по типам, стены, бонусы.
IChat Чат (ChatService) История каналов, можно ли писать в канал, отправка сообщения от локального игрока.
ICircle Круг (CircleService) Круг игрока, список Кругов; основать, вступить, выйти.
ISaveSystem Сохранения (SaveManager) Есть ли сохранение; сохранить сейчас; стереть; сбросить всё (ResetAll).
ISaveParticipant Любой модуль с данными Секция сохранения: ключ, Capture(), Restore(json), ResetState() — новая игра.

Порядок запуска

  1. SubsystemRegistration — CoreUnityBootstrap очищает ядро.
  2. AfterAssembliesLoaded — App/GameModules и SettlementModule регистрируют сервисы и подписки.
  3. BeforeSceneLoad — создаётся MarchManager (Мир).
  4. Awake объектов сцены — ResourceManager, SaveManager регистрируются сами.
  5. AfterSceneLoad — перенос старых походов из progress.json.
  6. Start — GameBootstrap загружает сохранение или, если файла нет, публикует NewGameStartedEvent.
  7. Раз в 2 секунды — App/PopulationTicker досчитывает Население.

Решения и план

  • Решение команды от 19.10.2026: единый источник истины для населения, армии и ресурсов. Новые контракты для этапов 1, 2 и 5 — население, гарнизон, голод, лимиты хранения — добавляются сюда, когда начинается соответствующий этап.

Журнал изменений

Дата Кто Что
27.10.2026 Claude IArmy: гарнизон (GarrisonTotal, GetGarrison, AvailableForMarch, SetGarrison); TroopsChangedEvent.Garrison.
27.10.2026 Claude MarchReturnedEvent.TargetEmpty: войско пришло к уже разбитому лагерю.
27.10.2026 Claude TroopType (типы войск), BattleRequest / BattleOutcome с составом по типам, силой сторон и бонусами; IArmy.GetMarchUnits, IArmy.ReturnUnits.
27.10.2026 Claude WorkJob; контракт IProduction; IEconomy.GetCapacity; IPopulation: Workforce, FreeWorkers, GetWorkers, SetWorkers; событие WorkersChangedEvent.
26.10.2026 Claude GameClock; контракт IPopulation; события GameTimeAdvancedEvent, PopulationChangedEvent, StarvationChangedEvent, NewGameStartedEvent.
23.10.2026 Claude IArmy расширен (типы, AddTroops, LoseFraction, TroopsInMarches), событие TroopsChangedEvent. GameLoadedEvent публикуется и когда файла сохранения нет.
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.