Сразу после окончания конференции я буквально засел за большую миграцию архитектуры Galactic Network Engineer.
Причина простая: локальная версия игры уже выросла настолько, что дальше развивать её «как есть» было опасно. А впереди у меня две большие цели — выпустить игру на сервере, чтобы в неё можно было играть через интернет, и в будущем сделать полноценный мультиплеер и кооперативные кампании.
Поэтому последние дни я почти не добавлял новый контент. Вместо этого полез глубоко внутрь игры и начал приводить в порядок фундамент.
Раньше значительная часть логики исторически жила в одном огромном
Сейчас
Вся игра разделена на отдельные домены. Кампания занимается кампанией. Игрок — игроком. Терминал — терминалом. Сохранения — сохранениями. Отрисовка — отрисовкой. Сетевой движок вообще живёт отдельным слоем.
Сам сетевой runtime тоже разделён: отдельно ядро работы с сетью и CLI, отдельно кабели и топология, отдельно логика сетевых заданий, серверов и босса.
При этом я специально вычищал не только архитектуру, но и старый технический мусор: ненужные fallback-ветки, старые обходные решения, лишние зависимости, мёртвый код, прямые обращения к хранилищу в обход нормального слоя сохранений и разные «временные» костыли, которые когда-то были удобны, но дальше только мешали бы развитию игры.
Отдельно чистил конфиги и границы между системами, чтобы один модуль не мог просто залезть внутрь другого и поменять его состояние напрямую.
В итоге сейчас архитектура игры построена как направленный граф без циклических зависимостей между доменами. Проще говоря: системы знают только о тех системах, которые действительно находятся ниже них по уровню, а не ссылаются друг на друга по кругу.
Это особенно важно для будущего сервера и мультиплеера.
В такой архитектуре можно будет отдельно создавать игровые сессии: один человек проходит кампанию — у него своё состояние. Группа друзей играет кооперативную кампанию — у них общее состояние своей комнаты. Другая группа может одновременно проходить точно такую же кампанию, но уже в своём экземпляре мира, и эти две группы вообще не должны мешать друг другу.
Именно ради этого всю эту большую миграцию я и затеял.
Сейчас в runtime игры 28 отдельных source-файлов и 27 доменов. Самый большой модуль — около 4 тысяч строк вместо прежнего файла почти на 30 тысяч. Циклических зависимостей между доменами больше нет, широкие старые API убраны, прямые обходы хранилища тоже убраны.
На текущей версии проходит 97 автоматических проверок, включая запуск игры в Chromium, переключение русского и английского языка, Rocket Builder и уровни с 1 по 9.
То есть последние дни выглядели примерно так: не «добавил красивую новую кнопку», а «разобрал половину космического корабля, перебрал проводку, выбросил старые переходники и собрал обратно так, чтобы потом к нему можно было нормально пристыковать сервер и мультиплеер» :)
Теперь фундамент для следующего этапа у игры есть.
А значит дальше можно снова заниматься самой игрой.
Причина простая: локальная версия игры уже выросла настолько, что дальше развивать её «как есть» было опасно. А впереди у меня две большие цели — выпустить игру на сервере, чтобы в неё можно было играть через интернет, и в будущем сделать полноценный мультиплеер и кооперативные кампании.
Поэтому последние дни я почти не добавлял новый контент. Вместо этого полез глубоко внутрь игры и начал приводить в порядок фундамент.
Раньше значительная часть логики исторически жила в одном огромном
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.
То есть последние дни выглядели примерно так: не «добавил красивую новую кнопку», а «разобрал половину космического корабля, перебрал проводку, выбросил старые переходники и собрал обратно так, чтобы потом к нему можно было нормально пристыковать сервер и мультиплеер» :)
Теперь фундамент для следующего этапа у игры есть.
А значит дальше можно снова заниматься самой игрой.
👍2🔥2❤1
Вчера я писал пост о том, как бодро занялся архитектурной миграцией Galactic Network Engineer: разделяю огромные куски кода, выношу ответственность по отдельным модулям, удаляю старые костыли и вообще пытаюсь привести всё к состоянию, с которым игру потом не страшно будет вынести в онлайн.
А что я делал сегодня?
Правильно. Искал баги после миграции и исправлял их 😂
Нашлось два довольно интересных.
Первый — чисто сетевой.
На третьем уровне нужно восстановить связь с сервером WASH-SRV-01.
Я настроил на коммутаторе:
Gi0/1 → access VLAN 100
и SVI:
interface Vlan100
ip address 10.7.7.1 255.255.255.252
На сервере:
10.7.7.2/30
И вот что интересно: ping из Network Engine прекрасно проходил. Сам движок правильно понимал, что пакет должен идти через Vlan100. Более того, задача с ping уже считалась выполненной.
Но когда я заходил на сервер и пытался запустить задачу — игра говорила, что связи нет.
Хм.
Оказалось, внутри игры существовали две разные проверки одной и той же связности.
Первая — нормальный packet plane самого Network Engine. Он видел SVI и успешно отправлял пакет.
А вторая, дополнительная проверка игровой задачи, отдельно искала активный L3-интерфейс… но смотрела только физические интерфейсы.
То есть Gi0/1 она видела.
А interface Vlan100 — нет.
Получалась прекрасная ситуация:
Network Engine: «Ping проходит».
Задача: «Ping выполнен».
Сервер: «Сети нет».
🙂
Исправил это архитектурно: теперь для определения реальной сетевой связности источник истины один — packet plane Network Engine. Если движок действительно может провести пакет от A до B, игровая логика не должна пытаться второй раз изобретать собственную сеть.
Заодно проверили остальные уровни на такой же класс ошибок.
Второй баг был гораздо проще.
После большой архитектурной миграции на нескольких уровнях перестал запускаться диалог с NPC. Подходишь к персонажу — а он молчит.
Причина оказалась банальной: часть старой игровой логики после разделения модулей продолжала обращаться к уже удалённому механизму открытия диалогов.
Исправил, добавил проверки, чтобы при ошибке состояние диалога не зависало, и прогнал сценарии с NPC по уровням.
В общем, вчера:
«Ура, мы почистили архитектуру!»
Сегодня:
«Так… а почему шахтёр со мной больше не разговаривает?» 😂
Но, собственно, для этого и нужны такие проверки. Большая миграция кода — это не момент, когда работа закончилась. Это момент, когда надо пройти игру и попробовать сломать вообще всё, до чего можешь дотянуться.
Продолжаем.
А что я делал сегодня?
Правильно. Искал баги после миграции и исправлял их 😂
Нашлось два довольно интересных.
Первый — чисто сетевой.
На третьем уровне нужно восстановить связь с сервером WASH-SRV-01.
Я настроил на коммутаторе:
Gi0/1 → access VLAN 100
и SVI:
interface Vlan100
ip address 10.7.7.1 255.255.255.252
На сервере:
10.7.7.2/30
И вот что интересно: ping из Network Engine прекрасно проходил. Сам движок правильно понимал, что пакет должен идти через Vlan100. Более того, задача с ping уже считалась выполненной.
Но когда я заходил на сервер и пытался запустить задачу — игра говорила, что связи нет.
Хм.
Оказалось, внутри игры существовали две разные проверки одной и той же связности.
Первая — нормальный packet plane самого Network Engine. Он видел SVI и успешно отправлял пакет.
А вторая, дополнительная проверка игровой задачи, отдельно искала активный L3-интерфейс… но смотрела только физические интерфейсы.
То есть Gi0/1 она видела.
А interface Vlan100 — нет.
Получалась прекрасная ситуация:
Network Engine: «Ping проходит».
Задача: «Ping выполнен».
Сервер: «Сети нет».
🙂
Исправил это архитектурно: теперь для определения реальной сетевой связности источник истины один — packet plane Network Engine. Если движок действительно может провести пакет от A до B, игровая логика не должна пытаться второй раз изобретать собственную сеть.
Заодно проверили остальные уровни на такой же класс ошибок.
Второй баг был гораздо проще.
После большой архитектурной миграции на нескольких уровнях перестал запускаться диалог с NPC. Подходишь к персонажу — а он молчит.
Причина оказалась банальной: часть старой игровой логики после разделения модулей продолжала обращаться к уже удалённому механизму открытия диалогов.
Исправил, добавил проверки, чтобы при ошибке состояние диалога не зависало, и прогнал сценарии с NPC по уровням.
В общем, вчера:
«Ура, мы почистили архитектуру!»
Сегодня:
«Так… а почему шахтёр со мной больше не разговаривает?» 😂
Но, собственно, для этого и нужны такие проверки. Большая миграция кода — это не момент, когда работа закончилась. Это момент, когда надо пройти игру и попробовать сломать вообще всё, до чего можешь дотянуться.
Продолжаем.
🔥2❤1👍1
Ну что, Galactic Network Engineer уже в онлайне 🚀
Игра запущена на сервере, но доступ пока не открываю — хочу сначала доделать последние фиксы и убедиться, что всё действительно готово. За последнее время я сильно переделал архитектуру, добавил серверные сессии, админку, централизованные логи и переключение между русским и английским.
А дальше мне понадобятся первые игроки. Хочу найти людей, которые пройдут игру, попробуют её сломать и помогут найти баги, которые я сам уже не вижу.
Для первых тестеров игра будет полностью бесплатной. Кто готов — пишите мне в личку.
Игра запущена на сервере, но доступ пока не открываю — хочу сначала доделать последние фиксы и убедиться, что всё действительно готово. За последнее время я сильно переделал архитектуру, добавил серверные сессии, админку, централизованные логи и переключение между русским и английским.
А дальше мне понадобятся первые игроки. Хочу найти людей, которые пройдут игру, попробуют её сломать и помогут найти баги, которые я сам уже не вижу.
Для первых тестеров игра будет полностью бесплатной. Кто готов — пишите мне в личку.
❤4🔥3🍾1
Продолжаю готовить Galactic Network Engineer к первому релизу.
Несколько сетевых инженеров уже написали, что готовы попробовать игру одними из первых — парни, спасибо, это реально очень помогает.
Пока я доделываю последние косметические вещи и параллельно внедряю сервисы, без которых нормальный онлайн-релиз уже не представить:
— Поднял почтовый сервис для регистрации и сброса пароля.
— Добавил систему промокодов, которые смогу генерировать из админки и открывать ими разные возможности игры для игроков.
— Сделал централизованное логирование ошибок игроков и отдельную кнопку «Я нашёл баг», чтобы сразу отправлять описание проблемы вместе с логами.
— Добавил возможность менять разрешение экрана.
— Добавил переназначение клавиш управления.
— Добавил автоматическое обновление игры у игроков, чтобы новые версии и фиксы можно было доставлять без ручной переустановки.
— Добавил совместимость сохранений между версиями, чтобы обновление игры не означало потерю прогресса.
В общем, сейчас всё это уже меньше похоже на «я просто сделал игру» и всё больше — на настоящий продукт, который надо нормально подготовить для показа людям. Осталось совсем немного.
Несколько сетевых инженеров уже написали, что готовы попробовать игру одними из первых — парни, спасибо, это реально очень помогает.
Пока я доделываю последние косметические вещи и параллельно внедряю сервисы, без которых нормальный онлайн-релиз уже не представить:
— Поднял почтовый сервис для регистрации и сброса пароля.
— Добавил систему промокодов, которые смогу генерировать из админки и открывать ими разные возможности игры для игроков.
— Сделал централизованное логирование ошибок игроков и отдельную кнопку «Я нашёл баг», чтобы сразу отправлять описание проблемы вместе с логами.
— Добавил возможность менять разрешение экрана.
— Добавил переназначение клавиш управления.
— Добавил автоматическое обновление игры у игроков, чтобы новые версии и фиксы можно было доставлять без ручной переустановки.
— Добавил совместимость сохранений между версиями, чтобы обновление игры не означало потерю прогресса.
В общем, сейчас всё это уже меньше похоже на «я просто сделал игру» и всё больше — на настоящий продукт, который надо нормально подготовить для показа людям. Осталось совсем немного.
❤2👍2
Обещанный релиз Galactic Network Engineer для первых тестеров немного задерживается.
Перед выпуском я решил нормально проверить игру с точки зрения ИБ — и, скажем так, увидел достаточно вещей, которые мне не понравились. Поэтому сейчас делаю ещё одну большую миграцию: переношу максимум игровой логики на сервер и максимально очищаю клиентский код, чтобы лучше защитить интеллектуальную собственность проекта.
Звучит красиво, но на практике всё веселее 😄 Уже два раза пришлось откатывать новые версии, потому что после слишком агрессивных изменений ChatGPT умудрялся довольно серьёзно ломать рабочую игру.
Но ничего. Я немного поменял сам подход: теперь миграция идёт маленькими контролируемыми шагами, с постоянной проверкой, что gameplay после каждого изменения остаётся таким же.
Лучше задержать релиз и сделать всё нормально, чем выдать вам версию, которую потом придётся чинить прямо во время теста.
Так что да — немного позже, чем планировал. Но уже скоро.
Перед выпуском я решил нормально проверить игру с точки зрения ИБ — и, скажем так, увидел достаточно вещей, которые мне не понравились. Поэтому сейчас делаю ещё одну большую миграцию: переношу максимум игровой логики на сервер и максимально очищаю клиентский код, чтобы лучше защитить интеллектуальную собственность проекта.
Звучит красиво, но на практике всё веселее 😄 Уже два раза пришлось откатывать новые версии, потому что после слишком агрессивных изменений ChatGPT умудрялся довольно серьёзно ломать рабочую игру.
Но ничего. Я немного поменял сам подход: теперь миграция идёт маленькими контролируемыми шагами, с постоянной проверкой, что gameplay после каждого изменения остаётся таким же.
Лучше задержать релиз и сделать всё нормально, чем выдать вам версию, которую потом придётся чинить прямо во время теста.
Так что да — немного позже, чем планировал. Но уже скоро.
❤1😐1😭1🤝1