{"version":3,"sources":["tool-tiers.mjs"],"sourcesContent":["// Kubicor — TOOL TIERS AND WEAR (the owner's confirmed Tools page, Oct 22, artifact RegiLMrDK41N1HLM9DpxRp).\n// Byte-identical twins: public/tool-tiers.mjs, functions/lib/tool-tiers.mjs, zone-server/lib/tool-tiers.mjs\n// (generate-version-hash.js checks them).\n//\n// A TOOL is one item whatever its tier (the owner: \"Thermos/canister tiers should be crafted with a material and an\n// existing thermos/canister, not be classified as a separate item\"). Its tier and its wear are PER-ITEM STATE, the\n// stack descriptor `x` beside a vessel's fill `q` and blend `mix` (inv-slots.mjs):\n//\n//   x = { t: tier 2..5 (absent: tier I), w: uses spent 1..its tier's uses (absent: unused) }\n//\n// so a new tier-I tool is a plain {n, c} stack, and an upgraded or used one is a different identity that never merges\n// with it.\n// …AND A SEEDLING'S BARK (the owner's Tree Light and Bark picks, Oct 23, w_seed: \"a planted tree keeps its parent's bark\",\n// its seedling \"named for leaves and bark both\"): `k`, the bark's pigment as its place in seedlings.mjs BARK_ORDER\n// (0..BARK_MAX), which a felled tree's seedling carries from the wood it grew and plants again. Still one item per leaf\n// and form (274 of them, not 32 times as many): the bark rides on the stack as a tool's tier does, so seedlings of one\n// bark stack together and never with another's, and a seedling with no bark (every one from before, and the\n// Loamwrights') is a plain {n, c} stack, as ever.\n// A tool is upgraded at a Toolbench with 2 of the next tier's metal, and repaired with its own tier's metal\n// (1 restores half its uses, 2 all of them). At zero uses left it stops working until repaired; it is never lost.\n// Pure: no catalogue, no DOM, no Firestore.\n\nexport const TIER_METALS = Object.freeze(['Iron', 'Copper', 'Aluminum', 'Titanium', 'Steel']);   // I..V\nexport const TIER_COLOURS = Object.freeze(['#5cc85c', '#3fa7ff', '#a26bff', '#ffb000', '#f2f2f2']);   // green, blue, violet, amber, white\nexport const TIER_ROMAN = Object.freeze(['I', 'II', 'III', 'IV', 'V']);\nexport const TIER_MAX = 5;\nexport const TIER_USES = Object.freeze([200, 350, 500, 750, 1000]);   // uses before it needs repair, by tier\nexport const VESSEL_CAP = Object.freeze([1, 2, 3, 4, 6]);             // a Thermos's kubes of liquid / a Canister's draws, by tier\nexport const UPGRADE_METAL_COUNT = 2;                                  // each tier up: the tool + 2 of the new tier's metal\nexport const REPAIR_METAL_HALF = 1, REPAIR_METAL_FULL = 2;             // of its own tier's metal\n\n// THE TIERED TOOLS, by base item name. `kind` says what a use is and where it is fitted:\n//   vessel  held; a use is one fill or one pour (Thermos), one draw or one release (Gas Canister)\n//   held    held; a use is one cut (the Arc Saw: one felling)\n//   module  fitted in a suit slot; a use is one kube mined while it is fitted (Reach: only beyond the bare reach)\nexport const TOOLS = Object.freeze({\n  'Thermos': { kind: 'vessel' },\n  'Gas Canister': { kind: 'vessel' },\n  'Arc Saw': { kind: 'held' },\n  'Laser Focus': { kind: 'module', effect: 'focus' },\n  'Laser Reach': { kind: 'module', effect: 'reach' },\n  'Laser Economy': { kind: 'module', effect: 'economy' },\n  'Laser Splitter': { kind: 'module', effect: 'splitter' },\n  'Shield': { kind: 'module', effect: 'shield' },   // the owner's Black Holes and Nebulas picks, Oct 27, S2: turns aside a young star's flares\n  // ALIEN ANIMALS (the owner's picks, Oct 28): the two weapons (a use is a swing or a shot) and three modules made from\n  // what animals give (a use is nothing yet: they never wear)\n  'Stun Baton': { kind: 'held', weapon: 'baton' },\n  'Dart Launcher': { kind: 'held', weapon: 'darts' },\n  'Hide Strap': { kind: 'module', effect: 'padding' },\n  'Plate Armour': { kind: 'module', effect: 'armour' },\n  'Suit Lining': { kind: 'module', effect: 'lining' },\n});\nexport const isTool = (base) => typeof base === 'string' && Object.prototype.hasOwnProperty.call(TOOLS, base);\nexport const isModule = (base) => isTool(base) && TOOLS[base].kind === 'module';\n\n// ---- the state descriptor ----------------------------------------------------------------------------------------\nconst clampInt = (v, lo, hi) => { const n = Math.floor(Number(v)); return Number.isFinite(n) && n >= lo && n <= hi ? n : null; };\nexport const BARK_MAX = 31;                                            // seedlings.mjs BARK_ORDER: the 32 pigments, 0..31\n// A TROPHY'S ANIMAL (the owner's Alien Animals items, Oct 29): the species key a hunt left it with (fauna.mjs SPECIES ids,\n// 'glidewing'), a short lower-camel word, so it can never carry a separator into a stack's key.\nexport const SPECIES_KEY_RE = /^[a-z][a-zA-Z0-9]{0,23}$/;\n// The stored form, or null when it says nothing (tier I, unused, no bark, no animal): so a plain stack stays {n, c}.\nexport function normX(x) {\n  if (!x || typeof x !== 'object' || Array.isArray(x)) return null;\n  const t = clampInt(x.t, 1, TIER_MAX) || 1;\n  const w = clampInt(x.w, 0, TIER_USES[t - 1]) || 0;\n  const k = Number.isInteger(x.k) ? clampInt(x.k, 0, BARK_MAX) : null;   // a seedling's bark (0 is a bark too: Lumina)\n  const sp = typeof x.sp === 'string' && SPECIES_KEY_RE.test(x.sp) ? x.sp : null;   // a Trophy's animal\n  if (t === 1 && !w && k == null && sp == null) return null;\n  const out = {};\n  if (t > 1) out.t = t;\n  if (w) out.w = w;\n  if (k != null) out.k = k;\n  if (sp != null) out.sp = sp;\n  return out;\n}\n// A stored descriptor that is exactly its own normal form (what an arrangement may carry).\nexport function isNormX(x) { const n = normX(x); return !!n && n.t === x.t && n.w === x.w && n.k === x.k && n.sp === x.sp && Object.keys(x).length === Object.keys(n).length; }\n// Its part of a stack's identity: '' for none, else \"t<tier>w<uses spent>\" for a tool (exactly as before Oct 23),\n// \"k<bark>\" for a seedling's bark, and \"s<species>\" for a Trophy's animal (last: nothing after the s is anything else).\nexport function xKey(x) {\n  const n = normX(x);\n  if (!n) return '';\n  return (n.t || n.w ? `t${n.t || 1}w${n.w || 0}` : '') + (n.k != null ? `k${n.k}` : '') + (n.sp != null ? `s${n.sp}` : '');\n}\n// A Trophy's animal, its species key, or null.\nexport const speciesOfX = (x) => { const n = normX(x); return n && n.sp != null ? n.sp : null; };\n// A seedling's bark, as its place in BARK_ORDER, or null (a stack with none).\nexport const barkOfX = (x) => { const n = normX(x); return n && n.k != null ? n.k : null; };\n\nexport const tierOf = (s) => (s && s.x && clampInt(s.x.t, 1, TIER_MAX)) || 1;\nexport const usesOf = (t) => TIER_USES[Math.min(TIER_MAX, Math.max(1, t)) - 1];\nexport const wearOf = (s) => Math.min(usesOf(tierOf(s)), (s && s.x && clampInt(s.x.w, 0, 1e9)) || 0);\nexport const usesLeft = (s) => usesOf(tierOf(s)) - wearOf(s);\nexport const isWorn = (s) => usesLeft(s) <= 0;\nexport const wearFraction = (s) => wearOf(s) / usesOf(tierOf(s));     // 0 new → 1 worn out\nexport const tierColour = (t) => TIER_COLOURS[Math.min(TIER_MAX, Math.max(1, t)) - 1];\nexport const vesselCapOf = (s) => VESSEL_CAP[tierOf(s) - 1];\n\n// The descriptor after `n` more uses (never past worn out).\nexport function wornBy(x, n) {\n  const t = (x && clampInt(x.t, 1, TIER_MAX)) || 1;\n  const w = Math.min(usesOf(t), ((x && clampInt(x.w, 0, 1e9)) || 0) + Math.max(0, Math.floor(n)));\n  return normX({ t, w });\n}\n\n// ---- upgrading and repairing (at a Toolbench) --------------------------------------------------------------------\n// THE TOP TIER NEEDS TRAVEL (the owner's play review, Oct 23, f10: \"Tier V of every tool and module needs Steel, which\n// is crafted from Iron and Carbon\"; the pick: \"Tie tiers to depth and travel … make the top tier need a metal from\n// another world\"). Every tier's metal could be had from one claim: Iron and Copper dug from its veins, Aluminum and\n// Titanium smelted from the ores in its crust, Steel from its Iron and Carbon. So tier V adds ONE CUT OF COR to the two\n// Steel, and Cor is the one material whose supply is not the same on every world:\n//   - it lies only in a world's CORE (ore-veins.mjs VEIN_BANDS.core, density 5.00+), whose radius layerBands sets at\n//     round(R / 4) - 2: counted with layerAt, the smallest claim (R 12) has a core of 8 cells and the largest (R 48)\n//     8,000, so the cheap first world a new player claims has next to none, and digging to it is the whole radius;\n//   - or it rides in on M-TYPE ASTEROIDS (transient-shape.js TRANSIENT_TYPES, 12% of the rocks passing through a\n//     system), mined from orbit in whatever system has one passing — which may well not be yours today.\n// So tier V is the tier you travel for: to a big world (yours, or a friend's, or one bought), or out to a metallic rock.\n// Only the upgrade takes it. A tier-V tool is still REPAIRED with its own tier's metal, Steel, as every tier is: a\n// repair that needed a trip each time would make wear a chore rather than a cost.\nexport const TOP_TIER_EXTRA = Object.freeze({ metal: 'Cor', count: 1 });\n// What a tool at tier t needs to go up one: 2 of the next tier's metal, and for tier V one Cor besides (`also`, above).\n// Null at tier V. `inputs` is the whole spend as the craft takes it, { metal: count, … }.\nexport function upgradeNeeds(s) {\n  const t = tierOf(s);\n  if (t >= TIER_MAX) return null;\n  const out = { metal: TIER_METALS[t], count: UPGRADE_METAL_COUNT, to: t + 1 };\n  if (out.to === TIER_MAX) out.also = { metal: TOP_TIER_EXTRA.metal, count: TOP_TIER_EXTRA.count };\n  out.inputs = { [out.metal]: out.count, ...(out.also ? { [out.also.metal]: out.also.count } : {}) };\n  return out;\n}\n// \"2 Steel + 1 Cor\": what upgradeNeeds asks for, said as the Toolbench says it.\nexport const upgradeNeedText = (up) => (up ? `${up.count} ${up.metal}` + (up.also ? ` + ${up.also.count} ${up.also.metal}` : '') : '');\n// Its descriptor once upgraded: one tier up, its uses spent unchanged (so the new tier's extra uses are all there).\nexport const upgradedX = (x) => normX({ t: ((x && x.t) || 1) + 1, w: (x && x.w) || 0 });\n// What repairing it with `count` of its own tier's metal does: 1 restores half its uses, 2 all of them. Null when it\n// needs none, or `count` is neither.\nexport function repairNeeds(s) {\n  if (!(wearOf(s) > 0)) return null;\n  const t = tierOf(s), uses = usesOf(t);\n  return { metal: TIER_METALS[t - 1], half: REPAIR_METAL_HALF, full: REPAIR_METAL_FULL,\n           // one metal is enough when half its uses or fewer are spent\n           fullWith: wearOf(s) <= Math.ceil(uses / 2) ? REPAIR_METAL_HALF : REPAIR_METAL_FULL };\n}\nexport function repairedX(x, count) {\n  const t = (x && clampInt(x.t, 1, TIER_MAX)) || 1, uses = usesOf(t);\n  const w = (x && clampInt(x.w, 0, 1e9)) || 0;\n  const back = count >= REPAIR_METAL_FULL ? uses : count >= REPAIR_METAL_HALF ? Math.ceil(uses / 2) : 0;\n  return normX({ t, w: Math.max(0, w - back) });\n}\n\n// ---- the suit modules ---------------------------------------------------------------------------------------------\nexport const FOCUS = Object.freeze([1.25, 1.5, 1.75, 2, 2.5]);        // mining hold ÷ this; energy follows the hold\nexport const REACH_ADD = Object.freeze([1, 2, 3, 4, 5]);               // kubes beyond the bare reach (6 → 7..11)\nexport const ECONOMY = Object.freeze([0.9, 0.8, 0.7, 0.6, 0.5]);       // energy per break × this\n// The Splitter's face, by tier: [across, up, deep] kubes broken by one hold, the aimed kube at its corner nearest you.\nexport const SPLITTER_FACE = Object.freeze([[1, 2, 1], [2, 2, 1], [2, 3, 1], [3, 3, 1], [3, 3, 2]]);\n\n// The modules worn in the suit slots (stacks, any order) → the effect of each kind: the BEST working one of that kind\n// counts (\"Only the best one counts\"); a worn-out module does nothing. { focus: tier | 0, reach, economy, splitter }\n// plus `fitted`, the slot indices of the modules that act (each takes one use per kube mined).\nexport function suitEffects(suit, baseOf = (n) => n) {\n  const out = { focus: 0, reach: 0, economy: 0, splitter: 0, shield: 0, padding: 0, armour: 0, lining: 0, fitted: {} };\n  (suit || []).forEach((s, i) => {\n    if (!s || !s.n) return;\n    const base = baseOf(s.n);\n    if (!isModule(base) || isWorn(s)) return;\n    const e = TOOLS[base].effect, t = tierOf(s);\n    if (t > out[e]) { out[e] = t; out.fitted[e] = i; }\n  });\n  return out;\n}\nexport const focusOf = (fx) => (fx && fx.focus ? FOCUS[fx.focus - 1] : 1);\nexport const economyOf = (fx) => (fx && fx.economy ? ECONOMY[fx.economy - 1] : 1);\nexport const reachAddOf = (fx) => (fx && fx.reach ? REACH_ADD[fx.reach - 1] : 0);\nexport const splitterFaceOf = (fx) => (fx && fx.splitter ? SPLITTER_FACE[fx.splitter - 1] : null);\n// THE ANIMALS' MODULES (Oct 28): what a hit on you is cut by (a Hide Strap's padding, Plate Armour; both count, one after\n// the other) and how far a Suit Lining widens the temperatures you stand, each way.\nexport const PADDING = Object.freeze([0.1, 0.2, 0.3, 0.4, 0.5]);\nexport const ARMOUR = Object.freeze([0.25, 0.3, 0.35, 0.4, 0.45]);\nexport const LINING_C = Object.freeze([20, 40, 60, 80, 100]);\nexport const hitTakenOf = (fx, dmg) => dmg * (fx && fx.padding ? 1 - PADDING[fx.padding - 1] : 1) * (fx && fx.armour ? 1 - ARMOUR[fx.armour - 1] : 1);\nexport const liningOf = (fx) => (fx && fx.lining ? LINING_C[fx.lining - 1] : 0);\n\n// ---- the Arc Saw ----------------------------------------------------------------------------------------------------\n// One hold fells the whole tree from any wood bit it hits: this long, by tier.\nexport const SAW_HOLD_S = Object.freeze([1.5, 1.2, 0.9, 0.6, 0.4]);\nexport const sawHoldOf = (t) => SAW_HOLD_S[Math.min(TIER_MAX, Math.max(1, t)) - 1];\n"],"mappings":"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","names":[],"file":"tool-tiers.mjs"}