<!-- SOLID CITY · part 2002 -->
/strong> to take its helm</div></div>
      <div class="commands"><div class="orders" aria-label="Gold squadron orders"><button data-team="gold" data-order="form">FORM UP</button><button data-team="gold" data-order="attack">ATTACK</button><button data-team="gold" data-order="defend">DEFEND</button><button data-team="gold" data-order="intercept">INTERCEPT</button></div><div class="pilot"><button class="fire" data-team="gold" data-action="fire">FIRE</button><button data-team="gold" data-action="shield">SHIELD</button><button class="release" data-team="gold" data-action="release">YIELD</button></div></div>
    </section>
    <section class="screen teal" data-team="teal">
      <div class="screen-head"><b>TEAL SQUADRON · SCREEN 2</b><span class="health" id="tealHealth">4 ships combat-ready</span><span class="signal">LINK GOOD</span></div>
      <div class="view"><canvas id="tealCanvas" aria-label="Teal Squadron tactical view"></canvas><div class="objective"><span>BEACON</span><div class="meter"><i id="tealMeter"></i></div><span id="tealProgress">0%</span></div><div class="selected" id="tealSelected"><strong>Tap a Teal fighter</strong> to intervene</div></div>
      <div class="commands"><div class="orders" aria-label="Teal squadron orders"><button data-team="teal" data-order="form">FORM UP</button><button data-team="teal" data-order="attack">ATTACK</button><button data-team="teal" data-order="defend">DEFEND</button><button data-team="teal" data-order="intercept">INTERCEPT</button></div><div class="pilot"><button class="fire" data-team="teal" data-action="fire">FIRE</button><button data-team="teal" data-action="shield">SHIELD</button><button class="release" data-team="teal" data-action="release">YIELD</button></div></div>
    </section>
  </main>
  <div class="toast" id="toast"></div>
  <div class="pause-overlay" id="pauseOverlay" role="dialog" aria-modal="true" aria-label="Battle paused">
    <div class="pause-card"><strong>BATTLE PAUSED</strong><button id="resumeBattle">RESUME</button><a href="/city/?back=strike">QUIT TO CITY</a></div>
  </div>
  <div class="drawer" id="drawer" role="dialog" aria-modal="true" aria-label="Fleet statistics"><div class="sheet"><div class="sheet-head"><div><h2>Fleet telemetry</h2><p>Values come from this battle’s state and event ledger.</p></div><button class="close" id="statsClose" aria-label="Close statistics">×</button></div><div class="scoreboard"><div class="score gold"><b id="goldScore">0%</b><span>GOLD MISSION PROGRESS</span></div><div class="score teal"><b id="tealScore">0%</b><span>TEAL MISSION PROGRESS</span></div></div><div class="ships" id="shipStats"></div><h3 class="event-title">COORDINATION EVENTS</h3><div class="events" id="events"></div></div></div>
  <div class="debrief" id="debrief"><div class="debrief-card"><h2 id="winner">Gold secures the beacon.</h2><p id="summary"></p><button id="again">FLY AGAIN</button></div></div>
<script>

(function(){
  'use strict';
  var W=1200,H=720,BEACON={x:600,y:360,r:70},rngSeed=88421,ships=[],shots=[],rocks=[],sparks=[],events=[],pendingReleases=[],progress={gold:0,teal:0},selected={gold:null,teal:null},order={gold:'form',teal:'form'},running=false,paused=false,pausedAt=0,totalPaused=0,last=performance.now(),missionStart=performance.now(),eventCounts={handoff:0,rescue:0,formation:0,rejected:0,hit:0},summit={active:false,phase:'none',beaconHp:100,hold:0,wave:0,spawnQueue:0,spawnTimer:0,spawnedThisWave:0,shards:[],choice:null,anchor:null,anchorT:0,ignition:0,pulseR:0,choiceTimer:0,lost:[]},UNION_R=125,PHI=1.6180339887,WAVES=[5,8,13],FINAL_WAVE=21;
  var names={gold:['AURIC-1','MESA-2','SOL-3','CROWN-4'],teal:['TIDELINE-1','VAPOR-2','REEF-3','CURRENT-4']};
  var pilots={gold:['AI KAI','AI LUMA','AI ORBIT','AI NOVA'],teal:['AI MIRA','AI VEIL','AI ECHO','AI WAVE']};
  function rand(){rngSeed=(rngSeed*1664525+1013904223)>>>0;return rngSeed/4294967296}
  function clamp(v,a,b){return Math.max(a,Math.min(b,v))} function dist(a,b){return Math.hypot(a.x-b.x,a.y-b.y)}
  function elapsedMs(){var activePause=paused&&pausedAt?performance.now()-pausedAt:0;return Math.max(0,performance.now()-missionStart-totalPaused-activePause)}
  function stamp(){var s=Math.floor(elapsedMs()/1000);return String(Math.floor(s/60)).padStart(2,'0')+':'+String(s%60).padStart(2,'0')}
  function log(type,text,ship){events.unshift({time:stamp(),type:type,text:text,ship:ship||'FLEET'});if(events.length>80)events.pop();if(eventCounts[type]!=null)eventCounts[type]++;updateStats()}
  function makeShip(team,i){var gold=team==='gold';return {id:team[0].toUpperCase()+(i+1),team:team,name:names[team][i],pilot:pilots[team][i],x:gold?180+i*34:1020-i*34,y:245+i*78,vx:0,vy:0,a:gold?0:Math.PI,hull:100,shield:100,shieldWindow:0,disabled:0,cool:rand(),task:'Form Up',slot:i,formation:'forming',humanAim:null,owners:{movement:'AI',weapons:'AI',navigation:'AI',defense:'AI'},epochs:{movement:1,weapons:1,navigation:1,defense:1},lastHuman:0,rescueTarget:nul