<!-- SOLID CITY · part 3135 -->
ltA.roofY + A_C.f) / 2 + 2, cz); fall.frustumCulled = false; group.add(fall);
    cyl(glow, 6.5, 7.2, 0.35, 16, mat4(cx + Math.cos(fa) * 128, A_C.f + 0.3, cz + Math.sin(fa) * 128, 0, 0, 0), C.water);
  })();
  /* the Deep Hollow's standing crystal cluster + spring pool */
  (function () {
    var cx = B_C.x, cz = B_C.z, F = B_C.f;
    for (var k = 0; k < 3; k++) {
      var a = k / 3 * Math.PI * 2 + 0.9, x = cx + Math.cos(a) * 9, z = cz + Math.sin(a) * 9;
      var cr = new T.Mesh(new T.ConeGeometry(2.6 - k * 0.5, 11 - k * 2.4, 6), new T.MeshLambertMaterial({ color: C.crystal, emissive: 0x6a5216 }));
      cr.position.set(x, F + (11 - k * 2.4) / 2, z); cr.rotation.set(0.14 * k, 0, 0.1); cr.frustumCulled = false; group.add(cr);
      footprints.push({ x: x, z: z, w: 4.5, d: 4.5, a: 0, y0: F, y1: F + 9 });
    }
    cyl(glow, 15, 15.8, 0.3, 20, mat4(cx, F + 0.22, cz, 0, 0, 0), C.water);
  })();

  /* ================= THE GALLERY — the lava tube ==============
   * A roofed slot descending through the saddle: marble under
   * foot, basalt over head, the formations of the deep on
   * every side, and the MIDWAY SHOP in its chamber — with a
   * provision shop at each mouth, as the King ordered. */
  function galleryFloorY(z) { return H(GAL.x, z); }
  (function buildGallery() {
    var SEG = 26;
    var pos = [], col = [], idx = [], cc = new T.Color(0x57101b);
    for (var i = 0; i <= SEG; i++) {
      var z = GAL.z0 + (GAL.z1 - GAL.z0) * i / SEG, y = galleryFloorY(z) + 0.14;
      pos.push(GAL.x - 6.5, y, z, GAL.x + 6.5, y, z); col.push(cc.r, cc.g, cc.b, cc.r, cc.g, cc.b);
      if (i < SEG) { var a0 = i * 2; idx.push(a0, a0 + 1, a0 + 2, a0 + 1, a0 + 3, a0 + 2); }
    }
    var g = new T.BufferGeometry();
    g.setAttribute('position', new T.Float32BufferAttribute(pos, 3));
    g.setAttribute('color', new T.Float32BufferAttribute(col, 3));
    g.setIndex(idx); g.computeVertexNormals();
    var rib = new T.Mesh(g, new T.MeshLambertMaterial({ vertexColors: true })); rib.frustumCulled = false; group.add(rib);
    /* the tube's roof: half-pipe shells following the descent */
    var shellMat = lavaTex ? lavaMat(3, 1, T.DoubleSide) : new T.MeshLambertMaterial({ color: C.basalt, side: T.DoubleSide });
    for (var sz = 1412; sz < 1532; sz += 15) {
      var zm = sz + 7.5, fy = galleryFloorY(zm);
      var geo = new T.CylinderGeometry(10.5, 10.5, 16.5, opts.texTier === 'lo' ? 14 : 22, 2, true, Math.PI / 2, Math.PI);
      geo.rotateX(Math.PI / 2);
      if (HEIGHT) displace(geo, 3, 1, 0.5);
      var sh = new T.Mesh(geo, shellMat); sh.position.set(GAL.x, fy + 1.1, zm); sh.frustumCulled = false; group.add(sh);
      formation(GAL.x - 3.5 - R() * 2, fy + 10.6, zm - 4, 0.9 + R() * 0.5, true);
      formation(GAL.x + 4 + R() * 2, fy + 10.6, zm + 3, 0.8 + R() * 0.5, true);
      formation(GAL.x - 7.6, fy, zm + 5, 0.8 + R() * 0.6, false);
      formation(GAL.x + 7.8, fy, zm - 5, 0.9 + R() * 0.6, false);
    }
    for (var lz = 1425; lz <= 1530; lz += 35) { lamp(GAL.x - 8.2, galleryFloorY(lz), lz, 0.85); lamp(GAL.x + 8.2, galleryFloorY(lz), lz, 0.85); }
  })();
  function shop(x, z, ry, title) {
    var F = H(x, z);
    var g2 = new T.Group(); g2.position.set(x, F, z); g2.rotation.y = ry; group.add(g2);
    function LB(w, h, d, lx, ly, lz, mat) { var m = new T.Mesh(new T.BoxGeometry(w, h, d), mat); m.position.set(lx, ly, lz); m.frustumCulled = false; g2.add(m); return m; }
    var stoneM = new T.MeshLambertMaterial({ color: C.stone }), darkM = new T.MeshLambertMaterial({ color: C.stoneDark });
    LB(7.4, 3.6, 0.8, 0, 1.8, -1.5, stoneM);
    LB(7.4, 1.1, 1.1, 0, 0.55, 0.6, darkM);
    LB(8.2, 0.3, 4.6, 0, 3.85, -0.2, darkM);
    [-3.8, 3.8].forEach(function (lx) { LB(0.3, 3.9, 0.3, lx, 1.95, 1.6, stoneM); });
    for (var vi = 0; vi < 6; vi++) {
      var v = new T.Mesh(new T.BoxGeometry(0.5, 0.8, 0.5), new T.MeshBasicMaterial({ color: vi % 2 ? C.vialG : C.vialR }));
      v.position.set(-2.7 + vi * 1.08, 2.5, -1.45); v.frustumCulled = false; g2.add(v);
      var v2 = new T.Mesh(new T.BoxGeometry(0.42, 0.65, 0.42), new T.MeshBasicMaterial({ color: vi % 2 ? C.lamp : C.win }));
      v2.position.set(-2.7 + vi * 1.08, 1.35, -1.45); v2.frustumCulled = false; g2.add(v2);
    }
    sign(x + Math.sin(ry) * 0, F + 5.6, z, ry, 7.6, 1.5, [title, 'HEALTH · SAFETY · PROVISIONS'], 92, 0);
    footprints.push({ x: x, z: z, w: 8.4, d: 4.6, a: ry, y0: F, y1: F + 4 });
  }
  shop(2586, 1404, Math.PI, 'REPLENISHMENTS');
  shop(2614, 1536, 0, 'REPLENISHMENTS');
  (function midway() {
    var z = 1470, F = galleryFloorY(z);
    marbleDisc(GAL.x, F, z, 13.5, marbleRed, 2);
    var geo = new T.CylinderGeometry(13.5, 13.5, 17, opts.texTier === 'lo' ? 14 : 22, 2, true, Math.PI / 2, Math.PI); geo.rotateX(Math.PI / 2);
    if (HEIGHT) displace(geo, 3, 1, 0.5);
    var sh = new T.Mesh(geo, lavaTex ? lavaMat(3, 1, T.DoubleSide) : new T.MeshLambertMaterial({ color: C.basalt, side: T.DoubleSide }));
    sh.position.set(