/** * WorldNames — casing-safe world-name resolution. Pure (no Phaser), * Node-tested (dev/world-names.test.mjs). * * World state is keyed by the world's CANONICAL name (its discovery * name — build records, tether labels, the home key). UI paths that * display names uppercase them (the comms panel's decode shows * "ALKHAQO"); if that display casing leaks back into the data path * (the landing handoff), the name-keyed lookups — isBuilt(planet), * tetherLevelFor(planet) — silently miss, and the world reads as * "nothing installed / no tether" on top of its own home world. * * canonicalPlanetName(name, worlds) → the canonical spelling of a known * world regardless of the casing `name` arrived in; unknown names pass * through untouched. */ export function canonicalPlanetName(name, worlds) { const n = String(name ?? '').trim(); if (!n || !Array.isArray(worlds)) return n; // 1) exact (any casing in the list is accepted, its spelling wins) for (const w of worlds) { const s = String(w ?? '').trim(); if (s && s === n) return s; } // 2) case-insensitive const l = n.toLowerCase(); for (const w of worlds) { const s = String(w ?? '').trim(); if (s && s.toLowerCase() === l) return s; } return n; }