# MilSim

Варгейм для исследования того, как ИИ мог бы прогнозировать ситуацию на поле боя

## Кратко о проекте

- **Проблема:** Большинство стратегических систем дают игроку прямой доступ к объективному состоянию, хотя реальные командные решения зависят от задержанной, неполной, ограниченной ролью и постепенно устаревающей информации.
- **Система:** Headless-first симуляция на C# и .NET отделяет объективное состояние поля боя от командирского восприятия с помощью детерминированных событий, задержанных донесений, ролевых представлений и заменяемых CLI и браузерного клиентов.
- **Входные данные:** JSON-сценарии, местность, состояние подразделений, командные полномочия, приказы игрока, такты симуляции, события обнаружения и задержанные донесения.
- **Результат:** Играбельный командный цикл с ограниченными ролью тактическими представлениями, планированием маршрутов, контактными донесениями, оценкой результата, разбором и объективным replay.
- **Подтверждения:** Чистый committed baseline был повторно проверен 2026-09-13: прошли 143 из 143 тестов, web build, проверки синтаксиса JavaScript и HTTP smoke test для трех сценариев и карты из 400 клеток.
- **Статус:** Принятый текстовый First Playable MVP v1 с локальным браузерным прототипом в review. Enemy AI, multiplayer, save/load, редактор сценариев, зрелая модель боя, упаковка и публичное развертывание остаются за границами проверенного релиза.

- **Полная история:** /ru/projects/milsim/story/

## Полная история

MilSim является модульным симулятором командования и управления, построенным вокруг ограничения, которое большинство стратегических игр устраняет: игрок не видит объективное состояние поля боя.

Игрок действует как командир взвода, отдает приказы отделениям и принимает решения на основе донесений, которые приходят с задержкой, содержат ограниченные наблюдения и устаревают по мере развития симуляции. Главная механика строится на разнице между происходящим и текущим представлением командира о происходящем.

Проект начался с headless-ядра, затем развился в полный текстовый first playable, систему JSON-сценариев и локальный браузерный прототип с интерактивной тактической картой.

## Картина командира не равна реальности

Обычные стратегические игры дают почти идеальную осведомленность. Позиции союзников и противников видны, информация обновляется мгновенно, а приказ можно оценить относительно истинного состояния карты.

В MilSim именно такой доступ становится центральной проблемой дизайна.

Симуляция хранит полное объективное состояние: реальные позиции подразделений, скрытые контакты, местность, приказы и события. Игрок никогда не получает его напрямую. Role View Layer создает отдельную командирскую проекцию, в которой присутствуют только доступные по полномочиям подразделения, известные позиции, доставленные донесения, время наблюдения и достоверность.

Противник в объективном состоянии имеет внутреннюю идентичность сущности. В картине командира он представлен контактом с другим идентификатором. Поэтому маркер означает, что в определенном месте и в определенное время что-то было замечено, а не то, что противник гарантированно находится там сейчас.

Так неопределенность становится системным правилом, а не визуальным эффектом. Правильное решение может опираться на информацию, которая была точной в момент наблюдения, но изменилась к моменту доставки.

## Сначала headless-ядро, затем интерфейс

Первым техническим риском была модель информации, а не графика. Поэтому разработка началась с детерминированного ядра на C# и .NET 10, независимого от клиента.

Архитектура разделяет объективную симуляцию, команды игрока, автоматический запуск сценариев, тесты и представление между повторно используемыми модулями. CLI, headless runner и браузерный клиент работают с одними доменными правилами, а не реализуют собственные версии движения, обнаружения, донесений или оценки результата.

Путь команды задан явно:

```text
Приказ игрока
-> проверка полномочий и маршрута
-> объективное состояние симуляции
-> события движения и обнаружения
-> жизненный цикл задержанного донесения
-> Role View командира
-> CLI или браузерный клиент

Журнал событий
-> объективный replay
-> послемиссионное сравнение
```

Время симуляции движется дискретными тактами, а не системными часами. События получают упорядоченные последовательные номера, и одинаковое исходное состояние с одинаковыми командами дает одинаковый результат. Это делает полные прохождения воспроизводимыми и позволяет тестировать ошибки без отрисовки интерфейса.

## Полный first playable цикл

В принятом текстовом MVP используется намеренно небольшой сценарий: командир взвода управляет тремя отделениями на сетке 20 на 20. Игрок получает задачу, изучает текущую командирскую картину, планирует движение, отдает приказ, продвигает время, получает контактные донесения и завершает миссию с оценкой, разбором и объективным replay.

У донесения есть собственный жизненный цикл:

```text
Observed -> Created -> Sent -> Delayed -> Delivered
                                      -> Expired
```

Время наблюдения, создания, плановой доставки и фактического получения хранится отдельно. Поэтому интерфейс может показывать не только сообщенную позицию, но также возраст и состояние информации.

CLI предоставляет полный игровой цикл через команды для задачи, целей, статуса, карты, проверки маршрута, движения, продвижения времени, входящих донесений, истории приказов, результата, разбора и replay. Обучение, контекстные следующие шаги, легенда, встроенная демонстрация, список сценариев и автоматическая MVP-проверка позволяют пройти симуляцию без изучения кодовой базы.

## Местность, маршруты и повторно используемые сценарии

Первая модель движения выросла в планирование с учетом местности. Открытая территория, дороги, пересеченная местность и заблокированные клетки влияют на время движения, допустимость маршрута, видимость и вероятность обнаружения.

Предварительный просмотр маршрута рассчитывает время прибытия без изменения состояния симуляции. Приказы с waypoint проверяют полный составной маршрут до отправки и автоматически выдают следующий участок после достижения точки. Заблокированная местность разрывает линию видимости, а пересеченная усложняет обнаружение контакта.

Сценарии были вынесены из кода в валидируемый JSON. Сценарий задает размер карты, начальные подразделения, скрытые контакты, местность, цели, подсказки и рекомендуемое продвижение. Три встроенных сценария проверяют базовый цикл задержанных донесений, разведку с местностью и работу линии видимости.

Разделение сценарных данных, доменных правил и клиентского представления позволяет создавать новые миссии без изменения симуляционного ядра.

## От командной строки к тактической карте

Текстовый релиз доказал работоспособность командного цикла, но не показал, способен ли новый игрок понять систему без изучения CLI. Следующий вертикальный срез добавил локальный сервис на ASP.NET Core и браузерный клиент.

Браузер предоставляет выбор сценария, управление сессией, интерактивную тактическую сетку, выбор отделения и точки назначения, проверку маршрута, команды движения и такта, прогресс миссии, входящие донесения, историю приказов, итог и разбор.

Ранние версии показывали слишком много консольной структуры и прятали важные цели под картой. Игровое тестирование перенесло состояние миссии и следующее действие в основной экран, добавило fit-to-view и масштабирование, сделало дружественные маркеры выбираемыми, уточнило названия действий и разделило текущий результат с историей.

Визуальная карта по-прежнему получает только Role View. Она не загружает объективные позиции противника, чтобы затем скрыть их через CSS. Одна информационная граница действует и для текста, и для графического клиента.

## Архитектура защищает неопределенность

Несколько границ сохраняют честность симуляции.

Объективные DTO отделены от DTO игрока. Truth-leak тесты запрещают попадание внутренних идентификаторов противника, данных объективного replay и неограниченного состояния симуляции в ответы игроку. Командные полномочия проверяются до входа приказа в симуляцию. Новая информация меняет командирскую проекцию только после доставки соответствующего донесения.

Журнал событий обеспечивает детерминированный replay и послемиссионный анализ. Игрок может сравнить решения, принятые на основе доступной информации, с объективной последовательностью событий, не получая доступ к этой правде во время командования.

Такая архитектура полезна не только для одной военной игры. Разделение объективного состояния и ограниченного ролью восприятия встречается в incident response, логистике, операционных инструментах, оценке агентов и любых системах принятия решений, где данные приходят с задержкой или проходят через границу полномочий.

## Доказательства и текущие границы

Чистый committed baseline был повторно проверен 2026-09-13. Все 143 автоматических теста прошли. Web-проект успешно собрался, оба браузерных JavaScript-файла прошли проверку синтаксиса, а HTTP smoke test создал сессию, загрузил три встроенных сценария и вернул ожидаемую карту из 400 клеток.

Принятый релиз имеет название First Playable MVP v1. Он охватывает полный текстовый командный цикл, а реализованный браузерный GUI пока остается в review.

Текущая разработка исследует приказы на взаимодействие с противником, результаты боя, более подробные состояния контактов, правила дальности и видимости, военные обозначения и поиск пути вокруг препятствий. Эти эксперименты не представлены как выпущенная возможность. Свежий прогон непринятой рабочей копии содержит 151 тест: 140 проходят, а 11 ожидаемо выявляют незавершенные изменения маршрутов, контактов и CLI. Проверенный committed baseline остается зеленым.

В MilSim пока нет enemy AI, multiplayer, save/load, редактора сценариев, зрелой модели оружия, потерь и морали, радиоэлектронных помех, установщика и публичного развертывания.

## Моя роль

Я определил продуктовую концепцию и границы MVP, спроектировал доменную и информационную модель, реализовал симуляционное ядро, CLI, систему сценариев и браузерный прототип, а также построил автоматическую и сквозную проверку вокруг них.

Работа объединяет продуктовый дизайн, системную архитектуру, разработку на C# и .NET, браузерный UX, проектирование тестов, игровые проверки, ведение backlog и документацию архитектурных решений. Каждая итерация строилась как вертикальный срез, который должен был добавить проверяемую часть командного опыта, а не только новую техническую абстракцию.

MilSim показывает путь от абстрактной механики к работающей системе принятия решений: объективное состояние остается защищенным, неопределенность получает явную структуру, несколько клиентов используют одно детерминированное ядро, а каждое публичное утверждение ограничено воспроизводимыми доказательствами.
