<!-- SOLID CITY · part 3449 -->
:0,motes:[],
      core:{x:0.62,y:0.5,r:0.07,hp:1200,max:1200,strain:0,surge:0,flash:0,surgeWarn:0,surgePower:1,dead:false,surges:0},
      icoN:icoN,dodN:dodN,faces:faces,edges:summitEdges(ico),apothem:ap,_sp:null,
      heldBy:[null,null,null,null,null,null,null,null,null,null,null,null],
      faceLit:[0,0,0,0,0,0,0,0,0,0,0,0],assignTarget:{}};
    summit.motes=debris.map(function(o){return {x:o.x,y:o.y,r:o.r,mass:o.hp}});
    debris.length=0;
    addEvent('COALESCENCE','FIELD','One gravity. '+summit.motes.length+' fragments converging on a single mass.');
    announce('The field answers one gravity. Twelve stations. One lattice.');
    updateAllUI();
  }
  function summitAssign(dt){
    var s=summit,sp=summitStationField(),i,k;
    s._sp=sp;s.assignTarget={};
    var cands=drones.filter(function(d){return d.status==='ACTIVE'&&d.owner==='AI'});
    cands.sort(function(a,b){return a.id-b.id});
    var taken={};
    cands.forEach(function(d){
      var bi=-1,bd=1e9;
      for(i=0;i<12;i++){if(taken[i])continue;var dd=Math.hypot(sp[i].x-d.x,sp[i].y-d.y);if(dd<bd){bd=dd;bi=i}}
      if(bi>=0){taken[bi]=1;s.assignTarget[d.id]=bi}
    });
    for(i=0;i<12;i++){
      var holder=null;
      for(k=0;k<drones.length;k++){var d2=drones[k];if(d2.status!=='ACTIVE')continue;if(Math.hypot(sp[i].x-d2.x,sp[i].y-d2.y)<0.05){holder=d2.id;break}}
      if(holder&&!s.heldBy[i])addEvent('STATION',droneName(holder),'Face '+(i+1)+' of 12 lit');
      s.heldBy[i]=holder;
      var want=holder?1:0;
      s.faceLit[i]+=(want-s.faceLit[i])*Math.min(1,dt*5);
    }
  }
  function summitSurgeFire(){
    var s=summit,p=s.core.surgePower;
    var dmgMul=(s.phase==='cage')?(1+s.clearance/80):1;
    s.core.surge=0.9;s.core.surges++;s.core.flash=1;
    s.core.r=Math.min(0.105,s.core.r+0.004);
    drones.forEach(function(d){
      if(d.status!=='ACTIVE')return;
      var dx=d.x-s.core.x,dy=d.y-s.core.y,dd=Math.hypot(dx,dy);
      if(dd<0.30){
        var braced=false;
        for(var bi=0;bi<12;bi++){if(s.heldBy[bi]===d.id){braced=true;break}}
        var nx=dx/(dd||1),ny=dy/(dd||1);
        var kv=0.20*p*(braced?0.15:1)*(0.7+Math.random()*0.6);d.vx+=nx*kv;d.vy+=ny*kv;
        d.hp-=18*p*(braced?0.7:1)*dmgMul;d.hit=0.7;
        addEvent('SURGE',d.name,'Core surge; hull '+Math.max(0,Math.round(d.hp))+'%'+(braced?' (braced)':''));
        if(d.hp<=0)disableDrone(d,'core surge');
      }
    });
    s.core.surgePower=1;s.core.strain=Math.min(1,s.core.strain+0.15);
    addEvent('SURGE','CORE','Shockwave released');
  }
  function summitStrainTick(dt){
    var s=summit,all=heldCount()>=12,missing=12-heldCount();
    if(all)s.integrity=Math.min(100,s.integrity+dt*2.5);else s.integrity-=dt*(s.phase==='cage'?0.4:1.2)*missing;
    if(s.integrity<=0){s.integrity=0;summitBreach();return}
    if(s.core.surgeWarn>0){
      s.core.surgeWarn-=dt;
      if(s.core.surgeWarn<=0)summitSurgeFire();
    }else{
      s.surgeT-=dt;
      if(s.surgeT<=0){s.surgeT=6.18;s.core.surgeWarn=1.2;addEvent('SURGE','CORE','Surge building');announce('Surge building. Brace the lattice.')}
    }
  }
  function summitBreach(){
    var s=summit;if(!s||s.phase==='breach'||s.phase==='done')return;
    s.phase='breach';s.breachT=0;
    document.getElementById('summitChoice').hidden=true;
    addEvent('BREACH','CORE','The lattice broke; the core is through');
    announce('The lattice broke.');
    updateAllUI();
  }
  function updateSummit(dt){
    var s=summit;if(!s||s.phase==='done')return;
    s.rot+=dt*(s.phase==='collapse'?1.4:0.22);
    if(s.collapseFlash>0)s.collapseFlash-=dt*1.1;
    if(s.core.surge>0)s.core.surge-=dt;
    if(s.core.flash>0)s.core.flash-=dt*2;
    var i;
    if(s.phase==='coalesce'){
      s.motes.forEach(function(m){
        var dx=s.core.x-m.x,dy=s.core.y-m.y,dd=Math.hypot(dx,dy);
        if(dd<0.025){m.dead=true;s.core.r=Math.min(0.095,s.core.r+0.0009);s.core.hp+=m.mass*0.4;s.core.max+=m.mass*0.4}
        else{var sp=0.24*dt/(dd||1);m.x+=dx*sp;m.y+=dy*sp}
      });
      s.motes=s.motes.filter(function(m){return !m.dead});
      if(!s.motes.length){s.phase='lattice';addEvent('COALESCENCE','CORE','One mass. Twelve stations required.');announce('Coalescence complete. Issue LATTICE — twelve stations.');updateAllUI()}
    }else if(s.phase==='lattice'||s.phase==='strain'||s.phase==='cage'||s.phase==='choice'){
      summitAssign(dt);
      if(s.phase==='lattice'&&heldCount()>=12){
        s.phase='strain';s.surgeT=4;
        addEvent('LATTICE','SWARM','Twelve faces lit; the solid is closed');
        announce('The solid is closed. Hold the twelve.');
        updateAllUI();
      }else if(s.phase==='strain'||s.phase==='cage'){
        summitStrainTick(dt);
        if(s.phase==='strain'){
          if(heldCount()>=12)s.charge=Math.min(100,s.charge+dt*8);
          if(s.charge>=100){s.phase='choice';document.getElementById('summitChoice').hidden=false;addEvent('CHOICE','COMMAND','Lattice charged; the final choice is offered');an