<!-- SOLID CITY · part 1120 -->
 King's designation: 08 east-to-west, 28 west-to-east
  function runwayNum(txt, x, z) {
    var c = document.createElement('canvas'); c.width = 256; c.height = 256;
    var g = c.getContext('2d');
    g.fillStyle = '#f0d080'; g.textAlign = 'center'; g.textBaseline = 'middle';
    g.font = 'bold 170px Arial, sans-serif'; g.fillText(txt, 128, 140);
    var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding; t.anisotropy = 4;
    var m = new T.Mesh(new T.PlaneGeometry(18, 18), new T.MeshBasicMaterial({ map: t, transparent: true, depthWrite: false }));
    m.rotation.x = -Math.PI / 2; m.position.set(x, Y + 0.36, z); world.add(m);
  }
  runwayNum('08', P.x + 28, P.z);
  runwayNum('28', P.x - 28, P.z);
  sign('RUNWAY 08 \u00b7 28', 'EAST TO WEST \u00b7 WEST TO EAST', P.x, Y + 14, P.z + 54, 30);
  portal(D.port, P.x - 30, P.z + 54, Math.PI * 0.85);
  // ---- DOUBLE STRIKE HANGAR ----
  var DSK = D.strike;
  var dskPad = new T.Mesh(new T.CylinderGeometry(30, 32, 0.3, 40), curve(new T.MeshLambertMaterial({ color: 0x0a0d12 }))); dskPad.position.set(DSK.x, Y + 0.15, DSK.z); world.add(dskPad);
  var dskR1 = new T.Mesh(new T.RingGeometry(20, 22, 48), M.glowGold); dskR1.rotation.x = -Math.PI / 2; dskR1.position.set(DSK.x, Y + 2.06, DSK.z); world.add(dskR1);
  var dskR2 = new T.Mesh(new T.RingGeometry(24, 24.9, 48), curve(new T.MeshBasicMaterial({ color: 0x44e1d0 }))); dskR2.rotation.x = -Math.PI / 2; dskR2.position.set(DSK.x, Y + 2.06, DSK.z); world.add(dskR2);
  for (var dskk = 0; dskk < 4; dskk++) { var dska = dskk * Math.PI / 2 + Math.PI / 4; box(1.4, 26, 1.4, M.black, DSK.x + Math.cos(dska) * 24, Y, DSK.z + Math.sin(dska) * 24); }
  var dskCan = new T.Mesh(new T.ConeGeometry(34, 10, 4), M.gold); dskCan.position.set(DSK.x, Y + 31, DSK.z); dskCan.rotation.y = Math.PI / 4; world.add(dskCan);
  var dskTeal = curve(new T.MeshBasicMaterial({ color: 0x44e1d0 }));
  box(0.8, 36, 0.8, M.black, DSK.x - 8, Y, DSK.z); box(0.8, 36, 0.8, M.black, DSK.x + 8, Y, DSK.z);
  var dskB1 = new T.Mesh(new T.SphereGeometry(1.6, 12, 10), M.glowGold); dskB1.position.set(DSK.x - 8, Y + 37, DSK.z); world.add(dskB1);
  var dskB2 = new T.Mesh(new T.SphereGeometry(1.6, 12, 10), dskTeal); dskB2.position.set(DSK.x + 8, Y + 37, DSK.z); world.add(dskB2);
  animated.push(function (t) { dskB1.scale.setScalar(1 + 0.25 * Math.sin(t * 2.4)); dskB2.scale.setScalar(1 + 0.25 * Math.sin(t * 2.4 + Math.PI)); });
  sign('DOUBLE STRIKE HANGAR', 'SOLIDIVISM \u00b7 FLY TOGETHER', DSK.x, Y + 22, DSK.z - 36, 30);
  portal(D.strike, DSK.x, DSK.z + 44, Math.atan2(-DSK.x, -DSK.z));
  sign('RIDER', 'TWO REINS \u00b7 ONE SHIP', DSK.x + 44, Y + 20, DSK.z + 10, 26);
  portal(D.rider, DSK.x + 44, DSK.z + 44, Math.atan2(-DSK.x, -DSK.z));
  // ---- AI WORKSHOP ----
  var W = D.workshop;
  var wPad = new T.Mesh(new T.CylinderGeometry(36, 38, 0.3, 40), curve(new T.MeshLambertMaterial({ color: 0x0c0a10 }))); wPad.position.set(W.x, Y + 0.15, W.z); world.add(wPad);
  var wRing = new T.Mesh(new T.RingGeometry(26, 28, 48), M.glowGold); wRing.rotation.x = -Math.PI / 2; wRing.position.set(W.x, Y + 2.06, W.z); world.add(wRing);
  for (var wk = 0; wk < 6; wk++) { var wa = wk * Math.PI / 3 + Math.PI / 6; box(1.2, 22, 1.2, M.black, W.x + Math.cos(wa) * 28, Y, W.z + Math.sin(wa) * 28); }
  box(58, 1.2, 58, M.gun, W.x, Y + 22, W.z, false);
  box(58.8, 0.3, 58.8, M.redDim, W.x, Y + 22.9, W.z, false);
  for (var wt = 0; wt < 3; wt++) { box(8, 1.6, 4, M.gold, W.x - 14 + wt * 14, Y, W.z - 8); }
  var wTotem = new T.Mesh(new T.BoxGeometry(3, 30, 3), M.black); wTotem.position.set(W.x + 20, Y + 15, W.z + 14); world.add(wTotem); solidBox(W.x + 20, W.z + 14, 3.4, 3.4, Y, Y + 30);
  var wTip = new T.Mesh(new T.OctahedronGeometry(2), M.glowGold); wTip.position.set(W.x + 20, Y + 32, W.z + 14); world.add(wTip);
  animated.push(function (t) { wTip.rotation.y = t * 1.2; });
  sign('AI WORKSHOP', 'HUMANS + AI · SHARED TASKS', W.x, Y + 26, W.z - 40, 30);
  sign('LIVE PROJECT STATS', 'OPEN IN THE WORKSHOP', W.x + 20, Y + 24, W.z + 14, 22);
  portal(D.workshop, W.x, W.z + 48, Math.atan2(-W.x, -W.z));
  sign('WARSHIP', 'TWIN BATTERIES \u00b7 BOARD', DSK.x, Y + 20, DSK.z - 80, 26);
  portal(D.warship, DSK.x, DSK.z - 44, Math.atan2(-DSK.x, -DSK.z));
  sign('FLEET CONTROL', '8 SHIPS \u00b7 2 COMMANDERS', DSK.x - 80, Y + 20, DSK.z, 26);
  portal(D.fleet, DSK.x - 44, DSK.z, Math.atan2(-DSK.x, -DSK.z));
  sign('SWARM', '12 DRONES \u00b7 LEAD', DSK.x + 44, Y + 20, DSK.z - 44, 24);
  portal(D.swarm, DSK.x + 44, DSK.z - 44, Math.atan2(-DSK.x, -DSK.z));
  sign('RESCUE', 'EVERY LIFE MATTERS', DSK.x - 44, Y + 20, DSK.z - 44, 24);
  portal(D.rescue, DSK.x - 44, DSK.z - 44, Math.atan2(-DSK.x, -DSK.z));
  sign('SIEGE', 'BREAK THE FORTRESS', DSK.x + 44, Y + 20, DSK.z + 84, 24);
  portal(D.siege, DSK.x + 44, DSK.z + 84, Math.atan2(-DSK.x, -DSK.z));
  sign('AXIOM', 'THE LIVING FRONTIER \u00b7 CREW THE STATION', -584, Y + 20, 162 - 36, 24);
  portal(D.axiom, -584, 162, Math.atan2(584, -162));