{"version":3,"sources":["storage-motion.mjs"],"sourcesContent":["// STORAGE THAT MOVES (the owner's picks, Oct 22, on the Storage Looks page): the Cabinet's door system (cabinet-doors.mjs)\n// carried over to the LOCKER and the CARGO CRATE, and the Display Case's two new looks. Pure rules, page only: the zone\n// relays these as it relays a cabinet ({ t: 'cab', cells: [the base cell], o }, unchanged: a receiving page looks at what\n// stands in the cell to know what moves), and no server reads anything here.\n//\n// THE PICKS:\n//   LOCKER  'twin'     \"Twin tall doors\": two narrow doors, each half a kube wide and the Locker's full two kubes tall,\n//                      meeting at a centre seam, hinged on their OUTER FRONT corners and swinging out to 90° (never past),\n//                      with the cabinet's soft-close timing (open 350 ms easing out; close 650 ms slowing into the shut).\n//                      Their face (machine-icons.mjs lockerDoorKey): a dark border, vent slots near the top, a 1 x 8 steel\n//                      pull by the seam at mid height; the right door mirrored. The body flat, Framed; the inside black.\n//   CRATE   'drawers'  \"Three drawers, staggered\": the crate's three long drawers across its two-kube front become real\n//                      fronts a sixteenth thick, each with a dark box behind it (the drawer itself, black inside), sliding\n//                      out DRAWER_SLIDE one after another, top first, DRAWER_STAGGER_MS apart, and closing softly (the\n//                      same curves and timings). Their face (machine-icons.mjs crateDrawerKey): a dark border, a light\n//                      label patch at the left, a steel handle in the middle. The gauge strip along the foot stays seen.\n//   WALL    'picture'  \"As a picture\": a case hung on a wall is a flat picture frame (DISPLAY_PICTURE.depth deep), no\n//                      glass, the item's ICON filling it like a painting. The owner's note: \"make the as a picture display\n//                      a sharper image and prefer a darker background\": the icon drawn at DISPLAY_PICTURE.px (the game's\n//                      own picture, app.js kubeIconURL) on DISPLAY_PICTURE.bg, near black.\n//   STAND   'today'    the standing case as it is (a frame round a glass kube on a plinth, the item small and turning).\n//                      The owner's note: \"orient the spinning item similar to how worlds rotate with corners up and down\":\n//                      a kube balanced on a CORNER, its body diagonal vertical (system-view.js VOXEL_CORNER_UP, how every\n//                      world stands), spinning about the vertical; a picture card (anything not a kube) turns upright.\n//\n// THE FRAME: every piece is drawn in the cabinet's frame of its BASE cell (cabinet-doors.mjs cabinetFrame: X right as\n// seen by someone facing the front, Y the cell's up, Z out of the front; (0, 0, 0) the front face's bottom-left corner).\n// A Locker's upper half is the cell above (+Y), so its front is x 0..1, y 0..2; a Cargo Crate's side is the cell to its\n// placer's right (storage-machines.mjs crateSideCell: up × front = Y × Z = +X), so its front is x 0..2, y 0..1.\n\nimport { baseItemOf } from './item-ids.mjs';\nimport { CABINET_MAX_DEG, CABINET_DOOR_THICK, cabinetAngle, cabinetMsToEnd, cabinetLeaves, cabinetFrame, cabinetShutBoards } from './cabinet-doors.mjs';\n\n// ---- WHAT MOVES ---------------------------------------------------------------------------------------------------------\nconst KIND = Object.freeze({ 'Cabinet': 'cabinet', 'Locker': 'locker', 'Cargo Crate': 'crate' });\n// The kind of moving front a piece of storage has, by its name: 'cabinet' (two doors), 'locker' (two tall doors), 'crate'\n// (three drawers), or null. (The world draws a Locker's doors only with its upper half above it, and a crate's drawers only\n// when it is two kubes wide, its side beside it: system-view.js motionKindAt.)\nexport function motionKindOf(n) {\n  if (typeof n !== 'string' || !n) return null;\n  const b = baseItemOf(n);\n  return Object.prototype.hasOwnProperty.call(KIND, b) ? KIND[b] : null;\n}\nexport const hasMovingParts = (n) => motionKindOf(n) != null;\n// Of wood or of metal: the crate's sound by material (metal clanks, wood creaks), as a cabinet's.\nexport const isMetalStorage = (n) => hasMovingParts(n) && /\\((Iron|Aluminum|Copper|Titanium|Steel)\\)$/.test(n);\n// How much of the base cell's frame the front covers: [across (X), up (Y)].\nexport const MOTION_FACE = Object.freeze({ cabinet: Object.freeze([1, 1]), locker: Object.freeze([1, 2]), crate: Object.freeze([2, 1]) });\n\n// ---- THE LOCKER'S DOORS -------------------------------------------------------------------------------------------------\nexport const LOCKER_DOOR_H = 2;\n// The cabinet's two leaves, two kubes tall: hinged on x 0 (the left, turning by −a about Y) and x 1 (the right, by +a).\nexport const lockerLeaves = (aDeg) => cabinetLeaves(aDeg).map((L) => ({ ...L, h: LOCKER_DOOR_H }));\n\n// ---- THE CRATE'S DRAWERS ------------------------------------------------------------------------------------------------\nexport const CRATE_DRAWERS = 3;\nexport const DRAWER_SLIDE = 0.28;          // how far each slides out, in kubes\nexport const DRAWER_STAGGER_MS = 80;       // one after another, top first\n// Where they stand on the front, in face pixels (20 a kube, rows from the top): the rows the crate's picture drew them in\n// (machine-icons.mjs wideFrontKey: 1..6, 7..12, 13..18), so the top border and the gauge strip along the foot (row 19)\n// stay seen; across, from the border at the base's outer edge to the side's (x 1..38 of 40).\nexport const DRAWER_ROWS = Object.freeze([[1, 6], [7, 12], [13, 18]]);\nexport const DRAWER_PX = Object.freeze({ w: 38, h: 6 });\nexport function drawerRects() {\n  return DRAWER_ROWS.map(([r0, r1], i) => ({ i, x0: 1 / 20, x1: 2 - 1 / 20, y0: 1 - (r1 + 1) / 20, y1: 1 - r0 / 20 }));\n}\nconst clamp01 = (p) => (p > 0 ? (p < 1 ? p : 1) : 0);\n// THE DRAWERS NOW: each drawer's open fraction (0 shut, 1 out by DRAWER_SLIDE) for a crate told `o` at `at` while they\n// stood at `from` (one fraction a drawer). Drawer i starts i·DRAWER_STAGGER_MS after the word, holding where it stood\n// until then, and runs the cabinet's curves (open: easeOutCubic over 350 ms; close: (1 − s)^4 over 650 ms). `snap`\n// (reduced motion) goes straight to the end. Returns { f: [..], done }.\nexport function drawerFracs(st, now, snap = false) {\n  const end = st && st.o ? 1 : 0, f = new Array(CRATE_DRAWERS).fill(end);\n  if (!st || snap) return { f, done: true };\n  const from = Array.isArray(st.from) ? st.from : [];\n  let done = true;\n  for (let i = 0; i < CRATE_DRAWERS; i++) {\n    const r = cabinetAngle({ o: st.o, at: (st.at || 0) + i * DRAWER_STAGGER_MS, from: clamp01(from[i] || 0) * CABINET_MAX_DEG }, now, false);\n    f[i] = r.a / CABINET_MAX_DEG; if (!r.done) done = false;\n  }\n  return { f, done };\n}\n// How long until the last drawer reaches the end, in ms (the soft touch is timed to the last one closing).\nexport function drawerMsToEnd(o, from) {\n  let ms = 0;\n  for (let i = 0; i < CRATE_DRAWERS; i++) { const left = cabinetMsToEnd(o, clamp01((from && from[i]) || 0) * CABINET_MAX_DEG); if (left > 0) ms = Math.max(ms, i * DRAWER_STAGGER_MS + left); }\n  return ms;\n}\n\n// ---- ONE INTERFACE FOR THE RENDERER --------------------------------------------------------------------------------------\n// A state is { o, at, from }: `from` the doors' angle in degrees (cabinet, locker) or the drawers' fractions (crate).\nexport const motionShut = (kind) => (kind === 'crate' ? new Array(CRATE_DRAWERS).fill(0) : 0);\nexport function motionPose(kind, st, now, snap = false) {\n  return kind === 'crate' ? drawerFracs(st, now, snap) : cabinetAngle(st, now, snap);\n}\n// Where the parts stand now, as a state's next `from`.\nexport function motionFrom(kind, st, now, snap = false) {\n  const p = motionPose(kind, st, now, snap); return kind === 'crate' ? p.f : p.a;\n}\nexport function motionMsToEnd(kind, o, from) {\n  return kind === 'crate' ? drawerMsToEnd(o, from) : cabinetMsToEnd(o, from || 0);\n}\n\n// ---- THE SHUT PARTS IN THE GRID (the always-3D layer: system-view.js cabinetLayerBuild) ----------------------------------\n// Each shut part's box from the base cell's min corner (min, max on the grid's axes) and its face's axes as grid unit\n// vectors: U across the face (a door: from its hinge to the seam, so the right one wears its look mirrored; a drawer:\n// left to right as seen), V down it, N its thin axis, out of the front. Every part fills the outermost T of its cells\n// (z −T..0 in the frame: the owner, Oct 22, \"within their designated kube-space sizes when closed\"; they stood proud of\n// the front, in the cells in front, until then), the body drawn recessed by T behind them (MOTION_RECESS).\nexport function motionShutBoards(kind, up, f, T = CABINET_DOOR_THICK) {\n  if (kind === 'cabinet') return cabinetShutBoards(up, f, T);\n  const fr = cabinetFrame(up, f);\n  const at = (x, y, z) => [0, 1, 2].map((k) => fr.origin[k] + fr.X[k] * x + fr.Y[k] * y + fr.Z[k] * z);\n  const box = (x0, y0, x1, y1) => { const a = at(x0, y0, -T), b = at(x1, y1, 0); return { min: a.map((v, k) => Math.min(v, b[k])), max: a.map((v, k) => Math.max(v, b[k])) }; };\n  const V = fr.Y.map((v) => -v || 0), N = fr.Z.slice();\n  if (kind === 'locker') return lockerLeaves(0).map((L) => ({ side: L.side, ...box(L.u0, 0, L.u1, LOCKER_DOOR_H), U: fr.X.map((v) => (L.side === 'left' ? v : -v) || 0), V, N }));\n  if (kind === 'crate') return drawerRects().map((d) => ({ side: 'drawer' + d.i, ...box(d.x0, d.y0, d.x1, d.y1), U: fr.X.slice(), V, N }));\n  return [];\n}\n\n// ---- THE BODY BEHIND THEM, AND THE WHOLE PIECE (the owner, Oct 22: \"The hitbox for the wall mounted frame should match its\n// outer dimensions. Same with locker, cargo crate and cabinet\") ----------------------------------------------------------\n// The body's drawn front recedes by the boards' thickness, so a shut board lies in its own cell's outermost sixteenth:\n// system-view.js pushes the front face of each of the piece's 'm:' cells in by MOTION_RECESS (aRecess, the face's index + 1).\nexport const MOTION_RECESS = CABINET_DOOR_THICK;\n// The grid face a piece's front looks out of (its frame's Z), as an index in BoxGeometry's order: +X −X +Y −Y +Z −Z.\nexport function motionFrontFace(up, f) {\n  const Z = cabinetFrame(up, f).Z, k = Z.findIndex((v) => v !== 0);\n  return 2 * k + (Z[k] > 0 ? 0 : 1);\n}\n// THE WHOLE PIECE'S BOX from its base cell's min corner: a Cabinet its cell, a Locker its base and its upper half, a crate its\n// base and its side (MOTION_FACE across and up the frame, one kube deep). With the boards inside their cells this is exactly\n// the piece's outer dimensions: what the aim outlines and holds, either half aimed at.\nexport function motionBodyBox(kind, up, f) {\n  const fr = cabinetFrame(up, f), F = MOTION_FACE[kind] || MOTION_FACE.cabinet;\n  const at = (x, y, z) => [0, 1, 2].map((k) => fr.origin[k] + fr.X[k] * x + fr.Y[k] * y + fr.Z[k] * z);\n  const a = at(0, 0, -1), b = at(F[0], F[1], 0);\n  return { min: a.map((v, k) => Math.min(v, b[k])), max: a.map((v, k) => Math.max(v, b[k])) };\n}\n\n// ---- THE DISPLAY CASE ---------------------------------------------------------------------------------------------------\n// ON A WALL, A PICTURE: a square frame `size` across and `depth` deep on the wall, its bars `bar` wide in the case's\n// material with the Framed dark border, a dark plate `plate` thick inside it, and on the plate the item's icon, drawn at\n// `px` pixels square on the near-black `bg` (the owner: \"a sharper image … a darker background\").\nexport const DISPLAY_PICTURE = Object.freeze({ px: 256, bg: '#141414', depth: 0.08, size: 0.72, bar: 0.06, plate: 0.03 });\n// THE PICTURE'S OUTER BOX from its cell's min corner, for a case hung looking out along facing f (the case's frame,\n// cabinet-doors.mjs cabinetFrame: u across, v up, w from the open face, 0, to the wall, −1): `size` square, centred on the\n// wall face, `depth` out from it. Its hitbox, its outline and what stops the walker (the owner, Oct 22: \"The hitbox for the\n// wall mounted frame should match its outer dimensions\"); the frame system-view.js displayLayerBuild draws in it.\nexport function displayPictureBox(up, f) {\n  const P = DISPLAY_PICTURE, fr = cabinetFrame(up, f), lo = 0.5 - P.size / 2, hi = 0.5 + P.size / 2;\n  const at = (x, y, z) => [0, 1, 2].map((k) => fr.origin[k] + fr.X[k] * x + fr.Y[k] * y + fr.Z[k] * z);\n  const a = at(lo, lo, -1), b = at(hi, hi, -1 + P.depth);\n  return { min: a.map((v, k) => Math.min(v, b[k])), max: a.map((v, k) => Math.max(v, b[k])) };\n}\n// STANDING, the item as today (DISPLAY_STAND.size, its middle at height v), turning DISPLAY_TURN radians a second; a kube\n// stands on its corner.\nexport const DISPLAY_STAND = Object.freeze({ size: 0.36, v: 0.52 });\nexport const DISPLAY_TURN = 0.6;\n// CORNER UP: the rotation that stands a kube's body diagonal (1, 1, 1) straight up (+Y), the very quaternion\n// system-view.js VOXEL_CORNER_UP is (three.js setFromUnitVectors((1, 1, 1)/√3, +Y)): [x, y, z, w].\nexport const CORNER_UP = (() => { const s = 1 / Math.sqrt(3), r = s + 1, q = [-s, 0, s, r], n = Math.hypot(q[0], q[1], q[2], q[3]); return Object.freeze(q.map((v) => v / n)); })();\n// …then spun by `theta` about the vertical: spinY(theta) · CORNER_UP, written into `out` (no allocation a frame).\nexport function cornerUpSpin(theta, out = [0, 0, 0, 1]) {\n  const ay = Math.sin(theta / 2), aw = Math.cos(theta / 2), [bx, by, bz, bw] = CORNER_UP;\n  out[0] = aw * bx + ay * bz; out[1] = ay * bw + aw * by; out[2] = aw * bz - ay * bx; out[3] = aw * bw - ay * by;\n  return out;\n}\n"],"mappings":"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","names":[],"file":"storage-motion.mjs"}