<!-- SOLID CITY · part 1837 -->
d+'. The next flight begins with everything you learned.';document.querySelector('#handoffLog').innerHTML=(metrics.handoffs.length?metrics.handoffs:['No takeovers recorded']).map(function(x){return '<div><em>'+x.slice(0,5)+'</em>'+x.slice(5)+'</div>'}).join('');document.querySelector('#assistLog').innerHTML=(metrics.assists.length?metrics.assists:['Assist remained disarmed or no collision threat entered the prediction window.']).map(function(x){return '<div>'+x+'</div>'}).join('');debrief.hidden=false;debrief.querySelector('.debrief-card').scrollTop=0}
  function pointerDown(i,e){if(!running)return;e.preventDefault();var c=controls[i],r=views[i].getBoundingClientRect();c.active=true;c.pointer=e.pointerId;c.startX=e.clientX-r.left;c.startY=e.clientY-r.top;c.x=0;c.y=0;views[i].setPointerCapture(e.pointerId);var st=views[i].querySelector('.stick');st.style.left=c.startX+'px';st.style.top=c.startY+'px';st.classList.add('show');c.inputStamp=performance.now();requestAnimationFrame(function(){metrics.latencies.push(performance.now()-c.inputStamp)});if(i===1){notify(1,'YOU HAVE THE STICK',1100);logH('human took Ship Two')}}
  function pointerMove(i,e){var c=controls[i];if(!c.active||c.pointer!==e.pointerId)return;var r=views[i].getBoundingClientRect(),dx=e.clientX-r.left-c.startX,dy=e.clientY-r.top-c.startY,l=Math.hypot(dx,dy),max=38;if(l>max){dx=dx/l*max;dy=dy/l*max}c.x=dx/max;c.y=dy/max;var knob=views[i].querySelector('.stick b');knob.style.transform='translate('+dx+'px,'+dy+'px)'}
  function pointerUp(i,e){var c=controls[i];if(!c.active||c.pointer!==e.pointerId)return;c.active=false;c.x=0;c.y=0;c.pointer=null;c.lastRelease=performance.now();views[i].querySelector('.stick').classList.remove('show');views[i].querySelector('.stick b').style.transform='';if(i===1){c.resumePending=true;logH('human released Ship Two · grace period')}}
  function fireDown(e){if(!running)return;e.preventDefault();e.stopPropagation();fireControl.active=true;fireControl.pointer=e.pointerId;fireEl.setPointerCapture(e.pointerId);fireEl.classList.add('firing');ships[0].manualFire=0}
  function fireUp(e){if(fireControl.pointer!==e.pointerId)return;e.preventDefault();e.stopPropagation();fireControl.active=false;fireControl.pointer=null;fireEl.classList.remove('firing')}
  fireEl.addEventListener('pointerdown',fireDown);fireEl.addEventListener('pointerup',fireUp);fireEl.addEventListener('pointercancel',fireUp);fireEl.addEventListener('contextmenu',function(e){e.preventDefault()});
  views.forEach(function(v,i){v.addEventListener('pointerdown',function(e){pointerDown(i,e)});v.addEventListener('pointermove',function(e){pointerMove(i,e)});v.addEventListener('pointerup',function(e){pointerUp(i,e)});v.addEventListener('pointercancel',function(e){pointerUp(i,e)})});
  addEventListener('keydown',function(e){var relevant=/^(Key[WASD]|Arrow(Up|Down|Left|Right))$/.test(e.code);if(!relevant)return;e.preventDefault();if(!keys[e.code]){var i=e.code.indexOf('Arrow')===0?1:0,now=performance.now();metrics&&metrics.latencies.push(Math.max(0,performance.now()-now));if(i===1&&!controls[1].keyActive){controls[1].keyActive=true;notify(1,'YOU HAVE THE STICK',1100);if(metrics)logH('keyboard took Ship Two')}}keys[e.code]=true});
  addEventListener('keyup',function(e){keys[e.code]=false;if(e.code.indexOf('Arrow')===0&&!keys.ArrowUp&&!keys.ArrowDown&&!keys.ArrowLeft&&!keys.ArrowRight){controls[1].keyActive=false;controls[1].lastRelease=performance.now();controls[1].resumePending=true;if(metrics)logH('keyboard released Ship Two · grace period')}});
  armEl.addEventListener('change',function(){if(!running)return;notify(0,armEl.checked?'ASSIST ARMED':'ASSIST OFF',800);logA(armEl.checked?'assistance armed':'assistance disarmed')});
  document.querySelector('#launch').addEventListener('click',begin);document.querySelector('#continueLevel').addEventListener('click',function(){var next=levelBeat.dataset.next;if(next==='depthComplete'){transitioning=false;running=true;endRun()}else enterLevel(Number(next))});document.querySelector('#again').addEventListener('click',begin);
  init();running=false;requestAnimationFrame(frame);
})();
</script>
<style>body[data-orient="portrait"] .views{grid-template-columns:1fr;grid-template-rows:1fr 1fr}body[data-orient="portrait"] .view:first-child{border-right:0;border-bottom:1px solid #344054}body[data-orient="landscape"] .views{grid-template-columns:1fr 1fr;grid-template-rows:none}body[data-orient="landscape"] .view:first-child{border-right:1px solid #344054;border-bottom:0}</style><script>(function(){function o(){var vv=window.visualViewport,_w=vv?vv.width:window.innerWidth,_h=vv?vv.height:window.innerHeight;document.body.dataset.orient=_h>=_w?"portrait":"landscape"}window.addEventListener("resize",o);window.addEventListener("orientationchange",o);if(window.visualViewport)visualViewport.addEventListener("resize",o);o();})();</script></body>
</html>


===== FILE: public/city/double-strike-ascension/index.html.