<!-- SOLID CITY · part 2925 -->
pad.setPointerCapture(active);if(task==='move')pointerMove=true;else pointerWeapon=true;claim(task);move(e)});
    pad.addEventListener('pointermove',move);
    function end(e){if(e.pointerId!==active)return;active=null;if(task==='move')pointerMove=false;else pointerWeapon=false;if(state.paused){pausedReleases[task]=true;return}input[task]={x:task==='weapon'?1:0,y:0};input.firing=false;nub.style.left='50%';nub.style.top='50%';release(task)}
    pad.addEventListener('pointerup',end);pad.addEventListener('pointercancel',end);
  }
  bindPad('movePad',document.getElementById('moveNub'),'move');bindPad('weaponPad',document.getElementById('weaponNub'),'weapon');

  window.addEventListener('keydown',function(e){
    var k=e.key.toLowerCase();if(['w','a','s','d','arrowup','arrowdown','arrowleft','arrowright',' '].indexOf(k)>=0)e.preventDefault();
    if(state&&state.paused)return;if(keys[k])return;keys[k]=true;
    if('wasd'.indexOf(k)>=0)claim('move');if(k.indexOf('arrow')===0||k===' ')claim('weapon');
  });
  window.addEventListener('keyup',function(e){
    var k=e.key.toLowerCase(),moveReleased='wasd'.indexOf(k)>=0,weaponReleased=k.indexOf('arrow')===0||k===' ';keys[k]=false;
    var noMove=!['w','a','s','d'].some(function(x){return keys[x]}),noWeapon=!['arrowup','arrowdown','arrowleft','arrowright',' '].some(function(x){return keys[x]});
    if(state&&state.paused){if(moveReleased&&noMove)pausedReleases.move=true;if(weaponReleased&&noWeapon)pausedReleases.weapon=true;return}
    if(moveReleased&&noMove)release('move');if(weaponReleased&&noWeapon)release('weapon');
  });

  function keyboardInput(){
    if(!pointerMove){var x=(keys.d?1:0)-(keys.a?1:0),y=(keys.s?1:0)-(keys.w?1:0),m=Math.hypot(x,y)||1;input.move.x=x/m;input.move.y=y/m}
    if(!pointerWeapon){var ax=(keys.arrowright?1:0)-(keys.arrowleft?1:0),ay=(keys.arrowdown?1:0)-(keys.arrowup?1:0);if(ax||ay){var am=Math.hypot(ax,ay);input.weapon.x=ax/am;input.weapon.y=ay/am}input.firing=!!keys[' ']}
  }

  function launch(){reset();state.running=true;last=performance.now();els.startCard.hidden=true;els.debrief.hidden=true;els.pauseBtn.hidden=false;els.stage.classList.add('is-running');log('SYS','Route 01 launched','teal');cancelAnimationFrame(raf);raf=requestAnimationFrame(loop)}
  function pauseGame(){
    if(!state.running||state.paused)return;state.paused=true;pauseStarted=now();cancelAnimationFrame(raf);els.pauseBtn.hidden=true;els.pauseOverlay.hidden=false;document.querySelectorAll('.preset').forEach(function(b){b.disabled=true});els.resumeBtn.focus();
  }
  function resumeGame(){
    if(!state.running||!state.paused)return;var pausedFor=now()-pauseStarted;if(releaseAt.move)releaseAt.move+=pausedFor;if(releaseAt.weapon)releaseAt.weapon+=pausedFor;state.paused=false;pauseStarted=0;
    if(pausedReleases.move&&!pointerMove&&!['w','a','s','d'].some(function(x){return keys[x]})){input.move={x:0,y:0};document.getElementById('moveNub').style.left='50%';document.getElementById('moveNub').style.top='50%';release('move')}
    if(pausedReleases.weapon&&!pointerWeapon&&!['arrowup','arrowdown','arrowleft','arrowright',' '].some(function(x){return keys[x]})){input.weapon={x:1,y:0};input.firing=false;document.getElementById('weaponNub').style.left='50%';document.getElementById('weaponNub').style.top='50%';release('weapon')}
    pausedReleases.move=pausedReleases.weapon=false;document.querySelectorAll('.preset').forEach(function(b){b.disabled=false});els.pauseOverlay.hidden=true;els.pauseBtn.hidden=false;els.resumeBtn.blur();last=performance.now();raf=requestAnimationFrame(loop);
  }
  els.pauseBtn.addEventListener('pointerdown',function(e){e.stopPropagation()});els.pauseBtn.addEventListener('click',pauseGame);els.resumeBtn.addEventListener('click',resumeGame);
  document.getElementById('launchBtn').addEventListener('click',launch);document.getElementById('againBtn').addEventListener('click',launch);

  function nearestThreat(){
    var best=null,bd=1e9;state.enemies.forEach(function(e){var d=Math.hypot(e.x-state.player.x,e.y-state.player.y);if(d<bd){bd=d;best=e}});state.rocks.forEach(function(e){var d=Math.hypot(e.x-state.player.x,e.y-state.player.y);if(d<bd){bd=d;best=e}});var twt=state.summit.twin;if(twt&&twt.hp>0){var td=Math.hypot(twt.x-state.player.x,twt.y-state.player.y);if(td<bd){bd=td;best=twt}}return {obj:best,d:bd};
  }
  function aiMove(){
    var y=(H*.5-state.player.y)/Math.max(H*.35,1),x=.82,th=nearestThreat();
    if(th.obj&&th.d<170){var dy=state.player.y-th.obj.y;y+=(dy>=0?1:-1)*(1-th.d/190)*1.8}
    return {x:x,y:Math.max(-1,Math.min(1,y))};
  }
  function aiWeapon(){var best=null,bd=1e9;state.enemies.forEach(function(e){var d=Math.hypot(e.x-state.player.x,e.y-state.player.y);if(d<bd){bd=d;best=e}});if(!best)return {x:1,y:0,fire:false};var dx=best.x-state.player.x,dy=best.y-state.player.y,m=Math.hypot(dx,dy)||1;return {x:dx/m,y:dy/m,fire:bd<520}}
  function blendInput(task,dt){
    if(releaseAt[task]&&now()>=releaseAt[ta