MilSim
Варгейм для исследования того, как ИИ мог бы прогнозировать ситуацию на поле боя
MilSim является модульным симулятором командования и управления, построенным вокруг ограничения, которое большинство стратегических игр устраняет: игрок не видит объективное состояние поля боя.
Игрок действует как командир взвода, отдает приказы отделениям и принимает решения на основе донесений, которые приходят с задержкой, содержат ограниченные наблюдения и устаревают по мере развития симуляции. Главная механика строится на разнице между происходящим и текущим представлением командира о происходящем.
Проект начался с headless-ядра, затем развился в полный текстовый first playable, систему JSON-сценариев и локальный браузерный прототип с интерактивной тактической картой.
Картина командира не равна реальности
Обычные стратегические игры дают почти идеальную осведомленность. Позиции союзников и противников видны, информация обновляется мгновенно, а приказ можно оценить относительно истинного состояния карты.
В MilSim именно такой доступ становится центральной проблемой дизайна.
Симуляция хранит полное объективное состояние: реальные позиции подразделений, скрытые контакты, местность, приказы и события. Игрок никогда не получает его напрямую. Role View Layer создает отдельную командирскую проекцию, в которой присутствуют только доступные по полномочиям подразделения, известные позиции, доставленные донесения, время наблюдения и достоверность.
Противник в объективном состоянии имеет внутреннюю идентичность сущности. В картине командира он представлен контактом с другим идентификатором. Поэтому маркер означает, что в определенном месте и в определенное время что-то было замечено, а не то, что противник гарантированно находится там сейчас.
Так неопределенность становится системным правилом, а не визуальным эффектом. Правильное решение может опираться на информацию, которая была точной в момент наблюдения, но изменилась к моменту доставки.
Сначала headless-ядро, затем интерфейс
Первым техническим риском была модель информации, а не графика. Поэтому разработка началась с детерминированного ядра на C# и .NET 10, независимого от клиента.
Архитектура разделяет объективную симуляцию, команды игрока, автоматический запуск сценариев, тесты и представление между повторно используемыми модулями. CLI, headless runner и браузерный клиент работают с одними доменными правилами, а не реализуют собственные версии движения, обнаружения, донесений или оценки результата.
Путь команды задан явно:
Приказ игрока
-> проверка полномочий и маршрута
-> объективное состояние симуляции
-> события движения и обнаружения
-> жизненный цикл задержанного донесения
-> Role View командира
-> CLI или браузерный клиент
Журнал событий
-> объективный replay
-> послемиссионное сравнение Время симуляции движется дискретными тактами, а не системными часами. События получают упорядоченные последовательные номера, и одинаковое исходное состояние с одинаковыми командами дает одинаковый результат. Это делает полные прохождения воспроизводимыми и позволяет тестировать ошибки без отрисовки интерфейса.
Полный first playable цикл
В принятом текстовом MVP используется намеренно небольшой сценарий: командир взвода управляет тремя отделениями на сетке 20 на 20. Игрок получает задачу, изучает текущую командирскую картину, планирует движение, отдает приказ, продвигает время, получает контактные донесения и завершает миссию с оценкой, разбором и объективным replay.
У донесения есть собственный жизненный цикл:
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 показывает путь от абстрактной механики к работающей системе принятия решений: объективное состояние остается защищенным, неопределенность получает явную структуру, несколько клиентов используют одно детерминированное ядро, а каждое публичное утверждение ограничено воспроизводимыми доказательствами.