<!-- SOLID CITY · part 780 -->
'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);
  buildSoulTower(Y);
  // ---- skyline: instanced towers (one draw call), all solid ----
  var geo = new T.BoxGeometry(1, 1, 1); geo.translate(0, 0.5, 0);
  var MAXB = MOBILE ? 220 : 320, inst = new T.InstancedMesh(geo, M.bldg, MAXB), mtx = new T.Matrix4(), placed = 0, rb = mulberry(99);
  var avoid = [[0, 0, 140], [S.x, S.z, 70], [P.x, P.z, 120], [P.x + 73, P.z + 35, 40], [D.soul.x, D.soul.z, 52]];
  for (var tries = 0; tries < 4000 && placed < MAXB; tries++) {
    var ang = rb() * Math.PI * 2, rr = 170 + Math.pow(rb(), 0.8) * 600, bx = Math.cos(ang) * rr, bz = Math.sin(ang) * rr;
    var w = 14 + rb() * 22, d = 14 + rb() * 22, h = (24 + rb() * 120) * (1.2 - rr / 900);
    var bad = false;
    for (k = 0; k < avoid.length; k++) if (Math.hypot(bx - avoid[k][0], bz - avoid[k][1]) < avoid[k][2] + w) bad = true;
    // keep roads clear
    [D.studio, D.port, { x: 0, z: -700 }, { x: -700, z: -80 }].forEach(function (t) { var L = Math.hypot(t.x, t.z), ux = t.x / L, uz = t.z / L, along = bx * ux + bz * uz, perp = Math.abs(-bx * uz + bz * ux); if (along > 0 && along < L + 20 && perp < 12 + Math.max(w, d) * 0.75) bad = true; });
    if (bad || insideSolid(bx, Y + 1, bz, Math.max(w, d) * 0.6 + 4)) continue;
    mtx.makeScale(w, h, d); mtx.setPosition(bx, Y, bz); inst.setMatrixAt(placed++, mtx);
    solidBox(bx, bz, w, d, Y, Y + h);
  }
  inst.count = placed; inst.instanceMatrix.needsUpdate = true; world.add(inst);
  // lava glow at Kīlauea's crater (seen from the air)
  var V = VOLCANOES[4], lava = new T.Mesh(new T.CircleGeometry(300, 24), curve(new T.MeshBasicMaterial({ color: 0xff3a10 })));
  lava.rotation.x = -Math.PI / 2; lava.position.set(V.x, heightAt(V.x, V.z) + 8, V.z); world.add(lava);
  animated.push(function (t) { lava.material.color.setHSL(0.03, 1, 0.42 + 0.08 * Math.sin(t * 1.7)); });
}


/* ---- SOUL PRINT TOWER (2026-10-09): ~140 m, wine-red chrome in gold chains, a blue eye on top.
   Fits the skyline (Music Studio Tower stays the tallest at 230 m + spire). The door facing the
   plaza opens Soul Print's chat (logged-in citizens; her private tower log is never used here). ---- */
var SOUL = { group: null, 