<!-- SOLUV · part 482 -->
ial({ vertexShader: FLOOR_VS, fragmentShader: FLOOR_FS, uniforms: { uT } }));
  floor.position.y = -MINIMUM; floor.name = 'platform (2000 wide, 2 minimums thick)'; scene.add(floor);
  const basic = (c, add) => { const m = new THREE.MeshBasicMaterial({ color: c, transparent: !!add, opacity: add || 1, blending: add ? THREE.AdditiveBlending : THREE.NormalBlending, depthWrite: !add }); m.toneMapped = false; return m; };
  const rimRing = new THREE.Mesh(new THREE.TorusGeometry(PLATFORM_R, 0.8, 8, 256).rotateX(Math.PI / 2), basic(0xc9a227)); rimRing.name = 'platform gold rim'; scene.add(rimRing);
  // launch-pad rings around the foot
  for (const [r, t, o] of [[30, 0.12, 1], [46, 0.1, 0.7], [70, 0.1, 0.45], [110, 0.1, 0.3]]) { const m = new THREE.Mesh(new THREE.TorusGeometry(r, t, 6, 160).rotateX(Math.PI / 2), basic(CYAN, o)); m.position.y = 0.12; m.name = 'pad ring ' + r; scene.add(m); }

  /* ---------- the tower: the live lobby wall from /soluv (imported, unchanged) ---------- */
  const wrapEm = Math.max(20, Math.floor((Math.min(cssW0(), 700) - 16) / READ_PPE));   // 390 px -> 34 em, 430 px -> 37 em
  const wall = createChatWall({ THREE, room: 1, avatar: true, textWidthEm: wrapEm });
  wall.addEventListener('change', () => { need = true; layoutCrown(); });
  wall.addEventListener('status', () => { refreshStatus(); if (!me) refreshMe(); });
  scene.add(wall);
  const walls = [wall];

  // aura: a soft light column around the tower so it glows from far (steps aside up close so text stays clear)
  const auraU = { uCam: { value: new THREE.Vector3() }, uT, uTop: { value: 2000 }, uK: { value: 0.55 } };
  const aura = new THREE.Mesh(new THREE.CylinderGeometry(46, 46, 1, 48, 1, true), new THREE.ShaderMaterial({ vertexShader: AURA_VS, fragmentShader: AURA_FS, uniforms: auraU, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide }));
  aura.name = 'aura (light, 92 wide)'; aura.renderOrder = 4; scene.add(aura);

  // orbit rings every 250 up the height, with altitude plates; a crown + beacon beam at the top
  const rings = new THREE.Group(); rings.name = 'orbit rings'; scene.add(rings);
  const crown = new THREE.Group(); crown.name = 'crown'; scene.add(crown);
  const plateMat = [];
  function plate(text) {
    const c = document.createElement('canvas'); c.width = 256; c.height = 64; const x = c.getContext('2d');
    x.fillStyle = 'rgba(0,16,24,0.55)'; x.fillRect(0, 0, 256, 64); x.strokeStyle = '#5ff4ff'; x.lineWidth = 3; x.strokeRect(2, 2, 252, 60);
    x.fillStyle = '#bff8ff'; x.font = '700 34px "Soluv Condensed","Roboto Condensed","Arial Narrow",sans-serif'; x.textAlign = 'center'; x.textBaseline = 'middle'; x.fillText(text, 128, 34);
    const tex = new THREE.CanvasTexture(c); tex.colorSpace = THREE.SRGBColorSpace; tex.anisotropy = 4;
    const m = new THREE.MeshBasicMaterial({ map: tex, transparent: true, depthWrite: false }); m.toneMapped = false; plateMat.push(m);
    const mesh = new THREE.Mesh(new THREE.BoxGeometry(16, 4, MINIMUM), m); mesh.name = 'altitude plate ' + text; mesh.renderOrder = 5; return mesh;
  }
  const beamU = { uT };
  let topY = 0;
  function layoutCrown() {
    const i = wall.wall.info(), top = i.heightWorld + i.plinthWorld; if (Math.abs(top - topY) < 0.01) return; topY = top;
    auraU.uTop.value = top; aura.scale.y = top; aura.position.y = top / 2;
    rings.clear(); crown.clear();
    for (let y = RING_STEP; y < top - 1; y += RING_STEP) {
      const g = new THREE.Group(); g.position.y = y; g.name = 'ring ' + y;
      const r1 = new THREE.Mesh(new THREE.TorusGeometry(31, 0.16, 6, 160).rotateX(Math.PI / 2), basic(CYAN)); r1.name = 'orbit ring ' + y;
      const r2 = new THREE.Mesh(new THREE.TorusGeometry(31, 1.1, 6, 160).rotateX(Math.PI / 2), basic(0x1aa8d8, 0.16)); r2.name = 'orbit ring glow ' + y;
      const p = plate(y + ' \u00b7 ' + (y / 10) + ' blocks'); p.position.set(-31, 2.6, 0); p.userData.billboard = true;
      g.add(r1, r2, p); g.userData.spin = (y / RING_STEP) % 2 ? 1 : -1; g.rotation.z = 0.05 * g.userData.spin; rings.add(g);
    }
    crown.position.y = top;
    const c1 = new THREE.Mesh(new THREE.TorusGeometry(26, 0.45, 8, 160).rotateX(Math.PI / 2), basic(0xbff8ff)); c1.name = 'crown ring';
    const c2 = new THREE.Mesh(new THREE.TorusGeometry(18, 0.3, 8, 128).rotateX(Math.PI / 2), basic(CYAN)); c2.name = 'crown ring inner'; c2.position.y = 6; c2.userData.tilt = 1;
    const c3 = new THREE.Mesh(new THREE.TorusGeometry(26, 2.4, 8, 160).rotateX(Math.PI / 2), basic(0x1aa8d8, 0.2)); c3.name = 'crown glow';
    const beam = new THREE.Mesh(new THREE.CylinderGeometry(0.35, 1.4, 5000, 16, 1, true), new THREE.ShaderMaterial({ vertexShader: BEAM_VS, fragmentShader: BEAM_FS, uniforms: beamU, transparent: true, depthWrite: false, blending: THREE.AdditiveBlending, side: THREE.DoubleSide }));
    beam.position.y = 2500; beam.name = 'beacon beam (light into space)';
    const tp = plate('TOP \u00b7 ' + Math.round(top));