<!-- SOLID CITY · part 2065 -->
& M.group.userData.update) try { M.group.userData.update(S.t); } catch (e) {}
  // no narration. no radar. it stays hidden.
}
function radar() {}
window.CityHiddenShip = { update: update, radar: radar, pos: POS, state: function () { return M.state; } };
})();


===== FILE: public/city/hidden-ship.js =====
/* SOLID CITY — THE KING'S HIDDEN SHIP (2026-10-11, by order of the King)
 * "Can i have a space ship like that in a hidden place in the map?" "In a mountain cave?"
 * A royal variant of the city ship, hidden in a mountain cave.
 * DELIBERATELY HIDDEN: no radar blip, no Hyper POI, no Watch caption.
 * The King alone holds the riddle.
 * Self-contained ES module. Local frame: cave floor at y = 0, mouth faces +Z (north).
 */
function labelPlate(T, text) {
  var c = document.createElement('canvas'); c.width = 512; c.height = 128;
  var g = c.getContext('2d');
  g.fillStyle = '#141114'; g.fillRect(0, 0, 512, 128);
  g.strokeStyle = '#d8aa48'; g.lineWidth = 6; g.strokeRect(6, 6, 500, 116);
  g.fillStyle = '#d8aa48'; g.textAlign = 'center'; g.textBaseline = 'middle';
  g.font = 'bold 52px Georgia, serif'; g.fillText(text, 256, 66);
  var t = new T.CanvasTexture(c); t.encoding = T.sRGBEncoding; return t;
}
export function createHiddenShip(o) {
  var T = o.THREE, P = o.position || { x: 0, y: 0, z: 0 };
  var root = new T.Group(); root.name = 'kings-hidden-ship'; root.position.set(P.x, P.y, P.z);
  var foot = [];
  var C = { gold: 0xd8aa48, rock: 0x1c1a20, dark: 0x0a080c };
  var rockMat = new T.MeshLambertMaterial({ color: C.rock });
  var goldMat = new T.MeshLambertMaterial({ color: C.gold, emissive: 0x3a2408 });
  // Cave floor
  var floor = new T.Mesh(new T.BoxGeometry(70, 3, 50), new T.MeshLambertMaterial({ color: 0x2a242a }));
  floor.position.y = -1.5; root.add(floor);
  // Mountain: ring of great rock teeth, tall at the back, gap at the mouth (north, +Z)
  var i, a, x, z, h;
  for (i = 0; i < 10; i++) {
    a = (i / 10) * Math.PI * 2;
    if (Math.abs(a - Math.PI / 2) < 0.45) continue;  // the mouth
    x = Math.cos(a) * 42; z = Math.sin(a) * 36;
    h = 34 + (i % 3) * 12 + (a > Math.PI ? 14 : 0);  // taller at the back (-Z)
    var tooth = new T.Mesh(new T.ConeGeometry(13, h, 7), rockMat);
    tooth.position.set(x, h / 2 - 2, z); tooth.rotation.y = a; root.add(tooth);
    foot.push([x, z, 20, 20, 0, h, 0]);
  }
  // Cap rock over the cave (so it reads as a cave, not a ring)
  var cap = new T.Mesh(new T.ConeGeometry(46, 26, 8), rockMat);
  cap.position.y = 38; root.add(cap);
  // Mouth frame: two sentinel stones
  [-1, 1].forEach(function (s) {
    var sent = new T.Mesh(new T.BoxGeometry(6, 22, 6), rockMat);
    sent.position.set(16 * s, 9, 34); root.add(sent);
    foot.push([16 * s, 34, 6, 6, 0, 20, 0]);
  });
  // THE KING'S SHIP: royal variant of the city ship — gold hull, larger, crown light
  var ship = new T.Group(); ship.name = 'kings-ship';
  var hullM = new T.MeshLambertMaterial({ color: 0xd8aa48, emissive: 0x2a1a04 });
  var darkM = new T.MeshLambertMaterial({ color: 0x1a1418 });
  var redM = new T.MeshLambertMaterial({ color: 0xb0101e, emissive: 0x30030a });
  var body = new T.Mesh(new T.ConeGeometry(2.4, 16, 8), hullM); body.rotation.x = Math.PI / 2; body.position.z = 2; ship.add(body);
  var aft = new T.Mesh(new T.CylinderGeometry(2.4, 2.8, 4.5, 8), hullM); aft.rotation.x = Math.PI / 2; aft.position.z = -8; ship.add(aft);
  var stripe = new T.Mesh(new T.BoxGeometry(0.7, 0.3, 12), darkM); stripe.position.set(0, 1.9, 0); ship.add(stripe);
  var cockpit = new T.Mesh(new T.SphereGeometry(1.5, 12, 8, 0, Math.PI * 2, 0, Math.PI / 2), new T.MeshLambertMaterial({ color: 0x220a10, emissive: 0x7a0a18 }));
  cockpit.scale.set(0.8, 0.7, 1.6); cockpit.position.set(0, 1.35, 2); ship.add(cockpit);
  var wing = new T.Mesh(new T.BoxGeometry(18, 0.35, 5.4), redM); wing.position.set(0, -0.3, -4); ship.add(wing);
  [-1, 1].forEach(function (s) {
    var tipw = new T.Mesh(new T.BoxGeometry(0.45, 3.6, 3.3), hullM); tipw.position.set(9 * s, 1.2, -4.8); ship.add(tipw);
    var eng = new T.Mesh(new T.CylinderGeometry(1.05, 1.2, 5.4, 10), darkM); eng.rotation.x = Math.PI / 2; eng.position.set(3.6 * s, -0.45, -7.8); ship.add(eng);
    var fl = new T.Mesh(new T.ConeGeometry(0.93, 6, 10), new T.MeshBasicMaterial({ color: 0xffb060, transparent: true, opacity: 0.8, blending: T.AdditiveBlending, depthWrite: false }));
    fl.rotation.x = -Math.PI / 2; fl.position.set(3.6 * s, -0.45, -13.5); ship.add(fl); fl.name = 'flame';
  });
  var fin = new T.Mesh(new T.BoxGeometry(0.35, 3.9, 4.5), redM); fin.position.set(0, 2.4, -7.5); ship.add(fin);
  // the crown light: a small gold crown above the cockpit
  var crown = new T.Mesh(new T.CylinderGeometry(1.1, 1.1, 0.7, 8), goldMat);
  crown.position.set(0, 3.1, 2); ship.add(crown);
  ship.position.set(0, 4.2, -4); ship.rotation.y = 0.12;
  root.add(ship);
  foot.push([0, -4, 20, 24, 0, 9, 0]);
  // Name plate
  var plate = new T.Mesh(new T.PlaneGeometry(