<!-- SOLID CITY · part 1903 -->
cy=ry+rvy*t,miss=Math.hypot(cx,cy);
      if(t>0&&t<1.65&&miss<m.r+26){
        if(!m.threat){m.threat=true;metrics.threats[m.id]={shipTicks:[ships[0].actionTick,ships[1].actionTick],time:elapsed};logA('threat detected · meteor '+m.id);notify(0,'THREAT LOCK',650)}
        if(m.action==='none'){
          var d=Math.hypot(rx,ry);
          if(t>.64&&d<600&&distObj(ships[1],m)<190){m.action='intercept';logA('action · intercept meteor '+m.id);notify(1,'INTERCEPT',700);setTimeout(function(){if(running&&!m.resolved&&meteors.indexOf(m)>=0){burst(m.x,m.y,'#ffc84a',16);m.resolved=true;metrics.avoided++;awardRescue(m,1);logA('outcome · collision avoided');checkContinuity(m);meteors.splice(meteors.indexOf(m),1)}},220)}
          else if(!human.active){var side=(rx*rvy-ry*rvx)>0?1:-1,mag=260;h.assistVX=-rvy/(Math.hypot(rvx,rvy)||1)*side*mag;h.assistVY=rvx/(Math.hypot(rvx,rvy)||1)*side*mag;h.assistUntil=now+420;m.action='nudge';logA('action · emergency thruster nudge');notify(0,'EVADE ASSIST',900)}
        }
      }
    })
  }
  function checkContinuity(m){var t=metrics.threats[m.id];if(t){metrics.assistChecks++;if(ships[0].actionTick>t.shipTicks[0]&&ships[1].actionTick>t.shipTicks[1])metrics.assistContinuity++}}
  function buildTotal(s){return s.build.hull+s.build.cannon+s.build.thruster+s.build.bio}
  function dropComponent(x,y){
    var types=['hull','cannon','thruster','bio'],target=buildTotal(ships[0])<=buildTotal(ships[1])?0:1,type=types[progression.componentIndex++%types.length];
    if(ships[target].build[type]>=2){for(var i=0;i<types.length;i++)if(ships[target].build[types[i]]<2){type=types[i];break}}
    pickups.push({id:nextId++,type:type,component:true,target:target,x:x,y:y,vx:(Math.random()-.5)*45,vy:(Math.random()-.5)*45,phase:Math.random()*6.28,life:18})
  }
  function applyComponent(p,s,i){
    if(s.build[p.type]>=2)return;s.build[p.type]++;
    if(p.type==='hull'){s.maxHull+=25;s.hull=s.maxHull}
    if(p.type==='bio'){s.hull=Math.min(s.maxHull,s.hull+22)}
    var names={hull:'PLATING',cannon:'CANNON',thruster:'THRUSTER',bio:'BIO ADAPTATION'},solidity=buildTotal(s);notify(i,names[p.type]+' · SOLIDITY '+solidity+' / 8',1200);burst(s.x,s.y,p.type==='bio'?'#7dff96':s.color,26);p.life=0;
    var total=buildTotal(ships[0])+buildTotal(ships[1]);objectiveEl.textContent='SOLIDIVISM · '+total+' / 16';
    if(total>=16){objectiveEl.textContent='SHIPS SOLID';notify(0,'SHIP SOLID · WHOLE · UNBREAKABLE',1500);notify(1,'SHIP SOLID · WHOLE · UNBREAKABLE',1500);setTimeout(completeLevel,1500)}
  }
  function dropPower(x,y){if(Math.random()>.46)return;var r=Math.random(),type=r<.4?'shield':r<.62?'spread':r<.84?'rapid':'repair';pickups.push({id:nextId++,type:type,x:x,y:y,vx:(Math.random()-.5)*55,vy:(Math.random()-.5)*55,phase:Math.random()*6.28,life:14})}
  function collectPower(p,s,i){if(p.component){applyComponent(p,s,i);return}var now=performance.now();if(p.type==='shield'){s.shieldCharges=Math.min(5,s.shieldCharges+3);s.shieldUntil=now+12000;s.shieldRingUntil=now+700;notify(i,'SHIELD ONLINE',900);burst(s.x,s.y,'#6ef2ff',28)}else if(p.type==='spread'){s.spreadUntil=now+8000;notify(i,'TRIPLE SHOT',800);burst(s.x,s.y,'#ff9b57',18)}else if(p.type==='rapid'){s.rapidUntil=now+8000;notify(i,'RAPID FIRE',800);burst(s.x,s.y,'#fff26a',18)}else{s.hull=Math.min(s.maxHull,s.hull+38);s.repairUntil=now+1400;notify(i,'HULL REPAIRED',800);burst(s.x,s.y,'#72ff9d',18)}p.life=0}
  function fireShot(s,idx,manual){if(!s.alive)return;if(level===5){fireCorridor(s,idx,manual);return}var target=null,autoLock=level===4&&progression.expansionStage===3&&flight.mode==='formation';if(idx===1&&s.coveringTarget!==null)target=enemies.concat(meteors).find(function(o){return o.id===s.coveringTarget&&!o.resolved&&o.hull>0})||null;if(!target)target=nearest(s,enemies,autoLock?1450:(level>=3?980:manual?760:560));if(!target&&(autoLock||(idx===1&&(armEl.checked||s.coveringTarget!==null))))target=nearest(s,meteors,autoLock?1200:500);var a=target?Math.atan2(delta(target.y,s.y,WORLD.h),delta(target.x,s.x,WORLD.w)):s.a;var spread=performance.now()<s.spreadUntil?[-.17,0,.17]:[0];spread.forEach(function(off){var q=a+off;shots.push({fid:nextId++,x:s.x+Math.cos(q)*22,y:s.y+Math.sin(q)*22,vx:Math.cos(q)*700,vy:Math.sin(q)*700,life:1.25,owner:idx,color:s.color})});s.a=a;s.actionTick++;muzzles.push({x:s.x+Math.cos(a)*24,y:s.y+Math.sin(a)*24,color:s.color,life:.1});var badge=document.querySelector('#auto'+idx);badge.classList.add('hot');setTimeout(function(){badge.classList.remove('hot')},90)}
  function autoFire(s,idx,dt){if(!s.alive)return;s.fire-=dt;if(s.fire>0)return;if(level===5){var corridorTarget=corridorThreats.some(function(t){return !t.cleared&&Math.abs(t.x-s.corridorX)<.34&&Math.abs(t.band-s.altitude)<.48});if(corridorTarget){fireCorridor(s,idx,false);s.fire=performance.now()<s.rapidUntil?.085:.18}return}var autoLock=level===4&&progression.expansionStage===3&&flight.mode==='formation',target=null;if(idx===1&&s.coveringTarget!==