Road Fighter

Road Fighter — видеоигра в жанре аркадных автогонок, разработанная компанией Konami и выпущенная в виде игрового автомата 7 декабря 1984 года. Позднее были выпущены версии для компьютеров стандарта MSX1 (1985) и для игровой консоли Nintendo Entertainment System (1985 в Японии и 1991 в Европе).

В 2003 году Retro Remakes организовали состязание “remake competition”, идея которого состояла в создании игры с нуля за короткое время. Команда Brain Games решила принять участие в состязании с ремейком игры Road Fighter для MSX.

Что сделал я

Исходный код игры был доступен на сайте Brain Games. Этим я и воспользовался. Я уведомил автора клона о моей работе. Забавно, но он был рад и сказал, что ждет завершения работы над web-версией.

Первым делом я сделал небольшой рефакторинг кода, что бы игра собиралась современным компилятором с “современной” версией SDL-1.2. Далее я сделал рефакторинг кода – достаточно большой кусок работы. Хотя сложного в этом ничего нет, но процесс занимает много времени. Нужно весь код разделить на логические части и привести их к читабельному виду (тут мне помогает мой любимый VIM и clang-format). После чего мне пришлось внести исправления в код библиотеки sge, которая требовалась игре. Далее я сделал порт игры для Linux и macOS, а через пол года, собравшись с силами, закончил порт игры для Web.

Основные проблемы, с которыми пришлось столкнуться

С версией для Web пришлось повозиться. Вначале игра вообще не хотела работать – это из-за того, что main loop должен быть “несколько” иным для Emscripten (да и вообще для любой правильно сделанной архитектуры).

Следующей проблемой была очистка экрана (точнее его заполнение черным цветом) – очищать экран нужно не просто “нулем”, а “нулем” у которого альфа установлена в 0xff.

Потом игра зависала на загрузке уровня (позднее оказалось, что игра не зависала, а просто ОЧЕНЬ долго загружалась). Пришлось сделать множество оптимизаций. В основном все они связаны с прямым доступом к SDL surface. Эту проблему я решил достаточно просто – избавился от Lock/Unlock внутри циклов.
В игре бывает ситуация, когда машину после столкновения начинает крутить и нужно рисовать полосы от “торможения” шин на асфальте. Тут была беда – очень долгая отрисовка линий. Которые, ко всему прочему, никогда не очищались, даже если уже были вне границ экрана. Простой вынос блокировки за пределы цикла и очистка списка линий решило проблему.

Заодно немного переделал работу с файловой системой, доработал инициализацию видео и аудио системы, загрузку музыки и звуков. Изменений получилось очень много, большинство я уже и не вспомню. Желающие могут взять оригинальную версию игры (самый первый коммит) и сравнить с текущим master-бранчем.

Возможно я соберусь с силами и добавлю поддержку сохранения состояния игры для web-версии. Сделать это совсем несложно – синхронизация “локальной” FS до начала чтения с нее. Для этого отлично подходит IDBFS, но сейчас мне лень этим заниматься.

Скачать и играть