<!-- SOLID CITY · part 1137 -->
true }];
var VOLCANOES = [
  { name: 'MAUNA LOA', x: 10500, z: 2600, r: 7200, h: 3300 },
  { name: 'MAUNA KEA', x: 11800, z: -3900, r: 5200, h: 3500 },
  { name: 'HUALĀLAI', x: 4600, z: 700, r: 3200, h: 1700 },
  { name: 'KOHALA', x: 7600, z: -7600, r: 3600, h: 1400 },
  { name: 'KĪLAUEA', x: 15600, z: 4200, r: 3200, h: 1100, crater: true }
];
(function () { // the rest of the chain, seeded
  var ang = [2.2, 2.75, 3.3, 3.9, 4.5, 5.2, 0.9, 1.5];
  for (var k = 0; k < ang.length; k++) {
    var d = 15500 + rnd() * 9000, r = 1300 + rnd() * 2600;
    var isl = { x: 8600 + Math.cos(ang[k]) * d, z: Math.sin(ang[k]) * d, r: r };
    ISLANDS.push(isl);
    if (r > 2400) VOLCANOES.push({ name: '', x: isl.x + (rnd() - .5) * r * .4, z: isl.z + (rnd() - .5) * r * .4, r: r * .9, h: 600 + rnd() * 1300 });
  }
})();
var WORLD_EXTENT = 32000; // ~64 km across the chain (terrain streams anywhere; beyond is open ocean)

function landMask(x, z) {
  var c = -9, wob = fbm(x * 0.00022, z * 0.00022, 4) * 0.32;
  for (var k = 0; k < ISLANDS.length; k++) {
    var I = ISLANDS[k], dx = x - I.x, dz = z - I.z;
    var d = Math.sqrt(dx * dx + dz * dz) / I.r + wob;
    var v = 1 - d; if (v > c) c = v;
  }
  return c;
}
function heightAt(x, z) {
  var c = landMask(x, z);
  var h = c > 0 ? 4 + 260 * Math.pow(c, 0.8) : c * 700;
  var land = smooth(c * 6 + 0.1);
  for (var k = 0; k < VOLCANOES.length; k++) {
    var V = VOLCANOES[k], dx = x - V.x, dz = z - V.z, dd = Math.sqrt(dx * dx + dz * dz) / V.r;
    if (dd < 1) {
      var q2 = 1 - dd * dd; h += V.h * q2 * q2 * Math.pow(1 - dd, 0.35) * land;   // broad shield profile
      if (V.crater && dd < 0.12) h -= (0.12 - dd) / 0.12 * 260;
    }
  }
  if (land > 0) {
    h += ridged(x * 0.00045, z * 0.00045, 5) * 520 * land * smooth(c * 2.5);
    h += fbm(x * 0.0035, z * 0.0035, 3) * 18 * land;
  }
  // flatten the capital
  var r = Math.sqrt(x * x + z * z);
  if (r < 1500) h = lerp(CITY_Y, Math.max(h, 4), smooth((r - 820) / 680));
  // Solid City University (campus-map.js): road beds and campus pads flattened to city level
  if (window.CampusMap) { var fw = CampusMap.flatW(x, z); if (fw > 0) h = lerp(h, CITY_Y, fw); }
  h = servitudeCarve(x, z, h);
  return h;
}
/* THE SERVITUDE (the King's word, 2026-10-14): two hollow
 * cities dug into the far south-eastern massif, joined by a
 * lava-tube gallery. The digging is done here, in the land's
 * own law: a cap the height may not exceed — two bowls, the
 * Entree shelf cut into Prime's south-western face, and the
 * gallery slot descending through the saddle between them. */
function _servSS(t) { t = t < 0 ? 0 : t > 1 ? 1 : t; return t * t * (3 - 2 * t); }
var SERV_A = { x: 2600, z: 1280, f: 520 }, SERV_B = { x: 2600, z: 1660, f: 440 };
function _servBowl(x, z, C) {
  var d = Math.hypot(x - C.x, z - C.z);
  if (d > 215) return 1e9;
  if (d <= 140) return C.f;
  return C.f + 900 * _servSS((d - 140) / 65);
}
function servitudeCarve(x, z, h) {
  if (x < 2150 || x > 3050 || z < 850 || z > 2050) return h;
  var cap = Math.min(_servBowl(x, z, SERV_A), _servBowl(x, z, SERV_B));
  var ex = x - SERV_A.x, ez = z - SERV_A.z;
  var s = ex * -0.7071 + ez * 0.7071, w = Math.abs(ex * 0.7071 + ez * 0.7071);
  if (s > 90 && s < 385 && w < 46) {
    var prof = s <= 240 ? SERV_A.f : SERV_A.f - (s - 240) * 0.5;
    var cw = prof + 60 * _servSS((w - 26) / 20);
    if (cw < cap) cap = cw;
  }
  if (z > 1390 && z < 1550) {
    var gw = Math.abs(x - 2600);
    if (gw < 40) {
      var gf = SERV_A.f + (SERV_B.f - SERV_A.f) * _servSS((z - 1400) / 130);
      var gc = gf + 90 * _servSS((gw - 15) / 23);
      if (gc < cap) cap = gc;
    }
  }
  return Math.min(h, cap);
}
function groundAt(x, z) { var r = x * x + z * z; return r < 820 * 820 ? CITY_Y : heightAt(x, z); }

var tmpC = new T.Color();
function colorAt(x, z, h, slope, out) {
  var lava = fbm(x * 0.0011 + 7, z * 0.0011, 3);
  if (h < 0) { out.setRGB(0.05, 0.12, 0.14).convertSRGBToLinear(); return; }
  if (h < 14) { out.setRGB(0.22, 0.19, 0.15).convertSRGBToLinear(); return; }             // black-sand shore
  var g = smooth((lava + 0.2) * 2.2) * smooth((2200 - h) / 900);    // green flanks
  var r0 = lerp(0.075, 0.07, g), g0 = lerp(0.065, 0.17, g), b0 = lerp(0.07, 0.07, g);
  if (slope > 0.55) { r0 = 0.11; g0 = 0.09; b0 = 0.085; }               // basalt cliffs
  if (h > 2600) { var s = smooth((h - 2900) / 400) * (1 - smooth((slope - 0.6) * 4)); r0 = lerp(r0, 0.86, s); g0 = lerp(g0, 0.86, s); b0 = lerp(b0, 0.9, s); }
  out.setRGB(r0, g0, b0).convertSRGBToLinear();
}

/* curved-planet vertex hook: every world material drops by d^2/2R from the camera */
function curve(mat) {
  mat.onBeforeCompile = function (sh) {
    sh.vertexShader = sh.vertexShader.replace('#include <begin_vertex>',
      '#include <begin_vertex>\n' +
      '#ifdef USE_INSTANCING\n vec4 cwp = modelMatrix * instanceMatrix * vec4(transformed,1.0);\n#else\n vec4 cwp = modelMatrix * vec4(transformed,1.0);\n#endif\n' +
 