Модуль Боя (Bogatyri.Battle, без Unity и float): - сила стороны по типам войск, сила воина — из GameData.Troops (4/5/9/16) - контры +25%: пехота > кавалерия > лучники > пехота (по составу врага) - стены +20% защитникам; осадные +50% против стен, −25% в поле - потери по типам: проигравший — половина, победитель — до половины (чем ровнее бой, тем больше) - BattleRequest/BattleOutcome расширены (состав, стены, бонусы, сила сторон); бой «числом» считается пехотой - формула — предложение, числа константами в BattleSystem.cs, ждёт утверждения командой Мир и Армия: - состав гарнизона у каждой цели (WorldMapLayout.GarrisonUnits, из id — карта не изменилась) - поход хранит состав по типам; выжившие возвращаются точно по типам (IArmy.GetMarchUnits/ReturnUnits) - время походов по GameClock: перемотка в DEV-панели проматывает и походы Интерфейс карты: - окно атаки: состав гарнизона и ожидаемый исход (сила сторон, победа/поражение, потери) - верхняя панель: воины в походах (а не число отрядов) Тесты: контры, стены, осадные, потери в пределах состава, состав гарнизонов. Документы Battle, World, Army, Core, README обновлены. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6.9 KiB
6.9 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/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) |
Узнать, добавить, потратить ресурс; проверить и списать цену целиком. |
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() — новая игра. |
Порядок запуска
SubsystemRegistration—CoreUnityBootstrapочищает ядро.AfterAssembliesLoaded—App/GameModulesиSettlementModuleрегистрируют сервисы и подписки.BeforeSceneLoad— создаётсяMarchManager(Мир).Awakeобъектов сцены —ResourceManager,SaveManagerрегистрируются сами.AfterSceneLoad— перенос старых походов изprogress.json.Start—GameBootstrapзагружает сохранение или, если файла нет, публикуетNewGameStartedEvent.- Раз в 2 секунды —
App/PopulationTickerдосчитывает Население.
Решения и план
- Решение команды от 19.10.2026: единый источник истины для населения, армии и ресурсов. Новые контракты для этапов 1, 2 и 5 — население, гарнизон, голод, лимиты хранения — добавляются сюда, когда начинается соответствующий этап.
Журнал изменений
| Дата | Кто | Что |
|---|---|---|
| 27.10.2026 | Claude | TroopType (типы войск), BattleRequest / BattleOutcome с составом по типам, силой сторон и бонусами; IArmy.GetMarchUnits, IArmy.ReturnUnits. |
| 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. |