<!-- SAGA · part 33 -->
th.random()*10, 12, 8), sandMat);
      dune.scale.y = 0.3;
      dune.position.set(sx, 0.5, sz);
      scene.add(dune);
    }

    /* 6. SHADOW GROVE (-800, 1200) — dark trees */
    var shadowMat = new THREE.MeshStandardMaterial({color: 0x0a0a1a, roughness: 0.95});
    for(var sg = 0; sg < 25; sg++){
      var gx = -800 + (Math.random()-0.5)*80;
      var gz = 1200 + (Math.random()-0.5)*80;
      var gtree = new THREE.Mesh(new THREE.ConeGeometry(4, 12, 7), shadowMat);
      gtree.position.set(gx, 6, gz);
      scene.add(gtree);
    }

    /* 7. TIDE POOLS (1200, 300) — water gardens */
    var tideMat = new THREE.MeshStandardMaterial({color: 0x00aaff, transparent: true, opacity: 0.6});
    for(var tp = 0; tp < 8; tp++){
      var px = 1200 + (Math.random()-0.5)*60;
      var pz = 300 + (Math.random()-0.5)*60;
      var pool = new THREE.Mesh(new THREE.CircleGeometry(8, 16), tideMat);
      pool.rotation.x = -Math.PI/2;
      pool.position.set(px, 0.3, pz);
      scene.add(pool);
    }

    /* 8. STORM SPIRE (-1500, 0) — lightning tower */
    var spire = new THREE.Mesh(new THREE.CylinderGeometry(3, 6, 80, 8), darkMat);
    spire.position.set(-1500, 40, 0);
    scene.add(spire);
    var orb = new THREE.Mesh(new THREE.SphereGeometry(6, 16, 12),
      new THREE.MeshBasicMaterial({color: 0x8888ff}));
    orb.position.set(-1500, 85, 0);
    scene.add(orb);
    window._dynamics.push(function(t){
      orb.material.color.setHSL(0.6, 1, 0.5 + Math.sin(t*5)*0.3);
    });

    /* 9. HARMONY GARDENS (500, -1200) — zen circles */
    for(var hg = 0; hg < 5; hg++){
      var hx = 500 + (hg - 2) * 30;
      var hz = -1200;
      var circle = new THREE.Mesh(new THREE.RingGeometry(8, 10, 32),
        new THREE.MeshBasicMaterial({color: 0xffffff, transparent: true, opacity: 0.5, side: THREE.DoubleSide}));
      circle.rotation.x = -Math.PI/2;
      circle.position.set(hx, 0.25, hz);
      scene.add(circle);
      var stone = new THREE.Mesh(new THREE.DodecahedronGeometry(3, 0),
        new THREE.MeshStandardMaterial({color: 0x888888, roughness: 0.9}));
      stone.position.set(hx, 2, hz);
      scene.add(stone);
    }

    /* 10. OBSERVATORY (0, 1500) — star tower */
    var obx = 0, obz = 1500;
    var tower = new THREE.Mesh(new THREE.CylinderGeometry(8, 10, 40, 12), darkMat);
    tower.position.set(obx, 20, obz);
    scene.add(tower);
    var dome = new THREE.Mesh(new THREE.SphereGeometry(10, 16, 12, 0, Math.PI*2, 0, Math.PI/2), goldMat);
    dome.position.set(obx, 40, obz);
    scene.add(dome);
    var telescope = new THREE.Mesh(new THREE.CylinderGeometry(1, 1.5, 15, 8), darkMat);
    telescope.position.set(obx, 48, obz);
    telescope.rotation.x = 0.5;
    scene.add(telescope);

  }catch(e){}
}
if(typeof buildTenDistricts === 'function'){ window._buildQueue.push(buildTenDistricts); }

/* TOPOGRAPHY — elevation for the 10 districts. 2026-10-04. */
function buildTopography(){
  try{
    var rockMat = new THREE.MeshStandardMaterial({color: 0x3a3a3a, roughness: 0.95});
    var grassMat = new THREE.MeshStandardMaterial({color: 0x1a4a1a, roughness: 0.9});

    function hill(x, z, r, h, mat){
      var hill = new THREE.Mesh(new THREE.SphereGeometry(r, 16, 12), mat || rockMat);
      hill.scale.y = h / r;
      hill.position.set(x, 0.13, z);
      scene.add(hill);
    }

    function plateau(x, z, r, h, mat){
      var plat = new THREE.Mesh(new THREE.CylinderGeometry(r, r + 5, h, 16), mat || rockMat);
      plat.position.set(x, h/2 + 0.13, z);
      scene.add(plat);
    }

    /* 1. Crystal Caverns — rocky plateau */
    plateau(1000, 1000, 50, 8);

    /* 3. Ember Fields — volcanic mounds */
    for(var e = 0; e < 5; e++){
      hill(1500 + (Math.random()-0.5)*80, -800 + (Math.random()-0.5)*80, 15, 0.4);
    }

    /* 4. Frost Peaks — snowy hills base */
    for(var f = 0; f < 8; f++){
      hill(-1200 + (Math.random()-0.5)*100, -1000 + (Math.random()-0.5)*100, 20, 0.3, grassMat);
    }

    /* 5. Golden Desert — bigger dunes */
    for(var d = 0; d < 8; d++){
      hill(800 + (Math.random()-0.5)*120, 1500 + (Math.random()-0.5)*120, 25, 0.25,
        new THREE.MeshStandardMaterial({color: 0xd4a017, roughness: 1}));
    }

    /* 6. Shadow Grove — dark hills */
    for(var g = 0; g < 6; g++){
      hill(-800 + (Math.random()-0.5)*70, 1200 + (Math.random()-0.5)*70, 18, 0.35,
        new THREE.MeshStandardMaterial({color: 0x0a0a1a, roughness: 0.95}));
    }

    /* 8. Storm Spire — rocky outcrop */
    plateau(-1500, 0, 30, 12);

    /* 9. Harmony Gardens — terraced */
    for(var t = 0; t < 3; t++){
      plateau(500, -1200, 40 - t*8, 2 + t*2, grassMat);
    }

    /* 10. Observatory — hilltop */
    hill(0, 1500, 40, 0.4, grassMat);

  }catch(e){}
}
if(typeof buildTopography === 'function'){ window._buildQueue.push(buildTopography); }

/* ALL DISTRICTS AT MAXIMUM — each with its story from our conversations. 2026-10-04. */
function buildDistrictLore(){
  try{
    window._dynamics = window._dynamics ||