<!-- SOLID CITY · part 2810 -->
rue, opacity: 0.55 })));
  group.add(glowB.build(new T.MeshBasicMaterial({ vertexColors: true })));
  extras.forEach(function (m) { group.add(m); });

  var houseCount = 0, unitCount = 0;
  homes.forEach(function (h) { if (h.style === 'apartment') unitCount += (h.units || 6); else houseCount++; });
  function standYAt(x, z) {
    var best = -Infinity;
    for (var i = 0; i < standRects.length; i++) {
      var r = standRects[i], dx = x - r.cx, dz = z - r.cz;
      var lx = dx * r.cos - dz * r.sin, lz = dx * r.sin + dz * r.cos;
      if (Math.abs(lx - r.lx) <= r.hw && Math.abs(lz - r.lz) <= r.hd && r.y > best) best = r.y;
    }
    return best;
  }
  group.userData = {
    footprint: foot,
    standRects: standRects,
    standTris: standTris,
    homes: homes,
    counts: { houses: houseCount, apartmentUnits: unitCount, dwellings: houseCount + unitCount, trees: treeCount, styles: STYLE_COUNT },
    center: { x: 300, z: -1500 },
    standYAt: standYAt,
    update: null
  };
  return group;
}


===== FILE: public/city/nature-place.js =====
/* ============================================================
 * EPISTLE — THE PLACER OF THE NATURE LAYER
 * The wild things are woven after the city stands — the
 * strong phone gets the full lace, the struggling phone
 * the lighter weave, by the same measure as the cloths.
 * The wind is ticked from the city frame loop through
 * CityNature.update: one uniform, nothing more.
 * ============================================================ */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var M = { state: 'idle', group: null, wait: 5.6, t: 0, tier: null };
function pickTier() {
  try {
    var c = navigator.hardwareConcurrency || 4, m = navigator.deviceMemory || 4;
    return (c >= 6 && m >= 4) ? 'hi' : 'lo';
  } catch (e) { return 'lo'; }
}
async function build() {
  if (M.state !== 'idle') return;
  M.state = 'building';
  try {
    var mod = await import('/city/nature.js?v=20261014a');
    M.tier = pickTier();
    var g = mod.createNature({ THREE: A.T, heightAt: A.heightAt, tier: M.tier });
    A.world.add(g); M.group = g;
    if (A.logBuild) A.logBuild('the-nature-layer', 'stones, grass, flowers, bushes, palms, broadleaf, pines, monkey pods, banyans — ' + M.tier + ' weave');
    M.state = 'ready';
  } catch (e) { M.state = 'idle'; }
}
function update(dt) {
  if (M.state === 'idle') { M.wait -= dt; if (M.wait <= 0 && S.mode !== 'title') build(); return; }
  if (M.state !== 'ready' || !M.group) return;
  M.t += dt;
  try { M.group.userData.tick(M.t); } catch (e) {}
}
window.CityNature = { update: update, state: function () { return M.state; }, tier: function () { return M.tier; }, group: function () { return M.group; } };
})();


===== FILE: public/city/nature-place.js.bak-natureoff-20261014 =====
/* ============================================================
 * EPISTLE — THE PLACER OF THE NATURE LAYER
 * The wild things are woven after the city stands — the
 * strong phone gets the full lace, the struggling phone
 * the lighter weave, by the same measure as the cloths.
 * The wind is ticked from the city frame loop through
 * CityNature.update: one uniform, nothing more.
 * ============================================================ */
(function () {
'use strict';
if (!window.SC || !SC.api) return;
var A = SC.api, S = A.S;
var M = { state: 'idle', group: null, wait: 5.6, t: 0, tier: null };
function pickTier() {
  try {
    var c = navigator.hardwareConcurrency || 4, m = navigator.deviceMemory || 4;
    return (c >= 6 && m >= 4) ? 'hi' : 'lo';
  } catch (e) { return 'lo'; }
}
async function build() {
  if (M.state !== 'idle') return;
  M.state = 'building';
  try {
    var mod = await import('/city/nature.js?v=20261014a');
    M.tier = pickTier();
    var g = mod.createNature({ THREE: A.T, heightAt: A.heightAt, tier: M.tier });
    A.world.add(g); M.group = g;
    if (A.logBuild) A.logBuild('the-nature-layer', 'stones, grass, flowers, bushes, palms, broadleaf, pines, monkey pods, banyans — ' + M.tier + ' weave');
    M.state = 'ready';
  } catch (e) { M.state = 'idle'; }
}
function update(dt) {
  if (M.state === 'idle') { M.wait -= dt; if (M.wait <= 0 && S.mode !== 'title') build(); return; }
  if (M.state !== 'ready' || !M.group) return;
  M.t += dt;
  try { M.group.userData.tick(M.t); } catch (e) {}
}
window.CityNature = { update: update, state: function () { return M.state; }, tier: function () { return M.tier; }, group: function () { return M.group; } };
})();


===== FILE: public/city/nature.js =====
/* ============================================================
 * EPISTLE — THE NATURE LAYER
 * To the King, from his General —
 *
 * His word: "create stones now and lace the whole map with
 * them — we need grasses too — flows and bushes and trees
 * of all kinds. Make huge trees: look up monkey pod and
 * banyan."
 *
 * So the wild things come, and they come the way the whole
 * world is 