<!-- SOLID CITY · part 1249 -->
FORUM PLAZA ----
  var floor = new T.Mesh(new T.CircleGeometry(110, 64), M.board); floor.rotation.x = -Math.PI / 2; floor.position.set(0, Y + 0.12, 0); world.add(floor);
  var rim = new T.Mesh(new T.RingGeometry(108, 111, 64), M.glowGold); rim.rotation.x = -Math.PI / 2; rim.position.set(0, Y + 0.15, 0); world.add(rim);
  // open pavilions (Solidivism: no walls — posts + canopy)
  for (var p = 0; p < 6; p++) {
    var a = p / 6 * Math.PI * 2 + 0.26, px = Math.cos(a) * 72, pz = Math.sin(a) * 72;
    for (var q = 0; q < 4; q++) box(0.9, 9, 0.9, M.black, px + (q & 1 ? 6 : -6), Y, pz + (q & 2 ? 6 : -6));
    box(15, 0.7, 15, M.gold, px, Y + 9, pz, false);
    box(15.6, 0.25, 15.6, M.redDim, px, Y + 9.7, pz, false);
  }
  // central monument: the crest obelisk
  box(4, 3, 4, M.gold, 0, Y, 22);
  var ob = cyl(0.2, 1.6, 26, M.black, 0, Y + 3, 22, 4); ob.rotation.y = Math.PI / 4;
  var tip = new T.Mesh(new T.OctahedronGeometry(1.4), M.red); tip.position.set(0, Y + 30.5, 22); world.add(tip);
  animated.push(function (t) { tip.rotation.y = t; tip.position.y = Y + 30.5 + Math.sin(t * 1.4) * 0.4; });
  sign('FORUM PLAZA', 'SOLID CITY · EST. 2026', 0, Y + 16, -60, 26);
  portal(D.plaza, 0, -88, 0);
  // ---- MUSIC STUDIO TOWER ----
  var S = D.studio;
  cyl(26, 32, 6, M.gold, S.x, Y, S.z, 8);
  var tower = cyl(16, 22, 230, curve(new T.MeshLambertMaterial({ map: TEX_BLDG, emissiveMap: TEX_WIN, emissive: 0xffffff, color: 0xffffff })), S.x, Y + 6, S.z, 8);
  tower.material.map = TEX_BLDG.clone(); tower.material.map.needsUpdate = true; tower.material.map.repeat.set(4, 6); tower.material.map.wrapS = tower.material.map.wrapT = T.RepeatWrapping;
  tower.material.emissiveMap = TEX_WIN.clone(); tower.material.emissiveMap.needsUpdate = true; tower.material.emissiveMap.repeat.set(4, 6); tower.material.emissiveMap.wrapS = tower.material.emissiveMap.wrapT = T.RepeatWrapping;
  var rings = [];
  for (var k = 0; k < 7; k++) { var rg = new T.Mesh(new T.TorusGeometry(21 - k * 0.7, 0.6, 6, 48), k % 2 ? M.glowGold : M.red); rg.rotation.x = Math.PI / 2; rg.position.set(S.x, Y + 30 + k * 30, S.z); world.add(rg); rings.push(rg); }
  animated.push(function (t) { var amp = NP.playing ? 0.09 : 0.02, sp = NP.playing ? 6 : 1.5; for (var i = 0; i < rings.length; i++) { var s = 1 + amp * Math.sin(t * sp - i * 0.9); rings[i].scale.set(s, s, 1); } for (var m = 0; m < RADIO_MASTS.length; m++) RADIO_MASTS[m].light.visible = NP.playing ? Math.sin(t * 5 + m * 2) > -0.2 : Math.sin(t * 1.5 + m) > 0.6; });
  var spire = new T.Mesh(new T.ConeGeometry(4, 40, 8), M.gold); spire.position.set(S.x, Y + 256, S.z); world.add(spire);
  // NOW PLAYING billboard on the tower, facing the plaza (redrawn on track change)
  var npC = document.createElement('canvas'); npC.width = 1024; npC.height = 256; var npT = new T.CanvasTexture(npC); npT.encoding = T.sRGBEncoding;
  NP.draw = function (title, kind, playing) {
    var g = npC.getContext('2d'), W = 1024, H = 256; g.fillStyle = '#080408'; g.fillRect(0, 0, W, H);
    g.strokeStyle = '#e8c36a'; g.lineWidth = 10; g.strokeRect(6, 6, W - 12, H - 12);
    g.fillStyle = playing ? '#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(-