<!-- SOLID CITY · part 3195 -->
65;addShot({x:state.ship.x+.03,y:state.ship.y},t,'bombard',owner,52);record('BOMBARDMENT_FIRED',{owner:owner,target:t.type,epoch:tasks.bombard.epoch});
  }
  function strikeWings(owner){
    if(state.wingCooldown>0||state.wings<=0||!state.running)return;
    var t=selectedTarget&&selectedTarget.alive?selectedTarget:firstAlive();if(!t)return;
    state.wingCooldown=.72;addShot({x:state.ship.x+.045,y:state.ship.y+.02},t,'wing',owner,9+Math.min(13,state.wings*.8));record('WING_STRIKE',{owner:owner,target:t.type,epoch:tasks.wings.epoch});
  }
  function firstAlive(){for(var i=0;i<state.targets.length;i++)if(state.targets[i].alive)return state.targets[i];return null;}
  function hitTarget(shot){
    var t=shot.target;if(!t||!t.alive)return;t.hp-=shot.damage;burst(t.x,t.y,shot.kind==='bombard'?'#ffb33b':'#2de2d5',shot.kind==='bombard'?18:7);
    if(shot.kind==='bombard')record('BOMBARDMENT_HIT',{owner:shot.owner,target:t.type,damage:shot.damage});
    if(t.hp<=0){t.hp=0;t.alive=false;record('TARGET_DESTROYED',{owner:shot.owner,target:t.type,phase:state.phase+1});advise((shot.owner==='HUMAN'?'Direct hit. ':'AI strike confirmed. ')+t.type.toUpperCase()+' destroyed.');checkPhase();}
  }
  function checkPhase(){
    if(state.targets.some(function(t){return t.alive}))return;
    record('PHASE_COMPLETED',{phase:state.phase+1,duration:state.time});
    if(state.phase===2){endGame(true);return;}
    state.phase++;state.ship.shield=Math.min(state.ship.maxShield,state.ship.shield+70);state.phaseDelay=.85;
  }
  function enemyFire(){
    var alive=state.targets.filter(function(t){return t.alive});if(!alive.length)return;
    var origin=alive[Math.floor(Math.random()*alive.length)];var aim={x:state.ship.x+(Math.random()-.5)*.08,y:state.ship.y+(Math.random()-.5)*.08};
    state.enemyShots.push({x:origin.x,y:origin.y,tx:aim.x,ty:aim.y,t:0,d:.75+Math.random()*.45,damage:state.phase===0?12:state.phase===1?17:23});record('FORTRESS_FIRED',{phase:state.phase+1});
  }
  function enemyHit(s){
    if(state.aegisBurst>0&&Math.random()<.72){record('POINT_DEFENSE_INTERCEPT',{owner:tasks.aegis.owner,epoch:tasks.aegis.epoch});burst(s.x,s.y,'#58dbd0',7);return;}
    var dmg=s.damage;if(state.ship.shield>0){var used=Math.min(state.ship.shield,dmg);state.ship.shield-=used;dmg-=used;record('SHIELD_ABSORBED',{owner:tasks.aegis.owner,damage:used});}
    if(dmg>0){state.ship.hp-=dmg;record('FLEET_DAMAGED',{damage:dmg});}
    if(Math.random()<.13+state.phase*.04&&state.wings>2){state.wings--;record('WING_LOST',{phase:state.phase+1});advise('Interceptor contact — one wing lost. Aegis screen recommended.',true);}
    burst(state.ship.x,state.ship.y,'#ff4b35',10);
    if(state.ship.hp<=0)endGame(false);
  }
  function burst(x,y,c,n){for(var i=0;i<n;i++)state.particles.push({x:x,y:y,vx:(Math.random()-.5)*.16,vy:(Math.random()-.5)*.16,t:0,d:.3+Math.random()*.55,c:c});}
  function claim(task){
    if(!state||!state.running)return;var t=tasks[task],start=performance.now(),old=t.owner;t.epoch++;t.owner=t.owner==='HUMAN'?'AI':'HUMAN';state.lastInput=state.time;
    record('OWNERSHIP_TRANSFER',{task:task,from:old,to:t.owner,epoch:t.epoch,latencyMs:Math.max(0,performance.now()-start)});
    record('STALE_COMMAND_REJECTED',{task:task,rejectedEpoch:t.epoch-1,currentEpoch:t.epoch,source:old});
    updateStations();advise(t.owner==='HUMAN'?'You have '+task.toUpperCase()+'. '+t.admiral+' is advisory only.':t.admiral+' has '+task.toUpperCase()+'. Safe handoff complete.');
  }
  function humanMove(dx,dy){if(tasks.fleet.owner!=='HUMAN')return;state.ship.x=Math.max(.08,Math.min(.48,state.ship.x+dx));state.ship.y=Math.max(.18,Math.min(.82,state.ship.y+dy));state.lastInput=state.time;record('FLEET_MANEUVER',{owner:'HUMAN',x:state.ship.x,y:state.ship.y,epoch:tasks.fleet.epoch});}
  function aegisAction(){if(tasks.aegis.owner!=='HUMAN')return;state.aegisBurst=2.6;state.lastInput=state.time;record('AEGIS_FOCUSED',{owner:'HUMAN',epoch:tasks.aegis.epoch});advise('Point-defense focus active for 2.6 seconds.');}
  function toggleFormation(){state.formation=state.formation==='SCREEN'?'LANCE':'SCREEN';state.lastInput=state.time;record('FORMATION_CHANGED',{owner:'HUMAN',formation:state.formation,epoch:tasks.wings.epoch});updateStations();}
  function ai(dt){
    if(tasks.fleet.owner==='AI'){state.ship.y+=Math.sin(state.time*.42)*dt*.018;state.ship.y=Math.max(.28,Math.min(.72,state.ship.y));}
    if(tasks.bombard.owner==='AI'&&state.bombardCooldown<=0)fireBombard('AI');
    if(tasks.wings.owner==='AI'&&state.wingCooldown<=0)strikeWings('AI');
    if(tasks.aegis.owner==='AI'&&state.aegisBurst<=0&&state.enemyShots.length>1){state.aegisBurst=1.8;record('AEGIS_FOCUSED',{owner:'AI',epoch:tasks.aegis.epoch});}
  }
  function update(dt){
    if(!state.running)return;state.time+=dt;state.bombardCooldown=Math.max(0,state.bombardCooldown-dt);state.wingCooldown=Math.max(0,state.wingCooldown-dt);state.enemyCooldown-=dt;state.aegisBurst=Math.max(0,state.aegisB