oneshotlm
Compare all models on this prompt →

Top-down alien shooter · qwen3.5-9b

Using the pre-provided phaser.min.js (global Phaser), build a top-down alien shooter: move with WASD, aim and fire at waves of advancing aliens, with health, score, and increasing difficulty. Use ONLY procedurally generated graphics, no external image or audio assets.

⛨ sandboxed Open in new tab ↗
transcript · 34 messages
user

Using the pre-provided phaser.min.js (global Phaser), build a top-down alien shooter: move with WASD, aim and fire at waves of advancing aliens, with health, score, and increasing difficulty. Use ONLY procedurally generated graphics, no external image or audio assets.

assistant
thinking
The user wants me to create a top-down alien shooter game using Phaser and built completely from scratch with procedural graphics. Let me build this step by step:

1. Player ship - procedurally drawn with lines and shapes
2. Aliens - different types procedurally generated
3. Bullets - small circles/rectangles
4. Health bar and score display
5. Progressive difficulty
6. Energy system (cooldown between shots)
7. Pause functionality
8. Increasing enemy types based on score

I'll create a single HTML file with inline CSS and JS that loads phaser.min.js locally.
write /tmp/ws/index.html (18080 bytes)
toolResult

Successfully wrote 18080 bytes to /tmp/ws/index.html

assistant
thinking
The file was written but it seems incomplete/corrupted due to the extremely long content. Let me rewrite it properly starting fresh with a cleaner implementation.
bash {"command":"rm /tmp/ws/index.html"}
toolResult

(no output)

assistant
thinking
Let me write a complete, working index.html file in smaller chunks or with better structure.
write /tmp/ws/index.html (5548 bytes)
toolResult

Successfully wrote 5548 bytes to /tmp/ws/index.html

assistant
thinking
Good, now I need to append the main JavaScript code to complete the file.
bash {"command":"cat >> /tmp/ws/index.html << 'ENDSCRIPT'\nconst Config = {\n width: 800,\n height: 600,\n playerSpeed: 5,\n bulletSp
toolResult

(no output)

assistant
thinking
The script got cut off and has syntax errors. Let me write the complete file again properly.
bash {"command":"rm /tmp/ws/index.html && cat > /tmp/ws/index.html << 'ENDOFFILE'\n<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\
toolResult

(no output)

assistant
thinking
Let me read the file to verify it was written correctly, then verify with a clearer approach if needed.
bash {"command":"wc -l /tmp/ws/index.html && head -20 /tmp/ws/index.html"}
toolResult

427 /tmp/ws/index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Neon Aliens</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { background: #050510; display: flex; justify-content: center; align-items: center; min-height: 100vh; font-family: 'Courier New', monospace; color: white; overflow: hidden; } #game-container { box-shadow: 0 0 50px rgba(0,255,0,0.3); border: 3px solid #333; border-radius: 5px; position: relative; } canvas { display: block; } #start-screen, #game-over-screen { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center; background: rgba(0,0,0,0.95); padding: 40px; border: 2px solid #0f0; border-radius: 10px; pointer-events: auto; } h1 { font-size: 3em; color: #0f0; margin-bottom: 20px; text-shadow: 0 0 20px #0f0; text-transform: uppercase; letter-spacing: 5px; } .game-over h1 { color: #f00; text-shadow: 0 0 20px #f00; } .controls { text-align: left; margin: 20px 0; color: #aaa; } .key { display: inline-block; padding: 5px 10px; background: #333; border: 1px solid #555; border-radius: 3px; margin: 2px; font-weight: bold; } button { background: linear-gradient(135deg, #0f0, #006400); border: 2px solid #0f0; color: white; padding: 15px 40px; font-size: 1.5em; cursor: pointer; border-radius: 5px; margin: 20px; font-family: 'Courier New', monospace; font-weight: bold; }

assistant
thinking
Good, the file was written. However, the JavaScript code I wrote has syntax errors and is quite complex. Let me write a cleaner, simpler version that actually works. I'll create a clean index.html with properly working code.
bash {"command":"rm /tmp/ws/index.html && cat > /tmp/ws/index.html << 'EOF'\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\"
toolResult

(no output)

assistant
thinking
The file is being written but I'm using heredoc which can have issues. Let me use a different approach - write the file in smaller, more reliable chunks using the write function.
bash {"command":"head -100 /tmp/ws/index.html"}
toolResult

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Neon Aliens</title> <style> *{margin:0;padding:0;box-sizing:border-box} body{background:#050510;display:flex;justify-content:center;align-items:center;min-height:100vh;font-family:'Courier New',monospace;color:white;overflow:hidden} #container{position:relative} #ui{position:absolute;top:0;left:0;right:0;padding:10px;pointer-events:none;display:none} #health{display:flex;gap:10px} #health-bar{width:200px;height:25px;background:#333;border:2px solid white;border-radius:5px;overflow:hidden} #hp-fill{height:100%;background:linear-gradient(90deg,#f00,#ff0,#0f0);transition:width 0.2s} #score{text-align:right;font-size:1.2em;text-shadow:0 0 10px #0f0} #wave{text-align:right;font-size:1.5em;color:#0f0;text-shadow:0 0 10px #0f0} #start,#game-over{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.95);padding:40px;border:2px solid #0f0;border-radius:10px;text-align:center} #game-over h1{color:#f00} h1{font-size:3em;color:#0f0;margin-bottom:20px;text-shadow:0 0 20px #0f0;text-transform:uppercase} p{color:#888;margin:20px 0} button{background:linear-gradient(135deg,#0f0,#006400);border:2px solid #0f0;color:white;padding:15px 40px;font-size:1.3em;cursor:pointer;border-radius:5px;margin:10px;font-family:'Courier New',monospace;font-weight:bold} button:hover{filter:brightness(1.2)} .controls{margin:20px 0;color:#aaa} .key{display:inline-block;padding:5px 10px;background:#333;border:1px solid #555;border-radius:3px;margin:2px;font-weight:bold} </style> </head> <body> <div id="container"> <div id="ui"> <div id="health"><div id="health-bar"><div id="hp-fill" style="width:100%"></div></div><div id="score">SCORE: 0</div></div> <div id="wave">WAVE: 1</div> </div> </div> <div id="start"> <h1>NEON ALIENS</h1> <div class="controls"> <div><span class="key">W</span><span class="key">A</span><span class="key">S</span><span class="key">D</span> Move</div> <div><span class="key">MOUSE</span> Aim & Fire</div> <div><span class="key">SPACE</span> Pause</div> <div><span class="key">R</span> Reload</div> </div> <p>Destroy waves of aliens. Survive!</p> <button onclick="startGame()">START</button> </div> <div id="game-over" style="display:none"> <h1>Mission Failed</h1> <p id="final">Score: 0</p> <button onclick="startGame()">RESTART</button> </div> <script src="phaser.min.js"></script> <script> const C = {W:800,H:600,WAVE:5000,SPD:2,FIRE:150,HP:100,DAM:20,SPD_ARR:[2,3,1]}; let G = null, ST = false, P = null, EN = [], BU = [], KE = {w:false,a:false,s:false,d:false}; function startGame(){ document.getElementById('start').style.display='none'; document.getElementById('game-over').style.display='none'; document.getElementById('ui').style.display='block'; G = new Phaser.Game({width:C.W,height:C.H,parent:'container',type:Phaser.AUTO,backgroundColor:'#050510'}); P = G.scene; P.create(); } P.create = () => { this.create(); this.enemies = []; this.bullets = []; this.stars = []; this.createStars(); this.player = this.createPlayer(); this.player.setOrigin(0.5,1).setScrollFactor(0).setDepth(0); this.player.setPosition(C.W/2,C.H-100); this.player.hp = C.HP; this.waveTimer = 0; this.spawnTimer = 0; this.fireCooldown = 0; this.particles = 0; }; P.createStars = () => { for(let i=0;i<50;i++){ this.stars.push({x:Math.random()*C.W,y:Math.random()*C.H}); } }; P.createPlayer = () => { this.graphics = this.add.graphics(); this.graphics.lineStyle(2,0x00ff00); this.graphics.beginFill(0x00ff00,0.8); this.graphics.moveBetween(20,0,20,40,40,20,0,20,0,20,35,0,20,10,10,10); this.graphics.beginFill(0xffff00); this.graphics.draw(20,10,5,5); this.graphics.beginFill(0xff6600); this.graphics.drawTriangle(20,30,30,28,20,25); this.graphics.endFill(); this.graphics.endStroke(); this.graphics.setDepth(10); return this.graphics; }; P.mouse = new Phaser.Pointer(this,0);

assistant
thinking
Good, the file is being written but it has JavaScript errors - it's my heredoc replacement text that got cut off. I need to write a complete, clean file. Let me use the write tool to create the file in one go.
bash {"command":"cat > /tmp/ws/index.html << 'HTMLEOF'\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<title>Neon Aliens
toolResult

(no output)

assistant
thinking
Good, but I still have JavaScript syntax errors in the file. Let me use the write function to write a properly-formed complete HTML file with working code. I'll create a clean, self-contained implementation.
write /tmp/ws/index.html (4450 bytes)
toolResult

Successfully wrote 4450 bytes to /tmp/ws/index.html

assistant
thinking
The JavaScript is still incomplete and has errors. Let me write a fully complete and working file using proper code blocks.
bash {"command":"rm /tmp/ws/index.html"}
toolResult

(no output)

assistant
thinking
Let me create a clean, working implementation step by step. I'll write it in smaller chunks to avoid issues.
bash {"command":"cat > /tmp/ws/complete-game.js << 'JSEOF'\n// Neon Aliens - Top Down Alien Shooter\n// Using Phaser 3 with procedural graphics\n
toolResult

(no output)

assistant
thinking
Now let me create the complete HTML file with the JavaScript properly inside.
bash {"command":"cat > /tmp/ws/index.html << 'EOF'\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\
toolResult

(no output)

assistant
thinking
Good, let me check the file and make sure it's well-formed. Then verify the structure.
bash {"command":"wc -l /tmp/ws/index.html && head -30 /tmp/ws/index.html && echo \"...\" && tail -20 /tmp/ws/index.html"}
toolResult

51 /tmp/ws/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Neon Aliens</title> <style> *{margin:0;padding:0;box-sizing:border-box} body{background:#050510;display:flex;justify-content:center;align-items:center;min-height:100vh;font-family:'Courier New',monospace;color:white;overflow:hidden} #container{position:relative} #ui{position:absolute;top:0;left:0;right:10px;padding:10px;pointer-events:none;display:none} hp-fill{height:25px;background:#333;border:2px solid #fff;border-radius:5px;overflow:hidden;margin-bottom:5px} hp-fill span{display:block;height:100%;background:linear-gradient(90deg,#f00,#ff0,#0f0);transition:width 0.15s;width:100%} #score{text-align:right;font-size:1.2em;text-shadow:0 0 8px #0f0} #wave{text-align:right;font-size:1.5em;color:#0f0;text-shadow:0 0 8px #0f0} #start,#game-over{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.95);padding:40px;border:2px solid #0f0;border-radius:10px;text-align:center} #game-over h1{color:#f00;margin-bottom:10px} h1{font-size:3em;color:#0f0;margin-bottom:20px;text-shadow:0 0 20px #0f0;text-transform:uppercase;letter-spacing:8px} p{color:#888;margin:20px 0} button{background:linear-gradient(135deg,#0f0,#006400);border:2px solid #0f0;color:white;padding:15px 40px;font-size:1.3em;cursor:pointer;border-radius:5px;margin:10px;font-family:'Courier New',monospace;font-weight:bold;transition:all 0.3s} button:hover{filter:brightness(1.2);transform:scale(1.05)} .controls{margin:20px 0;color:#aaa} .key{display:inline-block;padding:5px 10px;background:#333;border:1px solid #555;border-radius:3px;margin-right:5px;font-weight:bold} </style> </head> <body> <div id="container"> <div id="ui"><div id="hp-fill"><span></span></div><div id="score">SCORE: 0</div><div id="wave">WAVE: 1</div></div> </div> <div id="start"> ... <div class="controls"> <div><span class="key">W</span><span class="key">A</span><span class="key">S</span><span class="key">D</span> Move</div> <div><span class="key">MOUSE</span> Aim & Fire</div> <div><span class="key">SPACE</span> Pause</div> <div><span class="key">R</span> Reload</div> </div> <p>Destroy waves of aliens. Survive as long as you can!</p> <button id="start-btn">START MISSION</button> </div> <div id="game-over" style="display:none;"> <h1>MISSION FAILED</h1> <p id="final">Score: 0</p> <p id="final-wave" style="color:#888;margin:10px 0 20px 0">Wave: 1</p> <button id="restart-btn">RESTART</button> </div> <script src="phaser.min.js"></script> <script> (function(){const Config={W:800,H:600,Speed:5,FireDelay:150,Reload:1000,Health:100,Dmg:20,WaveInterval:5000,Aliens:{Basic:{hp:1,speed:2,color:0xff0000,score:10,size:30},Swift:{hp:1,speed:4,color:0xff00ff,score:20,size:25},Tank:{hp:5,speed:1,color:0xffff00,score:50,size:40}}};let State={Running:false,Paused:false,Score:0,Health:100,Wave:1,EnemiesToSpawn:5,ActiveEnemies:0,FireCooldown:0,ReloadTimeout:0,Enemies:[],Bullets:[],Stars:[],SpawnTimer:0,InputKey:{w:false,a:false,s:false,d:false},Player:null};document.getElementById('start-btn').onclick=start;document.getElementById('restart-btn').onclick=start;function start(){if(State.Game)State.Game.destroy(true);State.Running=true;State.Score=0;State.Health=Config.Health;State.Wave=1;State.EnemiesToSpawn=5;State.ActiveEnemies=0;State.FireCooldown=0;State.ReloadTimeout=0;document.getElementById('start').style.display='none';document.getElementById('game-over').style.display='none';document.getElementById('ui').style.display='block';State.Game=new Phaser.Game({width:Config.W,height:Config.H,parent:'container',type:Phaser.AUTO,backgroundColor:'#050510',physics:{default:'arcade'}});State.Scene=State.Game.scene;updateUI();}function updateUI(){document.getElementById('hp-fill').querySelector('span').style.width=State.Health+'%';document.getElementById('score').textContent='SCORE:'+State.Score;document.getElementById('wave').textContent='WAVE:'+State.Wave;}class GameScene extends Phaser.Scene{constructor(){super({key:'GameScene'})}init(){this.enemies=[];this.bullets=[];this.stars=[];this.inputKey={w:false,a:false,s:false,d:false};this.inputKey.w=State.InputKey.w=this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.W);this.inputKey.a=State.InputKey.a=this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.A);this.inputKey.s=State.InputKey.s=this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.S);this.inputKey.d=State.InputKey.d=this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.D);}create(){const g=this.add.graphics();this.playerGfx=g;this.playerX=400;this.playerY=300;this.playerAngle=-Math.PI/2;this.playerPanX=20;this.playerPanY=0;this.hasGun=true;this.createPlayer();for(let i=0;i<80;i++)this.createStar();}createPlayer(){const g=this.add.graphics();g.lineStyle(3,0x00ff00,1);g.beginFill(0x00ff00,0.9);g.moveTo(20,0);g.lineTo(20,35);g.lineTo(10,20);g.lineTo(30,20);g.closePath();g.fillPath();g.beginFill(0xffff00,0.9);g.fillCircle(20,10,4);g.endFill();g.beginFill(0x00ffff,0.6);g.fillTriangle(20,35,14,40,26,40);g.endFill();g.setScrollFactor(0);}createStar(){const x=Math.random()*800,y=Math.random()*600,s=Math.random()*2+1;this.stars.push({x,y,s});}update(){if(!this.running)return;if(this.paused)return;let vy=0,vx=0;if(this.inputKey.w)vy=-1;if(this.inputKey.s)vy=1;if(this.inputKey.a)vx=-1;if(this.inputKey.d)vx=1;this.playerX+=vx*Config.Speed;this.playerY+=vy*Config.Speed;this.playerX=Math.max(20,Math.min(780,this.playerX));this.playerY=Math.max(20,Math.min(580,this.playerY));if(this.inputActivePointer)this.playerAngle=Math.atan2(this.inputActivePointer.y-this.playerY,this.inputActivePointer.x-this.playerX);this.playerGfx.position.set(this.playerX,this.playerY);this.playerGfx.setRotate((this.playerAngle-0.2)*180/Math.PI);if(this.shooting){this.fireCooldown--;if(this.fireCooldown<=0){this.bullets.push({x:this.playerX+20,y:this.playerY,vx:Math.cos(this.playerAngle)*20,vy:Math.sin(this.playerAngle)*20,life:60});this.fireCooldown=10;this.shooting=false;}}for(let i=this.bullets.length-1;i>=0;i--){const b=this.bullets[i];b.x+=b.vx;b.y+=b.vy;b.life--;if(b.life<=0||b.x<0||b.x>800||b.y<0||b.y>600){this.bullets.splice(i,1);continue;}for(let j=this.enemies.length-1;j>=0;j--){const e=this.enemies[j];const dx=b.x-e.x,dy=b.y-e.y;if(dx*dx+dy*dy<this.bulletHitRadius){e.hp--;this.bullets.splice(i,1);if(e.hp<=0){this.enemies.splice(j,1);this.score+=Config[type].score;}}}}for(let i=0;i<this.enemies.length;i++){const e=this.enemies[i];const ang=Math.atan2(this.playerY-e.y,this.playerX-e.x);e.x+=Math.cos(ang)*Config.speed/e.type;e.y+=Math.sin(ang)*Config.speed/e.type;const dx=e.x-this.playerX,dy=e.y-this.playerY;if(dx*dx+dy*dy<850){State.Health-=Config.Dmg;this.enemies.splice(i,1);if(State.Health<=0){State.Running=false;document.getElementById('final').textContent='Score:'+this.score;document.getElementById('final-wave').textContent='Wave:'+this.wave;document.getElementById('game-over').style.display='block';document.getElementById('ui').style.display='none';return;}}}this.spawnTimer++;if(this.spawnTimer>=60&&State.EnemiesToSpawn>0){const typeArr=['basic','swift','tank'];this.spawnTimer=0;State.EnemiesToSpawn=Math.max(5,State.Wave/1.4);this.enemies.push(this.createEnemy({x:Math.random()*700+100,y:-40,type:typeArr[Math.floor(Math.random()*typeArr.length)],hp:Config[typeArr[Math.floor(Math.random()*3)]].hp}));}updateUI();}createEnemy(props){const newE={x:props.x,y:props.y,hp:props.hp||1,type:props.type||'basic',speed:Config[type]&&Config[type].speed||2,alive:true};this.enemies.push(newE);this.drawEnemy(newE);return newE;};drawEnemy(e){const g=this.add.graphics();const type=e.type;g.beginFill(Config[type].color,0.9);g.lineStyle(2,Config[type].color,1);if(type==='tank'){g.lineWidth=2;g.strokeRect(0,0,40,40);g.beginFill(0x00ffff);g.moveTo(20,0);g.lineTo(20,12);g.lineTo(28,15);g.lineTo(12,15);g.closePath();g.fillPath();g.beginFill(0x555);g.fillRect(8,15,24,8);g.fillRect(8,30,24,8);}else if(type==='swift'){g.moveTo(12.5,0);g.lineTo(25,12.5);g.lineTo(12.5,25);g.lineTo(0,12.5);g.closePath();g.fillPath();g.beginFill(0xffffff,0.9);g.fillCircle(12.5,12.5,6);g.endFill();}else{g.moveTo(15,0);g.lineTo(25,10);g.lineTo(25,20);g.lineTo(15,30);g.lineTo(5,20);g.lineTo(5,10);g.closePath();g.fillPath();g.beginFill(0xffffff,0.9);g.fillCircle(15,15,5);g.endFill();}}// Wrap properlyState.Game.scene.add.scene();}]()}();</script> </body> </html>

assistant
thinking
The file is created but there's a problem I can see - the CSS is missing a `#` in selectors, and there are other JavaScript errors. Let me rewrite a clean, complete version properly.
bash {"command":"cat > /tmp/ws/index.html << 'FULLFILE'\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"view
toolResult

(no output)

assistant
thinking
Good, but I see there are still syntax errors. Let me write a properly formatted, complete, and working file using the write function with structured JavaScript inside.
bash {"command":"rm /tmp/ws/index.html && printf '%s\\n' '<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"vie
toolResult

/bin/bash: -c: line 1: unexpected EOF while looking for matching `'' Command exited with code 2

assistant
thinking
I'm having issues with the heredoc and quoting. Let me use a simpler approach using echo commands to create the file piece by piece.

<function=whrite> <parameter=path> /tmp/ws/index.html </parameter> <parameter=content> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Neon Aliens</title> <style> *{margin:0;padding:0;box-sizing:border-box} body{background:#050510;display:flex;justify-content:center;align-items:center;min-height:100vh;font-family:monospace;color:white;overflow:hidden} #container{position:relative;width:800px;height:600px} #ui{position:absolute;top:0;left:0;right:0;padding:10px;pointer-events:none;display:none} #hp-fill{height:25px;background:#333;border:2px solid #fff;border-radius:5px;margin-bottom:5px} #hp-fill>span{height:100%;background:linear-gradient(90deg,#f00,#ff0,#0f0);transition:width 0.15s} #score{text-align:right;font-size:1.2em;text-shadow:0 0 8px #0f0;position:absolute;top:28px} #wave{text-align:right;font-size:1.5em;color:#0f0;text-shadow:0 0 8px #0f0;position:absolute;top:2px} #start,#game-over{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:rgba(0,0,0,0.95);padding:30px;border:2px solid #0f0;border-radius:10px;text-align:center} #game-over h1{color:#f00;margin-bottom:15px;font-size:2.2em;text-shadow:0 0 20px #f00} h1{font-size:2.5em;color:#0f0;margin-bottom:15px;text-shadow:0 0 20px #0f0;text-transform:uppercase;letter-spacing:6px} p{color:#888;margin:15px 0} button{background:linear-gradient(135deg,0x0f0,0x005500);border:2px solid #0f0;color:white;padding:12px 30px;font-size:1.2em;cursor:pointer;border-radius:5px;margin:10px;font-family:monospace;font-weight:bold;transition:0.2s;border:2px solid #0f0} button:hover{transform:scale(1.05)} .key{display:inline-block;padding:3px 7px;background:#333;border:1px solid #555;border-radius:3px;margin:1px;font-weight:bold} </style> </head> <body> <div id="container"> <div id="ui"> <div id="hp-fill"><span></span></div> <div id="score">SCORE: 0</div> <div id="wave">WAVE: 1</div> </div> <div id="start"> <h1>NEON ALIENS</h1> <p>Top-Down Alien Shooter</p> <div><span class="key">W</span><span class="key">A</span><span class="key">S</span><span class="key">D</span> Move</div> <div><span class="key">MOUSE</span> Aim & Fire</div> <div><span class="key">SPACE</span> Pause</div> <div><span class="key">R</span> Reload</div> <p>Survive as long as you can!</p> <button id="start-btn">START</button> </div> <div id="game-over" style="display:none"> <h1>GAME OVER</h1> <p id="final">Score: 0</p> <p id="waveend" style="color:#888;margin-bottom:20px">Wave: 1</p> <button id="restart-btn">RESTART</button> </div> </div> <script src="phaser.min.js"></script> <script> const C={W:800,H:600,SP:5,FD:150,RT:1000,HP:100,DAM:20,VI:5000,AL:{B:{hp:1,sp:2,ct:0xff0000,sc:10},S:{hp:1,sp:4,ct:0xff00ff,sc:20},T:{hp:5,sp:1,ct:0xffff00,sc:50}}} let S={run:false,ps:false,sc:0,hp:100,w:1,est:5,ac:0,fc:0,st:[],es:[],bs:[],sv:0,km:{w:false,a:false,s:false,d:false}} </parameter> </function> </tool_call>

TAKE IT TO CODE

A single self-contained HTML file — copy it and open in any browser, or reuse the prompt with your own pi-agent run.

RUN

modelqwen3.5-9b
vendorQwen
harnesspi-agent
generated2026-08-01

EVALUATION

1/5 broken

Only a static start menu renders with a JS syntax error; clicking START MISSION never launches the game.

off-prompt

Vision grade · anthropic/claude-sonnet-5

MEASUREMENTS

Raw readings from the capture, not a verdict — the grade above is the only judgement. Percentages are how much of the screen changed; the measure under-reports sparse motion on a dark background.

idle motion0.0%
on click0.0%
on drag0.0%
on wheel0.0%
on enter + space0.0%
on arrow keys0.0%
on w/a/s/d0.0%
frame spread17.4 / 255
console errors0
js errors
  • missing ) after argument list

METRICS

runtime403.7s
tokens in420k
tokens out40k
cached0
cost / run$0.0481