-function life(){livesEl.textContent=Array(lives).fill("●").join(" ")||"—"}function damage(){lives--;life();if(lives<=0){running=false;copy.innerHTML="The skyworks pushed back.<br>Recharge and clear the sector!";start.textContent="REBOOT";cover.style.display="grid";bossHud.style.display="none"}}function jump(){if(running&&Math.abs(vy)<.002&&player.position.y<.04)vy=.011}
-function endBoss(){running=false;copy.innerHTML="<b>Sector cleared!</b><br>You defeated the Iron Colossus.";start.textContent="PLAY AGAIN";cover.style.display="grid";bossHud.style.display="none"}
-function loop(t){requestAnimationFrame(loop);let dt=Math.min(35,last?t-last:16);last=t;if(running){player.position.x=Math.max(-4,Math.min(53,player.position.x+dir*dt*.005));let old=player.position.y;vy-=dt*.000035;player.position.y+=vy*dt;if(player.position.y<=.02){player.position.y=.02;vy=0}for(const p of platforms){if(vy<=0&&Math.abs(player.position.x-p.x)<p.w/2-.12&&old>=p.y+.17&&player.position.y<=p.y+.17){player.position.y=p.y+.17;vy=0}}if(!bossActive&&player.position.x>45&&enemies.length===0)boss();if(firing&&t>nextShot){makeBolt(true,player.position.x+.9,player.position.y+1.25);nextShot=t+220}for(const e of enemies){if(player.position.x>e.g.position.x-6&&t>e.next){makeBolt(false,e.g.position.x-.8,e.g.position.y+1);e.next=t+(e.boss?700:1500)}}for(let i=bolts.length-1;i>=0;i--){const b=bolts[i];b.m.position.x+=b.player?dt*.045:-dt*.03;if(b.player){for(let j=enemies.length-1;j>=0;j--){let e=enemies[j];if(Math.abs(b.m.position.x-e.g.position.x)<(e.boss?1.45:.55)&&Math.abs(b.m.position.y-e.g.position.y-1)<(e.boss?1.5:.65)){e.hp--;scene.remove(b.m);bolts.splice(i,1);if(e.boss)fill.style.width=e.hp/e.max*100+"%";if(e.hp<=0)removeEnemy(j);break}}}else if(Math.abs(b.m.position.x-player.position.x)<.5&&Math.abs(b.m.position.y-player.position.y-1)<.65){scene.remove(b.m);bolts.splice(i,1);damage();continue}if(b.m.position.x>62||b.m.position.x<-7){scene.remove(b.m);bolts.splice(i,1)}}camera.position.x+=(player.position.x+2-camera.position.x)*.06;camera.lookAt(player.position.x+3,1.2,0)}renderer.render(scene,camera)}addEventListener("resize",()=>{camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight)});life();loop(0);
+function showLives(){el.lives.textContent=Array(lives).fill("●").join(" ")||"—"}function damage(){lives--;showLives();if(lives<=0){running=false;el.copy.innerHTML="The skyworks pushed back.<br>Recharge and clear the sector!";el.start.textContent="REBOOT";el.cover.style.display="grid";el.boss.style.display="none"}}function doJump(){if(running&&Math.abs(velocity)<.002&&player.position.y<.04)velocity=.011}
+function removeEnemy(i){const e=enemies[i];scene.remove(e.g);enemies.splice(i,1);if(e.boss){running=false;el.copy.innerHTML="<b>Sector cleared!</b><br>You defeated the Iron Colossus.";el.start.textContent="PLAY AGAIN";el.cover.style.display="grid";el.boss.style.display="none"}}
-function life(){livesEl.textContent=Array(lives).fill("●").join(" ")||"—"}function damage(){lives--;life();if(lives<=0){running=false;copy.innerHTML="The skyworks pushed back.<br>Recharge and clear the sector!";start.textContent="REBOOT";cover.style.display="grid";bossHud.style.display="none"}}function jump(){if(running&&Math.abs(vy)<.002&&player.position.y<.04)vy=.011}
-function endBoss(){running=false;copy.innerHTML="<b>Sector cleared!</b><br>You defeated the Iron Colossus.";start.textContent="PLAY AGAIN";cover.style.display="grid";bossHud.style.display="none"}
-function loop(t){requestAnimationFrame(loop);let dt=Math.min(35,last?t-last:16);last=t;if(running){player.position.x=Math.max(-4,Math.min(53,player.position.x+dir*dt*.005));let old=player.position.y;vy-=dt*.000035;player.position.y+=vy*dt;if(player.position.y<=.02){player.position.y=.02;vy=0}for(const p of platforms){if(vy<=0&&Math.abs(player.position.x-p.x)<p.w/2-.12&&old>=p.y+.17&&player.position.y<=p.y+.17){player.position.y=p.y+.17;vy=0}}if(!bossActive&&player.position.x>45&&enemies.length===0)boss();if(firing&&t>nextShot){makeBolt(true,player.position.x+.9,player.position.y+1.25);nextShot=t+220}for(const e of enemies){if(player.position.x>e.g.position.x-6&&t>e.next){makeBolt(false,e.g.position.x-.8,e.g.position.y+1);e.next=t+(e.boss?700:1500)}}for(let i=bolts.length-1;i>=0;i--){const b=bolts[i];b.m.position.x+=b.player?dt*.045:-dt*.03;if(b.player){for(let j=enemies.length-1;j>=0;j--){let e=enemies[j];if(Math.abs(b.m.position.x-e.g.position.x)<(e.boss?1.45:.55)&&Math.abs(b.m.position.y-e.g.position.y-1)<(e.boss?1.5:.65)){e.hp--;scene.remove(b.m);bolts.splice(i,1);if(e.boss)fill.style.width=e.hp/e.max*100+"%";if(e.hp<=0)removeEnemy(j);break}}}else if(Math.abs(b.m.position.x-player.position.x)<.5&&Math.abs(b.m.position.y-player.position.y-1)<.65){scene.remove(b.m);bolts.splice(i,1);damage();continue}if(b.m.position.x>62||b.m.position.x<-7){scene.remove(b.m);bolts.splice(i,1)}}camera.position.x+=(player.position.x+2-camera.position.x)*.06;camera.lookAt(player.position.x+3,1.2,0)}renderer.render(scene,camera)}addEventListener("resize",()=>{camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight)});life();loop(0);
+function showLives(){el.lives.textContent=Array(lives).fill("●").join(" ")||"—"}function damage(){lives--;showLives();if(lives<=0){running=false;el.copy.innerHTML="The skyworks pushed back.<br>Recharge and clear the sector!";el.start.textContent="REBOOT";el.cover.style.display="grid";el.boss.style.display="none"}}function doJump(){if(running&&Math.abs(velocity)<.002&&player.position.y<.04)velocity=.011}
+function removeEnemy(i){const e=enemies[i];scene.remove(e.g);enemies.splice(i,1);if(e.boss){running=false;el.copy.innerHTML="<b>Sector cleared!</b><br>You defeated the Iron Colossus.";el.start.textContent="PLAY AGAIN";el.cover.style.display="grid";el.boss.style.display="none"}}
+<div id="cover"><div id="card"><div class="tag">3D RUN & BLAST</div><div class="title">BOLT<br><span>RUNNER</span></div><p id="copy" class="copy">Dash through the skyworks, leap over danger, and blast the machines guarding the core.</p><button id="start">POWER UP</button><div class="hint">Move, jump and blast · Keyboard: A/D, W, Space</div></div></div>
+<div id="cover"><div id="card"><div class="tag">3D RUN & BLAST</div><div class="title">BOLT<br><span>RUNNER</span></div><p id="copy" class="copy">Dash through the skyworks, leap over danger, and blast the machines guarding the core.</p><button id="start">POWER UP</button><div class="hint">Move, jump and blast · Keyboard: A/D, W, Space</div></div></div>
+function loop(t){requestAnimationFrame(loop);const dt=Math.min(35,last?t-last:16);last=t;if(running){player.position.x=Math.max(-4,Math.min(53,player.position.x+dir*dt*.005));const oldY=player.position.y;velocity-=dt*.000035;player.position.y+=velocity*dt;if(player.position.y<=.02){player.position.y=.02;velocity=0}for(const p of platforms){if(velocity<=0&&Math.abs(player.position.x-p.x)<p.w/2-.12&&oldY>=p.y+.17&&player.position.y<=p.y+.17){player.position.y=p.y+.17;velocity=0}}if(!bossOn&&player.position.x>45&&enemies.length===0)makeBoss();if(firing&&t>nextShot){makeBolt(true,player.position.x+.9,player.position.y+1.25);nextShot=t+220}for(const e of enemies){if(player.position.x>e.g.position.x-6&&t>e.next){makeBolt(false,e.g.position.x-.8,e.g.position.y+1);e.next=t+(e.boss?700:1500)}}for(let i=bolts.length-1;i>=0;i--){const b=bolts[i];b.m.position.x+=b.player?dt*.045:-dt*.03;if(b.player){for(let j=enemies.length-1;j>=0;j--){const e=enemies[j];if(Math.abs(b.m.position.x-e.g.position.x)<(e.boss?1.45:.55)&&Math.abs(b.m.position.y-e.g.position.y-1)<(e.boss?1.5:.65)){e.hp--;scene.remove(b.m);bolts.splice(i,1);if(e.boss)el.fill.style.width=e.hp/e.max*100+"%";if(e.hp<=0)removeEnemy(j);break}}}else if(Math.abs(b.m.position.x-player.position.x)<.5&&Math.abs(b.m.position.y-player.position.y-1)<.65){scene.remove(b.m);bolts.splice(i,1);damage();continue}if(b.m.position.x>62||b.m.position.x<-7){scene.remove(b.m);bolts.splice(i,1)}}camera.position.x+=(player.position.x+2-camera.position.x)*.06;camera.lookAt(player.position.x+3,1.2,0)}renderer.render(scene,camera)}
+function loop(t){requestAnimationFrame(loop);const dt=Math.min(35,last?t-last:16);last=t;if(running){player.position.x=Math.max(-4,Math.min(53,player.position.x+dir*dt*.005));const oldY=player.position.y;velocity-=dt*.000035;player.position.y+=velocity*dt;if(player.position.y<=.02){player.position.y=.02;velocity=0}for(const p of platforms){if(velocity<=0&&Math.abs(player.position.x-p.x)<p.w/2-.12&&oldY>=p.y+.17&&player.position.y<=p.y+.17){player.position.y=p.y+.17;velocity=0}}if(!bossOn&&player.position.x>45&&enemies.length===0)makeBoss();if(firing&&t>nextShot){makeBolt(true,player.position.x+.9,player.position.y+1.25);nextShot=t+220}for(const e of enemies){if(player.position.x>e.g.position.x-6&&t>e.next){makeBolt(false,e.g.position.x-.8,e.g.position.y+1);e.next=t+(e.boss?700:1500)}}for(let i=bolts.length-1;i>=0;i--){const b=bolts[i];b.m.position.x+=b.player?dt*.045:-dt*.03;if(b.player){for(let j=enemies.length-1;j>=0;j--){const e=enemies[j];if(Math.abs(b.m.position.x-e.g.position.x)<(e.boss?1.45:.55)&&Math.abs(b.m.position.y-e.g.position.y-1)<(e.boss?1.5:.65)){e.hp--;scene.remove(b.m);bolts.splice(i,1);if(e.boss)el.fill.style.width=e.hp/e.max*100+"%";if(e.hp<=0)removeEnemy(j);break}}}else if(Math.abs(b.m.position.x-player.position.x)<.5&&Math.abs(b.m.position.y-player.position.y-1)<.65){scene.remove(b.m);bolts.splice(i,1);damage();continue}if(b.m.position.x>62||b.m.position.x<-7){scene.remove(b.m);bolts.splice(i,1)}}camera.position.x+=(player.position.x+2-camera.position.x)*.06;camera.lookAt(player.position.x+3,1.2,0)}renderer.render(scene,camera)}