Реализована монгопользовательская DOOM-подобная игра, написанная на SQL

Представлен проект DOOMQL, развивающий вариант игры DOOM, написанный на SQL и способный выполняться внутри СУБД CedarDB, частично совместимой с PostgreSQL. Игра поддерживает многопользовательский режим и выполняет отрисовку при помощи ASCII-графики. Код проекта распространяется под лицензий MIT.

Все компоненты игры, включая код рендеринга, синхронизации состояния игроков при многопользовательской игре и игрового цикла, написаны на SQL. Игровая логика реализована при помощи таблиц, представлений (VIEW) и хранимых процедур, что отличает
DOOMQL от похожих проектов DuckDB-DOOM (использует хранимые процедуры на WebAssembly) и pg_doom (реализован как расширение к PostgreSQL на языке Си).

При разработке DOOMQL использована концепция “всё является данными”, при которой для хранения состояния карт, игроков, перемещающихся по уровню объектов, событий ввода, настроек и спрайтов применяются таблицы. Игровой цикл, отвечающий за обработку и обновление игрового состояния, реализован при помощи 20-строчного shell-скрипта, который 30 раз в секунду запускает SQL-файл gameloop.sql, содержащем логику для расчёта траектории выстрелов, анализа столкновений, обработки ввода и возрождения игроков.

Написанный на SQL 3D-рендер поддерживает трассировку лучей, проецирования спрайтов на 3D-сцену, обработку перекрытия объектов и HUD-интерфейс (Heads-Up Display). Вся логика рендеринга реализована при помощи представлений. Одновременно к игре могут подключаться несколько игроков, синхронизация состояния которых осуществляется при помощи таблиц и представлений.

На стороне пользователя запускается клиент, включающий около 150 строк кода на языке Python. Работа клиента сводится к передаче информации о нажатиях клавиш и выводу кадров в терминал. Вывод организован путём периодически выполняемых SELECT-запросов к представлению “screen” в СУБД, динамически формирующему изображение построчно (каждая выводимая в ответ на запрос SELECT строка соответствует строке на экране). Информация о нажатии клавиш и добавление новых игроков осуществляется через INSERT-запросы.

Release. Ссылка here.