[object Object]

← back to Model Arena

auto-data-snapshot: 2026-09-08T21:15:02 (1 data files) — data/challenges.json

45547fbd6bcba570e89ab977019f8c4c87f5fd6e · 2026-09-08 21:16:03 -0700 · auto-commit-fleet

Files touched

Diff

commit 45547fbd6bcba570e89ab977019f8c4c87f5fd6e
Author: auto-commit-fleet <steve@designerwallcoverings.com>
Date:   Tue Sep 8 21:16:03 2026 -0700

    auto-data-snapshot: 2026-09-08T21:15:02 (1 data files) — data/challenges.json
---
 data/challenges.json | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 87 insertions(+)

diff --git a/data/challenges.json b/data/challenges.json
index 9a1f0c7..fbc8cfb 100644
--- a/data/challenges.json
+++ b/data/challenges.json
@@ -36657,5 +36657,92 @@
     "judging": false,
     "aiPick": "qwen3-14b",
     "judged_at": "2026-09-09T00:10:41.252Z"
+  },
+  {
+    "id": "e05d1f859c94",
+    "title": "Remix: Wild Orbs (free-only rematch)",
+    "prompt": "Build a complete, polished single-file HTML5 Canvas game: an Asteroids-style game where the asteroids are replaced by ORBS, and EACH orb does something WILD and different when you shoot it. Include at least 8 visually distinct wild orb types, each with a clearly different on-hit behavior — splits into a homing swarm; explodes into a gravity well that sucks in bullets/ship; phases/teleports; spawns a black hole; reverses controls briefly; shatters into ricocheting shards; drops a time-slow bubble; chain-reaction color bomb; mirror-clones; rubber-band wall bounce. Ship: thrust + inertia + rotation + screen-wrap + fire with cooldown. Particles, bullet trails, screen shake, glow/gradients, escalating waves, score, lives, start + game-over screens. Sound via WebAudio. Controls: arrows/WASD to fly, space to shoot. Return ONE self-contained HTML file, no external assets/CDNs. Be very detailed and juicy.\n\nHere is a strong previous attempt at this exact challenge. IMPROVE on it — keep what works, fix its weaknesses, and elevate the visual quality and polish. Return a complete, improved single-file HTML document.\n\n=== PREVIOUS ATTEMPT (Claude Opus (Max plan)) ===\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>ORBFALL — Wild Orb Asteroids</title>\n<style>\n  *{margin:0;padding:0;box-sizing:border-box;}\n  html,body{width:100%;height:100%;overflow:hidden;background:#03030a;font-family:\"Trebuchet MS\",\"Segoe UI\",system-ui,sans-serif;}\n  #wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:radial-gradient(ellipse at 50% 40%,#0b0b22 0%,#04040e 55%,#000 100%);}\n  canvas{display:block;image-rendering:auto;touch-action:none;}\n  #ui{position:absolute;inset:0;pointer-events:none;}\n  .screen{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:#e8f6ff;pointer-events:auto;\n    background:radial-gradient(ellipse at 50% 45%,rgba(20,10,60,.72) 0%,rgba(3,3,12,.93) 70%);backdrop-filter:blur(3px);}\n  .hidden{display:none!important;}\n  h1{font-size:clamp(38px,9vw,96px);letter-spacing:.14em;font-weight:900;\n     background:linear-gradient(180deg,#fff 0%,#7 df 40%,#8be9ff 45%,#b06cff 100%);\n     -webkit-background-clip:text;background-clip:text;color:transparent;\n     text-shadow:0 0 40px rgba(120,180,255,.35);margin-bottom:.1em;}\n  h1 .sub{display:block;font-size:.20em;letter-spacing:.55em;color:#8fd6ff;-webkit-text-fill-color:#8fd6ff;margin-top:.4em;opacity:.85;}\n  .tag{font-size:clamp(12px,1.7vw,17px);color:#9fb4d8;letter-spacing:.18em;text-transform:uppercase;margin-bottom:26px;}\n  .keys{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-bottom:26px;max-width:min(760px,92vw);}\n  .key{border:1px solid rgba(140,190,255,.28);background:rgba(20,32,64,.5);padding:8px 14px;border-radius:9px;font-size:13px;color:#cfe4ff;letter-spacing:.08em;}\n  .key b{color:#7ff0d0;}\n  .orblist{display:grid;grid-template-columns:repeat(auto-fit,minmax(158px,1fr));gap:8px;max-width:min(880px,94vw);margin-bottom:26px;}\n  .orbcard{display:flex;align-items:center;gap:9px;background:rgba(12,18,40,.55);border:1px solid rgba(120,170,255,.16);border-radius:10px;padding:7px 10px;font-size:11.5px;color:#b9cdea;text-align:left;letter-spacing:.03em;}\n  .dot{width:15px;height:15px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 10px currentColor;background:currentColor;}\n  .btn{pointer-events:auto;cursor:pointer;border:none;border-radius:999px;padding:16px 46px;font-size:19px;font-weight:800;letter-spacing:.2em;color:#04121a;\n    background:linear-gradient(135deg,#7ff0d0,#63c8ff 55%,#b06cff);box-shadow:0 0 34px rgba(99,200,255,.5),0 8px 26px rgba(0,0,0,.5);\n    transition:transform .12s ease,box-shadow .12s ease;font-family:inherit;text-transform:uppercase;}\n  .btn:hover{transform:translateY(-2px) scale(1.03);box-shadow:0 0 52px rgba(140,220,255,.75),0 10px 30px rgba(0,0,0,.55);}\n  .btn:active{transform:translateY(1px) scale(.98);}\n  .small{margin-top:20px;font-size:12px;color:#6f84a8;letter-spacing:.12em;}\n  #gameover h2{font-size:clamp(34px,7vw,72px);letter-spacing:.12em;color:#ff6f8f;text-shadow:0 0 30px rgba(255,80,120,.55);margin-bottom:.15em;font-weight:900;}\n  .statrow{display:flex;gap:34px;flex-wrap:wrap;justify-content:center;margin:18px 0 26px;}\n  .stat{min-width:110px;}\n  .stat .v{font-size:32px;font-weight:800;color:#8be9ff;text-shadow:0 0 18px rgba(100,200,255,.5);}\n  .stat .l{font-size:11px;letter-spacing:.22em;color:#7f93b6;text-transform:uppercase;margin-top:3px;}\n  #toast{position:absolute;left:50%;top:14%;transform:translateX(-50%);font-size:clamp(16px,3.2vw,30px);font-weight:900;letter-spacing:.16em;\n    text-transform:uppercase;color:#fff;opacity:0;text-shadow:0 0 22px currentColor;white-space:nowrap;}\n  #wavebanner{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);font-size:clamp(30px,8vw,86px);font-weight:900;letter-spacing:.28em;\n    color:#fff;opacity:0;text-shadow:0 0 40px #63c8ff;white-space:nowrap;}\n</style>\n</head>\n<body>\n<div id=\"wrap\">\n  <canvas id=\"cv\"></canvas>\n  <div id=\"ui\">\n    <div id=\"toast\"></div>\n    <div id=\"wavebanner\"></div>\n\n    <div id=\"start\" class=\"screen\">\n      <h1>ORBFALL<span class=\"sub\">wild orb protocol</span></h1>\n      <div class=\"tag\">Ten orbs. Ten kinds of chaos. Shoot carefully.</div>\n      <div class=\"keys\">\n        <div class=\"key\"><b>←→</b> / <b>A D</b> rotate</div>\n        <div class=\"key\"><b>↑</b> / <b>W</b> thrust</div>\n        <div class=\"key\"><b>SPACE</b> fire</div>\n        <div class=\"key\"><b>SHIFT</b> blink</div>\n        <div class=\"key\"><b>P</b> pause</div>\n        <div class=\"key\"><b>M</b> mute</div>\n      </div>\n      <div class=\"orblist\" id=\"orblist\"></div>\n      <button class=\"btn\" id=\"startBtn\">Launch</button>\n      <div class=\"small\">Screen wraps. Inertia is real. Nothing is safe.</div>\n    </div>\n\n    <div id=\"gameover\" class=\"screen hidden\">\n      <h2>SIGNAL LOST</h2>\n      <div class=\"tag\" id=\"goSub\">the orbs got you</div>\n      <div class=\"statrow\">\n        <div class=\"stat\"><div class=\"v\" id=\"goScore\">0</div><div class=\"l\">Score</div></div>\n        <div class=\"stat\"><div class=\"v\" id=\"goWave\">1</div><div class=\"l\">Wave</div></div>\n        <div class=\"stat\"><div class=\"v\" id=\"goPopped\">0</div><div class=\"l\">Orbs Popped</div></div>\n        <div class=\"stat\"><div class=\"v\" id=\"goBest\">0</div><div class=\"l\">Best</div></div>\n      </div>\n      <button class=\"btn\" id=\"againBtn\">Again</button>\n      <div class=\"small\">Press ENTER to relaunch</div>\n    </div>\n  </div>\n</div>\n\n<script>\n\"use strict\";\n/* ============================================================\n   ORBFALL — single-file canvas arcade\n   ============================================================ */\nconst cv = document.getElementById('cv');\nconst ctx = cv.getContext('2d', {alpha:false});\nlet W = 0, H = 0, DPR = 1;\n\nfunction resize(){\n  DPR = Math.min(window.devicePixelRatio || 1, 2);\n  W = window.innerWidth; H = window.innerHeight;\n  cv.width = Math.floor(W*DPR); cv.height = Math.floor(H*DPR);\n  cv.style.width = W+'px'; cv.style.height = H+'px';\n  ctx.setTransform(DPR,0,0,DPR,0,0);\n}\nwindow.addEventListener('resize', resize);\nresize();\n\n/* ---------------- math helpers ---------------- */\nconst TAU = Math.PI*2;\nconst rand = (a=1,b=0)=> b + Math.random()*(a-b);\nconst randi = (a,b)=> Math.floor(rand(a,b));\nconst pick = arr => arr[Math.floor(Math.random()*arr.length)];\nconst clamp = (v,a,b)=> v<a?a:v>b?b:v;\nconst lerp = (a,b,t)=> a+(b-a)*t;\n\n// toroidal shortest delta\nfunction wrapDelta(a,b,size){ let d=b-a; if(d> size/2) d-=size; if(d<-size/2) d+=size; return d; }\nfunction wrapPos(o){\n  if(o.x<-40) o.x+=W+80; else if(o.x>W+40) o.x-=W+80;\n  if(o.y<-40) o.y+=H+80; else if(o.y>H+40) o.y-=H+80;\n}\nfunction torDist(ax,ay,bx,by){\n  const dx=wrapDelta(ax,bx,W), dy=wrapDelta(ay,by,H);\n  return Math.hypot(dx,dy);\n}\n\n/* ---------------- audio ---------------- */\nconst Sound = (()=>{\n  let actx=null, master=null, muted=false;\n  function ensure(){\n    if(actx) return actx;\n    try{\n      actx = new (window.AudioContext||window.webkitAudioContext)();\n      master = actx.createGain(); master.gain.value = 0.5; master.connect(actx.destination);\n    }catch(e){ actx=null; }\n    return actx;\n  }\n  function now(){ return actx? actx.currentTime : 0; }\n  function tone(opt){\n    const A = ensure(); if(!A || muted) return;\n    if(A.state==='suspended') A.resume();\n    const t0 = A.currentTime + (opt.delay||0);\n    const o = A.createOscillator();\n    const g = A.createGain();\n    o.type = opt.type||'sine';\n    o.frequency.setValueAtTime(opt.f0||440, t0);\n    if(opt.f1!=null){\n      if(opt.exp) o.frequency.exponentialRampToValueAtTime(Math.max(1,opt.f1), t0+(opt.dur||0.2));\n      else o.frequency.linearRampToValueAtTime(opt.f1, t0+(opt.dur||0.2));\n    }\n    const vol = (opt.vol==null?0.2:opt.vol);\n    g.gain.setValueAtTime(0.0001, t0);\n    g.gain.exponentialRampToValueAtTime(Math.max(0.0001,vol), t0+0.008);\n    g.gain.exponentialRampToValueAtTime(0.0001, t0+(opt.dur||0.2));\n    let node = o;\n    if(opt.filter){\n      const f = A.createBiquadFilter(); f.type=opt.filter; f.frequency.value = opt.fc||900;\n      node.connect(f); f.connect(g);\n    } else node.connect(g);\n    g.connect(master);\n    o.start(t0); o.stop(t0+(opt.dur||0.2)+0.05);\n  }\n  function noise(opt){\n    const A = ensure(); if(!A || muted) return;\n    if(A.state==='suspended') A.resume();\n    const dur = opt.dur||0.3;\n    const len = Math.floor(A.sampleRate*dur);\n    const buf = A.createBuffer(1,len,A.sampleRate);\n    const d = buf.getChannelData(0);\n    for(let i=0;i<len;i++){ d[i] = (Math.random()*2-1) * Math.pow(1-i/len, opt.decay||2); }\n    const s = A.createBufferSource(); s.buffer = buf;\n    const f = A.createBiquadFilter(); f.type = opt.filter||'lowpass';\n    f.frequency.setValueAtTime(opt.fc||1200, A.currentTime);\n    if(opt.fc1!=null) f.frequency.exponentialRampToValueAtTime(Math.max(40,opt.fc1), A.currentTime+dur);\n    const g = A.createGain(); g.gain.value = (opt.vol==null?0.25:opt.vol);\n    s.connect(f); f.connect(g); g.connect(master);\n    s.start(); s.stop(A.currentTime+dur+0.02);\n  }\n  return {\n    ensure,\n    toggle(){ muted=!muted; if(master) master.gain.value = muted?0:0.5; return muted; },\n    isMuted(){ return muted; },\n    shoot(){ tone({type:'square',f0:880,f1:180,dur:0.09,vol:0.07,exp:true}); },\n    thrust(){ noise({dur:0.06,fc:420,vol:0.035,decay:1}); },\n    pop(hue){ tone({type:'triangle',f0:300+hue*1.4,f1:90,dur:0.22,vol:0.13,exp:true}); noise({dur:0.22,fc:2400,fc1:200,vol:0.10}); },\n    boom(){ noise({dur:0.7,fc:1400,fc1:60,vol:0.32,decay:1.6}); tone({type:'sine',f0:120,f1:30,dur:0.6,vol:0.2,exp:true}); },\n    hurt(){ tone({type:'sawtooth',f0:200,f1:50,dur:0.5,vol:0.2,exp:true}); noise({dur:0.4,fc:800,fc1:80,vol:0.2}); },\n    blackhole(){ tone({type:'sine',f0:40,f1:220,dur:1.2,vol:0.16,exp:true}); noise({dur:1.2,fc:120,fc1:1800,vol:0.10,decay:0.6}); },\n    swarm(){ tone({type:'sawtooth',f0:520,f1:1400,dur:0.3,vol:0.09,exp:true}); },\n    phase(){ tone({type:'sine',f0:1400,f1:280,dur:0.28,vol:0.11,exp:true}); tone({type:'sine',f0:700,f1:2000,dur:0.28,vol:0.07,exp:true,delay:0.05}); },\n    reverse(){ tone({type:'square',f0:160,f1:520,dur:0.45,vol:0.11,exp:true}); tone({type:'square',f0:520,f1:160,dur:0.45,vol:0.09,exp:true,delay:0.12}); },\n    shard(){ for(let i=0;i<4;i++) tone({type:'square',f0:900+i*250,f1:400,dur:0.1,vol:0.05,exp:true,delay:i*0.03}); },\n    slow(){ tone({type:'sine',f0:600,f1:120,dur:0.9,vol:0.13,exp:true}); },\n    chain(i){ tone({type:'triangle',f0:400+i*90,f1:150,dur:0.16,vol:0.09,exp:true}); },\n    mirror(){ tone({type:'triangle',f0:800,f1:1600,dur:0.2,vol:0.09,exp:true}); tone({type:'triangle',f0:1600,f1:800,dur:0.2,vol:0.07,exp:true,delay:0.04}); },\n    rubber(){ tone({type:'sine',f0:220,f1:700,dur:0.22,vol:0.12,exp:true}); },\n    gravity(){ tone({type:'sine',f0:900,f1:70,dur:0.8,vol:0.14,exp:true}); },\n    wave(){ [523,659,784,1046].forEach((f,i)=>tone({type:'triangle',f0:f,dur:0.28,vol:0.10,delay:i*0.085})); },\n    extra(){ [660,880,1320].forEach((f,i)=>tone({type:'square',f0:f,dur:0.16,vol:0.10,delay:i*0.07})); },\n    over(){ [440,330,247,165].forEach((f,i)=>tone({type:'sawtooth',f0:f,f1:f*0.5,dur:0.5,vol:0.14,exp:true,delay:i*0.16})); },\n    blink(){ tone({type:'sine',f0:1800,f1:420,dur:0.18,vol:0.08,exp:true}); }\n  };\n})();\n\n/* ---------------- orb types ---------------- */\nconst ORB_TYPES = [\n  { key:'swarm',   name:'Swarmling',   hue:130, c1:'#8dff9f', c2:'#0f5a2c', desc:'Splits into homing swarm' },\n  { key:'gravity', name:'Sinkhole',    hue:280, c1:'#c58bff', c2:'#3a0f6b', desc:'Explodes into a gravity well' },\n  { key:'phase',   name:'Phaser',      hue:190, c1:'#7ff0ff', c2:'#0a4b60', desc:'Blinks away & teleports' },\n  { key:'void',    name:'Voidcore',    hue:0,   c1:'#ff5b7f', c2:'#1a0008', desc:'Spawns a black hole' },\n  { key:'reverse', name:'Invertex',    hue:40,  c1:'#ffd166', c2:'#6b4200', desc:'Reverses your controls' },\n  { key:'shard',   name:'Glassbone',   hue:210, c1:'#bcd8ff', c2:'#22314f', desc:'Shatters into ricochet shards' },\n  { key:'slow',    name:'Chronobub',   hue:170, c1:'#7ff0d0', c2:'#0c4f45', desc:'Drops a time-slow bubble' },\n  { key:'chain',   name:'Chromabomb',  hue:320, c1:'#ff8bd8', c2:'#5c0b40', desc:'Chain-reaction color bomb' },\n  { key:'mirror',  name:'Twinshell',   hue:60,  c1:'#f6ff8b', c2:'#585c00', desc:'Mirror-clones itself' },\n  { key:'rubber',  name:'Bounceball',  hue:20,  c1:'#ffa46b', c2:'#5e2100', desc:'Rubber-bands off the walls' }\n];\nconst TYPE_BY_KEY = Object.fromEntries(ORB_TYPES.map(t=>[t.key,t]));\n\n/* build start-screen legend */\n(function(){\n  const el = document.getElementById('orblist');\n  ORB_TYPES.forEach(t=>{\n    const d = document.createElement('div');\n    d.className='orbcard';\n    d.innerHTML = `<span class=\"dot\" style=\"color:${t.c1}\"></span><span><b style=\"color:${t.c1}\">${t.name}</b><br>${t.desc}</span>`;\n    el.appendChild(d);\n  });\n})();\n\n/* ---------------- input ---------------- */\nconst keys = Object.create(null);\nlet pausedByKey = false;\nwindow.addEventListener('keydown', e=>{\n  const k = e.key.toLowerCase();\n  if([' ','arrowup','arrowdown','arrowleft','arrowright'].includes(k)) e.preventDefault();\n  if(keys[k]) return;\n  keys[k]=true;\n  if(k==='p' && G.state==='play'){ pausedByKey=!pausedByKey; }\n  if(k==='m'){ const m = Sound.toggle(); toast(m?'MUTED':'SOUND ON', '#9fb4d8'); }\n  if(k==='enter'){\n    if(G.state==='start') startGame();\n    else if(G.state==='over') startGame();\n  }\n  if((k==='shift') && G.state==='play') blink();\n}, {passive:false});\nwindow.addEventListener('keyup', e=>{ keys[e.key.toLowerCase()]=false; });\nwindow.addEventListener('blur', ()=>{ for(const k in keys) keys[k]=false; });\n\n/* ---------------- game state ---------------- */\nconst G = {\n  state:'start',\n  score:0, best:+(localStorage.getItem('orbfall_best')||0), lives:3, wave:0,\n  popped:0, nextExtra:5000,\n  shake:0, shakeX:0, shakeY:0,\n  slowT:0,           // time-slow bubble timer\n  reverseT:0,        // reversed controls\n  flash:0, flashC\n\nHere is a strong previous attempt at this exact challenge. IMPROVE on it — keep what works, fix its weaknesses, and elevate the visual quality and polish. Return a complete, improved single-file HTML document.\n\n=== PREVIOUS ATTEMPT (Qwen3 14B) ===\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>ORBFALL — Wild Orb Protocol</title>\n<style>\n  *{margin:0;padding:0;box-sizing:border-box;}\n  html,body{width:100%;height:100%;overflow:hidden;background:#03030a;font-family:\"Trebuchet MS\",\"Segoe UI\",system-ui,sans-serif;}\n  #wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:radial-gradient(ellipse at 50% 40%,#0b0b22 0%,#04040e 55%,#000 100%);}\n  canvas{display:block;image-rendering:auto;touch-action:none;}\n  #ui{position:absolute;inset:0;pointer-events:none;}\n  .screen{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:#e8f6ff;pointer-events:auto;\n    background:radial-gradient(ellipse at 50% 45%,rgba(20,10,60,.72) 0%,rgba(3,3,12,.93) 70%);backdrop-filter:blur(3px);}\n  .hidden{display:none!important;}\n  h1{font-size:clamp(38px,9vw,96px);letter-spacing:.14em;font-weight:900;\n     background:linear-gradient(180deg,#fff 0%,#7df 40%,#8be9ff 45%,#b06cff 100%);\n     -webkit-background-clip:text;background-clip:text;color:transparent;\n     text-shadow:0 0 40px rgba(120,180,255,.35);margin-bottom:.1em;}\n  h1 .sub{display:block;font-size:.20em;letter-spacing:.55em;color:#8fd6ff;-webkit-text-fill-color:#8fd6ff;margin-top:.4em;opacity:.85;}\n  .tag{font-size:clamp(12px,1.7vw,17px);color:#9fb4d8;letter-spacing:.18em;text-transform:uppercase;margin-bottom:26px;}\n  .keys{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-bottom:26px;max-width:min(760px,92vw);}\n  .key{border:1px solid rgba(140,190,255,.28);background:rgba(20,32,64,.5);padding:8px 14px;border-radius:9px;font-size:13px;color:#cfe4ff;letter-spacing:.08em;}\n  .key b{color:#7ff0d0;}\n  .orblist{display:grid;grid-template-columns:repeat(auto-fit,minmax(158px,1fr));gap:8px;max-width:min(880px,94vw);margin-bottom:26px;}\n  .orbcard{display:flex;align-items:center;gap:9px;background:rgba(12,18,40,.55);border:1px solid rgba(120,170,255,.16);border-radius:10px;padding:7px 10px;font-size:11.5px;color:#b9cdea;text-align:left;letter-spacing:.03em;}\n  .dot{width:15px;height:15px;border-radius:50%;flex:0 0 auto;box-shadow:0 0 10px currentColor;background:currentColor;}\n  .btn{pointer-events:auto;cursor:pointer;border:none;border-radius:999px;padding:16px 46px;font-size:19px;font-weight:800;letter-spacing:.2em;color:#04121a;\n    background:linear-gradient(135deg,#7ff0d0,#63c8ff 55%,#b06cff);box-shadow:0 0 34px rgba(99,200,255,.5),0 8px 26px rgba(0,0,0,.5);\n    transition:transform .12s ease,box-shadow .12s ease;font-family:inherit;text-transform:uppercase;}\n  .btn:hover{transform:translateY(-2px) scale(1.03);box-shadow:0 0 52px rgba(140,220,255,.75),0 10px 30px rgba(0,0,0,.55);}\n  .btn:active{transform:translateY(1px) scale(.98);}\n  .small{margin-top:20px;font-size:12px;color:#6f84a8;letter-spacing:.12em;}\n  #gameover h2{font-size:clamp(34px,7vw,72px);letter-spacing:.12em;color:#ff6f8f;text-shadow:0 0 30px rgba(255,80,120,.55);margin-bottom:.15em;font-weight:900;}\n  .statrow{display:flex;gap:34px;flex-wrap:wrap;justify-content:center;margin:18px 0 26px;}\n  .stat{min-width:110px;}\n  .stat .v{font-size:32px;font-weight:800;color:#8be9ff;text-shadow:0 0 18px rgba(100,200,255,.5);}\n  .stat .l{font-size:11px;letter-spacing:.22em;color:#7f93b6;text-transform:uppercase;margin-top:3px;}\n  #toast{position:absolute;left:50%;top:14%;transform:translateX(-50%);font-size:clamp(16px,3.2vw,30px);font-weight:900;letter-spacing:.16em;\n    text-transform:uppercase;color:#fff;opacity:0;text-shadow:0 0 22px currentColor;white-space:nowrap;transition:opacity 0.3s;}\n  #wavebanner{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);font-size:clamp(30px,8vw,86px);font-weight:900;letter-spacing:.28em;\n    color:#fff;opacity:0;text-shadow:0 0 40px #63c8ff;white-space:nowrap;transition:opacity 0.5s;}\n</style>\n</head>\n<body>\n<div id=\"wrap\">\n  <canvas id=\"cv\"></canvas>\n  <div id=\"ui\">\n    <div id=\"toast\"></div>\n    <div id=\"wavebanner\"></div>\n\n    <div id=\"start\" class=\"screen\">\n      <h1>ORBFALL<span class=\"sub\">wild orb protocol</span></h1>\n      <div class=\"tag\">Ten orbs. Ten kinds of chaos. Shoot carefully.</div>\n      <div class=\"keys\">\n        <div class=\"key\"><b>←→</b> / <b>A D</b> rotate</div>\n        <div class=\"key\"><b>↑</b> / <b>W</b> thrust</div>\n        <div class=\"key\"><b>SPACE</b> fire</div>\n        <div class=\"key\"><b>SHIFT</b> blink</div>\n        <div class=\"key\"><b>P</b> pause</div>\n        <div class=\"key\"><b>M</b> mute</div>\n      </div>\n      <div class=\"orblist\" id=\"orblist\"></div>\n      <button class=\"btn\" id=\"startBtn\">Launch</button>\n      <div class=\"small\">Screen wraps. Inertia is real. Nothing is safe.</div>\n    </div>\n\n    <div id=\"gameover\" class=\"screen hidden\">\n      <h2>SIGNAL LOST</h2>\n      <div class=\"tag\" id=\"goSub\">the orbs got you</div>\n      <div class=\"statrow\">\n        <div class=\"stat\"><div class=\"v\" id=\"goScore\">0</div><div class=\"l\">Score</div></div>\n        <div class=\"stat\"><div class=\"v\" id=\"goWave\">1</div><div class=\"l\">Wave</div></div>\n        <div class=\"stat\"><div class=\"v\" id=\"goPopped\">0</div><div class=\"l\">Orbs Popped</div></div>\n        <div class=\"stat\"><div class=\"v\" id=\"goBest\">0</div><div class=\"l\">Best</div></div>\n      </div>\n      <button class=\"btn\" id=\"againBtn\">Again</button>\n      <div class=\"small\">Press ENTER to relaunch</div>\n    </div>\n  </div>\n</div>\n\n<script>\n\"use strict\";\nconst cv = document.getElementById('cv');\nconst ctx = cv.getContext('2d', {alpha: false});\nlet W = 0, H = 0, DPR = 1;\n\nfunction resize() {\n  DPR = Math.min(window.devicePixelRatio || 1, 2);\n  W = window.innerWidth;\n  H = window.innerHeight;\n  cv.width = Math.floor(W * DPR);\n  cv.height = Math.floor(H * DPR);\n  cv.style.width = W + 'px';\n  cv.style.height = H + 'px';\n  ctx.setTransform(DPR, 0, 0, DPR, 0, 0);\n}\nwindow.addEventListener('resize', resize);\nresize();\n\nconst TAU = Math.PI * 2;\n\nconst rand = (a = 1, b = 0) => b + Math.random() * (a - b);\nconst randi = (a, b) => Math.floor(rand(a, b));\nconst pick = arr => arr[Math.floor(Math.random() * arr.length)];\nconst clamp = (v, a, b) => v < a ? a : v > b ? b : v;\nconst lerp = (a, b, t) => a + (b - a) * t;\n\nfunction wrapDelta(a, b, size) {\n  let d = b - a;\n  if (d > size / 2) d -= size;\n  if (d < -size / 2) d += size;\n  return d;\n}\nfunction wrapPos(o) {\n  if (o.x < -40) o.x += W + 80; else if (o.x > W + 40) o.x -= W + 80;\n  if (o.y < -40) o.y += H + 80; else if (o.y > H + 40) o.y -= H + 80;\n}\nfunction torDist(ax, ay, bx, by) {\n  const dx = wrapDelta(ax, bx, W);\n  const dy = wrapDelta(ay, by, H);\n  return Math.hypot(dx, dy);\n}\n\nconst Sound = (() => {\n  let actx = null, master = null, muted = false;\n  function ensure() {\n    if (actx) return actx;\n    try {\n      actx = new (window.AudioContext || window.webkitAudioContext)();\n      master = actx.createGain();\n      master.gain.value = 0.5;\n      master.connect(actx.destination);\n    } catch (e) {\n      actx = null;\n    }\n    return actx;\n  }\n  function now() { return actx ? actx.currentTime : 0; }\n  function tone(opt) {\n    const A = ensure();\n    if (!A || muted) return;\n    if (A.state === 'suspended') A.resume();\n    const t0 = A.currentTime + (opt.delay || 0);\n    const o = A.createOscillator();\n    const g = A.createGain();\n    o.type = opt.type || 'sine';\n    o.frequency.setValueAtTime(opt.f0 || 440, t0);\n    if (opt.f1 != null) {\n      if (opt.exp) o.frequency.exponentialRampToValueAtTime(Math.max(1, opt.f1), t0 + (opt.dur || 0.2));\n      else o.frequency.linearRampToValueAtTime(opt.f1, t0 + (opt.dur || 0.2));\n    }\n    const vol = (opt.vol == null ? 0.2 : opt.vol);\n    g.gain.setValueAtTime(0.0001, t0);\n    g.gain.exponentialRampToValueAtTime(Math.max(0.0001, vol), t0 + 0.008);\n    g.gain.exponentialRampToValueAtTime(0.0001, t0 + (opt.dur || 0.2));\n    let node = o;\n    if (opt.filter) {\n      const f = A.createBiquadFilter();\n      f.type = opt.filter;\n      f.frequency.value = opt.fc || 900;\n      node.connect(f);\n      f.connect(g);\n    } else node.connect(g);\n    g.connect(master);\n    o.start(t0);\n    o.stop(t0 + (opt.dur || 0.2) + 0.05);\n  }\n  function noise(opt) {\n    const A = ensure();\n    if (!A || muted) return;\n    if (A.state === 'suspended') A.resume();\n    const dur = opt.dur || 0.3;\n    const len = Math.floor(A.sampleRate * dur);\n    const buf = A.createBuffer(1, len, A.sampleRate);\n    const d = buf.getChannelData(0);\n    for (let i = 0; i < len; i++) {\n      d[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / len, opt.decay || 2);\n    }\n    const s = A.createBufferSource();\n    s.buffer = buf;\n    const f = A.createBiquadFilter();\n    f.type = opt.filter || 'lowpass';\n    f.frequency.setValueAtTime(opt.fc || 1200, A.currentTime);\n    if (opt.fc1 != null) f.frequency.exponentialRampToValueAtTime(Math.max(40, opt.fc1), A.currentTime + dur);\n    const g = A.createGain();\n    g.gain.value = (opt.vol == null ? 0.25 : opt.vol);\n    s.connect(f);\n    f.connect(g);\n    g.connect(master);\n    s.start();\n    s.stop(A.currentTime + dur + 0.02);\n  }\n  return {\n    ensure,\n    toggle() {\n      muted = !muted;\n      if (master) master.gain.value = muted ? 0 : 0.5;\n      return muted;\n    },\n    isMuted() { return muted; },\n    shoot() {\n      tone({ type: 'square', f0: 880, f1: 180, dur: 0.09, vol: 0.07, exp: true });\n    },\n    thrust() {\n      noise({ dur: 0.06, fc: 420, vol: 0.035, decay: 1 });\n    },\n    pop(hue) {\n      tone({ type: 'triangle', f0: 300 + hue * 1.4, f1: 90, dur: 0.22, vol: 0.13, exp: true });\n      noise({ dur: 0.22, fc: 2400, fc1: 200, vol: 0.10 });\n    },\n    boom() {\n      noise({ dur: 0.7, fc: 1400, fc1: 60, vol: 0.32, decay: 1.6 });\n      tone({ type: 'sine', f0: 120, f1: 30, dur: 0.6, vol: 0.2, exp: true });\n    },\n    hurt() {\n      tone({ type: 'sawtooth', f0: 200, f1: 50, dur: 0.5, vol: 0.2, exp: true });\n      noise({ dur: 0.4, fc: 800, fc1: 80, vol: 0.2 });\n    },\n    blackhole() {\n      tone({ type: 'sine', f0: 40, f1: 220, dur: 1.2, vol: 0.16, exp: true });\n      noise({ dur: 1.2, fc: 120, fc1: 1800, vol: 0.10, decay: 0.6 });\n    },\n    swarm() {\n      tone({ type: 'sawtooth', f0: 520, f1: 1400, dur: 0.3, vol: 0.09, exp: true });\n    },\n    phase() {\n      tone({ type: 'sine', f0: 1400, f1: 280, dur: 0.28, vol: 0.11, exp: true });\n      tone({ type: 'sine', f0: 700, f1: 2000, dur: 0.28, vol: 0.07, exp: true, delay: 0.05 });\n    },\n    reverse() {\n      tone({ type: 'square', f0: 160, f1: 520, dur: 0.45, vol: 0.11, exp: true });\n      tone({ type: 'square', f0: 520, f1: 160, dur: 0.45, vol: 0.09, exp: true, delay: 0.12 });\n    },\n    shard() {\n      for (let i = 0; i < 4; i++)\n        tone({ type: 'square', f0: 900 + i * 250, f1: 400, dur: 0.1, vol: 0.05, exp: true, delay: i * 0.03 });\n    },\n    slow() {\n      tone({ type: 'sine', f0: 600, f1: 120, dur: 0.9, vol: 0.13, exp: true });\n    },\n    chain(i) {\n      tone({ type: 'triangle', f0: 400 + i * 90, f1: 150, dur: 0.16, vol: 0.09, exp: true });\n    },\n    mirror() {\n      tone({ type: 'triangle', f0: 800, f1: 1600, dur: 0.2, vol: 0.09, exp: true });\n      tone({ type: 'triangle', f0: 1600, f1: 800, dur: 0.2, vol: 0.07, exp: true, delay: 0.04 });\n    },\n    rubber() {\n      tone({ type: 'sine', f0: 220, f1: 700, dur: 0.22, vol: 0.12, exp: true });\n    },\n    gravity() {\n      tone({ type: 'sine', f0: 900, f1: 70, dur: 0.8, vol: 0.14, exp: true });\n    },\n    wave() {\n      [523, 659, 784, 1046].forEach((f, i) =>\n        tone({ type: 'triangle', f0: f, dur: 0.28, vol: 0.10, delay: i * 0.085 })\n      );\n    },\n    extra() {\n      [660, 880, 1320].forEach((f, i) =>\n        tone({ type: 'square', f0: f, dur: 0.16, vol: 0.10, delay: i * 0.07 })\n      );\n    },\n    over() {\n      [440, 330, 247, 165].forEach((f, i) =>\n        tone({ type: 'sawtooth', f0: f, f1: f * 0.5, dur: 0.5, vol: 0.14, exp: true, delay: i * 0.16 })\n      );\n    },\n    blink() {\n      tone({ type: 'sine', f0: 1800, f1: 420, dur: 0.18, vol: 0.08, exp: true });\n    }\n  };\n})();\n\nconst ORB_TYPES = [\n  { key: 'swarm', name: 'Swarmling', hue: 130, c1: '#8dff9f', c2: '#0f5a2c', desc: 'Splits into homing swarm' },\n  { key: 'gravity', name: 'Sinkhole', hue: 280, c1: '#c58bff', c2: '#3a0f6b', desc: 'Explodes into a gravity well' },\n  { key: 'phase', name: 'Phaser', hue: 190, c1: '#7ff0ff', c2: '#0a4b60', desc: 'Blinks away & teleports' },\n  { key: 'void', name: 'Voidcore', hue: 0, c1: '#ff5b7f', c2: '#1a0008', desc: 'Spawns a black hole' },\n  { key: 'reverse', name: 'Invertex', hue: 40, c1: '#ffd166', c2: '#6b4200', desc: 'Reverses your controls' },\n  { key: 'shard', name: 'Glassbone', hue: 210, c1: '#bcd8ff', c2: '#22314f', desc: 'Shatters into ricochet shards' },\n  { key: 'slow', name: 'Chronobub', hue: 170, c1: '#7ff0d0', c2: '#0c4f45', desc: 'Drops a time-slow bubble' },\n  { key: 'chain', name: 'Chromabomb', hue: 320, c1: '#ff8bd8', c2: '#5c0b40', desc: 'Chain-reaction color bomb' },\n  { key: 'mirror', name: 'Twinshell', hue: 60, c1: '#f6ff8b', c2: '#585c00', desc: 'Mirror-clones itself' },\n  { key: 'rubber', name: 'Bounceball', hue: 20, c1: '#ffa46b', c2: '#5e2100', desc: 'Rubber-bands off the walls' }\n];\nconst TYPE_BY_KEY = Object.fromEntries(ORB_TYPES.map(t => [t.key, t]));\n\nfunction buildStartScreen() {\n  const el = document.getElementById('orblist');\n  ORB_TYPES.forEach(t => {\n    const d = document.createElement('div');\n    d.className = 'orbcard';\n    d.innerHTML = `<span class=\"dot\" style=\"color:${t.c1}\"></span><span><b style=\"color:${t.c1}\">${t.name}</b><br>${t.desc}</span>`;\n    el.appendChild(d);\n  });\n}\n\nbuildStartScreen();\n\nconst keys = Object.create(null);\nlet pausedByKey = false;\ndocument.addEventListener('keydown', e => {\n  const k = e.key.toLowerCase();\n  if ([' ', 'arrowup', 'arrowdown', 'arrowleft', 'arrowright'].includes(k)) e.preventDefault();\n  if (keys[k]) return;\n  keys[k] = true;\n  if (k === 'p' && G.state === 'play') {\n    pau",
+    "remixOf": "46d29b76eccd",
+    "remixSource": "qwen3-14b",
+    "designTools": false,
+    "created_at": "2026-09-09T03:48:39.404Z",
+    "winner": null,
+    "runs": [
+      {
+        "model": "qwen3-14b",
+        "status": "done",
+        "error": null,
+        "seconds": 320,
+        "cost": 0,
+        "started_at": "2026-09-09T03:48:39.444Z",
+        "finished_at": "2026-09-09T03:53:59.141Z",
+        "queued_at": "2026-09-09T03:48:39.413Z",
+        "bytes": 31428,
+        "thumb": true,
+        "aiScore": 9,
+        "aiReason": "The game is well-polished and fulfills the challenge requirements effectively.",
+        "aiScores": {
+          "qwen2.5vl:7b": 9
+        },
+        "aiSpread": 0
+      },
+      {
+        "model": "gemma3-12b",
+        "status": "done",
+        "error": null,
+        "seconds": 227,
+        "cost": 0,
+        "started_at": "2026-09-09T03:53:59.150Z",
+        "finished_at": "2026-09-09T03:57:46.128Z",
+        "queued_at": "2026-09-09T03:48:39.420Z",
+        "bytes": 14449,
+        "thumb": true,
+        "aiScore": 9,
+        "aiReason": "The game is well-polished and fulfills the challenge requirements effectively.",
+        "aiScores": {
+          "qwen2.5vl:7b": 9
+        },
+        "aiSpread": 0
+      },
+      {
+        "model": "hermes3-8b",
+        "status": "done",
+        "error": null,
+        "seconds": 122,
+        "cost": 0,
+        "started_at": "2026-09-09T03:57:46.149Z",
+        "finished_at": "2026-09-09T03:59:48.566Z",
+        "queued_at": "2026-09-09T03:48:39.428Z",
+        "bytes": 16097,
+        "thumb": true,
+        "aiScore": 9,
+        "aiReason": "The game is well-polished and fulfills the challenge requirements effectively.",
+        "aiScores": {
+          "qwen2.5vl:7b": 9
+        },
+        "aiSpread": 0
+      },
+      {
+        "model": "claude-code",
+        "status": "done",
+        "error": null,
+        "seconds": 350,
+        "cost": 0,
+        "started_at": "2026-09-09T03:48:39.453Z",
+        "finished_at": "2026-09-09T03:54:29.103Z",
+        "queued_at": "2026-09-09T03:48:39.436Z",
+        "bytes": 63992,
+        "thumb": true,
+        "aiScore": 9,
+        "aiReason": "The game is visually appealing and well-polished, fulfilling the challenge requirements effectively.",
+        "aiScores": {
+          "qwen2.5vl:7b": 9
+        },
+        "aiSpread": 0
+      }
+    ],
+    "judging": false,
+    "aiPick": "qwen3-14b",
+    "judged_at": "2026-09-09T04:00:32.406Z"
   }
 ]
\ No newline at end of file

← 67fe258 auto-data-snapshot: 2026-09-08T17:31:26 (1 data files) — dat  ·  back to Model Arena  ·  auto-data-snapshot: 2026-09-09T07:22:07 (2 data files) — dat 436c67e →