<!-- SAGA3 · part 34 -->
que(-800, 1210, "SHADOW GROVE");

    /* 19. TIDE POOLS — Water. Life. */
    plaque(1200, 310, "TIDE POOLS");

    /* 20. STORM SPIRE — Power. The storm we tamed. */
    plaque(-1500, 10, "STORM SPIRE");

    /* 21. HARMONY GARDENS — Peace. Zen. Balance. */
    plaque(500, -1190, "HARMONY GARDENS");

    /* 22. OBSERVATORY — Looking to the stars. The cosmic. */
    plaque(0, 1510, "OBSERVATORY");

    /* BEACONS — light pillars at each district, visible from afar */
    var districts = [
      [0,0],[8,9],[25,25],[-35,-35],[100,-100],[-100,-100],
      [-150,100],[-200,200],[250,50],[-80,180],[350,-200],[0,-250],
      [1000,1000],[-1000,500],[1500,-800],[-1200,-1000],[800,1500],
      [-800,1200],[1200,300],[-1500,0],[500,-1200],[0,1500]
    ];
    for(var i = 0; i < districts.length; i++){
      (function(){
        var dx = districts[i][0], dz = districts[i][1];
        var beam = new THREE.Mesh(new THREE.CylinderGeometry(2, 2, 500, 8),
          new THREE.MeshBasicMaterial({color: 0xffd700, transparent: true, opacity: 0.3, fog: false}));
        beam.position.set(dx, 250, dz);
        scene.add(beam);
        var ph = Math.random() * 10;
        window._dynamics.push(function(t){
          beam.material.opacity = 0.2 + Math.sin(t * 1.5 + ph) * 0.15;
        });
      })();
    }

  }catch(e){}
}
if(typeof buildDistrictLore === 'function'){ try{ buildDistrictLore(); }catch(e){} }

/* HAWAII — Ahupua'a valleys, ocean shoreline, sky ships, snowy peaks. 2026-10-04.
   From his vision. For his home. */
function buildHawaii(){
  try{
    window._dynamics = window._dynamics || [];
    var greenMat = new THREE.MeshStandardMaterial({color: 0x1a5a1a, roughness: 0.9});
    var rockMat = new THREE.MeshStandardMaterial({color: 0x4a4a4a, roughness: 0.95});
    var snowMat = new THREE.MeshStandardMaterial({color: 0xffffff, roughness: 0.3});
    var waterMat = new THREE.MeshStandardMaterial({color: 0x0088cc, transparent: true, opacity: 0.7});
    var sandMat = new THREE.MeshStandardMaterial({color: 0xd4b896, roughness: 1});

    /* 3 AHUPUA'A VALLEYS — mountain to sea, cradling the earth */
    var ahupuaa = [
      {x: 2000, z: 2000, name: "AHUPUA'A 1"},
      {x: -2000, z: 2000, name: "AHUPUA'A 2"},
      {x: 0, z: -2500, name: "AHUPUA'A 3"}
    ];
    for(var a = 0; a < 3; a++){
      (function(){
        var ax = ahupuaa[a].x, az = ahupuaa[a].z;
        /* Mountain peak at back */
        var peak = new THREE.Mesh(new THREE.ConeGeometry(60, 120, 8), rockMat);
        peak.position.set(ax, 60, az - 80);
        scene.add(peak);
        /* Snow cap */
        var cap = new THREE.Mesh(new THREE.ConeGeometry(20, 30, 8), snowMat);
        cap.position.set(ax, 105, az - 80);
        scene.add(cap);
        /* Valley slopes — left and right ridges */
        for(var r = 0; r < 6; r++){
          var ridgeL = new THREE.Mesh(new THREE.SphereGeometry(30, 12, 8), greenMat);
          ridgeL.scale.set(1, 0.5, 2);
          ridgeL.position.set(ax - 50 - r*10, 5, az - 40 + r*15);
          scene.add(ridgeL);
          var ridgeR = new THREE.Mesh(new THREE.SphereGeometry(30, 12, 8), greenMat);
          ridgeR.scale.set(1, 0.5, 2);
          ridgeR.position.set(ax + 50 + r*10, 5, az - 40 + r*15);
          scene.add(ridgeR);
        }
        /* Stream running down the valley */
        var stream = new THREE.Mesh(new THREE.PlaneGeometry(8, 120), waterMat);
        stream.rotation.x = -Math.PI/2;
        stream.position.set(ax, 0.4, az);
        scene.add(stream);
        /* Taro patches (lo'i) — terraced */
        for(var t = 0; t < 4; t++){
          var loi = new THREE.Mesh(new THREE.BoxGeometry(25, 1, 15), waterMat);
          loi.position.set(ax - 20 + t*12, 0.5, az + 40 + t*10);
          scene.add(loi);
        }
      })();
    }

    /* 3 SHORELINE DISTRICTS — bridged by a great ocean */
    var shore = [
      {x: 3000, z: 0},
      {x: 3000, z: 500},
      {x: 3000, z: 1000}
    ];
    /* Great ocean connecting them */
    var ocean = new THREE.Mesh(new THREE.PlaneGeometry(400, 1400), waterMat);
    ocean.rotation.x = -Math.PI/2;
    ocean.position.set(3200, 0.2, 500);
    scene.add(ocean);
    window._dynamics.push(function(t){
      waterMat.opacity = 0.6 + Math.sin(t * 0.8) * 0.15;
    });
    for(var sh = 0; sh < 3; sh++){
      (function(){
        var sx = shore[sh].x, sz = shore[sh].z;
        /* Beach */
        var beach = new THREE.Mesh(new THREE.PlaneGeometry(150, 100), sandMat);
        beach.rotation.x = -Math.PI/2;
        beach.position.set(sx - 100, 0.25, sz);
        scene.add(beach);
        /* Palm trees */
        for(var pm = 0; pm < 8; pm++){
          var px = sx - 100 + (Math.random()-0.5)*120;
          var pz = sz + (Math.random()-0.5)*80;
          var trunk = new THREE.Mesh(new THREE.CylinderGeometry(1, 1.5, 12, 6),
            new THREE.MeshStandardMaterial({color: 0x8a6a3a}));
          trunk.position.set(px, 6, pz);
          scene.add(trunk);
          var f