<!-- SOLID CITY · part 2928 -->
ctx.scale(scale,scale);ctx.shadowBlur=12;ctx.shadowColor=color;ctx.strokeStyle=color;ctx.fillStyle='rgba(6,16,15,.95)';ctx.lineWidth=2;ctx.beginPath();ctx.moveTo(22,0);ctx.lineTo(-12,-10);ctx.lineTo(-6,0);ctx.lineTo(-12,10);ctx.closePath();ctx.fill();ctx.stroke();ctx.beginPath();ctx.moveTo(-9,-5);ctx.lineTo(-22,-3);ctx.moveTo(-9,5);ctx.lineTo(-22,3);ctx.stroke();ctx.restore()}
  function draw(){
    ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,W,H);var g=ctx.createLinearGradient(0,0,W,H);g.addColorStop(0,'#06100f');g.addColorStop(1,'#0b1d1a');ctx.fillStyle=g;ctx.fillRect(0,0,W,H);
    state.stars.forEach(function(s){s.x-=s.z*(.3+state.player.vx/160);if(s.x<0)s.x=W;ctx.fillStyle='rgba(183,231,220,'+(.2+s.z*.5)+')';ctx.fillRect(s.x,s.y,s.z*1.4,s.z*1.4)});
    ctx.strokeStyle='rgba(65,199,187,.08)';ctx.lineWidth=1;for(var i=0;i<7;i++){var yy=(i+1)*H/8;ctx.beginPath();ctx.moveTo(0,yy);ctx.lineTo(W,yy);ctx.stroke()}
    var remain=state.target-state.progress;if(remain<800){var gx=W-(remain/800)*(W*.55);ctx.save();ctx.translate(gx,H*.5);ctx.strokeStyle=colors.teal;ctx.shadowBlur=18;ctx.shadowColor=colors.teal;ctx.lineWidth=2;ctx.beginPath();ctx.ellipse(0,0,28,74,0,0,6.28);ctx.stroke();ctx.strokeStyle='rgba(67,216,207,.3)';ctx.beginPath();ctx.ellipse(0,0,46,102,0,0,6.28);ctx.stroke();ctx.restore()}
    state.rocks.forEach(function(r){ctx.save();ctx.translate(r.x,r.y);ctx.rotate(r.rot);ctx.fillStyle='#22302d';ctx.strokeStyle='#69817b';ctx.lineWidth=1;ctx.beginPath();for(var i=0;i<7;i++){var a=i/7*6.28,rr=r.r*(.77+(i%3)*.11);ctx.lineTo(Math.cos(a)*rr,Math.sin(a)*rr)}ctx.closePath();ctx.fill();ctx.stroke();ctx.restore()});
    state.enemies.forEach(function(e){ship(e.x,e.y,Math.PI,'#ff6f66',.8)});
    var twd=state.summit.twin;
    if(twd&&twd.hp>0){var tpc=['#43d8cf','#ffc46b','#ff6259'][twd.phase];ctx.save();ctx.globalAlpha=.55+.25*Math.sin(state.elapsed*5);ctx.strokeStyle=tpc;ctx.lineWidth=2;ctx.beginPath();ctx.arc(twd.x,twd.y,31+Math.sin(state.elapsed*5)*3,0,6.28);ctx.stroke();ctx.restore();ship(twd.x,twd.y,Math.PI,colors.gold,1.18)}
    state.novas.forEach(function(nv){ctx.save();ctx.globalAlpha=Math.max(0,.75-nv.r/520);ctx.strokeStyle='#ffc46b';ctx.lineWidth=3;ctx.beginPath();ctx.arc(nv.x,nv.y,nv.r,0,6.28);ctx.stroke();ctx.restore()});
    var sco=state.summit.core;
    if(sco){ctx.save();ctx.translate(sco.x,sco.y);ctx.rotate(Math.PI/4);var scs=8+Math.sin(sco.pulse)*2.5;ctx.strokeStyle=colors.teal;ctx.shadowBlur=16;ctx.shadowColor=colors.teal;ctx.lineWidth=2.5;ctx.strokeRect(-scs,-scs,scs*2,scs*2);ctx.restore()}
    if(state.summit.phase==='mirror'){ctx.save();ctx.translate(W-64,H*.5);ctx.globalAlpha=.55+.35*Math.sin(state.elapsed*9);ctx.strokeStyle='#ffc46b';ctx.lineWidth=2.5;ctx.beginPath();ctx.ellipse(0,0,24,70,0,0,6.28);ctx.stroke();ctx.beginPath();ctx.moveTo(-24,-70);ctx.lineTo(24,70);ctx.moveTo(24,-70);ctx.lineTo(-24,70);ctx.stroke();ctx.restore()}
    state.bullets.forEach(function(b){ctx.strokeStyle=colors.gold2;ctx.lineWidth=2;ctx.beginPath();ctx.moveTo(b.x,b.y);ctx.lineTo(b.x-b.vx*.025,b.y-b.vy*.025);ctx.stroke()});
    state.enemyBullets.forEach(function(b){ctx.fillStyle=b.twin?'#ffc46b':colors.red;ctx.beginPath();ctx.arc(b.x,b.y,3,0,6.28);ctx.fill()});
    var mvangle=Math.atan2(state.player.vy,state.player.vx||100)*.25;if(state.summit.wing==='formation')ship(state.wing.x,state.wing.y,mvangle,colors.teal,.72);ship(state.player.x,state.player.y,mvangle,colors.gold,1.05);
    state.particles.forEach(function(p){ctx.globalAlpha=Math.max(0,p.life);ctx.fillStyle=p.c;ctx.fillRect(p.x,p.y,2,2)});ctx.globalAlpha=1;
    var wp=owners.weapon==='human'?input.weapon:aiWeapon();ctx.strokeStyle=owners.weapon==='human'?colors.gold:colors.teal;ctx.globalAlpha=.45;ctx.setLineDash([4,6]);ctx.beginPath();ctx.moveTo(state.player.x,state.player.y);ctx.lineTo(state.player.x+wp.x*110,state.player.y+wp.y*110);ctx.stroke();ctx.setLineDash([]);ctx.globalAlpha=1;
  }
  function loop(t){var dt=Math.min(.033,(t-last)/1000||.016);last=t;update(dt);draw();if(state.running)raf=requestAnimationFrame(loop)}
  reset();draw();
})();
</script>
</body>
</html>


===== FILE: public/city/rider/index.html.bak-cityreturn-20261011 =====
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=1" />
  <meta name="color-scheme" content="light dark" />
  <link rel="icon" href="data:," />
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Oxanium:wght@500;600;700&display=swap" rel="stylesheet">
  <title>Double Strike: Rider System Prototype</title>
  <style>
    :root {
      color-scheme: light dark;
      --page:#edf1ef; --panel:#f8faf9; --panel-2:#e4eae7; --ink:#101716; --muted:#50605d;
      --line:#b8c4c0; --gold:#9b6