Osegi
Oprogramowanie·2 min czytania

Doom w wiadomości Telegrama: klatka mieści się w 1024 bajtach

Deweloper uruchomił Doom w jednej wiadomości Telegrama. Silnik działa na Macu, a każda klatka musi zmieścić się w odpowiedzi bota o rozmiarze 1024 bajtów.

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

Doom zagościł w pojedynczej wiadomości na Telegramie. Silnik gry pozostał na komputerze Mac autora, a do czatu trafiają tylko obraz i sześć przycisków. Po naciśnięciu „W prawo” w tej samej wiadomości pojawia się kolejna klatka. Na całą odpowiedź bot ma zaledwie 1024 bajty.

Jak działa sterowanie

Gracz może zrobić krok do przodu lub do tyłu, obrócić się, strzelić albo otworzyć drzwi. Po skręcie w prawo widżet wywołuje TelegramWidget.request("right"). Bot odnajduje sesję gry i przekazuje do ViZDoom przycisk obrotu. Silnik przesuwa symulację o pięć ticków: gracz się obraca, przeciwnicy ruszają się, lecą pociski. Potem świat znów zamiera.

Bot pobiera klatkę z bufora ekranu i zwraca ją przez answerWidgetQuery. Widżet podmienia źródło obrazu w tym samym elemencie img, dlatego nawet po kilkunastu ruchach w rozmowie jest wciąż jedna wiadomość z grą. Gdy odpowiedź jest w drodze, nowe naciśnięcia są ignorowane, a między zapytaniami mija co najmniej 1010 ms. Opóźnienie sieci jest widoczne, ale w tym czasie potwór nie podchodzi bliżej.

1024 bajty na klatkę

ViZDoom zwraca klatkę RGB 320 × 200, czyli 192 000 bajtów przed kompresją. Wynik zapytania może mieć 1024 bajty i musi być ciągiem Base64, w którym trzy bajty obrazu zamieniają się w cztery znaki. Na sam plik WebP zostaje więc maksymalnie 768 bajtów.

Autor utrzymuje stałą jakość WebP i dobiera rozdzielczość osobno dla każdej klatki: próbuje szerokości 120 pikseli, potem 96, 80, 64, 48 i 32, zachowując proporcje. Pusta ściana i sala z przeciwnikiem mogą więc dotrzeć w różnych rozmiarach. Długość sprawdzana jest po zakodowaniu, na dokładnie tym ciągu, który otrzyma Telegram. Na małym obrazie trudno dostrzec odległego wroga, ale da się otworzyć drzwi i zobaczyć, co jest za nimi. Kolizje, drzwi i trafienia liczy silnik.

Autor sprawdził w Telegramie dla macOS drogę od sali startowej do drzwi, obrót i strzał. Cały poziom przeszedł osobno w lokalnym ViZDoom, z tymi samymi sześcioma przyciskami i pięcioma tickami na ruch. Do wyłącznika kończącego poziom potrzebował 537 ruchów, zostało mu 48% zdrowia, a licznik pokazał sześciu zabitych przeciwników.

Do uruchomienia potrzebne są Python 3.12, token własnego bota i oryginalny plik DOOM1.WAD z Doom Shareware 1.9, którego nie ma w repozytorium. Jeden bot obsługuje do sześciu sesji i zwalnia je po dziesięciu minutach bezczynności. Projekt jest częścią katalogu Awesome Telegram Widgets, w którym oprócz Dooma jest m.in. turowy Pacman i kalkulator.

Aplikacje warte uwagi

SUMO: łamigłówka liczbowa

Wybierz właściwe pola, dodaj je i trafiaj w cel. Łatwa do nauczenia, trudna do opanowania. Za darmo, dla każdego wieku.

Tagi:doomtelegramvizdoomtelegram widgetswebpbots

Więcej z tego dnia

Zobacz wszystkie →

Więcej w kategorii: Oprogramowanie

Zobacz wszystkie →