Архитектура игры «Эхо Разлома»: C4 и критические пути
Схемы C4 до уровня компонентов и четыре критических пути через sequence: запуск, кадр, касание скалы и подстройка качества.
Игра «Эхо Разлома» — открытый остров 900 × 900 м в браузере: без движка и сборки, одна страница и набор модулей. Здесь описано, как она устроена: схемы C4 до уровня компонентов и четыре пути, на которых всё держится.
C4: контекст и контейнеры
Уровень 1. Система и её окружение
Всё необходимое для игры приходит из браузера и CDN. Своего сервера у игры нет: подойдёт любой статический хостинг.
Уровень 2. Контейнеры
Страница владеет циклом и сюжетом, остальное подключается к ней. Модуль, который падает, отключается один.
C4 уровня 3: компоненты контекстов
Контексты общаются через общий объект ctx и несколько глобальных объектов. У каждого факта один хозяин: пилота двигает физика, кости пишет сборщик позы, о предметах мира знает реестр.
Мир
Всё, что твёрдое, регистрируется в Passport и становится столкновением.
Деревья рисуются пакетами по материалам: один вызов отрисовки на материал.
Дальние деревья заменены картинками с восьми сторон.
Тело и контакт
Четыре модуля просят, один пишет: сборщик позы — единственный, кто двигает кости.
Мозг скал читает форму камня и выбирает одно из действий: ладонь, спина, плечо, уступ, сесть, залезть.
Замер тела измеряет настоящую нарисованную форму, его же использует судья в тестах.
Физика
Физика — единственная, кто двигает пилота; остальные дают ей цель через setGoal.
Рядом с пилотом камень получает точную форму, вдали остаётся упрощённая оболочка.
У скал капсула пилота превращается в эллипс по размерам тела.
Сюжет и интерфейс
Этот контекст пока живёт внутри страницы и не вынесен в модули.
Пять глав и два финала, 24 осколка и 8 записей-эхо.
Прогресс хранится в браузере, без сервера.
Качество
Пресет задаёт всё сразу: сначала подбирается по видеокарте, потом подстраивается по времени кадра.
Луна не движется, поэтому тени от неподвижных предметов считаются один раз и лежат в кэше.
В меню, на паузе и в скрытой вкладке цикл полностью останавливается.
Ассеты
Модели лежат в .js-файлах как текст: так игра грузится с любого статического хостинга.
Загрузчик показывает список модулей и ресурсов, пока всё не готово.
Тяжёлое готовится заранее вне игры: картинки дальних деревьев и запечённый свет.
Четыре критических пути
1. Запуск игры
Игра не стартует, пока не готовы библиотеки, физика и модули.
2. Один кадр
Модули идут по убыванию order: сначала тело (55 … 40), последними мир (−10).
3. Пилот у скалы
Решает мозг скал, двигает физика, кости пишет сборщик.
4. Подстройка качества
Сначала грубый выбор по видеокарте, потом мелкая подстройка по каждому кадру.
Правила, на которых всё держится
Физика единственная двигает пилота. Остальные дают цель.
Сборщик позы единственный пишет кости. Остальные присылают запросы.
Реестр Passport единственный знает о предметах мира. Столкновения строятся из него.
Модуль падает один. Ошибка отключает только его.
Один замер «внутри камня». Игра и проверки меряют одинаково.
Слабые места
Где
Что не так
Страница-монолит
Сюжет, цикл и реестр Passport лежат в одном файле на 4,5 тысячи строк, границ между ними нет.
Порядок модулей
Порядок задан числами в коде; ошибка в числе меняет поведение молча.
Глобальные объекты
Модули обмениваются через window.*: связи не видны в коде.
Поза пилота
Итоговую позу решают несколько модулей; единого владельца ещё нет.