<!-- SOLID CITY · part 2946 -->
 class="control-block"><label>AIM + FIRE</label><div class="pad weapon" id="weaponPad" aria-label="Weapons control"><span class="nub" id="weaponNub"></span></div><div class="control-hint">drag toward target<br><span class="kbd">ARROWS</span> + <span class="kbd">SPACE</span></div></div>
        </div>
      </section>
      <section class="panel">
        <h2 class="panel-title">LIVE TELEMETRY <span>THIS RUN</span></h2>
        <div class="telemetry"><div><b id="handoffCount">0</b><span>HANDOFFS</span></div><div><b id="conflictCount">0</b><span>CONFLICTS</span></div><div><b id="warningCount">0</b><span>WARNINGS</span></div></div>
      </section>
      <section class="panel log">
        <h2 class="panel-title">OWNERSHIP LOG <span>NEWEST FIRST</span></h2>
        <ol class="log-list" id="logList" aria-live="polite"></ol>
      </section>
    </aside>
  </div>

  <section class="architecture" aria-labelledby="archTitle">
    <div class="architecture-head"><div><h2 id="archTitle">Flight guide</h2><p>Rider splits flight and weapons into two roles. Choose a configuration, then take either task at any moment by touching its control.</p></div><p><b>Handoff:</b> touch for immediate control → release for a guarded coast → flight intelligence resumes smoothly. Hazard warnings advise you without taking command.</p></div>
    <div class="arch-grid">
      <article class="arch-node"><h3>1 · FLY THE ROUTE</h3><p>Steer through the debris field, dodge incoming fire, and keep making progress toward Aster Gate.</p><p class="rule">Survival and reaching the gate come first.</p></article>
      <div class="arch-arrow" aria-hidden="true">→</div>
      <article class="arch-node"><h3>2 · SWITCH ROLES</h3><p>Use Rider for movement, Archer for weapons, or Full Manual for both. Touching a control claims only that role.</p><p class="rule">Your other task stays with its current pilot.</p></article>
      <div class="arch-arrow" aria-hidden="true">→</div>
      <article class="arch-node"><h3>3 · TRUST YOUR WING</h3><p>Teal Wing holds formation and calls out threats while you focus on the task you choose.</p><p class="rule">Warnings guide you; they never override you.</p></article>
    </div>
    <div class="research-strip">
      <div><b>RIDER</b><span>Fly while the AI tracks and fires.</span></div>
      <div><b>ARCHER</b><span>Aim and fire while the AI navigates.</span></div>
      <div><b>FULL MANUAL</b><span>Command movement and weapons together.</span></div>
      <div><b>DODGE + FIRE</b><span>Both controls remain active at the same time.</span></div>
      <div><b>RELEASE</b><span>Lift off a control to return it to the AI.</span></div>
    </div>
  </section>
</main>
<script>
(function(){
  'use strict';
  var canvas=document.getElementById('game'),ctx=canvas.getContext('2d');
  var els={
    moveOwner:document.getElementById('moveOwner'),weaponOwner:document.getElementById('weaponOwner'),moveLatency:document.getElementById('moveLatency'),weaponLatency:document.getElementById('weaponLatency'),
    hullBar:document.getElementById('hullBar'),hullText:document.getElementById('hullText'),distanceText:document.getElementById('distanceText'),killsText:document.getElementById('killsText'),warning:document.getElementById('warning'),
    handoffCount:document.getElementById('handoffCount'),conflictCount:document.getElementById('conflictCount'),warningCount:document.getElementById('warningCount'),logList:document.getElementById('logList'),
    startCard:document.getElementById('startCard'),debrief:document.getElementById('debrief'),debriefEyebrow:document.getElementById('debriefEyebrow'),debriefTitle:document.getElementById('debriefTitle'),scoreHull:document.getElementById('scoreHull'),scoreHandoffs:document.getElementById('scoreHandoffs'),scoreTime:document.getElementById('scoreTime'),
    stage:document.querySelector('.stage'),pauseBtn:document.getElementById('pauseBtn'),pauseOverlay:document.getElementById('pauseOverlay'),resumeBtn:document.getElementById('resumeBtn')
  };
  var W=1000,H=560,dpr=1,last=0,raf=0,pauseStarted=0;
  var state,keys={},pointerMove=false,pointerWeapon=false,pausedReleases={move:false,weapon:false};
  var input={move:{x:0,y:0},weapon:{x:1,y:0},firing:false};
  var owners={move:'human',weapon:'ai'},releaseAt={move:0,weapon:0};
  var mode='rider';
  var colors={gold:'#f0b83b',gold2:'#ffde78',teal:'#43d8cf',teal2:'#8afff6',red:'#ff6259',white:'#e8f7f3'};

  function resize(){
    var r=canvas.getBoundingClientRect();dpr=Math.min(window.devicePixelRatio||1,2);
    canvas.width=Math.max(1,Math.round(r.width*dpr));canvas.height=Math.max(1,Math.round(r.height*dpr));
    W=r.width;H=r.height;ctx.setTransform(dpr,0,0,dpr,0,0);
  }
  window.addEventListener('resize',resize,{passive:true});resize();

  function reset(){
    state={running:false,paused:false,elapsed:0,hull:100,progress:0,target:3600,kills:0,handoffs:0,conflicts:0,warnings:0,warningOn:false,warningCooldown:0,spawn:1.1,shot:0,p