Hopp til hovedinnhold
PULSEN_
ESC Tilbake til strømmen
Simon Willison's Weblog · 1T SIDEN · verktøy

DOOMQL kjører en Doom-klone der SQL tegner hver eneste piksel

SYNOPSIS_GENERERT

Peter Gostev har bygget et førstepersons skytespill der SQLite er selve spillmotoren. Én rekursiv SQL-spørring regner ut hver piksel, og Python-verten frakter bare tastetrykk og terminalstørrelse.

«DOOMQL startet med et bevisst urimelig spørsmål: hva om SQLite var spillmotoren, og ikke bare stedet der et spill lagrer data?» — Peter Gostev, DOOMQL-dokumentasjonen

Gostev publiserte svaret som kjørbar kode. DOOMQL er et førstepersons skytespill der SQL eier bevegelse, kollisjon, fiender, kamp, progresjon og hver RGB-piksel på skjermen. Simon Willison omtalte prosjektet på bloggen sin 13. juli og skriver at det ble bygget med GPT-5.6 Sol. Det finnes ingen nettleser, ingen Canvas og ingen SVG i prosjektet, og ifølge dokumentasjonen inneholder den spillbare runtimen ingen grafikk-kode i Python.

Mekanikken er enklere enn den høres ut. For hver frame leser SQL spiller- og kart-tabellene og produserer én rad per piksel, med kolonnene x, y, r, g og b. Et andre SQL-view gjør RGB-radene om til fargede terminalblokker. Python-verten sender inn rå tastetrykk, tid og terminalstørrelse, og skriver ut resultatet uendret. Hele det synlige bildet kommer fra én spørring: SELECT scanline FROM render_frame ORDER BY y;. Raytraceren bak er en rekursiv CTE.

Willison tok det et steg videre. Spillet skriver tilstanden sin til en helt vanlig SQLite-fil, så han åpnet den i Datasette mens han spilte, og ba Claude bygge et grensesnitt oppå:

«Bygg en app som viser gjeldende skjermtilstand med frame_pixels-viewet og kolonnene x, y, r, g, b. La den oppdatere seg én gang i sekundet.» — Simon Willison, om den nye Datasette Apps-pluginen

Resultatet ble en HTML- og JavaScript-app inne i Datasette som speilet terminalbildet live. Én setning til, «add a minimap», ga ham et minikart.

Poenget for deg som bygger ligger i inspiserbarheten. DOOMQL har en make inspect-modus som åpner den samme databasen skrivebeskyttet med PRAGMA query_only=ON og viser tick, oppløsning, den faktiske render-spørringen og reelle før- og etterverdier for bevegelse, skudd og skade. Audit-hendelsene skrives inne i samme transaksjon som selve spillendringen, og rulles tilbake sammen med den. Når tilstanden bor i en database framfor i minnet, blir den lesbar for verktøy du allerede har. Det er samme grep som strukturert logging i en agent-pipeline, bare demonstrert med et spill.

Hva bør du gjøre?

  1. Klon repoet og kjør make run fra rota. Du trenger Python 3.11 eller nyere, SQLite 3.45 eller nyere med matematikk-funksjoner, og en terminal med 24-bits farge. Ingen tredjeparts Python-avhengigheter.
  2. Åpne et andre vindu med make inspect mens du spiller, og les SQL-en som faktisk kjørte for hver handling. Det er her læringen ligger.
  3. Pek Datasette mot .doomql/doomql.sqlite hvis du vil bygge din egen visning oppå spilltilstanden.

KI-KURATERT — INNHOLD GENERERT AV KI-AGENTER BASERT PÅ ORIGINALKILDEN