Схемы C4 до уровня компонентов и четыре критических пути через sequence: кадр, ночная угроза, шаг сюжета и сохранение.
«Сибирь» — игра на выживание в тайге, вид сверху, прямо в браузере: без движка, без сборки, около пятидесяти скриптов на холсте 2D. Здесь описано, как она устроена: схемы C4 до уровня компонентов и четыре пути, на которых всё держится.
C4: контекст и контейнеры
Уровень 1. Система и её окружение
Своего сервера у игры нет: подойдёт любой статический хостинг. Без шрифтов игра работает, меняется только гарнитура.
Уровень 2. Контейнеры
Цикл живёт в интерфейсе и по очереди зовёт системы, рендер и звук. Все скрипты грузятся по порядку тегами в index.html.
C4 уровня 3: компоненты контекстов
Показаны пять контекстов, где решается игра. Сохранение разобрано ниже как критический путь.
Мир
Мир строится из числа seed: лес, зоны и сугробы пересчитываются, а не хранятся.
Зоны (наледь, гарь, курумник, голец и другие) меняют правила: холод, шаг, опасности.
Отклики вещей описаны таблицей «событие + свойства вещи → реакция», а не парами «кто с чем».
Герой, выживание и угрозы
Тепло падает от мороза и ветра, растёт у огня и печи; директор следит за состоянием героя и решает, когда прийти волкам.
Директор угроз устроен как в Left 4 Dead: напряжение → бюджет → предвестник (вой, следы) → разведчик или стая.
Пурга прогоняет стаю, а при низком здоровье директор берёт паузу.
Посёлок и люди
Новый персонаж или задание добавляются записью в данные, исполнители не меняются.
Люди посёлка работают по циклу «добыть → склад → снова», стройка даёт убывающую отдачу строителей.
Четыре эпохи, восемь видов построек, торговля за рубли с плавающим курсом.
Сюжет
Сюжет лежит данными, а Story только исполняет: «когда выполнится условие — сделать операции».
Семь глав, пять концовок: ветка выбирается тем, придёт ли вертолёт и готов ли посёлок.
Вход в главу сам делает автосохранение.
Картинка, звук и интерфейс
Весь ввод проходит через один автомат, а картинка собирается слоями с одним светом и одним солнцем.
Звук целиком синтезируется в Web Audio, файлов нет; музыка следует за опасностью.
Если кадры дольше 28 мс или реже 30 в секунду два окна подряд, графика упрощается.
Четыре критических пути
1. Один кадр
Во сне update идёт четыре раза за кадр, при открытой панели мир стоит и только «дышит».
2. Ночная угроза
Сначала предупреждение, потом нападение: игрок успевает дойти до огня.
3. Шаг сюжета
Событие срабатывает один раз по сохранённому флагу; глава меняется, когда закрыты все её цели.
4. Сохранение и загрузка
В сохранение попадает только то, что изменилось: лес, зоны и сугробы пересчитываются из seed.
Правила, на которых всё держится
Одно состояние G. Системы читают и пишут в него, сохранение это G плюс seed.
Мир считается из seed. Лес, зоны и сугробы не хранятся.
Сюжет это данные. Главы, события, задания и люди лежат в content/, исполнители про них ничего не знают.
Один порядок шага.update зовёт системы в фиксированном порядке.
Одна сводка Ctx. Реплики, звук и свет берут «что вокруг героя» оттуда.
Слабые места
Где
Что не так
Порядок скриптов
Около 55 тегов в index.html, порядок важен и нигде не проверяется.
Глобальные модули
Модули зовут друг друга по именам, границ между контекстами в коде нет.
Большой G
Одно изменяемое состояние на всё: любая система может сломать чужое поле.
ui.js
В одном файле на тысячу строк HUD, диалоги, карта, цикл кадра и сохранения.