<!-- SAGA · part 35 -->
      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 fronds = new THREE.Mesh(new THREE.ConeGeometry(5, 3, 8), greenMat);
          fronds.position.set(px, 13, pz);
          scene.add(fronds);
        }
        /* Bridge to ocean */
        var bridge = new THREE.Mesh(new THREE.BoxGeometry(80, 2, 8),
          new THREE.MeshStandardMaterial({color: 0x8a6a3a, roughness: 0.8}));
        bridge.position.set(sx - 50, 1, sz);
        scene.add(bridge);
      })();
    }

    /* 3 SKY DISTRICTS — spaceships hovering */
    var skyD = [
      {x: 0, y: 300, z: 3000},
      {x: 500, y: 350, z: 3000},
      {x: -500, y: 400, z: 3000}
    ];
    for(var sk = 0; sk < 3; sk++){
      (function(){
        var kx = skyD[sk].x, ky = skyD[sk].y, kz = skyD[sk].z;
        /* Platform */
        var plat = new THREE.Mesh(new THREE.CylinderGeometry(40, 35, 6, 12),
          new THREE.MeshStandardMaterial({color: 0x2a2a3a, metalness: 0.7, roughness: 0.4}));
        plat.position.set(kx, ky, kz);
        scene.add(plat);
        /* Spaceships */
        for(var sp = 0; sp < 3; sp++){
          var ship = new THREE.Group();
          var hull = new THREE.Mesh(new THREE.CylinderGeometry(3, 5, 15, 8),
            new THREE.MeshStandardMaterial({color: 0xaaaaaa, metalness: 0.8, roughness: 0.3}));
          hull.rotation.z = Math.PI/2;
          ship.add(hull);
          var glow = new THREE.Mesh(new THREE.SphereGeometry(2, 12, 8),
            new THREE.MeshBasicMaterial({color: 0x00ffff}));
          glow.position.set(8, 0, 0);
          ship.add(glow);
          ship.position.set(kx + (sp-1)*25, ky + 15 + sp*5, kz + (sp-1)*10);
          scene.add(ship);
          var sph = Math.random() * 10;
          var sy = ship.position.y;
          window._dynamics.push(function(t){
            ship.position.y = sy + Math.sin(t * 1.2 + sph) * 3;
            ship.rotation.y += 0.002;
          });
        }
        /* Hover animation for platform */
        var py = ky;
        var pph = Math.random() * 10;
        window._dynamics.push(function(t){
          plat.position.y = py + Math.sin(t * 0.5 + pph) * 5;
        });
      })();
    }

    /* 3 SNOWY PEAK DISTRICTS — connected by rivers, bridges */
    var peaks = [
      {x: -3000, z: -2000},
      {x: -2500, z: -2000},
      {x: -2000, z: -2000}
    ];
    for(var pk = 0; pk < 3; pk++){
      (function(){
        var px = peaks[pk].x, pz = peaks[pk].z;
        /* Snowy peak */
        var mountain = new THREE.Mesh(new THREE.ConeGeometry(50, 100, 8), rockMat);
        mountain.position.set(px, 50, pz);
        scene.add(mountain);
        var snow = new THREE.Mesh(new THREE.ConeGeometry(25, 40, 8), snowMat);
        snow.position.set(px, 80, pz);
        