@adatechnology/game-interactables 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/colliders.ts","../src/rng.ts","../src/loot.ts","../src/locale.ts","../src/math.ts","../src/world.ts"],"sourcesContent":["import type { ColliderOptions, WorldCollider } from './types'\n\ninterface Box {\n ids: string[]\n object: string\n u0: number\n u1: number\n v0: number\n v1: number\n y0: number\n y1: number\n}\n\nconst volume = (b: Box): number => (b.u1 - b.u0) * (b.v1 - b.v0) * (b.y1 - b.y0)\nconst overlap = (a0: number, a1: number, b0: number, b1: number): number => Math.max(0, Math.min(a1, b1) - Math.max(a0, b0))\n\nfunction tryMerge(a: Box, b: Box, gap: number, slack: number): Box | null {\n if (a.u0 - gap > b.u1 || b.u0 - gap > a.u1) return null\n if (a.v0 - gap > b.v1 || b.v0 - gap > a.v1) return null\n if (a.y0 - gap > b.y1 || b.y0 - gap > a.y1) return null\n const u0 = Math.min(a.u0, b.u0)\n const u1 = Math.max(a.u1, b.u1)\n const v0 = Math.min(a.v0, b.v0)\n const v1 = Math.max(a.v1, b.v1)\n const y0 = Math.min(a.y0, b.y0)\n const y1 = Math.max(a.y1, b.y1)\n const hull = (u1 - u0) * (v1 - v0) * (y1 - y0)\n const common = overlap(a.u0, a.u1, b.u0, b.u1) * overlap(a.v0, a.v1, b.v0, b.v1) * overlap(a.y0, a.y1, b.y0, b.y1)\n const real = volume(a) + volume(b) - common\n if (hull > real * (1 + slack) + 1e-9) return null\n return { ids: [...a.ids, ...b.ids], object: a.object, u0, u1, v0, v1, y0, y1 }\n}\n\n/**\n * Union overlapping or adjacent colliders of the same object (same rotation) into fewer OBBs.\n * A merge happens only when the merged box adds at most `slack` extra volume over the real union, so coverage is never lost\n * and never grows noticeably. Colliders of different objects or rotations are left alone.\n */\nexport function mergeColliders(list: WorldCollider[], options: Pick<ColliderOptions, 'gap' | 'slack'> = {}): WorldCollider[] {\n const gap = options.gap ?? 0.02\n const slack = options.slack ?? 0.1\n const groups = new Map<string, WorldCollider[]>()\n for (const c of list) {\n const key = `${c.object}|${Math.round(c.ry * 1000)}`\n const g = groups.get(key)\n if (g) g.push(c)\n else groups.set(key, [c])\n }\n const out: WorldCollider[] = []\n for (const g of groups.values()) {\n const ry = g[0]?.ry ?? 0\n const cs = Math.cos(ry)\n const sn = Math.sin(ry)\n let boxes: Box[] = g.map((c) => {\n const u = c.cx * cs - c.cz * sn\n const v = c.cx * sn + c.cz * cs\n return { ids: [c.id], object: c.object, u0: u - c.hw, u1: u + c.hw, v0: v - c.hd, v1: v + c.hd, y0: c.y0, y1: c.y1 }\n })\n let changed = boxes.length > 1\n while (changed) {\n changed = false\n outer: for (let i = 0; i < boxes.length; i++) {\n for (let j = i + 1; j < boxes.length; j++) {\n const m = tryMerge(boxes[i] as Box, boxes[j] as Box, gap, slack)\n if (!m) continue\n boxes = boxes.filter((_, k) => k !== i && k !== j)\n boxes.push(m)\n changed = true\n break outer\n }\n }\n }\n for (const b of boxes) {\n const u = (b.u0 + b.u1) / 2\n const v = (b.v0 + b.v1) / 2\n out.push({\n id: b.ids.length === 1 ? (b.ids[0] as string) : `${b.ids[0]}+${b.ids.length - 1}`,\n object: b.object,\n cx: u * cs + v * sn,\n cz: -u * sn + v * cs,\n hw: (b.u1 - b.u0) / 2,\n hd: (b.v1 - b.v0) / 2,\n ry,\n y0: b.y0,\n y1: b.y1,\n })\n }\n }\n return out\n}\n","/** FNV-1a hash of a string to a 32-bit unsigned integer. */\nexport function hashString(text: string): number {\n let h = 2166136261\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\n/** Deterministic random generator (mulberry32). Returns a function producing floats in [0, 1). Numbers and strings are accepted as seeds. */\nexport function rng(seed: number | string = 1): () => number {\n let a = (typeof seed === 'number' ? Math.floor(seed) >>> 0 : hashString(seed)) || 0x9e3779b9\n return () => {\n a = (a + 0x6d2b79f5) >>> 0\n let t = a\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import { rng } from './rng'\nimport type { ItemCatalog, ItemStack, LootTables, SlotSpec, Vec3 } from './types'\n\n/** True when an item of `size` [w, h, d] fits in a slot of `max`; width and depth may be swapped (the item is turned). */\nexport function fitsSize(size: Vec3, max: Vec3): boolean {\n const eps = 1e-9\n if (size[1] > max[1] + eps) return false\n return (size[0] <= max[0] + eps && size[2] <= max[2] + eps) || (size[2] <= max[0] + eps && size[0] <= max[2] + eps)\n}\n\n/** Does the item type fit the slot. Types missing from the catalog are accepted (the host owns unknown items). */\nexport function fitsSlot(type: string, slot: SlotSpec, items?: ItemCatalog): boolean {\n const def = items?.[type]\n return def ? fitsSize(def.size, slot.max) : true\n}\n\n/**\n * Deterministic contents for a container: one entry per slot. A slot is filled with probability `fill`; the entry is a weighted pick\n * among the table entries whose item fits the slot. Same seed, same table and same slots always give the same result.\n */\nexport function generateLoot(\n tables: LootTables | undefined,\n tableId: string,\n slots: SlotSpec[],\n seed: number | string,\n items?: ItemCatalog,\n): Array<ItemStack | null> {\n const table = tables?.[tableId]\n const out: Array<ItemStack | null> = slots.map(() => null)\n if (!table) return out\n const rand = rng(seed)\n slots.forEach((slot, i) => {\n // Always draw the same number of random values per slot so a change in one slot does not shift the others.\n const roll = rand()\n const pick = rand()\n const q = rand()\n if (roll >= table.fill) return\n const candidates = table.entries.filter((e) => e.weight > 0 && fitsSlot(e.type, slot, items))\n const total = candidates.reduce((s, e) => s + e.weight, 0)\n if (total <= 0) return\n let r = pick * total\n let chosen = candidates[candidates.length - 1]\n for (const e of candidates) {\n r -= e.weight\n if (r < 0) {\n chosen = e\n break\n }\n }\n const [lo, hi] = chosen.qty ?? [1, 1]\n const def = items?.[chosen.type]\n const stackMax = def ? (def.stack ?? 1) : Number.POSITIVE_INFINITY\n const qty = Math.max(1, Math.min(stackMax, lo + Math.floor(q * (hi - lo + 1))))\n out[i] = { type: chosen.type, qty }\n })\n return out\n}\n","import type { InteractablesLocale, Strings } from './types'\n\n/** Engine-level prompts and messages. Content packs add their own keys through `WorldOptions.strings`. */\nexport const locales: Record<InteractablesLocale, Strings> = {\n en: {\n 'prompt.open': 'Open {name}',\n 'prompt.close': 'Close {name}',\n 'prompt.turn_on': 'Turn on {name}',\n 'prompt.turn_off': 'Turn off {name}',\n 'prompt.take': 'Take',\n 'prompt.sit': 'Sit',\n 'prompt.lie_down': 'Lie down',\n 'prompt.get_up': 'Get up',\n 'prompt.light': 'Light',\n 'prompt.change_channel': 'Change channel',\n 'prompt.read': 'Read',\n 'prompt.breaker_on': 'Switch on {circuit}',\n 'prompt.breaker_off': 'Switch off {circuit}',\n 'prompt.open_valve': 'Open valve',\n 'prompt.close_valve': 'Close valve',\n no_power: 'No power',\n no_gas: 'No gas',\n no_water: 'No water',\n locked: 'Locked',\n requires_open: 'Open it first',\n already_lit: 'Already lit',\n needs_ignition: 'Light it first',\n turn_on_first: 'Turn it on first',\n empty: 'Empty',\n full: 'Full',\n },\n 'pt-BR': {\n 'prompt.open': 'Abrir {name}',\n 'prompt.close': 'Fechar {name}',\n 'prompt.turn_on': 'Ligar {name}',\n 'prompt.turn_off': 'Desligar {name}',\n 'prompt.take': 'Pegar',\n 'prompt.sit': 'Sentar',\n 'prompt.lie_down': 'Deitar',\n 'prompt.get_up': 'Levantar',\n 'prompt.light': 'Acender',\n 'prompt.change_channel': 'Trocar de canal',\n 'prompt.read': 'Ler',\n 'prompt.breaker_on': 'Ligar {circuit}',\n 'prompt.breaker_off': 'Desligar {circuit}',\n 'prompt.open_valve': 'Abrir registro',\n 'prompt.close_valve': 'Fechar registro',\n no_power: 'Sem energia',\n no_gas: 'Sem gás',\n no_water: 'Sem água',\n locked: 'Trancado',\n requires_open: 'Abra primeiro',\n already_lit: 'Já está aceso',\n needs_ignition: 'Acenda primeiro',\n turn_on_first: 'Ligue primeiro',\n empty: 'Vazio',\n full: 'Cheio',\n },\n}\n\n/** Pick a built-in locale for an arbitrary tag (`pt`, `pt-br`, `en-GB`...). Unknown tags give `en`. */\nexport function pickLocale(locale: string | undefined): InteractablesLocale {\n if (!locale) return 'en'\n const l = locale.toLowerCase()\n if (l === 'pt-br' || l === 'pt') return 'pt-BR'\n return 'en'\n}\n\n/**\n * Merged table for a locale: built-in `en`, then the built-in table of `locale`, then the extra strings for `en` and for `locale`.\n * Lookup therefore falls back to English, and the caller never gets undefined for engine keys.\n */\nexport function resolveStrings(locale?: string, extra?: Partial<Record<InteractablesLocale, Strings>>): Strings {\n const loc = pickLocale(locale)\n return { ...locales.en, ...locales[loc], ...(extra?.en ?? {}), ...(loc === 'en' ? {} : (extra?.[loc] ?? {})) }\n}\n\n/** Replace `{name}` placeholders. Unknown placeholders are left untouched. */\nexport function format(text: string, vars?: Record<string, string | number>): string {\n if (!vars) return text\n return text.replace(/\\{(\\w+)\\}/g, (m, k: string) => (k in vars ? String(vars[k]) : m))\n}\n","import type { Motion, Transform, Vec3 } from './types'\n\nexport interface Pose {\n /** Translation relative to the pivot. */\n position: Vec3\n /** Rotation around `axis` (in the part frame) by `angle` radians. */\n rotation: { axis: Vec3; angle: number }\n scale: Vec3\n}\n\nconst DEFAULT_AXIS: Vec3 = [0, 1, 0]\n\n/**\n * Pose of a part at animation value `t` (0..1), relative to its pivot, so any renderer can apply it:\n * `position`, then `rotation` around the pivot, then `scale` along the axis.\n */\nexport function poseOf(motion: Motion, t: number): Pose {\n const tt = Math.max(0, Math.min(1, t))\n const axis = motion.axis ?? DEFAULT_AXIS\n const pose: Pose = { position: [0, 0, 0], rotation: { axis: [axis[0], axis[1], axis[2]], angle: 0 }, scale: [1, 1, 1] }\n switch (motion.kind) {\n case 'hinge':\n case 'rocker':\n case 'knob':\n pose.rotation.angle = (motion.angle ?? Math.PI / 2) * tt\n break\n case 'slide': {\n const d = (motion.distance ?? 0.4) * tt\n pose.position = [axis[0] * d, axis[1] * d, axis[2] * d]\n break\n }\n case 'scale': {\n const k = 1 + ((motion.scale ?? 0.2) - 1) * tt\n pose.scale = [axis[0] !== 0 ? k : 1, axis[1] !== 0 ? k : 1, axis[2] !== 0 ? k : 1]\n break\n }\n }\n return pose\n}\n\n/** Rotate a vector around +y by `ry` radians (same convention as three.js `rotation.y`). */\nexport function rotY(v: Vec3, ry: number): Vec3 {\n const c = Math.cos(ry)\n const s = Math.sin(ry)\n return [c * v[0] + s * v[2], v[1], -s * v[0] + c * v[2]]\n}\n\n/** Object-local point to world space. */\nexport function localToWorld(transform: Transform, v: Vec3): Vec3 {\n const r = rotY(v, transform.ry)\n return [transform.x + r[0], transform.y + r[1], transform.z + r[2]]\n}\n\n/** World point to object-local space. */\nexport function worldToLocal(transform: Transform, v: Vec3): Vec3 {\n return rotY([v[0] - transform.x, v[1] - transform.y, v[2] - transform.z], -transform.ry)\n}\n\n/** Rodrigues rotation of `v` around a unit-length-normalised `axis` by `angle`. */\nexport function rotateAxis(v: Vec3, axis: Vec3, angle: number): Vec3 {\n const len = Math.hypot(axis[0], axis[1], axis[2]) || 1\n const k: Vec3 = [axis[0] / len, axis[1] / len, axis[2] / len]\n const c = Math.cos(angle)\n const s = Math.sin(angle)\n const dot = k[0] * v[0] + k[1] * v[1] + k[2] * v[2]\n const cross: Vec3 = [k[1] * v[2] - k[2] * v[1], k[2] * v[0] - k[0] * v[2], k[0] * v[1] - k[1] * v[0]]\n return [v[0] * c + cross[0] * s + k[0] * dot * (1 - c), v[1] * c + cross[1] * s + k[1] * dot * (1 - c), v[2] * c + cross[2] * s + k[2] * dot * (1 - c)]\n}\n\nexport function clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v\n}\n\nexport function dist3(a: Vec3, b: Vec3): number {\n return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\n}\n","import { mergeColliders } from './colliders'\nimport { fitsSlot, generateLoot } from './loot'\nimport { format, resolveStrings } from './locale'\nimport { clamp, dist3, localToWorld, rotateAxis, rotY, worldToLocal } from './math'\nimport type {\n ActiveEmitter,\n BurnerSpec,\n ColliderOptions,\n DeviceSpec,\n FixtureSpec,\n FuelSourceSpec,\n Interactable,\n InteractionSpec,\n ItemStack,\n ObjectSpec,\n PartSpec,\n SeatResult,\n SoftSpec,\n TankSpec,\n TargetOptions,\n Transform,\n Vec3,\n World,\n WorldCollider,\n WorldEvent,\n WorldObject,\n WorldOptions,\n WorldState,\n} from './types'\n\n// ---------------------------------------------------------------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------------------------------------------------------------\n\nconst DEFAULT_ACTOR = 'player'\nconst DEFAULT_RADIUS = 1.2\nconst AUTO_RANGE = 2\nconst SMOKE_TAIL = 20\nconst FLUSH_SECONDS = 2\nconst ACTOR_HEIGHT = 1.7\nconst PUSH_GAIN = 1.2\nconst SWEEP_STEPS = 24\nconst FLOW_DEFAULTS: Record<string, number> = { tap: 6, shower: 8, utility_sink: 6, flush: 0, hose: 10, filter: 1 }\n\n// ---------------------------------------------------------------------------------------------------------------------------------\n// Internal state\n// ---------------------------------------------------------------------------------------------------------------------------------\n\ninterface PartState {\n spec: PartSpec\n t: number\n target: number\n maxT: number\n}\n\ninterface DeviceState {\n spec: DeviceSpec\n on: boolean\n channel: number\n}\n\ninterface FuelState {\n spec: FuelSourceSpec\n level: number\n}\n\ninterface BurnerState {\n spec: BurnerSpec\n on: boolean\n lit: boolean\n /** Seconds of smoke left after a solid-fuel fire went out. */\n smoke: number\n}\n\ninterface TankState {\n spec: TankSpec\n level: number\n}\n\ninterface FixtureState {\n spec: FixtureSpec\n on: boolean\n flowing: boolean\n /** Delivered / wanted in the last step, 0..1. */\n frac: number\n /** Seconds left of a flush. */\n timer: number\n}\n\ninterface SoftState {\n spec: SoftSpec\n ax: number\n az: number\n vax: number\n vaz: number\n phase: number\n}\n\ninterface DamageState {\n max: number\n hp: number\n}\n\ninterface ObjState {\n id: string\n public: WorldObject\n spec: ObjectSpec\n parts: Map<string, PartState>\n contents: Map<string, Array<ItemStack | null>>\n devices: Map<string, DeviceState>\n fuels: Map<string, FuelState>\n burners: Map<string, BurnerState>\n tanks: Map<string, TankState>\n fixtures: Map<string, FixtureState>\n soft: Map<string, SoftState>\n hp: Map<string, DamageState>\n interactions: InteractionSpec[]\n}\n\nfunction cloneStack(s: ItemStack | null): ItemStack | null {\n return s ? { type: s.type, qty: s.qty, ...(s.data ? { data: JSON.parse(JSON.stringify(s.data)) as Record<string, unknown> } : {}) } : null\n}\n\nfunction humanize(id: string): string {\n const s = id.replace(/[_-]+/g, ' ').trim()\n return s.charAt(0).toUpperCase() + s.slice(1)\n}\n\n// ---------------------------------------------------------------------------------------------------------------------------------\n// World\n// ---------------------------------------------------------------------------------------------------------------------------------\n\nexport function createWorld(options: WorldOptions = {}): World {\n const seed = options.seed ?? 1\n const objs = new Map<string, ObjState>()\n const breakers = new Map<string, boolean>()\n const seats = new Map<string, { object: string; seat: string }>()\n const plugs = new Map<string, string | null>()\n let locale = options.locale ?? 'en'\n let table = resolveStrings(locale, options.strings)\n let grid = options.grid ?? true\n let rain = options.rain ?? 0\n let wind: [number, number] = options.wind ? [options.wind[0], options.wind[1]] : [0, 0]\n let defaultTank: string | null = null\n let defaultTankExplicit = false\n let time = 0\n\n // ------------------------------------------------------------------ text & events\n function t(key: string, vars?: Record<string, string | number>): string {\n return format(table[key] ?? key, vars)\n }\n\n function emit(e: WorldEvent): void {\n options.onEvent?.(e)\n }\n\n function message(key: string): void {\n emit({ type: 'message', key, text: t(key) })\n }\n\n // ------------------------------------------------------------------ lookup helpers\n function gid(o: ObjState, local: string): string {\n return `${o.id}:${local}`\n }\n\n /** Find the first entity matching a world-wide id `objectId:localId`. */\n function findGlobal<T>(id: string, pick: (o: ObjState, local: string) => T | undefined): { o: ObjState; value: T; local: string } | null {\n for (const o of objs.values()) {\n if (!id.startsWith(o.id + ':')) continue\n const local = id.slice(o.id.length + 1)\n const value = pick(o, local)\n if (value !== undefined) return { o, value, local }\n }\n return null\n }\n\n function objectOrThrow(id: string): ObjState {\n const o = objs.get(id)\n if (!o) throw new Error(`Unknown object \"${id}\"`)\n return o\n }\n\n function originOf(o: ObjState): Vec3 {\n const tr = o.public.transform\n return [tr.x, tr.y, tr.z]\n }\n\n function toWorld(o: ObjState, v: Vec3): Vec3 {\n return localToWorld(o.public.transform, v)\n }\n\n // ------------------------------------------------------------------ parts\n function openThreshold(p: PartState): number {\n return Math.min(0.5, p.maxT * 0.9)\n }\n\n function isOpen(o: ObjState, partId: string | undefined): boolean {\n if (!partId) return true\n const p = o.parts.get(partId)\n if (!p) return true\n return p.maxT >= 0.1 && p.t >= openThreshold(p)\n }\n\n function targetIsOpen(p: PartState): boolean {\n return p.maxT >= 0.1 && p.target >= openThreshold(p)\n }\n\n function writeT(o: ObjState, p: PartState, v: number): void {\n p.t = v\n o.public.parts[p.spec.id] = v\n }\n\n function gated(o: ObjState, p: PartState): boolean {\n return !!p.spec.requires && o.parts.has(p.spec.requires) && !isOpen(o, p.spec.requires)\n }\n\n function setOnePart(o: ObjState, p: PartState, target: number, instant: boolean): void {\n const next = clamp(target, 0, p.maxT)\n const changed = next !== p.target\n p.target = next\n if (instant) writeT(o, p, next)\n if (changed || instant) emit({ type: 'part', object: o.id, part: p.spec.id, t: p.t, target: p.target })\n }\n\n function setPartTarget(o: ObjState, partId: string, target: number, instant = false): void {\n const p = o.parts.get(partId)\n if (!p) return\n const group = p.spec.group\n const members = group ? [...o.parts.values()].filter((q) => q.spec.group === group) : [p]\n for (const q of members) {\n setOne(o, q, target, instant)\n }\n }\n\n function setOne(o: ObjState, p: PartState, target: number, instant: boolean): void {\n setOnePart(o, p, target, instant)\n // a part that other parts require closes them with it (the drawer behind a door closes with the door)\n if (!targetIsOpen(p)) {\n for (const q of o.parts.values()) {\n if (q.spec.requires === p.spec.id && q.target > 0) setPartTarget(o, q.spec.id, 0, instant)\n }\n }\n }\n\n /** Frame of a part right now: rotation (axis in object-local, angle) and translation, both about its pivot. */\n function partFrame(o: ObjState, partId: string | undefined): { pivot: Vec3; axis: Vec3; angle: number; offset: Vec3 } | null {\n if (!partId) return null\n const p = o.parts.get(partId)\n if (!p) return null\n const m = p.spec.motion\n const axis = rotY(m.axis ?? [0, 1, 0], p.spec.ry ?? 0)\n const frame = { pivot: p.spec.pivot, axis, angle: 0, offset: [0, 0, 0] as Vec3 }\n if (m.kind === 'slide') {\n const d = (m.distance ?? 0.4) * p.t\n frame.offset = [axis[0] * d, axis[1] * d, axis[2] * d]\n } else if (m.kind !== 'scale') {\n frame.angle = (m.angle ?? Math.PI / 2) * p.t\n }\n return frame\n }\n\n function applyPart(o: ObjState, partId: string | undefined, local: Vec3): Vec3 {\n const f = partFrame(o, partId)\n if (!f) return local\n const rel: Vec3 = [local[0] - f.pivot[0], local[1] - f.pivot[1], local[2] - f.pivot[2]]\n const r = f.angle !== 0 ? rotateAxis(rel, f.axis, f.angle) : rel\n return [f.pivot[0] + r[0] + f.offset[0], f.pivot[1] + r[1] + f.offset[1], f.pivot[2] + r[2] + f.offset[2]]\n }\n\n /** Moves the full closed-pose slab of a part and returns the largest t whose pose keeps every sampled point clear. */\n function fitBounds(o: ObjState, p: PartState, b: NonNullable<PartSpec['bounds']>, blockedAt: (x: number, z: number) => boolean): number {\n const STEP = 0.05\n const ANGLES = 48\n const m = p.spec.motion\n const axis = rotY(m.axis ?? [0, 1, 0], p.spec.ry ?? 0)\n const lo: Vec3 = [Math.min(b[0], b[3]), Math.min(b[1], b[4]), Math.min(b[2], b[5])]\n const hi: Vec3 = [Math.max(b[0], b[3]), Math.max(b[1], b[4]), Math.max(b[2], b[5])]\n const axisPoints = (i: number): number[] => {\n const n = Math.max(1, Math.ceil((hi[i] - lo[i]) / STEP))\n return Array.from({ length: n + 1 }, (_, k) => lo[i] + ((hi[i] - lo[i]) * k) / n)\n }\n const xs = axisPoints(0)\n const ys = axisPoints(1)\n const zs = axisPoints(2)\n // `blocked` only sees x/z, so only the floor footprint matters. About a vertical axis (and for slides) y never changes\n // the footprint, so the x/z outline is enough; otherwise the footprint boundary is the projection of the box edges.\n const flat = m.kind === 'slide' || Math.abs(axis[1]) > 0.999\n const seen = new Set<string>()\n const pts: Vec3[] = []\n const add = (x: number, y: number, z: number): void => {\n const key = `${x.toFixed(5)},${y.toFixed(5)},${z.toFixed(5)}`\n if (seen.has(key)) return\n seen.add(key)\n pts.push([x, y, z])\n }\n if (flat) {\n for (const x of xs) for (const z of [lo[2], hi[2]]) add(x, lo[1], z)\n for (const z of zs) for (const x of [lo[0], hi[0]]) add(x, lo[1], z)\n } else {\n for (const x of xs) for (const y of [lo[1], hi[1]]) for (const z of [lo[2], hi[2]]) add(x, y, z)\n for (const y of ys) for (const x of [lo[0], hi[0]]) for (const z of [lo[2], hi[2]]) add(x, y, z)\n for (const z of zs) for (const x of [lo[0], hi[0]]) for (const y of [lo[1], hi[1]]) add(x, y, z)\n }\n const tr = o.public.transform\n const pivot = p.spec.pivot\n for (let i = 1; i <= ANGLES; i++) {\n const tt = i / ANGLES\n const angle = m.kind === 'slide' ? 0 : (m.angle ?? Math.PI / 2) * tt\n const d = m.kind === 'slide' ? (m.distance ?? 0.4) * tt : 0\n for (const [x, y, z] of pts) {\n let q: Vec3 = [x, y, z]\n if (angle !== 0) {\n const r = rotateAxis([x - pivot[0], y - pivot[1], z - pivot[2]], axis, angle)\n q = [pivot[0] + r[0], pivot[1] + r[1], pivot[2] + r[2]]\n }\n const w = localToWorld(tr, [q[0] + axis[0] * d, 0, q[2] + axis[2] * d])\n if (blockedAt(w[0], w[2])) return (i - 1) / ANGLES\n }\n }\n return 1\n }\n\n function fitSweep(objectId: string, partId: string, blocked: (x: number, z: number) => boolean): number {\n const o = objectOrThrow(objectId)\n const p = o.parts.get(partId)\n if (!p) throw new Error(`Unknown part \"${partId}\" on \"${objectId}\"`)\n const sweep = p.spec.sweep\n let result = 1\n const bounds = p.spec.bounds\n const mk = p.spec.motion.kind\n if (bounds && (mk === 'hinge' || mk === 'rocker' || mk === 'knob' || mk === 'slide')) {\n result = fitBounds(o, p, bounds, blocked)\n } else if (sweep) {\n const x0 = Math.min(sweep[0], sweep[2])\n const x1 = Math.max(sweep[0], sweep[2])\n const z0 = Math.min(sweep[1], sweep[3])\n const z1 = Math.max(sweep[1], sweep[3])\n const tr = o.public.transform\n const hit = (lx: number, lz: number): boolean => {\n const w = localToWorld(tr, [lx, 0, lz])\n return blocked(w[0], w[2])\n }\n const m = p.spec.motion\n const axis = rotY(m.axis ?? [0, 1, 0], p.spec.ry ?? 0)\n if (m.kind === 'hinge' || m.kind === 'rocker' || m.kind === 'knob') {\n if (Math.abs(axis[1]) >= 0.5) {\n const angle = m.angle ?? Math.PI / 2\n const total = -angle * Math.sign(axis[1])\n const [px, , pz] = p.spec.pivot\n const cx = (x0 + x1) / 2\n const cz = (z0 + z1) / 2\n const w = x1 - x0\n const d = z1 - z0\n const radius = Math.abs(angle) > 1.7 ? Math.min(w, d) : Math.max(w, d)\n const tol = 0.05\n const inRect = (x: number, z: number) => x >= x0 - tol && x <= x1 + tol && z >= z0 - tol && z <= z1 + tol\n const centered = Math.hypot(cx - px, cz - pz) < 1e-6\n const mid = Math.atan2(cz - pz, cx - px)\n for (let i = 1; i <= SWEEP_STEPS && result === 1; i++) {\n const tt = i / SWEEP_STEPS\n let isHit = false\n if (centered) {\n for (let x = x0; x <= x1 + 1e-9 && !isHit; x += 0.1) for (let z = z0; z <= z1 + 1e-9 && !isHit; z += 0.1) isHit = hit(x, z)\n } else {\n const phi = mid - total / 2 + total * tt\n const steps = Math.max(2, Math.ceil(radius / 0.1))\n for (let k = 1; k <= steps && !isHit; k++) {\n const r = (radius * k) / steps\n const x = px + Math.cos(phi) * r\n const z = pz + Math.sin(phi) * r\n if (inRect(x, z)) isHit = hit(x, z)\n }\n }\n if (isHit) result = (i - 1) / SWEEP_STEPS\n }\n }\n } else if (m.kind === 'slide') {\n const len = Math.hypot(axis[0], axis[2])\n if (len > 1e-6) {\n const dx = axis[0] / len\n const dz = axis[2] / len\n const proj = [x0 * dx + z0 * dz, x1 * dx + z0 * dz, x0 * dx + z1 * dz, x1 * dx + z1 * dz]\n const pmin = Math.min(...proj)\n const pmax = Math.max(...proj)\n const nx = Math.max(1, Math.ceil((x1 - x0) / 0.1))\n const nz = Math.max(1, Math.ceil((z1 - z0) / 0.1))\n for (let i = 1; i <= SWEEP_STEPS && result === 1; i++) {\n const limit = pmin + (pmax - pmin) * (i / SWEEP_STEPS)\n let isHit = false\n for (let a = 0; a <= nx && !isHit; a++) {\n for (let b = 0; b <= nz && !isHit; b++) {\n const x = x0 + ((x1 - x0) * a) / nx\n const z = z0 + ((z1 - z0) * b) / nz\n if (x * dx + z * dz <= limit + 1e-9 && hit(x, z)) isHit = true\n }\n }\n if (isHit) result = (i - 1) / SWEEP_STEPS\n }\n }\n }\n }\n p.maxT = result\n if (p.target > result) p.target = result\n if (p.t > result) writeT(o, p, result)\n return result\n }\n\n // ------------------------------------------------------------------ containers\n function containerOf(o: ObjState, id: string) {\n return o.spec.containers?.find((c) => c.id === id)\n }\n\n function accessible(objectId: string, containerId: string): boolean {\n const o = objs.get(objectId)\n if (!o) return false\n const c = containerOf(o, containerId)\n if (!c) return false\n return isOpen(o, c.access)\n }\n\n function contents(objectId: string, containerId: string): Array<ItemStack | null> {\n return (objs.get(objectId)?.contents.get(containerId) ?? []).map(cloneStack)\n }\n\n function take(objectId: string, containerId: string, slot: number, actor: string = DEFAULT_ACTOR): ItemStack | null {\n const o = objs.get(objectId)\n if (!o) return null\n const list = o.contents.get(containerId)\n if (!list || !accessible(objectId, containerId)) return null\n const stack = list[slot]\n if (!stack) return null\n const def = options.items?.[stack.type]\n if (def && def.pickable === false) return null\n list[slot] = null\n emit({ type: 'pickup', object: objectId, container: containerId, slot, stack: cloneStack(stack) as ItemStack, actor })\n return stack\n }\n\n function put(objectId: string, containerId: string, stack: ItemStack): number | null {\n const o = objs.get(objectId)\n if (!o) return null\n const c = containerOf(o, containerId)\n const list = o.contents.get(containerId)\n if (!c || !list || !accessible(objectId, containerId)) return null\n const maxStack = options.items?.[stack.type]?.stack ?? 1\n for (let i = 0; i < list.length; i++) {\n const cur = list[i]\n if (cur && cur.type === stack.type && !cur.data && !stack.data && cur.qty + stack.qty <= maxStack) {\n cur.qty += stack.qty\n return i\n }\n }\n for (let i = 0; i < list.length; i++) {\n if (!list[i] && fitsSlot(stack.type, c.slots[i], options.items)) {\n list[i] = cloneStack(stack)\n return i\n }\n }\n message('full')\n return null\n }\n\n function slotPosition(objectId: string, containerId: string, slot: number): Vec3 {\n const o = objectOrThrow(objectId)\n const c = containerOf(o, containerId)\n const s = c?.slots[slot]\n if (!c || !s) throw new Error(`Unknown slot ${slot} of \"${containerId}\" on \"${objectId}\"`)\n return toWorld(o, applyPart(o, s.part, s.pos))\n }\n\n // ------------------------------------------------------------------ power\n function rebuildPlugs(): void {\n plugs.clear()\n const sockets: Array<{ id: string; pos: Vec3; circuit?: string; local: string }> = []\n for (const o of objs.values()) {\n for (const s of o.spec.sockets ?? []) sockets.push({ id: gid(o, s.id), local: s.id, pos: toWorld(o, s.pos), circuit: s.circuit })\n }\n const used = new Set<string>()\n const autos: Array<{ o: ObjState; d: DeviceState }> = []\n for (const o of objs.values()) {\n for (const d of o.devices.values()) {\n const key = gid(o, d.spec.id)\n const want = d.spec.socket\n if (want === undefined || d.spec.circuit) {\n plugs.set(key, null)\n } else if (want === 'auto') {\n plugs.set(key, null)\n autos.push({ o, d })\n } else {\n const s = sockets.find((x) => x.id === want) ?? sockets.find((x) => x.id === gid(o, want)) ?? sockets.find((x) => x.local === want)\n plugs.set(key, s ? s.id : null)\n if (s) used.add(s.id)\n }\n }\n }\n for (const { o, d } of autos) {\n const from = d.spec.plug ? toWorld(o, d.spec.plug) : originOf(o)\n let best: (typeof sockets)[number] | null = null\n let bestD = AUTO_RANGE\n for (const s of sockets) {\n if (used.has(s.id)) continue\n const dd = dist3(from, s.pos)\n if (dd <= bestD) {\n best = s\n bestD = dd\n }\n }\n if (best) {\n used.add(best.id)\n plugs.set(gid(o, d.spec.id), best.id)\n }\n }\n }\n\n function breaker(circuit: string): boolean {\n return breakers.get(circuit) ?? true\n }\n\n function devicePowered(o: ObjState, d: DeviceState): boolean {\n if (d.spec.electric === false) return true\n if (!grid) return false\n if (d.spec.circuit) return breaker(d.spec.circuit)\n if (d.spec.socket === undefined) return false\n const sid = plugs.get(gid(o, d.spec.id))\n if (!sid) return false\n const found = findGlobal(sid, (oo, local) => oo.spec.sockets?.find((s) => s.id === local))\n if (!found) return false\n return found.value.circuit ? breaker(found.value.circuit) : true\n }\n\n function getDevice(objectId: string, deviceId: string): { o: ObjState; d: DeviceState } | null {\n const o = objs.get(objectId)\n const d = o?.devices.get(deviceId)\n return o && d ? { o, d } : null\n }\n\n function powerSnapshot(): Map<string, boolean> {\n const m = new Map<string, boolean>()\n for (const o of objs.values()) for (const d of o.devices.values()) m.set(gid(o, d.spec.id), d.on && devicePowered(o, d))\n return m\n }\n\n function emitPowerChanges(before: Map<string, boolean>): void {\n for (const o of objs.values()) {\n for (const d of o.devices.values()) {\n const key = gid(o, d.spec.id)\n const now = d.on && devicePowered(o, d)\n if (before.get(key) !== now && d.on) emit({ type: 'device', object: o.id, device: d.spec.id, on: d.on, powered: devicePowered(o, d), channel: d.spec.kind === 'screen' ? d.channel : undefined })\n }\n }\n }\n\n function setDeviceOn(o: ObjState, d: DeviceState, on: boolean): void {\n d.on = on\n if (d.spec.part) setPartTarget(o, d.spec.part, on ? 1 : 0)\n const powered = devicePowered(o, d)\n emit({ type: 'device', object: o.id, device: d.spec.id, on, powered, channel: d.spec.kind === 'screen' ? d.channel : undefined })\n if (on && !powered) message('no_power')\n }\n\n function setDevice(objectId: string, deviceId: string, on: boolean): boolean {\n const f = getDevice(objectId, deviceId)\n if (!f) return false\n if (f.d.on !== on) setDeviceOn(f.o, f.d, on)\n return true\n }\n\n function setFixture(objectId: string, fixtureId: string, on: boolean): boolean {\n const fx = objs.get(objectId)?.fixtures.get(fixtureId)\n if (!fx) return false\n if (fx.on !== on) toggleFixture(objs.get(objectId) as ObjState, fixtureId)\n return fx.on === on\n }\n\n function setBurner(objectId: string, burnerId: string, on: boolean): boolean {\n const o = objs.get(objectId)\n const b = o?.burners.get(burnerId)\n if (!o || !b) return false\n const isOn = b.on || b.lit\n if (on === isOn) return true\n if (!on) return toggleBurner(o, burnerId)\n return b.spec.needsIgnition ? ignite(o, burnerId) : toggleBurner(o, burnerId)\n }\n\n function resolveDevice(o: ObjState, id: string): { o: ObjState; d: DeviceState } | null {\n if (id.includes(':')) {\n const f = findGlobal(id, (oo, local) => oo.devices.get(local))\n return f ? { o: f.o, d: f.value } : null\n }\n const local = o.devices.get(id)\n if (local) return { o, d: local }\n for (const oo of objs.values()) {\n const d = oo.devices.get(id)\n if (d) return { o: oo, d }\n }\n return null\n }\n\n function switchIsOn(o: ObjState, spec: { part?: string; controls: string[] }): boolean {\n if (spec.part && o.parts.has(spec.part)) return targetIsOpen(o.parts.get(spec.part) as PartState)\n return spec.controls.some((id) => resolveDevice(o, id)?.d.on)\n }\n\n function toggleSwitch(o: ObjState, id: string): boolean {\n const sw = o.spec.switches?.find((s) => s.id === id)\n if (!sw) return false\n const on = !switchIsOn(o, sw)\n if (sw.part) setPartTarget(o, sw.part, on ? 1 : 0)\n let unpowered = false\n for (const ref of sw.controls) {\n const r = resolveDevice(o, ref)\n if (!r) continue\n r.d.on = on\n if (r.d.spec.part) setPartTarget(r.o, r.d.spec.part, on ? 1 : 0)\n const powered = devicePowered(r.o, r.d)\n if (on && !powered) unpowered = true\n emit({ type: 'device', object: r.o.id, device: r.d.spec.id, on, powered })\n }\n emit({ type: 'switch', object: o.id, switch: sw.id, on })\n if (unpowered) message('no_power')\n return true\n }\n\n // ------------------------------------------------------------------ fuel\n function resolveFuel(o: ObjState, b: BurnerState): { o: ObjState; f: FuelState } | null {\n const want = b.spec.fuel\n if (want === 'auto') {\n const from = toWorld(o, b.spec.pos)\n let best: { o: ObjState; f: FuelState } | null = null\n let bestD = AUTO_RANGE\n for (const oo of objs.values()) {\n for (const f of oo.fuels.values()) {\n if (f.spec.kind !== 'gas') continue\n const d = dist3(from, originOf(oo))\n if (d <= bestD) {\n best = { o: oo, f }\n bestD = d\n }\n }\n }\n return best\n }\n if (want.includes(':')) {\n const f = findGlobal(want, (oo, local) => oo.fuels.get(local))\n return f ? { o: f.o, f: f.value } : null\n }\n const local = o.fuels.get(want)\n return local ? { o, f: local } : null\n }\n\n function valveOpen(o: ObjState, f: FuelState): boolean {\n const v = f.spec.valve\n if (!v || !o.parts.has(v)) return true\n return targetIsOpen(o.parts.get(v) as PartState)\n }\n\n function canBurn(b: BurnerState, ref: { o: ObjState; f: FuelState } | null): boolean {\n return !!ref && ref.f.level > 0 && valveOpen(ref.o, ref.f)\n }\n\n function isSolid(ref: { f: FuelState } | null): boolean {\n return !!ref && ref.f.spec.kind !== 'gas'\n }\n\n function emitBurner(o: ObjState, b: BurnerState): void {\n emit({ type: 'burner', object: o.id, burner: b.spec.id, on: b.on, lit: b.lit })\n }\n\n function extinguish(o: ObjState, b: BurnerState, turnOff: boolean): void {\n const ref = resolveFuel(o, b)\n const wasLit = b.lit\n b.lit = false\n if (turnOff) b.on = false\n if (b.spec.part) setPartTarget(o, b.spec.part, b.on ? 1 : 0)\n if (wasLit && isSolid(ref)) b.smoke = SMOKE_TAIL\n emitBurner(o, b)\n }\n\n function toggleBurner(o: ObjState, id: string): boolean {\n const b = o.burners.get(id)\n if (!b) return false\n if (b.on || b.lit) {\n extinguish(o, b, true)\n return true\n }\n if (b.spec.needsIgnition) return false\n const ref = resolveFuel(o, b)\n b.on = true\n b.lit = canBurn(b, ref)\n if (b.lit) b.smoke = 0\n if (b.spec.part) setPartTarget(o, b.spec.part, 1)\n emitBurner(o, b)\n if (!b.lit) message(ref && ref.f.level <= 0 ? 'empty' : 'no_gas')\n return true\n }\n\n function ignite(o: ObjState, id: string): boolean {\n const b = o.burners.get(id)\n if (!b || b.lit) return false\n const ref = resolveFuel(o, b)\n if (!canBurn(b, ref)) {\n message(ref && ref.f.level <= 0 ? 'empty' : 'no_gas')\n return false\n }\n b.on = true\n b.lit = true\n b.smoke = 0\n if (b.spec.part) setPartTarget(o, b.spec.part, 1)\n emitBurner(o, b)\n return true\n }\n\n function toggleFuel(o: ObjState, id: string): boolean {\n const f = o.fuels.get(id)\n if (!f || !f.spec.valve || !o.parts.has(f.spec.valve)) return false\n const p = o.parts.get(f.spec.valve) as PartState\n setPartTarget(o, f.spec.valve, targetIsOpen(p) ? 0 : 1)\n return true\n }\n\n // ------------------------------------------------------------------ water\n function resolveTank(o: ObjState, id: string | undefined): { o: ObjState; t: TankState } | null {\n const want = id === undefined || id === 'auto' ? defaultTank : id\n if (!want) return null\n const f = findGlobal(want, (oo, local) => oo.tanks.get(local))\n if (f) return { o: f.o, t: f.value }\n const local = o.tanks.get(want)\n return local ? { o, t: local } : null\n }\n\n function drawWater(o: ObjState, fx: FixtureState, liters: number): number {\n if (liters <= 0) return 0\n if (options.waterSupply) return Math.max(0, Math.min(liters, options.waterSupply.draw(gid(o, fx.spec.id), liters)))\n const tank = resolveTank(o, fx.spec.tank)\n if (!tank) return 0\n const got = Math.min(liters, tank.t.level)\n tank.t.level -= got\n return got\n }\n\n function emitFixture(o: ObjState, fx: FixtureState): void {\n emit({ type: 'fixture', object: o.id, fixture: fx.spec.id, on: fx.on, flowing: fx.flowing })\n }\n\n function flowOf(fx: FixtureState): number {\n return fx.spec.flow ?? FLOW_DEFAULTS[fx.spec.kind] ?? 6\n }\n\n function stepFixture(o: ObjState, fx: FixtureState, dt: number): void {\n if (!fx.on) return\n if (fx.spec.kind === 'flush') {\n fx.timer -= dt\n if (fx.timer <= 0) {\n fx.on = false\n fx.flowing = false\n fx.frac = 0\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 0)\n emitFixture(o, fx)\n }\n return\n }\n if (dt <= 0) return\n const wanted = (flowOf(fx) / 60) * dt\n const got = drawWater(o, fx, wanted)\n const flowing = got > 1e-9\n fx.frac = wanted > 0 ? Math.min(1, got / wanted) : 0\n if (flowing !== fx.flowing) {\n fx.flowing = flowing\n emitFixture(o, fx)\n }\n }\n\n function toggleFixture(o: ObjState, id: string): boolean {\n const fx = o.fixtures.get(id)\n if (!fx) return false\n if (fx.on) {\n fx.on = false\n fx.flowing = false\n fx.frac = 0\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 0)\n emitFixture(o, fx)\n return true\n }\n fx.on = true\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 1)\n if (fx.spec.kind === 'flush') {\n const volume = fx.spec.volume ?? 6\n const got = drawWater(o, fx, volume)\n fx.flowing = got > 1e-9\n fx.frac = fx.flowing ? 1 : 0\n fx.timer = FLUSH_SECONDS\n if (!fx.flowing) {\n fx.on = false\n if (fx.spec.part) setPartTarget(o, fx.spec.part, 0)\n }\n } else {\n fx.flowing = false\n fx.frac = 0\n stepFixture(o, fx, 1 / 60)\n }\n emitFixture(o, fx)\n if (!fx.flowing) message('no_water')\n return true\n }\n\n // ------------------------------------------------------------------ seats\n function seatTaken(objectId: string, seatId: string): string | null {\n for (const [actor, s] of seats) if (s.object === objectId && s.seat === seatId) return actor\n return null\n }\n\n function stand(actor: string = DEFAULT_ACTOR): Vec3 | null {\n const s = seats.get(actor)\n if (!s) return null\n seats.delete(actor)\n const o = objs.get(s.object)\n const spec = o?.spec.seats?.find((x) => x.id === s.seat)\n emit({ type: 'seat', object: s.object, seat: s.seat, actor, seated: false })\n if (!o || !spec) return null\n return toWorld(o, spec.exit)\n }\n\n function sit(objectId: string, seatId: string, actor: string = DEFAULT_ACTOR): SeatResult | null {\n const o = objs.get(objectId)\n const seat = o?.spec.seats?.find((s) => s.id === seatId)\n if (!o || !seat) return null\n const holder = seatTaken(objectId, seatId)\n if (holder && holder !== actor) return null\n if (seats.has(actor) && !holder) stand(actor)\n seats.set(actor, { object: objectId, seat: seatId })\n const eye = seat.eye ?? (seat.pose === 'lie' ? 0.18 : 0.62)\n emit({ type: 'seat', object: objectId, seat: seatId, actor, seated: true })\n return { eye: toWorld(o, [seat.pos[0], seat.pos[1] + eye, seat.pos[2]]), yaw: o.public.transform.ry + seat.ry + Math.PI, pose: seat.pose }\n }\n\n // ------------------------------------------------------------------ soft volumes\n function push(pos: Vec3, radius: number, vel: Vec3): void {\n for (const o of objs.values()) {\n if (!o.soft.size) continue\n const tr = o.public.transform\n const lp = worldToLocal(tr, pos)\n const lv = rotY(vel, -tr.ry)\n for (const s of o.soft.values()) {\n const [w, h, d] = s.spec.size\n const hx = w / 2\n const hz = Math.max(d, 0.1) / 2\n const dx = Math.max(Math.abs(lp[0] - s.spec.anchor[0]) - hx, 0)\n const dz = Math.max(Math.abs(lp[2] - s.spec.anchor[2]) - hz, 0)\n if (Math.hypot(dx, dz) > radius) continue\n const top = tr.y + s.spec.anchor[1]\n if (pos[1] + ACTOR_HEIGHT < top - h || pos[1] > top) continue\n const cap = 8\n s.vax = clamp(s.vax - lv[2] * PUSH_GAIN, -cap, cap)\n s.vaz = clamp(s.vaz + lv[0] * PUSH_GAIN, -cap, cap)\n if (s.spec.kind === 'panel' && s.spec.part && lv[2] < -0.05 && lp[2] > s.spec.anchor[2]) setPartTarget(o, s.spec.part, 1)\n }\n }\n }\n\n function stepSoft(dt: number): void {\n const sub = Math.max(1, Math.ceil(dt / (1 / 120)))\n const h = dt / sub\n for (const o of objs.values()) {\n if (!o.soft.size) continue\n const wl = rotY([wind[0], 0, wind[1]], -o.public.transform.ry)\n for (const s of o.soft.values()) {\n const k = s.spec.stiffness ?? 30\n const c = s.spec.damping ?? 4\n const max = s.spec.maxAngle ?? 0.7\n const gain = s.spec.wind ?? (s.spec.kind === 'panel' ? 0 : 1)\n const gust = gain * (0.6 + 0.4 * Math.sin(time * 1.7 + s.phase)) * 0.1\n const fx = -wl[2] * gust\n const fz = wl[0] * gust\n for (let i = 0; i < sub; i++) {\n s.vax += (-k * s.ax - c * s.vax + fx) * h\n s.vaz += (-k * s.az - c * s.vaz + fz) * h\n s.ax += s.vax * h\n s.az += s.vaz * h\n }\n if (Math.abs(s.ax) > max) {\n s.ax = Math.sign(s.ax) * max\n s.vax = 0\n }\n if (Math.abs(s.az) > max) {\n s.az = Math.sign(s.az) * max\n s.vaz = 0\n }\n }\n }\n }\n\n // ------------------------------------------------------------------ damage\n function damage(objectId: string, target: string, amount: number, _kind?: string): { hp: number; destroyed: boolean } | null {\n const o = objs.get(objectId)\n if (o && options.destruction) {\n const pos = toWorld(o, [0, 0.5, 0])\n const type = _kind === 'gas' ? 'explosive' : _kind === 'fabric' ? 'slash' : 'blunt'\n const result = options.destruction.hitPart(objectId, target, { type, point: pos, energy: Math.max(0, amount), source: 'interactables' }) as { events?: Array<{ type?: string; part?: string }> } | null | undefined\n const destroyed = !!result?.events?.some((e) => e.type === 'fracture' && e.part === target)\n emit({ type: 'damage', object: objectId, target, hp: -1, destroyed })\n return { hp: -1, destroyed }\n }\n const st = o?.hp.get(target)\n if (!o || !st) return null\n if (st.hp <= 0) return { hp: 0, destroyed: true }\n const before = st.hp\n st.hp = Math.max(0, st.hp - Math.max(0, amount))\n const destroyed = st.hp <= 0\n emit({ type: 'damage', object: objectId, target, hp: st.hp, destroyed })\n const pos = toWorld(o, [0, 0.5, 0])\n const fuel = o.fuels.get(target)\n if (fuel && destroyed && fuel.spec.kind === 'gas' && fuel.level > 0) {\n emit({ type: 'explosion', object: objectId, pos, radius: 2 + fuel.level / 5 })\n fuel.level = 0\n }\n const tank = o.tanks.get(target)\n if (tank && before === st.max && st.hp < before) emit({ type: 'leak', object: objectId, target, pos })\n return { hp: st.hp, destroyed }\n }\n\n // ------------------------------------------------------------------ interactions\n function deriveInteractions(spec: ObjectSpec): InteractionSpec[] {\n const out: InteractionSpec[] = []\n const used = new Set<string>()\n const partPos = (id: string | undefined, fallback: Vec3): Vec3 => spec.parts?.find((p) => p.id === id)?.pivot ?? fallback\n const partLabel = (id: string | undefined): string => spec.parts?.find((p) => p.id === id)?.label ?? ''\n const claim = (id: string | undefined) => {\n if (id) used.add(id)\n }\n for (const d of spec.devices ?? []) {\n claim(d.part)\n const pos = d.part ? partPos(d.part, [0, 1, 0]) : (d.plug ?? [0, 1, 0])\n // a hard-wired lamp (circuit, no plug, no part to press) is driven by switches and `setDevice`: it never steals the interact key\n if (d.kind === 'lamp' && !d.part && !d.plug && d.electric !== false) continue\n out.push({ id: `device.${d.id}`, pos, action: { do: 'toggle_device', device: d.id }, label: partLabel(d.part) })\n if (d.kind === 'screen' && (d.channels ?? 1) > 1) out.push({ id: `channel.${d.id}`, pos, action: { do: 'cycle_device', device: d.id }, label: '' })\n }\n for (const s of spec.switches ?? []) {\n claim(s.part)\n out.push({ id: `switch.${s.id}`, pos: partPos(s.part, [0, 1.2, 0]), action: { do: 'toggle_switch', switch: s.id }, label: partLabel(s.part) })\n }\n const driven = new Set((spec.devices ?? []).map((d) => d.fixture))\n for (const f of spec.fixtures ?? []) {\n claim(f.part)\n if (driven.has(f.id)) continue\n out.push({ id: `fixture.${f.id}`, pos: f.part ? partPos(f.part, f.outlet) : f.outlet, action: { do: 'toggle_fixture', fixture: f.id }, label: partLabel(f.part) })\n }\n for (const b of spec.burners ?? []) {\n claim(b.part)\n const pos = b.part ? partPos(b.part, b.pos) : b.pos\n if (b.needsIgnition) out.push({ id: `ignite.${b.id}`, pos, action: { do: 'ignite', burner: b.id }, label: '' })\n out.push({ id: `burner.${b.id}`, pos, action: { do: 'toggle_burner', burner: b.id }, label: partLabel(b.part) })\n }\n for (const f of spec.fuels ?? []) {\n if (!f.valve) continue\n claim(f.valve)\n out.push({ id: `fuel.${f.id}`, pos: partPos(f.valve, [0, 0.5, 0]), action: { do: 'toggle_fuel', fuel: f.id }, label: partLabel(f.valve) })\n }\n for (const c of spec.containers ?? []) {\n if (!c.access) out.push({ id: `open.${c.id}`, pos: c.volume.center, action: { do: 'open_container', container: c.id }, label: '' })\n }\n for (const p of spec.parts ?? []) {\n if (used.has(p.id)) continue\n if (p.label) out.push({ id: `part.${p.id}`, pos: p.pivot, action: { do: 'toggle_part', part: p.id }, label: p.label })\n }\n for (const c of spec.containers ?? []) {\n if (c.access && !spec.parts?.find((p) => p.id === c.access)?.label) {\n out.push({ id: `open.${c.id}`, pos: partPos(c.access, c.volume.center), action: { do: 'open_container', container: c.id }, label: '' })\n }\n }\n for (const s of spec.seats ?? []) out.push({ id: `seat.${s.id}`, pos: s.pos, action: { do: 'sit', seat: s.id }, label: '' })\n return out\n }\n\n function typeName(o: ObjState): string {\n return table[`type.${o.spec.type}`] ?? humanize(o.spec.type)\n }\n\n function promptOf(o: ObjState, i: InteractionSpec): { label: string; verb: string; object: string } {\n const a = i.action\n let state: string | null = null\n let def = ''\n switch (a.do) {\n case 'toggle_part': {\n const p = o.parts.get(a.part)\n const open = !!p && targetIsOpen(p)\n state = open ? 'open' : 'closed'\n def = open ? 'prompt.close' : 'prompt.open'\n break\n }\n case 'open_container': {\n const c = containerOf(o, a.container)\n const p = c?.access ? o.parts.get(c.access) : undefined\n const open = p ? targetIsOpen(p) : false\n state = p ? (open ? 'open' : 'closed') : null\n def = open ? 'prompt.close' : 'prompt.open'\n break\n }\n case 'toggle_device': {\n const on = !!o.devices.get(a.device)?.on\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_switch': {\n const sw = o.spec.switches?.find((s) => s.id === a.switch)\n const on = !!sw && switchIsOn(o, sw)\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_breaker': {\n const on = breaker(a.circuit)\n state = on ? 'on' : 'off'\n def = on ? 'prompt.breaker_off' : 'prompt.breaker_on'\n break\n }\n case 'toggle_fixture': {\n const on = !!o.fixtures.get(a.fixture)?.on\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_burner': {\n const b = o.burners.get(a.burner)\n const on = !!b && (b.on || b.lit)\n state = on ? 'on' : 'off'\n def = on ? 'prompt.turn_off' : 'prompt.turn_on'\n break\n }\n case 'toggle_fuel': {\n const f = o.fuels.get(a.fuel)\n const open = !!f && valveOpen(o, f)\n state = open ? 'open' : 'closed'\n def = open ? 'prompt.close_valve' : 'prompt.open_valve'\n break\n }\n case 'take':\n def = 'prompt.take'\n break\n case 'read':\n def = 'prompt.read'\n break\n case 'ignite':\n def = 'prompt.light'\n break\n case 'cycle_device':\n def = 'prompt.change_channel'\n break\n case 'sit': {\n const seat = o.spec.seats?.find((s) => s.id === a.seat)\n const mine = seats.get(DEFAULT_ACTOR)\n def = mine && mine.object === o.id && mine.seat === a.seat ? 'prompt.get_up' : seat?.pose === 'lie' ? 'prompt.lie_down' : 'prompt.sit'\n break\n }\n }\n let key = def\n if (i.label) {\n if (state && table[`${i.label}.${state}`] !== undefined) key = `${i.label}.${state}`\n else if (table[i.label] !== undefined) key = i.label\n }\n const vars = { name: typeName(o), circuit: a.do === 'toggle_breaker' ? (a.name ?? a.circuit) : '' }\n const label = t(key, vars)\n // structured prompt: explicit `<key>.verb` / `<key>.object` entries win; otherwise the first word is the verb and the rest the object\n let verb: string\n let object: string\n if (table[`${key}.verb`] !== undefined) {\n verb = t(`${key}.verb`, vars)\n object = table[`${key}.object`] ? t(`${key}.object`, vars) : vars.name\n } else {\n const sp = label.indexOf(' ')\n verb = sp < 0 ? label : label.slice(0, sp)\n object = sp < 0 ? vars.name : label.slice(sp + 1)\n }\n return { label, verb, object }\n }\n\n /** Locale key of the reason an interaction cannot be used right now, or null when it can. */\n function unavailableReason(o: ObjState, i: InteractionSpec): string | null {\n const a = i.action\n if (!requirementMet(i)) return 'requires_open'\n switch (a.do) {\n case 'toggle_part': {\n const p = o.parts.get(a.part)\n return p && gated(o, p) ? 'requires_open' : null\n }\n case 'open_container': {\n const c = containerOf(o, a.container)\n const p = c?.access ? o.parts.get(c.access) : undefined\n return p && gated(o, p) ? 'requires_open' : null\n }\n case 'toggle_breaker': {\n const rocker = a.part ? o.parts.get(a.part) : undefined\n return rocker && gated(o, rocker) ? 'requires_open' : null\n }\n case 'take':\n case 'read':\n return accessible(o.id, a.container) ? null : 'requires_open'\n case 'ignite':\n return o.burners.get(a.burner)?.lit ? 'already_lit' : null\n case 'toggle_burner': {\n const b = o.burners.get(a.burner)\n return !b?.spec.needsIgnition || b.lit ? null : 'needs_ignition'\n }\n case 'cycle_device': {\n const d = o.devices.get(a.device)\n if (!d || !d.on) return 'turn_on_first'\n return devicePowered(o, d) ? null : 'no_power'\n }\n default:\n return null\n }\n }\n\n function requirementMet(i: InteractionSpec): boolean {\n if (!i.requires) return true\n const p = objs.get(i.requires.object)?.parts.get(i.requires.part)\n return !!p && targetIsOpen(p)\n }\n\n function interactablesOf(o: ObjState): Array<{ item: Interactable; spec: InteractionSpec; o: ObjState }> {\n return o.interactions.map((i) => {\n const id = gid(o, i.id)\n const p = promptOf(o, i)\n const item: Interactable = {\n id,\n object: o.id,\n kind: i.action.do,\n pos: toWorld(o, i.pos),\n radius: i.radius ?? DEFAULT_RADIUS,\n label: p.label,\n verb: p.verb,\n noun: p.object,\n available: true,\n act: (actor) => act(id, actor),\n }\n const reason = unavailableReason(o, i) ?? (options.canInteract?.(item, DEFAULT_ACTOR) === false ? 'locked' : null)\n if (reason) {\n item.available = false\n item.reason = reason\n }\n return { item, spec: i, o }\n })\n }\n\n function interactables(): Interactable[] {\n const out: Interactable[] = []\n for (const o of objs.values()) for (const e of interactablesOf(o)) out.push(e.item)\n return out\n }\n\n function target(eye: { x: number; y: number; z: number; yaw: number; pitch: number }, opts: TargetOptions = {}): Interactable | null {\n const reach = opts.reach ?? 1.8\n const cone = opts.cone ?? 0.45\n const dir: Vec3 = [-Math.sin(eye.yaw) * Math.cos(eye.pitch), Math.sin(eye.pitch), -Math.cos(eye.yaw) * Math.cos(eye.pitch)]\n let best: Interactable | null = null\n let bestScore = Infinity\n for (const o of objs.values()) {\n for (const e of interactablesOf(o)) {\n if (!e.item.available && !opts.includeUnavailable) continue\n if (opts.kinds && !opts.kinds.includes(e.item.kind)) continue\n if (opts.filter && !opts.filter(e.item)) continue\n const v: Vec3 = [e.item.pos[0] - eye.x, e.item.pos[1] - eye.y, e.item.pos[2] - eye.z]\n const d = Math.hypot(v[0], v[1], v[2])\n if (d > reach) continue\n const cos = d < 1e-6 ? 1 : clamp((v[0] * dir[0] + v[1] * dir[1] + v[2] * dir[2]) / d, -1, 1)\n const angle = Math.acos(cos)\n if (angle > cone) continue\n const score = (angle / cone) * 0.6 + (d / reach) * 0.4\n if (score < bestScore) {\n bestScore = score\n best = e.item\n }\n }\n }\n return best\n }\n\n function act(interactableId: string, actor: string = DEFAULT_ACTOR): boolean {\n let found: { item: Interactable; spec: InteractionSpec; o: ObjState } | null = null\n for (const o of objs.values()) {\n if (!interactableId.startsWith(o.id + ':')) continue\n const local = interactableId.slice(o.id.length + 1)\n if (!o.interactions.some((i) => i.id === local)) continue\n found = interactablesOf(o).find((e) => e.spec.id === local) ?? null\n if (found) break\n }\n if (!found) return false\n if (!requirementMet(found.spec)) return false\n if (options.canInteract?.(found.item, actor) === false) return false\n return execute(found.o, found.spec.action, actor)\n }\n\n function execute(o: ObjState, a: InteractionSpec['action'], actor: string): boolean {\n switch (a.do) {\n case 'toggle_part': {\n const p = o.parts.get(a.part)\n if (!p || gated(o, p)) return false\n setPartTarget(o, a.part, targetIsOpen(p) ? 0 : 1)\n return true\n }\n case 'open_container': {\n const c = containerOf(o, a.container)\n if (!c) return false\n if (c.access) return execute(o, { do: 'toggle_part', part: c.access }, actor)\n emit({ type: 'container', object: o.id, container: c.id, open: true })\n return true\n }\n case 'take': {\n if (!accessible(o.id, a.container)) return false\n const list = o.contents.get(a.container)\n if (!list) return false\n const slot = a.slot ?? list.findIndex((s) => s !== null)\n if (slot < 0 || !list[slot]) {\n message('empty')\n return false\n }\n return take(o.id, a.container, slot, actor) !== null\n }\n case 'read': {\n if (!accessible(o.id, a.container)) return false\n const stack = o.contents.get(a.container)?.[a.slot]\n if (!stack) {\n message('empty')\n return false\n }\n const key = typeof stack.data?.text === 'string' ? stack.data.text : null\n if (!key) return false\n message(key)\n return true\n }\n case 'toggle_device': {\n const d = o.devices.get(a.device)\n if (!d) return false\n setDeviceOn(o, d, !d.on)\n return true\n }\n case 'cycle_device': {\n const d = o.devices.get(a.device)\n if (!d || !d.on) return false\n if (!devicePowered(o, d)) {\n message('no_power')\n return false\n }\n d.channel = (d.channel + 1) % Math.max(1, d.spec.channels ?? 1)\n emit({ type: 'device', object: o.id, device: d.spec.id, on: true, powered: true, channel: d.channel })\n return true\n }\n case 'toggle_switch':\n return toggleSwitch(o, a.switch)\n case 'toggle_breaker': {\n const rocker = a.part ? o.parts.get(a.part) : undefined\n if (rocker && gated(o, rocker)) return false\n const on = !breaker(a.circuit)\n if (a.part) setPartTarget(o, a.part, on ? 1 : 0)\n world.power.setBreaker(a.circuit, on)\n return true\n }\n case 'toggle_fixture':\n return toggleFixture(o, a.fixture)\n case 'toggle_burner':\n return toggleBurner(o, a.burner)\n case 'ignite':\n return ignite(o, a.burner)\n case 'toggle_fuel':\n return toggleFuel(o, a.fuel)\n case 'sit': {\n const mine = seats.get(actor)\n if (mine && mine.object === o.id && mine.seat === a.seat) {\n stand(actor)\n return true\n }\n return sit(o.id, a.seat, actor) !== null\n }\n }\n }\n\n // ------------------------------------------------------------------ emitters, mirrors, colliders\n function emitters(): ActiveEmitter[] {\n const out: ActiveEmitter[] = []\n for (const o of objs.values()) {\n for (const e of o.spec.emitters ?? []) {\n let intensity = 0\n const b = o.burners.get(e.source)\n const fx = o.fixtures.get(e.source)\n const dev = o.devices.get(e.source)\n const fuel = o.fuels.get(e.source)\n if (b) {\n const ref = resolveFuel(o, b)\n const frac = ref ? clamp(ref.f.level / ref.f.spec.capacity, 0, 1) : 0\n if (b.lit) intensity = 0.35 + 0.65 * frac\n else if (e.kind === 'smoke' && b.smoke > 0) intensity = 0.6 * (b.smoke / SMOKE_TAIL)\n } else if (fx) {\n if (fx.on && fx.flowing) intensity = fx.frac\n } else if (dev) {\n if (dev.on && devicePowered(o, dev)) intensity = 1\n } else if (fuel) {\n const lit = [...o.burners.values()].some((bb) => bb.lit && resolveFuel(o, bb)?.f === fuel)\n if (lit) intensity = 0.35 + 0.65 * clamp(fuel.level / fuel.spec.capacity, 0, 1)\n }\n if (intensity <= 0) continue\n const dir = rotY(e.dir ?? [0, 1, 0], o.public.transform.ry)\n out.push({ id: gid(o, e.id), object: o.id, kind: e.kind, pos: toWorld(o, e.pos), dir, size: e.size ?? 0.3, ...(e.reach !== undefined ? { reach: e.reach } : {}), intensity: clamp(intensity, 0, 1) })\n }\n }\n return out\n }\n\n function mirrors(eye: Vec3, maxDistance = 10, count = 4) {\n const out: Array<{ id: string; center: Vec3; normal: Vec3; w: number; h: number; distance: number }> = []\n for (const o of objs.values()) {\n for (const m of o.spec.mirrors ?? []) {\n const center = toWorld(o, applyPart(o, m.part, m.center))\n const f = partFrame(o, m.part)\n const ln = f && f.angle !== 0 ? rotateAxis(m.normal, f.axis, f.angle) : m.normal\n const normal = rotY(ln, o.public.transform.ry)\n const len = Math.hypot(normal[0], normal[1], normal[2]) || 1\n const n: Vec3 = [normal[0] / len, normal[1] / len, normal[2] / len]\n const to: Vec3 = [eye[0] - center[0], eye[1] - center[1], eye[2] - center[2]]\n if (n[0] * to[0] + n[1] * to[1] + n[2] * to[2] <= 0) continue\n const distance = Math.hypot(to[0], to[1], to[2])\n if (distance > maxDistance) continue\n out.push({ id: gid(o, m.id), center, normal: n, w: m.w, h: m.h, distance })\n }\n }\n return out.sort((a, b) => a.distance - b.distance).slice(0, count)\n }\n\n function colliders(opts: ColliderOptions = {}): WorldCollider[] {\n const out: WorldCollider[] = []\n const fixed: WorldCollider[] = []\n for (const o of objs.values()) {\n const tr = o.public.transform\n for (const c of o.spec.colliders ?? []) {\n if (c.part && c.offWhenOpen && (o.parts.get(c.part)?.t ?? 0) > 0.5) continue\n let extra = 0\n if (c.part) {\n const f = partFrame(o, c.part)\n if (f && f.angle !== 0 && Math.abs(f.axis[1]) >= 0.5) extra = f.angle * Math.sign(f.axis[1])\n }\n const center = toWorld(o, applyPart(o, c.part, c.center))\n ;(c.part ? out : fixed).push({\n id: gid(o, c.id),\n object: o.id,\n cx: center[0],\n cz: center[2],\n hw: c.half[0],\n hd: c.half[2],\n ry: tr.ry + (c.ry ?? 0) + extra,\n y0: center[1] - c.half[1],\n y1: center[1] + c.half[1],\n })\n }\n }\n if (opts.merge) return [...mergeColliders(fixed, { gap: opts.gap, slack: opts.slack }), ...out]\n return [...fixed, ...out]\n }\n\n // ------------------------------------------------------------------ update\n function update(dt: number): void {\n if (!(dt > 0)) return\n time += dt\n for (const o of objs.values()) {\n for (const p of o.parts.values()) {\n if (p.t === p.target) continue\n if (gated(o, p) && p.target > p.t) continue // a gated part may still close\n const step = (p.spec.motion.speed ?? 2.5) * dt\n const next = p.t < p.target ? Math.min(p.target, p.t + step) : Math.max(p.target, p.t - step)\n writeT(o, p, next)\n if (next === p.target) emit({ type: 'part', object: o.id, part: p.spec.id, t: next, target: p.target })\n }\n }\n stepSoft(dt)\n for (const o of objs.values()) {\n for (const b of o.burners.values()) {\n if (b.lit) {\n const ref = resolveFuel(o, b)\n if (!ref || !valveOpen(ref.o, ref.f)) {\n extinguish(o, b, !!b.spec.needsIgnition)\n } else {\n ref.f.level = Math.max(0, ref.f.level - b.spec.rate * dt)\n if (ref.f.level <= 0) extinguish(o, b, !!b.spec.needsIgnition)\n }\n } else if (b.on && !b.spec.needsIgnition && canBurn(b, resolveFuel(o, b))) {\n // a gas knob left open without gas lights as soon as the bottle valve opens\n b.lit = true\n b.smoke = 0\n emitBurner(o, b)\n } else if (b.smoke > 0) {\n b.smoke = Math.max(0, b.smoke - dt)\n }\n }\n if (rain > 0) {\n for (const tk of o.tanks.values()) {\n if (tk.spec.rainArea) tk.level = Math.min(tk.spec.capacity, tk.level + ((rain * tk.spec.rainArea) / 3600) * dt)\n }\n }\n for (const tk of o.tanks.values()) {\n const st = o.hp.get(tk.spec.id)\n if (st && st.hp < st.max && tk.level > 0) {\n const rate = 0.5 + 2.5 * (1 - st.hp / st.max)\n tk.level = Math.max(0, tk.level - rate * dt)\n }\n }\n }\n for (const o of objs.values()) {\n for (const d of o.devices.values()) {\n const fx = d.spec.fixture ? o.fixtures.get(d.spec.fixture) : undefined\n if (!fx) continue\n const run = d.on && devicePowered(o, d)\n if (fx.on === run) continue\n fx.on = run\n if (!run) {\n fx.flowing = false\n fx.frac = 0\n emitFixture(o, fx)\n }\n }\n for (const fx of o.fixtures.values()) stepFixture(o, fx, dt)\n }\n }\n\n // ------------------------------------------------------------------ add / remove\n function add(id: string, spec: ObjectSpec, transform: Transform): WorldObject {\n if (objs.has(id)) throw new Error(`Object \"${id}\" already exists`)\n const pub: WorldObject = { id, spec, transform: { ...transform }, parts: {} }\n const o: ObjState = {\n id,\n public: pub,\n spec,\n parts: new Map(),\n contents: new Map(),\n devices: new Map(),\n fuels: new Map(),\n burners: new Map(),\n tanks: new Map(),\n fixtures: new Map(),\n soft: new Map(),\n hp: new Map(),\n interactions: spec.interactions ?? deriveInteractions(spec),\n }\n for (const p of spec.parts ?? []) {\n const t0 = clamp(p.t0 ?? 0, 0, 1)\n o.parts.set(p.id, { spec: p, t: t0, target: t0, maxT: 1 })\n pub.parts[p.id] = t0\n }\n for (const c of spec.containers ?? []) {\n let list: Array<ItemStack | null>\n if (c.contents) list = c.slots.map((_, i) => cloneStack(c.contents?.[i] ?? null))\n else if (c.loot) list = generateLoot(options.loot, c.loot, c.slots, `${seed}|${id}|${c.id}`, options.items)\n else list = c.slots.map(() => null)\n o.contents.set(c.id, list)\n }\n for (const d of spec.devices ?? []) {\n o.devices.set(d.id, { spec: d, on: !!d.on, channel: 0 })\n if (d.on && d.part) {\n const p = o.parts.get(d.part)\n if (p) {\n p.target = p.maxT\n writeT(o, p, p.maxT)\n }\n }\n }\n for (const f of spec.fuels ?? []) o.fuels.set(f.id, { spec: f, level: clamp(f.level ?? f.capacity, 0, f.capacity) })\n for (const b of spec.burners ?? []) o.burners.set(b.id, { spec: b, on: false, lit: false, smoke: 0 })\n for (const tk of spec.tanks ?? []) o.tanks.set(tk.id, { spec: tk, level: clamp(tk.level ?? tk.capacity, 0, tk.capacity) })\n for (const f of spec.fixtures ?? []) o.fixtures.set(f.id, { spec: f, on: false, flowing: false, frac: 0, timer: 0 })\n let n = 0\n for (const s of spec.soft ?? []) {\n o.soft.set(s.id, { spec: s, ax: 0, az: 0, vax: 0, vaz: 0, phase: (n++ * 2.399963) % (Math.PI * 2) })\n }\n for (const d of spec.damage ?? []) o.hp.set(d.target, { max: d.hp, hp: d.hp })\n objs.set(id, o)\n if (!defaultTankExplicit && defaultTank === null && o.tanks.size) defaultTank = gid(o, [...o.tanks.keys()][0])\n rebuildPlugs()\n return pub\n }\n\n function remove(id: string): void {\n const o = objs.get(id)\n if (!o) return\n for (const [actor, s] of [...seats]) if (s.object === id) seats.delete(actor)\n objs.delete(id)\n if (defaultTank && defaultTank.startsWith(id + ':')) defaultTank = null\n rebuildPlugs()\n }\n\n // ------------------------------------------------------------------ save / load\n function serialize(): WorldState {\n const objects: WorldState['objects'] = {}\n for (const o of objs.values()) {\n objects[o.id] = {\n parts: Object.fromEntries([...o.parts].map(([k, p]) => [k, p.t])),\n contents: Object.fromEntries([...o.contents].map(([k, v]) => [k, v.map(cloneStack)])),\n devices: Object.fromEntries([...o.devices].map(([k, d]) => [k, { on: d.on, channel: d.channel }])),\n fuels: Object.fromEntries([...o.fuels].map(([k, f]) => [k, { level: f.level, open: valveOpen(o, f) }])),\n burners: Object.fromEntries([...o.burners].map(([k, b]) => [k, { on: b.on, lit: b.lit }])),\n tanks: Object.fromEntries([...o.tanks].map(([k, tk]) => [k, tk.level])),\n fixtures: Object.fromEntries([...o.fixtures].map(([k, f]) => [k, f.on])),\n hp: Object.fromEntries([...o.hp].map(([k, h]) => [k, h.hp])),\n }\n }\n return {\n version: 1,\n objects,\n grid,\n breakers: Object.fromEntries(breakers),\n seats: Object.fromEntries([...seats].map(([a, s]) => [a, { object: s.object, seat: s.seat }])),\n defaultTank,\n }\n }\n\n function load(state: WorldState): void {\n for (const [id, st] of Object.entries(state.objects)) {\n const o = objs.get(id)\n if (!o) continue\n for (const [k, v] of Object.entries(st.parts)) {\n const p = o.parts.get(k)\n if (p) {\n // keep the limit found by fitSweep: a loaded save must not let a door open through a wall again\n p.target = clamp(v, 0, p.maxT)\n writeT(o, p, p.target)\n }\n }\n for (const [k, v] of Object.entries(st.contents)) {\n const c = containerOf(o, k)\n if (c) o.contents.set(k, c.slots.map((_, i) => cloneStack(v[i] ?? null)))\n }\n for (const [k, v] of Object.entries(st.devices)) {\n const d = o.devices.get(k)\n if (d) {\n d.on = v.on\n d.channel = v.channel\n }\n }\n for (const [k, v] of Object.entries(st.fuels)) {\n const f = o.fuels.get(k)\n if (f) f.level = v.level\n }\n for (const [k, v] of Object.entries(st.burners)) {\n const b = o.burners.get(k)\n if (b) {\n b.on = v.on\n b.lit = v.lit\n b.smoke = 0\n }\n }\n for (const [k, v] of Object.entries(st.tanks)) {\n const tk = o.tanks.get(k)\n if (tk) tk.level = v\n }\n for (const [k, v] of Object.entries(st.fixtures)) {\n const f = o.fixtures.get(k)\n if (f) {\n f.on = v\n f.flowing = false\n f.frac = 0\n f.timer = v && f.spec.kind === 'flush' ? FLUSH_SECONDS : 0\n }\n }\n for (const [k, v] of Object.entries(st.hp)) {\n const h = o.hp.get(k)\n if (h) h.hp = v\n }\n }\n grid = state.grid\n breakers.clear()\n for (const [k, v] of Object.entries(state.breakers)) breakers.set(k, v)\n seats.clear()\n for (const [a, s] of Object.entries(state.seats)) if (objs.has(s.object)) seats.set(a, { object: s.object, seat: s.seat })\n defaultTank = state.defaultTank\n defaultTankExplicit = true\n }\n\n // ------------------------------------------------------------------ public surface\n const world: World = {\n add,\n remove,\n get: (id) => objs.get(id)?.public,\n objects: () => [...objs.values()].map((o) => o.public),\n update,\n interactables,\n target,\n act,\n partT: (objectId, partId) => objs.get(objectId)?.parts.get(partId)?.t ?? 0,\n setDevice,\n setFixture,\n setBurner,\n setPart: (objectId, partId, targetT, instant) => {\n const o = objs.get(objectId)\n if (o) setPartTarget(o, partId, targetT, instant)\n },\n fitSweep,\n contents,\n accessible,\n take,\n put,\n slotPosition,\n power: {\n get grid() {\n return grid\n },\n set grid(on: boolean) {\n world.power.setGrid(on)\n },\n setGrid(on) {\n if (on === grid) return\n const before = powerSnapshot()\n grid = on\n emit({ type: 'power', grid })\n emitPowerChanges(before)\n },\n setBreaker(circuit, on) {\n if (breaker(circuit) === on) {\n breakers.set(circuit, on)\n return\n }\n const before = powerSnapshot()\n breakers.set(circuit, on)\n emitPowerChanges(before)\n },\n breaker,\n isPowered: (objectId, deviceId) => {\n const r = getDevice(objectId, deviceId)\n return r ? devicePowered(r.o, r.d) : false\n },\n isOn: (objectId, deviceId) => getDevice(objectId, deviceId)?.d.on ?? false,\n pluggedInto: (objectId, deviceId) => plugs.get(`${objectId}:${deviceId}`) ?? null,\n channel: (objectId, deviceId) => getDevice(objectId, deviceId)?.d.channel ?? 0,\n },\n fuelLevel: (objectId, fuelId) => objs.get(objectId)?.fuels.get(fuelId)?.level ?? 0,\n isLit: (objectId, burnerId) => objs.get(objectId)?.burners.get(burnerId)?.lit ?? false,\n water: {\n setDefaultTank(tankId) {\n defaultTank = tankId\n defaultTankExplicit = true\n },\n level(tankId) {\n return findGlobal(tankId, (oo, local) => oo.tanks.get(local))?.value.level ?? 0\n },\n refill(tankId, liters) {\n const f = findGlobal(tankId, (oo, local) => oo.tanks.get(local))\n if (!f) return 0\n const added = Math.max(0, Math.min(liters, f.value.spec.capacity - f.value.level))\n f.value.level += added\n return added\n },\n setRain(mm) {\n rain = Math.max(0, mm)\n },\n isFlowing: (objectId, fixtureId) => {\n const fx = objs.get(objectId)?.fixtures.get(fixtureId)\n return !!fx && fx.on && fx.flowing\n },\n },\n sit,\n stand,\n seatOf: (actor = DEFAULT_ACTOR) => {\n const s = seats.get(actor)\n return s ? { object: s.object, seat: s.seat } : null\n },\n push,\n sway: (objectId, softId) => {\n const s = objs.get(objectId)?.soft.get(softId)\n return s ? { ax: s.ax, az: s.az } : { ax: 0, az: 0 }\n },\n setWind: (x, z) => {\n wind = [x, z]\n },\n emitters,\n mirrors,\n colliders,\n damage,\n hp: (objectId, target) => (options.destruction ? null : (objs.get(objectId)?.hp.get(target)?.hp ?? null)),\n t,\n setLocale: (l) => {\n locale = l\n table = resolveStrings(locale, options.strings)\n },\n serialize,\n load,\n }\n return world\n}\n"],"mappings":"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","names":["target","add","local","volume","pos","destroyed"]}
package/package.json CHANGED
@@ -1,6 +1,55 @@
1
1
  {
2
2
  "name": "@adatechnology/game-interactables",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "license": "MIT",
5
+ "description": "Renderer-agnostic runtime for interactive world objects: movable parts, containers with pickable items, power grid, fuel, logical plumbing, seats, soft volumes, effects, mirrors and damage.",
6
+ "keywords": [
7
+ "game",
8
+ "interaction",
9
+ "furniture",
10
+ "containers",
11
+ "loot",
12
+ "power",
13
+ "plumbing",
14
+ "three"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/Andersonfrfilho/adatechnology-game-kit.git",
19
+ "directory": "packages/game-interactables"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "type": "module",
25
+ "main": "dist/index.js",
26
+ "module": "dist/index.js",
27
+ "types": "dist/index.d.ts",
28
+ "unpkg": "dist/index.global.js",
29
+ "jsdelivr": "dist/index.global.js",
30
+ "sideEffects": false,
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ },
36
+ "./global": "./dist/index.global.js"
37
+ },
38
+ "files": [
39
+ "dist"
40
+ ],
41
+ "dependencies": {
42
+ "@adatechnology/game-contracts": "0.8.0"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.10.7",
46
+ "tsup": "^8.5.1",
47
+ "typescript": "^5.7.3",
48
+ "vitest": "^3.2.4"
49
+ },
50
+ "scripts": {
51
+ "build": "tsup",
52
+ "typecheck": "tsc -p tsconfig.json --noEmit",
53
+ "test": "vitest run"
54
+ }
6
55
  }