{"version":3,"sources":["biomes.mjs"],"sourcesContent":["// BIOMES (WG-09, tools/terrain-evolve/BIOMES.md): the kinds of ground a world has, where its climate allows them. Pure\n// and twin-safe, as climate.mjs is: no DOM, no clock, only + − × ÷, sqrt, floor and integer hashing, so the servers'\n// copies (functions/lib, zone-server/lib, byte-identical) will answer as the client does when biomes are mined.\n//\n// A world's biomes are laid out by three things, all of them continuous over the cube's edges and corners:\n//   * THE CLIMATE at a direction (climate.mjs fieldAt): a biome keeps to its temperatures, fading out over a few cells\n//     past its limit;\n//   * THE TERRAIN'S ROLE there, lowland or highland, as a weight the generator hands in (its continents' own field);\n//   * LARGE REGIONS, a slow noise on the unit sphere per biome, so a biome is patches rather than everything it may be.\n// The first biome a world is given is its dominant one, spread over most of the ground it suits; each later one is\n// secondary, in regions of its own, and paints over the dominant there. Where a biome's weight falls from 1 to 0 (a\n// region's rim, a temperature limit) it does so over 3 to 6 cells, and the generator dithers its material across that.\nimport { fieldAt, starClassOf } from './climate.mjs';\n\nconst smooth = (t) => (t <= 0 ? 0 : t >= 1 ? 1 : t * t * (3 - 2 * t));\nfunction hash01(s) {\n  let h = 2166136261;\n  for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 16777619);\n  h ^= h >>> 15; h = Math.imul(h, 0x2c1b3c6d); h ^= h >>> 12;\n  return (h >>> 0) / 4294967296;\n}\n// A number in [0, 1) for a whole-number position and a seed, well mixed (a murmur finaliser), so neighbouring cells\n// are unrelated: the dither over a boundary, and anything else placed cell by cell, needs that.\nexport function cellHash(ix, iy, iz, s) { return hash3(ix, iy, iz, s); }\nfunction hash3(ix, iy, iz, s) {\n  let h = Math.imul(ix, 0x27d4eb2d) ^ Math.imul(iy, 0x165667b1) ^ Math.imul(iz, 0x3c6ef372) ^ s;\n  h = Math.imul(h ^ (h >>> 15), 0x85ebca6b); h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35); h ^= h >>> 16;\n  return (h >>> 0) / 4294967296;\n}\n// Value noise in [0, 1): a hash at each lattice point, blended by smoothsteps, so it is continuous everywhere.\nfunction vnoise(x, y, z, s) {\n  const ix = Math.floor(x), iy = Math.floor(y), iz = Math.floor(z);\n  const fx = x - ix, fy = y - iy, fz = z - iz;\n  const u = fx * fx * (3 - 2 * fx), v = fy * fy * (3 - 2 * fy), w = fz * fz * (3 - 2 * fz);\n  const a = hash3(ix, iy, iz, s), b = hash3(ix + 1, iy, iz, s), c = hash3(ix, iy + 1, iz, s), d = hash3(ix + 1, iy + 1, iz, s);\n  const e = hash3(ix, iy, iz + 1, s), f = hash3(ix + 1, iy, iz + 1, s), g = hash3(ix, iy + 1, iz + 1, s), h = hash3(ix + 1, iy + 1, iz + 1, s);\n  const ab = a + (b - a) * u, cd = c + (d - c) * u, ef = e + (f - e) * u, gh = g + (h - g) * u;\n  const lo = ab + (cd - ab) * v, hi = ef + (gh - ef) * v;\n  return lo + (hi - lo) * w;\n}\n\n// THE CATALOG, waves 1 and 2. Each biome's rules are data:\n//   world   what the whole world must have: air (minMbar), a liquid sea (liquidSea true) or none (false), water in any\n//           phase (water), no lava (noLava), a sea of a named liquid (seaName); `rare` is 1 in how many worlds may have it.\n//   tempC   the temperatures it keeps to, read from the climate field where it stands; lockedDayC lowers the floor on a\n//           tidally locked world's day face.\n//   chem    a LIVING biome's chemistry (lifeChemistryOf): it grows only on a world whose life is of that kind. A\n//           geological one has none.\n//   nightside  it keeps to a tidally locked world's dark side: its night face, and the dim half of its terminator.\n//   underSea   it lives under a sea, so the ground a sea covers counts toward it (transient-shape.js biomeCover).\n//   roles   how well it suits the lowlands (low) and the highlands (high), 0 to 1.\n//   maxCover  the most of a world's surface it may cover (biomeMap raises its region's threshold to hold it), or none.\n//   spread  a forest's region threshold lowered by this, so its patches run wider (version 4, with looser moist or dry\n//           ground in transient-shape.js); caps and spreads are version 4's alone (biomeMap opts.caps).\n//   look    what the renderer draws (system-view.js): the depth of ground it colours, in cells (the crystal fields\n//           colour none: their spires are the look, and the ground between them is the world's own).\nexport const BIOMES = Object.freeze([\n  { id: 'duneSea', label: 'dune sea', wave: 1, world: { minMbar: 1, liquidSea: false }, tempC: null,\n    roles: { low: 1, high: 0.15 }, look: { depth: 2 } },\n  { id: 'saltFlats', label: 'salt flats', wave: 1, world: { liquidSea: false, noLava: true }, tempC: [5, 600],\n    roles: { low: 1, high: 0 }, look: { depth: 2 } },\n  { id: 'glacier', label: 'glacier', wave: 1, world: { water: true }, tempC: [-273, 0],\n    roles: { low: 1, high: 1 }, look: { depth: 2 } },\n  { id: 'volcanicFields', label: 'volcanic fields', wave: 1, world: {}, tempC: [150, 100000], lockedDayC: 100,\n    roles: { low: 1, high: 0.6 }, look: { depth: 2 } },\n  { id: 'crystalFields', label: 'crystal fields', wave: 1, maxCover: 0.15, world: { rare: 12 }, tempC: null,\n    roles: { low: 0.35, high: 1 }, look: { depth: 0 } },\n  { id: 'lichenSteppe', label: 'lichen steppe', wave: 1, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [-40, 40],\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  // WAVE 2 (WG-10): living biomes, carbon first, with one of silicon and one of methane so each chemistry shows early.\n  // Their trees, towers and growths are organics.mjs's, their small growths flora.mjs's. The names and shapes are\n  // Kubicor's own (the owner's originality rule).\n  { id: 'woods', label: 'woods', wave: 2, chem: 'carbon', spread: 0.12, world: { minMbar: 100, water: true }, tempC: [-25, 45],\n    roles: { low: 1, high: 0.8 }, look: { depth: 1 } },\n  { id: 'bloomCarpets', label: 'bloom carpets', wave: 2, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [0, 40],\n    roles: { low: 1, high: 0.5 }, look: { depth: 1 } },\n  { id: 'gillTowers', label: 'gill towers', wave: 2, chem: 'carbon', world: { minMbar: 50, water: true }, tempC: [-5, 40],\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'tidalGardens', label: 'tidal gardens', wave: 2, chem: 'carbon', world: { liquidSea: true, water: true }, tempC: [8, 40],\n    roles: { low: 1, high: 0 }, look: { depth: 1 }, underSea: true },\n  { id: 'nightsideGlow', label: 'nightside glow', wave: 2, chem: 'carbon', world: { water: true }, tempC: [-90, 45], nightside: true,\n    roles: { low: 1, high: 1 }, look: { depth: 1 } },\n  { id: 'hothouseCanopy', label: 'hothouse canopy', wave: 2, chem: 'carbon', spread: 0.12, world: { minMbar: 500, liquidSea: true, water: true }, tempC: [18, 50],\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'spiritGardens', label: 'Spirit gardens', wave: 2, chem: 'silicon', world: {}, tempC: [150, 900],\n    roles: { low: 0.7, high: 1 }, look: { depth: 1 } },\n  { id: 'tholinReefs', label: 'tholin reefs', wave: 2, chem: 'methane', world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150],\n    roles: { low: 1, high: 0.5 }, look: { depth: 1 } },\n  // THE ATLAS'S OTHER ENTRIES, BY THEMSELVES (the owner, Sep 30: \"variations should only be color-related … all should\n  // be promoted\"). What lived as a species inside another biome is a biome of its own, in version 4 only (since: 4;\n  // version 3's worlds are frozen and never show them). `ground` says which ground in version 4's simulation a biome\n  // keeps to (transient-shape.js biomeGround): moist, dry, coast, rock, volcanic, fire (volcanic ground or bare rock, on\n  // a hot world), ice, or 'any' where its climate allows.\n  { id: 'rimeWoods', label: 'rime woods', wave: 4, since: 4, chem: 'carbon', spread: 0.12, world: { minMbar: 100, water: true }, tempC: [-25, 6], ground: 'moist',\n    roles: { low: 1, high: 0.9 }, look: { depth: 1 } },\n  { id: 'aridParkland', label: 'arid parkland', wave: 4, since: 4, chem: 'carbon', spread: 0.12, world: { minMbar: 100, water: true }, tempC: [10, 40], ground: 'dry',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'stiltrootFens', label: 'stiltroot fens', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, liquidSea: true, water: true }, tempC: [5, 40], ground: 'coast',\n    roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  { id: 'reedspireStands', label: 'reedspire stands', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [15, 45], ground: 'moist',\n    roles: { low: 1, high: 0.4 }, look: { depth: 1 } },\n  { id: 'glowcapStands', label: 'glowcap stands', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 50, water: true }, tempC: [-5, 35], ground: 'moist',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'siphonTubes', label: 'siphon tubes', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 1500, water: true }, tempC: [10, 50], ground: 'moist',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'resinLattices', label: 'resin lattices', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [15, 50], ground: 'dry',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'quartzDendrites', label: 'quartz dendrites', wave: 4, since: 4, chem: 'silicon', world: {}, tempC: [150, 900], ground: 'rock',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  { id: 'silicateShells', label: 'silicate shells', wave: 4, since: 4, chem: 'silicon', world: {}, tempC: [150, 900], ground: 'rock',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'glassVeinwood', label: 'glass veinwood', wave: 4, since: 4, chem: 'silicon', world: {}, tempC: [300, 900], ground: 'fire',\n    roles: { low: 1, high: 0.8 }, look: { depth: 1 } },\n  { id: 'latticeColonies', label: 'lattice colonies', wave: 4, since: 4, chem: 'silicon', world: { maxMbar: 10 }, tempC: [150, 900], ground: 'rock',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'sulfurBlooms', label: 'sulfur blooms', wave: 4, since: 4, chem: 'silicon', world: {}, tempC: [150, 600], ground: 'fire',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'rustSpires', label: 'rust spires', wave: 4, since: 4, chem: 'silicon', world: {}, tempC: [150, 900], ground: 'rock',\n    roles: { low: 0.7, high: 1 }, look: { depth: 1 } },\n  { id: 'cryoFerns', label: 'cryo ferns', wave: 4, since: 4, chem: 'methane', world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'ice',\n    roles: { low: 0.7, high: 1 }, look: { depth: 1 } },\n  { id: 'methaneMats', label: 'methane mats', wave: 4, since: 4, chem: 'methane', world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'coast',\n    roles: { low: 1, high: 0 }, look: { depth: 1 }, underSea: true },\n  { id: 'tholinThickets', label: 'tholin thickets', wave: 4, since: 4, chem: 'methane', spread: 0.12, world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'moist',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'bubbleFens', label: 'bubble fens', wave: 4, since: 4, chem: 'methane', world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'coast',\n    roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  { id: 'rimeFringe', label: 'rime fringe', wave: 4, since: 4, chem: 'methane', world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'ice',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  // THE WATER BIOMES (the owner, Sep 30: \"large water features like lakes, oceans, and rivers (stationary) their own\n  // biomes\"): a layer of their own under every sea, lake and river, beside a world's up-to-four land biomes (never one of\n  // them). Any natural liquid the world's temperature gives (water, methane, nitrogen, lava) or its ice: the liquid\n  // changes only the colour. No lava river (the owner's rule of Sep 29: lava in pools only).\n  { id: 'ocean', label: 'ocean', wave: 4, since: 4, layer: 'water', world: {}, tempC: null, roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  { id: 'lake', label: 'lake', wave: 4, since: 4, layer: 'water', world: {}, tempC: null, roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  { id: 'river', label: 'river', wave: 4, since: 4, layer: 'water', world: {}, tempC: null, roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  // THE ATLAS'S NEW LIVING BIOMES (wave 2 of its build, Sep 30), each with growers of its own (organics.mjs, flora.mjs).\n  // `dim` in a world's rules: a dim star (K or M) or none, where life makes its own light.\n  { id: 'puffballDomes', label: 'puffball domes', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [0, 32], ground: 'moist',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'shelfTerraces', label: 'shelf terraces', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, liquidSea: true, water: true }, tempC: [0, 32], ground: 'moist',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'glowmossPillars', label: 'glowmoss pillars', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 50, liquidSea: true, water: true, dim: true }, tempC: [-5, 35], ground: 'rock',\n    roles: { low: 0.7, high: 1 }, look: { depth: 1 } },\n  { id: 'glowMosaic', label: 'glow mosaic', wave: 4, since: 4, chem: 'carbon', world: { water: true, dim: true }, tempC: [-10, 40], ground: 'moist',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'prismCoral', label: 'prism coral', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, liquidSea: true, water: true }, tempC: [18, 45], ground: 'coast',\n    roles: { low: 1, high: 0.2 }, look: { depth: 1 } },\n  { id: 'boneArches', label: 'bone arches', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, liquidSea: true, water: true }, tempC: [2, 30], ground: 'rock',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'landKelp', label: 'land kelp', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 1500, water: true }, tempC: [5, 40], ground: 'moist',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'veinCoral', label: 'vein coral', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, liquidSea: true, water: true }, tempC: [15, 45], ground: 'rock',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'vaultedReefs', label: 'vaulted reefs', wave: 4, since: 4, chem: 'carbon', world: { liquidSea: true, water: true }, tempC: [18, 45], ground: 'coast',\n    roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  { id: 'glowSlime', label: 'glow slime', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 50, water: true, dim: true }, tempC: [0, 40], ground: 'moist',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'fleshPods', label: 'flesh pods', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 1500, liquidSea: true, water: true }, tempC: [18, 50], ground: 'moist',\n    roles: { low: 1, high: 0.5 }, look: { depth: 1 } },\n  { id: 'frostFerns', label: 'frost ferns', wave: 4, since: 4, world: { minMbar: 50, water: true }, tempC: [-120, -2], ground: 'rock',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'crystalWarrens', label: 'crystal warrens', wave: 4, since: 4, chem: 'silicon', world: {}, tempC: [150, 900], ground: 'rock',\n    roles: { low: 0.7, high: 1 }, look: { depth: 1 } },\n  { id: 'matCrags', label: 'mat crags', wave: 4, since: 4, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [0, 30], ground: 'rock',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  // WAVE 3 OF THE ATLAS'S BUILD (Sep 30): new ground, its landforms built of bits (organics.mjs, mineral), and the\n  // methane oasis, a methane lake's shore in dune country.\n  { id: 'bandedScarps', label: 'banded scarps', wave: 4, since: 4, world: { minMbar: 1, liquidSea: false }, tempC: [0, 200], ground: 'dry',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  { id: 'needlePeaks', label: 'needle peaks', wave: 4, since: 4, world: { minMbar: 1, water: true }, tempC: [-150, 0], ground: 'ice',\n    roles: { low: 0.2, high: 1 }, look: { depth: 1 } },\n  { id: 'karstTowers', label: 'karst towers', wave: 4, since: 4, world: { minMbar: 100, liquidSea: true, water: true }, tempC: [5, 35], ground: 'coast',\n    roles: { low: 1, high: 0.3 }, look: { depth: 1 } },\n  { id: 'glassShields', label: 'glass shields', wave: 4, since: 4, world: {}, tempC: [300, 100000], ground: 'fire',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'gemHollows', label: 'gem hollows', wave: 4, since: 4, maxCover: 0.15, world: { rare: 12 }, tempC: null, ground: 'rock',\n    roles: { low: 0.5, high: 1 }, look: { depth: 1 } },\n  { id: 'oreOutcrops', label: 'ore outcrops', wave: 4, since: 4, maxCover: 0.15, world: { rare: 3 }, tempC: null, ground: 'rock',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  { id: 'sulfurSprings', label: 'sulfur springs', wave: 4, since: 4, world: { minMbar: 1 }, tempC: [100, 600], ground: 'fire',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'firnFields', label: 'firn fields', wave: 4, since: 4, world: { minMbar: 50, water: true }, tempC: [-200, -5], ground: 'any',\n    roles: { low: 1, high: 1 }, look: { depth: 1 } },\n  { id: 'cryovolcanicPlains', label: 'cryovolcanic plains', wave: 4, since: 4, world: {}, tempC: [-273, -150], ground: 'any',\n    roles: { low: 1, high: 0.5 }, look: { depth: 1 } },\n  { id: 'tholinTerraces', label: 'tholin terraces', wave: 4, since: 4, world: { minMbar: 1000, liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'dry',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'methaneOasis', label: 'methane oasis', wave: 4, since: 4, chem: 'methane', world: { liquidSea: true, seaName: 'Methane' }, tempC: [-200, -150], ground: 'coast',\n    roles: { low: 1, high: 0 }, look: { depth: 1 } },\n  // WAVE 4 (Sep 30): void rifts and drift isles, grounds of their own (a world's record does not say what its crust is,\n  // so they are rare rolls that bring their Void or Drift ground with them), and the remains (`kind: 'remains'`), what\n  // others left, rare, on worlds they would have come to, and small: no more than a tenth of a world's surface\n// (maxCover, the owner, Sep 30).\n  { id: 'voidRifts', label: 'void rifts', wave: 4, since: 4, maxCover: 0.15, world: { rare: 16 }, tempC: null, ground: 'rock',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  { id: 'driftIsles', label: 'drift isles', wave: 4, since: 4, maxCover: 0.15, world: { minMbar: 1, rare: 16 }, tempC: null, ground: 'any',\n    roles: { low: 1, high: 1 }, look: { depth: 1 } },\n  { id: 'corMonoliths', label: 'Cor monoliths', wave: 4, since: 4, kind: 'remains', maxCover: 0.1, world: { rare: 20 }, tempC: null, ground: 'any',\n    roles: { low: 1, high: 1 }, look: { depth: 1 } },\n  { id: 'wreckFields', label: 'wreck fields', wave: 4, since: 4, kind: 'remains', maxCover: 0.1, world: { rare: 8 }, tempC: null, ground: 'any',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'prospectorRelics', label: 'prospector relics', wave: 4, since: 4, kind: 'remains', maxCover: 0.1, world: { rare: 6 }, tempC: null, ground: 'rock',\n    roles: { low: 0.7, high: 1 }, look: { depth: 1 } },\n  { id: 'fossilBeds', label: 'fossil beds', wave: 4, since: 4, kind: 'remains', maxCover: 0.1, world: { minMbar: 1, liquidSea: false, rare: 6 }, tempC: [-100, 150], ground: 'dry',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  { id: 'signalArrays', label: 'signal arrays', wave: 4, since: 4, kind: 'remains', maxCover: 0.1, world: { maxMbar: 10, rare: 8 }, tempC: null, ground: 'any',\n    roles: { low: 1, high: 0.8 }, look: { depth: 1 } },\n  // WAVE 5 (version 6, the owner, Oct 2): THE BARE GROUND OF AIRLESS AND THIN-AIR WORLDS. An airless, waterless world\n  // between about -150 and +5 C (a moon like ours) allowed no uncapped biome, so a capped one (signal arrays, on the\n  // owner's 875150.6561.1.3.1) filled it past its tenth. These four are uncapped and need no air, water or life; their\n  // ground is the world's own minerals (no look of their own for the hills and the craters, a darker one for the mare\n  // and a paler, dustier one for the regolith: biome-looks.mjs). Crater fields are airless only: air would have worn\n  // them away. Appended, so every older biome keeps its index (a world's surface records it); version 6 only\n  // (eligibleBiomes opts.version).\n  { id: 'mineralHills', label: 'mineral hills', wave: 5, since: 6, world: { maxMbar: 10, liquidSea: false }, tempC: null, ground: 'high',\n    roles: { low: 0.6, high: 1 }, look: { depth: 1 } },\n  { id: 'mineralMare', label: 'mineral mare', wave: 5, since: 6, world: { maxMbar: 10, liquidSea: false }, tempC: null, ground: 'low',\n    roles: { low: 1, high: 0.15 }, look: { depth: 1 } },\n  { id: 'craterFields', label: 'crater fields', wave: 5, since: 6, world: { maxMbar: 0.5, liquidSea: false }, tempC: null, ground: 'any',\n    roles: { low: 0.8, high: 1 }, look: { depth: 1 } },\n  { id: 'regolithPlains', label: 'regolith plains', wave: 5, since: 6, world: { maxMbar: 10, liquidSea: false }, tempC: null, ground: 'any',\n    roles: { low: 1, high: 0.8 }, look: { depth: 1 } },\n  // WAVE 6, \"BIOME WAVE 6\" (world version 12, the owner, Oct 11: twelve new biomes, every one \"Include\"). Appended, so every\n  // older biome keeps its index (transient-shape.js groundWeights names indices 0 to 12, and a world's surface records\n  // its codes); version 12 only (since: 12). A version 12 turning world has ONE temperature (climate.mjs opts.flat), so a\n  // biome's tempC reads the world's average there, and a locked world's day and night faces as before. New world rules:\n  // `chem` (the world's chemistry, lifeChemistryOf, for a biome that is not itself alive: pitch on a carbon world). New\n  // grounds (transient-shape.js groundWeights): 'coastVolcanic' (a coast, the more so where the ground is volcanic) and\n  // 'karst' (sediment lowlands a water world has worked: where its karst caves form). Their tall landforms are bits\n  // (organics.mjs), their pools let into the ground by a cell, and two of them cut into it: slot canyons ten to twenty\n  // kubes deep and cenotes' round water holes with sheer sides (the owner's own picks, past the surface band's floor).\n  { id: 'mudpots', label: 'mudpot fields', wave: 6, since: 12, world: { minMbar: 50, liquidSea: true, water: true }, tempC: [40, 150], ground: 'moist',\n    roles: { low: 1, high: 0.4 }, look: { depth: 1 } },\n  { id: 'columns', label: 'column coast', wave: 6, since: 12, world: { liquidSea: true }, tempC: [-60, 400], ground: 'coastVolcanic',\n    roles: { low: 1, high: 0.3 }, look: { depth: 2 } },\n  { id: 'halite', label: 'halite spires', wave: 6, since: 12, world: { minMbar: 1, liquidSea: false, noLava: true }, tempC: [0, 300], ground: 'low',\n    roles: { low: 1, high: 0 }, look: { depth: 2 } },\n  { id: 'cenotes', label: 'cenote fields', wave: 6, since: 12, world: { minMbar: 100, liquidSea: true, water: true }, tempC: [5, 40], ground: 'karst',\n    roles: { low: 1, high: 0.4 }, look: { depth: 9 } },\n  { id: 'slots', label: 'slot canyons', wave: 6, since: 12, world: { minMbar: 1, liquidSea: false }, tempC: [-40, 200], ground: 'dry',\n    roles: { low: 0.8, high: 1 }, look: { depth: 24 } },\n  { id: 'mesas', label: 'butte country', wave: 6, since: 12, world: { minMbar: 1, liquidSea: false }, tempC: [-20, 250], ground: 'dry',\n    roles: { low: 1, high: 0.7 }, look: { depth: 1 } },\n  { id: 'ash', label: 'ashfall plains', wave: 6, since: 12, world: { minMbar: 50 }, tempC: [-30, 400], ground: 'volcanic',\n    roles: { low: 1, high: 0.8 }, look: { depth: 2 } },\n  { id: 'penitentes', label: 'penitente fields', wave: 6, since: 12, world: { maxMbar: 300, liquidSea: false, water: true }, tempC: [-150, -5], ground: 'any',\n    roles: { low: 1, high: 1 }, look: { depth: 1 } },\n  { id: 'pitch', label: 'pitch lakes', wave: 6, since: 12, world: { chem: 'carbon' }, tempC: [20, 150], ground: 'low',\n    roles: { low: 1, high: 0.3 }, look: { depth: 1 } },\n  { id: 'stroma', label: 'stromatolite shoals', wave: 6, since: 12, chem: 'carbon', world: { liquidSea: true, water: true }, tempC: [5, 45], ground: 'coast',\n    roles: { low: 1, high: 0 }, look: { depth: 1 }, underSea: true },\n  { id: 'hanging', label: 'hanging gardens', wave: 6, since: 12, chem: 'carbon', world: { minMbar: 100, liquidSea: true, water: true }, tempC: [5, 38], ground: 'rock',\n    roles: { low: 0.5, high: 1 }, look: { depth: 1 } },\n  { id: 'thorns', label: 'thorn scrub', wave: 6, since: 12, chem: 'carbon', world: { minMbar: 100, water: true }, tempC: [22, 50], ground: 'dry',\n    roles: { low: 1, high: 0.6 }, look: { depth: 1 } },\n  // THE SETTLEMENT BIOMES (world version 17, ALIEN PEOPLES: the owner's confirmed plan, Oct 13). One a people\n  // (alien-peoples.mjs PEOPLES), round its towns and nowhere else: never dealt by a world's map (eligibleBiomes skips a\n  // `settlement` biome), laid by the towns themselves (transient-shape.js THE TOWNS). Nothing of the world's own life grows\n  // in one (organics.mjs and flora.mjs have no growers for it); a cold people's ground is snow and ice, the Cinderhost's ash (transient-shape.js BIOME_LOOK_KUBES); the rest show the world's\n  // own ground, cleared and trodden (no turf: nothing of the world's own life grows there). Appended, so every older biome\n  // keeps its index.\n  // Each carries its people's name and kind (for Kubipedia: biomes.mjs cannot read alien-peoples.mjs, which reads it).\n  ...[['terraceGardens', 'terrace gardens', 'loamwrights', 'Loamwrights', 'friendly', 'carbon'], ['herdCommons', 'herd commons', 'driftherders', 'Driftherders', 'neutral', 'carbon'],\n      ['thornBastions', 'thorn bastions', 'thornkin', 'Thornkin', 'aggressive', 'carbon'],\n      ['hearthHollows', 'hearth hollows', 'hearthfolk', 'Hearthfolk', 'friendly'], ['iceFisheries', 'ice fisheries', 'rimewalkers', 'Rimewalkers', 'neutral'],\n      ['fangRidges', 'fang ridges', 'frostfang', 'Frostfang', 'aggressive'],\n      ['shadeTerraces', 'shade terraces', 'shadecasters', 'Shadecasters', 'friendly'], ['caravanWells', 'caravan wells', 'dunecombers', 'Dunecombers', 'neutral'],\n      ['reaverSlots', 'reaver slots', 'sandreavers', 'Sandreavers', 'aggressive'],\n      ['kilnGardens', 'kiln gardens', 'kilnborn', 'Kilnborn', 'friendly', 'silicon'], ['tektiteFields', 'tektite fields', 'glassminders', 'Glassminders', 'neutral'],\n      ['ashWarrens', 'ash warrens', 'cinderhost', 'Cinderhost', 'aggressive'],\n      ['weaverShores', 'weaver shores', 'weavers', 'Tholin Weavers', 'friendly', 'methane'], ['driftFens', 'drift fens', 'mistdrifters', 'Mistdrifters', 'neutral', 'methane'],\n      ['hazeReefs', 'haze reefs', 'hazeclaws', 'Hazeclaws', 'aggressive', 'methane'],\n      ['domeCraters', 'dome craters', 'domekeepers', 'Domekeepers', 'friendly'], ['dustQuarries', 'dust quarries', 'dustminers', 'Dustminers', 'neutral'],\n      ['corsairWrecks', 'corsair wrecks', 'corsairs', 'Crater Corsairs', 'aggressive']]\n    .map(([id, label, people, peopleName, kind]) => ({ id, label, wave: 7, since: 17, settlement: people, peopleName, kind, world: {}, tempC: null, roles: { low: 1, high: 1 }, look: { depth: 1 } })),\n].map(Object.freeze));\nexport const BIOME_IDS = Object.freeze(BIOMES.map((b) => b.id));\nconst BY_ID = new Map(BIOMES.map((b) => [b.id, b]));\nexport const biomeById = (id) => BY_ID.get(id) || null;\n// A biome's name on a world: the woods take their canopy's, which reads the star (Verge woods under G, Solis under K,\n// Tide under F, Drift under O, B and A, and Umbra woods, black trees, under an M dwarf or no star at all).\n// A WOODS IS NAMED FOR ITS CANOPY (canopyOf): \"Verge woods\", \"Ether woods\"; an M dwarf's black ones are Umbra woods.\nexport function labelOf(id, world) {\n  const b = BY_ID.get(id);\n  if (!b) return id;\n  if (id !== 'woods') return b.label;\n  const leaf = world && world.star != null ? canopyOf(world).leaf : 'Void';\n  return `${leaf === 'Void' ? 'Umbra' : leaf} woods`;\n}\n\n// What the world rules read: { addr, star, tempC, pressureMbar, airless, sea: { kind, name } | null } (the live deck's\n// world records, and the renderer's own environment, carry exactly these).\nfunction worldPasses(b, world) {\n  const r = b.world, sea = world.sea || null, mbar = world.airless ? 0 : (+world.pressureMbar || 0);\n  if (r.minMbar != null && mbar < r.minMbar) return false;\n  if (r.maxMbar != null && mbar > r.maxMbar) return false;\n  if (r.liquidSea === false && sea && sea.kind === 'liquid') return false;\n  if (r.liquidSea === true && !(sea && sea.kind === 'liquid')) return false;\n  if (r.water && !(sea && /Water/.test(sea.name || ''))) return false;\n  if (r.seaName && !(sea && (sea.name || '').indexOf(r.seaName) >= 0)) return false;\n  if (r.noLava && ((sea && sea.kind === 'lava') || (+world.tempC || 0) >= 700)) return false;\n  if (r.dim && !(STAR_DIM[starClassOf(world.star)] == null || STAR_DIM[starClassOf(world.star)] >= 0.3)) return false;\n  return true;\n}\n\n// THE CHEMISTRY OF LIFE (the owner's reference sheets: water and carbon, silicon, methane). Which kind of life a world\n// can have, if any, from its sea, air and the reach of its climate:\n//   'carbon'   water, and somewhere liquid water can stand: above freezing and below boiling at the world's pressure\n//              (boilC), with air over water's triple point;\n//   'methane'  a sea or lakes of liquid methane, Titan-cold (about -190 to -160 °C somewhere);\n//   'silicon'  hot rock, about 150 to 900 °C somewhere (lava and volcanic worlds), and a rare airless world rich in\n//              silicon (one in twenty, by its address);\n//   null       none.\n// One kind a world, in that order. A living biome grows only where its chemistry is; a geological one anywhere.\nexport const CHEMISTRIES = Object.freeze(['carbon', 'methane', 'silicon']);\nconst BOIL = [[6.1, 0], [100, 46], [500, 81], [1013, 100], [5000, 152], [20000, 212], [100000, 311], [220000, 374]];\n// Water's boiling point at a pressure (mbar): a piecewise line through the steam table's points, exact arithmetic only.\nexport function boilC(mbar) {\n  if (!(mbar > BOIL[0][0])) return 0;\n  for (let i = 1; i < BOIL.length; i++) {\n    const [p1, t1] = BOIL[i], [p0, t0] = BOIL[i - 1];\n    if (mbar <= p1) return t0 + (t1 - t0) * (mbar - p0) / (p1 - p0);\n  }\n  return BOIL[BOIL.length - 1][1];\n}\nexport function lifeChemistryOf(world, climate) {\n  const sea = world.sea || null, mbar = world.airless ? 0 : (+world.pressureMbar || 0), lo = climate.minC, hi = climate.maxC;\n  if (sea && /Water/.test(sea.name || '') && mbar > BOIL[0][0] && hi >= 0 && lo <= boilC(mbar)) return 'carbon';\n  if (sea && sea.kind === 'liquid' && /Methane/.test(sea.name || '') && hi >= -190 && lo <= -160) return 'methane';\n  if ((hi >= 150 && lo <= 900) || (world.airless && hash01((world.addr || '') + '#silicon-rich') * 20 < 1)) return 'silicon';\n  return null;\n}\n\n// HOW LITTLE STARLIGHT FALLS at a direction, 0 (a bright star's full day) to 1 (none): the dimmer the star the more,\n// and on a locked world its night face is wholly dark and its terminator half so. A rogue world has no star at all.\n// Life glows more the dimmer its light (organics.mjs, flora.mjs); caves, which the generator knows, are 1.\nconst STAR_DIM = { O: 0, B: 0, A: 0.02, F: 0.05, G: 0.12, K: 0.3, M: 0.65 };\nexport function dimAt(climate, world, x, y, z) {\n  const cls = starClassOf(world.star);\n  if (!cls) return 1;\n  const d = STAR_DIM[cls];\n  if (climate.regime !== 'locked') return d;\n  const w = fieldAt(climate, x, y, z).w;\n  return d + (1 - d) * (w.night + 0.5 * w.terminator);\n}\n\n// The coldest and warmest the biome accepts on this world: its own range, with a locked world's day face let in from\n// lockedDayC. A world of ONE TEMPERATURE (climate.mjs opts.oneTemp, world version 13: the owner, Oct 12, \"LOCKED WORLDS\n// ARE ONE TEMPERATURE TOO\") has no hot day face to let in, so a locked one reads the biome's own range, as a turning one\n// does. (climate.flat is never set on a locked world before version 13, so an older world's floors are as they were.)\nconst hotDayFace = (c) => c.regime === 'locked' && !c.flat;\nfunction floorOf(b, c, dayW) {\n  const lo = b.tempC[0];\n  return b.lockedDayC != null && hotDayFace(c) && dayW > 0 ? lo + (b.lockedDayC - lo) * dayW : lo;\n}\n\n// Whether a rare biome's roll lets this world have it at all (1 world in `rare`), by the world's address; true for a\n// biome that is not rare. eligibleBiomes asks it, and so does a real world's genome (transient-shape.js genomeOf), since\n// the map itself deals any biome the genome turns on that the world suits, as the live deck needs it to.\nexport function rareRollPasses(id, addr) {\n  const b = BY_ID.get(id);\n  return !(b && b.world.rare) || hash01((addr || '') + '#rare-' + id) * b.world.rare < 1;\n}\n\n// The biomes a world can have somewhere, catalog order: its world rules pass, and its temperatures meet the field's\n// range (a locked world's day face counting from lockedDayC). A rare biome rolls for the world unless `anyRarity`\n// (the live deck deals it to any world it suits, so it can be judged).\n// `opts.version`: the world version asking. A biome newer than it (`since`) is not on its worlds, so a version's worlds\n// stay as they were when a later one adds biomes. Without it, every biome in the catalog (Kubipedia's question).\nexport function eligibleBiomes(climate, world, opts) {\n  const out = [], chem = lifeChemistryOf(world, climate), ver = opts && opts.version;\n  for (const b of BIOMES) {\n    if (b.layer === 'water') continue;                    // a water biome is its own layer, never on the land's map\n    if (b.settlement) continue;                           // (version 17: a people's settlement biome is laid by its towns, never dealt)\n    if (ver != null && (b.since || 0) > ver) continue;\n    if (!worldPasses(b, world)) continue;\n    if (b.chem && b.chem !== chem) continue;\n    if (b.world.chem && b.world.chem !== chem) continue;   // (version 12: a world of that chemistry, the biome not itself alive)\n    if (b.nightside && climate.regime !== 'locked') continue;\n    if (!(opts && opts.anyRarity) && !rareRollPasses(b.id, world.addr)) continue;\n    if (b.tempC) {\n      const lo = b.lockedDayC != null && hotDayFace(climate) ? b.lockedDayC : b.tempC[0];\n      if (climate.maxC < lo || climate.minC > b.tempC[1]) continue;\n    }\n    out.push(b.id);\n  }\n  return out;\n}\n\n// The column under a face-table index's centre, as a direction (fi = axis * 2 + negative, u and v as transient-shape's\n// columnOf reads them, iu and iv from 0 to 2 * refR - 1).\nexport function columnDir(fi, iu, iv, refR) {\n  const ax = fi >> 1, p = [0, 0, 0];\n  p[ax] = (fi & 1) ? -refR : refR; p[(ax + 1) % 3] = iu - refR + 0.5; p[(ax + 2) % 3] = iv - refR + 0.5;\n  const l = Math.sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]);\n  return [p[0] / l, p[1] / l, p[2] / l];\n}\n\nconst REGION_F = 1.7;            // the regions' frequency on the unit sphere: a region is about half a face across\nconst DOMINANT_AT = 0.3;         // a region field above this is the dominant biome's (about four fifths of its ground)\nconst SECONDARY_AT = 0.56;       // …and above this a secondary one's (about a third of its ground)\nconst BLEND_CELLS = 4;           // the width of a boundary, in cells\nconst ROLE_LIFT = 0.6;           // how much higher the region value must run where a biome's role is 0 (so, nowhere)\n// The owner's rule, one dominant biome and one to three secondary ones a world: a real world's genome (transient-shape.js\n// genomeOf) turns each biome on by its own chance, so the map keeps the first four the world's climate allows.\nexport const MAX_BIOMES_A_WORLD = 4;\n\n// A biome's region field at a direction (unit length), for its seed: slow value noise in two octaves, in [0, 1).\nfunction regionNoise(s, nx, ny, nz) {\n  return 0.65 * vnoise(nx * REGION_F + s[1], ny * REGION_F + s[2], nz * REGION_F, s[0])\n       + 0.35 * vnoise(nx * REGION_F * 2.1, ny * REGION_F * 2.1 + s[1], nz * REGION_F * 2.1 + s[2], s[0] ^ 0x5bd1e995);\n}\nconst CAP_GRID = 16;             // the grid a capped biome's share is measured on: 16² points a face\n\n// A WORLD'S BIOME MAP: the biomes in `ids` it can have (the first the dominant), laid out over its directions. `refR` is\n// its reference radius in cells, which sets how wide a boundary is. Null when none of `ids` can be on the world.\n//   weights(x, y, z, low, out): each biome's weight in the direction (x, y, z), of any length (out[k] for map.ids[k]),\n//     for ground whose lowland weight is `low` (1 in the lowlands, 0 on the highlands); the weights sum to at most 1,\n//     the rest the world's own ground.\n//   pick(out, h): which biome a column shows, by its own hash h in [0, 1): an index into map.ids, or -1 for none. Over\n//     a boundary the choice is dithered, so the change is a scatter a few cells deep rather than a line.\nexport function biomeMap(climate, world, ids, refR, opts) {\n  const caps = !!(opts && opts.caps);   // version 4 holds each biome's cap and spread; version 3's map, frozen, neither\n  const eligible = eligibleBiomes(climate, world, { anyRarity: true });\n  const list = (ids || []).filter((id, i, a) => a.indexOf(id) === i && eligible.indexOf(id) >= 0).slice(0, MAX_BIOMES_A_WORLD).map((id) => BY_ID.get(id));\n  if (!list.length) return null;\n  const R = refR > 1 ? refR : 1;\n  const seeds = list.map((b) => { const h = hash01((world.addr || '') + '#region-' + b.id); return [Math.floor(h * 2147483647) | 0, h * 97, h * 61]; });\n  // A boundary's width in the noise's units: it changes by about 1.2 per unit of its argument, and a cell is 1/R of a\n  // radian; held under a quarter of the noise's range on the smallest worlds, where 4 cells is much of a face.\n  const bandN = Math.min(0.25, BLEND_CELLS * 1.2 * REGION_F / R);\n  // …and in degrees: the field's steepest change per cell, times the cells. A locked world's runs 150 °C per radian of\n  // the day-night axis at full contrast, a turning world's about half that. A flat locked world (version 13) has no day-\n  // night field at all, and blends as a flat turning world does.\n  const grad = (hotDayFace(climate) ? 150 : 75) * climate.contrast;\n  const bandT = Math.max(1, BLEND_CELLS * grad / R);\n  // A BIOME'S CAP (the owner, Sep 30: remains \"can't take up more than 10% or so of a world's surface\"). A biome with a\n  // maxCover holds no more than that share of the world's surface: its region's threshold is raised until only that\n  // share of an even grid over the cube's faces (the surface its columns stand on) could reach it, with its role taken\n  // at its best, so the cap holds whatever the terrain, and temperature and ground only shrink it further. A biome with\n  // none keeps its threshold exactly (capAt 0), so no world without a capped biome changes.\n  const capAt = list.map((b, k) => {\n    if (!caps) return 0;\n    if (b.spread > 0) return -b.spread;                 // A FOREST SPREADS (Sep 30): its region's threshold lowered, its patches wider\n    if (!(b.maxCover > 0 && b.maxCover < 1)) return 0;\n    const s = seeds[k], vals = [];\n    for (let f = 0; f < 6; f++) for (let i = 0; i < CAP_GRID; i++) for (let j = 0; j < CAP_GRID; j++) {\n      const p = [0, 0, 0], ax = f >> 1;\n      p[ax] = (f & 1) ? -1 : 1; p[(ax + 1) % 3] = (i + 0.5) / CAP_GRID * 2 - 1; p[(ax + 2) % 3] = (j + 0.5) / CAP_GRID * 2 - 1;\n      const l = Math.sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]);\n      vals.push(regionNoise(s, p[0] / l, p[1] / l, p[2] / l));\n    }\n    vals.sort((a, c) => a - c);\n    const q = vals[Math.min(vals.length - 1, Math.floor((1 - b.maxCover) * vals.length))];   // only maxCover of the surface reads over it\n    const at = (k === 0 ? DOMINANT_AT : SECONDARY_AT) + (1 - Math.max(b.roles.low, b.roles.high)) * ROLE_LIFT;\n    return Math.max(0, q + 0.1 * bandN - at);           // …and just past the blend's middle sits there (the pick dithers over it)\n  });\n  const suit = new Float64Array(list.length);\n  function weights(x, y, z, low, out) {\n    const l = Math.sqrt(x * x + y * y + z * z) || 1, nx = x / l, ny = y / l, nz = z / l;   // any length: a direction\n    const f = fieldAt(climate, nx, ny, nz), T = f.tempC;\n    let paint = 0;\n    for (let k = list.length - 1; k >= 0; k--) {           // secondaries first: each paints over what comes after it\n      const b = list[k], s = seeds[k];\n      // Ground that suits a biome less (its role there under 1) takes a higher region value to hold it: its patches are\n      // smaller there, not thinner, so the only scatter is along a boundary. Its temperatures are a hard limit, crossed\n      // over a few cells.\n      const role = b.roles.low * low + b.roles.high * (1 - low);\n      let q = role > 0 ? 1 : 0;\n      if (b.tempC) {\n        const lo = floorOf(b, climate, f.w.day);\n        q *= smooth((T - lo) / bandT + 0.5) * smooth((b.tempC[1] - T) / bandT + 0.5);\n      }\n      if (q > 0 && b.nightside) q *= smooth((f.w.night + 0.5 * f.w.terminator - 0.55) / 0.25 + 0.5);\n      if (q > 0) {\n        const n = regionNoise(s, nx, ny, nz);\n        q *= smooth((n - (k === 0 ? DOMINANT_AT : SECONDARY_AT) - (1 - role) * ROLE_LIFT - capAt[k]) / bandN + 0.5);\n      }\n      q *= 1 - paint;\n      suit[k] = q; paint += q;\n    }\n    for (let k = 0; k < list.length; k++) out[k] = suit[k];\n    return out;\n  }\n  function pick(out, h) {\n    let acc = 0;\n    for (let k = list.length - 1; k >= 0; k--) { acc += out[k]; if (h < acc) return k; }\n    return -1;\n  }\n  // HOW WELL EACH BIOME SUITS A DIRECTION'S CLIMATE, region aside (version 5's fill, the owner, Sep 30: biomes cover the\n  // whole world): its role on that ground, its temperatures and its night side, as weights() weighs them before its\n  // region and its cap. Ground no region reaches goes to the biome that suits it best (transient-shape.js groundWeights).\n  function fit(x, y, z, low, out) {\n    const l = Math.sqrt(x * x + y * y + z * z) || 1, nx = x / l, ny = y / l, nz = z / l;\n    const f = fieldAt(climate, nx, ny, nz), T = f.tempC;\n    for (let k = 0; k < list.length; k++) {\n      const b = list[k];\n      let q = b.roles.low * low + b.roles.high * (1 - low);\n      if (q > 0 && b.tempC) { const lo = floorOf(b, climate, f.w.day); q *= smooth((T - lo) / bandT + 0.5) * smooth((b.tempC[1] - T) / bandT + 0.5); }\n      if (q > 0 && b.nightside) q *= smooth((f.w.night + 0.5 * f.w.terminator - 0.55) / 0.25 + 0.5);\n      out[k] = q;\n    }\n    return out;\n  }\n  return { ids: list.map((b) => b.id), weights, pick, fit, capped: list.map((b) => b.maxCover > 0 && b.maxCover < 1) };\n}\n\n// PLANTS TAKE THEIR STAR'S LIGHT (the owner's rule, after Kiang et al. 2007; widened Oct 1 from the owner's chart of\n// plant colour by star class): each class a HANDFUL of pigments, every one a colour of the regolith palette, and each\n// world its own canopy among them. The brighter the star, the brighter its plants:\n//   O  white                                   Lumina, Gleam, Halo\n//   B  white tinged pink or green              Halo, Starlight, Glint, Gleam\n//   A  pink or celadon                         Starlight, Glint, Farout, Halo\n//   F  magenta, purple, violet, blue; lime, yellow   Ether, Wisp, Flash, Spirit, Bloom, Nova\n//   G  cyan, turquoise, green; orange, red, purple    Verge, Bloom, Aura, Tide, Cinder, Fathom\n//   K  yellow, red, maroon; violet, blue, teal        Solis, Nova, Cinder, Scorched, Spirit, Ether, Tide\n//   M  maroon to black                          Void, Gloam, Fathom   (the chart's near-black teal has no palette colour dark enough)\n// A rogue world, with no star, grows as an M dwarf's do. Before Oct 1 each class had one canopy (its list's first) and\n// O, B and A were pale silver-blue (Drift, Halo, Echo): those materials stay in the catalogue for whoever holds them.\nexport const PALETTE = Object.freeze({\n  Lumina: '#FFFFFF', Gleam: '#E5E5E5', Drift: '#B0C4DE', Void: '#1A1A1A', Cinder: '#FF4500', Arid: '#D2B48C',\n  Scorched: '#A0522D', Radiance: '#FFD700', Nova: '#FFFF00', Solis: '#CD853F', Corona: '#FFDEAD', Farout: '#FF69B4',\n  Starlight: '#FFB6C1', Flash: '#FF00FF', Wisp: '#EE82EE', Spirit: '#9370DB', Fathom: '#800080', Gloam: '#4B3621',\n  Halo: '#E6E6FA', Bloom: '#32CD32', Verge: '#228B22', Tide: '#008080', Aura: '#00FFFF', Ether: '#1E90FF',\n  Glint: '#AFEEEE', Echo: '#708090',\n});\nexport const LEAF_BY_CLASS = Object.freeze({\n  O: ['Lumina', 'Gleam', 'Halo'], B: ['Halo', 'Starlight', 'Glint', 'Gleam'], A: ['Starlight', 'Glint', 'Farout', 'Halo'],\n  F: ['Ether', 'Wisp', 'Flash', 'Spirit', 'Bloom', 'Nova'], G: ['Verge', 'Bloom', 'Aura', 'Tide', 'Cinder', 'Fathom'],\n  K: ['Solis', 'Nova', 'Cinder', 'Scorched', 'Spirit', 'Ether', 'Tide'], M: ['Void', 'Gloam', 'Fathom'] });\n// A world's two leaf pigments: its canopy, and a second for its reeds and its smaller plants, never the same.\n// `world.canopy` names the canopy outright (Kubipedia's pigment swatches): it must be one this star grows, and the second\n// pigment is then the next in the star's list, so a forced canopy still has its own reeds.\nexport function canopyOf(world) {\n  const leafs = LEAF_BY_CLASS[starClassOf(world && world.star) || 'M'], seed = ((world && world.addr) || '') + '#canopy';\n  const forced = world && world.canopy ? leafs.indexOf(world.canopy) : -1;\n  if (forced >= 0) return { leaf: leafs[forced], leaf2: leafs[(forced + 1) % leafs.length] };\n  const i = Math.floor(hash01(seed) * leafs.length), j = (i + 1 + Math.floor(hash01(seed + '2') * (leafs.length - 1))) % leafs.length;\n  return { leaf: leafs[i], leaf2: leafs[j] };\n}\n// Each class's FIRST pigment, for what shows one star's life without a world (Kubipedia's star switcher, the dioramas).\nexport const WOODS_NAME = Object.freeze(Object.fromEntries(Object.entries(LEAF_BY_CLASS).map(([c, l]) => [c, l[0] === 'Void' ? 'Umbra' : l[0]])));\n// A pigment's colour: the palette's, Void leaves included: they are Void's own near-black (the owner, Oct 7: \"wasn't void\n// originally blackish? If so return it back\" — the violet sheen, a mix with Fathom, is gone; the woods keep the name Umbra).\nexport const leafHex = (v) => PALETTE[v];\n"],"mappings":"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","names":[],"file":"biomes.mjs"}