<!-- SOLID CITY · part 2032 -->
vents"></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};
  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:null}}
  function reset(startBattle){ships=[];shots=[];rocks=[];sparks=[];events=[];pendingReleases=[];progress={gold:0,teal:0};selected={gold:null,teal:null};order={gold:'form',teal:'form'};running=startBattle!==false;paused=false;pausedAt=0;totalPaused=0;rngSeed=88421;missionStart=performance.now();eventCounts={handoff:0,rescue:0,formation:0,rejected:0,hit:0};for(var t of ['gold','teal'])for(var i=0;i<4;i++)ships.push(makeShip(t,i));for(var r=0;r<13;r++)rocks.push({x:320+rand()*560,y:50+rand()*620,vx:-18+rand()*36,vy:-15+rand()*30,r:9+rand()*18,spin:rand()*6});document.getElementById('debrief').classList.remove('open');document.getElementById('pauseOverlay').classList.remove('open');document.getElementById('pauseTrigger').hidden=!running;document.querySelectorAll('.orders button').forEach(function(b){b.classList.toggle('active',b.dataset.order==='form')});if(running)log('formation','Both squadrons entered Diamond formation');else updateStats();resizeAll();updateUI()}
  function teamShips(t){return ships.filter(function(s){return s.team===t})} function enemyTeam(t){return t==='gold'?'teal':'gold'}
  function ownerLabel(s){var human=Object.values(s.owners).filter(function(o){return o==='HUMAN'}).length;return human?(human===4?'HUMAN':'HUMAN · '+human+'/4') : s.pilot}
  function claim(s,parts){parts.forEach(function(p){if(s.owners[p]!=='HUMAN'){s.epochs[p]++;s.owners[p]='HUMAN'}});s.lastHuman=performance.now();selected[s.team]=s.id;log('handoff',s.name+' yielded '+parts.join(' + ')+' to human',s.id);toast(s.name+' · helm acquired');updateUI()}
  function release(s,parts){parts=parts||Object.keys(s.owners);var changed=[];parts.forEach(function(p){if(s.owners[p]==='HUMAN'){s.epochs[p]++;s.owners[p]='AI';changed.push(p)}});if(changed.length){log('handoff',s.name+' returned '+changed.join(' + ')+' to '+s.pilot,s.id);toast(s.name+' · AI resumed safely')}if(parts.length===4)selected[s.team]=null;updateUI()}
  function issueOrder(team,o){order[team]=o;var skipped=0;teamShips(team).forEach(function(s){if(s.disabled>0)return;if(s.owners.movement==='HUMAN'||s.owners.navigation==='HUMAN'){skipped++;return}s.task=({form:'Form Up',attack:'Coordinated Attack',defend:'Defend Beacon',intercept:'Intercept'}[o]);s.epochs.navigation++});document.querySelectorAll('[data-team="'+team+'"][data-order]').forEach(function(b){b.classList.toggle('active',b.dataset.order===o)});log('formation',team.toUpperCase()+' order: '+o.toUpperCase()+(skipped?' · '+skipped+' human helm advised, not overridden':''));toast(o.toUpperCase()+(skipped?' · human helm preserved':''))}
  function nearestEnemy(s){var a=teamShips(enemyTeam(s.team)).filter(function(e){return e.disabled<=0});a.sort(function(x,y){return dist(s,x)-dist(s,y)});return a[0]}
  function desired(s){var mates=teamShips(s.team),leader=mates[0],enemy=nearestEnemy(s),gold=s.team==='gold',baseX=gold?470:730,baseY=360,off=[[-55,-55],[-55,55],[-120,-95],[-120,95]][s.slot];if(!gold)off=[-off[0],off[1]