<!-- SOLID CITY · part 1802 -->
 2, rr2 = 55 + R() * 250;
    var rh = crownHeight(rr2, ra2);
    solid.add(new T.DodecahedronGeometry(1.4 + R() * 2.2), mat4(px(rr2, ra2), BASE + rh + 0.6, pz(rr2, ra2), R() * 3, R() * 3, 0), C.rock);
  }

  /* ---------- big trees, wherever the land is kind ---------- */
  var treePts = [], tries = 0;
  function riverClear(r, th) {
    for (var k = 0; k < CROWN_RIVERS.length; k++) {
      var dth = Math.abs(th - CROWN_RIVERS[k]) % (Math.PI * 2); if (dth > Math.PI) dth = Math.PI * 2 - dth;
      if (dth * Math.max(r, 20) < 14) return false;
    }
    return true;
  }
  function peakClear(r, th) {
    var x = Math.cos(th) * r, z = Math.sin(th) * r;
    for (var i = 0; i < CROWN_PEAKS.length; i++) {
      var p = CROWN_PEAKS[i], dx = x - Math.cos(p.a) * p.r, dz = z - Math.sin(p.a) * p.r;
      if (dx * dx + dz * dz < 42 * 42) return false;
    }
    return true;
  }
  while (treePts.length < 85 && tries < 600) {
    tries++;
    var tr = 40 + R() * 272, ta = R() * Math.PI * 2;
    var th2 = crownHeight(tr, ta);
    if (th2 > 30) continue;
    if (!riverClear(tr, ta) || !peakClear(tr, ta)) continue;
    if (Math.abs(crownHeight(tr + 7, ta) - th2) > 5.5) continue;
    var ok = true;
    for (var q = 0; q < treePts.length; q++) { var ddx = treePts[q][0] - tr * Math.cos(ta), ddz = treePts[q][1] - tr * Math.sin(ta); if (ddx * ddx + ddz * ddz < 15 * 15) { ok = false; break; } }
    if (!ok) continue;
    treePts.push([tr * Math.cos(ta), tr * Math.sin(ta), tr, ta, th2]);
  }
  var treeSolids = [];
  treePts.forEach(function (tp) {
    var x = CX + tp[0], z = CZ + tp[1], gy = BASE + tp[4], s = 1.7 + R() * 0.9;
    cyl(solid, 0.34 * s, 0.5 * s, 4.6 * s, 6, x, gy + 2.3 * s, z, C.trunk);
    sph(solid, 2.9 * s, x, gy + (4.6 + 2.2) * s, z, C.leaf, 1, 0.85, 1);
    sph(solid, 2.0 * s, x + 1.6 * s, gy + (4.6 + 1.2) * s, z + 0.8 * s, C.leafLight, 1, 0.8, 1);
    sph(solid, 1.7 * s, x - 1.5 * s, gy + (4.6 + 1.5) * s, z - 1.0 * s, C.leaf, 1, 0.8, 1);
    treeSolids.push({ x: x, z: z, w: 1, d: 1, a: 0, y0: gy, y1: gy + 4.6 * s });
  });

  /* ---------- the white mouflon (the King's word: "Put some
   * white mouflon on it") — a flock of nine, rams and ewes,
   * wandering the meadows between the rivers. One shared body,
   * nine lives: each drifts, grazes, and lifts its head in
   * its own time, walking the land by the land's own law. */
  function sheepGeometry(ram) {
    var b = new Batch();
    var wool = 0xf2ede2, face = 0xd9cfba, hornC = 0x9a7d55, leg = 0xcfc4ae;
    b.add(new T.SphereGeometry(0.85, 10, 7), mat4(0, 0.98, 0, 0, 0, 0, 0.72, 0.62, 1.0), wool);
    b.add(new T.SphereGeometry(0.27, 8, 6), mat4(0, 1.18, 0.98, 0, 0, 0, 0.8, 0.85, 1.15), face);
    b.add(new T.BoxGeometry(0.2, 0.16, 0.24), mat4(0, 1.06, 1.22, 0, 0, 0), face);
    b.add(new T.BoxGeometry(0.22, 0.07, 0.12), mat4(-0.3, 1.3, 0.9, 0, 0, 0.5), face);
    b.add(new T.BoxGeometry(0.22, 0.07, 0.12), mat4(0.3, 1.3, 0.9, 0, 0, -0.5), face);
    if (ram) {
      b.add(new T.TorusGeometry(0.31, 0.085, 6, 12, 4.1), mat4(-0.27, 1.32, 0.88, 0, Math.PI / 2, 2.2), hornC);
      b.add(new T.TorusGeometry(0.31, 0.085, 6, 12, 4.1), mat4(0.27, 1.32, 0.88, 0, Math.PI / 2, -2.2 + Math.PI), hornC);
    }
    [[-0.28, 0.42], [0.28, 0.42], [-0.28, -0.42], [0.28, -0.42]].forEach(function (lp) {
      b.add(new T.CylinderGeometry(0.07, 0.06, 0.78, 5), mat4(lp[0], 0.39, lp[1], 0, 0, 0), leg);
    });
    b.add(new T.SphereGeometry(0.16, 6, 5), mat4(0, 1.1, -0.85, 0, 0, 0), wool);
    return b.build(new T.MeshLambertMaterial({ vertexColors: true })).geometry;
  }
  var ramGeo = sheepGeometry(true), eweGeo = sheepGeometry(false);
  var herd = { r: 200, a: 1.55 };
  var flock = [];
  for (var fi = 0; fi < 9; fi++) {
    var fm3 = new T.Mesh(fi % 2 ? eweGeo : ramGeo, new T.MeshLambertMaterial({ vertexColors: true }));
    fm3.scale.setScalar(1.5); fm3.frustumCulled = false;
    group.add(fm3);
    var fa = herd.a + (R() - 0.5) * 0.5, fr = herd.r + (R() - 0.5) * 60;
    flock.push({ mesh: fm3, x: CX + Math.cos(fa) * fr, z: CZ + Math.sin(fa) * fr, head: R() * Math.PI * 2, seed: fi * 1.7 + R() * 3 });
  }

  /* ---------- the falls and the rain ---------- */
  var fallMats = [];
  var falls = [];
  CROWN_RIVERS.forEach(function (ra) {
    var fx = px(331, ra), fz = pz(331, ra);
    var topY = BASE + crownHeight(326, ra) + 0.4, botY = FLOOR + 4;
    var hgt = topY - botY;
    var fm = new T.MeshBasicMaterial({ color: 0xbfe0f2, transparent: true, opacity: 0.34, depthWrite: false });
    var fall = new T.Mesh(new T.CylinderGeometry(1.5, 3.4, hgt, 10, 1, true), fm);
    fall.position.set(fx, botY + hgt / 2, fz); fall.frustumCulled = false; group.add(fall);
    var fm2 = new T.MeshBasicMaterial({ color: 0xeaf6ff, transparent: true, opacity: 0.5, depthWrite: false });
    var core = new T.Mesh(new T.CylinderGeometry(0.7, 1.6, hgt, 8, 1, true), fm2);
    core.position.set(fx, botY + hgt / 2, fz); core.frustumCulled = false; group.add(core);
    var foam