
Codex maakte met GPT-6 Astra een speelbare kloon van Dune 2000 in HTML, CSS en JavaScript, in 46 beurten of 11 u 16 min werktijd van de agent. De game heeft gegenereerde sprites, 34 gesproken meldingen in het Frans en 122 tests, en er waren 54 berichten en 12 screenshots nodig om de fouten van de agent te corrigeren. De sessie komt neer op ongeveer 196 $ tegen API-tarief, hier gedekt door een ChatGPT-abonnement.
Wie op Google “game maken met AI” intypt, krijgt een gegenereerd antwoord dat voorstelt om ChatGPT of Claude een minigame in HTML te laten schrijven. Ik wilde zien wat een zwaarder project oplevert, een Dune 2000-kloon die ik drie dagen lang aan een code-agent heb toevertrouwd.
Dune 2000 is het realtime-strategiespel dat Westwood Studios ontwikkelde en in 1998 uitbracht, een remake van Dune II. De agent is de desktopapp van Codex, met het model GPT-6 Astra op redeneerinspanning xhigh. De cijfers hieronder komen uit het sessielog, een JSONL-bestand van 1,3 GB, en uit de tests van het project, die op 14 september 2026 opnieuw zijn gedraaid.
Het uiteindelijke prototype start je hieronder, in je browser. De 51,6 MB wordt pas geladen als je op “Uitproberen” klikt.
Clone de Dune 2000 : le prototype de Codex et GPT-6 Astra
Le prototype tel que Codex l'a laissé le 9 septembre 2026 : une escarmouche Atréides contre Harkonnen, à la souris et au clavier. Rien ne se charge avant votre clic.
Protocol
Construit avec l'application Codex et le modèle gpt-6-astra en effort xhigh, du 6 au 9 septembre 2026 : 46 tours, 54 messages, 11 h 16 min de travail de l'agent. Compilé par Vite sans modifier le code du jeu, chemins des ressources rendus relatifs pour l'hébergement.

Het project draait in een geïsoleerde sandbox (iframe sandbox en CSP): geen toegang tot de site, cookies of je sessie. Er wordt niets geladen voordat je klikt.
De startprompt
Het eerste bericht telde 66 woorden. Hier is het, vertaald uit het Frans, met alleen de tikfouten verbeterd.
Ik wil dat je een kloon van Dune 2000 maakt in HTML, CSS en JavaScript en daarbij het project OpenRA als hulpmiddel gebruikt. Je bent vrij om de sprites te genereren die je wilt en nodig hebt, inclusief de animaties die daarbij horen. Ik wil een speelbaar prototype van een 1v1-partij, Atreides tegen Harkonnen. Het project OpenRA staat in de map /Projets/OpenRA-bleed.
OpenRA is een opensource-engine voor realtime-strategiespellen, geschreven in C#, die Dune 2000 en de eerste Command & Conquer-games draait. Astra heeft die code niet geporteerd. Hij haalde er de regels van de mod d2k uit, kosten, economie en ketens van bouwvoorwaarden. Daarna schreef hij een JavaScript-simulatie die los staat van de rendering, in Node te testen is en met Phaser 3.90 wordt weergegeven.
Ik gaf geen enkele instructie over de organisatie van het werk. Astra las uit zichzelf de skills van de plugin Game Studio die OpenAI publiceerde (web-game-foundations, phaser-2d-game, sprite-pipeline, game-ui-frontend, game-playtest) en de skill imagegen, die in Codex de afbeeldingen genereert. Dat zijn SKILL.md-bestanden die de agent laadt voordat hij aan de slag gaat, volgens het principe dat onze gids over Agent Skills uitlegt.
De sessie draaide zonder sandbox en zonder goedkeuringsverzoeken (danger-full-access, goedkeuringen op never). Astra kon Chrome starten, npm-pakketten installeren en overal op de schijf schrijven, zonder ook maar één vangrail uit ons artikel over wat de sandbox van Codex blokkeert.
Eenendertig minuten tot het eerste potje
De eerste beurt duurde 31 min 30 s, met 25 tool-aanroepen. Astra genereerde de sprites van de gebouwen, de harvester, de tanks en de infanterie. Vervolgens programmeerde hij het oogsten van spice, de energie, de productiewachtrijen, de gevechten en een Harkonnen-AI die in golven aanvalt. Fog of war, de minimap, selecteren met een sleepkader en attack-move op de A-toets zaten er vanaf deze beurt al in.
Astra sloot af met elf simulatietests, proeven in Chrome aangestuurd door Playwright en een geautomatiseerd potje dat wint op moeilijkheidsgraad Découverte (Ontdekking). De beurt kostte omgerekend 5,96 $ tegen API-tarief.
Het potje draaide, maar leek nog niet op Dune 2000. Mijn tweede bericht somde op wat ontbrak: animaties, tankkanonnen die kunnen draaien, meer bodemtexturen, eigen eenheden voor de Harkonnen en sneller bouwen. In 32 minuten scheidde Astra chassis en geschutskoepels om 360° te kunnen richten en tekende hij een zwart-rood Harkonnen-leger met quad en Devastator met twee kanonnen. Hij liet ook elk gebouw in 4 tot 6 seconden verrijzen, met fundering, steigers en kraan. Het project telde toen 17 tests.
Zesenveertig beurten in drie dagen
Een beurt begint met mijn bericht en eindigt met het antwoord van Astra. Daartussen werkt de agent zelfstandig commando’s, beeldgeneraties, browserscreenshots en tests af. Ik stuurde 54 berichten, voegde 12 screenshots toe, vaak rechtstreeks geannoteerd op de pagina van de game in de browser van Codex, en onderbrak 4 beurten.
| Dag | Beurten | Werktijd van de agent | Belangrijkste verzoeken | Tests aan het eind van de dag | Kosten tegen API-tarief |
|---|---|---|---|---|---|
| 6 september | 20 | 5 u 01 | animaties, 157 terreintegels, acht richtingen voor de infanterie, zandwormen, cursors, eerste geluiden van ElevenLabs | 56 | 83,86 $ |
| 8 september | 23 | 5 u 51 | interface van de originele game, Franse stemmen, Carryall, zes gebouwen en hun eenheden, texturen, decor, betonplaten | 119 | 100,53 $ |
| 9 september | 3 | 24 min | betonplaten van één vakje, geplaatst door te slepen | 122 | 11,62 $ |
Astra voegde bij elke functie tests toe zonder dat ik er ook maar één had gevraagd. De teller ging van 11 naar 17, 24, 29, 33, 41, 44, 51, 56, 67, 69, 75, 85, 90, 106, 111, 119 en ten slotte 122 op 9 september. Bij een nieuwe run op 14 september slagen de 122 Node-tests in 2,1 seconden. Het project bevat ook 24 browserscenario’s, één per grote functie, en 16 scripts die de afbeeldingen en de geluiden voorbereiden.
Waar Astra de mist in ging
Een correctie die de verplaatsing kapotmaakt
In beurt 12 meldde ik tanks waarvan de sprites elkaar overlapten. Astra mat voertuigen die elkaar tot op 30 pixels naderden, terwijl hun chassis er meer dan 60 meet, en gaf elk voertuig een hitbox op maat. Een aanval van twaalf Harkonnen-voertuigen, ingezoomd op 165%, bevestigde de correctie, en de 51 tests slaagden.
Vijf beurten later hielden de eenheden veel te veel afstand en weigerden sommige om tussen twee gebouwen door te gaan die ruim genoeg uit elkaar stonden. Astra vond twee oorzaken, waaronder zijn eigen correctie. De hitboxen besloegen de hele diagonaal van de sprites, en het navigatieraster sloot doorgangen af. Het herstel kostte 24 min 54 s en 32 tool-aanroepen, met een raster van 16 pixels, een footprint per voertuig en eenheden die opzij gaan om anderen door te laten. De test uit beurt 12 mat de overlap van de chassis en niets anders, en kon deze regressie dus niet zien.
Wat er verloren gaat bij een onderbreking
Op 8 september vroeg ik in één bericht om verschillende harvesters voor elk Huis, een Carryall die ze terugbrengt naar de raffinaderij, raffinaderijen die maar één harvester tegelijk lossen, en zes gebouwen uit de originele game met hun eenheden. Na zes minuten onderbrak ik die beurt om een screenshot van de originele harvester te sturen. Astra tekende de harvester opnieuw in acht richtingen, en verder niets.
In het volgende bericht moest ik schrijven “Dit heb je niet gedaan”, gevolgd door de vergeten Carryall en de loskades. Het antwoord van Astra past in één zin, “Je hebt gelijk, ik heb de sprites afgemaakt zonder de gevraagde logistiek toe te voegen”. Diezelfde dag ging op dezelfde manier een annotatie verloren bij een onderbroken beurt. Die ging over kleine bergen die als stenen in het zand waren hergebruikt, en ik heb haar drie beurten later opnieuw ingestuurd. De logistiek zelf vroeg 35 minuten en 40 tool-aanroepen, en het project ging naar 85 tests.
Afbeeldingen die over moesten
Meerdere reeksen afbeeldingen moesten opnieuw worden gemaakt. In beurt 36 leken de iconen van de zes nieuwe gebouwen allemaal op elkaar en misten ze de stijl van de windtrap die twee dagen eerder was getekend. Ze één voor één opnieuw maken, tegelijk met het inbouwen van de nieuwe eenheden, kostte 47 min 54 s en 67 tool-aanroepen, voor 16,16 $ tegen API-tarief, de duurste beurt van de sessie.
Astra spotte ook zelf gebreken voordat ik ze zag. Zijn eerste spritesheets van de infanterie in acht richtingen toonden aanzichten die te veel op elkaar leken, en die maakte hij opnieuw voordat hij ze inbouwde. In beurt 41 kwamen twee textuurgeneraties, rots en puin, zonder afbeelding terug, en die startte hij opnieuw.
Toen Astra het origineel naging
Meerdere keren las Astra eerst de handleiding van Dune 2000 voordat hij een verzoek uitvoerde. Ik wilde weten of de originele game aan elke raffinaderij een Carryall koppelde. Astra antwoordde van niet en verwees naar pagina 16, 17 en 45 van de handleiding uit 1998. Elke raffinaderij levert een harvester, gebracht door een Carryall, en Carryalls voor transport bouw je apart, in de High Tech Factory. Ik heb die pagina’s nagelezen, en daar staat precies dat.
Op de avond van 8 september vroeg ik om op zand te kunnen bouwen door betonplaten te leggen. Astra wees er eerst op dat je in de originele game alleen op rots bouwt, waar de platen gebouwen tegen slijtage beschermen, en paste daarna mijn variant toe. Een gebouw op kale rots begint beschadigd, een volledig betonnen ondergrond geeft het al zijn levenspunten, en de bouwplaats waarmee je start ligt op negen platen. Zandwormen gaan om dat beton heen, ook als het op zand ligt. De volgende dag heb ik de plaat teruggebracht tot één vakje, te plaatsen met een klik of door te slepen, voor 5 credits per vakje.
Geluidseffecten en stemmen gegenereerd met ElevenLabs
De eerste geluiden werden door de code gesynthetiseerd. In beurt 13 vroeg ik om via een skill over te stappen op ElevenLabs. Astra installeerde de officiële skill sound-effects van ElevenLabs en maakte voor de sleutel een bestand .env.local aan dat buiten Git blijft. De eerste sleutel werd geweigerd (401 invalid_api_key). De tweede, 24 uur geldig, leverde 20 effecten op met het model eleven_text_to_sound_v2, door FFmpeg omgezet naar mono-WAV.
Op 8 september kwamen er 34 gesproken meldingen in het Frans bij, van “Alerte ! Notre base est attaquée” (Alarm! Onze basis wordt aangevallen) tot “Commandant, votre base est opérationnelle” (Commandant, uw basis is operationeel). De Franse stem uit de bibliotheek van ElevenLabs is voorbehouden aan betaalde abonnementen, dus nam Astra een standaard meertalige stem met eleven_multilingual_v2. Om elke zin te controleren, liet hij de 34 bestanden daarna door Scribe v2 transcriberen. De meldingen lopen via een prioriteitswachtrij, zetten de muziek zachter en verschijnen als ondertiteling. In beurt 39 volgden twaalf geluidseffecten voor voertuigen.
De muziek is niet gegenereerd. Command of the Scorched Plain is een MP3-bestand dat ik heb aangeleverd en dat met een eigen volume in een lus wordt afgespeeld. Alle geluiden komen uit het project zelf, zonder API-aanroep tijdens het spelen, en het verlopen van de sleutel verandert niets aan het afspelen.
Tijd, tokens en kosten
Elk antwoord van het model laat een regel token_usage_record achter in het sessielog, dat onder ~/.codex/sessions/ staat. Dit commando telt ze op zonder het hele log in het geheugen te laden:
jq -c 'select(.type == "token_usage_record") | .payload.usage' \
~/.codex/sessions/2026/09/06/rollout-2026-09-06T13-20-25-01a07672-bb68-7500-b23a-db1fc7ccbe3e.jsonl \
| jq -s '{reponses: length, entree: (map(.input_tokens) | add), cache: (map(.cached_input_tokens) | add), sortie: (map(.output_tokens) | add)}'{
"reponses": 856,
"entree": 120107006,
"cache": 116244736,
"sortie": 822700
}| Meting | Dune 2000-kloon |
|---|---|
| Periode | van 6 september, 13.23 uur, tot 9 september, 11.26 uur (Parijse tijd) |
| Werktijd van de agent | 11 u 16 min over 46 beurten |
| Antwoorden van het model | 856 |
| Tool-aanroepen | 800 |
| Contextcompacties | 15 |
| Tokens input | 120.107.006, waarvan 116.244.736 uit cache gelezen (96,8%) |
| Tokens output | 822.700, waarvan 264.688 voor redeneren |
| Kosten tegen API-tarief | 196,00 $ |
De berekening volgt de prijslijst van GPT-6 Astra op OpenRouter, opgevraagd op 14 september 2026, oftewel 10 $ per miljoen inputtokens, 1 $ voor cachelezen en 50 $ voor output bij minder dan 272.000 tokens context. Het contextvenster van Codex had een plafond van 258.400 tokens, dus alle requests vallen in die schijf. Dat geeft 38,62 $ voor niet-gecachete input, 116,24 $ voor cache en 41,14 $ voor output.
Ik heb niet per gebruik betaald. Codex draaide op mijn ChatGPT-abonnement, dat het verbruik als quotum afrekent, en dit bedrag dient als referentie. Zonder cache hadden alleen de inputtokens al 1.201 $ gekost, bijna acht keer de berekende 154,87 $. Een cursorcorrectie in beurt 4 kostte 1 min 24 s en 0,86 $. Hoe GPT-6 Astra zich op een kortere opdracht verhoudt tot Claude Fable 5.1, lees je in onze vergelijking in three.js.
Wat er in de map zit
Het uiteindelijke project telt 41 bronbestanden (3.261 regels, 332 KB), 956 regels tests en 2.172 regels scripts. De map public/ serveert 227 PNG-afbeeldingen, 57 WebP-bestanden, 32 WAV-bestanden en 35 MP3’s, en elf JSON-bestanden bewaren de prompts van de gegenereerde afbeeldingen. Het prototype gebruikt geen enkel bestand uit Dune 2000, de sprites, artworks en geluiden zijn ervoor gemaakt.
Het gaat om een skirmish voor één speler tegen de AI, zonder campagne, zonder multiplayer en zonder opslaan. De regels van OpenRA zijn aangepast waar ik daarom vroeg, zoals beton op zand of parallelle productie, waarbij twee fabrieken de bouwtijd van een tank halveren en drie fabrieken hem door drie delen. Dezelfde agent bouwde daarna in één avond een RPG met een heel andere methode, beschreven in game maken met ChatGPT, een RPG in EarthBound-stijl.
Wat je moet onthouden
- Codex en GPT-6 Astra maakten een speelbaar realtime-strategiespel in 46 beurten en 11 u 16 werktijd van de agent, met 54 berichten van mij om bij te sturen.
- OpenRA leverde de basisregels, en de handleiding uit 1998 gaf de doorslag over de Carryall en over de betonplaten.
- Een onderbreking wist de verzoeken van de lopende beurt. Twee keer moesten ze opnieuw worden verstuurd.
- Het aantal tests ging van 11 naar 122 zonder dat ik erom vroeg, en geen enkele test zag de verplaatsingsregressie van beurt 17 aankomen.
- De cache bepaalt de rekening. 96,8% van de inputtokens werd opnieuw gelezen tegen 1 $ per miljoen in plaats van 10 $, voor 196 $ in totaal tegen API-tarief.
Veelgemaakte fouten
npm run test:pathfinding, voordat je goedkeurt.~/.codex/sessions/…/rollout-….jsonl. Zet hem in .env.local, uitgesloten van Git, en geef de agent alleen de naam van de variabele.danger-full-access, zonder goedkeuring. Gebruik die instelling alleen voor een wegwerpmap, zonder productiesleutels binnen bereik.

