<!-- SAGA · part 37 -->
2)/2, (z1+z2)/2);
      bridge.lookAt(x2, y2, z2);
      scene.add(bridge);
    }
    /* Connect futuristic towers */
    skybridge(350, 50, -200, 380, 55, -180);
    skybridge(380, 55, -180, 360, 48, -150);

    /* VERTIPORTS — flying vehicle hubs (Dubai VDX) */
    function vertiport(x, z){
      var pad = new THREE.Mesh(new THREE.CylinderGeometry(20, 22, 3, 12), darkMat);
      pad.position.set(x, 1.5, z);
      scene.add(pad);
      var h = new THREE.Mesh(new THREE.RingGeometry(8, 10, 16),
        new THREE.MeshBasicMaterial({color: 0x00ffff, side: THREE.DoubleSide}));
      h.rotation.x = -Math.PI/2;
      h.position.set(x, 3.1, z);
      scene.add(h);
      /* Beacon */
      var beacon = new THREE.Mesh(new THREE.CylinderGeometry(1, 1, 30, 8),
        new THREE.MeshBasicMaterial({color: 0x00ffff, transparent: true, opacity: 0.5}));
      beacon.position.set(x, 18, z);
      scene.add(beacon);
    }
    vertiport(100, -100);    /* City */
    vertiport(2000, 2000);   /* Ahupua'a 1 */
    vertiport(3000, 500);    /* Shoreline */
    vertiport(0, 3000);      /* Sky */

    /* GREEN CORRIDORS — park connectors under transit (Singapore) */
    function greenCorridor(x1, z1, x2, z2){
      var len = Math.sqrt((x2-x1)*(x2-x1) + (z2-z1)*(z2-z1));
      var corr = new THREE.Mesh(new THREE.PlaneGeometry(15, len), greenMat);
      corr.rotation.x = -Math.PI/2;
      corr.rotation.z = Math.atan2(x2-x1, z2-z1);
      corr.position.set((x1+x2)/2, 0.35, (z1+z2)/2);
      scene.add(corr);
      /* Trees along corridor */
      var trees = Math.floor(len / 30);
      for(var t = 0; t < trees; t++){
        var tt = t / trees;
        var tx = x1 + (x2-x1)*tt + (Math.random()-0.5)*10;
        var tz = z1 + (z2-z1)*tt + (Math.random()-0.5)*10;
        var tree = new THREE.Mesh(new THREE.ConeGeometry(3, 8, 7), greenMat);
        tree.position.set(tx, 4, tz);
        scene.add(tree);
      }
    }
    greenCorridor(0, 0, 100, -100);
    greenCorridor(100, -100, 250, 50);

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

/* MASSIVE MOUNTAINS — huge topography, creating depth. 2026-10-04. */
function buildMassiveMountains(){
  try{
    var rockMat = new THREE.MeshStandardMaterial({color: 0x3a3a3a, roughness: 0.95});
    var snowMat = new THREE.MeshStandardMaterial({color: 0xffffff, roughness: 0.3});
    var greenMat = new THREE.MeshStandardMaterial({color: 0x1a5a1a, roughness: 0.9});

    /* Mountain ranges around the map edges — creating enclosure and depth */
    var ranges = [
      /* North range */
      {x: -4000, z: -6000, w: 3000, h: 400},
      {x: 0, z: -6500, w: 4000, h: 500},
      {x: 4000, z: -6000, w: 3000, h: 450},
      /* South range */
      {x: -4000, z: 6000, w: 3000, h: 380},
      {x: 0, z: 6500, w: 4000, h: 480},
      {x: 4000, z: 6000, w: 3000, h: 420},
      /* East range */
      {x: 6000, z: -3000, w: 2500, h: 350},
      {x: 6500, z: 0, w: 3000, h: 450},
      {x: 6000, z: 3000, w: 2500, h: 380},
      /* West range */
      {x: -6000, z: -3000, w: 2500, h: 400},
      {x: -6500, z: 0, w: 3000, h: 480},
      {x: -6000, z: 3000, w: 2500, h: 360}
    ];

    for(var r = 0; r < ranges.length; r++){
      (function(){
        var rx = ranges[r].x, rz = ranges[r].z;
        var rw = ranges[r].w, rh = ranges[r].h;
        /* Multiple peaks per range for natural look */
        var peaks = 5 + Math.floor(Math.random() * 3);
        for(var p = 0; p < peaks; p++){
          var px = rx + (Math.random() - 0.5) * rw;
          var pz = rz + (Math.random() - 0.5) * rw * 0.5;
          var ph = rh * (0.7 + Math.random() * 0.5);
          var pw = 200 + Math.random() * 200;
          /* Mountain */
          var mtn = new THREE.Mesh(new THREE.ConeGeometry(pw, ph, 7), rockMat);
          mtn.position.set(px, ph/2, pz);
          scene.add(mtn);
          /* Snow cap */
          var capH = ph * 0.3;
          var capW = pw * 0.35;
          var cap = new THREE.Mesh(new THREE.ConeGeometry(capW, capH, 7), snowMat);
          cap.position.set(px, ph - capH/2, pz);
          scene.add(cap);
          /* Green base */
          var base = new THREE.Mesh(new THREE.SphereGeometry(pw * 1.2, 12, 8), greenMat);
          base.scale.y = 0.2;
          base.position.set(px, 0.13, pz);
          scene.add(base);
        }
      })();
    }

    /* Enhance Ahupua'a peaks — make them HUGE (Hawaiian scale) */
    /* Mauna Kea is 4207m — let's make these feel that massive */

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

/* SCENIC — stretched, bent mountains with lakes and rivers. National Geographic. 2026-10-04. */
function buildScenic(){
  try{
    window._dynamics = window._dynamics || [];
    var rockMat = new THREE.MeshStandardMaterial({color: 0x3a3a3a, roughness: 0.95});
    var snowMat = new THREE.MeshStandardMaterial({color: 0xffffff, roughness: 0.3});
    va