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

Геймплей 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, добавил звук и выпустил как полноценный релиз — скачать можно здесь.