<!-- SOLID CITY · part 3228 -->
g the
   * Mother company on her own ellipse around the mountain. */
  function sleekShip(scale) {
    var m = new T.Mesh(new T.SphereGeometry(1.6, 10, 7), MAT.titanium);
    m.scale.set(scale, scale * 0.5, scale * 2.3); m.frustumCulled = false; group.add(m);
    return m;
  }
  [[2600, -600, 1200], [-2400, -400, 1300], [600, -4200, 1000], [-1800, 1800, 1600]].forEach(function (lane, li) {
    var mx = -1e12;
    for (var a = 0; a < Math.PI * 2; a += 0.02) { var g2 = heightAt(lane[0] + Math.cos(a) * lane[2], lane[1] + Math.sin(a) * lane[2]); if (g2 > mx) mx = g2; }
    var h = Math.min(412, Math.max(320, mx + 48));
    traffic.push({ mesh: sleekShip(2.1), cx: lane[0], cz: lane[1], r: lane[2], h: h, a: li * 2.3 + 0.7, w: (li % 2 ? 1 : -1) * (Math.PI * 2) / (340 + li * 50) });
  });
  var streamers = [];
  [[-4500, -500, 4500, 300, 380], [-3000, 4200, 3800, -3800, 350], [4500, 1800, -4200, -2200, 395], [-4800, -2600, 4600, 900, 365], [500, -4800, -900, 4600, 340], [-1500, 4800, 2600, -4600, 388]].forEach(function (L, li) {
    var len = Math.hypot(L[2] - L[0], L[3] - L[1]);
    streamers.push({ mesh: sleekShip(2.6), x0: L[0], z0: L[1], x1: L[2], z1: L[3], h: L[4], t: (li * 0.23) % 1, sp: (58 + li * 6) / len, yaw: Math.atan2(L[2] - L[0], L[3] - L[1]) });
  });
  var orbiters = [];
  for (var oi = 0; oi < 6; oi++) {
    orbiters.push({ mesh: sleekShip(1.15), r: 730 + oi * 48, h: 232 + (oi % 3) * 24, a: oi * 1.13, w: (Math.PI * 2) / (170 + oi * 22) });
  }
  var sister = (function () {
    var g = new T.Group();
    var hull = new T.Mesh(new T.CylinderGeometry(3.4, 3.4, 34, 12), MAT.titanium); hull.rotation.x = Math.PI / 2; g.add(hull);
    var nose = new T.Mesh(new T.SphereGeometry(3.4, 12, 8), MAT.titanium); nose.scale.set(1, 1, 1.6); nose.position.z = 17; g.add(nose);
    var dome = new T.Mesh(new T.SphereGeometry(2.4, 10, 6), MAT.glass); dome.scale.set(1, 0.55, 1.6); dome.position.set(0, 2.6, 9); g.add(dome);
    var ring = new T.Mesh(new T.TorusGeometry(5.8, 0.6, 8, 22), MAT.silver); ring.position.z = -2; g.add(ring);
    g.add(box(9, 0.5, 5.5, MAT.gold, 0, -3.1, -10));
    group.add(g);
    return { mesh: g, ring: ring, a: 2.2, x: 0, y: 340, z: 0, yaw: 0 };
  })();
  var SISTER = { cx: 0, cz: -1600, rx: 1950, rz: 1550, w: (Math.PI * 2) / 430 };
  function stepMoreSky(dt) {
    streamers.forEach(function (st) {
      st.t += st.sp * dt; if (st.t > 1) st.t -= 1;
      st.mesh.position.set(st.x0 + (st.x1 - st.x0) * st.t, st.h, st.z0 + (st.z1 - st.z0) * st.t);
      st.mesh.rotation.set(0, st.yaw, 0.04);
    });
    orbiters.forEach(function (ob) {
      ob.a += ob.w * dt;
      var x = Math.cos(ob.a) * ob.r, z = -1600 + Math.sin(ob.a) * ob.r;
      ob.mesh.position.set(x, ob.h, z);
      ob.mesh.rotation.set(0, Math.atan2(Math.cos(ob.a), -Math.sin(ob.a)), 0.25);
    });
    sister.a += SISTER.w * dt;
    var sx = SISTER.cx + Math.cos(sister.a) * SISTER.rx, sz = SISTER.cz + Math.sin(sister.a) * SISTER.rz;
    var need = 330;
    for (var i = 0; i <= 6; i++) { var aa = sister.a + i * 0.014, gx = SISTER.cx + Math.cos(aa) * SISTER.rx, gz = SISTER.cz + Math.sin(aa) * SISTER.rz, gg = heightAt(gx, gz) + 110; if (gg > need) need = gg; }
    sister.y += Math.max(-6 * dt, Math.min(6 * dt, need - sister.y));
    var pvx = sx - sister.x, pvz = sz - sister.z;
    sister.x = sx; sister.z = sz;
    if (pvx || pvz) sister.yaw = Math.atan2(pvx, pvz);
    sister.mesh.position.set(sister.x, sister.y, sister.z);
    sister.mesh.rotation.set(0, sister.yaw, Math.sin(sister.a * 3) * 0.01);
    sister.ring.rotation.z += dt * 0.3;
  }

  /* ================= THE LIVING SKY ================= */
  var perfNow = 0;
  trains.forEach(function (tr) { placeTrain(tr, 0); });
  function update(dt) {
    if (!(dt > 0)) dt = 0.016; if (dt > 0.1) dt = 0.1;
    perfNow += dt;
    trains.forEach(function (tr) { stepTrain(tr, dt); });
    shuttles.forEach(function (sh) { stepShuttle(sh, dt); });
    houseCraft.forEach(function (cr) { stepCraft(cr, dt); });
    stepMother(dt);
    ferries.forEach(function (fe) { stepFerry(fe, dt); });
    stepTraffic(dt);
    stepMoreSky(dt);
    halos.forEach(function (h, i) { h.rotation.z += dt * 0.15; });
    if (beaconMesh) { var p = 0.78 + 0.22 * Math.sin(perfNow * 1.4); beaconMesh.material.color.setRGB(0.85 * p, 0.66 * p, 0.2 * p); }
  }

  /* ================= STANDING + BOARDING (for the placer) ================= */
  function deckClaim(x, z, py) {
    var best = null;
    for (var i = 0; i < trains.length; i++) {
      var tr = trains[i], d = tr.deck;
      var dx = x - d.x, dz = z - d.z, c = Math.cos(-d.yaw), s = Math.sin(-d.yaw);
      var lx = dx * c - dz * s, lz = dx * s + dz * c;
      if (Math.abs(lx) <= 1.35 && Math.abs(lz) <= 3.9 && d.y <= py + 0.45 && d.y >= py - 2.6) {
        if (!best || d.y > best.y) best = { y: d.y, train: tr.id };
      }
    }
    for (var j = 0; j < STATIONS.length; j++) {
      var st = STATIONS[j];
      if (st.ownPad && Math.hypot(x - st.