<!-- SOLID CITY · part 3476 -->
ath.min(w,h),0,Math.PI*2);ctx.stroke();ctx.globalAlpha=1}if(sel){ctx.strokeStyle='#ffc34d';ctx.lineWidth=2;ctx.beginPath();ctx.arc(0,0,17,0,Math.PI*2);ctx.stroke()}ctx.rotate(Math.atan2(d.vy,d.vx)||0);ctx.fillStyle=human?'#ffc34d':'#52e0d0';ctx.beginPath();ctx.moveTo(11,0);ctx.lineTo(-7,-6);ctx.lineTo(-3,0);ctx.lineTo(-7,6);ctx.closePath();ctx.fill();ctx.fillStyle='#dffefa';ctx.fillRect(-2,-2,5,4);ctx.restore();ctx.fillStyle=human?'#ffd786':'#a9f3eb';ctx.font='700 9px ui-monospace,monospace';ctx.fillText(d.name,x-12,y+22)});
  }

  function updateHUD(){
    var integrity=Math.round(drones.reduce(function(a,d){return a+Math.max(0,d.hp)},0)/12);document.getElementById('integrityValue').textContent=integrity+'%';document.getElementById('integrityValue').style.color=integrity<55?'var(--red)':'var(--green)';document.getElementById('progressFill').style.width=Math.min(100,progress)+'%';document.getElementById('progressText').textContent=Math.floor(Math.min(100,progress))+'% TO EXIT VECTOR';document.getElementById('phaseText').textContent='WAVE '+wave+' · '+(wave<4?'ESCALATING':'FINAL PRESSURE');document.getElementById('queueHealth').textContent='LOCAL · '+commandQueue.length+' QUEUED';
  }
  function updateMetrics(){document.getElementById('metricOrders').textContent=count('ORDER');document.getElementById('metricClaims').textContent=count('TAKEOVER');document.getElementById('metricCleared').textContent=count('CLEARED');document.getElementById('metricRejected').textContent=count('REJECTED')}
  function updateAllUI(){
    document.getElementById('activeOrder').textContent=activeOrder;document.querySelectorAll('.order-btn').forEach(function(b){b.classList.toggle('active',b.dataset.order===activeOrder)});
    var human=drones.filter(function(d){return d.owner==='HUMAN'&&d.status==='ACTIVE'}).length,active=drones.filter(function(d){return d.status==='ACTIVE'}).length;document.getElementById('humanCount').textContent=human;document.getElementById('aiCount').textContent=active-human;document.getElementById('statusLine').textContent=active+' ACTIVE';
    var d=drones.find(function(x){return x.id===selectedId});document.getElementById('selectedName').textContent=d?d.name+' · '+d.group:'No drone selected';document.getElementById('selectedOwner').textContent=d?(d.owner==='HUMAN'?'HUMAN · EPOCH '+d.epoch:'AI · TAP TO CLAIM'):'TAP TO CLAIM';
    var roster=document.getElementById('roster');roster.innerHTML='';drones.forEach(function(dr){var b=document.createElement('button');b.className='drone-tile '+(dr.owner==='HUMAN'?'human ':'')+(dr.status==='DISABLED'?'disabled ':'')+(dr.id===selectedId?'active':'');b.innerHTML='<b>'+dr.name+'</b><span>'+(dr.status==='DISABLED'?'disabled':dr.owner+' · '+dr.task)+'</span>';b.setAttribute('aria-label',dr.name+', '+dr.owner+', '+dr.status+', '+dr.task);b.addEventListener('click',function(){claimDrone(dr.id)});roster.appendChild(b)});updateMetrics();updateHUD();
  }
  function openStats(){
    if(paused)return;var types=['ORDER','TAKEOVER','HANDOFF','CLEARED','LOST','RECOVERED','REJECTED'];var labels=['Orders','Takeovers','Handoffs','Cleared','Lost','Recovered','Stale rejected'];var html='';types.forEach(function(t,i){html+='<div class="metric"><b>'+count(t)+'</b><span>'+labels[i]+'</span></div>'});document.getElementById('statsSummary').innerHTML=html;
    document.getElementById('droneRows').innerHTML=drones.map(function(d){return '<tr><td><b>'+d.name+'</b> · '+d.group+'</td><td class="'+(d.owner==='HUMAN'?'owner-human':'owner-ai')+'">'+d.owner+'</td><td>'+d.epoch+'</td><td>'+d.task+'</td><td>'+d.status+'</td><td>'+Math.max(0,Math.round(d.hp))+'%</td></tr>'}).join('');
    document.getElementById('eventList').innerHTML=events.slice().reverse().map(function(e){return '<div class="event"><time>'+e.time+'</time><b>'+e.type+'</b><span><strong>'+e.subject+':</strong> '+e.detail+'</span></div>'}).join('');document.getElementById('statsDialog').showModal();
  }
  function pointerDrone(ev){var r=canvas.getBoundingClientRect(),x=(ev.clientX-r.left)/r.width,y=(ev.clientY-r.top)/r.height,best=null,dist=.045;drones.forEach(function(d){if(d.status!=='ACTIVE')return;var dd=Math.hypot(d.x-x,(d.y-y)*r.height/r.width);if(dd<dist){dist=dd;best=d}});if(best)claimDrone(best.id)}
  canvas.addEventListener('pointerdown',pointerDrone);
  document.getElementById('orderGrid').addEventListener('click',function(e){var b=e.target.closest('[data-order]');if(b)issueOrder(b.dataset.order)});
  document.querySelectorAll('[data-dir]').forEach(function(b){var dir=b.dataset.dir;function on(e){e.preventDefault();pressed[dir]=true}function off(e){e.preventDefault();pressed[dir]=false}b.addEventListener('pointerdown',on);b.addEventListener('pointerup',off);b.addEventListener('pointercancel',off);b.addEventListener('pointerleave',off)});
  window.addEventListener('keydown',function(e){if(paused)return;var map={ArrowUp:'up',w:'up',ArrowDown:'down',s:'down',ArrowLeft:'left',a:'left',ArrowRight:'ri