<!-- SAGA-SOLID · part 90 -->
E.Mesh(new THREE.SphereGeometry(6, 12, 12), glowMat);
    tip.position.set(tx, th + 5, tz);
    scene.add(tip);
  }
  if(typeof say === 'function') say('Space Age: ' + scaled + ' scaled, 20 towers');
}, 6000);

window.__sagaExecMark('L7930');

/* ===== MASSIVE UPGRADE — End to end. King's order 2026-10-06 ===== */
setTimeout(function massiveUpgrade(){
  var cityX = 100, cityZ = -100;
  var seed = 8888;
  function rnd(){ seed = (seed * 16807) % 2147483647; return (seed - 1) / 2147483646; }
  /* 1. City: triple the towers */
  var towerMat = new THREE.MeshStandardMaterial({color: 0xd0d0d0, metalness: 0.9, roughness: 0.15});
  var glowCyan = new THREE.MeshStandardMaterial({color: 0x00ffff, emissive: 0x00ffff, emissiveIntensity: 1.0});
  var glowGold = new THREE.MeshStandardMaterial({color: 0xffd700, emissive: 0xffd700, emissiveIntensity: 0.8});
  for(var i = 0; i < 80; i++){ /* Doubled */
    var ang = rnd() * Math.PI * 2;
    var dist = 50 + rnd() * 350;
    var tx = cityX + Math.cos(ang) * dist;
    var tz = cityZ + Math.sin(ang) * dist;
    var th = 500 + rnd() * 1000; /* HUGE */
    var tw = 40 + rnd() * 60; /* WIDE */
    var tower = new THREE.Mesh(new THREE.CylinderGeometry(tw*0.7, tw, th, 10), towerMat);
    tower.position.set(tx, th/2, tz);
    scene.add(tower);
    var tipMat = (i % 2 === 0) ? glowCyan : glowGold;
    var tip = new THREE.Mesh(new THREE.SphereGeometry(tw*0.5, 12, 12), tipMat);
    tip.position.set(tx, th + tw*0.4, tz);
    scene.add(tip);
  }
  /* 2. Sky bridges between towers */
  var bridgeMat = new THREE.MeshStandardMaterial({color: 0x808080, metalness: 0.6, roughness: 0.4});
  for(var b = 0; b < 15; b++){
    var a1 = rnd() * Math.PI * 2, d1 = 100 + rnd() * 200;
    var a2 = a1 + 0.5 + rnd() * 0.5, d2 = 100 + rnd() * 200;
    var x1 = cityX + Math.cos(a1)*d1, z1 = cityZ + Math.sin(a1)*d1;
    var x2 = cityX + Math.cos(a2)*d2, z2 = cityZ + Math.sin(a2)*d2;
    var h = 120 + rnd() * 80;
    var len = Math.sqrt((x2-x1)*(x2-x1) + (z2-z1)*(z2-z1));
    var bridge = new THREE.Mesh(new THREE.BoxGeometry(len, 4, 8), bridgeMat);
    bridge.position.set((x1+x2)/2, h, (z1+z2)/2);
    bridge.rotation.y = -Math.atan2(z2-z1, x2-x1);
    scene.add(bridge);
  }
  /* 3. World: more mountains */
  /* DISABLED 2026-10-07 — stale mountain clear, King's word */
  if(false){
  var greenMat = new THREE.MeshStandardMaterial({color: 0x2a6a2a, roughness: 0.9});
  for(var m = 0; m < 80; m++){ /* Doubled */
    var mx = (rnd()*12000)-6000, mz = (rnd()*12000)-6000;
    /* Keep clear of city */
    var cdx = mx-100, cdz = mz+100;
    if(Math.sqrt(cdx*cdx+cdz*cdz) < 500) continue;
    var mr = 60 + rnd()*100, mh = 100 + rnd()*150;
    var mtn = new THREE.Mesh(new THREE.ConeGeometry(mr, mh, 9, 5), greenMat);
    mtn.position.set(mx, mh/2, mz);
    solidifyTerrain(mtn);
    scene.add(mtn);
  }
  } /* end DISABLED */
  if(typeof say === 'function') say('Massive upgrade complete');
}, 7000);

window.__sagaExecMark('FOUNDATION');

/* ============================================================
   WORLD FOUNDATION 1 — OBSERVATION ONLY
   2026-10-07

   RULE:
   This system may MEASURE the world.
   It may NOT move kingPos or modify world geometry.
   ============================================================ */

(function(){

  /* Survive accidental re-execution instead of resetting ourselves. */
  if(window.WORLD_FOUNDATION && window.WORLD_FOUNDATION.version === 1){
    return;
  }

  var WF = window.WORLD_FOUNDATION = {
    version: 1,
    unitsPerMeter: 1,
    killY: -500,

    colliders: [],
    colliderByUUID: Object.create(null),

    debug: {
      enabled: false,
      support: null
    }
  };

  var DOWN = new THREE.Vector3(0, -1, 0);
  var ray = new THREE.Raycaster();

  /*
   * Register a mesh without modifying its geometry, transform,
   * material or appearance.
   *
   * UUID is used only as runtime identity in Foundation 1.
   * Persistent world IDs come later.
   */
  WF.registerSurface = function(mesh, kind, metadata){
    if(!mesh || !mesh.isMesh) return null;

    if(WF.colliderByUUID[mesh.uuid]){
      return WF.colliderByUUID[mesh.uuid];
    }

    var entry = {
      runtimeId: mesh.uuid,
      mesh: mesh,
      kind: kind || 'terrain',
      metadata: metadata || {}
    };

    WF.colliders.push(entry);
    WF.colliderByUUID[mesh.uuid] = entry;

    return entry;
  };

  WF.unregisterSurface = function(mesh){
    if(!mesh || !WF.colliderByUUID[mesh.uuid]) return false;

    var entry = WF.colliderByUUID[mesh.uuid];
    delete WF.colliderByUUID[mesh.uuid];

    WF.colliders = WF.colliders.filter(function(e){
      return e !== entry;
    });

    return true;
  };

  /*
   * Find the nearest registered surface immediately below a position.
   *
   * IMPORTANT:
   * This is a SUPPORT query, not a "search the entire world from
   * the sky" query.
   *
   * maxDrop deliberately limits how far below the player we look.
   * Therefore a bridge ABOVE the player can n