← Все истории
2001

Doom RF: подарок на день рождения за две недели — и за год

27 февраля 2001 года я начал делать игру в подарок однокласснику на день рождения — двое друзей попросили сделать что-нибудь, что его рассмешит. Через две недели в Doom RF уже можно было играть. С тех пор я верю: если проект начать в конце февраля, он будет успешным.

За основу я взял Doom 2D и взял ресурсы из его WAD-файла. Видеодвижок — 320×200, 256 цветов. Спрайты предобрабатывались: каждый делился на полоски, и каждая полоска быстрым копированием памяти записывалась в видеопамять. Этот трюк я изобрёл ещё в Space War 2.

Геймплей Doom RF

Геймплей Doom RF, кадр из моего видео на YouTube.

Дальше я почти год улучшал игру. Самое заметное улучшение — переход с Borland Pascal на Free Pascal: он генерировал гораздо более эффективный код, игра стала работать в несколько раз быстрее, а заодно исчез неприятный лимит в 64 КБ на размер юнита.

Ещё Free Pascal умел рисовать в разрешении 640×480 в 256 цветах — но с подвохом. PutPixel работал медленно, а прямой доступ к видеопамяти позволял заполнить только верхние 64 КБ экрана, примерно пятую часть. Я придумал комбинированное решение: один PutPixel, чтобы драйвер переключил банк памяти, а дальше весь буфер этого банка записывается в видеопамять обычным копированием.

Ни в какой документации этого не было — я выяснил опытным путём: если поставить один пиксель в нужное место, драйвер переключается на следующий банк, и дальше весь 64-килобайтный блок заливается обычным копированием памяти. Графика получилась супербыстрой.

Вторая проблема — клавиатура. Игре нужно знать, какие клавиши зажаты прямо сейчас, а прямой ввод с клавиатуры на Free Pascal не работал вообще. Поэтому я написал на Turbo Pascal крошечную программу-резидент agent.exe — строк на тридцать. Она перехватывала прерывание клавиатуры, читала сырые скан-коды из порта клавиатуры и держала в памяти таблицу из 256 флагов «нажата ли клавиша», после чего оставалась резидентной. При запуске она записывала адрес этой таблицы (сегмент и смещение) в маленький файл agent.mem. Игра на Free Pascal один раз читала адрес из файла и дальше смотрела прямо в память агента, какие клавиши нажаты. Две программы, два компилятора и одна общая таблица в памяти.

Что было в игре:

  • мультиплеер на 4 игрока за одним компьютером плюс до 8 ботов;
  • боты, которые ходят по вейпоинтам;
  • телепорты;
  • заставки между уровнями;
  • редактор уровней.

В 2026 году я портировал игру на 64 бита и SDL2, добавил звук и выпустил как полноценный релиз — скачать можно здесь.