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

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

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

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

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

CFD0C5CECEC5D4_1757476547.png

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



Источник: http://www.opennet.ru/opennews/art.shtml? num=63853

©  OpenNet