# Moon Courier Crisis

Демка · 8 сентября 2026

Moon Courier Crisis разделяет доменную симуляцию и представление. SimulationEngine принимает команды, создаёт события и snapshots; seeded RNG делает прохождение воспроизводимым. React/Zustand управляют интерфейсом миссии, а Phaser рисует сцену как проекцию текущего состояния.

Версия исходников: b6b24e1215368727b8ad002919aa7989c04ddfdd

Сохранённая история стадий: август 2026; начало разработки не установлено. Публикация демо: 7 сентября 2026.

## Задача

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

Браузерная игра с управлением маршрутом.

## Выполнено

- Связал React-интерфейс с игровыми сценами Phaser.
- Маршруты, события, брифинг, радиопанель и повтор миссии.
- Сборка, проверка ассетов и мобильная вёрстка экранов перед стартом игры.

## Что отличает реализацию

Маршрут рассчитывается Dijkstra с учётом открытых узлов, видимость меняется событиями, а контент проверяется Zod до запуска. Команды и snapshots позволяют тестировать исход миссии без браузера; Phaser не владеет правилами игры и может быть пересоздан из состояния.

## Состав прикладного кода

- TypeScript simulation / domain: 35.9%
- React / Zustand: 22.9%
- TypeScript / Zod content: 22.1%
- Phaser: 19.1%

Доли по размеру прикладных файлов Git в закреплённой версии. Каждый файл отнесён к одной подсистеме по правилам scripts/generate-stack-share.mjs; тесты, ассеты, зависимости и generated-файлы исключены. Округление — до 0,1%. Это состав кода, а не уровень владения технологиями.

## Стек

| Технология | Роль |
| --- | --- |
| React | Брифинг, панели, подсказки и результат миссии. |
| Phaser | Canvas, игровой цикл, сцены, маршруты и объекты. |
| TypeScript / Vite | Модель игры, production-сборка и проверка ресурсов. |

## Архитектура

- React отвечает за интерфейс, Phaser — за canvas и игровой цикл.
- Состояния выбора уровня, брифинга, миссии и результата разделены.
- После поражения повтор возвращает в брифинг; новая смена запускается явным действием.

### Компоненты опубликованного демо

![Компоненты опубликованного демо](https://komaroff-dev.ru/evidence/moon/diagrams/components.svg)

[Mermaid](https://komaroff-dev.ru/evidence/moon/diagrams/components.mmd)

### Основной сценарий

![Основной сценарий](https://komaroff-dev.ru/evidence/moon/diagrams/scenario.svg)

[Mermaid](https://komaroff-dev.ru/evidence/moon/diagrams/scenario.mmd)

### Размещение опубликованной версии

![Размещение опубликованной версии](https://komaroff-dev.ru/evidence/moon/diagrams/deployment.svg)

[Mermaid](https://komaroff-dev.ru/evidence/moon/diagrams/deployment.mmd)

## Code-map

| Функция | Экран / API | Модуль | Данные / проверка |
| --- | --- | --- | --- |
| Запуск | Выбор / брифинг | src/ui/store/gameStore.ts; src/game/createGame.ts | level config; production browser QA |
| Маршрут | Canvas | src/game/MapScene.ts; simulation/routing/confirmRouteDraft.ts | routeDraft / findWeightedRoute; фактический маршрут |
| События | Радиопанель | simulation/radio/createRadioJournal.ts | formatRadioEvent; игровая история |
| Симуляция | Миссия / результат | simulation/createSimulationEngine.ts; clock/fixedStepClock.ts | состояния курьеров и центров; unit suite |
| Мобильный вид | Preflight / radio | React styles / src/ui | 390px; no-overflow QA |

Перед изменением пройти связи экран → API → состояние → хранилище. Проверить входы, ошибки и повторные действия. Обновить карту и схемы вместе с кодом, выполнить связанные проверки и привязать материалы к версии.

## Сценарии

- Выберите уровень и прочитайте брифинг.
- Начните смену, выберите курьера и назначьте маршрут.
- Откройте радиопанель и проследите событие миссии.
- Дождитесь результата, нажмите повтор и запустите новую смену из брифинга.

## Проверки

- Исходный полный набор: 464 unit-теста, 20 E2E и один skip. После CSS-правки повторены production build, assets и мобильный QA.
- Production build / assets
- Desktop route and actual defeat/replay
- Mobile levels, briefing, radio; no overflow
- Подтверждённого GitHub CI для этого SHA нет; перечислены выполненные локальные проверки и сценарии опубликованной версии. Исторические CI-ссылки, если есть, отмечены отдельно.

## Результаты

- Сохранено 15 содержательных кадров фактического интерфейса.
- Дата, сценарий и версия указаны у каждого кадра.
- Отдельного backend-процесса на VPS нет: Nginx раздаёт статику. Ресурсы общего Nginx нельзя честно приписать одному сайту.
- Измерено 6 повторений сценария; медиана 61.0 мс, максимум 1770 мс. Время включает браузер и HTTPS; методика и ограничения приложены.

![Общий ресурсный контекст VPS для статического демо · 2026-09-07T01:08:27 — 01:11:22 UTC](https://komaroff-dev.ru/evidence/moon/charts/resources.svg)

[Данные](https://komaroff-dev.ru/evidence/moon/metrics/measurements.json)

![Измеренные повторения сценария через HTTPS · 2026-09-07T01:08:36 UTC; ограничения методики в JSON](https://komaroff-dev.ru/evidence/moon/charts/scenario-time.svg)

[Данные](https://komaroff-dev.ru/evidence/moon/metrics/measurements.json)

## Ограничения

- Управление маршрутом рассчитано на мышь и клавиатуру. Мобильные экраны адаптированы, полноценное touch-управление маршрутом не заявляется.
- Первый доступный commit — baseline готовой стадии, поэтому он не определяет начало разработки.
- Нет внешних интеграций или серверной БД: миссия выполняется в браузере.

## Запуск и эксплуатация

Игра выполняется в браузере. Сервер отдаёт статику, внешних платёжных или AI-интеграций нет.

Production-сборка с проверкой TypeScript и ассетов выполняется вне VPS. На сервере Nginx отдаёт готовый каталог; постоянного backend нет.

Для проверки пройти реальные состояния миссии, не подменяя результат через test hooks. В evidence сохранены фактическое поражение и повтор. Кадры разных релизов отмечены индивидуально; мобильная правка меняет layout, а не игровую механику.

Сборка вне VPS, на сервер уходят готовые файлы и образы с фиксированной версией. Секреты отдельно. Логи ротируются; после изменения log options контейнер нужно пересоздать. Общий docker prune не используется.

Code-map связывает экран или API с модулем и данными. При правке нужно проверить эти связи, обновить карту и прогнать затронутые сценарии: обычный проход, ошибку, повтор, сброс. Схема может устареть, поэтому её версия указана рядом.

Откат проверен 2026-09-07T00:59:40.423436+00:00: 20260907-verified → 20260907b → 20260907-verified. После каждого переключения подтверждены HTTPS, readiness и SHA. Это проверка конфигурации и артефактов на одном проверенном SHA; обратная миграция БД не выполнялась.

## Скриншоты

[Выбор миссии; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/01-level-select.png) — 2026-09-07T01:05:40.267729+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Брифинг и условия смены; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/02-briefing.png) — 2026-09-07T01:05:47.034942+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Карта начавшейся миссии; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/03-mission.png) — 2026-09-07T01:07:40.196399+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Пауза и управление сменой; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/04-pause.png) — 2026-09-07T01:07:48.861345+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Радиособытия; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/05-radio.png) — 2026-09-07T01:17:22.254481+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Выбор курьера; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/06-rover.png) — 2026-09-07T01:12:20.586436+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Назначенный маршрут; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/07-route.png) — 2026-09-07T01:12:36.010812+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Прибытие к точке; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/08-arrival.png) — 2026-09-07T01:17:00.583707+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Мобильный выбор миссии; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/09-mobile-levels.png) — 2026-09-06T23:50:44.174550+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Мобильный брифинг; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/10-mobile-briefing.png) — 2026-09-06T23:50:44.760211+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Карта на узком экране; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/11-mobile-map.png) — 2026-09-06T23:50:47.754791+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Мобильная радиопанель; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/12-mobile-radio.png) — 2026-09-06T23:50:48.366580+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Фактический результат: миссия потеряна](https://komaroff-dev.ru/evidence/moon/full/14-outcome.png) — 2026-09-07T01:10:26.052432+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Повтор возвращает к брифингу](https://komaroff-dev.ru/evidence/moon/full/15-replay-briefing.png) — 2026-09-07T01:11:14.388480+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Новая смена после повтора; кадр фиксирует действие игрока, состояние симуляции и изменение интерфейса.](https://komaroff-dev.ru/evidence/moon/full/16-restarted-mission.png) — 2026-09-07T01:11:35.021611+00:00, b6b24e1215368727b8ad002919aa7989c04ddfdd.

[Материалы](https://komaroff-dev.ru/downloads/moon-evidence.zip)
