{"version":3,"sources":["flora.mjs"],"sourcesContent":["// FLORA (WG-10, tools/terrain-evolve/BIOMES.md): the small living things of a world's ground, a new class of fixture.\n// Grass tufts, blooms, ferns, reeds, float leaves, gill buttons, glow sprouts, root curtains, moss, ribbon weed, and the\n// glow carpets and threads of a locked world's night side; crystal shoots on silicon worlds, tholin tufts on methane\n// ones. Each is a TINY VOXEL MODEL of micro-cubes a quarter of a kube across, standing in the air cell over a column's\n// ground (or on a sea's floor, or afloat on it, or hanging from a cave's roof). Flora have no collision. Where they are,\n// and what, is a pure function of the world (so the servers can validate picking one, Phase B), and pure and twin-safe\n// as organics.mjs is: byte-identical copies in functions/lib and zone-server/lib.\nimport { lifeChemistryOf, dimAt } from './biomes.mjs';\nimport { ORGANIC_MATERIALS, pigmentsOf, pigmentHex, hash4, PALETTE, upFaceOf } from './organics.mjs';\n\n// THE CATALOG: each flora's name, its chemistry, where it grows ('top' on dry ground, 'shore', 'water' on a sea's\n// floor, 'surface' afloat on a sea, 'under' hanging from a roof), its colours (slots: 0 its body, 1 its accent, 2 its\n// stem, 3 its glow) and what it is, for Kubipedia.\nexport const FLORA = Object.freeze([\n  ['grassTuft', 'Grass Tuft', 'carbon', 'top', 'Blades of grass in its star\\'s colour, in tufts.'],\n  ['bloom', 'Bloom', 'carbon', 'top', 'A flower on a short stem. Bloom carpets are Farout, Wisp and Radiance; where it is dim, its head glows.'],\n  ['fern', 'Fern', 'carbon', 'top', 'Low fronds spreading from a crown, in woods and hothouse canopies.'],\n  ['reed', 'Reed', 'carbon', 'shore', 'Tall stalks with dark heads, at the edge of water.'],\n  ['floatLeaves', 'Float Leaves', 'carbon', 'surface', 'Round leaves lying on still water, now and then with a bloom.'],\n  ['gillButton', 'Gill Button', 'carbon', 'top', 'A small pale gilled cap on a short stem; where it is dim, it glows.'],\n  ['glowSprout', 'Glow Sprout', 'carbon', 'top', 'Thin stems tipped with living light.'],\n  ['rootCurtain', 'Root Curtain', 'carbon', 'under', 'Pale roots hanging in a curtain from a cave\\'s roof; on a dim world their tips glow softly.'],\n  ['moss', 'Moss', 'carbon', 'top', 'A low mat of moss in its star\\'s colour.'],\n  ['ribbonWeed', 'Ribbon Weed', 'carbon', 'water', 'Long ribbons swaying on the floor of a sea of water.'],\n  ['glowCarpet', 'Glow Carpet', 'carbon', 'top', 'A mat of Aura and Ether light over the ground of a locked world\\'s night side.'],\n  ['glowThread', 'Glow Thread', 'carbon', 'top', 'Fine glowing threads standing up from a locked world\\'s night-side ground.'],\n  ['crystalShoot', 'Crystal Shoot', 'silicon', 'top', 'Small living crystals, a kube\\'s worth of silicon life, tipped paler.'],\n  ['tholinTuft', 'Tholin Tuft', 'methane', 'top', 'A fuzz of tholin tissue on the cold ground by a methane sea.'],\n  // The atlas's later flora (Sep 30, version 4 only: since 4).\n  ['glowTile', 'Mosaic Tile', 'carbon', 'top', 'A tile of colonial life lying flat on the ground, lit cyan, magenta, violet or gold; many together make a glow mosaic.', 4],\n  ['glowMoss', 'Glowmoss', 'carbon', 'top', 'Moss that glows electric blue, furring the ground where the light is dim.', 4],\n  ['slimeDrip', 'Slime Drip', 'carbon', 'top', 'A knot of black lattice dripping slime that glows acid green.', 4],\n  // Biome wave 6 (version 12, since 12): trailing growth hung down a steep face ('wall': in the air beside a drop, against it).\n  ['vineCurtain', 'Vine Curtain', 'carbon', 'wall', 'Trailing strands of leaves hung down a steep face from its top, now and then in flower: hanging gardens and the rims of cenotes.', 12],\n].map(([id, name, chem, where, desc, since]) => Object.freeze({ id, name, chem, where, desc, since: since || 0 })));\nexport const FLORA_IDS = Object.freeze(FLORA.map((f) => f.id));\n// WHAT EACH PART IS MADE OF (the owner, Oct 2: plants \"should reflect their components instead like leaves, petals\"):\n// the family of life's materials (organics.mjs FAMILIES, texture-picks.mjs LIFE_PICKS) whose texture a cube of a flora\n// wears, by its colour slot: [body, accent, stem]. A cube that glows is light and wears none. floraOf returns the\n// family of every cube (cubes.fam, an index into FLORA_FAMS); the renderer draws each family with its texture.\nexport const FLORA_FAMS = Object.freeze(['', 'leaf', 'petal', 'wood', 'fungal', 'kelp', 'glow', 'crystal', 'tholin', 'slime']);\nconst FLORA_PARTS = Object.freeze({\n  grassTuft: ['leaf', 'petal', 'leaf'], bloom: ['leaf', 'petal', 'leaf'], fern: ['leaf', 'petal', 'wood'], reed: ['leaf', 'petal', 'wood'],\n  floatLeaves: ['leaf', 'petal', 'leaf'], gillButton: ['fungal', 'fungal', 'fungal'], glowSprout: ['leaf', 'glow', 'leaf'],\n  rootCurtain: ['wood', 'wood', 'wood'], moss: ['leaf', 'leaf', 'leaf'], ribbonWeed: ['kelp', 'kelp', 'kelp'],\n  glowCarpet: ['glow', 'glow', 'glow'], glowThread: ['glow', 'glow', 'glow'], crystalShoot: ['crystal', 'crystal', 'crystal'],\n  tholinTuft: ['tholin', 'tholin', 'tholin'], glowTile: ['glow', 'glow', 'glow'], glowMoss: ['glow', 'leaf', 'leaf'], slimeDrip: ['slime', 'slime', 'slime'],\n  vineCurtain: ['leaf', 'petal', 'leaf'],\n});\nexport const floraFamilyOf = (id, slot) => (slot === 3 ? '' : ((FLORA_PARTS[id] || [])[slot] || ''));\nconst FLORA_BY_ID = new Map(FLORA.map((f) => [f.id, f]));\n\n// Where each grows: a biome's flora as [flora, weight], and how many columns in a hundred carry one. Shore, water and\n// surface flora go only where the sea puts them (floraOf).\nconst BIOME_FLORA = {\n  woods:          { density: 35, list: [['grassTuft', 5], ['fern', 3], ['bloom', 1], ['gillButton', 1], ['moss', 1], ['reed', 3], ['ribbonWeed', 3], ['floatLeaves', 1]] },\n  bloomCarpets:   { density: 70, list: [['bloom', 8], ['grassTuft', 4], ['reed', 2], ['floatLeaves', 2]] },\n  gillTowers:     { density: 30, list: [['gillButton', 5], ['moss', 2], ['glowSprout', 1]] },\n  tidalGardens:   { density: 45, list: [['ribbonWeed', 6], ['reed', 3], ['floatLeaves', 2]] },\n  nightsideGlow:  { density: 50, list: [['glowCarpet', 5], ['glowThread', 3], ['glowSprout', 2]] },\n  hothouseCanopy: { density: 55, list: [['fern', 5], ['grassTuft', 2], ['bloom', 2], ['reed', 2], ['ribbonWeed', 2], ['floatLeaves', 2]] },\n  lichenSteppe:   { density: 10, list: [['grassTuft', 1], ['moss', 1]] },\n  duneSea:        { density: 2,  list: [['grassTuft', 1]] },\n  spiritGardens:  { density: 25, list: [['crystalShoot', 1]] },\n  tholinReefs:    { density: 30, list: [['tholinTuft', 1]] },\n  // The atlas's later biomes (version 4 only; organics.mjs BIOME_ORGANICS).\n  rimeWoods:       { density: 30, list: [['grassTuft', 3], ['moss', 3], ['fern', 1]] },\n  aridParkland:    { density: 45, list: [['grassTuft', 8], ['bloom', 1]] },\n  stiltrootFens:   { density: 50, list: [['reed', 5], ['floatLeaves', 3], ['ribbonWeed', 3], ['moss', 2]] },\n  reedspireStands: { density: 35, list: [['reed', 4], ['fern', 2], ['grassTuft', 2]] },\n  glowcapStands:   { density: 40, list: [['gillButton', 4], ['moss', 4], ['glowSprout', 2]] },\n  siphonTubes:     { density: 25, list: [['moss', 3], ['glowSprout', 1]] },\n  resinLattices:   { density: 20, list: [['grassTuft', 2], ['moss', 1]] },\n  quartzDendrites: { density: 20, list: [['crystalShoot', 1]] },\n  silicateShells:  { density: 20, list: [['crystalShoot', 1]] },\n  glassVeinwood:   { density: 15, list: [['crystalShoot', 1]] },\n  latticeColonies: { density: 15, list: [['crystalShoot', 1]] },\n  sulfurBlooms:    { density: 20, list: [['crystalShoot', 1]] },\n  rustSpires:      { density: 20, list: [['crystalShoot', 1]] },\n  cryoFerns:       { density: 25, list: [['tholinTuft', 1]] },\n  methaneMats:     { density: 20, list: [['tholinTuft', 1]] },\n  tholinThickets:  { density: 35, list: [['tholinTuft', 1]] },\n  bubbleFens:      { density: 25, list: [['tholinTuft', 1]] },\n  rimeFringe:      { density: 30, list: [['tholinTuft', 1]] },\n  // Wave 2 of the atlas (Sep 30).\n  puffballDomes:   { density: 35, list: [['moss', 4], ['gillButton', 2], ['grassTuft', 2]] },\n  shelfTerraces:   { density: 30, list: [['moss', 3], ['fern', 2]] },\n  glowmossPillars: { density: 25, list: [['glowMoss', 3], ['moss', 3]] },\n  glowMosaic:      { density: 55, list: [['glowTile', 9], ['glowSprout', 1]] },\n  prismCoral:      { density: 25, list: [['reed', 2], ['ribbonWeed', 2], ['moss', 1]] },\n  boneArches:      { density: 30, list: [['moss', 3], ['grassTuft', 2]] },\n  landKelp:        { density: 35, list: [['fern', 3], ['moss', 3]] },\n  veinCoral:       { density: 10, list: [['moss', 1]] },\n  vaultedReefs:    { density: 20, list: [['ribbonWeed', 4], ['floatLeaves', 2], ['reed', 1]] },\n  glowSlime:       { density: 45, list: [['slimeDrip', 5], ['moss', 2], ['glowSprout', 1]] },\n  fleshPods:       { density: 25, list: [['moss', 2], ['fern', 2]] },\n  crystalWarrens:  { density: 20, list: [['crystalShoot', 1]] },\n  matCrags:        { density: 45, list: [['moss', 5], ['grassTuft', 3]] },\n  // Wave 3: what grows on its ground, where life can.\n  karstTowers:     { density: 30, list: [['grassTuft', 3], ['moss', 2], ['fern', 1], ['ribbonWeed', 2]] },\n  methaneOasis:    { density: 30, list: [['tholinTuft', 1]] },\n  // Biome wave 6 (version 12). `wall`: curtains hung down a drop beside the column (WALL FLORA, floraOf), `len` cells at\n  // most from its top, `density` in a hundred of the cells that could hold one.\n  hanging:         { density: 40, list: [['bloom', 3], ['moss', 3], ['fern', 2], ['grassTuft', 2]], wall: { density: 75, len: 3 } },\n  cenotes:         { density: 12, list: [['moss', 3], ['grassTuft', 2], ['fern', 1]], wall: { density: 60, len: 3 } },\n  thorns:          { density: 30, list: [['grassTuft', 6], ['bloom', 0.5]] },\n  ash:             { density: 6,  list: [['grassTuft', 1]] },\n  stroma:          { density: 12, list: [['ribbonWeed', 3], ['reed', 1]] },\n  columns:         { density: 8,  list: [['moss', 1]] },\n  // The water biomes: what grows on their floors and at their edges (of water life; none on methane, nitrogen or lava).\n  ocean:           { density: 35, list: [['ribbonWeed', 6], ['floatLeaves', 1]] },\n  lake:            { density: 45, list: [['reed', 4], ['floatLeaves', 4], ['ribbonWeed', 3]] },\n  river:           { density: 45, list: [['reed', 5], ['ribbonWeed', 3], ['floatLeaves', 2]] },\n};\n// THE OPEN SEA (version 6, the owner, Oct 2: \"oceans should have floating foliage, except along their coasts\"). Before,\n// an ocean's float leaves kept to water two cells deep or less, which on these shallow seas meant along its coasts, and\n// the open water had nothing on it. On a version 6 world (ctx.openSea) an ocean's leaves float on OPEN water: a column\n// whose every neighbour within OPEN_SEA_CLEAR columns is ocean too, so none by a shore; and more of them, over the weed\n// on its floor. The surface is found however deep the water (OPEN_SEA_SCAN). Lakes and rivers are as they were.\nconst OCEAN_OPEN = Object.freeze({ density: 35, list: [['ribbonWeed', 3], ['floatLeaves', 3]] });\nexport const OPEN_SEA_CLEAR = 2, OPEN_SEA_SCAN = 64;\nfunction openWater(ctx, fi, iu, iv, Wd) {\n  for (let du = -OPEN_SEA_CLEAR; du <= OPEN_SEA_CLEAR; du++) for (let dv = -OPEN_SEA_CLEAR; dv <= OPEN_SEA_CLEAR; dv++) {\n    const u = iu + du, v = iv + dv;\n    if (u < 0 || v < 0 || u >= Wd || v >= Wd) continue;   // past the face's edge: its own columns decide there\n    if (ctx.biomeAt(fi, u, v) !== 'ocean') return false;\n  }\n  return true;\n}\n// …AND FROM VERSION 13, ONLY NEAR A SHORE (the owner, Oct 12: \"remove floating flora far from coastlines\"). What floats\n// ('surface': the float leaves) grows only on water with land close by: a column with a dry column (its ground's top over\n// the water, the air above it no sea) within FLOAT_SHORE_REACH columns of it, either way along its face, on the same face\n// (past the face's edge its own columns decide, as openWater's do, so a coast just over an edge does not count). Three\n// columns is three kubes of open water out from the land: a fringe of leaves round every coast, island and lake shore,\n// and nothing out in mid-ocean or mid-lake. It applies to every water biome (oceans, lakes, rivers), and it is the only\n// change: the open sea's density, its scan to the surface and every other flora are version 12's. A column whose leaves\n// are left off grows what else fits there (the weed on its floor), by the same draws. Version 6 to 12 worlds keep the\n// open sea's leaves exactly where they were (ctx.shoreReach is version 13's alone).\n// LAND IS GROUND AT THE WATER'S LEVEL OR ABOVE IT: the air over the column's ground is no sea, AND its ground's top\n// stands at the sea's level or higher (ctx.top ≥ ctx.seaLevel, which on a face's own columns is the same test). The\n// second half is for the rim: next to a face's edge the air over a low, rolled column lies in the neighbouring face's\n// shell, which the sea's L∞ shells count as above that face's water, so it read as dry ground when it was the air over\n// the next face's ocean, and leaves grew far out along the edges of a sea.\nexport const FLOAT_SHORE_REACH = 3;\nfunction nearShore(ctx, fi, iu, iv, Wd, refR) {\n  const ax = fi >> 1, sg = (fi & 1) ? -1 : 1, c = [0, 0, 0];\n  for (let du = -FLOAT_SHORE_REACH; du <= FLOAT_SHORE_REACH; du++) for (let dv = -FLOAT_SHORE_REACH; dv <= FLOAT_SHORE_REACH; dv++) {\n    const u = iu + du, v = iv + dv;\n    if ((du === 0 && dv === 0) || u < 0 || v < 0 || u >= Wd || v >= Wd) continue;\n    const t = ctx.top(fi, u, v);\n    if (ctx.seaLevel != null && t < ctx.seaLevel) continue;   // its ground is under the water's level: no shore\n    c[ax] = sg > 0 ? t : -t - 1; c[(ax + 1) % 3] = u - refR; c[(ax + 2) % 3] = v - refR;\n    if (!ctx.seaAt(c[0], c[1], c[2])) return true;          // the air over that column's ground is dry: land\n  }\n  return false;\n}\nexport const FLORA_BIOMES = Object.freeze(Object.keys(BIOME_FLORA));\n// A biome's flora by name, for Kubipedia's \"What grows here\" (organics.mjs biomeMaterials names the rest).\nexport const biomeFlora = (id) => (BIOME_FLORA[id] ? [...new Set(BIOME_FLORA[id].list.map(([f]) => FLORA_BY_ID.get(f).name))] : []);\nexport const MAX_FLORA_CUBES = 60000;    // micro-cubes on the biggest world: the budget the deck's frame time was measured against\nconst BLOOM_CARPET = ['Farout', 'Wisp', 'Radiance'];\nconst MOSAIC = ['Aura', 'Flash', 'Spirit', 'Radiance'];   // a glow mosaic's tiles: cyan, magenta, violet and gold\n// A FLORA'S SIZE IN ITS KUBE-SPACE (the owner, Sep 30): no more than 80% of its width or length, and 90% of its height.\n// Its micro-cubes are FLORA_CUBE across, inset FLORA_INSET from the cell's sides. Four of them stand 0.8 high, within its\n// cell's 90%. A taller one rises into the next kube-space, all of its own cell and no more than 90% of the next, so a cube\n// FLORA_TALL_MAX up or higher is left off (none of the models reach it).\nexport const FLORA_CUBE = 0.2, FLORA_INSET = 0.1, FLORA_SHORT_MAX = 4, FLORA_TALL_MAX = 9;\n\n// ---- THE MODELS, in micro-cubes (quarter cells) in the flora's own frame: x and z across its cell (0 to 3), y up from\n// the cell's floor (a hanging one: down from its roof). [x, y, z, slot, …] ----\nconst clamp3 = (v) => (v < 0 ? 0 : v > 3 ? 3 : v);\n\n// THE OWNER'S PICKS (the Material Bench, Sep 30): thirteen kinds take a new shape, each drawn from the instance's own\n// generator so no two stand alike where the shape leaves room (model-variants.mjs, where they were offered). The other\n// four (floating leaves, glow moss, glow threads, reeds) keep today's. Only the LOOK changes: which flora a world keeps\n// under its budget is still reckoned on today's shapes (CUBES_OF, modelToday), so every world grows its flora in the\n// same cells as before.\nfunction shaper(r) {\n  const o = [], seen = new Set();\n  const put = (x, y, z, s) => { const k = x + ',' + y + ',' + z; if (seen.has(k) || x < 0 || x > 3 || z < 0 || z > 3 || y < 0 || y > 8) return; seen.add(k); o.push(x, y, z, s); };\n  const ri = (n) => Math.floor(r() * n);\n  const b = {\n    o, put,\n    col(x, z, h, s, tip) { for (let y = 0; y < h; y++) put(x, y, z, s); if (tip != null) put(x, h, z, tip); },\n    clump(n, h0, h1, s, tip) { for (let i = 0; i < n; i++) b.col(ri(4), ri(4), h0 + ri(h1 - h0 + 1), s, tip); },\n    carpet(p, s) { for (let x = 0; x < 4; x++) for (let z = 0; z < 4; z++) if (r() < p) put(x, 0, z, s); },\n    // A stalk and its head: 'cross' (a plus of petals) or 'ball' (a 3x3 dome).\n    stalkHead(x, z, h, kind, stem, head, centre) {\n      b.col(x, z, h, stem);\n      if (kind === 'cross') { put(x, h, z, centre); for (const [dx, dz] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) put(clamp3(x + dx), h, clamp3(z + dz), head); }\n      else { for (let dx = -1; dx <= 1; dx++) for (let dz = -1; dz <= 1; dz++) put(clamp3(x + dx), h, clamp3(z + dz), head); put(x, h + 1, z, centre); }\n    },\n    // Blades leaning out from the middle, one per direction, rising as they go.\n    arch(n, s) { const dirs = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n      for (let i = 0; i < n; i++) { const [dx, dz] = dirs[i % 4]; let x = 1 + (dx > 0 ? 1 : 0), z = 1 + (dz > 0 ? 1 : 0);\n        for (let y = 0; y < 3; y++) { put(x, y, z, s); x = clamp3(x + (y % 2 ? dx : 0)); z = clamp3(z + (y % 2 ? dz : 0)); } } },\n    pods(n, s, pod) { for (let i = 0; i < n; i++) { const x = ri(4), z = ri(4), h = 1 + ri(2); b.col(x, z, h, s); put(x, h, z, pod); } },\n  };\n  return b;\n}\nconst PICKED_SHAPES = {\n  bloom: (b) => b.stalkHead(1, 2, 2, 'cross', 2, 1, 3),                                       // a cross flower\n  crystalShoot: (b) => { b.col(0, 1, 3, 0, 1); b.col(3, 2, 4, 0, 1); },                      // twin shoots\n  fern: (b) => { b.arch(4, 0); b.put(1, 1, 1, 2); },                                           // a star of fronds\n  gillButton: (b) => b.stalkHead(1, 1, 2, 'ball', 2, 3, 1),                                    // glowing gills\n  glowCarpet: (b) => { for (let i = 0; i < 4; i++) { b.put(i, 0, 1, 3); b.put(i, 0, 2, 3); b.put(1, 0, i, 3); b.put(2, 0, i, 3); } },   // a cross\n  glowSprout: (b) => b.clump(3, 1, 2, 2, 3),                                                   // lit tips\n  glowTile: (b) => { for (const x of [1, 2]) for (const z of [1, 2]) b.put(x, 0, z, 3); },     // a small tile\n  grassTuft: (b) => b.clump(3, 3, 3, 0),                                                       // tall and sparse\n  moss: (b) => { b.carpet(0.8, 0); b.put(1, 1, 1, 0); b.put(2, 1, 2, 0); b.put(2, 1, 1, 0); },  // hummocks\n  ribbonWeed: (b) => b.clump(4, 3, 7, 0),                                                      // ribbons\n  rootCurtain: (b) => { b.col(0, 0, 6, 0, 1); b.col(3, 3, 7, 0, 1); b.col(1, 2, 5, 0, 1); },   // long tendrils\n  slimeDrip: (b) => { for (const x of [1, 2]) for (const z of [1, 2]) b.put(x, 1, z, 0); b.put(1, 0, 1, 3); b.put(2, 0, 2, 3); b.put(1, 2, 2, 3); },   // a knot\n  tholinTuft: (b) => b.pods(4, 0, 0),                                                          // knots\n};\nfunction model(id, r) {\n  const pick = PICKED_SHAPES[id];\n  if (!pick) return modelToday(id, r);\n  const b = shaper(r); pick(b); return b.o;\n}\nfunction modelToday(id, r) {\n  const o = [], rx = () => Math.floor(r() * 4);\n  switch (id) {\n    case 'grassTuft': { const n = 3 + Math.floor(r() * 3); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 1 + Math.floor(r() * 3); for (let y = 0; y < h; y++) o.push(x, y, z, 0); } break; }\n    case 'bloom': { const x = 1 + Math.floor(r() * 2), z = 1 + Math.floor(r() * 2), h = 2 + Math.floor(r() * 2);\n      for (let y = 0; y < h; y++) o.push(x, y, z, 2);\n      o.push(x, h, z, 3, clamp3(x + 1), h, z, 1, clamp3(x - 1), h, z, 1, x, h, clamp3(z + 1), 1, x, h, clamp3(z - 1), 1, clamp3(x + 1), 0, z, 0); break; }\n    case 'fern': o.push(1, 0, 1, 2, 2, 0, 2, 2);\n      for (const [dx, dz] of [[1, 1], [-1, 1], [1, -1], [-1, -1]]) o.push(clamp3(1 + dx), 1, clamp3(1 + dz), 0, clamp3(1 + 2 * dx), 1, clamp3(2 + 2 * dz), 0);\n      break;\n    case 'reed': { const n = 2 + Math.floor(r() * 2); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 4 + Math.floor(r() * 4); for (let y = 0; y < h; y++) o.push(x, y, z, 0); o.push(x, h, z, 2); } break; }\n    case 'floatLeaves': for (let x = 0; x <= 2; x++) for (let z = 0; z <= 2; z++) if ((x !== 1 || z !== 1 || r() < 0.6) && !((x === 0 || x === 2) && (z === 0 || z === 2))) o.push(x, 0, z, 0);\n      if (r() < 0.35) o.push(1, 1, 1, 1); break;\n    case 'gillButton': { const n = 1 + Math.floor(r() * 2); for (let i = 0; i < n; i++) { const x = Math.floor(r() * 3), z = Math.floor(r() * 3); o.push(x, 0, z, 2, x, 1, z, 3, x + 1, 1, z, 1, x, 1, z + 1, 1, x + 1, 1, z + 1, 1); } break; }\n    case 'glowSprout': { const n = 1 + Math.floor(r() * 3); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 1 + Math.floor(r() * 2); for (let y = 0; y < h; y++) o.push(x, y, z, 2); o.push(x, h, z, 3); } break; }\n    case 'rootCurtain': { // a row of pale roots of uneven lengths across the cell, each with its tip (its accent)\n      const across = r() < 0.5, k = rx(), n = 3 + Math.floor(r() * 2);\n      for (let i = 0; i < n; i++) { const h = 2 + Math.floor(r() * 5), x = across ? i : k, z = across ? k : i;\n        for (let y = 0; y < h; y++) o.push(x, y, z, 0);\n        o.push(x, h, z, 1); }\n      break; }\n    case 'moss': for (let x = 0; x < 4; x++) for (let z = 0; z < 4; z++) if (r() < 0.6) o.push(x, 0, z, 0); break;\n    case 'ribbonWeed': { const n = 3 + Math.floor(r() * 3); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 3 + Math.floor(r() * 5); for (let y = 0; y < h; y++) o.push(x, y, z, 0); } break; }\n    case 'glowCarpet': for (let x = 0; x < 4; x++) for (let z = 0; z < 4; z++) if (r() < 0.75) o.push(x, 0, z, r() < 0.6 ? 3 : 2); break;\n    case 'glowThread': { const n = 2 + Math.floor(r() * 2); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 3 + Math.floor(r() * 4); for (let y = 0; y < h; y++) o.push(x, y, z, 3); } break; }\n    case 'crystalShoot': { const n = 2 + Math.floor(r() * 3); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 1 + Math.floor(r() * 3); for (let y = 0; y < h; y++) o.push(x, y, z, 0); o.push(x, h, z, 1); } break; }\n    case 'tholinTuft': { const n = 3 + Math.floor(r() * 4); for (let i = 0; i < n; i++) { const x = rx(), z = rx(), h = 1 + Math.floor(r() * 2); for (let y = 0; y < h; y++) o.push(x, y, z, 0); } break; }\n    case 'glowTile': for (let x = 0; x < 4; x++) for (let z = 0; z < 4; z++) if (r() < 0.9) o.push(x, 0, z, 3); break;   // a lit tile, its edges worn\n    case 'glowMoss': for (let x = 0; x < 4; x++) for (let z = 0; z < 4; z++) { const q = r(); if (q < 0.55) o.push(x, 0, z, 3); else if (q < 0.7) o.push(x, 0, z, 3, x, 1, z, 3); } break;\n    case 'vineCurtain': { // strands hung from the top of the cell against its wall (x = 0: floraOf turns it to the wall), leaves and a flower or two\n      const n = 3 + Math.floor(r() * 2), zs = [0, 1, 2, 3];\n      for (let i = 0; i < n; i++) { const z = zs.splice(Math.floor(r() * zs.length), 1)[0], h = 2 + Math.floor(r() * 2);\n        for (let y = 0; y < h; y++) { o.push(0, y, z, 0); if (y < 2 && r() < 0.6) o.push(1, y, z, 0); }   // a strand on the wall, leafy near its top\n        if (r() < 0.4) o.push(0, h, z, 1); }                                                            // …now and then in flower\n      break; }\n    case 'slimeDrip': { const x0 = Math.floor(r() * 2), z0 = Math.floor(r() * 2), h = 2 + Math.floor(r() * 2);   // two posts and a bar, dripping\n      for (let y = 0; y <= h; y++) o.push(x0, y, z0, 0, x0 + 2, y, z0, 0);\n      o.push(x0 + 1, h, z0, 0);\n      for (let d = 1; d < h; d++) if (r() < 0.6) o.push(x0 + 1, h - d, z0, 3);\n      o.push(x0 + 1, 0, z0, 3, x0 + 1, 0, z0 + 1, 3); break; }\n  }\n  return o;\n}\n// How many micro-cubes each kind's model averages (over its first forty seeds): the budget's reckoning, on today's shapes\n// (PICKED_SHAPES), so a world keeps the same flora it always grew.\nconst CUBES_OF = FLORA_IDS.map((id) => { let n = 0; for (let i = 0; i < 40; i++) n += modelToday(id, rngOf(id + '#' + i)).length / 4; return n / 40; });\nfunction rngOf(str) {\n  let h = 2166136261 >>> 0;\n  for (let i = 0; i < str.length; i++) h = Math.imul(h ^ str.charCodeAt(i), 16777619);\n  let a = h >>> 0 || 1;\n  return () => { a ^= a << 13; a >>>= 0; a ^= a >>> 17; a ^= a << 5; a >>>= 0; return a / 4294967296; };\n}\nconst matHex = (name) => { const m = ORGANIC_MATERIALS.find((x) => x.name === name); return m ? m.hex : '#808080'; };\n\n// EVERY FLORA, for Kubipedia: its name, colour, what it is, where it is found, and its colour variants.\nexport const FLORA_ITEMS = Object.freeze(FLORA.map((f) => {\n  const variants = f.id === 'bloom' ? ['Farout', 'Starlight', 'Wisp', 'Radiance', 'Nova'].map((v) => ({ name: `${v} Bloom`, hex: PALETTE[v] }))\n    : f.id === 'rootCurtain' ? [{ name: 'Root Curtain', hex: PALETTE.Corona }].concat(['Aura', 'Ether', 'Spirit', 'Flash', 'Radiance'].map((v) => ({ name: `${v}-tipped Root Curtain`, hex: PALETTE[v] })))\n    : f.id === 'glowSprout' || f.id === 'glowCarpet' || f.id === 'glowThread' ? ['Aura', 'Ether', 'Spirit', 'Flash', 'Radiance'].map((v) => ({ name: `${v} ${f.name}`, hex: PALETTE[v] }))\n    : f.chem === 'silicon' ? ['Spirit', 'Lumina', 'Radiance'].map((v) => ({ name: `${v} ${f.name}`, hex: PALETTE[v] }))\n    : f.chem === 'methane' ? ['Solis', 'Scorched', 'Arid'].map((v) => ({ name: `${v} ${f.name}`, hex: PALETTE[v] }))\n    : f.id === 'gillButton' ? [{ name: 'Halo Gill Button', hex: PALETTE.Halo }]\n    : f.id === 'glowTile' ? MOSAIC.map((v) => ({ name: `${v} ${f.name}`, hex: PALETTE[v] }))\n    : f.id === 'glowMoss' ? [{ name: 'Ether Glowmoss', hex: PALETTE.Ether }]\n    : f.id === 'slimeDrip' ? [{ name: 'Slime Drip', hex: PALETTE.Bloom }]\n    : ['Verge', 'Tide', 'Solis', 'Void', 'Drift'].map((v) => ({ name: `${v} ${f.name}`, hex: matHex(`${v} Leaf Biomass`) }));\n  const found = { grassTuft: 'dune seas, thorn scrub, karst towers, cenotes and ash plains (on turf, from world version 15, its tufts are painted into the turf)', bloom: 'bloom carpets, woods and hothouse canopies',\n    fern: 'woods and hothouse canopies', reed: 'the shores of water in living biomes', floatLeaves: 'still water in woods, bloom carpets and tidal gardens',\n    gillButton: 'gill towers and woods', glowSprout: 'gill towers and nightside glow', rootCurtain: 'the roofs of caves on living worlds',\n    moss: 'woods, gill towers and lichen steppes', ribbonWeed: 'under liquid water: tidal gardens, woods, hothouse canopies',\n    glowCarpet: 'nightside glow: a locked world\\'s night face', glowThread: 'nightside glow: a locked world\\'s night face',\n    crystalShoot: 'Spirit gardens, on hot silicon worlds', tholinTuft: 'tholin reefs, by methane seas',\n    glowTile: 'glow mosaic, where the light is dim', glowMoss: 'glowmoss pillars, where the light is dim', slimeDrip: 'glow slime, where the light is dim',\n    vineCurtain: 'hanging gardens, and the rims of cenotes on living worlds' }[f.id];\n  return Object.freeze({ id: f.id, name: f.name, chem: f.chem, hex: variants[0].hex, desc: f.desc, foundIn: found, variants, since: f.since });\n}));\n\n// A FLORA'S ICON (the owner, Sep 30: \"items that are not kubes/liquids should display their full 3d models\"): its own\n// model, the fullest of its first sixteen seeds, in its Kubipedia colours (its first variant's, under a G star) by the\n// rules floraOf colours a world's with. [[x, y, z, hex, glow, family], …] in micro-cubes, y up; a hanging one hangs from the\n// top. `family` is what the cube is made of (floraFamilyOf: '' for a light), whose texture it wears in the world and so in\n// its icon (app.js, icon-world.mjs: the owner, Oct 22, \"textures in the inventory slots should mimic their real world\n// counterparts\").\nexport function floraIcon(id) {\n  const F = FLORA_BY_ID.get(id), item = FLORA_ITEMS.find((f) => f.id === id);\n  if (!F || !item) return [];\n  let m = [];\n  for (let i = 0; i < 16; i++) { const o = model(id, rngOf(`${id}#icon#${i}`)); if (o.length > m.length) m = o; }\n  const pg = pigmentsOf({ addr: 'kubipedia.flora', star: 'G-Class Star' }), v0 = item.variants[0].hex, leaf = matHex(`${pg.leaf} Leaf Biomass`);\n  let body = leaf, accent = PALETTE[pg.petal], stem = leaf, glow = PALETTE[pg.glow];\n  if (['grassTuft', 'fern', 'reed', 'floatLeaves', 'moss', 'ribbonWeed'].includes(id)) body = stem = v0;\n  if (id === 'reed') stem = PALETTE.Gloam;\n  if (id === 'bloom') accent = v0;\n  if (id === 'gillButton') { accent = PALETTE.Halo; stem = PALETTE.Gleam; }\n  if (['glowSprout', 'glowCarpet', 'glowThread', 'glowTile', 'glowMoss', 'slimeDrip'].includes(id)) glow = v0;\n  if (id === 'glowCarpet') stem = '#141a22';\n  if (id === 'slimeDrip') body = '#141814';\n  if (id === 'rootCurtain') { body = PALETTE.Corona; accent = PALETTE.Halo; }\n  if (id === 'crystalShoot') { body = v0; accent = PALETTE.Glint; }\n  if (id === 'tholinTuft') body = v0;\n  const hexOf = (slot) => (slot === 3 ? glow : slot === 1 ? accent : slot === 2 ? stem : body);\n  let top = 0;\n  for (let j = 1; j < m.length; j += 4) top = Math.max(top, m[j]);\n  const cells = new Map();\n  for (let j = 0; j < m.length; j += 4) {\n    const y = F.where === 'under' ? top - m[j + 1] : m[j + 1];\n    cells.set(`${m[j]},${y},${m[j + 2]}`, [m[j], y, m[j + 2], hexOf(m[j + 3]), m[j + 3] === 3 ? 1 : 0, floraFamilyOf(id, m[j + 3])]);\n  }\n  return [...cells.values()];\n}\n\n// A WORLD'S FLORA: every item, and the micro-cubes that draw them. `ctx` is organics.mjs's (the generator's) plus\n// caveRoofs(): air cells with rock over them, where root curtains hang. Every column is asked, its biome deciding\n// what grows there, and the sea whether it stands on dry ground, at a shore, on a sea's floor or afloat; so that the\n// biggest world stays within MAX_FLORA_CUBES, a first pass counts what would grow and the second keeps each item by\n// its own hash at the share that fits. What glows: glow sprouts, carpets and threads always; a bloom's head, a gill\n// button's cap and a root curtain's tips the likelier the dimmer the world is there (its star, and a locked world's\n// night side), a cave's as its ground's.\n// Returns { items: Int32Array [x, y, z, face, flora index, …] (the cell each stands in, and the face its ground is on),\n// n, cubes: { n, pos: Float32Array [x, y, z, …] (micro-cube centres, grid cells), col: Uint8Array (palette index), glow:\n// Uint8Array (1 lit by itself), sway: Float32Array [dx, dy, dz, phase, …] (grid cells) }, palette: [hex], counts,\n// start: Int32Array (item i's cubes are start[i] to start[i + 1]), drop: Uint16Array (what picking item i gives, by\n// index into drops), drops: [material name], tall: Uint8Array (1: it rises past its own cell), hang: Uint8Array (1: it\n// hangs from a roof) }, and each cube's upper (1: it is in the second kube-space of a tall one).\nexport function floraOf(ctx) {\n  const { refR, world, climate } = ctx, chem = lifeChemistryOf(world, climate), pg = pigmentsOf(world, !!ctx.lifePigments);   // version 16: red and blue petals too\n  const Wd = 2 * refR, seed = Math.floor(rngOf((world.addr || '') + '#flora')() * 2147483647);\n  const leafHex = matHex(`${pg.leaf} Leaf Biomass`), leaf2Hex = matHex(`${pg.leaf2} Leaf Biomass`);\n  const palette = [], palIdx = new Map(), pal = (hex) => { let i = palIdx.get(hex); if (i == null) { i = palette.length; palette.push(hex); palIdx.set(hex, i); } return i; };\n  // A candidate on every column (and under every cave roof), decided as far as its kind; the models come after.\n  const cand = [], left = new Set();               // left (version 10): candidates off their up side, counted but not grown\n  // ghost (version 15): grass tufts on turf, grown in full but never kept, so their micro-cubes still fill the budget they\n  // filled at version 14 (MAX_FLORA_CUBES below) and no flora the cap left off a version 14 world grows in their place\n  const ghost = new Set();\n  // WALL FLORA (version 12's hanging gardens and cenotes): where a column's ground stands over a neighbour's on its own face,\n  // the air beside its drop, from the top down `len` cells, may hold a vine curtain hung against it. Its flag (cand's\n  // sixth) is 3 + the side the wall is on (0: the neighbour lies +u, so the wall is at its -u side; 1 -u; 2 +v; 3 -v).\n  const wallCells = new Set(), topCells = new Set();\n  const wallCands = (fi, iu, iv, W) => {\n    const t = ctx.top(fi, iu, iv), ax = fi >> 1, sg = (fi & 1) ? -1 : 1, vine = FLORA_IDS.indexOf('vineCurtain');\n    for (let d = 0; d < 4; d++) {\n      const nu = iu + (d === 0 ? 1 : d === 1 ? -1 : 0), nv = iv + (d === 2 ? 1 : d === 3 ? -1 : 0);\n      if (nu < 0 || nv < 0 || nu >= Wd || nv >= Wd) continue;\n      const tn = ctx.top(fi, nu, nv);\n      for (let k = t - 1; k >= tn && k >= t - W.len; k--) {\n        if (hash4(fi * 4 + d, iu * 64 + k, iv, seed + 9) * 100 >= W.density) continue;\n        const c = [0, 0, 0]; c[ax] = sg > 0 ? k : -k - 1; c[(ax + 1) % 3] = nu - refR; c[(ax + 2) % 3] = nv - refR;\n        if (ctx.isSolid(c[0], c[1], c[2]) || (ctx.seaAt && ctx.seaAt(c[0], c[1], c[2])) || (ctx.blockedAt && ctx.blockedAt(c[0], c[1], c[2]))) continue;\n        if (upFaceOf(c[0], c[1], c[2]) !== fi) continue;\n        const ck = c[0] + ',' + c[1] + ',' + c[2];\n        if (topCells.has(ck) || wallCells.has(ck)) continue;   // one flora a cell\n        wallCells.add(ck);\n        cand.push(c[0], c[1], c[2], fi, vine, 3 + d);\n      }\n    }\n  };\n  const choose = (list, h) => { let sum = 0; for (const [, w] of list) sum += w; let x = h * sum; for (const [f, w] of list) { if (x < w) return f; x -= w; } return list[list.length - 1][0]; };\n  for (let fi = 0; fi < 6; fi++) for (let iu = 0; iu < Wd; iu++) for (let iv = 0; iv < Wd; iv++) {\n    const id = ctx.biomeAt(fi, iu, iv), open = !!ctx.openSea && id === 'ocean', B = open ? OCEAN_OPEN : id && BIOME_FLORA[id];\n    if (B && B.wall && chem === 'carbon') wallCands(fi, iu, iv, B.wall);\n    if (!B || hash4(fi, iu, iv, seed) * 100 >= B.density) continue;\n    const t = ctx.top(fi, iu, iv), ax = fi >> 1, sg = (fi & 1) ? -1 : 1, u = iu - refR, v = iv - refR;\n    const cellAt = (h) => { const c = [0, 0, 0]; c[ax] = sg > 0 ? t + h : -t - 1 - h; c[(ax + 1) % 3] = u; c[(ax + 2) % 3] = v; return c; };\n    const air = cellAt(0), wet = ctx.seaAt ? ctx.seaAt(air[0], air[1], air[2]) : 0;\n    if (ctx.blockedAt && ctx.blockedAt(air[0], air[1], air[2])) continue;                 // under an ice sheet: nothing grows\n    let depth = 0, topped = false;                  // topped: the scan reached the air over the water (its surface)\n    const scan = open ? OPEN_SEA_SCAN : 12;\n    if (wet) while (depth < scan) { const c = cellAt(depth + 1); if (!ctx.seaAt(c[0], c[1], c[2])) { topped = true; break; } depth++; }\n    const shore = !wet && ctx.seaLevel != null && t <= ctx.seaLevel + 1;\n    const fits = B.list.filter(([f]) => { const F = FLORA_BY_ID.get(f); if (F.chem !== chem) return false;\n      if (F.where === 'surface' && ctx.shoreReach) return wet && (open ? topped : depth <= 2) && nearShore(ctx, fi, iu, iv, Wd, refR);   // version 13: by a shore only\n      return F.where === 'water' ? wet && depth >= 1 : F.where === 'surface' ? (open ? wet && topped && openWater(ctx, fi, iu, iv, Wd) : wet && depth <= 2) : F.where === 'shore' ? shore : F.where === 'top' ? !wet : false; });\n    if (!fits.length) continue;\n    const f = choose(fits, hash4(fi, iu, iv, seed + 1));\n    const where = FLORA_BY_ID.get(f).where, cell = where === 'surface' ? cellAt(depth + 1) : air;\n    if (ctx.isSolid(cell[0], cell[1], cell[2])) continue;   // near a rim the cell over a column can be the next face's ground\n    // ON ITS UP SIDE (version 10, ctx.edgeUp; the owner, Oct 8). A flora grows up its column's face, so its cell must have\n    // that face's up (organics.mjs upFaceOf, the walker's gravity), and stand on ground along it, or float on the water's\n    // top. Near an edge where the ground is low, the cell over a column is the next face's, and before version 10 a flora\n    // there grew sideways to its gravity, nine in ten of them in the air, and some shared their kube-space with the one the\n    // next face's own column grew there. That face's column is the one that grows there now. One left out stays in the list\n    // as a candidate the budget counts (`left`), in its place, so the flora away from the edges are version 9's.\n    if (ctx.edgeUp) {\n      const below = cell.slice(); below[ax] -= sg;\n      if (upFaceOf(cell[0], cell[1], cell[2]) !== fi || (where === 'surface' ? !(ctx.seaAt && ctx.seaAt(below[0], below[1], below[2])) : !ctx.isSolid(below[0], below[1], below[2]))) left.add(cand.length);\n    }\n    const ck = cell[0] + ',' + cell[1] + ',' + cell[2];\n    if (wallCells.has(ck)) continue;                // a vine curtain hangs here already (WALL FLORA: version 12 only)\n    // TUFTS ARE PAINTED (version 15, ctx.turfAt; the owner, Oct 12: \"no small swaying tuft kubes — just tuft texture\"). A\n    // grass tuft whose ground is the seed's turf is left out: texture-turf.js paints tufts into every turfed top. It stays\n    // a candidate, its cell stays taken, and it is a GHOST: grown below exactly as before but not kept, its micro-cubes\n    // still counted against MAX_FLORA_CUBES. A big world's flora fill that cap (version 14 stopped at it), and leaving the\n    // tufts out of the count let 159 flora the cap had always left off grow on the owner's world (the v15 upgrade's dry\n    // run, Oct 12). So every other flora is version 14's, cell for cell, and none is added.\n    if (ctx.turfAt && f === 'grassTuft') { const g = cell.slice(); g[ax] -= sg; if (ctx.turfAt(g[0], g[1], g[2])) ghost.add(cand.length); }\n    topCells.add(ck);\n    cand.push(cell[0], cell[1], cell[2], fi, FLORA_IDS.indexOf(f), id === 'bloomCarpets' ? 2 : 0);\n  }\n  // What hangs from a cave's roof hangs down its own face's up too (version 10): a roof whose cell is the next face's is left bare.\n  if (chem === 'carbon' && ctx.caveRoofs) for (const c of ctx.caveRoofs()) { if (ctx.edgeUp && upFaceOf(c[0], c[1], c[2]) !== c[3]) left.add(cand.length); cand.push(c[0], c[1], c[2], c[3], FLORA_IDS.indexOf(hash4(c[0], c[1], c[2], seed + 2) < 0.7 ? 'rootCurtain' : 'moss'), 1); }\n  // Fit the budget: each kind's models average CUBES_OF[kind] micro-cubes, so keep each item at the share that fits.\n  let want = 0;\n  for (let i = 0; i < cand.length; i += 6) want += CUBES_OF[cand[i + 4]];\n  const keep = want > 0.9 * MAX_FLORA_CUBES ? 0.9 * MAX_FLORA_CUBES / want : 1;   // a tenth spare, for models larger than their kind's mean\n  const items = [], P = [], C = [], G = [], S = [], U = [], FM = [], tallL = [], hangL = [], start = [], drop = [], drops = [], dropAt = new Map();\n  let ghostCubes = 0;                              // the micro-cubes the ghosts (version 15) would have drawn\n  const dropIdx = (name) => { let k = dropAt.get(name); if (k == null) { k = drops.length; drops.push(name); dropAt.set(name, k); } return k; };\n  const counts = {};\n  for (let i = 0; i < cand.length; i += 6) {\n    if (left.size && left.has(i)) continue;\n    const x = cand[i], y = cand[i + 1], z = cand[i + 2], fi = cand[i + 3], fl = FLORA_IDS[cand[i + 4]], hang = cand[i + 5] === 1 || cand[i + 5] >= 3;\n    const wall = cand[i + 5] >= 3 ? cand[i + 5] - 3 : -1;   // a vine curtain's wall side (WALL FLORA)\n    if (hash4(x, y, z, seed + 3) >= keep || P.length / 3 + ghostCubes >= MAX_FLORA_CUBES) continue;\n    const isGhost = ghost.size > 0 && ghost.has(i);\n    // Its generator, counted: today's shape is drawn again from the same point in it (below), for what is frozen.\n    const F = FLORA_BY_ID.get(fl), rKey = `${world.addr || ''}#flora#${x},${y},${z}`, r0 = rngOf(rKey);\n    let drawn = 0;\n    const r = () => { drawn++; return r0(); };\n    // Its colours: body, accent, stem, glow.\n    const dm = dimAt(climate, world, x + 0.5, y + 0.5, z + 0.5), glowy = r() < dm * dm, glowV = fl === 'glowCarpet' || fl === 'glowThread' ? (r() < 0.5 ? 'Aura' : 'Ether')\n      : fl === 'glowTile' ? MOSAIC[Math.floor(r() * 4)] : fl === 'glowMoss' ? 'Ether' : fl === 'slimeDrip' ? 'Bloom' : pg.glow;\n    const leafy = r() < 0.7;\n    let body = leafy ? leafHex : leaf2Hex, accent = pigmentHex(pg.petal), stem = leafHex, petalV = pg.petal, ownV = null;   // pigmentHex: PALETTE's, and version 16's six\n    if (fl === 'bloom') { petalV = cand[i + 5] === 2 ? BLOOM_CARPET[Math.floor(r() * 3)] : pg.petal; accent = pigmentHex(petalV); }   // a bloom carpet's own three\n    if (fl === 'gillButton') { accent = PALETTE.Halo; stem = PALETTE.Gleam; }\n    if (fl === 'reed') stem = PALETTE.Gloam;\n    if (fl === 'glowCarpet') stem = '#141a22';\n    if (fl === 'slimeDrip') body = '#141814';\n    if (fl === 'rootCurtain') { body = PALETTE.Corona; accent = PALETTE.Halo; }\n    if (fl === 'crystalShoot') { ownV = ['Spirit', 'Lumina', 'Radiance'][Math.floor(r() * 3)]; body = PALETTE[ownV]; accent = PALETTE.Glint; }\n    if (fl === 'tholinTuft') { ownV = ['Solis', 'Scorched', 'Arid'][Math.floor(r() * 3)]; body = PALETTE[ownV]; }\n    const lit = (slot) => slot === 3 || (glowy && slot === 1 && (fl === 'bloom' || fl === 'gillButton' || fl === 'rootCurtain'));\n    const hexOf = (slot) => (slot === 3 || lit(slot) ? PALETTE[glowV] : slot === 1 ? accent : slot === 2 ? stem : body);\n    const famOf = (slot) => (lit(slot) ? 0 : Math.max(0, FLORA_FAMS.indexOf(floraFamilyOf(fl, slot))));   // what it is made of (FLORA_PARTS)\n    // Its frame on the grid: up along its face's axis (down, if it hangs), and a sway across it (none under a roof).\n    const ax = fi >> 1, up = (fi & 1) ? -1 : 1, tA = (ax + 1) % 3, tB = (ax + 2) % 3;\n    // WHICH FLORA TAKE A SECOND KUBE-SPACE IS FROZEN on version 4 (life-mining.test.mjs): it is still TODAY'S shape's\n    // answer, drawn from the same point in the same generator. The picked shape (PICKED_SHAPES) shows above its own cell\n    // only where today's shape takes the space above, and is cut there otherwise; where today's was tall and the new\n    // one is not, the space above stays taken, as before.\n    const rT = rngOf(rKey); for (let k = 0; k < drawn; k++) rT();\n    const mT = PICKED_SHAPES[fl] ? modelToday(fl, rT) : null;\n    const m = model(fl, r), phase = r() * 6.2832, sway = F.where === 'water' ? 0.05 : hang ? 0 : 0.035;\n    if (!isGhost) start.push(P.length / 3);\n    const dropK = dropIdx(dropOf(fl, { leaf: leafy ? pg.leaf : pg.leaf2, petal: petalV, glow: glowV, own: ownV, wood: pg.leaf }));   // a ghost names its drop too, so the list is version 14's\n    if (!isGhost) drop.push(dropK);\n    // Where a cube of a shape stands, on the grid (the model at 0.8 of its size, as below).\n    const cubeAt = (mm, j) => { const q = [0, 0, 0], h = mm[j + 1], d = (h + 0.5) * FLORA_CUBE, along = hang ? 1 - d : d;\n      q[ax] = up > 0 ? along : 1 - along; q[tA] = FLORA_INSET + (mm[j] + 0.5) * FLORA_CUBE; q[tB] = FLORA_INSET + (mm[j + 2] + 0.5) * FLORA_CUBE;\n      return [x + q[0], y + q[1], z + q[2]]; };\n    let tallT = 0;                                                  // today's shape's answer (frozen), where a pick replaced it\n    if (mT) for (let j = 0; j < mT.length; j += 4) { const h = mT[j + 1]; if (h < FLORA_SHORT_MAX || h >= FLORA_TALL_MAX) continue;\n      const c = cubeAt(mT, j); if (!ctx.isSolid(Math.floor(c[0]), Math.floor(c[1]), Math.floor(c[2]))) { tallT = 1; break; } }\n    let tall = 0;\n    for (let j = 0; j < m.length; j += 4) {\n      const q = [0, 0, 0], h = m[j + 1];\n      if (mT && !tallT && h >= FLORA_SHORT_MAX) continue;          // a picked shape stays in its cell where today's did\n      if (h >= FLORA_TALL_MAX) continue;                           // no higher than 90% of a second kube-space\n      // FITTED TO ITS KUBE-SPACE (the owner, Sep 30): the model at 0.8 of its size, so it spans the middle 80% of its cell's\n      // width and length; up from the ground, or down from a cave's roof when it hangs.\n      const d = (h + 0.5) * FLORA_CUBE, along = hang ? 1 - d : d;\n      q[ax] = up > 0 ? along : 1 - along;\n      // A vine curtain turned to its wall: its x = 0 against the side the drop's top is on.\n      const mx = wall < 0 ? m[j] : wall === 0 ? m[j] : wall === 1 ? 3 - m[j] : m[j + 2], mz = wall < 0 ? m[j + 2] : wall <= 1 ? m[j + 2] : wall === 2 ? m[j] : 3 - m[j];\n      q[tA] = FLORA_INSET + (mx + 0.5) * FLORA_CUBE; q[tB] = FLORA_INSET + (mz + 0.5) * FLORA_CUBE;\n      const c = [x + q[0], y + q[1], z + q[2]];\n      // Past 90% of its own cell a flora is TALL: it rises into the next kube-space (life-seats.mjs decides whether it\n      // may). A cube that reaches into ground there (a reed under an overhang or into the next face's ground at a rim, a\n      // root curtain longer than its cave is tall) is cut, as an organic's bits are: flora never show in rock.\n      const upper = h >= FLORA_SHORT_MAX ? 1 : 0;\n      if (upper && ctx.isSolid(Math.floor(c[0]), Math.floor(c[1]), Math.floor(c[2]))) continue;\n      if (isGhost) { pal(hexOf(m[j + 3])); ghostCubes++; continue; }   // counted, its colour in the palette as before, and not kept\n      P.push(c[0], c[1], c[2]);\n      C.push(pal(hexOf(m[j + 3]))); G.push(lit(m[j + 3]) ? 1 : 0); U.push(upper); FM.push(famOf(m[j + 3])); tall |= upper;\n      const s = [0, 0, 0]; s[tA] = sway * (hang ? 0 : h); S.push(s[0], s[1], s[2], phase);\n    }\n    if (isGhost) continue;\n    tallL.push(mT ? tallT : tall); hangL.push(hang ? 1 : 0);\n    items.push(x, y, z, fi, cand[i + 4]);\n    counts[fl] = (counts[fl] || 0) + 1;\n  }\n  start.push(P.length / 3);\n  return { n: items.length / 5, items: Int32Array.from(items), palette, counts,\n           cubes: { n: P.length / 3, pos: Float32Array.from(P), col: Uint8Array.from(C), glow: Uint8Array.from(G), sway: Float32Array.from(S), upper: Uint8Array.from(U), fam: Uint8Array.from(FM) },\n           start: Int32Array.from(start), drop: Uint16Array.from(drop), drops, tall: Uint8Array.from(tallL), hang: Uint8Array.from(hangL) };\n}\n// WHAT PICKING ONE GIVES (the owner, Sep 30: \"its material as a bit\"): the organic material its body is made of, in the\n// colour it grows in here. Grass and the rest of the green give their Leaf Biomass, a bloom its Petal, a gill button its\n// cap's fungus, what glows its Glow Biomass, a root curtain its world's Wood, a crystal shoot its Silicate Biomass and a\n// tholin tuft its Tholin Biomass. A bit of each: `floraOf` returns the name for every item, by index into `drops`.\nfunction dropOf(fl, v) {\n  switch (fl) {\n    case 'bloom': return `${v.petal} Petal`;\n    case 'gillButton': return 'Halo Fungal Biomass';\n    case 'glowSprout': case 'glowCarpet': case 'glowThread': case 'glowTile': case 'glowMoss': case 'slimeDrip': return `${v.glow} Glow Biomass`;\n    case 'rootCurtain': return `${v.wood} Wood`;\n    case 'crystalShoot': return `${v.own} Silicate Biomass`;\n    case 'tholinTuft': return `${v.own} Tholin Biomass`;\n    default: return `${v.leaf} Leaf Biomass`;\n  }\n}\n"],"mappings":"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","names":["f"],"file":"flora.mjs"}