{"version":3,"sources":["life-seats.mjs"],"sourcesContent":["// LIFE AS SEATS (the owner, Sep 30: \"all bit-created structures are physical and minable\", and flora \"treated as\n// full-kube structures with a full hitbox\", aimed at and mined but walked through). This module decides, from the\n// generator's own output, where each piece of a world's life stands:\n// - Each organic bit's seat on the bit lattice (bit-slot.js), and the bit it mines as (its material's, from\n//   tools/gen-life-catalogue.py).\n// - Which structure each bit belongs to, and which of its bits that structure stands on: mining one of those fells it.\n// - The cell each flora holds, and the bit picking it gives.\n// Only a version 4 world's life counts (LIFE_SINCE). Version 3's is a look and nothing more (tests/organics.test.mjs).\n//\n// ONE PRECEDENCE, for the page and both servers alike, which is why it lives here and nowhere else. A server that\n// weighed an overlap differently from the page would refuse a bit the player can see, or credit one they can't:\n// 1. The surface rocks come first (natural-bits.mjs, the page's scatter). An organic bit whose seat overlaps a rock's\n//    is not there.\n// 2. An organic bit in a cell a frozen sea's ice fills is not there. It could not be reached, as a rock there cannot.\n// 3. Two organics that grew into one seat hold it in the order they grew: the first keeps it.\n// 4. A flora needs its cell to itself: no rock, no organic bit, no ice and no flora before it.\n// What players built is not weighed here: a placed kube or bit, or a break, is in the world's edits, and each side reads\n// those first, as it does for the rocks.\n//\n// THREE BYTE-IDENTICAL COPIES: public/, functions/lib/ and zone-server/lib/, checked by generate-version-hash.js. No\n// imports, so the same bytes resolve in all three.\n\nexport const LIFE_SINCE = 4;\n// A cell and a seat as one number each: the grid's coordinates (within ±255) packed, and the seat (0 to 26) under it.\nexport const cellKey = (x, y, z) => ((x + 256) * 512 + (y + 256)) * 512 + (z + 256);\nexport const seatKey = (x, y, z, slot) => cellKey(x, y, z) * 32 + slot;\n// A seat's three steps (bit-slot.js stepsToSlot, inlined to keep this import-free), and whether two seats of one cell\n// overlap: they are apart only where they are two steps apart on some axis.\nconst stepsOf = (s) => [Math.floor(s / 9), Math.floor(s / 3) % 3, s % 3];\nconst overlaps = (a, b) => { const p = stepsOf(a), q = stepsOf(b); return Math.abs(p[0] - q[0]) < 2 && Math.abs(p[1] - q[1]) < 2 && Math.abs(p[2] - q[2]) < 2; };\n// Glass veinwood's veins of melt are not a material of their own: cooled, they are tektite (natural glass; the owner's\n// rename of obsidian, Oct 13), and they mine as that.\nexport const MELT_BIT = 'Void Tektite Bit';\n\n// `organics` and `flora` are the generator's (organicsOf, floraOf: rockyFields(...).organics(sea) and .flora(sea)), either\n// may be null. `rocks` lists the rock bits that stand on the world as [x, y, z, slot] (under ice already left out).\n// `blocked(x, y, z)` says whether a frozen sea's ice fills a cell (or is null when there is none).\n// Returns:\n// - Each organic bit that stands, in the order it grew:\n//   - n, cell: Int16Array [x, y, z, …], slot: Uint8Array, bit: Uint16Array (index into `bits`, its bit's name).\n//   - org: Int32Array, the structure it belongs to. base: Uint8Array, 1 where it is one the structure stands on. melt:\n//     Uint8Array, 1 for a vein of melt.\n//   - orgStart: Int32Array, structure k's bits are orgStart[k] to orgStart[k + 1]. faces: its up face, organicsOf's.\n// - at: Map seatKey → bit index. cells: Map cellKey → [bit index, …].\n// - flora:\n//   - n, cell: Int16Array [x, y, z, …], item: Int32Array (index into the generator's items), bit: Uint16Array (into\n//     `bits`, what picking it gives).\n//   - at: Map cellKey → flora index. face: its up face, hang: 1 hanging from a roof, tall: 1 where it takes the next\n//     kube-space too, and above: Map cellKey of that next kube-space → flora index.\n// - (Oct 6, the reservoirs plan) given `habitats` (organics.mjs SPECIES' habitat, by species index) and `floraWhere`\n//   (flora.mjs FLORA's `where`, by flora index): under, Uint8Array, 1 for a bit of a species that grows under water (the\n//   coral that dies out of it), and flora.where, each flora's place ('top', 'shore', 'water', 'surface', 'under').\nexport function lifeSeatsOf({ organics, flora, rocks = [], blocked = null, habitats = null, floraWhere = null }) {\n  const bits = [], bitAt = new Map(), bitIdx = (name) => { let k = bitAt.get(name); if (k == null) { k = bits.length; bits.push(name); bitAt.set(name, k); } return k; };\n  const rockSlots = new Map();\n  for (const [x, y, z, s] of rocks) { const k = cellKey(x, y, z); if (!rockSlots.has(k)) rockSlots.set(k, []); rockSlots.get(k).push(s); }\n  const cell = [], slotL = [], bitL = [], orgL = [], lvlL = [], meltL = [], at = new Map(), cells = new Map();\n  const o = organics && organics.n ? organics : null;\n  for (let i = 0; o && i < o.n; i++) {\n    const hx = o.pos[3 * i], hy = o.pos[3 * i + 1], hz = o.pos[3 * i + 2];\n    const x = Math.floor(hx / 2), y = Math.floor(hy / 2), z = Math.floor(hz / 2);\n    const slot = ((hx & 1) * 2 * 3 + (hy & 1) * 2) * 3 + (hz & 1) * 2;\n    const ck = cellKey(x, y, z), sk = ck * 32 + slot;\n    if (at.has(sk)) continue;                                                      // 3. the first to grow here keeps it\n    if (blocked && blocked(x, y, z)) continue;                                     // 2. under the ice\n    const rs = rockSlots.get(ck);\n    if (rs && rs.some((s) => overlaps(s, slot))) continue;                         // 1. a rock's seat\n    const name = o.names[o.mat[i]], melt = name === 'melt';\n    at.set(sk, orgL.length);\n    if (!cells.has(ck)) cells.set(ck, []);\n    cells.get(ck).push(orgL.length);\n    cell.push(x, y, z); slotL.push(slot); bitL.push(bitIdx(melt ? MELT_BIT : name + ' Bit')); orgL.push(o.org[i]); lvlL.push(o.lvl[i]); meltL.push(melt ? 1 : 0);\n  }\n  // Each structure's bits (they grew one structure after another, so they are runs) and what it stands on: its lowest.\n  const orgs = o ? o.faces.length : 0, orgStart = new Int32Array(orgs + 1), low = new Int16Array(orgs).fill(32767);\n  for (let k = 0; k < orgL.length; k++) { orgStart[orgL[k] + 1]++; if (lvlL[k] < low[orgL[k]]) low[orgL[k]] = lvlL[k]; }\n  for (let k = 0; k < orgs; k++) orgStart[k + 1] += orgStart[k];\n  const base = Uint8Array.from(orgL, (g, k) => (lvlL[k] === low[g] ? 1 : 0));\n  // Which bits stand on the structure's footing as it grew: those a fall can bring down (supportedOf). A piece that grew\n  // apart from it (a crown whose trunk the ground cut off) never falls; it was never held up.\n  const grounded = new Uint8Array(orgL.length), part = { cell: Int16Array.from(cell), slot: Uint8Array.from(slotL), orgStart, base };\n  for (let g = 0; g < orgs; g++) for (const k of supportedOf(part, g, () => true)) grounded[k] = 1;\n  // THE FLORA, each in a cell of its own.\n  const fCell = [], fItem = [], fBit = [], fAt = new Map();\n  for (let i = 0; flora && i < flora.n; i++) {\n    const x = flora.items[5 * i], y = flora.items[5 * i + 1], z = flora.items[5 * i + 2], ck = cellKey(x, y, z);\n    if (fAt.has(ck) || cells.has(ck) || rockSlots.has(ck) || (blocked && blocked(x, y, z))) continue;   // 4. a cell of its own\n    fAt.set(ck, fItem.length);\n    fCell.push(x, y, z); fItem.push(i); fBit.push(bitIdx(flora.drops[flora.drop[i]] + ' Bit'));\n  }\n  // TALL FLORA (the owner, Sep 30: a flora two kubes tall takes all of its own kube-space and no more than 90% of the next).\n  // One whose model rises past its cell (floraOf tall) takes the next cell up, or down when it hangs from a roof, if\n  // nothing else is there: no rock, no organic bit, no flora standing in it or reaching into it first, no ice. Otherwise\n  // it is cut back to its own cell. Decided after every flora has its own cell, so a tall one never takes another's.\n  const fTall = new Uint8Array(fItem.length), fFace = new Uint8Array(fItem.length), fHang = new Uint8Array(fItem.length), fAbove = new Map();\n  for (let k = 0; k < fItem.length; k++) {\n    const i = fItem[k], fi = flora.items[5 * i + 3];\n    fFace[k] = fi; fHang[k] = flora.hang ? flora.hang[i] : 0;\n    if (!flora.tall || !flora.tall[i]) continue;\n    const c = [fCell[3 * k], fCell[3 * k + 1], fCell[3 * k + 2]];\n    c[fi >> 1] += ((fi & 1) ? -1 : 1) * (fHang[k] ? -1 : 1);\n    const ck = cellKey(c[0], c[1], c[2]);\n    if (cells.has(ck) || rockSlots.has(ck) || fAt.has(ck) || fAbove.has(ck) || (blocked && blocked(c[0], c[1], c[2]))) continue;\n    fTall[k] = 1; fAbove.set(ck, k);\n  }\n  const under = new Uint8Array(orgL.length);\n  if (habitats && o && o.orgSp) for (let k = 0; k < orgL.length; k++) under[k] = habitats[o.orgSp[orgL[k]]] === 'under' ? 1 : 0;\n  const fWhere = fItem.map((i) => (floraWhere && flora ? floraWhere[flora.items[5 * i + 4]] || 'top' : 'top'));\n  return {\n    n: orgL.length, cell: Int16Array.from(cell), under, slot: Uint8Array.from(slotL), bit: Uint16Array.from(bitL), org: Int32Array.from(orgL),\n    base, grounded, melt: Uint8Array.from(meltL), orgStart, faces: o ? o.faces : new Uint8Array(0), at, cells, bits,\n    sp: o && o.orgSp ? o.orgSp : null,   // each structure's species (organics.mjs SPECIES index): which trees drop a seedling (seedlings.mjs)\n    barkOf: o && o.barkOf ? o.barkOf : null,   // (version 23) the bark a species grows on a face: a bark-less seedling's (seedlings.mjs)\n    flora: { n: fItem.length, cell: Int16Array.from(fCell), item: Int32Array.from(fItem), bit: Uint16Array.from(fBit), at: fAt,\n             face: fFace, hang: fHang, tall: fTall, above: fAbove, where: fWhere },\n  };\n}\n\n// FELLING (the owner, Sep 30: a structure falls from where it is cut, \"leave a stump depending on where cut\"). What of a\n// structure still stands on its footing: from its lowest bits that are `present(k)`, every present bit face to face with\n// one already reached, in half-cells (the organics' own grid). A Set of bit indices.\nconst halfKey = (L, k) => { const s = L.slot[k];\n  return ((2 * L.cell[3 * k] + (s >= 9 ? 1 : 0) + 600) * 1200 + (2 * L.cell[3 * k + 1] + (Math.floor(s / 3) % 3 ? 1 : 0) + 600)) * 1200 + (2 * L.cell[3 * k + 2] + (s % 3 ? 1 : 0) + 600); };\nexport function supportedOf(L, g, present) {\n  const at = new Map(), out = new Set(), todo = [];\n  for (let k = L.orgStart[g]; k < L.orgStart[g + 1]; k++) if (present(k)) { at.set(halfKey(L, k), k); if (L.base[k]) { out.add(k); todo.push(k); } }\n  const steps = [1200 * 1200, -1200 * 1200, 1200, -1200, 1, -1];\n  while (todo.length) { const h = halfKey(L, todo.pop());\n    for (const d of steps) { const n = at.get(h + d); if (n != null && !out.has(n)) { out.add(n); todo.push(n); } } }\n  return out;\n}\n// What falls once bit `i` is gone: every bit of its structure that grew on its footing, is `present(k)` (i itself is not),\n// and no longer stands on it. [bit index, …].\nexport function fallsAfterCut(L, i, present) {\n  const g = L.org[i], has = (k) => k !== i && present(k), held = supportedOf(L, g, has), out = [];\n  for (let k = L.orgStart[g]; k < L.orgStart[g + 1]; k++) if (k !== i && L.grounded[k] && has(k) && !held.has(k)) out.push(k);\n  return out;\n}\n\n// The structure a bit belongs to, as the seats of every bit of it. [bit index, …], in order.\nexport function structureOf(seats, i) {\n  const g = seats.org[i], out = [];\n  for (let k = seats.orgStart[g]; k < seats.orgStart[g + 1]; k++) out.push(k);\n  return out;\n}\n"],"mappings":"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","names":[],"file":"life-seats.mjs"}