<!-- SOLID CITY · part 586 -->
d);
  for (k = 0; k < 3; k++) { var pr = new T.Mesh(new T.RingGeometry(14 + k * 9, 15 + k * 9, 64), k === 1 ? M.red : M.glowGold); pr.rotation.x = -Math.PI / 2; pr.position.set(P.x, Y + 2.08, P.z); world.add(pr); }
  // gantry (solid)
  box(4, 70, 4, M.gun, P.x + 30, Y, P.z - 6); box(18, 2, 2, M.gold, P.x + 22, Y + 50, P.z - 6, false);
  for (k = 0; k < 4; k++) { var bl = new T.Mesh(new T.SphereGeometry(0.8, 8, 6), M.red); bl.position.set(P.x + 30, Y + 18 + k * 17, P.z - 8.2); world.add(bl); }
  // control tower + hangar posts
  cyl(6, 8, 46, M.black, P.x - 60, Y, P.z - 30, 6);
  var cab = cyl(12, 9, 8, curve(new T.MeshLambertMaterial({ color: 0x220408, emissive: 0x5a0410 })), P.x - 60, Y + 46, P.z - 30, 6, false);
  for (k = 0; k < 4; k++) box(1.2, 18, 1.2, M.black, P.x + 58 + (k & 1) * 30, Y, P.z + 20 + (k >> 1) * 30);
  box(34, 1, 34, M.gold, P.x + 73, Y + 18, P.z + 35, false);
  // the King's emblem banner (existing solid-playtime asset)
  var em = new T.TextureLoader().load('/city/emblem.webp'); em.encoding = T.sRGBEncoding;
  var ban = new T.Mesh(new T.PlaneGeometry(20, 20), curve(new T.MeshBasicMaterial({ map: em, side: T.DoubleSide }))); ban.position.set(P.x - 60, Y + 66, P.z - 30); world.add(ban);
  animated.push(function (t) { ban.rotation.y = t * 0.25; });
  sign('ORBITAL SPACEPORT', 'BOARD · LAUNCH · FLY', P.x, Y + 30, P.z - 52, 34);
  // Runway 08/28 — the 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