Причина простая: локальная версия игры уже выросла настолько, что дальше развивать её «как есть» было опасно. А впереди у меня две большие цели — выпустить игру на сервере, чтобы в неё можно было играть через интернет, и в будущем сделать полноценный мультиплеер и кооперативные кампании.
Поэтому последние дни я почти не добавлял новый контент. Вместо этого полез глубоко внутрь игры и начал приводить в порядок фундамент.
Раньше значительная часть логики исторически жила в одном огромном
game.js — почти 30 тысяч строк кода. Пока игра была маленькой, это ещё работало. Но когда появились 9 уровней, полноценная эмуляция сети, BGP, CLI, терминалы, сохранения, Rocket Builder, планшет, NPC и куча другой логики — такой файл начал превращаться в проблему.Сейчас
game.js — это всего 14 строк bootstrap-кода.Вся игра разделена на отдельные домены. Кампания занимается кампанией. Игрок — игроком. Терминал — терминалом. Сохранения — сохранениями. Отрисовка — отрисовкой. Сетевой движок вообще живёт отдельным слоем.
Сам сетевой runtime тоже разделён: отдельно ядро работы с сетью и CLI, отдельно кабели и топология, отдельно логика сетевых заданий, серверов и босса.
При этом я специально вычищал не только архитектуру, но и старый технический мусор: ненужные fallback-ветки, старые обходные решения, лишние зависимости, мёртвый код, прямые обращения к хранилищу в обход нормального слоя сохранений и разные «временные» костыли, которые когда-то были удобны, но дальше только мешали бы развитию игры.
Отдельно чистил конфиги и границы между системами, чтобы один модуль не мог просто залезть внутрь другого и поменять его состояние напрямую.
В итоге сейчас архитектура игры построена как направленный граф без циклических зависимостей между доменами. Проще говоря: системы знают только о тех системах, которые действительно находятся ниже них по уровню, а не ссылаются друг на друга по кругу.
Это особенно важно для будущего сервера и мультиплеера.
В такой архитектуре можно будет отдельно создавать игровые сессии: один человек проходит кампанию — у него своё состояние. Группа друзей играет кооперативную кампанию — у них общее состояние своей комнаты. Другая группа может одновременно проходить точно такую же кампанию, но уже в своём экземпляре мира, и эти две группы вообще не должны мешать друг другу.
Именно ради этого всю эту большую миграцию я и затеял.
Сейчас в runtime игры 28 отдельных source-файлов и 27 доменов. Самый большой модуль — около 4 тысяч строк вместо прежнего файла почти на 30 тысяч. Циклических зависимостей между доменами больше нет, широкие старые API убраны, прямые обходы хранилища тоже убраны.
На текущей версии проходит 97 автоматических проверок, включая запуск игры в Chromium, переключение русского и английского языка, Rocket Builder и уровни с 1 по 9.
То есть последние дни выглядели примерно так: не «добавил красивую новую кнопку», а «разобрал половину космического корабля, перебрал проводку, выбросил старые переходники и собрал обратно так, чтобы потом к нему можно было нормально пристыковать сервер и мультиплеер» :)
Теперь фундамент для следующего этапа у игры есть.
А значит дальше можно снова заниматься самой игрой.
