<!-- SOLID CITY · part 1270 -->
ff3048' : '#8a6a2a'; g.font = '800 34px system-ui, sans-serif'; g.textAlign = 'left'; g.fillText(playing ? '● NOW PLAYING · STUDIO RADIO' : '❚❚ STUDIO RADIO · PAUSED', 34, 58);
    g.fillStyle = '#e8c36a'; var fs = 84; g.font = '700 ' + fs + 'px Georgia, serif'; var t = title || 'The King\u2019s music — tap ♪ to play';
    while (g.measureText(t).width > W - 68 && fs > 40) { fs -= 4; g.font = '700 ' + fs + 'px Georgia, serif'; }
    while (g.measureText(t).width > W - 68 && t.length > 4) t = t.slice(0, -2) + '…';
    g.fillText(t, 34, 160); g.fillStyle = '#d9cfd9'; g.font = '700 30px system-ui, sans-serif';
    g.fillText(((kind === 'instrumental' ? 'INSTRUMENTAL' : kind === 'cover' ? 'COVER' : kind ? 'LYRIC SONG' : '') + '   SOLIDBIGISLAND').trim(), 34, 218);
    npT.needsUpdate = true;
  };
  NP.draw('', '', false);
  var dirX = -S.x, dirZ = -S.z, dl = Math.hypot(dirX, dirZ); dirX /= dl; dirZ /= dl;
  var npM = new T.Mesh(new T.PlaneGeometry(48, 12), curve(new T.MeshBasicMaterial({ map: npT, side: T.DoubleSide })));
  npM.position.set(S.x + dirX * 25, Y + 72, S.z + dirZ * 25); npM.rotation.y = Math.atan2(dirX, dirZ); world.add(npM);
  var npM2 = npM.clone(); npM2.scale.setScalar(0.4); npM2.position.set(S.x + dirX * 40, Y + 18, S.z + dirZ * 40); world.add(npM2);
  // radio masts (solid) — stand near them and Studio Radio gets a little louder
  for (k = 0; k < 3; k++) {
    var ma = k / 3 * Math.PI * 2 + 0.4, mx = S.x + Math.cos(ma) * 62, mz = S.z + Math.sin(ma) * 62;
    cyl(0.5, 1.4, 90, M.gun, mx, Y, mz, 6);
    var ant = new T.Mesh(new T.SphereGeometry(1.3, 8, 6), M.red); ant.position.set(mx, Y + 91, mz); world.add(ant);
    RADIO_MASTS.push({ x: mx, z: mz, light: ant });
  }
  sign('MUSIC STUDIO', 'SOLID SOUND · /ss', S.x - 30, Y + 22, S.z + 6, 30, -Math.PI / 2 + 0.38);
  portal(S, S.x - 38, S.z + 16, Math.atan2(-S.x, -S.z));
  // ---- ORBITAL SPACEPORT ----
  var P = D.port;
  var pad = new T.Mesh(new T.CylinderGeometry(42, 44, 2, 48), curve(new T.MeshLambertMaterial({ color: 0x0a080b }))); pad.position.set(P.x, Y + 1, P.z); world.add(pad);
  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);
  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, 2, 40), curve(new T.MeshLambertMaterial({ color: 0x0a0d12 }))); dskPad.position.set(DSK.x, Y + 1, 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 