27:18Gemini 4 Hydrogen: Cheaper Tokens, More Expensive Answers?
Nov 13, 2026 · YouTube
18:40ERNIE 5.5 Flash Preview vs GLM 5.3 Flash: Baidu's new model is very impressive!
Nov 11, 2026 · YouTube
36:22Fable 5.2 robbing me blind, plus: Nex AGI's N2.6 vs GLM 5.3 Flash
Nov 11, 2026 · YouTube
14:03Gemini 4 Carbon: Can it handle my challenges? (First look with one-shot coding tests)
Nov 10, 2026 · YouTube
47:51Ranking major U.S. Open-Weights Models. (Where does Ripple 65B fit in?)
Nov 6, 2026 · YouTube
10:57"Crouton Alpha": the latest super-efficient coding model by Meta?
Nov 3, 2026 · YouTube
38:58Testing Particle-1: a post-trained DeepSeek V4.1 Flash specializing in coding and efficiency
Oct 28, 2026 · YouTube
22:14GPT-6.1 Terra Pro vs Terra: How Much Better Is Pro?
Oct 27, 2026 · YouTube
29:55Kimi K3.1 Pro Looked Incredible. Then I Kept Testing.
Oct 26, 2026 · YouTube
31:28Is this company reselling GPT Sol 6.1 at a loss (for non-agentic/text-only)?🤔 Is this sustainable?
Oct 20, 2026 · YouTube
17:58Nemotron 3.5 Super VL vs Opus 5.5: Testing NVIDIA’s new coding juggernaut
Oct 15, 2026 · YouTube
16:04Testing a *massive* new open-weights model 🤯: Muse Spark Open (vs. Nemotron, Opus 5.5, and more)
Oct 15, 2026 · YouTube
16:43Gemini 4 Argon: Great 🐈 Animation, but a broken escalator. (Coding challenge vs Opus 5.5, Sol 6.1)
Oct 13, 2026 · YouTube
16:37Meta's new "Muse Wonder" AI is impressive... but can it compete with Anthropic's models?
Oct 12, 2026 · YouTube
11:12WOW... Haiku 5.5 is very impressive. RIP OpenAI?
Oct 7, 2026 · YouTube
22:47Mistral Large 4 Is Cheap. But Is It Good Enough to Compete?
Oct 6, 2026 · YouTube
22:02Is Pareto 26.10 Preview Just Routing to GPT Sol? I Tested It Against Sol 6.1 Pro
Oct 1, 2026 · YouTube
11:22I Tested Sonnet 5.5 Against Opus 5.5. Is It Actually Cheaper?
Sep 28, 2026 · YouTube
You write simulations where the interesting behavior is supposed to come out of the dice rather than be animated by hand.
Build me a single HTML page: a Starbucks-style coffee shop running a bizarre promotion, simulated live.
data: URIs are fine.localStorage, sessionStorage, cookies or indexedDB — sandboxed frame, they throw.html block.One paragraph, before the file. Given your own timings — how long a customer stays inside holding a drink, how fast the counter serves — roughly how many customers should pass through between catastrophes? Show the working, not just the number.
The single fenced html block.
Having written it, what does the page do in its first few minutes? Name anything you tuned, special-cased or nudged. Say what it does badly — I am going to leave it running and watch the counters.
With a 3.0s serve cycle (1.2s ordering plus 1.8s making) and a 10–14s linger holding the drink (average about 12s), roughly four finished drinks overlap inside at once because 12 divided by 3 is 4, so at any moment the shop holds a sliding window of about the last 4 customers and an event needs 3 or more unicorns among them, and for n=4 and p=1/6 the binomial math is P(3)+P(4) = 4×(1/6)³×(5/6)+(1/6)⁴ = 21/1296 ≈ 1.62%, meaning each fresh drink has about a 1-in-62 chance of completing a triple given steady flow, so you should expect roughly 50–70 customers served between catastrophes or about 3 minutes at 1× speed, faster in wall-clock if you fast-forward since speed only scales dt and never touches the die.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>STARBRUCKS — Neon Unicorn Promo (live sim)</title>
<style>
*{box-sizing:border-box}
body{margin:0;background:#0b0e1a;color:#eee;font-family:Verdana,system-ui,sans-serif}
header{padding:10px 14px;background:linear-gradient(90deg,#0b3d2e,#0b3d2e 30%,#ff2bd1 130%);border-bottom:3px solid #00ffcc}
header h1{margin:0;font-size:20px;letter-spacing:1px}
header h1 span{color:#7dffff;text-shadow:0 0 12px #00ffcc}
header p{margin:4px 0 0;font-size:12px;color:#d8ffe9}
#wrap{display:flex;gap:10px;padding:10px;flex-wrap:wrap}
#cv{background:#11152b;border:3px solid #2affd5;border-radius:10px;box-shadow:0 0 30px #ff2bd155;max-width:100%;width:1000px;height:auto}
#side{flex:1;min-width:260px;max-width:360px;background:#12172e;border:2px solid #3a3f6b;border-radius:10px;padding:10px;font-size:13px}
#side h2{margin:0 0 6px;font-size:14px;color:#7dffff}
.stat{display:flex;justify-content:space-between;padding:3px 0;border-bottom:1px dotted #333a5e}
.stat b{color:#ffe95e}
.big{font-size:22px;color:#ff7bff;text-shadow:0 0 10px #ff2bd1}
#controls{margin-top:10px;background:#0d1226;padding:8px;border-radius:8px;border:1px solid #2affd5}
#controls label{font-size:12px}
#speed{width:100%}
button{background:#00ffcc;border:0;border-radius:6px;padding:6px 10px;font-weight:bold;cursor:pointer;margin:4px 4px 0 0}
button:hover{background:#7dffff}
#log{margin-top:8px;height:110px;overflow:hidden;font-size:11px;background:#080b18;border-radius:6px;padding:6px;color:#9ef7d0}
.warn{color:#ff5b5b;font-weight:bold}
.uni{color:#ff8cff;font-weight:bold}
footer{padding:8px 14px;font-size:11px;color:#8a90b5}
</style>
</head>
<body>
<header>
<h1>STARBRUCKS <span>★ NEON UNICORN PROMO — every Frappuccino 1-in-6 UNICORN!</span></h1>
<p>Fair d6 rolled per drink at the counter. 3 unicorns inside at once = EVENT. No timers, no quotas. Management is not responsible for reality collapse.</p>
</header>
<div id="wrap">
<canvas id="cv" width="1000" height="560"></canvas>
<div id="side">
<h2>📊 LIVE MANAGER DASHBOARD</h2>
<div class="stat"><span>Inside (max 8) / in line</span><b><span id="sInside">0</span> / <span id="sLine">0</span></b></div>
<div class="stat"><span>🦄 Unicorns inside NOW</span><b id="sNow" class="big">0</b></div>
<div class="stat"><span>Customers served</span><b id="sServed">0</b></div>
<div class="stat"><span>Neon Unicorns produced</span><b id="sUni">0</b></div>
<div class="stat"><span>Observed rate (true 16.67%)</span><b id="sRate">—</b></div>
<div class="stat"><span>Last fair d6</span><b id="sDie">—</b></div>
<div class="stat"><span>Catastrophes (EVENTS)</span><b id="sCat">0</b></div>
<div class="stat"><span>Customers vaporized / fled</span><b id="sVap">0</b></div>
<div class="stat"><span>Max unicorns at once</span><b id="sMax">0</b></div>
<div class="stat"><span>Longest line ever</span><b id="sMaxLine">0</b></div>
<div class="stat"><span>Reality stability</span><b id="sStab">100%</b></div>
<div class="stat"><span>Barista sanity</span><b id="sSan">100%</b></div>
<div class="stat"><span>Time since last EVENT</span><b id="sSince">—</b></div>
<div id="controls">
<label>⏩ Simulation speed: <b id="speedVal">1×</b> (fast-forward to next disaster!)</label>
<input id="speed" type="range" min="0.5" max="8" step="0.5" value="1">
<br>
<button id="bPause">⏸ Pause</button>
<button id="bHorn">📯 Barista pep-talk</button>
<div style="font-size:11px;margin-top:6px;color:#9ef7d0">Speed only scales time. The die is always <b>Math.random()*6</b>. Pep-talk does nothing. It helps morale.</div>
</div>
<div id="log"></div>
</div>
</div>
<footer>LEVEL 1 = 1 unicorn: subtle wrongness. LEVEL 2 = 2 unicorns: unstable. LEVEL 3+ = NEON UNICORN EVENT. Simple dots, honest dice, spectacular failure.</footer>
<script>
(function(){
"use strict";
var cv=document.getElementById('cv'),ctx=cv.getContext('2d');
var W=1000,H=560;
var TRUE_P=1/6;
var speed=1,paused=false;
document.getElementById('speed').addEventListener('input',function(e){speed=parseFloat(e.target.value);document.getElementById('speedVal').textContent=speed+'×';});
document.getElementById('bPause').addEventListener('click',function(e){paused=!paused;e.target.textContent=paused?'▶ Resume':'⏸ Pause';addLog(paused?'Simulation paused. Unicorns hold their breath.':'Resumed. The promo continues.');});
document.getElementById('bHorn').addEventListener('click',function(){addLog('Barista shouts “WE LOVE THE UNICORN!” Sanity -2%.');sanity=Math.max(0,sanity-2);burst(620,150,20,'#7dffff');});
var customers=[],particles=[],floaters=[];
var nextId=1,spawnT=0.5,simTime=0,lastEventAt=-999;
var served=0,unicornsMade=0,catastrophes=0,vaporized=0,maxConc=0,maxLine=0,sanity=100;
var mode='normal',eventT=0,rebuildT=0,collapse=0,unicornScale=0;
var server={customer:null,phase:'idle',t:0,lastRoll:null,lastRollT:99,lastWasUni:false};
var tables=[{x:435,y:455,by:null},{x:535,y:455,by:null},{x:635,y:455,by:null},{x:735,y:455,by:null},{x:835,y:455,by:null},{x:585,y:505,by:null},{x:705,y:505,by:null}];
var CQ=[{x:620,y:262},{x:515,y:322},{x:725,y:322},{x:515,y:382},{x:725,y:382},{x:620,y:382}];
var counterQueue=[];
var DOOR={x:340,y:425};
var shirtColors=['#ff6b6b','#4ecdc4','#ffe66d','#95e1d3','#f38181','#aa96da','#fcbad3','#a8e6cf'];
function rnd(a,b){return a+Math.random()*(b-a);}
function addLog(m){var l=document.getElementById('log');var d=document.createElement('div');d.textContent='t+'+Math.floor(simTime)+'s '+m;l.prepend(d);while(l.children.length>9)l.removeChild(l.lastChild);}
function burst(x,y,n,col){for(var i=0;i<n;i++){particles.push({x:x,y:y,vx:rnd(-160,160),vy:rnd(-220,40),life:rnd(0.5,1.6),max:1.6,col:col,size:rnd(2,5),grav:300});}}
function sparkle(x,y){particles.push({x:x+rnd(-12,12),y:y+rnd(-12,12),vx:rnd(-30,30),vy:rnd(-80,-10),life:rnd(0.4,1.1),max:1.1,col:'hsl('+Math.floor(rnd(0,360))+',100%,65%)',size:rnd(1.5,3.5),grav:-20});}
function insideCount(){var n=0;for(var i=0;i<customers.length;i++)if(customers[i].inside&&!customers[i].gone)n++;return n;}
function outsideList(){return customers.filter(function(c){return c.state==='outside';}).sort(function(a,b){return a.q-b.q;});}
function unicornsInside(){var n=0;for(var i=0;i<customers.length;i++){var c=customers[i];if(c.inside&&!c.gone&&c.hasDrink&&c.drink==='unicorn'&&c.state!=='fleeing')n++;}return n;}
function freeTable(){for(var i=0;i<tables.length;i++)if(!tables[i].by)return tables[i];return null;}
function spawnCustomer(){
var out=outsideList().length;
var c={id:nextId++,q:nextId,x:-20-rnd(0,40),y:DOOR.y+rnd(-6,6),tx:0,ty:0,state:'outside',inside:false,color:shirtColors[Math.floor(Math.random()*shirtColors.length)],drink:null,hasDrink:false,sipT:0,table:null,wob:rnd(0,6.28),spd:rnd(90,130),gone:false,panic:0};
customers.push(c);maxLine=Math.max(maxLine,out+1);
}
function moveTo(c,tx,ty,dt,sp){var dx=tx-c.x,dy=ty-c.y,d=Math.sqrt(dx*dx+dy*dy);if(d<4)return true;var v=(sp||c.spd)*dt;d=Math.max(d,0.001);c.x+=dx/d*Math.min(v,d);c.y+=dy/d*Math.min(v,d);return false;}
function startEvent(){
mode='EVENT';eventT=0;collapse=0;unicornScale=0;catastrophes++;
var n=insideCount();vaporized+=n;lastEventAt=simTime;
addLog('🌈🌈🌈 NEON UNICORN EVENT! '+n+' customers inside simultaneously held unicorns. Shop condemned.');
for(var i=0;i<customers.length;i++){var c=customers[i];if(c.inside){c.state='fleeing';c.panic=rnd(0,6.28);c.table=null;}}
for(var t=0;t<tables.length;t++)tables[t].by=null;
counterQueue=[];server.customer=null;server.phase='idle';
for(var k=0;k<120;k++)particles.push({x:rnd(380,920),y:rnd(150,450),vx:rnd(-300,300),vy:rnd(-400,50),life:rnd(0.8,2.2),max:2.2,col:['#ff2bd1','#00ffcc','#ffe95e','#ff6b6b'][k%4],size:rnd(2,7),grav:350});
}
function update(dt){
simTime+=dt;
// spawn
if(mode==='normal'){spawnT-=dt;if(spawnT<=0){var out=outsideList().length;if(out<14&&customers.length<30)spawnCustomer();spawnT=rnd(0.7,1.6);}}
// outside queue advance
var ol=outsideList();
for(var i=0;i<ol.length;i++){var c=ol[i];var lx=DOOR.x-34-i*30,ly=DOOR.y+Math.sin(simTime*3+c.wob)*3;
if(i===0&&mode==='normal'&&insideCount()<8){
c.state='entering';c.inside=true;c.tx=DOOR.x;c.ty=DOOR.y;counterQueue.push(c);
}else{moveTo(c,lx,ly,dt,110);}
}
// server
server.lastRollT+=dt;
if(mode==='normal'){
if(!server.customer){
// find front of counterQueue that is near its spot
if(counterQueue.length>0){var f=counterQueue[0];
if(f.state==='entering'||f.state==='toCounter'||f.state==='ordering'){
server.customer=f;server.phase='ordering';server.t=1.2;f.state='ordering';
}
}
}else{
server.t-=dt;
if(server.t<=0){
if(server.phase==='ordering'){server.phase='making';server.t=1.8;}
else if(server.phase==='making'){
// THE FAIR DIE — one roll, nothing else decides
var roll=1+Math.floor(Math.random()*6);
var isUni=(roll===6);
server.lastRoll=roll;server.lastRollT=0;server.lastWasUni=isUni;
var cust=server.customer;
cust.drink=isUni?'unicorn':'normal';cust.hasDrink=true;
served++;if(isUni){unicornsMade++;addLog('🦄 Customer #'+cust.id+' rolled a 6 — NEON UNICORN! ('+unicornsMade+'/'+served+')');burst(cust.x,cust.y-18,14,'#ff2bd1');}
// send to table
counterQueue.shift();
var tb=freeTable();
if(tb){tb.by=cust;cust.table=tb;cust.tx=tb.x+rnd(-4,4);cust.ty=tb.y;}
else{cust.tx=rnd(430,860);cust.ty=rnd(440,510);}
cust.state='toTable';
server.customer=null;server.phase='idle';
}
}
}
// move counter queue customers to spots
for(var qi=0;qi<counterQueue.length;qi++){var q=counterQueue[qi];if(q===server.customer)continue;if(q.state==='entering'||q.state==='toCounter'||q.state==='ordering'){q.state='toCounter';var s=CQ[Math.min(qi,CQ.length-1)];moveTo(q,s.x,s.y+Math.sin(simTime*2+q.wob)*2,dt,150);}}
if(server.customer){var sc=server.customer;var s0=CQ[0];moveTo(sc,s0.x,s0.y,dt,160);}
}
// customers states
for(var ci=customers.length-1;ci>=0;ci--){var a=customers[ci];
if(a.state==='entering'){if(moveTo(a,DOOR.x,DOOR.y,dt,150)){a.state='toCounter';}}
else if(a.state==='toTable'){if(moveTo(a,a.tx,a.ty,dt,140)){a.state='sipping';a.sipT=rnd(10,14);}}
else if(a.state==='sipping'){a.sipT-=dt;if(Math.random()<dt*2&&a.drink==='unicorn')sparkle(a.x,a.y-14);if(a.sipT<=0){a.state='leaving';if(a.table){a.table.by=null;a.table=null;}}}
else if(a.state==='leaving'){if(moveTo(a,DOOR.x,DOOR.y,dt,170)){a.state='goneOut';}}
else if(a.state==='goneOut'){if(moveTo(a,-40,DOOR.y,dt,200)){a.gone=true;a.inside=false;customers.splice(ci,1);continue;}}
else if(a.state==='fleeing'){a.panic+=dt*6;a.x+=Math.cos(a.panic)*220*dt;a.y+=(Math.sin(a.panic)*80-60)*dt;if(a.x<-50||a.x>1050||a.y<0||a.y>620||eventT>7){a.gone=true;a.inside=false;customers.splice(ci,1);continue;}}
}
// particles
for(var pi=particles.length-1;pi>=0;pi--){var p=particles[pi];p.life-=dt;if(p.life<=0){particles.splice(pi,1);continue;}p.vy+=p.grav*dt;p.x+=p.vx*dt;p.y+=p.vy*dt;}
var uniNow=unicornsInside();maxConc=Math.max(maxConc,uniNow);
if(mode==='normal'&&uniNow>=3)startEvent();
if(mode==='EVENT'){eventT+=dt;collapse=Math.min(1,eventT/2.2);unicornScale=Math.min(1,Math.max(0,(eventT-2.0)/2.5));
if(Math.random()<dt*30)burst(rnd(400,900),rnd(200,400),6,['#ff2bd1','#00ffcc','#ffe95e'][Math.floor(Math.random()*3)]);
if(eventT>9){mode='REBUILD';rebuildT=0;}
}else if(mode==='REBUILD'){rebuildT+=dt;if(rebuildT>2.5){mode='normal';collapse=0;addLog('🏗 Shop rebuilt (again). Promo resumes. Inspectors bribed.');}}
sanity=Math.max(8,Math.min(100,sanity-dt*(uniNow===2?1.2:uniNow===1?0.15:-0.6)));
}
function drawBuilding(level,uniNow){
var bx=340,by=60,bw=620,bh=460;
var jx=0,jy=0;
if(level>=2&&mode==='normal'){jx=rnd(-4,4);jy=rnd(-4,4);}
if(mode==='EVENT'){var s=eventT<1?8:eventT<2.5?16:4;jx=rnd(-s,s);jy=rnd(-s,s);}
ctx.save();ctx.translate(jx,jy);
if(mode==='REBUILD'){var k=rebuildT/2.5;var sc=0.2+0.8*(1-Math.pow(1-k,3));ctx.translate(bx+bw/2,by+bh);ctx.scale(sc,sc);ctx.translate(-(bx+bw/2),-(by+bh));}
// collapse transform
var tilt=0,drop=0;
if(mode==='EVENT'){tilt=collapse*0.12;drop=collapse*60;}
ctx.save();ctx.translate(bx+bw/2,by+bh);ctx.rotate(tilt);ctx.translate(-(bx+bw/2),-(by+bh-drop*0.2));
// walls
var wallCol=mode==='normal'?(level===1?'#3a4a3a':level>=2?(Math.floor(simTime*6)%2?'#4a2a4a':'#2a3a5a'):'#f5f0e6'):'#5a5a6a';
ctx.fillStyle=wallCol;ctx.fillRect(bx,by+bh*0.35,bw,bh*0.65);
ctx.fillStyle='#0b3d2e';ctx.fillRect(bx,by,bw,bh*0.35);
// roof (flies off in event)
ctx.save();
if(mode==='EVENT'&&eventT>1.2){ctx.translate(0,-(eventT-1.2)*90);ctx.rotate((eventT-1.2)*0.5);}
ctx.fillStyle='#8b5a2b';ctx.beginPath();ctx.moveTo(bx-20,by+bh*0.35);ctx.lineTo(bx+bw/2,by-30);ctx.lineTo(bx+bw+20,by+bh*0.35);ctx.closePath();ctx.fill();
ctx.restore();
// sign
ctx.fillStyle='#111';ctx.fillRect(bx+140,by+40,bw-280,64);
ctx.font='bold 26px Verdana';ctx.textAlign='center';
var flick=level===1&&Math.random()<0.06;
ctx.fillStyle=flick?'#ff2bd1':'#ffffff';
ctx.shadowColor=flick?'#ff2bd1':'#00ffcc';ctx.shadowBlur=level>=1?18:6;
ctx.fillText(level>=2&&Math.floor(simTime*6)%2?'★ STARBRUCKS ★':'STARBRUCKS ★ UNICORN PROMO',bx+bw/2,by+82);
ctx.shadowBlur=0;
// windows
for(var wi=0;wi<3;wi++){var wx=bx+60+wi*200,wy=by+130,ww=140,wh=70;
ctx.fillStyle=level>=2?(Math.floor(simTime*8+wi)%2?'#ff2bd1':'#00ffcc'):(level===1&&wi===1?'#ffb3ff':'#bfefff');
ctx.fillRect(wx,wy,ww,wh);ctx.strokeStyle='#333';ctx.strokeRect(wx,wy,ww,wh);
if(level===1&&wi===2){ctx.fillStyle='#000';ctx.beginPath();ctx.arc(wx+ww/2,wy+wh/2,12,0,7);ctx.fill();ctx.fillStyle='#ff0000';ctx.beginPath();ctx.arc(wx+ww/2,wy+wh/2,5,0,7);ctx.fill();}
}
// crooked picture wrongness level1
ctx.save();ctx.translate(bx+80,by+330);ctx.rotate(level>=1?0.35:0);ctx.fillStyle='#c9a';ctx.fillRect(-22,-16,44,32);ctx.fillStyle='#333';ctx.font='10px Verdana';ctx.fillText(level>=1?'???':'art',0,4);ctx.restore();
// door
ctx.fillStyle='#5b3a1e';ctx.fillRect(DOOR.x-14,DOOR.y-60,44,90);ctx.fillStyle='#7dffff';ctx.fillRect(DOOR.x-14,DOOR.y-60,44,12);
// counter
ctx.fillStyle='#6b4a2a';ctx.fillRect(400,190,460,26);
ctx.fillStyle='#fff';ctx.font='11px Verdana';ctx.fillText('— PICKUP — fair d6 per cup —',620,208);
// menu
ctx.fillStyle='#1c2438';ctx.fillRect(400,120,180,55);ctx.fillStyle='#ffe95e';ctx.font='10px Verdana';ctx.fillText('FRAPPUCCINO 1/6 = 🦄',490,140);ctx.fillText('NO REFUNDS ON EVENTS',490,158);
// barista
var bxx=620,byy=150;var panic=level>=2?rnd(-4,4):0;
ctx.fillStyle='#4a2c14';ctx.fillRect(bxx-22+panic,byy-10,44,50);
ctx.fillStyle='#f2c89b';ctx.beginPath();ctx.arc(bxx+panic,byy-18,16,0,7);ctx.fill();
ctx.fillStyle='#222';ctx.fillRect(bxx-30+panic,byy-38,60,12);
if(level>=1){ctx.fillStyle='#ff2bd1';ctx.shadowColor='#ff2bd1';ctx.shadowBlur=12;ctx.beginPath();ctx.arc(bxx-6+panic,byy-18,3,0,7);ctx.arc(bxx+6+panic,byy-18,3,0,7);ctx.fill();ctx.shadowBlur=0;}
else{ctx.fillStyle='#000';ctx.beginPath();ctx.arc(bxx-6+panic,byy-18,2,0,7);ctx.arc(bxx+6+panic,byy-18,2,0,7);ctx.fill();}
if(server.phase==='making'){ctx.fillStyle='#ff8cff';ctx.fillRect(bxx-24+panic+rnd(-3,3),byy+8,48,8);}
// dice display
if(server.lastRollT<4&&server.lastRoll){
ctx.fillStyle='#fff';ctx.fillRect(760,120,54,54);ctx.strokeStyle=server.lastWasUni?'#ff2bd1':'#333';ctx.lineWidth=server.lastWasUni?4:2;ctx.strokeRect(760,120,54,54);
ctx.fillStyle=server.lastWasUni?'#ff2bd1':'#111';ctx.font='bold 28px Verdana';ctx.fillText(server.lastRoll,787,158);
ctx.font='10px Verdana';ctx.fillStyle='#ffe95e';ctx.fillText(server.lastWasUni?'🦄 UNICORN!':'d6 = fair',787,186);
if(server.lastWasUni){ctx.shadowColor='#ff2bd1';ctx.shadowBlur=20;ctx.strokeStyle='#ff2bd1';ctx.strokeRect(760,120,54,54);ctx.shadowBlur=0;}
}else{ctx.fillStyle='#ffffff88';ctx.font='11px Verdana';ctx.fillText('next roll: d6 … 6 = 🦄',787,150);}
// tables
for(var ti=0;ti<tables.length;ti++){var t=tables[ti];ctx.fillStyle='#8b5a2b';ctx.beginPath();ctx.arc(t.x,t.y,20,0,7);ctx.fill();ctx.strokeStyle='#333';ctx.stroke();}
ctx.restore();
ctx.restore();
}
function drawCustomer(c,level){
ctx.save();
var bob=Math.sin(simTime*5+c.wob)*2;
ctx.translate(c.x,c.y+bob*0.3);
if(c.drink==='unicorn'&&c.hasDrink){var g=10+Math.sin(simTime*8)*4;ctx.shadowColor='hsl('+Math.floor((simTime*200+c.id*60)%360)+',100%,60%)';ctx.shadowBlur=g;}
ctx.fillStyle=c.color;ctx.beginPath();ctx.arc(0,0,11,0,7);ctx.fill();ctx.shadowBlur=0;
ctx.lineWidth=2;ctx.strokeStyle='#111';ctx.stroke();
ctx.fillStyle='#000';ctx.beginPath();ctx.arc(-3.5,-2,1.6,0,7);ctx.arc(3.5,-2,1.6,0,7);ctx.fill();
ctx.strokeStyle='#000';ctx.beginPath();ctx.arc(0,2,4,0.2,Math.PI-0.2);ctx.stroke();
if(c.hasDrink){
var dx=12,dy=-14;
if(c.drink==='unicorn'){
var hue=Math.floor((simTime*300+c.id*77)%360);
ctx.fillStyle='hsl('+hue+',100%,60%)';ctx.shadowColor='hsl('+hue+',100%,60%)';ctx.shadowBlur=16;
ctx.fillRect(dx-6,dy-8,12,14);
ctx.shadowBlur=0;ctx.fillStyle='#fff';ctx.font='9px Verdana';ctx.fillText('🦄',dx-7,dy+2);
ctx.strokeStyle='hsl('+((hue+120)%360)+',100%,60%)';ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,0,15+Math.sin(simTime*6)*2,0,7);ctx.stroke();
}else{ctx.fillStyle='#7a4a21';ctx.fillRect(dx-5,dy-6,10,12);ctx.fillStyle='#fff';ctx.fillRect(dx-5,dy-6,10,3);}
}
if(c.state==='ordering'&&server.phase==='ordering'){ctx.fillStyle='#fff';ctx.font='10px Verdana';ctx.fillText('“oat milk pls”',-24,-20);}
ctx.restore();
}
function drawGiantUnicorn(x,y,s,t){
ctx.save();ctx.translate(x,y);ctx.scale(s,s);
var dance=Math.sin(t*6)*0.25, bounce=Math.abs(Math.sin(t*4))*18;
ctx.translate(0,-bounce);
ctx.shadowColor='#ff2bd1';ctx.shadowBlur=40;
ctx.rotate(dance*0.3);
var hue=Math.floor((t*120)%360);
ctx.fillStyle='hsl('+hue+',100%,70%)';
ctx.beginPath();ctx.ellipse(0,0,90,55,0,0,7);ctx.fill();
ctx.fillStyle='hsl('+((hue+60)%360)+',100%,65%)';
var l1=Math.sin(t*10)*22,l2=Math.cos(t*10)*22;
ctx.fillRect(-60,30,18,60+l1);ctx.fillRect(-20,30,18,60-l1);ctx.fillRect(20,30,18,60+l2);ctx.fillRect(60,30,18,60-l2);
ctx.fillStyle='hsl('+((hue+120)%360)+',100%,60%)';
ctx.beginPath();ctx.ellipse(70,-50,28,42,-0.4,0,7);ctx.fill();
ctx.fillStyle='#fff';ctx.beginPath();ctx.arc(78,-62,6,0,7);ctx.fill();ctx.fillStyle='#ff2bd1';ctx.beginPath();ctx.arc(78,-62,2.5,0,7);ctx.fill();
ctx.fillStyle='#ffe95e';ctx.beginPath();ctx.moveTo(88,-88);ctx.lineTo(104,-140-Math.sin(t*8)*10);ctx.lineTo(96,-86);ctx.closePath();ctx.fill();
ctx.lineWidth=10;for(var i=0;i<5;i++){ctx.strokeStyle='hsl('+((hue+i*50)%360)+',100%,60%)';ctx.beginPath();ctx.moveTo(48,-70-i*8);ctx.quadraticCurveTo(10,-80-i*10+Math.sin(t*7+i)*12,-30,-60-i*8);ctx.stroke();}
ctx.shadowBlur=0;ctx.restore();
}
function draw(){
var uniNow=mode==='normal'?unicornsInside():(eventT>1?3:unicornsInside());
var level=mode!=='normal'?3:(uniNow>=3?3:uniNow);
// sky
var grd=ctx.createLinearGradient(0,0,0,H);
if(level>=2&&mode==='normal'){var f=Math.floor(simTime*6)%2;grd.addColorStop(0,f?'#2a0a3a':'#0a2a3a');grd.addColorStop(1,f?'#ff2bd1':'#00ffcc');}
else if(mode==='EVENT'){grd.addColorStop(0,'#2a0018');grd.addColorStop(1,'#ff2bd1');}
else{grd.addColorStop(0,'#1a2140');grd.addColorStop(1,'#2b3a67');}
ctx.fillStyle=grd;ctx.fillRect(0,0,W,H);
ctx.fillStyle='#ffffff88';for(var si=0;si<40;si++){var sx=(si*173)%W,sy=(si*97)%120;ctx.fillRect(sx,sy,2,2);}
// ground
ctx.fillStyle='#2e2e3a';ctx.fillRect(0,400,W,160);
ctx.fillStyle='#444455';ctx.fillRect(0,400,W,14);
ctx.fillStyle='#ffe95e';ctx.font='bold 13px Verdana';ctx.textAlign='left';ctx.fillText('SIDEWALK OF DESTINY — please queue here',10,392);
drawBuilding(level,uniNow);
// queue dots + inside sorted
var sorted=customers.slice().sort(function(a,b){return a.y-b.y;});
for(var i=0;i<sorted.length;i++)drawCustomer(sorted[i],level);
// particles
for(var p=0;p<particles.length;p++){var pt=particles[p];ctx.globalAlpha=Math.max(0,pt.life/pt.max);ctx.fillStyle=pt.col;ctx.beginPath();ctx.arc(pt.x,pt.y,pt.size,0,7);ctx.fill();}
ctx.globalAlpha=1;
// overlays
if(level===1&&mode==='normal'){ctx.fillStyle='rgba(255,43,209,0.07)';ctx.fillRect(340,60,620,460);
ctx.fillStyle='#ffb3ff';ctx.font='bold 13px Verdana';ctx.textAlign='center';ctx.fillText('✨ something is slightly wrong in here… ✨',650,540);}
if(level===2&&mode==='normal'){ctx.fillStyle='rgba(255,43,209,'+(0.08+0.06*Math.sin(simTime*10))+')';ctx.fillRect(0,0,W,H);
ctx.fillStyle='#ff5b5b';ctx.font='bold 20px Verdana';ctx.textAlign='center';
if(Math.floor(simTime*4)%2===0){ctx.fillStyle='#ffe95e';ctx.fillRect(300,18,400,34);ctx.fillStyle='#000';}
ctx.fillText('⚠ 2 UNICORNS — REALITY UNSTABLE ⚠',500,42);
ctx.fillStyle='#7dffff';ctx.font='12px Verdana';ctx.fillText('stability '+Math.floor(40+Math.sin(simTime*5)*15)+'%',500,60);}
if(mode==='EVENT'){
if(eventT<2.5){ctx.fillStyle='rgba(255,255,255,'+Math.max(0,1-eventT)+')';ctx.fillRect(0,0,W,H);
ctx.fillStyle='#ff6b00';for(var e=0;e<8;e++){var ex=400+e*70,er=30+eventT*60*Math.random();ctx.globalAlpha=0.6;ctx.beginPath();ctx.arc(ex,300+Math.sin(e)*40,er,0,7);ctx.fill();}ctx.globalAlpha=1;}
if(unicornScale>0){drawGiantUnicorn(650,330,1.6*unicornScale+0.2,eventT);
ctx.textAlign='center';ctx.font='bold 44px Verdana';ctx.fillStyle='#ffe95e';ctx.shadowColor='#ff2bd1';ctx.shadowBlur=30;
ctx.fillText('NEON UNICORN EVENT',500,90+Math.sin(eventT*5)*6);ctx.shadowBlur=0;
ctx.font='bold 16px Verdana';ctx.fillStyle='#fff';ctx.fillText('HE HAS COME TO DANCE. THE SHOP IS GONE. WORTH IT.',500,118);}
}
// HUD top-left
ctx.textAlign='left';ctx.fillStyle='#0b0e1a';ctx.fillRect(8,8,250,64);ctx.strokeStyle='#2affd5';ctx.strokeRect(8,8,250,64);
ctx.fillStyle='#7dffff';ctx.font='bold 12px Verdana';ctx.fillText('THREAT LEVEL: '+(['CALM','✨ SUSPICIOUS (1)','☢ UNSTABLE (2)','🌈 EVENT (3+)'][level]),16,28);
ctx.fillStyle='#fff';ctx.font='11px Verdana';ctx.fillText('unicorns inside: '+uniNow+' / 8 max',16,46);ctx.fillText('die: 6 = 🦄 (fair 1/6)',16,62);
}
function stats(){
document.getElementById('sInside').textContent=insideCount();
document.getElementById('sLine').textContent=outsideList().length;
var n=mode==='normal'?unicornsInside():3;
document.getElementById('sNow').textContent=n;
document.getElementById('sServed').textContent=served;
document.getElementById('sUni').textContent=unicornsMade;
document.getElementById('sRate').textContent=served?((unicornsMade/served*100).toFixed(2)+'% (true 16.67%)'):'—';
document.getElementById('sDie').textContent=server.lastRoll?(server.lastRoll+(server.lastWasUni?' 🦄':' (normal)')):'—';
document.getElementById('sCat').textContent=catastrophes;
document.getElementById('sVap').textContent=vaporized;
document.getElementById('sMax').textContent=maxConc;
document.getElementById('sMaxLine').textContent=maxLine;
var stab=mode==='EVENT'?'0% — GONE':(n>=2?'CRITICAL':(n===1?'wobbly 82%':'100%'));
document.getElementById('sStab').textContent=stab;
document.getElementById('sSan').textContent=Math.floor(sanity)+'%';
document.getElementById('sSince').textContent=lastEventAt<-100?'none yet':Math.floor(simTime-lastEventAt)+'s ago';
}
var last=performance.now(),acc=0;
function frame(now){
requestAnimationFrame(frame);
var dt=Math.min(0.05,(now-last)/1000);last=now;
if(!paused){var sdt=dt*speed;var steps=sdt>0.06?2:1;for(var i=0;i<steps;i++)update(sdt/steps);}
draw();acc+=dt;if(acc>0.2){acc=0;stats();}
}
addLog('Shop opened. Promo active. May God have mercy.');
requestAnimationFrame(frame);
})();
</script>
</body>
</html>
In the first few minutes at 1× you see a steady sidewalk queue feeding up to 8 dots inside, a barista serving about one drink every 3.0s (1.2s order plus 1.8s make), sippers lingering 10–14s with brown cups while 1-in-6 flash rainbow with a visible d6 showing 1–6 and only 6 as unicorn, level 1 giving pink sign flicker plus a crooked picture and a watching window plus neon auras, level 2 giving strobing sky plus building jitter plus sparkles plus siren banner, and when any 3 unicorn-holders overlap the shop shakes, the roof flies, fireballs bloom and a giant hue-cycling dancing unicorn takes over for about 9s before a 2.5s rebuild clears the room and resumes with counters preserved. I tuned only timings and cosmetics, never the die: spawn 0.7–1.6s, cap 14 in line, 7 table spots under the 8-inside cap, speed slider just multiplies dt, pep-talk button only spawns particles and dings sanity, and the die is always 1+floor(Math.random()*6) with unicorn on 6. It does badly what a real queue would do well: the counter queue spots are fixed so dots overlap when full, fleeing customers can clip through walls during the EVENT, the observed rate wobbles a lot early (expect long dry spells then clusters), and my 1.6%-per-drink estimate assumes perfect 3s cadence so actual catastrophes average a bit slower when the line starves or the rebuild pauses service — leave it running and the served, unicorn, rate-versus-16.67%, catastrophe and vaporized counters will converge while reality stability does not.