<!-- SOLID CITY · part 2924 -->
ent.getElementById('debrief'),debriefEyebrow:document.getElementById('debriefEyebrow'),debriefTitle:document.getElementById('debriefTitle'),scoreHull:document.getElementById('scoreHull'),scoreHandoffs:document.getElementById('scoreHandoffs'),scoreTime:document.getElementById('scoreTime'),
    stage:document.querySelector('.stage'),pauseBtn:document.getElementById('pauseBtn'),pauseOverlay:document.getElementById('pauseOverlay'),resumeBtn:document.getElementById('resumeBtn')
  };
  var W=1000,H=560,dpr=1,last=0,raf=0,pauseStarted=0;
  var state,keys={},pointerMove=false,pointerWeapon=false,pausedReleases={move:false,weapon:false};
  var input={move:{x:0,y:0},weapon:{x:1,y:0},firing:false};
  var owners={move:'human',weapon:'ai'},releaseAt={move:0,weapon:0};
  var mode='rider';
  var colors={gold:'#f0b83b',gold2:'#ffde78',teal:'#43d8cf',teal2:'#8afff6',red:'#ff6259',white:'#e8f7f3'};

  function resize(){
    var r=canvas.getBoundingClientRect();dpr=Math.min(window.devicePixelRatio||1,2);
    canvas.width=Math.max(1,Math.round(r.width*dpr));canvas.height=Math.max(1,Math.round(r.height*dpr));
    W=r.width;H=r.height;ctx.setTransform(dpr,0,0,dpr,0,0);
  }
  window.addEventListener('resize',resize,{passive:true});resize();

  function reset(){
    state={running:false,paused:false,elapsed:0,hull:100,progress:0,target:3600,kills:0,handoffs:0,conflicts:0,warnings:0,warningOn:false,warningCooldown:0,spawn:1.1,shot:0,player:{x:W*.30,y:H*.52,vx:0,vy:0},wing:{x:W*.22,y:H*.61},enemies:[],rocks:[],bullets:[],enemyBullets:[],stars:[],particles:[],novas:[],
      summit:{active:false,phase:'approach',twin:null,core:null,wing:'formation',fizzleWarned:false},summitAlert:null};
    for(var i=0;i<100;i++)state.stars.push({x:Math.random()*W,y:Math.random()*H,z:.25+Math.random()*.9});
    els.pauseBtn.hidden=true;els.pauseOverlay.hidden=true;els.stage.classList.remove('is-running');pauseStarted=0;pausedReleases.move=pausedReleases.weapon=false;
    els.mirrorWrap.hidden=true;els.mirrorBar.style.width='100%';els.mirrorText.textContent='100%';
    applyMode(mode,false); updateHud(); els.logList.innerHTML=''; log('SYS','Rider ready','teal');
  }
  function applyMode(next,write){
    if(state&&state.paused)return;
    mode=next;document.querySelectorAll('.preset').forEach(function(b){b.classList.toggle('active',b.dataset.mode===mode)});
    if(mode==='rider'){setOwner('move','human',write);setOwner('weapon','ai',write)}
    if(mode==='archer'){setOwner('move','ai',write);setOwner('weapon','human',write)}
    if(mode==='manual'){setOwner('move','human',write);setOwner('weapon','human',write)}
    releaseAt.move=releaseAt.weapon=0;updateOwners();
    if(write)log('CFG',mode==='rider'?'Human movement · AI weapons':mode==='archer'?'AI movement · Human weapons':'Human holds both','gold');
  }
  document.querySelectorAll('.preset').forEach(function(b){b.addEventListener('click',function(){applyMode(b.dataset.mode,true)})});

  function now(){return performance.now()}
  function setOwner(task,owner,write){
    if(owners[task]===owner)return;
    owners[task]=owner;if(state){state.handoffs++;els.handoffCount.textContent=state.handoffs}
    if(write!==false)log(task==='move'?'MOVE':'ARMS',owner==='human'?'Human claimed task':'AI resumed task',owner==='human'?'gold':'teal');
    updateOwners();
  }
  function claim(task){
    releaseAt[task]=0;var t0=now();setOwner(task,'human',true);var latency=Math.max(1,Math.round(now()-t0));
    (task==='move'?els.moveLatency:els.weaponLatency).textContent=latency+' ms';updateOwners();
  }
  function release(task){releaseAt[task]=now()+800;log(task==='move'?'MOVE':'ARMS','Release detected · guarded coast','');updateOwners()}
  function updateOwners(){
    [['move',els.moveOwner],['weapon',els.weaponOwner]].forEach(function(pair){var task=pair[0],el=pair[1],releasing=releaseAt[task]>now();el.className='owner '+(releasing?'release':owners[task]);el.textContent=releasing?'HUMAN → AI':owners[task].toUpperCase()});
  }
  function log(tag,text,tone){
    if(!state)return;var li=document.createElement('li');var sec=Math.floor(state.elapsed);var mm=String(Math.floor(sec/60)).padStart(2,'0'),ss=String(sec%60).padStart(2,'0');li.innerHTML='<time>'+mm+':'+ss+'</time><span><b class="'+(tone||'')+'">'+tag+'</b> · '+text+'</span>';els.logList.insertBefore(li,els.logList.firstChild);while(els.logList.children.length>24)els.logList.lastChild.remove();
  }

  function bindPad(id,nub,task){
    var pad=document.getElementById(id),active=null;
    function move(e){if(e.pointerId!==active||state.paused)return;var r=pad.getBoundingClientRect(),x=(e.clientX-r.left)/r.width*2-1,y=(e.clientY-r.top)/r.height*2-1,m=Math.hypot(x,y);if(m>1){x/=m;y/=m}input[task].x=x;input[task].y=y;nub.style.left=((x*.39+.5)*100)+'%';nub.style.top=((y*.39+.5)*100)+'%';if(task==='weapon')input.firing=true}
    pad.addEventListener('pointerdown',function(e){e.preventDefault();if(state.paused)return;active=e.pointerId;