Osegi
Софт·2 мин чтения

Doom запустили в сообщении Telegram: кадр уместился в 1024 байта

Разработчик запустил Doom в одном сообщении Telegram. Движок работает на Mac, а каждый кадр должен поместиться в ответ бота размером 1024 байта.

A tiny low-resolution Doom hangar frame with a door and muzzle flash shown inside a Telegram chat message with six control buttons.
Фото: Хабр

Doom теперь можно пройти прямо в одном сообщении Telegram. Игровой движок остался на Mac автора, а в чат уходят только изображение и шесть кнопок. После нажатия «Вправо» в том же сообщении появляется следующий кадр. На весь ответ у бота есть всего 1024 байта.

Как устроено управление

Игрок может шагнуть вперёд или назад, повернуться, выстрелить или открыть дверь. При повороте вправо виджет вызывает TelegramWidget.request("right"). Бот находит игровую сессию и передаёт в ViZDoom кнопку поворота. Движок продвигает симуляцию на пять тиков: игрок поворачивается, противники двигаются, летят снаряды. Затем мир снова замирает.

Бот берёт кадр из экранного буфера и возвращает его через answerWidgetQuery. Виджет подменяет источник картинки в том же элементе img, поэтому и после десятка ходов в переписке остаётся одно игровое сообщение. Пока ответ в пути, новые нажатия игнорируются, а между запросами проходит не меньше 1010 мс. Сетевую задержку при повороте видно сразу, но монстр за время ожидания не приближается.

Бюджет в 1024 байта

ViZDoom отдаёт RGB-кадр 320 × 200, то есть 192 000 байт до сжатия. На результат запроса отведено 1024 байта, и в них должна поместиться строка Base64: каждые три байта изображения превращаются в четыре символа. Поэтому на сам WebP остаётся максимум 768 байт.

Автор держит качество WebP постоянным и подбирает разрешение для каждого кадра. Сначала пробуется ширина 120 пикселей, затем 96, 80, 64, 48 и 32, высота меняется пропорционально. Пустая стена и зал с противником могут прийти в разном разрешении. Длину проверяют после кодирования, на той строке, которую получит Telegram. На крошечной картинке трудно разглядеть дальнего врага, зато можно открыть дверь и увидеть, кто за ней. Столкновения, двери и попадания считает движок.

Путь от стартового зала до двери, поворот и выстрел автор проверил в Telegram для macOS. Весь уровень прошёл отдельно, в локальном ViZDoom, с теми же шестью кнопками и пятью тиками на ход: до выходного выключателя потребовалось 537 ходов, осталось 48% здоровья, счётчик показал шесть убитых противников.

Для запуска нужны Python 3.12, токен собственного бота и оригинальный DOOM1.WAD из Doom Shareware 1.9, в репозиторий ресурсы игры не входят. Бот держит до шести сессий и освобождает их после десяти минут бездействия. Проект входит в каталог Awesome Telegram Widgets, где рядом с Doom есть пошаговый Pacman и калькулятор.

Приложения, на которые стоит взглянуть

SUMO: числовая головоломка

Выбирайте нужные клетки, складывайте, достигайте цели. Легко понять, сложно освоить. Бесплатно, для любого возраста.

Теги:doomtelegramvizdoomtelegram widgetswebpbots

Ещё за этот день

Показать все →

Ещё в рубрике: Софт

Показать все →