Как я портировал ретрошутер Redneck Rampage в браузер

от автора

Всем привет! Я решил наконец то сам сделать пост на Хабре. Обычно о всех моих веб проектах и команды DosZone Team пишет здесь многоуважаемый @denis-19, за что ему огромное спасибо! Ведь нам просто лень или не хватает на это времени. И так! После шутера Blood мне было интересно попробовать также портировать Redneck Rampage как раз на основе того, что я уже сделал. Было ошибочно так думать, потому что RR в отличие от NBlood оказался совершенно на другом движке — RedNukem, и пришлось начинать всё с нуля. Да и сложность повысилась и всё это заняло в два раза больше времени, чуть больше недели.

Rednukem — это ветка декомпилированных исходников NB lood / EDuke32 для таких игр на движке Build как Redneck Rampage, Duke Nukem 3D, NAM (Napalm), WWII GI и ещё парочке о которых я расскажу чуть позже.

Чтобы это всё заработало получается вот такая связка:
Rednukem (EDuke32) → WebAssembly + WebGL palette blit + Emscripten FS/Asyncify, с доработками цикла, ввода, загрузки уровней и IndexedDB для сохранений. Для упрощения задачи по тестированию и сборке не стесняюсь использовать ИИ, он намного всё ускоряет и анализирует различные падения, а также помогает собрать с нуля логику загрузки ресурсов игры (от стартового меню до загрузки эпизодов и уровней). Я в определенный момент очень серьезно застрял как раз на реализации именно правильной последовательности загрузки меню и почти уже бросил всё это дело, но нейронка помогла найти ошибку.

Определённая проблема возникла и со скоростью игры. И обычно разработчики в такие моменты жалуются, что всё тормозит или идет медленно, но здесь получилось ровно наоборот. Игра чертовски быстро работала и что то нужно было с этим делать.
Игровой цикл и время в игре привязаны к тикам. На оригинальной десктопной версии под dos тики привязаны к классической схеме движка Build (120 Hz timer, 30 game tics/s). В браузере же гдеtimerGetTicks на Emscripten использует emscripten_get_now() который мне показался логичным решением проблемы, я начал получать стабильное падение игры на загрузке уровня.

Помог специальный патч позволяющий задавать коэффициент скорости __nbSpeed , который начал регулировать скорость через html
var params = new URLSearchParams(location.search); var initialSpeed = parseFloat(params.get(‘speed’)); // Slightly below 1.0: gameplay uses emscripten_get_now() → patched performance.now. if (!isFinite(initialSpeed) || initialSpeed <= 0) initialSpeed = 0.93; window.__nbSpeed = initialSpeed;

Где initialSpeed = 0.93 как раз скорость игры с которой пришлось поиграться на глаз, так как я не помнил с какой скоростью должна работать оригинальная игра, а по всяким записям гемплея в сети непонятно. Именно html упростил задачу по тестированию и отладке скорости, так как ничего не пере собирая я могу в адрес просто задать параметр ?speed=0.9 и тут же увидеть результат.

Также была небольшая проблема со звуком — он неприятно трещал. С ней я сталкивался ещё в порте Nblood и решилась она просто увеличением буфера сэмплов для Emscripten с 512 до 2048.

И я получил браузерный порт из особенностей которого:

  • нативный браузерный порт без использования какой либо эмуляции;

  • весит всего 120 МБ;

  • улучшенный рендер, высокое разрешение и широкоформатный режим;

  • 60 FPS;

  • современное управление;

  • работают сохранения.

С мобильным управлением не заморачивался, уж извините, может быть сделаю его позже, но пока это исключительно ПК опыт.

Также благодаря проделанной работе над движком RedNukem в браузере я получил возможность быстро скомпилировать рабочие версии других игр которые он поддерживает — NAM/NAPALM и World War II G (Их я выложу немного позже). И на мое удивление мне удалось также быстро запустить две игры дилогии Witchaven, которые движок RedNukem вообще не поддерживает! Теперь у меня чисто спортивный интерес посмотреть таким образом все старые игры на движке build. Создать шоу кейс всех игр на Build в веб пространстве. Сейчас думаю скомпилировать Redneck Rampage Rides Again, ничего сложного так как логика уже готово и остается лишь поменять и задать чтение архивов GRP которые содержат ресурсы игр на Build.

А в браузерный порт Redneck Rampage играем здесь.

Заранее прошу простить, так как я совсем не умею писать технические статьи, но если вам понравилось, то буду заходить со своими браузерными портами сюда почаще.

Всем отличного времяпровождения!

ссылка на оригинал статьи https://habr.com/ru/articles/1042108/