<!-- SOLID CITY · part 3126 -->
 pz = B_C.z + Math.sin(a) * 148, py = H(px, pz);
      box(solid, 13.5, 13, 2.2, mat4(px, py + 5.5, pz, 0, -a + Math.PI / 2, 0), C.stoneDark);
      box(glow, 13.5, 0.4, 0.5, mat4(px + Math.cos(a) * -1.2, py + 12.1, pz + Math.sin(a) * -1.2, 0, -a + Math.PI / 2, 0), C.gold);
      footprints.push({ x: px, z: pz, w: 13.5, d: 2.4, a: -a + Math.PI / 2, y0: py, y1: py + 12 });
    }
  })();
  /* THE GREAT CRYSTAL of the First Hollow, hanging in the shaft */
  (function () {
    var cx = A_C.x, cz = A_C.z, cy = A_C.f + 96;
    var cr = new T.Mesh(new T.IcosahedronGeometry(8.5, 0), new T.MeshLambertMaterial({ color: C.crystal, emissive: 0x8a6a20, transparent: true, opacity: 0.92 }));
    cr.position.set(cx, cy, cz); cr.frustumCulled = false; group.add(cr); crystals.push(cr);
    /* THE HERO ELEVATION of the crystal (two book-crafts):
     * MORPH BREATHING (Dirksen's animation chapter: a mesh
     * blends between baked shapes) — a stretched twin of
     * the crystal waits inside it, and the update breathes
     * the blend, so the heart of the hollow swells and
     * settles like a living thing. FRESNEL RIM (the shader
     * book's signature: light gathers at the grazing edge,
     * pow(1 − dot(normal, view), 3)) — an ember rim injected
     * into the crystal's own material, the superhero gleam. */
    (function () {
      var mp = cr.geometry.attributes.position.clone(), mv = new T.Vector3();
      for (var mi = 0; mi < mp.count; mi++) { mv.fromBufferAttribute(mp, mi); mp.setXYZ(mi, mv.x * 0.90, mv.y * 1.26, mv.z * 0.90); }
      cr.geometry.morphAttributes.position = [mp];
      cr.morphTargetInfluences = [0]; cr.morphTargetDictionary = { breathe: 0 };
      cr.material.onBeforeCompile = function (sh) {
        sh.fragmentShader = sh.fragmentShader.replace('#include <opaque_fragment>',
          'float fresK = pow(1.0 - abs(dot(normalize(normal), normalize(vViewPosition))), 3.0);\n outgoingLight += vec3(1.0, 0.40, 0.13) * fresK * 1.5;\n#include <opaque_fragment>');
      };
      cr.material.customProgramCacheKey = function () { return 'great-crystal-fresnel'; };
      heroInfo.crystalMorph = true;
    })();
    var core = new T.Mesh(new T.IcosahedronGeometry(4.2, 0), new T.MeshBasicMaterial({ color: 0xffe9b0 }));
    core.position.set(cx, cy, cz); core.frustumCulled = false; group.add(core); crystals.push(core);
    halo(cx, cy, cz, 36, 0xffd9a0);
    glowSpots.push({ x: cx, y: A_C.f + 0.34, z: cz, r: 19, c: 0xffd9a0 });
    for (var k = 0; k < 3; k++) { var a = k / 3 * Math.PI * 2 + 0.5; cyl(solid, 0.16, 0.16, 34, 5, mat4(cx + Math.cos(a) * 26, cy + 16, cz + Math.sin(a) * 26, Math.cos(a) * 0.72, 0, -Math.sin(a) * 0.72), C.gold); }
    /* the falls: from the roof ring's edge to a plaza pool */
    var fa = 0.35, fx = cx + Math.cos(fa) * 138, fz = cz + Math.sin(fa) * 138;
    var fall = new T.Mesh(new T.BoxGeometry(2.6, builtA.roofY - A_C.f - 6, 0.5), new T.MeshBasicMaterial({ color: 0xbfe0f2, transparent: true, opacity: 0.4 }));
    fall.position.set(fx, (builtA.roofY + A_C.f) / 2 + 2, fz); fall.lookAt(cx, (builtA.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);
    glowSpots.push({ x: cx + Math.cos(fa) * 128, y: A_C.f + 0.36, z: cz + Math.sin(fa) * 128, r: 9, c: 0x9fd4ff });
  })();
  /* 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);
    halo(cx, F + 8, cz, 26, 0xffc9a0);
    glowSpots.push({ x: cx, y: F + 0.34, z: cz, r: 15, c: 0xffc9a0 });
  })();

  /* ================= 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, a