<!-- SOLID CITY · part 3700 -->
erse());}
function eventRows(rows){if(!rows.length)return '<div class="log-row"><time>—</time><b>No events recorded yet.</b></div>';return rows.map(e=>'<div class="log-row"><time>'+formatTime(e.mission)+'</time><b>'+describe(e)+'</b></div>').join('');}
function formatTime(ms){const s=Math.max(0,ms/1000);return Math.floor(s/60)+':'+String(Math.floor(s%60)).padStart(2,'0')+'.'+Math.floor((s%1)*10);}
function describe(e){const t=stationLabel(e.task)||e.task;switch(e.type){case'ownership':return t+' owner → '+String(e.owner).toUpperCase()+' · epoch '+e.epoch;case'handoff':return t+' handoff to '+e.to.toUpperCase()+' measured '+e.latency+' ms';case'handoff_start':return t+' safe handoff started';case'command_rejected':return 'REJECTED '+t+' command · '+e.reason;case'threat_destroyed':return e.threat+' destroyed by '+e.battery+' · '+e.owner;case'hit':return e.battery+' hit '+e.target+' · '+e.owner+' · '+e.damage+' damage';case'damage_taken':return e.impactFace.toUpperCase()+' impact · shield faced '+e.shieldFace.toUpperCase()+' · '+e.rating+'% facing rating · '+e.absorbedPct+'% actually absorbed · hull damage '+e.amount+'%';case'mission_arrival':return 'Arrival recorded at '+e.progress+'% · hull '+e.hull+'%';default:return e.type.replaceAll('_',' ')+' · '+(e.owner||e.threat||e.task||'recorded');}}
function renderCoord(){const types=['ownership','handoff','handoff_start','command_rejected'];$('coordLog').innerHTML=eventRows(events.filter(e=>types.includes(e.type)).slice(-80).reverse());}

window.__warshipShieldAudit=Object.freeze({
  protection:(facing,impactFace)=>Math.round(shieldProtection(facing,impactFace)*100),
  outcome:(facing,impactFace,amount=8)=>{const protection=shieldProtection(facing,impactFace);return {facing,impactFace,protection:Math.round(protection*100),absorbed:+(amount*protection).toFixed(1),hullDamage:+(amount*(1-protection)).toFixed(1)};},
  current:()=>({facing:ship.shieldFace,status:$('defenseStatus').textContent})
});

['emHelm','emShield','emGuns'].forEach((id,i)=>$(id).addEventListener('click',()=>emergencyAction(i)));
 document.querySelectorAll('.station').forEach(el=>{const station=el.dataset.station;el.querySelector('.reclaim').addEventListener('click',()=>claim(station));el.querySelectorAll('[data-action]').forEach(btn=>{const action=btn.dataset.action;btn.addEventListener('pointerdown',ev=>{ev.preventDefault();if(action==='release'){release(station);return;}humanCommand(station,()=>{if(action==='left')ship.navInput=-1;if(action==='right')ship.navInput=1;if(action==='up')ship.boost=true;if(action==='cycle')cycleTarget(station);if(action==='fire')fireBattery(station,'human');if(action.startsWith('shield'))ship.shieldFace=action.replace('shield','').toLowerCase();});});});});
document.addEventListener('keydown',e=>{if(!running||paused||ended||e.repeat)return;if(e.key==='ArrowLeft')humanCommand('nav',()=>ship.navInput=-1);if(e.key==='ArrowRight')humanCommand('nav',()=>ship.navInput=1);if(e.key==='ArrowUp')humanCommand('nav',()=>ship.boost=true);if(e.key.toLowerCase()==='a')humanCommand('batteryA',()=>fireBattery('batteryA','human'));if(e.key.toLowerCase()==='b')humanCommand('batteryB',()=>fireBattery('batteryB','human'));});
$('deployBtn').addEventListener('click',()=>{$('briefing').hidden=true;reset();running=true;document.body.classList.add('game-active');$('pauseBtn').hidden=false;last=performance.now();emit('mission_start',{objective:'Meridian Gate',range_km:8000});});
$('againBtn').addEventListener('click',()=>{$('debrief').hidden=true;reset();running=true;document.body.classList.add('game-active');$('pauseBtn').hidden=false;last=performance.now();emit('mission_start',{objective:'Meridian Gate',range_km:8000});});
$('pauseBtn').addEventListener('click',()=>{if(!running||paused)return;paused=true;$('pauseOverlay').hidden=false;emit('mission_paused',{by:'human'});$('resumeBtn').focus();});
$('resumeBtn').addEventListener('click',()=>{if(!running)return;last=performance.now();paused=false;$('pauseOverlay').hidden=true;emit('mission_resumed',{by:'human'});$('pauseBtn').focus();});
$('statsBtn').addEventListener('click',()=>{renderStats();$('statsModal').hidden=false;});$('eventBtn').addEventListener('click',()=>{renderCoord();$('eventsModal').hidden=false;});document.querySelectorAll('[data-close]').forEach(b=>b.addEventListener('click',()=>$(b.dataset.close).hidden=true));
window.addEventListener('resize',resize,{passive:true});resize();reset();raf=requestAnimationFrame(loop);
})();
</script>
</body>
</html>

===== FILE: public/city/warship-iii/index.html.bak-orig =====
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=1, user-scalable=no">
  <meta name="color-scheme" content="light dark">
  <link rel="icon" href="data:,">
  <title>Warship</title>
  <style>
    :root{
      color-scheme:light dark;
      --bg:#e8eef1;--panel:#f7fafb;-