<!-- SAGA · part 25 -->
esh(new THREE.PlaneGeometry(80, 80), waterMat);
    water.rotation.x = -Math.PI/2;
    water.position.set(-100, 0.2, -100);
    scene.add(water);
    /* Docks */
    for(var d = 0; d < 3; d++){
      var dock = new THREE.Mesh(new THREE.BoxGeometry(4, 0.5, 20), trunkMat);
      dock.position.set(-120 + d * 20, 0.5, -100);
      scene.add(dock);
    }

    /* THE MOUNTAINS — stone peaks */
    var stoneMat = new THREE.MeshStandardMaterial({color: 0x555555, roughness: 0.9});
    for(var m = 0; m < 8; m++){
      var mx = 150 + Math.random() * 100;
      var mz = 100 + Math.random() * 100;
      var mh = 20 + Math.random() * 30;
      var peak = new THREE.Mesh(new THREE.ConeGeometry(15, mh, 6), stoneMat);
      peak.position.set(mx, mh/2, mz);
      scene.add(peak);
    }

    /* THE BEACONS — red lights marking the districts */
    var districts = [
      [0, 0, 'CENTER'], [8, 9, 'CLOUD9'], [25, 25, 'DOME'],
      [-35, -35, 'VEIL'], [100, -100, 'CITY'], [-100, -100, 'HARBOR']
    ];
    for(var b = 0; b < districts.length; b++){
      var bx = districts[b][0], bz = districts[b][1];
      var beacon = new THREE.Mesh(
        new THREE.CylinderGeometry(0.5, 0.5, 20, 8),
        new THREE.MeshStandardMaterial({color: 0xff0000, emissive: 0xff0000, emissiveIntensity: 1})
      );
      beacon.position.set(bx + 15, 10, bz);
      scene.add(beacon);
    }
  }catch(e){}
}
if(typeof buildWorld === 'function'){ window._buildQueue.push(buildWorld); }

/* THE WEB DISTRICT — epistles.xyz in 3D. Every part of the website, built.
   2026-10-04. Non stop. */
function buildWebDistrict(){
  try{
    var wx = -200, wz = 200; /* Web District location */
    var goldMat = new THREE.MeshStandardMaterial({color: 0xd4a017, roughness: 0.4, metalness: 0.6});
    var darkMat = new THREE.MeshStandardMaterial({color: 0x1a1a1a, roughness: 0.8});
    var redMat = new THREE.MeshStandardMaterial({color: 0x8a0a0a, roughness: 0.6});
    var blueMat = new THREE.MeshStandardMaterial({color: 0x0a4a8a, roughness: 0.6});
    var tealMat = new THREE.MeshStandardMaterial({color: 0x00aaaa, emissive: 0x00ffff, emissiveIntensity: 0.3});

    /* FORUM HALL — the main forum building */
    var forum = new THREE.Group();
    var fbase = new THREE.Mesh(new THREE.BoxGeometry(40, 2, 30), darkMat);
    fbase.position.set(wx, 1, wz);
    forum.add(fbase);
    /* Columns */
    for(var c = 0; c < 6; c++){
      var col = new THREE.Mesh(new THREE.CylinderGeometry(1, 1.2, 12, 8), redMat);
      col.position.set(wx - 15 + c * 6, 8, wz + 12);
      forum.add(col);
      var col2 = col.clone();
      col2.position.set(wx - 15 + c * 6, 8, wz - 12);
      forum.add(col2);
    }
    var froof = new THREE.Mesh(new THREE.BoxGeometry(44, 2, 34), goldMat);
    froof.position.set(wx, 15, wz);
    forum.add(froof);
    scene.add(forum);

    /* LOBBY — the gathering circle */
    var lobby = new THREE.Group();
    var lfloor = new THREE.Mesh(new THREE.CylinderGeometry(12, 12, 1, 24), darkMat);
    lfloor.position.set(wx + 50, 0.6, wz);
    lobby.add(lfloor);
    var lring = new THREE.Mesh(new THREE.TorusGeometry(12, 0.5, 8, 32), goldMat);
    lring.rotation.x = Math.PI/2;
    lring.position.set(wx + 50, 1.2, wz);
    lobby.add(lring);
    scene.add(lobby);

    /* AEGIS HALL — blue premiere room */
    var aegis = new THREE.Group();
    var abase = new THREE.Mesh(new THREE.BoxGeometry(25, 8, 20), blueMat);
    abase.position.set(wx - 50, 4, wz);
    aegis.add(abase);
    var adome = new THREE.Mesh(new THREE.SphereGeometry(10, 16, 12, 0, Math.PI*2, 0, Math.PI/2), blueMat);
    adome.position.set(wx - 50, 8, wz);
    aegis.add(adome);
    scene.add(aegis);

    /* SABLE'S SHIP — the AI vessel */
    var ship = new THREE.Group();
    var hull = new THREE.Mesh(new THREE.CylinderGeometry(3, 5, 20, 8), darkMat);
    hull.rotation.z = Math.PI/2;
    hull.position.set(wx, 15, wz - 50);
    ship.add(hull);
    var bridge = new THREE.Mesh(new THREE.BoxGeometry(6, 4, 6), goldMat);
    bridge.position.set(wx + 5, 18, wz - 50);
    ship.add(bridge);
    var engine = new THREE.Mesh(new THREE.CylinderGeometry(2, 3, 4, 8),
      new THREE.MeshStandardMaterial({color: 0x00ffff, emissive: 0x00ffff, emissiveIntensity: 2}));
    engine.rotation.z = Math.PI/2;
    engine.position.set(wx - 12, 15, wz - 50);
    ship.add(engine);
    scene.add(ship);

    /* THE LIBRARY — Solid Notes */
    var lib = new THREE.Group();
    var lbuild = new THREE.Mesh(new THREE.BoxGeometry(30, 10, 20), darkMat);
    lbuild.position.set(wx + 50, 5, wz - 50);
    lib.add(lbuild);
    /* Book spines */
    for(var b = 0; b < 10; b++){
      var book = new THREE.Mesh(new THREE.BoxGeometry(2, 6, 1),
        new THREE.MeshStandardMaterial({color: 0x8a0a0a, roughness: 0.7}));
      book.position.set(wx + 38 + b * 2.5, 8, wz - 42);
      lib.add(book);
    }
    scene.add(lib);

    /* THE CODEX VAULT — sealed packs */
    var vault = new THREE.Group();
    var vbox = new THREE.Mesh(new THREE.BoxG