<!-- SOLID CITY · part 2033 -->
];
    var weak=mates.find(function(m){return m!==s&&m.hull>0&&m.hull<28&&dist(s,m)<330});if(weak&&s.owners.movement==='AI'&&s.hull>45){s.task='Rescue '+weak.name;s.rescueTarget=weak;return{x:weak.x+(gold?-40:40),y:weak.y}}
    s.rescueTarget=null;
    if(order[s.team]==='attack'&&enemy){s.task='Attack '+enemy.name;return{x:enemy.x+(gold?-115:115),y:enemy.y+(s.slot-1.5)*24}}
    if(order[s.team]==='defend'){s.task='Defend Beacon';return{x:BEACON.x+(gold?-1:1)*(115+s.slot*22),y:BEACON.y+(s.slot-1.5)*55}}
    if(order[s.team]==='intercept'&&enemy){s.task='Intercept '+enemy.name;return{x:enemy.x+enemy.vx*2.4,y:enemy.y+enemy.vy*2.4}}
    s.task='Form Up';if(s!==leader&&leader.disabled<=0)return{x:leader.x+off[0],y:leader.y+off[1]};return{x:baseX,y:baseY}}
  function steer(s,target,dt){var dx=target.x-s.x,dy=target.y-s.y,d=Math.max(1,Math.hypot(dx,dy)),ax=dx/d*82,ay=dy/d*82;for(var r of rocks){var rd=dist(s,r);if(rd<95+r.r){var k=(110+r.r-rd)/110;ax+=(s.x-r.x)/Math.max(1,rd)*180*k;ay+=(s.y-r.y)/Math.max(1,rd)*180*k;s.task=s.owners.movement==='HUMAN'?s.task:'Dodge meteor'}}s.vx+=ax*dt;s.vy+=ay*dt;var sp=Math.hypot(s.vx,s.vy),max=130;if(sp>max){s.vx=s.vx/sp*max;s.vy=s.vy/sp*max}s.a=Math.atan2(s.vy,s.vx)}
  function fire(s,forced){if(s.disabled>0||s.cool>0)return;var e=nearestEnemy(s);if(!e)return;var d=dist(s,e);if(!forced&&d>370)return;var lead={x:e.x+e.vx*d/420,y:e.y+e.vy*d/420},a=Math.atan2(lead.y-s.y,lead.x-s.x);shots.push({x:s.x+Math.cos(a)*18,y:s.y+Math.sin(a)*18,vx:Math.cos(a)*420,vy:Math.sin(a)*420,team:s.team,life:1.2,from:s.id,damage:7+(s.slot%2)*2});s.cool=.55+rand()*.35;for(var i=0;i<3;i++)sparks.push({x:s.x,y:s.y,vx:-Math.cos(a)*(20+rand()*50),vy:-Math.sin(a)*(20+rand()*50),life:.25,color:s.team})}
  function hitShip(target,shot){if(target.shieldWindow>0){target.shield=Math.max(0,target.shield-shot.damage*1.2)}else if(target.owners.defense==='AI'&&target.shield>10){target.shield=Math.max(0,target.shield-shot.damage*1.2);target.hull-=shot.damage*.28}else target.hull-=shot.damage;target.hull=Math.max(0,target.hull);eventCounts.hit++;if(target.hull<=0){target.disabled=5;target.vx=target.vy=0;log('hit',target.name+' disabled · rescue window opened',target.id)}else if(target.hull<30&&target.task.indexOf('Rescue')<0){log('hit',target.name+' critical at '+Math.round(target.hull)+'% hull',target.id)}}
  function update(dt){if(!running)return;for(var pr=pendingReleases.length-1;pr>=0;pr--){pendingReleases[pr].remaining-=dt;if(pendingReleases[pr].remaining<=0){var rs=ships.find(function(x){return x.id===pendingReleases[pr].shipId});if(rs)release(rs,['weapons']);pendingReleases.splice(pr,1)}}for(var r of rocks){r.x+=r.vx*dt;r.y+=r.vy*dt;r.spin+=dt;if(r.x<280)r.x=920;if(r.x>920)r.x=280;if(r.y<20)r.y=700;if(r.y>700)r.y=20}
    for(var s of ships){s.cool=Math.max(0,s.cool-dt);s.shield=Math.min(100,s.shield+6*dt);if(s.shieldWindow>0){s.shieldWindow=Math.max(0,s.shieldWindow-dt);if(s.shieldWindow===0&&s.owners.defense==='HUMAN'){s.task='Shield released';release(s,['defense'])}}if(s.disabled>0){s.disabled-=dt;if(s.disabled<=0){s.hull=45;s.shield=50;s.x=s.team==='gold'?145:1055;s.y=170+s.slot*115;log('rescue',s.name+' recovered by squadron support',s.id)}continue}
      if(s.owners.movement==='AI')steer(s,desired(s),dt);else if(s.humanAim)steer(s,s.humanAim,dt);
      if(s.owners.weapons==='AI')fire(s,false);
      s.x=clamp(s.x+s.vx*dt,25,W-25);s.y=clamp(s.y+s.vy*dt,28,H-28);s.vx*=Math.pow(.9,dt);s.vy*=Math.pow(.9,dt);
      for(var r2 of rocks){if(dist(s,r2)<r2.r+12){if(s.shieldWindow>0)s.shield=Math.max(0,s.shield-22*dt);else s.hull=Math.max(0,s.hull-22*dt);s.vx+=(s.x-r2.x)*dt*5;s.vy+=(s.y-r2.y)*dt*5}}
      var des=desired(s),fd=dist(s,des);s.formation=fd<65?'locked':fd<140?'recovering':'broken';if(s.rescueTarget&&dist(s,s.rescueTarget)<70){s.rescueTarget.hull=Math.min(55,s.rescueTarget.hull+18*dt);s.rescueTarget.disabled=Math.max(0,s.rescueTarget.disabled-dt*2)}}
    for(var i=shots.length-1;i>=0;i--){var p=shots[i];p.x+=p.vx*dt;p.y+=p.vy*dt;p.life-=dt;var targets=teamShips(enemyTeam(p.team));var hit=targets.find(function(s){return s.disabled<=0&&dist(s,p)<15});if(hit){hitShip(hit,p);shots.splice(i,1);continue}if(p.life<=0||p.x<0||p.x>W||p.y<0||p.y>H)shots.splice(i,1)}
    for(var j=sparks.length-1;j>=0;j--){var q=sparks[j];q.x+=q.vx*dt;q.y+=q.vy*dt;q.life-=dt;if(q.life<=0)sparks.splice(j,1)}
    var inGold=teamShips('gold').filter(function(s){return s.disabled<=0&&dist(s,BEACON)<180}).length,inTeal=teamShips('teal').filter(function(s){return s.disabled<=0&&dist(s,BEACON)<180}).length;
    if(inGold>inTeal)progress.gold=clamp(progress.gold+dt*(1.2+inGold*.35),0,100);if(inTeal>inGold)progress.teal=clamp(progress.teal+dt*(1.2+inTeal*.35),0,100);
    if(progress.gold>=100)end('gold');if(progress.teal>=100)end('teal')
  }
  function end(team){running=false;paused=false;document.getElementById('pauseTrigger').hidden=true;document.getElementById('pauseOverlay').classList.remove('open');v