@adatechnology/game-test-room 0.0.0-stage → 0.1.1

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/index.ts","../../game-contracts/src/impact.ts","../../game-contracts/src/spec.ts","../../game-contracts/src/weapons.ts","../../game-contracts/src/animation.ts","../../game-destruction/src/math.ts","../../game-destruction/src/fracture.ts","../../game-destruction/src/data/materials.json","../../game-destruction/src/data/material-hints.json","../../game-destruction/src/materials.ts","../../game-destruction/src/world.ts","../../game-destruction/src/frame.ts","../../game-destruction/src/locale.ts","../../game-destruction/src/contracts.ts","../../game-destruction-three/src/math.ts","../../game-destruction-three/src/fragments.ts","../../game-destruction-three/src/ground.ts","../../game-destruction-three/src/particles.ts","../../game-destruction-three/src/pieces.ts","../../game-destruction-three/src/spec.ts","../../game-destruction-three/src/heat.ts","../../game-destruction-three/src/visual.ts","../../game-destruction-three/src/renderer.ts","../../game-weapons/src/data/calibers.json","../../game-weapons/src/data/weapons.json","../../game-weapons/src/locale.ts","../../game-weapons/src/rng.ts","../../game-weapons/src/weapon.ts","../../game-weapons/src/arsenal.ts","../../game-fluids/src/data/liquids.json","../../game-fluids/src/liquids.ts","../../game-fluids/src/math.ts","../../game-fluids/src/landing.ts","../../game-fluids/src/locale.ts","../../game-fluids/src/shapes.ts","../../game-fluids/src/stains.ts","../../game-fluids/src/world.ts","../../game-fluids/src/data/item-uses.json","../../game-fluids/src/item-use.ts","../../game-fluids-three/src/clip.ts","../../game-fluids-three/src/liquid-body.ts","../../game-fluids-three/src/util.ts","../../game-fluids-three/src/materials.ts","../../game-fluids-three/src/particles.ts","../../game-fluids-three/src/quality.ts","../../game-fluids-three/src/stains.ts","../../game-fluids-three/src/streams.ts","../../game-fluids-three/src/renderer.ts","../src/build-from-spec.ts","../src/locale.ts","../src/items.ts","../src/arena.ts","../src/log.ts","../src/narrate.ts","../src/player.ts","../src/scenarios.ts","../src/ui.ts","../src/room.ts"],"sourcesContent":["export { createTestRoom } from './room'\nexport { demoItems, DEMO_ITEMS, DEMO_MATERIALS, brickWallSpec } from './items'\nexport { makeScenarios, scenariosFor, SCENARIOS } from './scenarios'\nexport { buildFromSpec, MATERIAL_COLORS } from './build-from-spec'\nexport { createLog } from './log'\nexport { resolveStrings, locales } from './locale'\nexport type { RoomStrings, TestRoomLocale } from './locale'\nexport type { BuildFromSpecOptions } from './build-from-spec'\nexport type { WritableLog, NewEntry } from './log'\nexport type { HudState } from './ui'\nexport type * from './types'\n","import type { DamageType, DestructibleSpec, DestructionEvent, Hit, JointSpec, ObjectState, ToolKind, Vec3 } from './destruction'\n\n/**\n * What a game module implements for an object whose behaviour it owns (a vehicle with its own panel deformation, a creature, a machine). The\n * world (`DestructionWorld.register`) hosts it next to its own objects: raycast, shoot, explode, hit, disassemble, extinguish, update, state,\n * reset and `on` all route to it.\n *\n * Space: the impl receives hits in WORLD space and returns events in WORLD space (it owns its transform; the transform given to `register` or\n * `setTransform` is only used by the world for raycasts and blast range). Every event must carry `object === id` and name parts listed by\n * `describe()`.\n */\nexport interface DestructibleImpl {\n readonly id: string\n readonly name?: string\n /** Parts, joints and structure in the impl's local space, for raycast, inspector and log. Called often: keep it cheap. */\n describe(): DestructibleSpec\n /** Apply one hit (see `IMPACT_CONTRACT` for the fields per type) and return the events it caused. */\n hit(hit: Hit): DestructionEvent[]\n /** Advance fire, melting, collapse and other timed behaviour. */\n update?(dt: number): DestructionEvent[]\n state(): ObjectState\n reset?(): void\n /** Same contract as `DestructionWorld.disassemble`: progress 0..1, or -1 when the tool cannot undo the joint. */\n disassemble?(jointId: string, tool: ToolKind, dt: number): number\n extinguish?(partId?: string): void\n /** Optional: an animation moved a part; `position` / `rotation` (Euler XYZ, radians) are object-local. Keep raycast and hit shapes in sync. */\n setPartPose?(partId: string, position: Vec3, rotation?: Vec3): void\n /** Plain JSON of the impl's own state, stored in `DestructionSnapshot.impls`. */\n serialize?(): unknown\n load?(data: unknown): void\n}\n\n/** The fields a weapon or hazard must put in a `Hit`, per damage type. THE impact contract. */\nexport interface ImpactContract {\n required: string[]\n optional: string[]\n note: string\n}\n\nexport const IMPACT_CONTRACT: Record<DamageType, ImpactContract> = {\n ballistic: { required: ['type', 'point', 'direction', 'energy', 'caliber'], optional: ['space', 'source'], note: 'bullets and pellets: joules and diameter in millimetres' },\n blunt: { required: ['type', 'point', 'energy'], optional: ['direction', 'radius', 'space', 'source'], note: 'contact radius in metres (default 3 cm)' },\n slash: { required: ['type', 'point', 'energy'], optional: ['direction', 'radius', 'space', 'source'], note: 'axes, knives, machetes' },\n explosive: { required: ['type', 'point', 'energy', 'radius'], optional: ['space', 'source'], note: 'point is the centre of the blast, radius the range in metres' },\n fire: { required: ['type', 'point', 'temperature', 'radius'], optional: ['duration', 'space', 'source'], note: 'flame temperature in °C; duration in seconds (call every frame with `dt`)' },\n heat: { required: ['type', 'point', 'temperature', 'radius'], optional: ['duration', 'space', 'source'], note: 'heat without flame (cutting torch, hot plate)' },\n}\n\n/** Problems with a hit according to the impact contract (empty when it is valid). */\nexport const checkHit = (hit: Hit): string[] => {\n const c = IMPACT_CONTRACT[hit.type]\n if (!c) return [`unknown damage type \"${String(hit.type)}\"`]\n const out: string[] = []\n for (const f of c.required) {\n const v = (hit as unknown as Record<string, unknown>)[f]\n if (v === undefined || (Array.isArray(v) ? v.some((n) => !Number.isFinite(n)) : typeof v === 'number' && !Number.isFinite(v))) out.push(`${hit.type} hit needs \"${f}\"`)\n }\n return out\n}\n\nexport interface CheckOptions {\n /**\n * Ids of every material the impl may use (the contracts package does not know the materials of your world: pass the ids of\n * `world.materials`, or the built-in plus your own). When omitted, the material check is skipped.\n */\n materials?: Iterable<string>\n}\n\nconst finiteJson = (v: unknown, path: string, out: string[]) => {\n if (typeof v === 'number') {\n if (!Number.isFinite(v)) out.push(`${path} is not a finite number`)\n } else if (Array.isArray(v)) v.forEach((x, i) => finiteJson(x, `${path}[${i}]`, out))\n else if (v && typeof v === 'object') for (const [k, x] of Object.entries(v)) finiteJson(x, `${path}.${k}`, out)\n else if (typeof v === 'function' || typeof v === 'symbol' || typeof v === 'bigint') out.push(`${path} is not JSON`)\n}\n\n/**\n * Contract checker for the test room (it needs no world): `describe()` is valid, a 500 J ballistic hit at a part centre returns well-formed events of this impl, `state()`\n * matches `describe()`, hit points never go negative, `update(0.016)` returns an array and every event is JSON-serializable. It hits the impl\n * (and calls `reset()` afterwards when there is one).\n */\nexport const checkDestructible = (impl: DestructibleImpl, options: CheckOptions = {}): { ok: boolean; problems: string[] } => {\n const problems: string[] = []\n const known = options.materials ? new Set(options.materials) : null\n let spec: DestructibleSpec | undefined\n try {\n spec = impl.describe()\n } catch (e) {\n return { ok: false, problems: [`describe() threw: ${String(e)}`] }\n }\n if (!spec || !Array.isArray(spec.parts) || spec.parts.length === 0) return { ok: false, problems: ['describe() must return at least one part'] }\n const ids = new Set<string>()\n for (const p of spec.parts) {\n if (ids.has(p.id)) problems.push(`duplicate part id \"${p.id}\"`)\n ids.add(p.id)\n if (known && !known.has(p.material)) problems.push(`part \"${p.id}\" has unknown material \"${p.material}\"`)\n if (!p.shape || !['box', 'cylinder', 'sphere'].includes(p.shape.kind)) problems.push(`part \"${p.id}\" has no valid shape`)\n if (!Array.isArray(p.position) || p.position.length !== 3) problems.push(`part \"${p.id}\" has no position`)\n }\n const jointIds = new Set<string>()\n for (const j of (spec.joints ?? []) as JointSpec[]) {\n if (!ids.has(j.a) || !ids.has(j.b)) problems.push(`joint \"${j.id ?? `${j.a}~${j.b}`}\" references an unknown part`)\n const jid = j.id ?? `${j.a}~${j.b}`\n if (jointIds.has(jid)) problems.push(`duplicate joint id \"${jid}\"`)\n jointIds.add(jid)\n }\n const checkState = (label: string) => {\n let st: ObjectState\n try {\n st = impl.state()\n } catch (e) {\n problems.push(`state() threw ${label}: ${String(e)}`)\n return\n }\n const sids = st.parts.map((p) => p.id).sort().join(',')\n if (sids !== [...ids].sort().join(',')) problems.push(`state() part ids do not match describe() ${label}`)\n for (const p of st.parts) if (!(p.hp >= 0)) problems.push(`part \"${p.id}\" has negative or invalid hp ${label}`)\n }\n const checkEvents = (events: unknown, label: string) => {\n if (!Array.isArray(events)) {\n problems.push(`${label} must return an array`)\n return\n }\n const evs = events as DestructionEvent[]\n evs.forEach((e, i) => {\n if (e.object !== impl.id) problems.push(`${label} event ${i} (${e.type}) has object \"${String(e.object)}\", expected \"${impl.id}\"`)\n const part = (e as { part?: string }).part\n if (part !== undefined && !ids.has(part)) problems.push(`${label} event ${i} (${e.type}) names unknown part \"${part}\"`)\n })\n const bad: string[] = []\n finiteJson(evs, 'events', bad)\n problems.push(...bad.map((b) => `${label}: ${b}`))\n try {\n const s = JSON.stringify(evs)\n if (JSON.stringify(JSON.parse(s)) !== s) problems.push(`${label} events do not survive a JSON round trip`)\n } catch (e) {\n problems.push(`${label} events are not JSON-serializable: ${String(e)}`)\n }\n }\n checkState('before the hit')\n const target = spec.parts[0]\n try {\n const hit: Hit = { type: 'ballistic', point: [target.position[0], target.position[1], target.position[2]], direction: [0, 0, -1], energy: 500, caliber: 9 }\n checkEvents(impl.hit(hit), 'hit()')\n } catch (e) {\n problems.push(`hit() threw: ${String(e)}`)\n }\n checkState('after the hit')\n if (impl.update) {\n try {\n checkEvents(impl.update(0.016), 'update()')\n } catch (e) {\n problems.push(`update() threw: ${String(e)}`)\n }\n checkState('after update')\n }\n try {\n impl.reset?.()\n } catch (e) {\n problems.push(`reset() threw: ${String(e)}`)\n }\n return { ok: problems.length === 0, problems }\n}\n","import type { DestructibleSpec } from './destruction'\n\nexport interface CheckSpecOptions {\n /** Known material ids. When given, every part's material must be one of them. */\n materials?: Iterable<string>\n}\n\nexport interface SpecReport {\n /** False when there is at least one problem (warnings do not count). */\n ok: boolean\n problems: string[]\n /** Things that are legal but probably wrong, e.g. structural parts that cannot reach an anchored part. */\n warnings: string[]\n}\n\nconst STRUCTURE_ROLES = ['foundation', 'column', 'beam', 'slab', 'wall', 'partition', 'roof', 'stair', 'none']\nconst BEARS = [true, false, 'a_on_b', 'b_on_a']\n\nconst finite = (n: unknown): n is number => typeof n === 'number' && Number.isFinite(n)\nconst positive = (n: unknown): boolean => finite(n) && n > 0\nconst vec3 = (v: unknown): boolean => Array.isArray(v) && v.length === 3 && v.every(finite)\nconst nonNegative = (n: unknown): boolean => n === undefined || (finite(n) && n >= 0)\n\n/**\n * Static checks on a `DestructibleSpec` (no world needed), for items that give a `spec` instead of an `impl`: unique part ids, known materials\n * (when `options.materials` is given), joints that reference existing, different parts, finite positive sizes, non-negative mass / hp / capacity,\n * valid structure roles and `bears` directions. A structural part with no path of joints to an anchored part is a warning, not a problem: it\n * is allowed, it just falls.\n */\nexport const checkSpec = (spec: DestructibleSpec, options: CheckSpecOptions = {}): SpecReport => {\n const problems: string[] = []\n const warnings: string[] = []\n const materials = options.materials ? new Set(options.materials) : null\n const parts = Array.isArray(spec?.parts) ? spec.parts : []\n if (!Array.isArray(spec?.parts) || parts.length === 0) problems.push('the spec needs at least one part')\n const ids = new Set<string>()\n for (const p of parts) {\n const id = String(p?.id ?? '')\n const label = `part \"${id}\"`\n if (id === '') problems.push('a part has no id')\n else if (ids.has(id)) problems.push(`duplicate part id \"${id}\"`)\n ids.add(id)\n if (materials && !materials.has(p?.material)) problems.push(`${label} has unknown material \"${String(p?.material)}\"`)\n else if (typeof p?.material !== 'string' || p.material === '') problems.push(`${label} needs a material`)\n const s = p?.shape\n if (s?.kind === 'box') {\n if (!Array.isArray(s.size) || s.size.length !== 3 || !s.size.every(positive)) problems.push(`${label} box size must be three finite positive numbers`)\n } else if (s?.kind === 'cylinder') {\n if (!positive(s.radius) || !positive(s.height)) problems.push(`${label} cylinder radius and height must be finite and positive`)\n } else if (s?.kind === 'sphere') {\n if (!positive(s.radius)) problems.push(`${label} sphere radius must be finite and positive`)\n } else problems.push(`${label} has an unknown shape`)\n if (!vec3(p?.position)) problems.push(`${label} needs a finite position [x, y, z]`)\n if (p?.rotation !== undefined && !vec3(p.rotation)) problems.push(`${label} has an invalid rotation`)\n for (const f of ['mass', 'hp', 'thickness'] as const) if (!nonNegative(p?.[f])) problems.push(`${label} ${f} must be a finite number >= 0`)\n if (p?.fill !== undefined && !(finite(p.fill) && p.fill >= 0 && p.fill <= 1)) problems.push(`${label} fill must be between 0 and 1`)\n if (p?.structure) {\n if (!STRUCTURE_ROLES.includes(p.structure.role)) problems.push(`${label} has an invalid structure role \"${String(p.structure.role)}\"`)\n if (!nonNegative(p.structure.capacity)) problems.push(`${label} structure capacity must be a finite number >= 0`)\n }\n if (p?.contains && !nonNegative(p.contains.liters)) problems.push(`${label} contains.liters must be a finite number >= 0`)\n }\n\n const jointIds = new Set<string>()\n const edges: Array<[string, string]> = []\n for (const j of spec?.joints ?? []) {\n const id = j.id ?? `${j.a}~${j.b}`\n const label = `joint \"${id}\"`\n if (jointIds.has(id)) problems.push(`duplicate joint id \"${id}\"`)\n jointIds.add(id)\n if (!ids.has(j.a)) problems.push(`${label} references unknown part \"${String(j.a)}\"`)\n if (!ids.has(j.b)) problems.push(`${label} references unknown part \"${String(j.b)}\"`)\n if (j.a === j.b) problems.push(`${label} joins part \"${String(j.a)}\" to itself`)\n if (j.bears !== undefined && !BEARS.includes(j.bears)) problems.push(`${label} has an invalid bears \"${String(j.bears)}\"`)\n if (!nonNegative(j.strength)) problems.push(`${label} strength must be a finite number >= 0`)\n if (!nonNegative(j.seconds)) problems.push(`${label} seconds must be a finite number >= 0`)\n if (j.bears !== false && ids.has(j.a) && ids.has(j.b) && j.a !== j.b) edges.push([j.a, j.b])\n }\n\n // structural parts must reach an anchored part over the joints (only when the spec lists its joints: otherwise they are inferred later)\n const structural = parts.filter((p) => p?.structure && p.structure.role !== 'none')\n if (structural.length && spec.joints) {\n const anchored = parts.filter((p) => p.anchored || p.structure?.role === 'foundation').map((p) => p.id)\n const adj = new Map<string, string[]>()\n for (const [a, b] of edges) {\n adj.set(a, [...(adj.get(a) ?? []), b])\n adj.set(b, [...(adj.get(b) ?? []), a])\n }\n const seen = new Set(anchored)\n const queue = [...anchored]\n while (queue.length) {\n for (const n of adj.get(queue.pop()!) ?? []) {\n if (seen.has(n)) continue\n seen.add(n)\n queue.push(n)\n }\n }\n const lost = structural.filter((p) => !seen.has(p.id)).map((p) => p.id)\n if (lost.length) warnings.push(`structural part(s) ${lost.map((i) => `\"${i}\"`).join(', ')} cannot reach an anchored part, so they will fall`)\n }\n return { ok: problems.length === 0, problems, warnings }\n}\n","import type { Hit, Vec3 } from './destruction'\n\n/**\n * A ballistic shot (one per pellet) as a weapon module produces it. Plain data: any damage model can consume it (`shotToHit` makes the `Hit`).\n */\nexport interface Shot {\n origin: Vec3\n /** Unit vector. */\n direction: Vec3\n /** Muzzle energy in joules. */\n energy: number\n /** Bullet diameter in millimetres. */\n caliber: number\n /** snake_case calibre id, e.g. `9x19`. */\n caliberId: string\n /** Muzzle speed in m/s. */\n speed: number\n /** Energy at a distance in metres, with the calibre's drag. */\n energyAt(distance: number): number\n pellet: number\n /** snake_case weapon id. */\n weapon: string\n source?: string\n}\n\n/** One use of a non-firearm (melee swing, flame tick, heat tick, throw, tool tick, extinguisher tick). */\nexport type Use =\n | { kind: 'melee'; damage: 'blunt' | 'slash'; energy: number; radius: number; reach: number; origin: Vec3; direction: Vec3 }\n | { kind: 'flame'; temperature: number; radius: number; range: number; cone: boolean; duration: number; origin: Vec3; direction: Vec3 }\n | { kind: 'heat'; temperature: number; radius: number; range: number; duration: number; origin: Vec3; direction: Vec3 }\n | { kind: 'throw'; energy: number; radius: number; fuse: number; velocity: Vec3; origin: Vec3; fire?: { temperature: number; radius: number; seconds: number } }\n | { kind: 'tool'; tool: string; reach: number; duration: number; origin: Vec3; direction: Vec3 }\n | { kind: 'extinguish'; range: number; coolC: number; duration: number; origin: Vec3; direction: Vec3 }\n | { kind: 'hand'; reach: number; origin: Vec3; direction: Vec3 }\n\n/**\n * The `Hit` a ballistic shot makes at `point` (world space): the energy is what is left of the shot at that distance from its origin\n * (`shot.energyAt`), the direction and calibre come from the shot. `normal` (the surface normal at the point, when the caller knows it) does not\n * change the hit; it is accepted so that callers can pass what their raycast returned and so that a stricter implementation could use it.\n */\nexport const shotToHit = (shot: Shot, point: Vec3, normal?: Vec3): Hit => {\n void normal\n const dx = point[0] - shot.origin[0]\n const dy = point[1] - shot.origin[1]\n const dz = point[2] - shot.origin[2]\n const distance = Math.hypot(dx, dy, dz)\n return {\n type: 'ballistic',\n point: [point[0], point[1], point[2]],\n direction: [shot.direction[0], shot.direction[1], shot.direction[2]],\n energy: shot.energyAt(distance),\n caliber: shot.caliber,\n source: shot.source ?? shot.weapon,\n }\n}\n","import type { Vec3 } from './destruction'\n\n/** Pose of one part (or of the whole item) at a key: position offset in metres and Euler XYZ rotation in radians, both relative to the rest pose. */\nexport interface AnimationPose {\n position?: Vec3\n rotation?: Vec3\n}\n\nexport interface AnimationKey {\n /** Seconds from the start of the clip. */\n t: number\n /** Pose of the item's root. */\n position?: Vec3\n rotation?: Vec3\n /** Poses of named parts: the key is a destruction part id (a pistol `reload` moves `mag`; a car door `open` rotates `door_l`). */\n parts?: Record<string, AnimationPose>\n}\n\nexport interface AnimationEventSpec {\n /** Seconds from the start of the clip. */\n t: number\n /** snake_case type the host maps (`sound`, `eject_casing`, `door_latch`...). */\n type: string\n data?: Record<string, unknown>\n}\n\n/** A use animation a module brings with its item. Poses between keys are interpolated by the player (the test room does it linearly). */\nexport interface AnimationClipSpec {\n /** snake_case: `reload`, `open`, `drink`... Unique within the item. */\n id: string\n /** Seconds. */\n duration: number\n keys: AnimationKey[]\n events?: AnimationEventSpec[]\n}\n\n/** What an item exposes when it brings its own animations. */\nexport interface ItemAnimationContract {\n animations: AnimationClipSpec[]\n}\n\nconst finite3 = (v: unknown): boolean => Array.isArray(v) && v.length === 3 && v.every((n) => typeof n === 'number' && Number.isFinite(n))\n\n/**\n * Problems with a clip (empty when it is valid): a snake_case id, a positive finite duration, at least one key, key and event times inside\n * `[0, duration]` and not going backwards, finite vectors, every named part one of `partIds`, event types that are non-empty strings and\n * JSON-serializable event data.\n */\nexport const checkAnimation = (clip: AnimationClipSpec, partIds: Iterable<string>): { ok: boolean; problems: string[] } => {\n const problems: string[] = []\n const parts = new Set(partIds)\n const id = String(clip?.id ?? '')\n if (!/^[a-z][a-z0-9_]*$/.test(id)) problems.push(`clip id \"${id}\" must be snake_case`)\n const label = `clip \"${id}\"`\n if (!(typeof clip?.duration === 'number' && Number.isFinite(clip.duration) && clip.duration > 0)) problems.push(`${label} needs a positive finite duration`)\n const dur = typeof clip?.duration === 'number' && clip.duration > 0 ? clip.duration : Infinity\n if (!Array.isArray(clip?.keys) || clip.keys.length === 0) {\n problems.push(`${label} needs at least one key`)\n return { ok: false, problems }\n }\n let prev = -Infinity\n clip.keys.forEach((k, i) => {\n if (!(typeof k.t === 'number' && Number.isFinite(k.t)) || k.t < 0 || k.t > dur + 1e-9) problems.push(`${label} key ${i} has t=${String(k.t)} outside 0..${dur}`)\n else if (k.t < prev) problems.push(`${label} key ${i} goes back in time (${k.t} < ${prev})`)\n else prev = k.t\n for (const f of ['position', 'rotation'] as const) if (k[f] !== undefined && !finite3(k[f])) problems.push(`${label} key ${i} has an invalid ${f}`)\n for (const [pid, pose] of Object.entries(k.parts ?? {})) {\n if (!parts.has(pid)) problems.push(`${label} key ${i} moves unknown part \"${pid}\"`)\n for (const f of ['position', 'rotation'] as const) if (pose?.[f] !== undefined && !finite3(pose[f])) problems.push(`${label} key ${i} part \"${pid}\" has an invalid ${f}`)\n }\n })\n let prevEv = -Infinity\n ;(clip.events ?? []).forEach((e, i) => {\n if (!(typeof e.t === 'number' && Number.isFinite(e.t)) || e.t < 0 || e.t > dur + 1e-9) problems.push(`${label} event ${i} has t=${String(e.t)} outside 0..${dur}`)\n else if (e.t < prevEv) problems.push(`${label} event ${i} goes back in time`)\n else prevEv = e.t\n if (typeof e.type !== 'string' || e.type === '') problems.push(`${label} event ${i} needs a type`)\n try {\n JSON.stringify(e.data ?? {})\n } catch {\n problems.push(`${label} event ${i} data is not JSON`)\n }\n })\n return { ok: problems.length === 0, problems }\n}\n","import type { PartShape, Quat, Vec3 } from './types'\n\nconst EPS = 1e-9\n\n/** Small vector helpers (arrays of three numbers). Pure functions; they allocate a new array. */\nexport const vec = {\n add: (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]],\n sub: (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]],\n scale: (a: Vec3, s: number): Vec3 => [a[0] * s, a[1] * s, a[2] * s],\n dot: (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2],\n cross: (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]],\n length: (a: Vec3): number => Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]),\n distance: (a: Vec3, b: Vec3): number => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]),\n normalize: (a: Vec3, fallback: Vec3 = [0, 1, 0]): Vec3 => {\n const l = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2])\n return l < EPS ? [fallback[0], fallback[1], fallback[2]] : [a[0] / l, a[1] / l, a[2] / l]\n },\n lerp: (a: Vec3, b: Vec3, t: number): Vec3 => [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t],\n /** `a + b * s` */\n madd: (a: Vec3, b: Vec3, s: number): Vec3 => [a[0] + b[0] * s, a[1] + b[1] * s, a[2] + b[2] * s],\n}\n\nconst IDENTITY: Quat = [0, 0, 0, 1]\n\n/** Quaternion helpers (`[x, y, z, w]`). */\nexport const quat = {\n identity: (): Quat => [IDENTITY[0], IDENTITY[1], IDENTITY[2], IDENTITY[3]],\n /** Hamilton product `a * b` (apply `b` first, then `a`). */\n mul: (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n ],\n conjugate: (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]],\n normalize: (q: Quat): Quat => {\n const l = Math.hypot(q[0], q[1], q[2], q[3])\n return l < EPS ? [0, 0, 0, 1] : [q[0] / l, q[1] / l, q[2] / l, q[3] / l]\n },\n /** Rotation of `angle` radians around a unit `axis`. */\n fromAxisAngle: (axis: Vec3, angle: number): Quat => {\n const s = Math.sin(angle / 2)\n return [axis[0] * s, axis[1] * s, axis[2] * s, Math.cos(angle / 2)]\n },\n /** Rotation matrix, row-major 3x3. */\n toMatrix: (q: Quat): number[] => {\n const [x, y, z, w] = q\n const xx = x * x, yy = y * y, zz = z * z, xy = x * y, xz = x * z, yz = y * z, wx = w * x, wy = w * y, wz = w * z\n return [1 - 2 * (yy + zz), 2 * (xy - wz), 2 * (xz + wy), 2 * (xy + wz), 1 - 2 * (xx + zz), 2 * (yz - wx), 2 * (xz - wy), 2 * (yz + wx), 1 - 2 * (xx + yy)]\n },\n /** Quaternion from three orthonormal columns (the images of the x, y and z axes). */\n fromColumns: (cx: Vec3, cy: Vec3, cz: Vec3): Quat => {\n const m00 = cx[0], m10 = cx[1], m20 = cx[2]\n const m01 = cy[0], m11 = cy[1], m21 = cy[2]\n const m02 = cz[0], m12 = cz[1], m22 = cz[2]\n const tr = m00 + m11 + m22\n let q: Quat\n if (tr > 0) {\n const s = Math.sqrt(tr + 1) * 2\n q = [(m21 - m12) / s, (m02 - m20) / s, (m10 - m01) / s, 0.25 * s]\n } else if (m00 > m11 && m00 > m22) {\n const s = Math.sqrt(1 + m00 - m11 - m22) * 2\n q = [0.25 * s, (m01 + m10) / s, (m02 + m20) / s, (m21 - m12) / s]\n } else if (m11 > m22) {\n const s = Math.sqrt(1 + m11 - m00 - m22) * 2\n q = [(m01 + m10) / s, 0.25 * s, (m12 + m21) / s, (m02 - m20) / s]\n } else {\n const s = Math.sqrt(1 + m22 - m00 - m11) * 2\n q = [(m02 + m20) / s, (m12 + m21) / s, 0.25 * s, (m10 - m01) / s]\n }\n return quat.normalize(q)\n },\n}\n\n/** Quaternion from Euler angles in radians, order XYZ (the three.js default). */\nexport const quatFromEuler = (x: number, y: number, z: number): Quat => {\n const c1 = Math.cos(x / 2), c2 = Math.cos(y / 2), c3 = Math.cos(z / 2)\n const s1 = Math.sin(x / 2), s2 = Math.sin(y / 2), s3 = Math.sin(z / 2)\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n}\n\n/** Rotate a vector by a quaternion. */\nexport const rotateVec = (q: Quat, v: Vec3): Vec3 => {\n const qx = q[0], qy = q[1], qz = q[2], qw = q[3]\n const tx = 2 * (qy * v[2] - qz * v[1])\n const ty = 2 * (qz * v[0] - qx * v[2])\n const tz = 2 * (qx * v[1] - qy * v[0])\n return [v[0] + qw * tx + (qy * tz - qz * ty), v[1] + qw * ty + (qz * tx - qx * tz), v[2] + qw * tz + (qx * ty - qy * tx)]\n}\n\n/** World point to the local space of a transform (`position`, `rotation`). */\nexport const toLocal = (position: Vec3, rotation: Quat, p: Vec3): Vec3 =>\n rotateVec([-rotation[0], -rotation[1], -rotation[2], rotation[3]], [p[0] - position[0], p[1] - position[1], p[2] - position[2]])\n\n/** Local point of a transform (`position`, `rotation`) to world space. */\nexport const toWorld = (position: Vec3, rotation: Quat, p: Vec3): Vec3 => {\n const r = rotateVec(rotation, p)\n return [r[0] + position[0], r[1] + position[1], r[2] + position[2]]\n}\n\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n// Shapes (part space: centred on the origin, cylinders along +Y)\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n\n/** Dimensions of the bounding box of a shape, in the shape's own axes. */\nexport const shapeDims = (s: PartShape): Vec3 => {\n if (s.kind === 'box') return [s.size[0], s.size[1], s.size[2]]\n if (s.kind === 'cylinder') return [s.radius * 2, s.height, s.radius * 2]\n return [s.radius * 2, s.radius * 2, s.radius * 2]\n}\n\n/** Radius of the sphere that encloses the shape. */\nexport const shapeBound = (s: PartShape): number => {\n if (s.kind === 'box') return 0.5 * Math.hypot(s.size[0], s.size[1], s.size[2])\n if (s.kind === 'cylinder') return Math.hypot(s.radius, s.height / 2)\n return s.radius\n}\n\nexport const shapeArea = (s: PartShape): number => {\n if (s.kind === 'box') return 2 * (s.size[0] * s.size[1] + s.size[1] * s.size[2] + s.size[0] * s.size[2])\n if (s.kind === 'cylinder') return 2 * Math.PI * s.radius * s.height + 2 * Math.PI * s.radius * s.radius\n return 4 * Math.PI * s.radius * s.radius\n}\n\nexport interface ShapeRay {\n /** Entry distance along the ray (negative when the origin is inside). */\n t0: number\n /** Normal at the entry, outward. */\n n0: Vec3\n /** Exit distance. */\n t1: number\n /** Normal at the exit, outward. */\n n1: Vec3\n}\n\n/** Exact ray intersection with a shape in part space. `d` need not be normalised but must be non-zero. */\nexport const rayShape = (s: PartShape, o: Vec3, d: Vec3): ShapeRay | null => {\n if (s.kind === 'box') {\n let tmin = -Infinity, tmax = Infinity\n let a0 = 0, a1 = 0, s0 = 1, s1 = 1\n for (let i = 0; i < 3; i++) {\n const h = s.size[i] / 2\n if (Math.abs(d[i]) < EPS) {\n if (Math.abs(o[i]) > h) return null\n continue\n }\n let ta = (-h - o[i]) / d[i]\n let tb = (h - o[i]) / d[i]\n let sa = -1, sb = 1\n if (ta > tb) {\n const t = ta\n ta = tb\n tb = t\n sa = 1\n sb = -1\n }\n if (ta > tmin) {\n tmin = ta\n a0 = i\n s0 = sa\n }\n if (tb < tmax) {\n tmax = tb\n a1 = i\n s1 = sb\n }\n if (tmin > tmax) return null\n }\n if (tmax < 0 || !Number.isFinite(tmin) || !Number.isFinite(tmax)) return null\n const n0: Vec3 = [0, 0, 0]\n const n1: Vec3 = [0, 0, 0]\n n0[a0] = s0\n n1[a1] = s1\n return { t0: tmin, n0, t1: tmax, n1 }\n }\n if (s.kind === 'sphere') {\n const b = vec.dot(o, d)\n const a = vec.dot(d, d)\n const c = vec.dot(o, o) - s.radius * s.radius\n const disc = b * b - a * c\n if (disc < 0) return null\n const sq = Math.sqrt(disc)\n const t0 = (-b - sq) / a\n const t1 = (-b + sq) / a\n if (t1 < 0) return null\n const p0 = vec.madd(o, d, t0)\n const p1 = vec.madd(o, d, t1)\n return { t0, n0: vec.normalize(p0), t1, n1: vec.normalize(p1) }\n }\n // cylinder along Y: intersection of the infinite cylinder interval and the y slab\n const r = s.radius\n const hh = s.height / 2\n const a = d[0] * d[0] + d[2] * d[2]\n const c = o[0] * o[0] + o[2] * o[2] - r * r\n let tA = -Infinity, tB = Infinity\n if (a > EPS) {\n const b = o[0] * d[0] + o[2] * d[2]\n const disc = b * b - a * c\n if (disc < 0) return null\n const sq = Math.sqrt(disc)\n tA = (-b - sq) / a\n tB = (-b + sq) / a\n } else if (c > 0) return null\n let yA = -Infinity, yB = Infinity\n if (Math.abs(d[1]) > EPS) {\n yA = (-hh - o[1]) / d[1]\n yB = (hh - o[1]) / d[1]\n if (yA > yB) {\n const t = yA\n yA = yB\n yB = t\n }\n } else if (Math.abs(o[1]) > hh) return null\n const t0 = Math.max(tA, yA)\n const t1 = Math.min(tB, yB)\n if (t0 > t1 || t1 < 0 || !Number.isFinite(t0) || !Number.isFinite(t1)) return null\n const normalAt = (t: number, fromSide: boolean, sign: number): Vec3 => {\n if (fromSide) {\n const p = vec.madd(o, d, t)\n return vec.normalize([p[0], 0, p[2]], [1, 0, 0])\n }\n return [0, sign, 0]\n }\n const n0 = normalAt(t0, tA >= yA, d[1] > 0 ? -1 : 1)\n const n1 = normalAt(t1, tB <= yB, d[1] > 0 ? 1 : -1)\n return { t0, n0, t1, n1 }\n}\n\n/** Distance from a part-space point to the shape (0 inside). */\nexport const distanceToShape = (s: PartShape, p: Vec3): number => {\n if (s.kind === 'box') {\n const dx = Math.max(Math.abs(p[0]) - s.size[0] / 2, 0)\n const dy = Math.max(Math.abs(p[1]) - s.size[1] / 2, 0)\n const dz = Math.max(Math.abs(p[2]) - s.size[2] / 2, 0)\n return Math.hypot(dx, dy, dz)\n }\n if (s.kind === 'sphere') return Math.max(0, vec.length(p) - s.radius)\n const dr = Math.max(0, Math.hypot(p[0], p[2]) - s.radius)\n const dy = Math.max(0, Math.abs(p[1]) - s.height / 2)\n return Math.hypot(dr, dy)\n}\n\n/** Nearest point on the surface of a shape to a part-space point, with the outward normal. */\nexport const surfacePoint = (s: PartShape, p: Vec3): { point: Vec3; normal: Vec3 } => {\n if (s.kind === 'box') {\n const h: Vec3 = [s.size[0] / 2, s.size[1] / 2, s.size[2] / 2]\n const inside = Math.abs(p[0]) <= h[0] && Math.abs(p[1]) <= h[1] && Math.abs(p[2]) <= h[2]\n if (!inside) {\n const c: Vec3 = [Math.max(-h[0], Math.min(h[0], p[0])), Math.max(-h[1], Math.min(h[1], p[1])), Math.max(-h[2], Math.min(h[2], p[2]))]\n return { point: c, normal: vec.normalize(vec.sub(p, c)) }\n }\n let axis = 0\n let best = Infinity\n for (let i = 0; i < 3; i++) {\n const g = h[i] - Math.abs(p[i])\n if (g < best) {\n best = g\n axis = i\n }\n }\n const sign = p[axis] >= 0 ? 1 : -1\n const point: Vec3 = [p[0], p[1], p[2]]\n point[axis] = sign * h[axis]\n const normal: Vec3 = [0, 0, 0]\n normal[axis] = sign\n return { point, normal }\n }\n if (s.kind === 'sphere') {\n const n = vec.normalize(p)\n return { point: vec.scale(n, s.radius), normal: n }\n }\n const rho = Math.hypot(p[0], p[2])\n const hh = s.height / 2\n const inside = rho <= s.radius && Math.abs(p[1]) <= hh\n if (!inside) {\n const k = rho > s.radius ? s.radius / rho : 1\n const c: Vec3 = [p[0] * k, Math.max(-hh, Math.min(hh, p[1])), p[2] * k]\n return { point: c, normal: vec.normalize(vec.sub(p, c)) }\n }\n if (s.radius - rho < hh - Math.abs(p[1])) {\n const k = rho < EPS ? 0 : s.radius / rho\n const point: Vec3 = rho < EPS ? [s.radius, p[1], 0] : [p[0] * k, p[1], p[2] * k]\n return { point, normal: vec.normalize([point[0], 0, point[2]], [1, 0, 0]) }\n }\n const sign = p[1] >= 0 ? 1 : -1\n return { point: [p[0], sign * hh, p[2]], normal: [0, sign, 0] }\n}\n\n/** Axis-aligned bounds of a shape with a given centre and orientation. */\nexport const aabbOf = (s: PartShape, center: Vec3, q: Quat): { min: Vec3; max: Vec3 } => {\n let hx: number, hy: number, hz: number\n if (s.kind === 'sphere') {\n hx = hy = hz = s.radius\n } else {\n const m = quat.toMatrix(q)\n if (s.kind === 'box') {\n const a = s.size[0] / 2, b = s.size[1] / 2, c = s.size[2] / 2\n hx = Math.abs(m[0]) * a + Math.abs(m[1]) * b + Math.abs(m[2]) * c\n hy = Math.abs(m[3]) * a + Math.abs(m[4]) * b + Math.abs(m[5]) * c\n hz = Math.abs(m[6]) * a + Math.abs(m[7]) * b + Math.abs(m[8]) * c\n } else {\n const ax = [m[1], m[4], m[7]]\n const hh = s.height / 2\n const e = (i: number) => s.radius * Math.sqrt(Math.max(0, 1 - ax[i] * ax[i])) + hh * Math.abs(ax[i])\n hx = e(0)\n hy = e(1)\n hz = e(2)\n }\n }\n return { min: [center[0] - hx, center[1] - hy, center[2] - hz], max: [center[0] + hx, center[1] + hy, center[2] + hz] }\n}\n\n/** Seeded generator (mulberry32). The state is a single int32, so it round-trips through JSON. */\nexport interface Rng {\n next(): number\n state(): number\n set(state: number): void\n}\n\nexport const createRng = (seed: number): Rng => {\n let s = seed | 0\n return {\n next() {\n s = (s + 0x6d2b79f5) | 0\n let t = Math.imul(s ^ (s >>> 15), 1 | s)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n },\n state: () => s,\n set(v) {\n s = v | 0\n },\n }\n}\n","import { quat } from './math'\nimport type { Fragment, FractureStyle, Quat, Vec3 } from './types'\n\n/** A fragment in the part's local space (centre, size in the fragment's own axes, orientation relative to the part). */\nexport interface PlannedFragment {\n center: Vec3\n size: Vec3\n q: Quat\n shape: Fragment['shape']\n /** Share of the part's mass (unnormalised). */\n weight: number\n}\n\nexport interface PlanInput {\n style: FractureStyle\n /** Bounding box dimensions in part axes. */\n dims: Vec3\n thickness: number\n /** Index 0..2 of the grain axis, if any. */\n grain?: number\n /** Impact point in part space. */\n hit: Vec3\n fragmentSize: [number, number]\n maxFragments: number\n rnd: () => number\n}\n\ninterface Box {\n c: Vec3\n s: Vec3\n}\n\n/** Split a box into `count` pieces by cutting the largest piece along its longest allowed axis. */\nconst bsp = (root: Box, count: number, axes: number[], rnd: () => number): Box[] => {\n const pieces: Box[] = [root]\n const vol = (b: Box) => axes.reduce((v, a) => v * b.s[a], 1)\n while (pieces.length < count) {\n let bi = 0\n for (let i = 1; i < pieces.length; i++) if (vol(pieces[i]) > vol(pieces[bi])) bi = i\n const b = pieces[bi]\n let ax = axes[0]\n for (const a of axes) if (b.s[a] > b.s[ax]) ax = a\n if (b.s[ax] < 1e-4) break\n const r = 0.3 + 0.4 * rnd()\n const l1 = b.s[ax] * r\n const l2 = b.s[ax] - l1\n const c1: Vec3 = [b.c[0], b.c[1], b.c[2]]\n const c2: Vec3 = [b.c[0], b.c[1], b.c[2]]\n c1[ax] = b.c[ax] - b.s[ax] / 2 + l1 / 2\n c2[ax] = b.c[ax] + b.s[ax] / 2 - l2 / 2\n const s1: Vec3 = [b.s[0], b.s[1], b.s[2]]\n const s2: Vec3 = [b.s[0], b.s[1], b.s[2]]\n s1[ax] = l1\n s2[ax] = l2\n pieces[bi] = { c: c1, s: s1 }\n pieces.push({ c: c2, s: s2 })\n }\n return pieces\n}\n\nconst parity = (p: [number, number, number]): number => {\n let inv = 0\n for (let i = 0; i < 3; i++) for (let j = i + 1; j < 3; j++) if (p[i] > p[j]) inv++\n return inv % 2 === 0 ? 1 : -1\n}\n\n/** Orientation whose x, y, z axes are the part axes `ax`, `ay`, `az`, then rotated by `angle` around its own z. */\nconst frame = (ax: number, ay: number, az: number, angle = 0): Quat => {\n const e = (i: number): Vec3 => [i === 0 ? 1 : 0, i === 1 ? 1 : 0, i === 2 ? 1 : 0]\n const z = e(az)\n const sg = parity([ax, ay, az])\n const q = quat.fromColumns(e(ax), e(ay), [z[0] * sg, z[1] * sg, z[2] * sg])\n return angle === 0 ? q : quat.mul(q, quat.fromAxisAngle([0, 0, 1], angle))\n}\n\nconst clamp = (v: number, a: number, b: number) => Math.max(a, Math.min(b, v))\n\n/** Deterministic fragment layout for a failed part, in part space. */\nexport const planFragments = (inp: PlanInput): PlannedFragment[] => {\n const { style, dims, rnd, maxFragments } = inp\n const [fmin, fmax] = inp.fragmentSize\n const mean = (fmin + fmax) / 2\n const root: Box = { c: [0, 0, 0], s: [dims[0], dims[1], dims[2]] }\n const idq = quat.identity()\n const out: PlannedFragment[] = []\n const sorted = [0, 1, 2].sort((a, b) => dims[a] - dims[b])\n const t = sorted[0]\n const [u, v] = [sorted[1], sorted[2]].sort((a, b) => a - b)\n\n if (style === 'snap') {\n const n = Math.min(maxFragments, 2 + Math.floor(rnd() * 3))\n for (const b of bsp(root, n, [0, 1, 2], rnd)) out.push({ center: b.c, size: b.s, q: idq, shape: 'slab', weight: b.s[0] * b.s[1] * b.s[2] })\n return out\n }\n if (style === 'crumble' || style === 'none') {\n const n = clamp(Math.ceil((dims[0] * dims[1] * dims[2]) / (mean * mean * mean)), 4, maxFragments)\n for (const b of bsp(root, n, [0, 1, 2], rnd)) out.push({ center: b.c, size: b.s, q: idq, shape: 'chunk', weight: b.s[0] * b.s[1] * b.s[2] })\n return out\n }\n if (style === 'splinter') {\n const g = inp.grain ?? [0, 1, 2].sort((a, b) => dims[b] - dims[a])[0]\n const [a, b] = [0, 1, 2].filter((i) => i !== g)\n const w = Math.max(fmin * 1.5, 0.01)\n const c = clamp(Math.round((dims[a] * dims[b]) / (w * w)), 3, Math.max(3, Math.floor(maxFragments / 2)))\n const maxLen = fmax * 4\n const cells = bsp(root, c, [a, b], rnd)\n const pieces: Box[] = []\n for (const cell of cells) {\n let list = [cell]\n const extra = rnd() < 0.4 ? 1 : 0\n const k = Math.max(1, Math.ceil(dims[g] / maxLen)) + extra\n list = bsp(cell, k, [g], rnd)\n for (const p of list) pieces.push(p)\n }\n for (const p of pieces.slice(0, maxFragments)) {\n out.push({ center: p.c, size: [p.s[g], p.s[a], p.s[b]], q: frame(g, a, b), shape: 'splinter', weight: p.s[0] * p.s[1] * p.s[2] })\n }\n return out\n }\n if (style === 'tear') {\n const n = clamp(Math.round((dims[u] * dims[v]) / (mean * mean)), 3, maxFragments)\n const th = Math.min(inp.thickness, dims[t])\n for (const b of bsp(root, n, [u, v], rnd)) {\n out.push({ center: [b.c[0], b.c[1], b.c[2]], size: [b.s[u], b.s[v], th], q: frame(u, v, t), shape: 'scrap', weight: b.s[u] * b.s[v] })\n }\n return out\n }\n // shatter: thin shards radiating from the impact\n const th = Math.min(inp.thickness, dims[t])\n const Hu = dims[u] / 2, Hv = dims[v] / 2\n const hu = clamp(inp.hit[u], -Hu * 0.95, Hu * 0.95)\n const hv = clamp(inp.hit[v], -Hv * 0.95, Hv * 0.95)\n const R = Math.max(Math.hypot(Hu + Math.abs(hu), Hv + Math.abs(hv)), 0.02)\n const n = clamp(Math.round((dims[u] * dims[v]) / (mean * mean)), 6, maxFragments)\n const sectors = clamp(Math.round(Math.sqrt(n * 1.6)), 5, 10)\n const rings = Math.max(1, Math.ceil(n / sectors))\n const radii: number[] = []\n for (let k = 0; k <= rings; k++) radii.push(R * Math.pow(k / rings, 1.3))\n const cap = fmax * 1.5\n for (let j = 0; j < sectors && out.length < maxFragments; j++) {\n const theta = (j + (rnd() - 0.5) * 0.4) * ((Math.PI * 2) / sectors)\n for (let k = 0; k < rings && out.length < maxFragments; k++) {\n const rm = (radii[k] + radii[k + 1]) / 2\n const cu = hu + rm * Math.cos(theta)\n const cv = hv + rm * Math.sin(theta)\n if (Math.abs(cu) > Hu + 0.01 || Math.abs(cv) > Hv + 0.01) continue\n const radial = clamp(radii[k + 1] - radii[k], 0.01, cap)\n const tang = clamp(radii[k + 1] * ((Math.PI * 2) / sectors) * 0.9, 0.01, cap)\n const c: Vec3 = [0, 0, 0]\n c[u] = clamp(cu, -Hu * 0.98, Hu * 0.98)\n c[v] = clamp(cv, -Hv * 0.98, Hv * 0.98)\n c[t] = 0\n out.push({ center: c, size: [radial, tang, th], q: frame(u, v, t, theta), shape: 'shard', weight: radial * tang })\n }\n }\n if (out.length === 0) out.push({ center: [0, 0, 0], size: [dims[u], dims[v], th], q: frame(u, v, t), shape: 'shard', weight: 1 })\n return out\n}\n","[\n {\n \"id\": \"steel\",\n \"density\": 7850,\n \"hpPerKg\": 400,\n \"penetration\": 110,\n \"ductility\": 0.9,\n \"fracture\": \"none\",\n \"damageScale\": {\n \"slash\": 0.1,\n \"blunt\": 0.8\n },\n \"hitDebris\": \"sparks\",\n \"breakDebris\": \"sparks\",\n \"ricochetDeg\": 20,\n \"thermal\": {\n \"meltC\": 1450,\n \"meltRate\": 0.05,\n \"conductivity\": 0.5,\n \"heatCapacity\": 3\n },\n \"visual\": {\n \"glows\": true\n },\n \"tags\": [\n \"metal\",\n \"conductive\"\n ],\n \"compressive\": 2000000\n },\n {\n \"id\": \"cast_iron\",\n \"density\": 7200,\n \"hpPerKg\": 150,\n \"penetration\": 160,\n \"ductility\": 0.2,\n \"fracture\": \"snap\",\n \"fragmentSize\": [\n 0.08,\n 0.3\n ],\n \"damageScale\": {\n \"slash\": 0.1,\n \"blunt\": 1.2\n },\n \"hitDebris\": \"sparks\",\n \"breakDebris\": \"chips\",\n \"ricochetDeg\": 15,\n \"thermal\": {\n \"meltC\": 1200,\n \"meltRate\": 0.05,\n \"conductivity\": 0.45,\n \"heatCapacity\": 3\n },\n \"visual\": {\n \"glows\": true\n },\n \"tags\": [\n \"metal\",\n \"conductive\"\n ],\n \"compressive\": 1500000\n },\n {\n \"id\": \"aluminium\",\n \"density\": 2700,\n \"hpPerKg\": 250,\n \"penetration\": 60,\n \"ductility\": 0.85,\n \"fracture\": \"none\",\n \"damageScale\": {\n \"slash\": 0.2\n },\n \"hitDebris\": \"sparks\",\n \"breakDebris\": \"sparks\",\n \"ricochetDeg\": 15,\n \"thermal\": {\n \"meltC\": 660,\n \"meltRate\": 0.06,\n \"conductivity\": 0.8,\n \"heatCapacity\": 1.5\n },\n \"visual\": {\n \"glows\": true\n },\n \"tags\": [\n \"metal\",\n \"conductive\"\n ],\n \"compressive\": 800000\n },\n {\n \"id\": \"copper\",\n \"density\": 8960,\n \"hpPerKg\": 300,\n \"penetration\": 70,\n \"ductility\": 0.95,\n \"fracture\": \"none\",\n \"damageScale\": {\n \"slash\": 0.2\n },\n \"hitDebris\": \"sparks\",\n \"breakDebris\": \"sparks\",\n \"ricochetDeg\": 15,\n \"thermal\": {\n \"meltC\": 1085,\n \"meltRate\": 0.05,\n \"conductivity\": 1,\n \"heatCapacity\": 2.5\n },\n \"visual\": {\n \"glows\": true\n },\n \"tags\": [\n \"metal\",\n \"conductive\"\n ],\n \"compressive\": 1000000\n },\n {\n \"id\": \"wood_soft\",\n \"density\": 500,\n \"hpPerKg\": 90,\n \"penetration\": 9,\n \"ductility\": 0.35,\n \"fracture\": \"splinter\",\n \"fragmentSize\": [\n 0.03,\n 0.15\n ],\n \"damageScale\": {\n \"blunt\": 1.2,\n \"slash\": 1.5\n },\n \"hitDebris\": \"splinters\",\n \"breakDebris\": \"splinters\",\n \"thermal\": {\n \"ignitionC\": 300,\n \"flameC\": 800,\n \"fuelFraction\": 0.9,\n \"burnRate\": 0.012,\n \"conductivity\": 0.05,\n \"heatCapacity\": 1.2,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"wood\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 100000\n },\n {\n \"id\": \"wood_hard\",\n \"density\": 750,\n \"hpPerKg\": 140,\n \"penetration\": 14,\n \"ductility\": 0.3,\n \"fracture\": \"splinter\",\n \"fragmentSize\": [\n 0.03,\n 0.2\n ],\n \"damageScale\": {\n \"slash\": 1.2\n },\n \"hitDebris\": \"splinters\",\n \"breakDebris\": \"splinters\",\n \"thermal\": {\n \"ignitionC\": 330,\n \"flameC\": 800,\n \"fuelFraction\": 0.9,\n \"burnRate\": 0.01,\n \"conductivity\": 0.06,\n \"heatCapacity\": 1.4,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"wood\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 150000\n },\n {\n \"id\": \"plywood\",\n \"density\": 600,\n \"hpPerKg\": 70,\n \"penetration\": 7,\n \"ductility\": 0.3,\n \"fracture\": \"snap\",\n \"fragmentSize\": [\n 0.1,\n 0.4\n ],\n \"damageScale\": {\n \"slash\": 1.3\n },\n \"hitDebris\": \"splinters\",\n \"breakDebris\": \"splinters\",\n \"thermal\": {\n \"ignitionC\": 300,\n \"flameC\": 800,\n \"fuelFraction\": 0.85,\n \"burnRate\": 0.013,\n \"conductivity\": 0.05,\n \"heatCapacity\": 1.2,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"wood\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 60000\n },\n {\n \"id\": \"mdf\",\n \"density\": 750,\n \"hpPerKg\": 45,\n \"penetration\": 6,\n \"ductility\": 0.15,\n \"fracture\": \"snap\",\n \"fragmentSize\": [\n 0.08,\n 0.35\n ],\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"dust\",\n \"thermal\": {\n \"ignitionC\": 290,\n \"flameC\": 750,\n \"fuelFraction\": 0.85,\n \"burnRate\": 0.014,\n \"conductivity\": 0.05,\n \"heatCapacity\": 1.2,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"wood\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 30000\n },\n {\n \"id\": \"glass\",\n \"density\": 2500,\n \"hpPerKg\": 12,\n \"penetration\": 6,\n \"ductility\": 0.02,\n \"fracture\": \"shatter\",\n \"fragmentSize\": [\n 0.05,\n 0.25\n ],\n \"damageScale\": {\n \"blunt\": 1.5\n },\n \"hitDebris\": \"shards\",\n \"breakDebris\": \"shards\",\n \"ricochetDeg\": 8,\n \"thermal\": {\n \"meltC\": 1400,\n \"meltRate\": 0.03,\n \"conductivity\": 0.1,\n \"heatCapacity\": 1.5,\n \"thermalShockC\": 150\n },\n \"visual\": {\n \"glows\": true,\n \"transparent\": true\n },\n \"tags\": [\n \"glass\",\n \"brittle\"\n ],\n \"compressive\": 100000\n },\n {\n \"id\": \"tempered_glass\",\n \"density\": 2500,\n \"hpPerKg\": 30,\n \"penetration\": 9,\n \"ductility\": 0.02,\n \"fracture\": \"crumble\",\n \"fragmentSize\": [\n 0.006,\n 0.02\n ],\n \"hitDebris\": \"shards\",\n \"breakDebris\": \"shards\",\n \"ricochetDeg\": 8,\n \"thermal\": {\n \"meltC\": 1400,\n \"meltRate\": 0.03,\n \"conductivity\": 0.1,\n \"heatCapacity\": 1.5,\n \"thermalShockC\": 250\n },\n \"visual\": {\n \"glows\": true,\n \"transparent\": true\n },\n \"tags\": [\n \"glass\",\n \"brittle\"\n ],\n \"compressive\": 200000\n },\n {\n \"id\": \"ceramic\",\n \"density\": 2400,\n \"hpPerKg\": 25,\n \"penetration\": 12,\n \"ductility\": 0.02,\n \"fracture\": \"shatter\",\n \"fragmentSize\": [\n 0.03,\n 0.12\n ],\n \"damageScale\": {\n \"blunt\": 1.3\n },\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"shards\",\n \"thermal\": {\n \"conductivity\": 0.1,\n \"heatCapacity\": 1.5,\n \"thermalShockC\": 200\n },\n \"tags\": [\n \"ceramic\",\n \"brittle\"\n ],\n \"compressive\": 150000\n },\n {\n \"id\": \"concrete\",\n \"density\": 2300,\n \"hpPerKg\": 14,\n \"penetration\": 18,\n \"ductility\": 0.03,\n \"fracture\": \"crumble\",\n \"fragmentSize\": [\n 0.05,\n 0.25\n ],\n \"damageScale\": {\n \"explosive\": 1.2\n },\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"dust\",\n \"thermal\": {\n \"conductivity\": 0.15,\n \"heatCapacity\": 2.5\n },\n \"tags\": [\n \"masonry\",\n \"brittle\"\n ],\n \"compressive\": 444000\n },\n {\n \"id\": \"brick\",\n \"density\": 1900,\n \"hpPerKg\": 12,\n \"penetration\": 14,\n \"ductility\": 0.05,\n \"fracture\": \"crumble\",\n \"fragmentSize\": [\n 0.04,\n 0.12\n ],\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"dust\",\n \"thermal\": {\n \"conductivity\": 0.15,\n \"heatCapacity\": 2.5\n },\n \"tags\": [\n \"masonry\",\n \"brittle\"\n ],\n \"compressive\": 40000\n },\n {\n \"id\": \"plaster\",\n \"density\": 850,\n \"hpPerKg\": 18,\n \"penetration\": 3,\n \"ductility\": 0.05,\n \"fracture\": \"crumble\",\n \"fragmentSize\": [\n 0.05,\n 0.3\n ],\n \"hitDebris\": \"dust\",\n \"breakDebris\": \"dust\",\n \"thermal\": {\n \"conductivity\": 0.1,\n \"heatCapacity\": 1.5\n },\n \"tags\": [\n \"masonry\",\n \"brittle\"\n ],\n \"compressive\": 8000\n },\n {\n \"id\": \"stone\",\n \"density\": 2700,\n \"hpPerKg\": 25,\n \"penetration\": 25,\n \"ductility\": 0.03,\n \"fracture\": \"crumble\",\n \"fragmentSize\": [\n 0.06,\n 0.3\n ],\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"dust\",\n \"thermal\": {\n \"conductivity\": 0.2,\n \"heatCapacity\": 2.5\n },\n \"tags\": [\n \"masonry\",\n \"brittle\"\n ],\n \"compressive\": 300000\n },\n {\n \"id\": \"plastic\",\n \"density\": 1100,\n \"hpPerKg\": 60,\n \"penetration\": 8,\n \"ductility\": 0.5,\n \"fracture\": \"snap\",\n \"fragmentSize\": [\n 0.05,\n 0.3\n ],\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"chips\",\n \"thermal\": {\n \"ignitionC\": 400,\n \"flameC\": 700,\n \"fuelFraction\": 0.8,\n \"burnRate\": 0.02,\n \"meltC\": 200,\n \"meltRate\": 0.06,\n \"conductivity\": 0.05,\n \"heatCapacity\": 1,\n \"smoke\": \"black\"\n },\n \"visual\": {\n \"charColor\": 855309\n },\n \"tags\": [\n \"plastic\",\n \"flammable\"\n ],\n \"compressive\": 40000\n },\n {\n \"id\": \"rubber\",\n \"density\": 1100,\n \"hpPerKg\": 80,\n \"penetration\": 12,\n \"ductility\": 0.9,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.05,\n 0.2\n ],\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"fibers\",\n \"thermal\": {\n \"ignitionC\": 350,\n \"flameC\": 750,\n \"fuelFraction\": 0.6,\n \"burnRate\": 0.015,\n \"conductivity\": 0.05,\n \"heatCapacity\": 1.2,\n \"smoke\": \"black\"\n },\n \"visual\": {\n \"charColor\": 855309\n },\n \"tags\": [\n \"rubber\",\n \"flammable\"\n ],\n \"compressive\": 20000\n },\n {\n \"id\": \"fabric\",\n \"density\": 400,\n \"hpPerKg\": 20,\n \"penetration\": 0.8,\n \"ductility\": 0.8,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.05,\n 0.25\n ],\n \"damageScale\": {\n \"slash\": 4,\n \"ballistic\": 0.5\n },\n \"hitDebris\": \"fibers\",\n \"breakDebris\": \"fibers\",\n \"thermal\": {\n \"ignitionC\": 230,\n \"flameC\": 600,\n \"fuelFraction\": 1,\n \"burnRate\": 0.05,\n \"conductivity\": 0.03,\n \"heatCapacity\": 0.6,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"fabric\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 500\n },\n {\n \"id\": \"foam\",\n \"density\": 30,\n \"hpPerKg\": 15,\n \"penetration\": 0.5,\n \"ductility\": 0.7,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.03,\n 0.15\n ],\n \"damageScale\": {\n \"slash\": 2,\n \"ballistic\": 0.4\n },\n \"hitDebris\": \"fibers\",\n \"breakDebris\": \"fibers\",\n \"thermal\": {\n \"ignitionC\": 250,\n \"flameC\": 900,\n \"fuelFraction\": 0.95,\n \"burnRate\": 0.09,\n \"conductivity\": 0.02,\n \"heatCapacity\": 0.5,\n \"smoke\": \"black\"\n },\n \"visual\": {\n \"charColor\": 855309\n },\n \"tags\": [\n \"fabric\",\n \"flammable\"\n ],\n \"compressive\": 100\n },\n {\n \"id\": \"leather\",\n \"density\": 900,\n \"hpPerKg\": 50,\n \"penetration\": 4,\n \"ductility\": 0.8,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.05,\n 0.25\n ],\n \"damageScale\": {\n \"slash\": 2\n },\n \"hitDebris\": \"fibers\",\n \"breakDebris\": \"fibers\",\n \"thermal\": {\n \"ignitionC\": 320,\n \"flameC\": 650,\n \"fuelFraction\": 0.7,\n \"burnRate\": 0.01,\n \"conductivity\": 0.05,\n \"heatCapacity\": 1,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"fabric\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 2000\n },\n {\n \"id\": \"paper\",\n \"density\": 700,\n \"hpPerKg\": 8,\n \"penetration\": 0.3,\n \"ductility\": 0.5,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.03,\n 0.15\n ],\n \"damageScale\": {\n \"slash\": 3\n },\n \"hitDebris\": \"fibers\",\n \"breakDebris\": \"fibers\",\n \"thermal\": {\n \"ignitionC\": 230,\n \"flameC\": 600,\n \"fuelFraction\": 1,\n \"burnRate\": 0.06,\n \"conductivity\": 0.03,\n \"heatCapacity\": 0.5,\n \"smoke\": \"grey\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"fabric\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 500\n },\n {\n \"id\": \"foliage\",\n \"density\": 150,\n \"hpPerKg\": 20,\n \"penetration\": 0.5,\n \"ductility\": 0.6,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.03,\n 0.1\n ],\n \"damageScale\": {\n \"slash\": 4\n },\n \"hitDebris\": \"leaves\",\n \"breakDebris\": \"leaves\",\n \"thermal\": {\n \"ignitionC\": 300,\n \"flameC\": 700,\n \"fuelFraction\": 0.8,\n \"burnRate\": 0.08,\n \"conductivity\": 0.03,\n \"heatCapacity\": 0.8,\n \"smoke\": \"white\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"plant\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 500\n },\n {\n \"id\": \"green_wood\",\n \"density\": 650,\n \"hpPerKg\": 5,\n \"penetration\": 10,\n \"ductility\": 0.5,\n \"fracture\": \"splinter\",\n \"fragmentSize\": [\n 0.03,\n 0.2\n ],\n \"damageScale\": {\n \"slash\": 1.3,\n \"ballistic\": 0.1\n },\n \"hitDebris\": \"splinters\",\n \"breakDebris\": \"leaves\",\n \"thermal\": {\n \"ignitionC\": 400,\n \"flameC\": 700,\n \"fuelFraction\": 0.8,\n \"burnRate\": 0.006,\n \"conductivity\": 0.06,\n \"heatCapacity\": 2,\n \"smoke\": \"white\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"plant\",\n \"wood\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 60000\n },\n {\n \"id\": \"cactus\",\n \"density\": 900,\n \"hpPerKg\": 30,\n \"penetration\": 2,\n \"ductility\": 0.6,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.04,\n 0.15\n ],\n \"damageScale\": {\n \"slash\": 3\n },\n \"hitDebris\": \"fibers\",\n \"breakDebris\": \"fibers\",\n \"thermal\": {\n \"ignitionC\": 450,\n \"flameC\": 650,\n \"fuelFraction\": 0.3,\n \"burnRate\": 0.01,\n \"conductivity\": 0.05,\n \"heatCapacity\": 3,\n \"smoke\": \"white\"\n },\n \"visual\": {\n \"charColor\": 1709072\n },\n \"tags\": [\n \"plant\",\n \"organic\",\n \"flammable\"\n ],\n \"compressive\": 5000\n },\n {\n \"id\": \"flesh_fruit\",\n \"density\": 950,\n \"hpPerKg\": 15,\n \"penetration\": 1.5,\n \"ductility\": 0.7,\n \"fracture\": \"tear\",\n \"fragmentSize\": [\n 0.02,\n 0.08\n ],\n \"damageScale\": {\n \"slash\": 2\n },\n \"hitDebris\": \"drips\",\n \"breakDebris\": \"drips\",\n \"thermal\": {\n \"conductivity\": 0.05,\n \"heatCapacity\": 3\n },\n \"tags\": [\n \"plant\",\n \"organic\"\n ],\n \"compressive\": 1000\n },\n {\n \"id\": \"wax\",\n \"density\": 900,\n \"hpPerKg\": 30,\n \"penetration\": 3,\n \"ductility\": 0.5,\n \"fracture\": \"snap\",\n \"fragmentSize\": [\n 0.05,\n 0.2\n ],\n \"hitDebris\": \"chips\",\n \"breakDebris\": \"chips\",\n \"thermal\": {\n \"ignitionC\": 230,\n \"flameC\": 700,\n \"fuelFraction\": 0.9,\n \"burnRate\": 0.02,\n \"meltC\": 60,\n \"meltRate\": 0.2,\n \"conductivity\": 0.05,\n \"heatCapacity\": 0.8,\n \"smoke\": \"grey\"\n },\n \"tags\": [\n \"wax\",\n \"flammable\"\n ],\n \"compressive\": 5000\n },\n {\n \"id\": \"soil\",\n \"density\": 1300,\n \"hpPerKg\": 3,\n \"penetration\": 5,\n \"ductility\": 0.3,\n \"fracture\": \"crumble\",\n \"fragmentSize\": [\n 0.03,\n 0.12\n ],\n \"hitDebris\": \"dust\",\n \"breakDebris\": \"dust\",\n \"thermal\": {\n \"conductivity\": 0.1,\n \"heatCapacity\": 2.5\n },\n \"tags\": [\n \"soil\",\n \"masonry\"\n ],\n \"compressive\": 20000\n }\n]","{\n \"cast iron\": \"cast_iron\",\n \"cast_iron\": \"cast_iron\",\n \"castiron\": \"cast_iron\",\n \"metal\": \"steel\",\n \"steel\": \"steel\",\n \"iron\": \"steel\",\n \"chrome\": \"steel\",\n \"alumin\": \"aluminium\",\n \"alu_\": \"aluminium\",\n \"alu-\": \"aluminium\",\n \"alu \": \"aluminium\",\n \"copper\": \"copper\",\n \"brass\": \"copper\",\n \"bronze\": \"copper\",\n \"wood\": \"wood_soft\",\n \"timber\": \"wood_soft\",\n \"plank\": \"wood_soft\",\n \"lumber\": \"wood_soft\",\n \"pine\": \"wood_soft\",\n \"hardwood\": \"wood_hard\",\n \"oak\": \"wood_hard\",\n \"plywood\": \"plywood\",\n \"mdf\": \"mdf\",\n \"chipboard\": \"mdf\",\n \"glass\": \"glass\",\n \"window\": \"glass\",\n \"mirror\": \"glass\",\n \"tempered\": \"tempered_glass\",\n \"windshield\": \"tempered_glass\",\n \"fabric\": \"fabric\",\n \"cloth\": \"fabric\",\n \"cushion\": \"fabric\",\n \"sofa\": \"fabric\",\n \"curtain\": \"fabric\",\n \"carpet\": \"fabric\",\n \"textile\": \"fabric\",\n \"canvas\": \"fabric\",\n \"foam\": \"foam\",\n \"sponge\": \"foam\",\n \"mattress\": \"foam\",\n \"leather\": \"leather\",\n \"paper\": \"paper\",\n \"cardboard\": \"paper\",\n \"leaf\": \"foliage\",\n \"leaves\": \"foliage\",\n \"foliage\": \"foliage\",\n \"bush\": \"foliage\",\n \"grass\": \"foliage\",\n \"trunk\": \"green_wood\",\n \"branch\": \"green_wood\",\n \"twig\": \"green_wood\",\n \"cactus\": \"cactus\",\n \"fruit\": \"flesh_fruit\",\n \"apple\": \"flesh_fruit\",\n \"melon\": \"flesh_fruit\",\n \"wax\": \"wax\",\n \"candle\": \"wax\",\n \"concrete\": \"concrete\",\n \"cement\": \"concrete\",\n \"brick\": \"brick\",\n \"tile\": \"ceramic\",\n \"ceramic\": \"ceramic\",\n \"porcelain\": \"ceramic\",\n \"stone\": \"stone\",\n \"rock\": \"stone\",\n \"marble\": \"stone\",\n \"plaster\": \"plaster\",\n \"drywall\": \"plaster\",\n \"gypsum\": \"plaster\",\n \"plastic\": \"plastic\",\n \"pvc\": \"plastic\",\n \"acrylic\": \"plastic\",\n \"rubber\": \"rubber\",\n \"tire\": \"rubber\",\n \"tyre\": \"rubber\",\n \"soil\": \"soil\",\n \"dirt\": \"soil\",\n \"potting\": \"soil\",\n \"mud\": \"soil\"\n}","import materialsJson from './data/materials.json'\nimport hintsJson from './data/material-hints.json'\nimport { aabbOf, quatFromEuler, shapeDims } from './math'\nimport type { JointKind, JointSpec, MaterialDef, MaterialId, PartShape, PartSpec, ToolKind } from './types'\n\n/** Built-in materials (data in `src/data/materials.json`). Override or extend with the `materials` option of `createDestruction`. */\nexport const MATERIALS: MaterialDef[] = materialsJson as unknown as MaterialDef[]\n\n/** Default joint strength (joint hit points), tools that undo it and seconds of tool work. */\nexport const JOINT_DEFAULTS: Record<JointKind, { strength: number; tools: ToolKind[]; seconds: number }> = {\n screw: { strength: 80, tools: ['screwdriver'], seconds: 2.5 },\n bolt: { strength: 200, tools: ['wrench'], seconds: 4 },\n nail: { strength: 60, tools: ['pry_bar', 'hammer'], seconds: 2 },\n weld: { strength: 600, tools: ['cutting_torch', 'saw'], seconds: 8 },\n glue: { strength: 50, tools: ['pry_bar', 'knife'], seconds: 3 },\n hinge: { strength: 120, tools: ['screwdriver'], seconds: 3 },\n clip: { strength: 20, tools: ['hand'], seconds: 0.6 },\n tie: { strength: 15, tools: ['knife', 'hand'], seconds: 1 },\n mortar: { strength: 400, tools: ['hammer'], seconds: 6 },\n fused: { strength: 1000, tools: [], seconds: 0 },\n stem: { strength: 40, tools: ['knife', 'saw', 'hand'], seconds: 1.5 },\n rebar: { strength: 1500, tools: ['cutting_torch', 'saw'], seconds: 20 },\n resting: { strength: 30, tools: ['hand'], seconds: 1 },\n}\n\nconst has = (m: MaterialDef, tag: string) => !!m.tags && m.tags.includes(tag)\n\n/**\n * The joint kind that fits two materials: glass is glued (clipped to plastic), soft things are tied, plants share a stem, masonry gets mortar,\n * metal is welded, wood is screwed, plastic clips. `inferJoints` refines weld to bolt for thick metal and screw to nail for thin wood.\n */\nexport const JOINT_BY_MATERIALS = (a: MaterialDef, b: MaterialDef): JointKind => {\n const any = (tag: string) => has(a, tag) || has(b, tag)\n const both = (tag: string) => has(a, tag) && has(b, tag)\n if (any('glass')) return any('plastic') ? 'clip' : 'glue'\n if (any('fabric')) return 'tie'\n if (both('plant')) return 'stem'\n if (any('plant')) return 'tie'\n if (both('masonry')) return 'mortar'\n if (any('masonry') && any('metal')) return 'bolt'\n if (both('metal')) return 'weld'\n if (any('plastic')) return 'clip'\n if (any('rubber') || any('wax')) return 'glue'\n return 'screw'\n}\n\nconst MATERIAL_MAP: ReadonlyMap<MaterialId, MaterialDef> = new Map(MATERIALS.map((m) => [m.id, m]))\n\nconst HINTS = Object.entries(hintsJson as Record<string, string>).sort((x, y) => y[0].length - x[0].length)\n\n/** Guess a material id from a mesh or node name (case-insensitive substring; the longest keyword wins). */\nexport const guessMaterial = (name: string): MaterialId | undefined => {\n const n = name.toLowerCase()\n for (const [key, id] of HINTS) if (n.includes(key)) return id\n return undefined\n}\n\n/** Volume of a shape in m³. */\nexport const partVolume = (shape: PartShape): number => {\n if (shape.kind === 'box') return shape.size[0] * shape.size[1] * shape.size[2]\n if (shape.kind === 'cylinder') return Math.PI * shape.radius * shape.radius * shape.height\n return (4 / 3) * Math.PI * shape.radius ** 3\n}\n\n/** Mass of a part in kg: its `mass`, or density × volume × fill. */\nexport const partMass = (part: PartSpec, material: MaterialDef): number => part.mass ?? material.density * partVolume(part.shape) * (part.fill ?? 1)\n\n/** Wall thickness of a part in metres (see `PartSpec.thickness`). */\nexport const partThickness = (part: PartSpec): number => {\n const dims = shapeDims(part.shape)\n const min = Math.min(dims[0], dims[1], dims[2])\n return Math.max(1e-4, Math.min(part.thickness ?? min * (part.fill ?? 1), min))\n}\n\n/**\n * Joints for touching parts. Two parts touch when their axis-aligned bounds (after rotation), grown by `tolerance` metres, overlap. The kind comes\n * from `JOINT_BY_MATERIALS`; thick metal pairs (smallest dimension of both >= 2 cm) get a `bolt` instead of a `weld`, and thin wood pairs (either\n * under 2 cm) a `nail` instead of a `screw`.\n */\nexport const inferJoints = (parts: PartSpec[], tolerance = 0.01, materials: ReadonlyMap<string, MaterialDef> = MATERIAL_MAP): JointSpec[] => {\n const boxes = parts.map((p) => aabbOf(p.shape, p.position, quatFromEuler(...(p.rotation ?? [0, 0, 0]))))\n const out: JointSpec[] = []\n for (let i = 0; i < parts.length; i++) {\n for (let j = i + 1; j < parts.length; j++) {\n const a = boxes[i], b = boxes[j]\n let touch = true\n for (let k = 0; k < 3 && touch; k++) if (a.min[k] - tolerance > b.max[k] || b.min[k] - tolerance > a.max[k]) touch = false\n if (!touch) continue\n const ma = materials.get(parts[i].material)\n const mb = materials.get(parts[j].material)\n let kind: JointKind = ma && mb ? JOINT_BY_MATERIALS(ma, mb) : 'screw'\n const thin = Math.min(partThickness(parts[i]), partThickness(parts[j]))\n if (kind === 'weld' && thin >= 0.02) kind = 'bolt'\n if (kind === 'screw' && ma && mb && has(ma, 'wood') && has(mb, 'wood') && thin < 0.02) kind = 'nail'\n out.push({ id: `${parts[i].id}~${parts[j].id}`, a: parts[i].id, b: parts[j].id, kind })\n }\n }\n return out\n}\n\n/**\n * Load in kg a structural part carries before it fails: `structure.capacity`, else `material.compressive` (default 20 000 kg/m²) times the\n * section. The section is the product of the two smallest dimensions (thickness times longest dimension for slabs; thickness times horizontal length for walls); foundations get x10.\n */\nexport const partCapacity = (part: PartSpec, material: MaterialDef): number => {\n if (part.structure?.capacity !== undefined) return part.structure.capacity\n const d = shapeDims(part.shape).sort((a, b) => a - b)\n const role = part.structure?.role\n const sh = shapeDims(part.shape)\n const section = role === 'wall' || role === 'partition' ? Math.min(sh[0], sh[2]) * Math.max(sh[0], sh[2]) : role === 'slab' ? d[0] * d[2] : d[0] * d[1]\n return Math.max(1, section * (material.compressive ?? 20000) * (role === 'foundation' ? 10 : 1))\n}\n\n\n/**\n * Multiplier of blunt damage on brittle parts (ductility < 0.3): up to x4.7 for fully brittle materials (glass, ceramic, stone), times a thinness\n * term that follows bending stress (1 / thickness squared, x1 at 2 cm or more, at most x25). A 3 mm glass bottle breaks from a 1.5 m drop; a\n * concrete block (thick) is only ever x4.4.\n */\nexport const fragility = (ductility: number, thickness: number): number => {\n if (ductility >= 0.3) return 1\n return (1 + (4 * (0.3 - ductility)) / 0.3) * Math.min(25, Math.max(1, (0.02 / Math.max(thickness, 1e-4)) ** 2))\n}\n","import { planFragments } from './fracture'\nimport { JOINT_DEFAULTS, inferJoints, MATERIALS, partCapacity, partMass, partThickness, partVolume, fragility } from './materials'\nimport { aabbOf, createRng, distanceToShape, quat, quatFromEuler, rayShape, rotateVec, shapeArea, shapeBound, shapeDims, surfacePoint, toLocal, toWorld, vec } from './math'\nimport type { DestructibleImpl } from './contracts'\nimport type {\n AddOptions, Crack, DamageType, DebrisKind, DestructibleSpec, Dent, DestructionEvent, DestructionEventType, DestructionOptions, DestructionSnapshot,\n DestructionWorld, Fragment, Hit, HitResult, Hole, JointSpec, JointState, MaterialDef, MaterialId, ObjectRuntime, ObjectState, PartRuntime, PartSpec,\n PartState, Quat, RayHit, ToolKind, Vec3,\n} from './types'\n\n/** Hit points removed per joule (before the material's `damageScale`). */\nconst DMG_PER_J = 0.02\n/** Fraction of a blast's energy that reaches a part at distance 0. */\nconst BLAST_COUPLING = 0.1\nconst FLAMMABLE_FLUIDS = ['gas', 'fuel']\n\ninterface PartRT {\n spec: PartSpec\n mat: MaterialDef\n st: PartState\n q: Quat\n /** Current object-local position (the spec's, unless moved by `setPartPose`). */\n pos: Vec3\n mass0: number\n fuel0: number\n area: number\n thickness: number\n dims: Vec3\n bound: number\n rt: PartRuntime\n /** Structural role other than `none`. */\n structural: boolean\n anchored: boolean\n cap: number\n}\n\ninterface JointRT {\n spec: Required<JointSpec>\n st: JointState\n ia: number\n ib: number\n bears: boolean | 'a_on_b' | 'b_on_a'\n /** Object-local position. */\n pos: Vec3\n step: number\n}\n\ninterface ObjRT {\n id: string\n spec: DestructibleSpec\n st: ObjectState\n parts: PartRT[]\n byId: Map<string, PartRT>\n idx: Map<string, number>\n joints: JointRT[]\n jointMap: Map<string, JointRT>\n byPart: Map<string, JointRT[]>\n /** Local bounding sphere. */\n bc: Vec3\n br: number\n active: boolean\n tmp: number[]\n hasStructure: boolean\n dirty: boolean\n maxStress: number\n collapsed: Set<string>\n /** Structural parts with no support path to an anchored part (they fall). */\n unsup: boolean[]\n anyAnchor: boolean\n}\n\ninterface Carry {\n parts: Map<string, { st: PartState; rt: PartRuntime }>\n joints: Map<string, { st: JointState; step: number }>\n collapsed?: string[]\n}\n\ninterface Loc {\n p: PartRT\n point: Vec3\n normal: Vec3\n dir: Vec3\n pathLen: number\n}\n\ninterface ImplRT {\n impl: DestructibleImpl\n position: Vec3\n rotation: Quat\n /** Part pose overrides set by `setPartPose` (object-local). */\n poses: Map<string, { pos: Vec3; q: Quat }>\n}\n\ninterface Blast {\n point: Vec3\n energy: number\n radius: number\n source?: string\n}\n\nconst clamp = (v: number, a: number, b: number) => Math.max(a, Math.min(b, v))\nconst isLost = (p: PartRT) => p.st.status === 'broken' || p.st.status === 'melted' || p.st.status === 'ashes'\nconst clone = <T>(v: T): T => structuredClone(v)\nconst updateBound = (o: ObjRT) => {\n if (!o.parts.length) return\n const c: Vec3 = [0, 0, 0]\n for (const p of o.parts) for (let k = 0; k < 3; k++) c[k] += p.pos[k] / o.parts.length\n let r = 0\n for (const p of o.parts) r = Math.max(r, vec.distance(c, p.pos) + p.bound)\n o.bc = c\n o.br = r\n}\nconst AXIS = { x: 0, y: 1, z: 2 } as const\n\nexport const createDestruction = (options: DestructionOptions = {}): DestructionWorld => {\n const materials = new Map<MaterialId, MaterialDef>()\n for (const m of MATERIALS) materials.set(m.id, m)\n for (const m of options.materials ?? []) materials.set(m.id, m)\n const ambient = options.ambientC ?? 20\n const maxFragments = options.maxFragments ?? 24\n const maxDents = options.maxDents ?? 24\n const maxHoles = options.maxHoles ?? 32\n const fireSpread = options.fireSpread ?? 0.6\n const rng = createRng(options.seed ?? 1)\n const rnd = () => rng.next()\n\n let time = 0\n let counter = 0\n const objects = new Map<string, ObjRT>()\n const listeners = new Map<string, Set<(e: DestructionEvent) => void>>()\n let cur: DestructionEvent[] = []\n const blasts: Blast[] = []\n const impls = new Map<string, ImplRT>()\n const taken = (id: string) => objects.has(id) || impls.has(id)\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n const emit = (e: DestructionEvent) => {\n cur.push(e)\n options.onEvent?.(e)\n const all = listeners.get('*')\n if (all) for (const fn of [...all]) fn(e)\n const typed = listeners.get(e.type)\n if (typed) for (const fn of [...typed]) fn(e)\n }\n const base = (o: ObjRT, source?: string): { object: string; time: number; source?: string } =>\n source === undefined ? { object: o.id, time } : { object: o.id, time, source }\n\n const pendingCollapse = new Map<ObjRT, string | undefined>()\n let runDepth = 0\n\n const run = <T>(fn: () => T): { value: T; events: DestructionEvent[] } => {\n const prev = cur\n const mine: DestructionEvent[] = []\n cur = mine\n runDepth++\n try {\n const value = fn()\n let guard = 0\n while (blasts.length && guard++ < 64) {\n const b = blasts.shift()!\n blastWorld(b.point, b.energy, b.radius, b.source)\n }\n if (runDepth === 1) flushCollapse()\n return { value, events: mine }\n } finally {\n runDepth--\n cur = prev\n }\n }\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Building objects\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n const nextId = () => {\n let id: string\n do id = `obj_${++counter}`\n while (taken(id))\n return id\n }\n\n const freshRuntime = (): PartRuntime => ({ meltEmitted: 0, dripT: 0, prevTemp: ambient, shockT: 0, jet: false })\n\n const resolveSpec = (spec: DestructibleSpec): DestructibleSpec => {\n const out = clone(spec)\n const joints = out.joints ?? inferJoints(out.parts, 0.01, materials)\n const structural = (id: string) => {\n const role = out.parts.find((p) => p.id === id)?.structure?.role\n return role !== undefined && role !== 'none'\n }\n out.joints = joints.map((j) => {\n const def = JOINT_DEFAULTS[j.kind]\n return {\n id: j.id ?? `${j.a}~${j.b}`, a: j.a, b: j.b, kind: j.kind, strength: j.strength ?? def.strength, tools: j.tools ?? [...def.tools], seconds: j.seconds ?? def.seconds,\n bears: j.bears ?? (structural(j.a) && structural(j.b)),\n }\n })\n return out\n }\n\n const build = (spec: DestructibleSpec, id: string, pos: Vec3, rot: Quat, carry?: Carry): ObjRT => {\n const st: ObjectState = { id, position: [pos[0], pos[1], pos[2]], rotation: [rot[0], rot[1], rot[2], rot[3]], parts: [], joints: [], groups: [], destroyed: false }\n if (spec.name !== undefined) st.name = spec.name\n const o: ObjRT = {\n id, spec, st, parts: [], byId: new Map(), idx: new Map(), joints: [], jointMap: new Map(), byPart: new Map(), bc: [0, 0, 0], br: 0, active: false, tmp: [], hasStructure: false, dirty: false, maxStress: 0, collapsed: new Set(carry?.collapsed ?? []), unsup: [], anyAnchor: false,\n }\n for (const ps of spec.parts) {\n if (o.byId.has(ps.id)) throw new Error(`duplicate part id \"${ps.id}\"`)\n const mat = materials.get(ps.material)\n if (!mat) throw new Error(`unknown material \"${ps.material}\" on part \"${ps.id}\"`)\n const mass0 = partMass(ps, mat)\n const maxHp = Math.max(1, ps.hp ?? mass0 * mat.hpPerKg)\n const fuel0 = mat.thermal.ignitionC !== undefined ? mass0 * (mat.thermal.fuelFraction ?? 0) : 0\n const c = carry?.parts.get(ps.id)\n const pst: PartState = c?.st ?? {\n id: ps.id, material: ps.material, status: 'intact', hp: maxHp, maxHp, mass: mass0, temperature: ambient, burning: false, fuel: fuel0, char: 0, melt: 0,\n dents: [], holes: [], cracks: [], group: 0,\n }\n if (!c && ps.contains) pst.liters = ps.contains.liters\n const p: PartRT = {\n spec: ps, mat, st: pst, q: quatFromEuler(...(ps.rotation ?? [0, 0, 0])), pos: [ps.position[0], ps.position[1], ps.position[2]], mass0, fuel0, area: shapeArea(ps.shape), thickness: partThickness(ps),\n dims: shapeDims(ps.shape), bound: shapeBound(ps.shape), rt: c?.rt ?? { ...freshRuntime(), prevTemp: pst.temperature },\n structural: !!ps.structure && ps.structure.role !== 'none', anchored: !!ps.anchored || ps.structure?.role === 'foundation', cap: ps.structure ? partCapacity(ps, mat) : 0,\n }\n if (p.structural) o.hasStructure = true\n o.idx.set(ps.id, o.parts.length)\n o.parts.push(p)\n o.byId.set(ps.id, p)\n o.st.parts.push(pst)\n o.byPart.set(ps.id, [])\n }\n for (const js of spec.joints ?? []) {\n const r = js as Required<JointSpec>\n const ia = o.idx.get(r.a), ib = o.idx.get(r.b)\n if (ia === undefined || ib === undefined) throw new Error(`joint \"${r.id}\" references an unknown part`)\n if (o.jointMap.has(r.id)) throw new Error(`duplicate joint id \"${r.id}\"`)\n const pa = o.parts[ia], pb = o.parts[ib]\n const A = aabbOf(pa.spec.shape, pa.spec.position, pa.q)\n const B = aabbOf(pb.spec.shape, pb.spec.position, pb.q)\n const pos: Vec3 = [0, 0, 0]\n for (let k = 0; k < 3; k++) pos[k] = (Math.max(A.min[k], B.min[k]) + Math.min(A.max[k], B.max[k])) / 2\n const bears: JointRT['bears'] = r.bears ?? (pa.structural && pb.structural)\n const c = carry?.joints.get(r.id)\n const jst: JointState = c?.st ?? { id: r.id, a: r.a, b: r.b, kind: r.kind, hp: r.strength, maxHp: r.strength, progress: 0, open: false }\n const j: JointRT = { spec: r, st: jst, ia, ib, bears, pos, step: c?.step ?? 0 }\n o.joints.push(j)\n o.jointMap.set(r.id, j)\n o.byPart.get(r.a)!.push(j)\n o.byPart.get(r.b)!.push(j)\n o.st.joints.push(jst)\n }\n // open joints whose parts are no longer both here (left behind by `splitGroup`) stay listed, inert, so callers still see them open\n for (const [jid, c] of carry?.joints ?? []) if (c.st.open && !o.jointMap.has(jid)) o.st.joints.push(c.st)\n updateBound(o)\n o.anyAnchor = o.parts.some((p) => p.anchored)\n o.unsup = o.parts.map(() => false)\n solveStructure(o)\n recomputeGroups(o)\n o.st.destroyed = o.parts.length > 0 && o.parts.every(isLost)\n o.active = o.maxStress > 0.8 || o.parts.some((p) => p.st.burning || p.st.temperature > ambient + 0.5 || (p.st.liters ?? 0) > 0)\n return o\n }\n\n const recomputeGroups = (o: ObjRT) => {\n const n = o.parts.length\n const parent = Array.from({ length: n }, (_, i) => i)\n const find = (i: number): number => {\n while (parent[i] !== i) {\n parent[i] = parent[parent[i]]\n i = parent[i]\n }\n return i\n }\n const union = (a: number, b: number) => {\n parent[find(a)] = find(b)\n }\n const live = (j: JointRT) => !j.st.open && !isLost(o.parts[j.ia]) && !isLost(o.parts[j.ib])\n if (o.unsup.some(Boolean)) {\n // parts that lost every support fall: cut them from the supported pieces; loose non-structural parts follow the part they hang on\n for (const j of o.joints) if (live(j) && !o.unsup[j.ia] && !o.unsup[j.ib]) union(j.ia, j.ib)\n const supported = new Set<number>()\n for (let i = 0; i < n; i++) if (!isLost(o.parts[i]) && !o.unsup[i] && (o.parts[i].structural || o.parts[i].anchored)) supported.add(find(i))\n for (const j of o.joints) {\n if (!live(j) || !(o.unsup[j.ia] || o.unsup[j.ib])) continue\n if (o.unsup[j.ia] && o.unsup[j.ib]) union(j.ia, j.ib)\n else {\n const u = o.unsup[j.ia] ? j.ia : j.ib\n const other = u === j.ia ? j.ib : j.ia\n if (!o.parts[other].structural && !supported.has(find(other))) union(u, other)\n }\n }\n } else for (const j of o.joints) if (live(j)) union(j.ia, j.ib)\n const comps = new Map<number, number[]>()\n for (let i = 0; i < n; i++) {\n if (isLost(o.parts[i])) continue\n const r = find(i)\n const l = comps.get(r)\n if (l) l.push(i)\n else comps.set(r, [i])\n }\n const list = [...comps.values()].map((ix) => ({\n ix,\n anchored: ix.some((i) => o.parts[i].anchored),\n mass: ix.reduce((s, i) => s + o.parts[i].st.mass, 0),\n }))\n list.sort((a, b) => (a.anchored === b.anchored ? (b.mass - a.mass) || (a.ix[0] - b.ix[0]) : a.anchored ? -1 : 1))\n o.st.groups = list.map((g) => g.ix.map((i) => o.parts[i].spec.id))\n for (const p of o.parts) if (isLost(p)) p.st.group = -1\n list.forEach((g, gi) => g.ix.forEach((i) => (o.parts[i].st.group = gi)))\n }\n\n /** Which part `r` rests on over joint `j` (index), or -1 when the joint does not let `r` rest on its other end. */\n const restsOn = (j: JointRT, r: number): number => {\n const b = j.bears\n if (!b) return -1\n if (b === true) return j.ia === r ? j.ib : j.ia\n if (b === 'a_on_b') return j.ia === r ? j.ib : -1\n return j.ib === r ? j.ia : -1\n }\n\n /** Distribute own mass plus carried load down the bearing graph to the anchored parts; mark parts without any support path. */\n const solveStructure = (o: ObjRT) => {\n o.maxStress = 0\n if (!o.hasStructure) return\n const parts = o.parts\n const n = parts.length\n const dist = new Array<number>(n).fill(-1)\n const queue: number[] = []\n const ok = (i: number) => parts[i].structural && !isLost(parts[i])\n const isPartition = (i: number) => parts[i].spec.structure?.role === 'partition'\n for (let i = 0; i < n; i++) if (ok(i) && parts[i].anchored) {\n dist[i] = 0\n queue.push(i)\n }\n for (let h = 0; h < queue.length; h++) {\n const s = queue[h]\n if (isPartition(s)) continue\n for (const j of o.byPart.get(parts[s].spec.id)!) {\n if (j.st.open || !j.bears) continue\n const r = j.ia === s ? j.ib : j.ia\n if (dist[r] >= 0 || !ok(r) || restsOn(j, r) !== s) continue\n dist[r] = dist[s] + 1\n queue.push(r)\n }\n }\n const incoming = new Array<number>(n).fill(0)\n for (let h = queue.length - 1; h >= 0; h--) {\n const i = queue[h]\n const total = parts[i].st.mass + incoming[i]\n parts[i].st.load = total\n const lower: number[] = []\n for (const j of o.byPart.get(parts[i].spec.id)!) {\n if (j.st.open || !j.bears) continue\n const k = restsOn(j, i)\n if (k >= 0 && dist[k] >= 0 && dist[k] < dist[i] && !isPartition(k)) lower.push(k)\n }\n for (const k of lower) incoming[k] += total / lower.length\n }\n for (let i = 0; i < n; i++) {\n const p = parts[i]\n o.unsup[i] = false\n if (!p.structural) continue\n if (dist[i] < 0 || isLost(p)) {\n p.st.load = p.st.mass\n p.st.stress = 0\n o.unsup[i] = o.anyAnchor && !isLost(p)\n continue\n }\n p.st.stress = p.st.load! / p.cap\n if (p.st.stress > o.maxStress) o.maxStress = p.st.stress\n }\n if (o.maxStress > 0.8) o.active = true\n }\n\n /**\n * Ask for a collapse report. It is not computed right away: a blow can break several parts in one go (a column and the roof's supports, or a\n * column whose joint opens just before the column itself fractures), so the groups are examined once, after every loss of the operation.\n */\n const collapseCheck = (o: ObjRT, src?: string) => {\n if (!o.hasStructure || !o.parts.some((p) => p.anchored)) return\n if (!pendingCollapse.has(o)) pendingCollapse.set(o, src)\n }\n\n /** Report the groups of remaining structural parts that lost every anchor (each part is reported once). */\n const flushCollapse = () => {\n for (const [o, src] of [...pendingCollapse]) {\n pendingCollapse.delete(o)\n if (!objects.has(o.id) || objects.get(o.id) !== o) continue\n for (const g of o.st.groups) {\n const ps = g.map((id) => o.byId.get(id)!).filter((p) => !isLost(p) && !o.collapsed.has(p.spec.id))\n if (ps.length === 0 || g.some((id) => o.byId.get(id)!.anchored) || !ps.some((p) => p.structural)) continue\n for (const p of ps) o.collapsed.add(p.spec.id)\n emit({ ...base(o, src), type: 'collapse', parts: ps.map((p) => p.spec.id), mass: ps.reduce((sum, p) => sum + p.st.mass, 0) })\n }\n }\n }\n\n const getObj = (id: string): ObjRT => {\n const o = objects.get(id)\n if (!o) throw new Error(`unknown object \"${id}\"`)\n return o\n }\n const getPart = (o: ObjRT, id: string): PartRT => {\n const p = o.byId.get(id)\n if (!p) throw new Error(`unknown part \"${id}\" in object \"${o.id}\"`)\n return p\n }\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Geometry in world space\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n const partXf = (o: ObjRT, p: PartRT): { c: Vec3; q: Quat } => ({ c: toWorld(o.st.position, o.st.rotation, p.pos), q: quat.mul(o.st.rotation, p.q) })\n const objLocal = (o: ObjRT, w: Vec3) => toLocal(o.st.position, o.st.rotation, w)\n const objLocalDir = (o: ObjRT, w: Vec3) => rotateVec(quat.conjugate(o.st.rotation), w)\n const jointWorld = (o: ObjRT, j: JointRT) => toWorld(o.st.position, o.st.rotation, j.pos)\n const distToPart = (o: ObjRT, p: PartRT, w: Vec3) => {\n const { c, q } = partXf(o, p)\n return distanceToShape(p.spec.shape, toLocal(c, q, w))\n }\n const partWorldAabb = (o: ObjRT, p: PartRT) => {\n const { c, q } = partXf(o, p)\n return aabbOf(p.spec.shape, c, q)\n }\n\n interface PartRay { t0: number; t1: number; n: Vec3 }\n const rayPartRaw = (pos: Vec3, rot: Quat, spec: PartSpec, pq: Quat, origin: Vec3, d: Vec3, lp: Vec3 = spec.position): PartRay | null => {\n const c = toWorld(pos, rot, lp)\n const q = quat.mul(rot, pq)\n const qi = quat.conjugate(q)\n const r = rayShape(spec.shape, rotateVec(qi, vec.sub(origin, c)), rotateVec(qi, d))\n return r ? { t0: r.t0, t1: r.t1, n: rotateVec(q, r.n0) } : null\n }\n const rayPart = (o: ObjRT, p: PartRT, origin: Vec3, d: Vec3): PartRay | null => rayPartRaw(o.st.position, o.st.rotation, p.spec, p.q, origin, d, p.pos)\n\n const raySphereMiss = (origin: Vec3, d: Vec3, c: Vec3, r: number, maxDist: number): boolean => {\n const oc = vec.sub(origin, c)\n const b = vec.dot(oc, d)\n const cc = vec.dot(oc, oc) - r * r\n if (cc > 0 && b > 0) return true\n const disc = b * b - cc\n if (disc < 0) return true\n return -b - Math.sqrt(disc) > maxDist\n }\n\n const raycastInternal = (origin: Vec3, dir: Vec3, maxDist: number, ignore?: Set<string>): (RayHit & { pathLen: number }) | null => {\n const d = vec.normalize(dir)\n let best: (RayHit & { pathLen: number }) | null = null\n for (const o of objects.values()) {\n if (raySphereMiss(origin, d, toWorld(o.st.position, o.st.rotation, o.bc), o.br, best ? Math.min(maxDist, best.distance) : maxDist)) continue\n for (const p of o.parts) {\n if (isLost(p) || ignore?.has(`${o.id}\\0${p.spec.id}`)) continue\n const r = rayPart(o, p, origin, d)\n if (!r || r.t0 < 0 || r.t0 > maxDist) continue\n if (!best || r.t0 < best.distance) best = { object: o.id, part: p.spec.id, point: vec.madd(origin, d, r.t0), normal: r.n, distance: r.t0, pathLen: r.t1 - r.t0 }\n }\n }\n for (const im of impls.values()) {\n for (const ps of im.impl.describe().parts) {\n if (ignore?.has(`${im.impl.id}\\0${ps.id}`)) continue\n const ov = im.poses.get(ps.id)\n const r = rayPartRaw(im.position, im.rotation, ps, ov?.q ?? quatFromEuler(...(ps.rotation ?? [0, 0, 0])), origin, d, ov?.pos)\n if (!r || r.t0 < 0 || r.t0 > maxDist) continue\n if (!best || r.t0 < best.distance) best = { object: im.impl.id, part: ps.id, point: vec.madd(origin, d, r.t0), normal: r.n, distance: r.t0, pathLen: r.t1 - r.t0 }\n }\n }\n return best\n }\n\n // impl hosting\n const implHit = (im: ImplRT, hit: Hit): HitResult => {\n let h = hit\n if (hit.space === 'local') {\n h = { ...hit, space: 'world', point: toWorld(im.position, im.rotation, hit.point) }\n if (hit.direction) h.direction = rotateVec(im.rotation, hit.direction)\n }\n const start = cur.length\n for (const e of im.impl.hit(h) ?? []) emit(e.time === undefined ? { ...e, time } : e)\n const mine = cur.slice(start)\n const res: HitResult = { object: im.impl.id, damage: 0, penetrated: false, exitEnergy: 0, events: mine, point: hit.point }\n for (const e of mine) {\n if (e.type === 'damage') res.damage += e.amount\n if (e.type === 'hole' && e.hole.through) res.penetrated = true\n if (res.part === undefined && 'part' in e) res.part = (e as { part: string }).part\n }\n return res\n }\n\n const implJointPos = (im: ImplRT, a: string, b: string): Vec3 | null => {\n const parts = im.impl.describe().parts\n const pa = parts.find((p) => p.id === a), pb = parts.find((p) => p.id === b)\n if (!pa || !pb) return null\n const A = aabbOf(pa.shape, pa.position, quatFromEuler(...(pa.rotation ?? [0, 0, 0])))\n const B = aabbOf(pb.shape, pb.position, quatFromEuler(...(pb.rotation ?? [0, 0, 0])))\n const pos: Vec3 = [0, 0, 0]\n for (let k = 0; k < 3; k++) pos[k] = (Math.max(A.min[k], B.min[k]) + Math.min(A.max[k], B.max[k])) / 2\n return toWorld(im.position, im.rotation, pos)\n }\n\n /** Find the part a hit lands on: a short ray along `dir`, else the nearest part within `tol`. */\n const locate = (o: ObjRT, point: Vec3, dir: Vec3 | undefined, tol: number, only?: PartRT): Loc | null => {\n const cands = only ? [only] : o.parts\n if (dir && vec.length(dir) > 1e-9) {\n const d = vec.normalize(dir)\n const origin = vec.madd(point, d, -0.05)\n let best: Loc | null = null\n let bestT = Infinity\n let inside: Loc | null = null\n for (const p of cands) {\n if (isLost(p)) continue\n const r = rayPart(o, p, origin, d)\n if (!r) continue\n if (r.t0 >= 0 && r.t0 <= 0.15) {\n if (r.t0 < bestT) {\n bestT = r.t0\n best = { p, point: vec.madd(origin, d, r.t0), normal: r.n, dir: d, pathLen: Math.max(r.t1 - r.t0, 1e-4) }\n }\n } else if (r.t0 < 0 && r.t1 > 0 && !inside) {\n inside = { p, point, normal: vec.scale(d, -1), dir: d, pathLen: Math.max(r.t1 - 0.05, p.thickness) }\n }\n }\n if (best) return best\n if (inside) return inside\n }\n let np: PartRT | null = null\n let nd = Infinity\n for (const p of cands) {\n if (isLost(p)) continue\n const dd = distToPart(o, p, point)\n if (dd < nd) {\n nd = dd\n np = p\n }\n }\n if (!np || nd > tol) return null\n const { c, q } = partXf(o, np)\n const sp = surfacePoint(np.spec.shape, toLocal(c, q, point))\n const normal = rotateVec(q, sp.normal)\n return { p: np, point: toWorld(c, q, sp.point), normal, dir: dir && vec.length(dir) > 1e-9 ? vec.normalize(dir) : vec.scale(normal, -1), pathLen: np.thickness }\n }\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Marks on parts\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n const markDamaged = (p: PartRT) => {\n if (p.st.status === 'intact') p.st.status = 'damaged'\n }\n\n const addDent = (o: ObjRT, p: PartRT, wp: Vec3, wn: Vec3, radius: number, depth: number, src?: string) => {\n const dent: Dent = { point: objLocal(o, wp), normal: objLocalDir(o, wn), radius, depth }\n const arr = p.st.dents\n let ni = -1, nd = Infinity\n for (let i = 0; i < arr.length; i++) {\n const dd = vec.distance(arr[i].point, dent.point)\n if (dd < nd) {\n nd = dd\n ni = i\n }\n }\n if (ni >= 0 && (arr.length >= maxDents || nd < arr[ni].radius * 0.6)) {\n arr[ni].depth = Math.min(0.1, Math.max(arr[ni].depth, depth) + depth * 0.3)\n arr[ni].radius = Math.max(arr[ni].radius, radius)\n } else arr.push(dent)\n markDamaged(p)\n emit({ ...base(o, src), type: 'dent', part: p.spec.id, dent, worldPoint: wp })\n }\n\n const addHole = (o: ObjRT, p: PartRT, wp: Vec3, wn: Vec3, diameter: number, through: boolean, exit?: Vec3, src?: string) => {\n const hole: Hole = { point: objLocal(o, wp), normal: objLocalDir(o, wn), diameter, through }\n p.st.holes.push(hole)\n if (p.st.holes.length > maxHoles) p.st.holes.shift()\n markDamaged(p)\n emit({ ...base(o, src), type: 'hole', part: p.spec.id, hole, worldPoint: wp, ...(exit ? { exitPoint: exit } : {}) })\n return hole\n }\n\n const addCrack = (o: ObjRT, p: PartRT, wp: Vec3, wn: Vec3, length: number, src?: string) => {\n const crack: Crack = { point: objLocal(o, wp), normal: objLocalDir(o, wn), length: Math.min(length, Math.max(p.bound, 0.05)), rays: 5 + Math.floor(rnd() * 5) }\n p.st.cracks.push(crack)\n if (p.st.cracks.length > 16) p.st.cracks.shift()\n markDamaged(p)\n emit({ ...base(o, src), type: 'crack', part: p.spec.id, crack, worldPoint: wp })\n }\n\n const debris = (o: ObjRT, p: PartRT, kind: DebrisKind, point: Vec3, normal: Vec3, count: number, speed: number, src?: string) =>\n emit({ ...base(o, src), type: 'debris', part: p.spec.id, kind, point, normal, count, speed })\n\n const holeRate = (hole: Hole, pressurized: boolean) => (pressurized ? 0.5 : 0.1) * (hole.diameter / 0.009)\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Failure, joints\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n const detachEvents = (o: ObjRT, opened: JointRT[], by: 'break' | 'tool' | 'part_lost', src?: string) => {\n for (const j of opened) emit({ ...base(o, src), type: 'detach', joint: j.spec.id, parts: [j.spec.a, j.spec.b], by, groups: o.st.groups.map((g) => [...g]) })\n }\n\n const checkDestroyed = (o: ObjRT, src?: string) => {\n if (!o.st.destroyed && o.parts.length > 0 && o.parts.every(isLost)) {\n o.st.destroyed = true\n emit({ ...base(o, src), type: 'destroyed' })\n }\n }\n\n const partLost = (o: ObjRT, p: PartRT, src?: string) => {\n const opened: JointRT[] = []\n for (const j of o.byPart.get(p.spec.id) ?? []) {\n if (j.st.open) continue\n j.st.open = true\n j.st.openedBy = 'part_lost'\n opened.push(j)\n }\n solveStructure(o)\n recomputeGroups(o)\n detachEvents(o, opened, 'part_lost', src)\n collapseCheck(o, src)\n checkDestroyed(o, src)\n }\n\n /**\n * Distance from a world point to the joint's contact region: the overlap box of the two parts' bounds (or, when they only nearly touch, the box\n * of the gap between them). Measuring to the joint centre would make a thick part untouchable: a blow on a trunk's surface is half the trunk's\n * width away from a joint that sits on its axis.\n */\n const jointReach = (o: ObjRT, j: JointRT, point: Vec3): number => {\n const A = partWorldAabb(o, o.parts[j.ia]), B = partWorldAabb(o, o.parts[j.ib])\n let d2 = 0\n for (let k = 0; k < 3; k++) {\n const lo = Math.min(Math.max(A.min[k], B.min[k]), Math.min(A.max[k], B.max[k]))\n const hi = Math.max(Math.max(A.min[k], B.min[k]), Math.min(A.max[k], B.max[k]))\n const d = point[k] < lo ? lo - point[k] : point[k] > hi ? point[k] - hi : 0\n d2 += d * d\n }\n return Math.sqrt(d2)\n }\n /** How far from the contact region a blow still counts: half the smallest dimension of the smaller part, at least 6 cm. */\n const jointReachLimit = (o: ObjRT, j: JointRT): number => {\n const pa = o.parts[j.ia], pb = o.parts[j.ib]\n const small = pa.dims[0] * pa.dims[1] * pa.dims[2] <= pb.dims[0] * pb.dims[1] * pb.dims[2] ? pa : pb\n return Math.max(0.06, 0.5 * Math.min(small.dims[0], small.dims[1], small.dims[2]))\n }\n\n const wearJoints = (o: ObjRT, p: PartRT, amount: number, near?: Vec3, radius = 0.06, src?: string, split = false) => {\n if (amount <= 0) return\n const mine = (o.byPart.get(p.spec.id) ?? []).filter((j) => !j.st.open)\n if (split && mine.length) amount /= mine.length\n for (const j of mine) {\n if (j.st.open) continue\n if (near && jointReach(o, j, near) > Math.max(radius, jointReachLimit(o, j))) continue\n j.st.hp -= amount\n if (j.st.hp <= 0) {\n j.st.hp = 0\n j.st.open = true\n j.st.openedBy = 'break'\n solveStructure(o)\n recomputeGroups(o)\n detachEvents(o, [j], 'break', src)\n collapseCheck(o, src)\n }\n }\n }\n\n /** Part hit points reached 0 (or it was forced to explode): fragments, debris, joints open. */\n const failPart = (o: ObjRT, p: PartRT, origin: Vec3 | null, dir: Vec3 | null, fragEnergy: number, cap: number, src?: string) => {\n if (isLost(p)) return\n const ex = p.spec.explodes\n const style = p.mat.fracture === 'none' ? 'snap' : p.mat.fracture\n const { c, q } = partXf(o, p)\n const hitW = origin ?? c\n const grain = p.spec.grain ? AXIS[p.spec.grain] : undefined\n const plan = planFragments({\n style, dims: p.dims, thickness: p.thickness, grain, hit: toLocal(c, q, hitW), fragmentSize: p.mat.fragmentSize ?? [0.04, 0.2], maxFragments, rnd,\n })\n const mass = p.st.mass\n const totW = plan.reduce((s, f) => s + f.weight, 0) || 1\n const energy = ex ? ex.energy * 0.2 : fragEnergy\n const speed = clamp(Math.sqrt((2 * energy) / Math.max(mass, 0.05)), 0.3, ex ? 40 : cap)\n const fragments: Fragment[] = plan.map((f, i) => {\n const cw = toWorld(c, q, f.center)\n const out = vec.normalize(vec.sub(cw, hitW), [0, 1, 0])\n const dv = dir ? vec.normalize(vec.madd(out, dir, 0.6)) : out\n const k = speed * (0.6 + 0.8 * rnd())\n return {\n id: `${p.spec.id}#${i}`, part: p.spec.id, material: p.spec.material, shape: f.shape, center: cw, size: f.size, rotation: quat.mul(q, f.q),\n velocity: [dv[0] * k, dv[1] * k + 0.5 * rnd(), dv[2] * k],\n angularVelocity: [(rnd() - 0.5) * 12, (rnd() - 0.5) * 12, (rnd() - 0.5) * 12],\n mass: (mass * f.weight) / totW,\n }\n })\n p.st.status = 'broken'\n p.st.hp = 0\n p.st.mass = 0\n p.st.burning = false\n p.rt.jet = false\n emit({ ...base(o, src), type: 'fracture', part: p.spec.id, style, fragments, point: hitW })\n debris(o, p, p.mat.breakDebris, c, [0, 1, 0], clamp(Math.round(Math.cbrt(partVolume(p.spec.shape)) * 30), 3, 20), 2, src)\n if (ex) {\n emit({ ...base(o, src), type: 'explode', part: p.spec.id, point: c, energy: ex.energy, radius: ex.radius })\n blasts.push({ point: c, energy: ex.energy, radius: ex.radius, source: src })\n }\n partLost(o, p, src)\n }\n\n /** Remove hit points. Returns the amount actually removed. */\n const applyDamage = (o: ObjRT, p: PartRT, amount: number, type: DamageType, origin: Vec3 | null, dir: Vec3 | null, fragEnergy: number, cap: number, src?: string): number => {\n if (isLost(p) || amount <= 0) return 0\n const prev = p.st.hp\n p.st.hp -= amount\n markDamaged(p)\n if (p.st.hp <= 0 && p.mat.fracture === 'none' && !p.spec.explodes) p.st.hp = Math.min(prev, 1)\n const done = prev - p.st.hp\n if (done > 0) emit({ ...base(o, src), type: 'damage', part: p.spec.id, amount: done, hp: Math.max(0, p.st.hp), damageType: type })\n if (p.st.hp <= 0) failPart(o, p, origin, dir, fragEnergy, cap, src)\n return done\n }\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Hits\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n interface BallisticOut { penetrated: boolean; exitEnergy: number; exitPoint?: Vec3; damage: number }\n\n const ballistic = (o: ObjRT, p: PartRT, entry: Vec3, n: Vec3, d: Vec3, E: number, caliber: number, pathLen: number, src?: string): BallisticOut => {\n const mat = p.mat\n const sin = Math.min(1, Math.abs(vec.dot(d, n)))\n const angle = (Math.asin(sin) * 180) / Math.PI\n const effM = p.thickness / Math.max(sin, 0.3)\n const thr = mat.penetration * effM * 1000\n const penetrated = E > thr\n const scale = mat.damageScale?.ballistic ?? 1\n const id = p.spec.id\n if (!penetrated && mat.ricochetDeg && angle < mat.ricochetDeg) {\n const r = vec.sub(d, vec.scale(n, 2 * vec.dot(d, n)))\n emit({ ...base(o, src), type: 'ricochet', part: id, point: entry, direction: vec.normalize(r), energy: E * 0.4 })\n debris(o, p, mat.hitDebris, entry, n, 3, 3, src)\n const dmg = applyDamage(o, p, E * DMG_PER_J * scale * 0.2, 'ballistic', entry, d, E * 0.1, 12, src)\n return { penetrated: false, exitEnergy: 0, damage: dmg }\n }\n const brittle = mat.ductility < 0.3\n const ratio = E / Math.max(thr, 1e-6)\n const crackLen = clamp(0.03 + ratio * 0.2, 0.03, 0.8)\n let exitPoint: Vec3 | undefined\n if (penetrated) {\n exitPoint = vec.madd(entry, d, Math.min(pathLen, effM))\n const hole = addHole(o, p, entry, n, (caliber / 1000) * (mat.ductility >= 0.3 ? 1 : 1.5), true, exitPoint, src)\n if (brittle && mat.fracture === 'shatter') addCrack(o, p, entry, n, crackLen, src)\n if (p.spec.contains && (p.st.liters ?? 0) > 0) {\n emit({\n ...base(o, src), type: 'leak', part: id, fluid: p.spec.contains.fluid, point: entry, direction: n, rate: holeRate(hole, !!p.spec.contains.pressurized),\n pressurized: !!p.spec.contains.pressurized,\n })\n }\n } else if (mat.ductility >= 0.5) {\n addDent(o, p, entry, n, Math.max((caliber * 3) / 1000, 0.012), clamp(Math.min(Math.max(p.thickness * 3, 0.003), ratio * 0.01), 0.001, 0.05), src)\n } else if (brittle) {\n addCrack(o, p, entry, n, crackLen, src)\n if (mat.fracture !== 'shatter') addHole(o, p, entry, n, caliber / 1000, false, undefined, src)\n } else addHole(o, p, entry, n, caliber / 1000, false, undefined, src)\n debris(o, p, mat.hitDebris, entry, n, clamp(Math.round(E / 60) + 2, 2, 14), clamp(Math.sqrt(E) / 6, 1, 8), src)\n // a bullet only wears the joints of the part it hits, by the energy the part absorbed (a through-and-through shot transfers little)\n wearJoints(o, p, (penetrated ? thr : E) * 0.02, undefined, 0, src, true)\n const dmg = applyDamage(o, p, E * DMG_PER_J * scale, 'ballistic', entry, d, E * 0.1, 12, src)\n return { penetrated, exitEnergy: penetrated ? E - thr : 0, exitPoint, damage: dmg }\n }\n\n const melee = (o: ObjRT, p: PartRT, kind: 'blunt' | 'slash', E: number, point: Vec3, n: Vec3, d: Vec3, contactR: number, src?: string): number => {\n const mat = p.mat\n const thrMm = mat.penetration * p.thickness * 1000\n // brittle thin shells (a bottle, a mug, a pane) break from a knock that a thick block shrugs off\n const fragile = kind === 'blunt' ? fragility(mat.ductility, p.thickness) : 1\n const Ec = E * fragile\n if (E > 0) {\n if (kind === 'blunt') {\n if (mat.ductility >= 0.5) addDent(o, p, point, n, Math.max(contactR, 0.015), clamp(E * 0.0001, 0.001, 0.06), src)\n else if (mat.ductility < 0.3) {\n if (Ec >= 5) addCrack(o, p, point, n, clamp(0.04 + Math.min(Ec, E * 6) * 0.0008, 0.04, 0.6), src)\n } else if (E >= thrMm * 0.2) addDent(o, p, point, n, Math.max(contactR, 0.015), clamp(E * 0.00006, 0.001, 0.04), src)\n } else if (mat.fracture === 'tear') {\n addHole(o, p, point, n, clamp(0.02 + E * 0.0005, 0.02, 0.3), true, undefined, src)\n } else if (mat.ductility >= 0.5) {\n addDent(o, p, point, n, Math.max(contactR, 0.01), clamp(E * 0.00004, 0.0005, 0.02), src)\n }\n debris(o, p, mat.hitDebris, point, n, clamp(Math.round(E / 25) + 1, 1, 10), clamp(Math.sqrt(E) / 8, 1, 6), src)\n }\n if (kind === 'blunt') wearJoints(o, p, E * 0.3, undefined, 0, src)\n else wearJoints(o, p, E * 0.3, point, 0.06, src)\n const scale = mat.damageScale?.[kind] ?? 1\n return applyDamage(o, p, Ec * DMG_PER_J * scale, kind, point, d, E * 0.1, 12, src)\n }\n\n const blastObject = (o: ObjRT, point: Vec3, energy: number, radius: number, src?: string): HitResult => {\n const start = cur.length\n const res: HitResult = { object: o.id, damage: 0, penetrated: false, exitEnergy: 0, events: [] }\n for (const p of o.parts) {\n if (isLost(p)) continue\n const { c, q } = partXf(o, p)\n const lp = toLocal(c, q, point)\n const dist = distanceToShape(p.spec.shape, lp)\n if (dist >= radius) continue\n const f = (1 - dist / radius) ** 2\n const Ein = energy * f * BLAST_COUPLING\n const sp = surfacePoint(p.spec.shape, lp)\n const wp = toWorld(c, q, sp.point)\n const wn = rotateVec(q, sp.normal)\n if (!res.part) {\n res.part = p.spec.id\n res.point = wp\n }\n const mat = p.mat\n if (Ein > 20) {\n if (mat.ductility >= 0.5) addDent(o, p, wp, wn, clamp(0.05 + Math.sqrt(Ein) * 0.002, 0.05, 0.4), clamp(0.004 + Ein * 0.00002, 0.004, 0.08), src)\n else if (mat.ductility < 0.3 && Ein > 60) addCrack(o, p, wp, wn, clamp(0.05 + Ein * 0.0005, 0.05, 1), src)\n debris(o, p, mat.hitDebris, wp, wn, clamp(Math.round(Ein / 80) + 1, 1, 12), clamp(Math.sqrt(Ein) / 4, 2, 15), src)\n }\n const th = mat.thermal\n if (th.ignitionC !== undefined && p.st.fuel > 0) {\n p.st.temperature += 300 * f\n o.active = true\n if (f >= 0.25 && !p.st.burning) {\n p.st.temperature = Math.max(p.st.temperature, th.ignitionC + 1)\n checkIgnite(o, p, src)\n }\n }\n wearJoints(o, p, Ein * 0.5, undefined, 0, src)\n res.damage += applyDamage(o, p, Ein * DMG_PER_J * (mat.damageScale?.explosive ?? 1), 'explosive', point, null, Ein * 0.3, 40, src)\n }\n res.events = cur.slice(start)\n return res\n }\n\n const blastWorld = (point: Vec3, energy: number, radius: number, src?: string): HitResult[] => {\n const out: HitResult[] = []\n for (const o of [...objects.values()]) {\n if (vec.distance(toWorld(o.st.position, o.st.rotation, o.bc), point) - o.br >= radius) continue\n const r = blastObject(o, point, energy, radius, src)\n if (r.part) out.push(r)\n }\n for (const im of [...impls.values()]) {\n const inRange = im.impl.describe().parts.some((ps) => {\n const ov = im.poses.get(ps.id)\n const c = toWorld(im.position, im.rotation, ov?.pos ?? ps.position)\n const q = quat.mul(im.rotation, ov?.q ?? quatFromEuler(...(ps.rotation ?? [0, 0, 0])))\n return distanceToShape(ps.shape, toLocal(c, q, point)) < radius\n })\n if (inRange) out.push(implHit(im, { type: 'explosive', point, energy, radius, ...(src !== undefined ? { source: src } : {}) }))\n }\n return out\n }\n\n const heatObject = (o: ObjRT, point: Vec3, T: number, radius: number, duration: number, src?: string): HitResult => {\n const start = cur.length\n const res: HitResult = { object: o.id, damage: 0, penetrated: false, exitEnergy: 0, events: [] }\n for (const p of o.parts) {\n if (isLost(p)) continue\n const dist = distToPart(o, p, point)\n if (dist >= radius) continue\n const f = clamp(1 - dist / radius, 0.25, 1)\n if (!res.part) {\n res.part = p.spec.id\n res.point = point\n }\n if (T > p.st.temperature) {\n const k = (0.8 * f) / (p.mat.thermal.heatCapacity ?? 1)\n p.st.temperature += (T - p.st.temperature) * (1 - Math.exp(-k * duration))\n }\n o.active = true\n checkIgnite(o, p, src)\n }\n res.events = cur.slice(start)\n return res\n }\n\n const doHit = (o: ObjRT, hit: Hit, only?: PartRT): HitResult => {\n let point = hit.point\n let dir = hit.direction\n if (hit.space === 'local') {\n point = toWorld(o.st.position, o.st.rotation, point)\n if (dir) dir = rotateVec(o.st.rotation, dir)\n }\n const src = hit.source\n const start = cur.length\n let res: HitResult = { object: o.id, damage: 0, penetrated: false, exitEnergy: 0, events: [] }\n const E = hit.energy ?? 0\n if (hit.type === 'ballistic') {\n const loc = locate(o, point, dir, 0.05, only)\n if (loc) {\n const out = ballistic(o, loc.p, loc.point, loc.normal, loc.dir, E, hit.caliber ?? 9, loc.pathLen, src)\n res = { ...res, part: loc.p.spec.id, point: loc.point, damage: out.damage, penetrated: out.penetrated, exitEnergy: out.exitEnergy }\n }\n } else if (hit.type === 'blunt' || hit.type === 'slash') {\n const radius = hit.radius ?? 0\n const loc = locate(o, point, dir, Math.max(0.05, radius), only)\n if (loc) {\n res.part = loc.p.spec.id\n res.point = loc.point\n res.damage += melee(o, loc.p, hit.type, E, loc.point, loc.normal, loc.dir, radius || 0.03, src)\n if (radius > 0.1 && !only) {\n for (const p of o.parts) {\n if (p === loc.p || isLost(p)) continue\n const dd = distToPart(o, p, point)\n if (dd >= radius) continue\n const { c, q } = partXf(o, p)\n const sp = surfacePoint(p.spec.shape, toLocal(c, q, point))\n res.damage += melee(o, p, hit.type, E * (1 - dd / radius) ** 2, toWorld(c, q, sp.point), rotateVec(q, sp.normal), loc.dir, radius, src)\n }\n }\n }\n } else if (hit.type === 'explosive') {\n res = blastObject(o, point, E, hit.radius ?? 2, src)\n } else {\n res = heatObject(o, point, hit.temperature ?? 800, hit.radius ?? 0.25, hit.duration ?? 1, src)\n }\n res.events = cur.slice(start)\n return res\n }\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // Fire, heat, melting, leaks\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n const checkIgnite = (o: ObjRT, p: PartRT, src?: string) => {\n const th = p.mat.thermal\n if (isLost(p) || p.st.burning || th.ignitionC === undefined || p.st.fuel <= 0 || p.st.temperature < th.ignitionC) return\n p.st.burning = true\n p.st.temperature = Math.max(p.st.temperature, th.flameC ?? 800)\n o.active = true\n markDamaged(p)\n emit({ ...base(o, src), type: 'ignite', part: p.spec.id, point: partXf(o, p).c })\n }\n\n const syncMass = (p: PartRT) => {\n p.st.mass = Math.max(0, p.mass0 * (1 - p.st.melt) - (p.fuel0 - p.st.fuel))\n }\n\n const burnStep = (o: ObjRT, p: PartRT, dt: number) => {\n const th = p.mat.thermal\n const use = Math.min((th.burnRate ?? 0.01) * p.area * dt, p.st.fuel)\n p.st.fuel -= use\n syncMass(p)\n if (p.structural) o.dirty = true\n p.st.temperature = th.flameC ?? 800\n markDamaged(p)\n if (p.fuel0 > 0) {\n p.st.char = clamp(1 - p.st.fuel / p.fuel0, 0, 1)\n p.st.hp = Math.min(p.st.hp, Math.max(1, p.st.maxHp * (p.st.fuel / p.fuel0)))\n }\n if (p.st.fuel <= 1e-9) {\n p.st.fuel = 0\n p.st.burning = false\n p.st.char = 1\n const c = partXf(o, p).c\n if ((th.fuelFraction ?? 0) >= 0.8) {\n p.st.status = 'ashes'\n p.st.hp = 0\n p.st.mass = p.mass0 * (1 - (th.fuelFraction ?? 0))\n emit({ ...base(o), type: 'burnout', part: p.spec.id, point: c })\n debris(o, p, 'ash', c, [0, 1, 0], clamp(Math.round(Math.cbrt(partVolume(p.spec.shape)) * 30), 3, 20), 1)\n partLost(o, p)\n } else {\n emit({ ...base(o), type: 'burnout', part: p.spec.id, point: c })\n }\n }\n }\n\n const meltStep = (o: ObjRT, p: PartRT, dt: number) => {\n const th = p.mat.thermal\n if (th.meltC === undefined || p.st.temperature <= th.meltC) return\n const rate = (th.meltRate ?? 0.05) * ((p.st.temperature - th.meltC) / 100)\n p.st.melt = Math.min(1, p.st.melt + rate * dt)\n syncMass(p)\n if (p.structural) o.dirty = true\n markDamaged(p)\n p.rt.dripT += dt\n if (p.rt.dripT >= 0.25) {\n p.rt.dripT -= 0.25\n const b = partWorldAabb(o, p)\n const pt: Vec3 = [b.min[0] + (b.max[0] - b.min[0]) * (0.2 + 0.6 * rnd()), b.min[1], b.min[2] + (b.max[2] - b.min[2]) * (0.2 + 0.6 * rnd())]\n emit({ ...base(o), type: 'drip', part: p.spec.id, point: pt, material: p.mat.id })\n }\n if (p.st.melt - p.rt.meltEmitted >= 0.05 || p.st.melt >= 1) {\n p.rt.meltEmitted = p.st.melt\n emit({ ...base(o), type: 'melt', part: p.spec.id, melt: p.st.melt })\n }\n if (p.st.melt >= 1) {\n p.st.status = 'melted'\n p.st.hp = 0\n p.st.mass = 0\n p.st.burning = false\n p.rt.jet = false\n partLost(o, p)\n }\n }\n\n const stepObject = (o: ObjRT, dt: number, sources: Array<{ o: ObjRT; p: PartRT; flame: number }>) => {\n const parts = o.parts\n const T0 = o.tmp\n T0.length = parts.length\n for (let i = 0; i < parts.length; i++) T0[i] = parts[i].st.temperature\n let hot = false\n for (let i = 0; i < parts.length; i++) {\n const p = parts[i]\n if (isLost(p)) continue\n const th = p.mat.thermal\n const hc = th.heatCapacity ?? 1\n const s = p.st\n if (p.rt.jet) {\n s.temperature = Math.max(s.temperature, 900)\n } else if (s.burning) {\n burnStep(o, p, dt)\n if (isLost(p)) continue\n }\n if (!s.burning && !p.rt.jet) {\n // conduction from hotter neighbours through closed joints, then cooling\n let dT = 0\n let maxN = s.temperature\n for (const j of o.byPart.get(p.spec.id)!) {\n if (j.st.open) continue\n const k = j.ia === i ? j.ib : j.ia\n if (isLost(parts[k]) || T0[k] <= T0[i]) continue\n const c = (th.conductivity + parts[k].mat.thermal.conductivity) / 2\n dT += (T0[k] - T0[i]) * (1 - Math.exp((-1.2 * c * dt) / hc))\n if (T0[k] > maxN) maxN = T0[k]\n }\n if (dT > 0) s.temperature = Math.min(s.temperature + dT, maxN)\n s.temperature += (ambient - s.temperature) * (1 - Math.exp(-dt / (20 * hc)))\n if (Math.abs(s.temperature - ambient) < 0.05) s.temperature = ambient\n }\n meltStep(o, p, dt)\n if (isLost(p)) continue\n checkIgnite(o, p)\n const ex = p.spec.explodes\n if (ex && ex.atC !== undefined && s.temperature >= ex.atC) {\n failPart(o, p, null, null, 0, 40)\n continue\n }\n // leaks\n const cont = p.spec.contains\n if (cont && (s.liters ?? 0) > 0) {\n let rate = 0\n for (const h of s.holes) if (h.through) rate += holeRate(h, !!cont.pressurized)\n if (rate > 0) {\n s.liters = Math.max(0, (s.liters ?? 0) - rate * dt)\n hot = true\n if (FLAMMABLE_FLUIDS.includes(cont.fluid) && s.temperature >= 350 && !p.rt.jet) {\n if (ex) {\n failPart(o, p, null, null, 0, 40)\n continue\n }\n p.rt.jet = true\n s.burning = true\n emit({ ...base(o), type: 'ignite', part: p.spec.id, point: partXf(o, p).c })\n }\n }\n }\n if (p.rt.jet && (s.liters ?? 0) <= 0) {\n p.rt.jet = false\n s.burning = false\n emit({ ...base(o), type: 'extinguish', part: p.spec.id })\n }\n // thermal shock\n const sc = th.thermalShockC\n if (sc !== undefined) {\n p.rt.shockT = Math.max(0, p.rt.shockT - dt)\n const rate = Math.abs(s.temperature - p.rt.prevTemp) / dt\n p.rt.prevTemp = s.temperature\n if (rate > sc && p.rt.shockT <= 0) {\n p.rt.shockT = 1\n const { c, q } = partXf(o, p)\n const lp: Vec3 = [(rnd() - 0.5) * p.dims[0], (rnd() - 0.5) * p.dims[1], (rnd() - 0.5) * p.dims[2]]\n const sp = surfacePoint(p.spec.shape, lp)\n addCrack(o, p, toWorld(c, q, sp.point), rotateVec(q, sp.normal), 0.1 + (rate / sc) * 0.1)\n applyDamage(o, p, p.st.maxHp * 0.25, 'heat', null, null, 5, 3)\n if (isLost(p)) continue\n }\n }\n if (s.burning || p.rt.jet) sources.push({ o, p, flame: p.rt.jet ? 900 : th.flameC ?? 800 })\n if (s.burning || p.rt.jet || s.temperature > ambient + 0.5) hot = true\n }\n if (o.hasStructure) {\n if (o.dirty) {\n o.dirty = false\n solveStructure(o)\n }\n for (const p of parts) {\n if (!p.structural || isLost(p)) continue\n const stress = p.st.stress ?? 0\n p.rt.stressT = Math.max(0, (p.rt.stressT ?? 0) - dt)\n if (stress > 1) {\n if (p.rt.stressT <= 0) {\n p.rt.stressT = 0.5\n emit({ ...base(o), type: 'stress', part: p.spec.id, stress, load: p.st.load ?? 0 })\n }\n applyDamage(o, p, (stress - 1) * p.st.maxHp * 0.5 * dt, 'blunt', null, null, 5, 3)\n } else if (stress > 0.8 && p.mat.ductility < 0.3 && p.rt.stressT <= 0 && p.st.cracks.length < 6) {\n p.rt.stressT = 0.5\n const { c, q } = partXf(o, p)\n const sp = surfacePoint(p.spec.shape, [(rnd() - 0.5) * p.dims[0], (rnd() - 0.5) * p.dims[1], (rnd() - 0.5) * p.dims[2]])\n addCrack(o, p, toWorld(c, q, sp.point), rotateVec(q, sp.normal), 0.1 + (stress - 0.8) * 0.5)\n }\n }\n if (o.maxStress > 0.8) hot = true\n }\n o.active = hot\n }\n\n const spread = (sources: Array<{ o: ObjRT; p: PartRT; flame: number }>, dt: number) => {\n for (const src of sources) {\n if (!src.p.st.burning && !src.p.rt.jet) continue\n const sc = toWorld(src.o.st.position, src.o.st.rotation, src.p.pos)\n const A = partWorldAabb(src.o, src.p)\n for (const o of objects.values()) {\n if (o === src.o) continue\n if (vec.distance(toWorld(o.st.position, o.st.rotation, o.bc), sc) > o.br + src.p.bound + fireSpread) continue\n for (const q of o.parts) {\n if (isLost(q) || q.st.burning) continue\n const B = partWorldAabb(o, q)\n const gap = Math.hypot(\n Math.max(0, A.min[0] - B.max[0], B.min[0] - A.max[0]),\n Math.max(0, A.min[1] - B.max[1], B.min[1] - A.max[1]),\n Math.max(0, A.min[2] - B.max[2], B.min[2] - A.max[2]),\n )\n if (gap >= fireSpread || src.flame <= q.st.temperature) continue\n const f = 1 - gap / fireSpread\n q.st.temperature += (src.flame - q.st.temperature) * (1 - Math.exp((-0.6 * f * dt) / (q.mat.thermal.heatCapacity ?? 1)))\n o.active = true\n }\n }\n }\n }\n\n // -------------------------------------------------------------------------------------------------------------------------------------------\n // World API\n // -------------------------------------------------------------------------------------------------------------------------------------------\n\n /** Collapse events are produced after the whole operation: make sure the result of the operation carries them. */\n const withCollapses = (r: { value: HitResult[]; events: DestructionEvent[] }): HitResult[] => {\n const last = r.value[r.value.length - 1]\n if (!last) return r.value\n for (const e of r.events) if (e.type === 'collapse' && !r.value.some((h) => h.events.includes(e))) last.events.push(e)\n return r.value\n }\n\n const whole = (fn: () => HitResult): HitResult => {\n const r = run(fn)\n r.value.events = r.events\n return r.value\n }\n\n const world: DestructionWorld = {\n materials,\n get time() {\n return time\n },\n add(spec, opts: AddOptions = {}) {\n const id = opts.id ?? nextId()\n if (taken(id)) throw new Error(`object \"${id}\" already exists`)\n objects.set(id, build(resolveSpec(spec), id, opts.position ?? [0, 0, 0], opts.rotation ?? [0, 0, 0, 1]))\n return id\n },\n register(impl, opts: AddOptions = {}) {\n const id = opts.id ?? impl.id\n if (taken(id)) throw new Error(`object \"${id}\" already exists`)\n impls.set(id, { impl, position: opts.position ?? [0, 0, 0], rotation: opts.rotation ?? [0, 0, 0, 1], poses: new Map() })\n return id\n },\n setPartPose(objectId, partId, position, rotation) {\n const q = quatFromEuler(...(rotation ?? [0, 0, 0]))\n const im = impls.get(objectId)\n if (im) {\n im.impl.setPartPose?.(partId, position, rotation)\n im.poses.set(partId, { pos: [position[0], position[1], position[2]], q })\n return\n }\n const o = getObj(objectId)\n const p = getPart(o, partId)\n p.pos = [position[0], position[1], position[2]]\n p.q = q\n updateBound(o)\n },\n remove(id) {\n objects.delete(id)\n impls.delete(id)\n },\n has: (id) => taken(id),\n ids: () => [...objects.keys(), ...impls.keys()],\n setTransform(id, position, rotation) {\n const im = impls.get(id)\n if (im) {\n im.position = [position[0], position[1], position[2]]\n im.rotation = [rotation[0], rotation[1], rotation[2], rotation[3]]\n return\n }\n const o = getObj(id)\n o.st.position = [position[0], position[1], position[2]]\n o.st.rotation = [rotation[0], rotation[1], rotation[2], rotation[3]]\n },\n splitGroup(id, group, newId) {\n if (impls.has(id)) throw new Error(`object \"${id}\" is a registered DestructibleImpl and cannot be split; its module owns its pieces`)\n const o = getObj(id)\n if (o.st.groups.length < 2) return id\n const names = o.st.groups[group]\n if (!names) throw new Error(`object \"${id}\" has no group ${group}`)\n const moved = new Set(names)\n const nid = newId ?? nextId()\n if (objects.has(nid)) throw new Error(`object \"${nid}\" already exists`)\n // an open joint between the two objects stays with the original\n const carryFor = (keep: (pid: string) => boolean, keepOpen: (a: string, b: string) => boolean = () => false): Carry => ({\n parts: new Map(o.parts.filter((p) => keep(p.spec.id)).map((p) => [p.spec.id, { st: p.st, rt: p.rt }])),\n joints: new Map([\n ...o.joints.filter((j) => (keep(j.spec.a) && keep(j.spec.b)) || (j.st.open && keepOpen(j.spec.a, j.spec.b))).map((j): [string, { st: JointState; step: number }] => [j.spec.id, { st: j.st, step: j.step }]),\n ...o.st.joints.filter((st) => st.open && !o.jointMap.has(st.id) && keepOpen(st.a, st.b)).map((st): [string, { st: JointState; step: number }] => [st.id, { st, step: 0 }]),\n ]),\n collapsed: [...o.collapsed].filter(keep),\n })\n const sub = (keep: (pid: string) => boolean): DestructibleSpec => {\n const s: DestructibleSpec = { parts: o.spec.parts.filter((p) => keep(p.id)), joints: (o.spec.joints ?? []).filter((j) => keep(j.a) && keep(j.b)) }\n if (o.spec.name !== undefined) s.name = o.spec.name\n if (o.spec.tags) s.tags = [...o.spec.tags]\n return clone(s)\n }\n const inNew = (pid: string) => moved.has(pid)\n const inOld = (pid: string) => !moved.has(pid)\n const pos = o.st.position, rot = o.st.rotation\n const fresh = build(sub(inNew), nid, pos, rot, carryFor(inNew, (a, b) => inNew(a) && inNew(b)))\n const rest = build(sub(inOld), id, pos, rot, carryFor(inOld, (a, b) => !(inNew(a) && inNew(b))))\n objects.set(id, rest)\n objects.set(nid, fresh)\n return nid\n },\n hit(objectId, h) {\n const im = impls.get(objectId)\n if (im) return whole(() => implHit(im, h))\n const o = getObj(objectId)\n return whole(() => doHit(o, h))\n },\n hitPart(objectId, partId, h) {\n const im = impls.get(objectId)\n if (im) return whole(() => implHit(im, h))\n const o = getObj(objectId)\n const p = getPart(o, partId)\n return whole(() => doHit(o, h, p))\n },\n explode(point, energy, radius, source) {\n return withCollapses(run(() => blastWorld(point, energy, radius, source)))\n },\n raycast(origin, direction, maxDistance = Infinity) {\n const r = raycastInternal(origin, direction, maxDistance)\n return r ? { object: r.object, part: r.part, point: r.point, normal: r.normal, distance: r.distance } : null\n },\n shoot(origin, direction, energy, caliber, source) {\n return withCollapses(run(() => {\n const results: HitResult[] = []\n const d = vec.normalize(direction)\n const ignore = new Set<string>()\n let org = origin\n let E = energy\n for (let i = 0; i < 4 && E > 0; i++) {\n const rh = raycastInternal(org, d, Infinity, ignore)\n if (!rh) break\n const im = impls.get(rh.object)\n if (im) {\n const r = implHit(im, { type: 'ballistic', point: rh.point, direction: d, energy: E, caliber, ...(source !== undefined ? { source } : {}) })\n r.part = rh.part\n r.point = rh.point\n r.exitEnergy = r.penetrated ? E * 0.5 : 0\n results.push(r)\n ignore.add(`${im.impl.id}\\0${rh.part}`)\n if (!r.penetrated) break\n org = vec.madd(rh.point, d, Math.min(rh.pathLen, 0.05) + 0.001)\n E = r.exitEnergy\n continue\n }\n const o = getObj(rh.object)\n const p = getPart(o, rh.part)\n const start = cur.length\n const out = ballistic(o, p, rh.point, rh.normal, d, E, caliber, rh.pathLen, source)\n results.push({ object: o.id, part: p.spec.id, point: rh.point, damage: out.damage, penetrated: out.penetrated, exitEnergy: out.exitEnergy, events: cur.slice(start) })\n ignore.add(`${o.id}\\0${p.spec.id}`)\n if (!out.penetrated || !out.exitPoint) break\n org = vec.madd(out.exitPoint, d, 0.001)\n E = out.exitEnergy\n }\n return results\n }))\n },\n disassemble(objectId, jointId, tool: ToolKind, dt) {\n const im = impls.get(objectId)\n if (im) return im.impl.disassemble ? im.impl.disassemble(jointId, tool, dt) : -1\n const o = getObj(objectId)\n const j = o.jointMap.get(jointId)\n if (!j || !j.spec.tools.includes(tool)) return -1\n if (j.st.open) return 1\n return run(() => {\n j.st.progress = Math.min(1, j.st.progress + (j.spec.seconds > 0 ? dt / j.spec.seconds : 1))\n if (j.st.progress >= 1 - 1e-9) j.st.progress = 1\n const step = Math.floor(j.st.progress * 10 + 1e-9)\n if (step > j.step || j.st.progress >= 1) {\n j.step = step\n emit({ ...base(o), type: 'disassemble_progress', joint: j.spec.id, tool, progress: j.st.progress })\n }\n if (j.st.progress >= 1) {\n j.st.open = true\n j.st.openedBy = 'tool'\n solveStructure(o)\n recomputeGroups(o)\n detachEvents(o, [j], 'tool')\n collapseCheck(o)\n }\n return j.st.progress\n }).value\n },\n workableJoints(objectId, tool) {\n const im = impls.get(objectId)\n if (im) {\n const spec = im.impl.describe()\n return im.impl.state().joints.filter((js) => {\n const j = (spec.joints ?? []).find((x) => (x.id ?? `${x.a}~${x.b}`) === js.id)\n return !js.open && !!j && (j.tools ?? JOINT_DEFAULTS[j.kind].tools).includes(tool)\n })\n }\n return getObj(objectId).joints.filter((j) => !j.st.open && j.spec.tools.includes(tool)).map((j) => j.st)\n },\n nearestJoint(objectId, point, maxDistance = 0.3, tool) {\n const im = impls.get(objectId)\n // Candidates: closed joints with their world position and whether `tool` can undo them.\n const cands: { st: JointState; d: number; ok: boolean }[] = []\n if (im) {\n const spec = im.impl.describe()\n for (const js of im.impl.state().joints) {\n if (js.open) continue\n const pos = implJointPos(im, js.a, js.b)\n const j = (spec.joints ?? []).find((x) => (x.id ?? `${x.a}~${x.b}`) === js.id)\n cands.push({ st: js, d: pos ? vec.distance(pos, point) : Infinity, ok: !!j && (j.tools ?? JOINT_DEFAULTS[j.kind].tools).includes(tool as ToolKind) })\n }\n } else {\n const o = getObj(objectId)\n for (const j of o.joints) {\n if (j.st.open) continue\n cands.push({ st: j.st, d: vec.distance(jointWorld(o, j), point), ok: tool ? j.spec.tools.includes(tool) : true })\n }\n }\n const pick = (only: boolean): JointState | null => {\n let best: JointState | null = null\n let bd = maxDistance\n for (const c of cands) {\n if (only && !c.ok) continue\n if (c.d <= bd) {\n bd = c.d\n best = c.st\n }\n }\n return best\n }\n return (tool ? pick(true) : null) ?? pick(false)\n },\n extinguish(objectId, partId, coolC = 200) {\n const im = impls.get(objectId)\n if (im) {\n run(() => im.impl.extinguish?.(partId))\n return\n }\n const o = getObj(objectId)\n run(() => {\n for (const p of partId ? [getPart(o, partId)] : o.parts) {\n if (isLost(p)) continue\n if (p.st.burning) {\n p.st.burning = false\n p.rt.jet = false\n emit({ ...base(o), type: 'extinguish', part: p.spec.id })\n }\n p.st.temperature = Math.max(ambient, p.st.temperature - coolC)\n }\n o.active = true\n })\n },\n setLiters(objectId, partId, liters) {\n if (impls.has(objectId)) return\n const p = getPart(getObj(objectId), partId)\n if (!p.spec.contains) return\n p.st.liters = clamp(liters, 0, p.spec.contains.liters)\n getObj(objectId).active = true\n },\n update(dt) {\n if (!(dt > 0)) return []\n return run(() => {\n time += dt\n const sources: Array<{ o: ObjRT; p: PartRT; flame: number }> = []\n for (const o of [...objects.values()]) if (o.active) stepObject(o, dt, sources)\n if (sources.length) spread(sources, dt)\n for (const im of [...impls.values()]) {\n if (!im.impl.update) continue\n for (const e of im.impl.update(dt) ?? []) emit(e.time === undefined ? { ...e, time } : e)\n }\n }).events\n },\n state: (id) => objects.get(id)?.st ?? impls.get(id)?.impl.state() ?? null,\n snapshot: (id) => {\n const st = objects.get(id)?.st ?? impls.get(id)?.impl.state()\n return st ? clone(st) : null\n },\n part: (id, partId) => objects.get(id)?.byId.get(partId)?.st ?? impls.get(id)?.impl.state().parts.find((p) => p.id === partId) ?? null,\n reset(id) {\n const im = impls.get(id)\n if (im) {\n im.impl.reset?.()\n return\n }\n const o = getObj(id)\n objects.set(id, build(o.spec, id, o.st.position, o.st.rotation))\n },\n on(type: DestructionEventType | '*', fn) {\n let set = listeners.get(type)\n if (!set) listeners.set(type, (set = new Set()))\n set.add(fn)\n return () => {\n set!.delete(fn)\n }\n },\n serialize(): DestructionSnapshot {\n return {\n version: 1,\n time,\n rng: rng.state(),\n counter,\n objects: [...objects.values()].map((o) => {\n const runtime: ObjectRuntime = { parts: {}, joints: {}, collapsed: [...o.collapsed] }\n for (const p of o.parts) runtime.parts[p.spec.id] = { ...p.rt }\n for (const j of o.joints) runtime.joints[j.spec.id] = j.step\n return { id: o.id, spec: clone(o.spec), state: clone(o.st), runtime }\n }),\n ...(impls.size\n ? { impls: [...impls.values()].map((im) => ({ id: im.impl.id, position: [...im.position] as Vec3, rotation: [...im.rotation] as Quat, data: im.impl.serialize?.() })) }\n : {}),\n }\n },\n load(snap) {\n if (snap.version !== 1) throw new Error(`unsupported snapshot version ${String(snap.version)}`)\n objects.clear()\n time = snap.time\n rng.set(snap.rng)\n counter = snap.counter ?? 0\n for (const e of snap.objects) {\n const state = clone(e.state)\n const carry: Carry = {\n parts: new Map(\n state.parts.map((st) => [st.id, { st, rt: e.runtime?.parts[st.id] ? { ...e.runtime.parts[st.id] } : { ...freshRuntime(), prevTemp: st.temperature } }]),\n ),\n joints: new Map(state.joints.map((st) => [st.id, { st, step: e.runtime?.joints[st.id] ?? 0 }])),\n collapsed: e.runtime?.collapsed,\n }\n objects.set(e.id, build(clone(e.spec), e.id, state.position, state.rotation, carry))\n }\n for (const e of snap.impls ?? []) {\n const im = impls.get(e.id)\n if (!im) continue\n im.position = [e.position[0], e.position[1], e.position[2]]\n im.rotation = [e.rotation[0], e.rotation[1], e.rotation[2], e.rotation[3]]\n if (e.data !== undefined) im.impl.load?.(e.data)\n }\n },\n }\n return world\n}\n","import type { DestructibleSpec, JointSpec, MaterialId, PartSpec } from './types'\n\nexport interface FrameOptions {\n /** Total length along x between the outer column centres, metres (default 8). */\n spanX?: number\n /** Total length along z (default 8). */\n spanZ?: number\n /** Columns along x (at least 2, default 3). */\n columnsX?: number\n /** Columns along z (at least 2, default 3). */\n columnsZ?: number\n /** Height of one floor from slab top to the underside of the next slab, metres (default 3). */\n height?: number\n /** Number of floors (default 1). */\n floors?: number\n /** Brick walls on every perimeter bay of every floor; the first bay of the ground floor on the -z side gets a door opening (default false). */\n walls?: boolean\n /** A thin roof slab resting on the top beams (default true); without it the top floor is open. */\n roof?: boolean\n columnSize?: number\n beamHeight?: number\n slabThickness?: number\n wallThickness?: number\n doorWidth?: number\n doorHeight?: number\n /** Material of foundations, columns, beams, slabs and roof (default `concrete`). */\n material?: MaterialId\n wallMaterial?: MaterialId\n /** Override the load capacity of every column, kg (see `PartState.load`). */\n columnCapacity?: number\n}\n\n/**\n * A parametric test structure: a grid of columns on foundations, beams between the column tops, one slab per floor (the last one a roof), and\n * optional brick walls with a door. Joints are explicit and directional: columns rest on foundations (or on the slab below) with `rebar`, beams on\n * columns, slabs on beams, the roof rests on the top beams, walls hang on their columns with `mortar`. Part ids: `foundation_i_j`, `column_f_i_j`,\n * `beam_x_f_i_j`, `beam_z_f_i_j`, `slab_f`, `roof`, `wall_*`, `door`. Ground is y = 0 (the top of the foundations).\n */\nexport const buildFrame = (o: FrameOptions = {}): DestructibleSpec => {\n const spanX = o.spanX ?? 8, spanZ = o.spanZ ?? 8\n const nx = Math.max(2, o.columnsX ?? 3), nz = Math.max(2, o.columnsZ ?? 3)\n const H = o.height ?? 3, floors = Math.max(1, o.floors ?? 1)\n const cs = o.columnSize ?? 0.3, bh = o.beamHeight ?? 0.3, bw = 0.2, T = o.slabThickness ?? 0.2, wt = o.wallThickness ?? 0.2\n const dw = o.doorWidth ?? 1, dh = o.doorHeight ?? 2.1\n const mat = o.material ?? 'concrete', wmat = o.wallMaterial ?? 'brick'\n const roof = o.roof ?? true\n const xs = Array.from({ length: nx }, (_, i) => -spanX / 2 + (i * spanX) / (nx - 1))\n const zs = Array.from({ length: nz }, (_, j) => -spanZ / 2 + (j * spanZ) / (nz - 1))\n const parts: PartSpec[] = []\n const joints: JointSpec[] = []\n const on = (a: string, b: string, kind: JointSpec['kind']) => joints.push({ id: `${a}~${b}`, a, b, kind, bears: 'a_on_b' })\n\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < nz; j++) {\n parts.push({\n id: `foundation_${i}_${j}`, material: mat, shape: { kind: 'box', size: [cs * 2.2, 0.3, cs * 2.2] }, position: [xs[i], -0.15, zs[j]],\n structure: { role: 'foundation' }, anchored: true,\n })\n }\n }\n for (let f = 0; f < floors; f++) {\n const yb = f * (H + T)\n const top = yb + H\n const last = f === floors - 1\n const slabId = last && roof ? 'roof' : `slab_${f}`\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < nz; j++) {\n const id = `column_${f}_${i}_${j}`\n parts.push({\n id, material: mat, shape: { kind: 'box', size: [cs, H, cs] }, position: [xs[i], yb + H / 2, zs[j]],\n structure: o.columnCapacity === undefined ? { role: 'column' } : { role: 'column', capacity: o.columnCapacity },\n })\n on(id, f === 0 ? `foundation_${i}_${j}` : `slab_${f - 1}`, 'rebar')\n }\n }\n const beams: string[] = []\n const beam = (id: string, size: [number, number, number], pos: [number, number, number], c1: string, c2: string) => {\n parts.push({ id, material: mat, shape: { kind: 'box', size }, position: pos, structure: { role: 'beam' } })\n on(id, c1, 'rebar')\n on(id, c2, 'rebar')\n beams.push(id)\n }\n for (let j = 0; j < nz; j++) {\n for (let i = 0; i < nx - 1; i++) {\n beam(`beam_x_${f}_${i}_${j}`, [xs[i + 1] - xs[i] - cs, bh, bw], [(xs[i] + xs[i + 1]) / 2, top - bh / 2, zs[j]], `column_${f}_${i}_${j}`, `column_${f}_${i + 1}_${j}`)\n }\n }\n for (let i = 0; i < nx; i++) {\n for (let j = 0; j < nz - 1; j++) {\n beam(`beam_z_${f}_${i}_${j}`, [bw, bh, zs[j + 1] - zs[j] - cs], [xs[i], top - bh / 2, (zs[j] + zs[j + 1]) / 2], `column_${f}_${i}_${j}`, `column_${f}_${i}_${j + 1}`)\n }\n }\n const thick = last && roof ? T * 0.75 : T\n parts.push({\n id: slabId, material: mat, shape: { kind: 'box', size: [spanX + cs + 0.2, thick, spanZ + cs + 0.2] }, position: [0, top + thick / 2, 0],\n structure: { role: last && roof ? 'roof' : 'slab' },\n })\n for (const b of beams) on(slabId, b, last && roof ? 'resting' : 'rebar')\n\n if (o.walls) {\n const wh = H - bh\n const wy = yb + wh / 2\n const wall = (id: string, size: [number, number, number], pos: [number, number, number], supports: string[]) => {\n parts.push({ id, material: wmat, shape: { kind: 'box', size }, position: pos, structure: { role: 'wall' } })\n for (const s of supports) on(id, s, 'mortar')\n }\n for (const j of [0, nz - 1]) {\n for (let i = 0; i < nx - 1; i++) {\n const c1 = `column_${f}_${i}_${j}`, c2 = `column_${f}_${i + 1}_${j}`\n const avail = xs[i + 1] - xs[i] - cs\n if (f === 0 && j === 0 && i === 0 && avail > dw + 0.4) {\n const side = (avail - dw) / 2\n const lx = xs[i] + cs / 2 + side / 2, rx = xs[i + 1] - cs / 2 - side / 2\n wall(`wall_door_left`, [side, wh, wt], [lx, wy, zs[j]], [c1])\n wall(`wall_door_right`, [side, wh, wt], [rx, wy, zs[j]], [c2])\n const lh = wh - dh\n wall(`wall_door_lintel`, [dw, lh, wt], [xs[i] + cs / 2 + side + dw / 2, yb + dh + lh / 2, zs[j]], ['wall_door_left', 'wall_door_right'])\n parts.push({ id: 'door', material: 'wood_hard', shape: { kind: 'box', size: [dw - 0.04, dh, 0.05] }, position: [xs[i] + cs / 2 + side + dw / 2, yb + dh / 2, zs[j]], tags: ['door'] })\n joints.push({ id: 'door~wall_door_left', a: 'door', b: 'wall_door_left', kind: 'hinge', bears: false })\n } else wall(`wall_x_${f}_${i}_${j}`, [avail, wh, wt], [(xs[i] + xs[i + 1]) / 2, wy, zs[j]], [c1, c2])\n }\n }\n for (const i of [0, nx - 1]) {\n for (let j = 0; j < nz - 1; j++) {\n wall(`wall_z_${f}_${i}_${j}`, [wt, wh, zs[j + 1] - zs[j] - cs], [xs[i], wy, (zs[j] + zs[j + 1]) / 2], [`column_${f}_${i}_${j}`, `column_${f}_${i}_${j + 1}`])\n }\n }\n }\n }\n return { name: 'frame', parts, joints, tags: ['structure'] }\n}\n","import type { DamageType, DestructionEventType, FractureStyle, JointKind, PartStatus, StructureRole, ToolKind } from './types'\n\n/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type DestructionLocale = 'en' | 'pt-BR'\n\nexport interface DestructionStrings {\n /** Display name per material id (see `MATERIALS`). Unknown ids are not listed. */\n materialNames: Record<string, string>\n partStatus: Record<PartStatus, string>\n jointKinds: Record<JointKind, string>\n toolKinds: Record<ToolKind, string>\n damageTypes: Record<DamageType, string>\n /** Short label per event type, for logs and kill-feed style text. */\n eventLabels: Record<DestructionEventType, string>\n fractureStyles: Record<FractureStyle, string>\n structureRoles: Record<StructureRole, string>\n}\n\nexport const locales: Record<DestructionLocale, DestructionStrings> = {\n en: {\n materialNames: {\n steel: 'steel', cast_iron: 'cast iron', aluminium: 'aluminium', copper: 'copper', wood_soft: 'softwood', wood_hard: 'hardwood', plywood: 'plywood',\n mdf: 'MDF', glass: 'glass', tempered_glass: 'tempered glass', ceramic: 'ceramic', concrete: 'concrete', brick: 'brick', plaster: 'plaster',\n stone: 'stone', plastic: 'plastic', rubber: 'rubber', fabric: 'fabric', foam: 'foam', leather: 'leather', paper: 'paper', foliage: 'foliage',\n green_wood: 'green wood', cactus: 'cactus', flesh_fruit: 'fruit', wax: 'wax', soil: 'soil',\n },\n partStatus: { intact: 'intact', damaged: 'damaged', broken: 'broken', melted: 'melted', ashes: 'ashes' },\n jointKinds: {\n screw: 'screw', bolt: 'nut and bolt', nail: 'nail', weld: 'weld', glue: 'glue', hinge: 'hinge', clip: 'clip', tie: 'tie', mortar: 'mortar',\n fused: 'fused', stem: 'stem', rebar: 'rebar', resting: 'resting',\n },\n toolKinds: {\n hand: 'hand', screwdriver: 'screwdriver', wrench: 'wrench', pry_bar: 'pry bar', saw: 'saw', cutting_torch: 'cutting torch', knife: 'knife', hammer: 'hammer',\n },\n damageTypes: { ballistic: 'ballistic', blunt: 'blunt', slash: 'slash', explosive: 'explosive', fire: 'fire', heat: 'heat' },\n eventLabels: {\n damage: 'damage', dent: 'dent', hole: 'hole', crack: 'crack', ricochet: 'ricochet', debris: 'debris', fracture: 'broke', detach: 'came loose',\n disassemble_progress: 'taking apart', ignite: 'caught fire', extinguish: 'put out', burnout: 'burned to ash', melt: 'melting', drip: 'dripping',\n leak: 'leak', explode: 'exploded', stress: 'overload', collapse: 'collapsed', destroyed: 'destroyed',\n },\n fractureStyles: { shatter: 'shatter', crumble: 'crumble', splinter: 'splinter', tear: 'tear', snap: 'snap', none: 'none' },\n structureRoles: { foundation: 'foundation', column: 'column', beam: 'beam', slab: 'slab', wall: 'wall', partition: 'partition', roof: 'roof', stair: 'stairs', none: 'none' },\n },\n 'pt-BR': {\n materialNames: {\n steel: 'aço', cast_iron: 'ferro fundido', aluminium: 'alumínio', copper: 'cobre', wood_soft: 'madeira macia', wood_hard: 'madeira de lei',\n plywood: 'compensado', mdf: 'MDF', glass: 'vidro', tempered_glass: 'vidro temperado', ceramic: 'cerâmica', concrete: 'concreto', brick: 'tijolo',\n plaster: 'gesso', stone: 'pedra', plastic: 'plástico', rubber: 'borracha', fabric: 'tecido', foam: 'espuma', leather: 'couro', paper: 'papel',\n foliage: 'folhagem', green_wood: 'madeira verde', cactus: 'cacto', flesh_fruit: 'fruta', wax: 'cera', soil: 'terra',\n },\n partStatus: { intact: 'intacto', damaged: 'danificado', broken: 'quebrado', melted: 'derretido', ashes: 'cinzas' },\n jointKinds: {\n screw: 'parafuso', bolt: 'porca e parafuso', nail: 'prego', weld: 'solda', glue: 'cola', hinge: 'dobradiça', clip: 'encaixe', tie: 'amarração',\n mortar: 'argamassa', fused: 'fundido', stem: 'caule', rebar: 'vergalhão', resting: 'apoiado',\n },\n toolKinds: {\n hand: 'mão', screwdriver: 'chave de fenda', wrench: 'chave inglesa', pry_bar: 'pé de cabra', saw: 'serra', cutting_torch: 'maçarico', knife: 'faca', hammer: 'martelo',\n },\n damageTypes: { ballistic: 'tiro', blunt: 'impacto', slash: 'corte', explosive: 'explosão', fire: 'fogo', heat: 'calor' },\n eventLabels: {\n damage: 'dano', dent: 'amassado', hole: 'furo', crack: 'trinca', ricochet: 'ricochete', debris: 'estilhaços', fracture: 'quebrou', detach: 'soltou',\n disassemble_progress: 'desmontando', ignite: 'pegou fogo', extinguish: 'apagou', burnout: 'virou cinza', melt: 'derretendo', drip: 'pingando',\n leak: 'vazamento', explode: 'explodiu', stress: 'sobrecarga', collapse: 'desabou', destroyed: 'destruído',\n },\n fractureStyles: { shatter: 'estilhaçar', crumble: 'esfarelar', splinter: 'lascar', tear: 'rasgar', snap: 'partir', none: 'nenhuma' },\n structureRoles: { foundation: 'fundação', column: 'pilar', beam: 'viga', slab: 'laje', wall: 'parede', partition: 'divisória', roof: 'telhado', stair: 'escada', none: 'nenhum' },\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): DestructionStrings => locales[(locale as DestructionLocale) ?? 'en'] ?? locales.en\n","import { checkDestructible as check } from '@adatechnology/game-contracts'\nimport type { CheckOptions as ContractCheckOptions, DestructibleImpl } from '@adatechnology/game-contracts'\nimport { MATERIALS } from './materials'\n\n// The contract itself lives in @adatechnology/game-contracts (a module depends only on that); re-exported here so that no import breaks.\nexport { IMPACT_CONTRACT, checkHit } from '@adatechnology/game-contracts'\nexport type { DestructibleImpl, ImpactContract } from '@adatechnology/game-contracts'\n\nexport interface CheckOptions {\n /** Ids of custom materials the impl uses besides the built-in `MATERIALS`. */\n materials?: string[]\n}\n\n/**\n * `checkDestructible` of `@adatechnology/game-contracts`, with the built-in `MATERIALS` (plus `options.materials`) as the known material ids.\n * It hits the impl (and calls `reset()` afterwards when there is one).\n */\nexport const checkDestructible = (impl: DestructibleImpl, options: CheckOptions = {}): { ok: boolean; problems: string[] } => {\n const contractOptions: ContractCheckOptions = { materials: [...MATERIALS.map((m) => m.id), ...(options.materials ?? [])] }\n return check(impl, contractOptions)\n}\n","import type { Vec3 } from '@adatechnology/game-destruction'\n\n/** Small deterministic PRNG (mulberry32): returns a function giving numbers in [0, 1). */\nexport function createRng(seed: number): () => number {\n let a = seed >>> 0\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\n/** Hash of a few numbers into an unsigned 32-bit seed. */\nexport function hashNumbers(...values: number[]): number {\n let h = 2166136261\n for (const v of values) {\n const n = Math.round(v * 1000) | 0\n h = Math.imul(h ^ n, 16777619)\n h ^= h >>> 13\n }\n return h >>> 0\n}\n\nexport function hashString(s: string): number {\n let h = 2166136261\n for (let i = 0; i < s.length; i++) h = Math.imul(h ^ s.charCodeAt(i), 16777619)\n return h >>> 0\n}\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport function vec3Length(v: Vec3): number {\n return Math.hypot(v[0], v[1], v[2])\n}\n\nexport function normalize3(v: Vec3): Vec3 {\n const l = Math.hypot(v[0], v[1], v[2])\n return l > 1e-9 ? [v[0] / l, v[1] / l, v[2] / l] : [0, 1, 0]\n}\n\n/** `0xRRGGBB` -> `[r, g, b]` in 0..1. */\nexport function hexToRgb(hex: number): [number, number, number] {\n return [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n}\n\nexport function mixHex(a: number, b: number, t: number): number {\n const ar = (a >> 16) & 255\n const ag = (a >> 8) & 255\n const ab = a & 255\n const r = Math.round(ar + (((b >> 16) & 255) - ar) * t)\n const g = Math.round(ag + (((b >> 8) & 255) - ag) * t)\n const bl = Math.round(ab + ((b & 255) - ab) * t)\n return (r << 16) | (g << 8) | bl\n}\n","import type * as THREE_NS from 'three'\nimport type { Fragment } from '@adatechnology/game-destruction'\nimport { clamp, createRng, hashString } from './math'\n\ninterface Live {\n mesh: THREE_NS.Mesh\n home: string\n vel: THREE_NS.Vector3\n ang: THREE_NS.Vector3\n half: THREE_NS.Vector3\n baseScale: THREE_NS.Vector3\n still: number\n asleep: boolean\n /** Seconds at rest. */\n rest: number\n /** 1 while alive; counts down to 0 while shrinking away. */\n fade: number\n dying: boolean\n}\n\nexport interface FragmentSystemOptions {\n scene: THREE_NS.Scene\n groundAt: (x: number, z: number) => number\n gravity: number\n max: number\n life: number\n}\n\n/** Light physics for fracture debris: gravity, ground bounce and friction, spin damping, settling flat, sleep, shrink-away and removal. */\nexport class FragmentSystem {\n private readonly list: Live[] = []\n private readonly box: THREE_NS.BoxGeometry\n private shardGeos: THREE_NS.BufferGeometry[] = []\n private readonly materials = new Map<string, THREE_NS.Material>()\n private readonly q: THREE_NS.Quaternion\n private readonly dq: THREE_NS.Quaternion\n private readonly m: THREE_NS.Matrix4\n private readonly v: THREE_NS.Vector3\n private readonly w: THREE_NS.Vector3\n private readonly rng = createRng(0x51ed270b)\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly o: FragmentSystemOptions,\n ) {\n this.box = new THREE.BoxGeometry(1, 1, 1)\n this.q = new THREE.Quaternion()\n this.dq = new THREE.Quaternion()\n this.m = new THREE.Matrix4()\n this.v = new THREE.Vector3()\n this.w = new THREE.Vector3()\n }\n\n get count(): number {\n return this.list.length\n }\n\n /** Meshes of every live fragment (tests and picking). */\n meshes(): THREE_NS.Mesh[] {\n return this.list.map((f) => f.mesh)\n }\n\n /** One shared material per source material id + colour (+ transparency). */\n materialFor(materialId: string, color: number, transparent: boolean, opacity = 0.5): THREE_NS.Material {\n const key = `${materialId}:${color}:${transparent ? 1 : 0}`\n let m = this.materials.get(key)\n if (!m) {\n m = transparent\n ? new this.THREE.MeshStandardMaterial({ color, roughness: 0.15, metalness: 0.1, transparent: true, opacity, side: this.THREE.DoubleSide, depthWrite: false })\n : new this.THREE.MeshLambertMaterial({ color })\n this.materials.set(key, m)\n }\n return m\n }\n\n private shardGeometry(seed: number): THREE_NS.BufferGeometry {\n const idx = seed % 6\n let g = this.shardGeos[idx]\n if (!g) {\n const r = createRng(1000 + idx)\n const n = 3 + Math.floor(r() * 3) // triangle, quad or pentagon, irregular\n const shape = new this.THREE.Shape()\n const pts: Array<[number, number]> = []\n for (let i = 0; i < n; i++) {\n const a = (i / n) * Math.PI * 2 + (r() - 0.5) * 0.7\n const rad = 0.35 + r() * 0.15\n pts.push([Math.cos(a) * rad, Math.sin(a) * rad])\n }\n shape.moveTo(pts[0][0], pts[0][1])\n for (let i = 1; i < n; i++) shape.lineTo(pts[i][0], pts[i][1])\n shape.closePath()\n g = new this.THREE.ExtrudeGeometry(shape, { depth: 1, bevelEnabled: false })\n g.translate(0, 0, -0.5)\n this.shardGeos[idx] = g\n }\n return g\n }\n\n /** Create the mesh of a fragment and start its motion. `maxAllowed` is the live budget. */\n spawn(f: Fragment, material: THREE_NS.Material, home: string, maxAllowed: number): void {\n const geo = f.shape === 'shard' ? this.shardGeometry(hashString(f.id)) : this.box\n const mesh = new this.THREE.Mesh(geo, material)\n mesh.position.set(f.center[0], f.center[1], f.center[2])\n mesh.quaternion.set(f.rotation[0], f.rotation[1], f.rotation[2], f.rotation[3]).normalize()\n const sz = f.size\n const sc = new this.THREE.Vector3(Math.max(0.005, sz[0]), Math.max(0.005, sz[1]), Math.max(0.003, sz[2]))\n mesh.scale.copy(sc)\n mesh.castShadow = true\n this.o.scene.add(mesh)\n const live: Live = {\n mesh,\n home,\n vel: new this.THREE.Vector3(f.velocity[0], f.velocity[1], f.velocity[2]),\n ang: new this.THREE.Vector3(f.angularVelocity[0], f.angularVelocity[1], f.angularVelocity[2]),\n // shards are thin: the contact extent uses the real (small) thickness, the chunk uses half of each side\n half: sc.clone().multiplyScalar(0.5),\n baseScale: sc,\n still: 0,\n asleep: false,\n rest: 0,\n fade: 1,\n dying: false,\n }\n this.list.push(live)\n let alive = this.list.reduce((n, l) => n + (l.dying ? 0 : 1), 0)\n for (let i = 0; i < this.list.length && alive > maxAllowed; i++) {\n if (!this.list[i].dying) {\n this.list[i].dying = true\n alive--\n }\n }\n }\n\n /** Add velocity to every fragment within `radius` of a point (blasts). */\n blast(point: [number, number, number], radius: number, speed: number): void {\n for (const f of this.list) {\n const d = this.v.copy(f.mesh.position).sub(this.w.set(point[0], point[1], point[2]))\n const dist = d.length()\n if (dist > radius || f.dying) continue\n const k = (1 - dist / radius) ** 2 * speed\n d.normalize().multiplyScalar(k)\n d.y += k * 0.4\n f.vel.add(d)\n f.ang.add(this.w.set(this.rng() - 0.5, this.rng() - 0.5, this.rng() - 0.5).multiplyScalar(k))\n f.asleep = false\n f.rest = 0\n }\n }\n\n update(dt: number): void {\n const g = this.o.gravity\n for (let i = this.list.length - 1; i >= 0; i--) {\n const f = this.list[i]\n if (f.dying) {\n f.fade -= dt / 0.6\n if (f.fade <= 0) {\n this.o.scene.remove(f.mesh)\n this.list.splice(i, 1)\n continue\n }\n f.mesh.scale.copy(f.baseScale).multiplyScalar(f.fade)\n }\n if (f.asleep) {\n f.rest += dt\n if (this.o.life > 0 && f.rest > this.o.life) f.dying = true\n continue\n }\n this.step(f, dt, g)\n }\n }\n\n private step(f: Live, dt: number, g: number): void {\n const mesh = f.mesh\n f.vel.y -= g * dt\n mesh.position.addScaledVector(f.vel, dt)\n const w = f.ang.length()\n if (w > 1e-5) {\n this.dq.setFromAxisAngle(this.v.copy(f.ang).multiplyScalar(1 / w), w * dt)\n mesh.quaternion.premultiply(this.dq).normalize()\n }\n // ground contact: lowest point of the oriented box\n this.m.makeRotationFromQuaternion(mesh.quaternion)\n const e = this.m.elements\n const h = f.half\n const sc = f.dying ? f.fade : 1\n const ext = (Math.abs(e[1]) * h.x + Math.abs(e[5]) * h.y + Math.abs(e[9]) * h.z) * sc\n const gy = this.o.groundAt(mesh.position.x, mesh.position.z)\n let contact = false\n if (mesh.position.y - ext < gy) {\n contact = true\n mesh.position.y = gy + ext\n if (f.vel.y < -0.6) {\n f.vel.y = -f.vel.y * 0.25\n f.vel.x *= 0.7\n f.vel.z *= 0.7\n f.ang.multiplyScalar(0.55)\n // a hit on a corner makes it tumble a little\n f.ang.x += (this.rng() - 0.5) * 2\n f.ang.z += (this.rng() - 0.5) * 2\n } else {\n f.vel.y = 0\n const fr = Math.exp(-7 * dt)\n f.vel.x *= fr\n f.vel.z *= fr\n f.ang.multiplyScalar(Math.exp(-6 * dt))\n }\n } else {\n f.ang.multiplyScalar(Math.exp(-0.15 * dt))\n }\n if (contact && f.vel.lengthSq() < 4) this.settle(f, dt)\n const slow = f.vel.lengthSq() < 0.012 && f.ang.lengthSq() < 0.2\n if (contact && slow) {\n f.still += dt\n if (f.still > 0.4) {\n f.asleep = true\n f.vel.set(0, 0, 0)\n f.ang.set(0, 0, 0)\n }\n } else {\n f.still = 0\n }\n }\n\n /** Tip the fragment towards lying on its flattest face. */\n private settle(f: Live, dt: number): void {\n const mesh = f.mesh\n this.m.makeRotationFromQuaternion(mesh.quaternion)\n const e = this.m.elements\n const up = [e[1], e[5], e[9]] // world-y component of each local axis\n const half = [f.half.x, f.half.y, f.half.z]\n let small = 0\n for (let i = 1; i < 3; i++) if (half[i] < half[small]) small = i\n let axis = small\n if (Math.abs(up[small]) < 0.35) {\n axis = 0\n for (let i = 1; i < 3; i++) if (Math.abs(up[i]) > Math.abs(up[axis])) axis = i\n }\n const sign = up[axis] >= 0 ? 1 : -1\n this.v.set(e[axis * 4], e[axis * 4 + 1], e[axis * 4 + 2]).multiplyScalar(sign)\n this.w.set(0, 1, 0)\n this.dq.setFromUnitVectors(this.v, this.w)\n this.q.copy(this.dq).multiply(mesh.quaternion)\n mesh.quaternion.slerp(this.q, clamp(dt * 7, 0, 1))\n }\n\n /** Remove the fragments of one object (after `restore`). */\n removeHome(home: string): void {\n for (let i = this.list.length - 1; i >= 0; i--) {\n if (this.list[i].home === home) {\n this.o.scene.remove(this.list[i].mesh)\n this.list.splice(i, 1)\n }\n }\n }\n\n clear(): void {\n for (const f of this.list) this.o.scene.remove(f.mesh)\n this.list.length = 0\n }\n\n dispose(): void {\n this.clear()\n this.box.dispose()\n for (const g of this.shardGeos) g?.dispose()\n this.shardGeos = []\n for (const m of this.materials.values()) m.dispose()\n this.materials.clear()\n }\n}\n","import type * as THREE_NS from 'three'\nimport { lerp } from './math'\n\ninterface Spot {\n mesh: THREE_NS.Mesh\n kind: 'puddle' | 'ash'\n home: string\n x: number\n z: number\n radius: number\n target: number\n}\n\nconst MAX_RADIUS = 1.2\n\n/** Flat discs on the ground: puddles of melted material and piles of ash. Nearby ones merge; the oldest go when the cap is reached. */\nexport class GroundSpots {\n private readonly spots: Spot[] = []\n private readonly geometry: THREE_NS.CircleGeometry\n private readonly materials = new Map<string, THREE_NS.MeshBasicMaterial>()\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly scene: THREE_NS.Scene,\n private readonly groundAt: (x: number, z: number) => number,\n private readonly cap: number,\n ) {\n this.geometry = new THREE.CircleGeometry(1, 20)\n this.geometry.rotateX(-Math.PI / 2)\n }\n\n get count(): number {\n return this.spots.length\n }\n\n private material(kind: 'puddle' | 'ash', color: number): THREE_NS.MeshBasicMaterial {\n const key = `${kind}:${color}`\n let m = this.materials.get(key)\n if (!m) {\n m = new this.THREE.MeshBasicMaterial({\n color,\n transparent: true,\n opacity: kind === 'puddle' ? 0.88 : 0.95,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n this.materials.set(key, m)\n }\n return m\n }\n\n /** Add (or grow) a spot at (x, z). `radius` is the radius this addition contributes. */\n add(kind: 'puddle' | 'ash', x: number, z: number, radius: number, color: number, home: string): void {\n for (const s of this.spots) {\n if (s.kind !== kind) continue\n const d = Math.hypot(s.x - x, s.z - z)\n if (d < Math.max(s.target, radius) * 0.9) {\n s.target = Math.min(MAX_RADIUS, Math.sqrt(s.target * s.target + radius * radius * 0.5))\n return\n }\n }\n while (this.spots.length >= this.cap) this.remove(this.spots[0])\n const mesh = new this.THREE.Mesh(this.geometry, this.material(kind, color))\n const y = this.groundAt(x, z) + 0.004 + (this.spots.length % 8) * 0.0004\n mesh.position.set(x, y, z)\n mesh.scale.setScalar(0.001)\n mesh.renderOrder = 1\n this.scene.add(mesh)\n this.spots.push({ mesh, kind, home, x, z, radius: 0.001, target: Math.min(MAX_RADIUS, radius) })\n }\n\n private remove(s: Spot): void {\n const i = this.spots.indexOf(s)\n if (i >= 0) this.spots.splice(i, 1)\n this.scene.remove(s.mesh)\n }\n\n update(dt: number): void {\n const k = Math.min(1, dt * 3)\n for (const s of this.spots) {\n if (Math.abs(s.radius - s.target) < 1e-4) continue\n s.radius = lerp(s.radius, s.target, k)\n s.mesh.scale.setScalar(s.radius)\n }\n }\n\n /** Remove the spots made for one object (after its `restore`). */\n removeHome(home: string): void {\n for (const s of [...this.spots]) if (s.home === home) this.remove(s)\n }\n\n clear(): void {\n for (const s of [...this.spots]) this.remove(s)\n }\n\n dispose(): void {\n this.clear()\n this.geometry.dispose()\n for (const m of this.materials.values()) m.dispose()\n this.materials.clear()\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { DebrisKind, Vec3 } from '@adatechnology/game-destruction'\nimport { clamp, createRng, hexToRgb, lerp } from './math'\n\n/** Every particle kind the renderer can emit. */\nexport type ParticleKind = DebrisKind | 'fire' | 'flash' | 'foam'\n\ninterface KindDef {\n additive: boolean\n /** Life range in seconds. */\n life: [number, number]\n /** Start size range in metres (billboard diameter). */\n size: [number, number]\n /** Size multiplier reached at the end of the life. */\n grow: number\n /** Gravity multiplier (1 = full gravity). */\n gravity: number\n /** Constant upward acceleration in m/s² (heat, steam). */\n rise: number\n /** Velocity damping per second. */\n drag: number\n c0: number\n c1: number\n alpha: number\n /** Fraction of the life spent fading in. */\n fadeIn: number\n /** How much of the emission direction follows the surface normal (1) versus a random direction (0). */\n cone: number\n /** What happens at ground height. */\n ground: 'none' | 'bounce' | 'stop' | 'land'\n flutter?: number\n flicker?: number\n}\n\nconst KINDS: Record<ParticleKind, KindDef> = {\n fire: { additive: true, life: [0.45, 0.9], size: [0.1, 0.2], grow: 0.3, gravity: 0, rise: 2.4, drag: 1.2, c0: 0xffc040, c1: 0xc02000, alpha: 0.9, fadeIn: 0.12, cone: 0.7, ground: 'none', flicker: 0.35 },\n smoke: { additive: false, life: [1.8, 3.2], size: [0.14, 0.24], grow: 3.2, gravity: 0, rise: 0.7, drag: 0.8, c0: 0x666666, c1: 0x9a9a9a, alpha: 0.35, fadeIn: 0.15, cone: 0.6, ground: 'none' },\n sparks: { additive: true, life: [0.25, 0.6], size: [0.018, 0.03], grow: 0.5, gravity: 1, rise: 0, drag: 0.3, c0: 0xfff2a0, c1: 0xff6a10, alpha: 1, fadeIn: 0.02, cone: 0.55, ground: 'bounce' },\n dust: { additive: false, life: [1, 2], size: [0.08, 0.14], grow: 2.5, gravity: 0.05, rise: 0, drag: 2.5, c0: 0x8d8579, c1: 0x8d8579, alpha: 0.4, fadeIn: 0.1, cone: 0.4, ground: 'none' },\n shards: { additive: true, life: [0.8, 1.4], size: [0.02, 0.035], grow: 0.8, gravity: 1, rise: 0, drag: 0.2, c0: 0xdff4ff, c1: 0x9fd0ff, alpha: 0.9, fadeIn: 0.03, cone: 0.5, ground: 'bounce', flicker: 0.5 },\n splinters: { additive: false, life: [0.8, 1.5], size: [0.02, 0.035], grow: 1, gravity: 1, rise: 0, drag: 0.3, c0: 0xa0764a, c1: 0x7a5530, alpha: 1, fadeIn: 0.02, cone: 0.5, ground: 'bounce' },\n chips: { additive: false, life: [0.8, 1.5], size: [0.025, 0.04], grow: 1, gravity: 1, rise: 0, drag: 0.3, c0: 0x8a8378, c1: 0x6e685f, alpha: 1, fadeIn: 0.02, cone: 0.5, ground: 'bounce' },\n fibers: { additive: false, life: [1.5, 2.5], size: [0.02, 0.03], grow: 1, gravity: 0.15, rise: 0, drag: 2, c0: 0xb8a888, c1: 0xb8a888, alpha: 0.9, fadeIn: 0.05, cone: 0.4, ground: 'stop', flutter: 2.5 },\n leaves: { additive: false, life: [1.5, 2.8], size: [0.03, 0.05], grow: 1, gravity: 0.15, rise: 0, drag: 2, c0: 0x5b9a3c, c1: 0x4a7f30, alpha: 0.95, fadeIn: 0.05, cone: 0.4, ground: 'stop', flutter: 2.8 },\n drips: { additive: false, life: [2, 3], size: [0.025, 0.035], grow: 1, gravity: 1, rise: 0, drag: 0, c0: 0x6a6a6a, c1: 0x6a6a6a, alpha: 1, fadeIn: 0.01, cone: 0.2, ground: 'land' },\n ash: { additive: false, life: [2, 4], size: [0.02, 0.04], grow: 1.2, gravity: 0.08, rise: 0, drag: 1.5, c0: 0x2a2623, c1: 0x1a1816, alpha: 0.8, fadeIn: 0.1, cone: 0.5, ground: 'stop', flutter: 0.6 },\n steam: { additive: false, life: [1, 2], size: [0.12, 0.2], grow: 3, gravity: 0, rise: 0.9, drag: 1, c0: 0xffffff, c1: 0xe0e8ee, alpha: 0.35, fadeIn: 0.15, cone: 0.6, ground: 'none' },\n flash: { additive: true, life: [0.12, 0.2], size: [1.2, 1.8], grow: 1.6, gravity: 0, rise: 0, drag: 0, c0: 0xfff3c0, c1: 0xff9030, alpha: 1, fadeIn: 0.1, cone: 0, ground: 'none' },\n foam: { additive: false, life: [1, 1.8], size: [0.06, 0.1], grow: 1.5, gravity: 0.6, rise: 0, drag: 1.5, c0: 0xf4f8ff, c1: 0xdde6f0, alpha: 0.8, fadeIn: 0.05, cone: 0.5, ground: 'stop' },\n}\n\nconst KIND_IDS = Object.keys(KINDS) as ParticleKind[]\nconst KIND_INDEX: Record<string, number> = {}\nKIND_IDS.forEach((k, i) => (KIND_INDEX[k] = i))\nconst KIND_LIST: KindDef[] = KIND_IDS.map((k) => KINDS[k])\n\n/** Per-spawn overrides. */\nexport interface SpawnOptions {\n /** `0xRRGGBB`: replaces the kind's colour ramp. */\n color?: number\n /** Multiplier on the start size. */\n size?: number\n /** Multiplier on the life. */\n life?: number\n /** Multiplier on the peak alpha. */\n alpha?: number\n /** Non-zero: a `drips` particle that reaches the ground calls `onLand` with this tag. */\n tag?: number\n}\n\nconst VERT = `\nuniform float uScale;\nattribute float size;\nattribute float alpha;\nattribute vec3 pcolor;\nvarying float vAlpha;\nvarying vec3 vColor;\nvoid main() {\n vAlpha = alpha;\n vColor = pcolor;\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_PointSize = min(size * uScale / max(0.1, -mv.z), 256.0);\n gl_Position = projectionMatrix * mv;\n}`\n\nconst FRAG = `\nvarying float vAlpha;\nvarying vec3 vColor;\nvoid main() {\n float d = length(gl_PointCoord - vec2(0.5)) * 2.0;\n float a = (1.0 - smoothstep(0.35, 1.0, d)) * vAlpha;\n if (a < 0.004) discard;\n gl_FragColor = vec4(vColor, a);\n}`\n\ninterface PoolHost {\n groundAt: (x: number, z: number) => number\n gravity: number\n onLand: (x: number, y: number, z: number, color: number, tag: number) => void\n}\n\n/** One fixed-size ring buffer of particles drawn as a single `THREE.Points` with a soft round sprite computed in the shader. */\nclass Pool {\n readonly points: THREE_NS.Points\n readonly geometry: THREE_NS.BufferGeometry\n readonly material: THREE_NS.ShaderMaterial\n live = 0\n private next = 0\n private high = 0\n private readonly pos: Float32Array\n private readonly col: Float32Array\n private readonly alp: Float32Array\n private readonly siz: Float32Array\n private readonly vel: Float32Array\n private readonly age: Float32Array\n private readonly life: Float32Array\n private readonly size0: Float32Array\n private readonly alive: Uint8Array\n private readonly kind: Uint8Array\n private readonly seed: Float32Array\n private readonly alphaMul: Float32Array\n private readonly tag: Int32Array\n private readonly colorHex: Int32Array\n private readonly bounced: Uint8Array\n\n constructor(\n THREE: typeof THREE_NS,\n readonly capacity: number,\n additive: boolean,\n pointScale: number,\n ) {\n const n = Math.max(1, capacity)\n this.pos = new Float32Array(n * 3)\n this.col = new Float32Array(n * 3)\n this.alp = new Float32Array(n)\n this.siz = new Float32Array(n)\n this.vel = new Float32Array(n * 3)\n this.age = new Float32Array(n)\n this.life = new Float32Array(n)\n this.size0 = new Float32Array(n)\n this.alive = new Uint8Array(n)\n this.kind = new Uint8Array(n)\n this.seed = new Float32Array(n)\n this.alphaMul = new Float32Array(n)\n this.tag = new Int32Array(n)\n this.colorHex = new Int32Array(n)\n this.bounced = new Uint8Array(n)\n this.geometry = new THREE.BufferGeometry()\n const attr = (a: Float32Array, size: number) => {\n const at = new THREE.BufferAttribute(a, size)\n at.setUsage(THREE.DynamicDrawUsage)\n return at\n }\n this.geometry.setAttribute('position', attr(this.pos, 3))\n this.geometry.setAttribute('pcolor', attr(this.col, 3))\n this.geometry.setAttribute('alpha', attr(this.alp, 1))\n this.geometry.setAttribute('size', attr(this.siz, 1))\n this.geometry.setDrawRange(0, 0)\n this.material = new THREE.ShaderMaterial({\n uniforms: { uScale: { value: pointScale } },\n vertexShader: VERT,\n fragmentShader: FRAG,\n transparent: true,\n depthWrite: false,\n blending: additive ? THREE.AdditiveBlending : THREE.NormalBlending,\n })\n this.points = new THREE.Points(this.geometry, this.material)\n this.points.frustumCulled = false\n this.points.name = additive ? 'destruction-particles-additive' : 'destruction-particles'\n this.points.renderOrder = additive ? 11 : 10\n }\n\n spawn(kind: number, x: number, y: number, z: number, vx: number, vy: number, vz: number, def: KindDef, rnd: () => number, o?: SpawnOptions): void {\n if (this.capacity <= 0) return\n const i = this.next\n this.next = (this.next + 1) % this.capacity\n if (this.alive[i]) this.live--\n this.alive[i] = 1\n this.live++\n if (i + 1 > this.high) this.high = i + 1\n this.kind[i] = kind\n this.pos[i * 3] = x\n this.pos[i * 3 + 1] = y\n this.pos[i * 3 + 2] = z\n this.vel[i * 3] = vx\n this.vel[i * 3 + 1] = vy\n this.vel[i * 3 + 2] = vz\n this.age[i] = 0\n this.life[i] = lerp(def.life[0], def.life[1], rnd()) * (o?.life ?? 1)\n this.size0[i] = lerp(def.size[0], def.size[1], rnd()) * (o?.size ?? 1)\n this.seed[i] = rnd()\n this.alphaMul[i] = o?.alpha ?? 1\n this.tag[i] = o?.tag ?? 0\n this.colorHex[i] = o?.color ?? -1\n this.bounced[i] = 0\n this.siz[i] = this.size0[i]\n this.alp[i] = 0\n }\n\n private kill(i: number): void {\n if (!this.alive[i]) return\n this.alive[i] = 0\n this.live--\n this.alp[i] = 0\n this.siz[i] = 0\n }\n\n clear(): void {\n this.alive.fill(0)\n this.alp.fill(0)\n this.siz.fill(0)\n this.live = 0\n this.high = 0\n this.next = 0\n this.geometry.setDrawRange(0, 0)\n }\n\n /** Move a live particle (used by external pushes such as blasts). */\n push(cx: number, cy: number, cz: number, radius: number, speed: number): void {\n for (let i = 0; i < this.high; i++) {\n if (!this.alive[i]) continue\n const dx = this.pos[i * 3] - cx\n const dy = this.pos[i * 3 + 1] - cy\n const dz = this.pos[i * 3 + 2] - cz\n const d = Math.hypot(dx, dy, dz)\n if (d > radius || d < 1e-4) continue\n const f = (1 - d / radius) * speed\n this.vel[i * 3] += (dx / d) * f\n this.vel[i * 3 + 1] += (dy / d) * f\n this.vel[i * 3 + 2] += (dz / d) * f\n }\n }\n\n update(dt: number, host: PoolHost): void {\n let top = 0\n for (let i = 0; i < this.high; i++) {\n if (!this.alive[i]) continue\n const def = KIND_LIST[this.kind[i]]\n const age = (this.age[i] += dt)\n const life = this.life[i]\n if (age >= life) {\n this.kill(i)\n continue\n }\n const t = age / life\n const i3 = i * 3\n let vx = this.vel[i3]\n let vy = this.vel[i3 + 1]\n let vz = this.vel[i3 + 2]\n vy += (def.rise - def.gravity * host.gravity) * dt\n if (def.flutter) {\n const ph = age * 7 + this.seed[i] * 40\n vx += Math.sin(ph) * def.flutter * dt\n vz += Math.cos(ph * 1.3) * def.flutter * dt\n }\n if (def.drag > 0) {\n const k = Math.exp(-def.drag * dt)\n vx *= k\n vy *= k\n vz *= k\n }\n const x = this.pos[i3] + vx * dt\n let y = this.pos[i3 + 1] + vy * dt\n const z = this.pos[i3 + 2] + vz * dt\n if (def.ground !== 'none') {\n const gy = host.groundAt(x, z) + 0.005\n if (y < gy) {\n if (def.ground === 'land') {\n const tag = this.tag[i]\n if (tag !== 0) host.onLand(x, gy, z, this.colorHex[i] >= 0 ? this.colorHex[i] : def.c0, tag)\n this.kill(i)\n continue\n }\n y = gy\n if (def.ground === 'bounce' && !this.bounced[i]) {\n this.bounced[i] = 1\n vy = Math.abs(vy) * 0.35\n vx *= 0.6\n vz *= 0.6\n } else {\n vx = vy = vz = 0\n }\n }\n }\n this.vel[i3] = vx\n this.vel[i3 + 1] = vy\n this.vel[i3 + 2] = vz\n this.pos[i3] = x\n this.pos[i3 + 1] = y\n this.pos[i3 + 2] = z\n this.siz[i] = this.size0[i] * lerp(1, def.grow, t)\n const c0 = this.colorHex[i] >= 0 ? this.colorHex[i] : def.c0\n const c1 = this.colorHex[i] >= 0 ? this.colorHex[i] : def.c1\n const a = hexToRgb(c0)\n const b = hexToRgb(c1)\n this.col[i3] = lerp(a[0], b[0], t)\n this.col[i3 + 1] = lerp(a[1], b[1], t)\n this.col[i3 + 2] = lerp(a[2], b[2], t)\n let env = t < def.fadeIn ? t / def.fadeIn : 1 - (t - def.fadeIn) / (1 - def.fadeIn)\n if (def.flicker) env *= 1 - def.flicker * (0.5 + 0.5 * Math.sin(age * 38 + this.seed[i] * 50))\n this.alp[i] = clamp(env, 0, 1) * def.alpha * this.alphaMul[i]\n top = i + 1\n }\n this.high = top\n this.geometry.setDrawRange(0, top)\n for (const name of ['position', 'pcolor', 'alpha', 'size']) {\n ;(this.geometry.getAttribute(name) as THREE_NS.BufferAttribute).needsUpdate = true\n }\n }\n\n dispose(): void {\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n\nexport interface ParticleSystemOptions {\n capacity: number\n scene: THREE_NS.Scene\n /** Count multiplier for bursts (0.6 on low quality). */\n density: number\n /** Pixels of point size per metre at a distance of one metre; roughly `viewportHeight / (2 * tan(fov / 2))`. */\n pointScale: number\n groundAt: (x: number, z: number) => number\n gravity: number\n onLand: (x: number, y: number, z: number, color: number, tag: number) => void\n}\n\n/**\n * Two pooled particle systems (additive and normal blending), each a single `THREE.Points` with fixed-size buffers used as a ring. The Points are\n * added to the scene on first use and removed again by `detach`, so an idle renderer leaves nothing in the scene.\n */\nexport class ParticleSystem {\n private readonly add: Pool\n private readonly normal: Pool\n private readonly rng = createRng(0x9e3779b1)\n private attached = false\n private readonly host: PoolHost\n\n constructor(\n THREE: typeof THREE_NS,\n private readonly o: ParticleSystemOptions,\n ) {\n const addCap = Math.floor(o.capacity * 0.4)\n this.add = new Pool(THREE, addCap, true, o.pointScale)\n this.normal = new Pool(THREE, o.capacity - addCap, false, o.pointScale)\n this.host = { groundAt: o.groundAt, gravity: o.gravity, onLand: o.onLand }\n }\n\n get capacity(): number {\n return this.add.capacity + this.normal.capacity\n }\n\n get live(): number {\n return this.add.live + this.normal.live\n }\n\n private ensureAttached(): void {\n if (this.attached) return\n this.attached = true\n this.o.scene.add(this.add.points, this.normal.points)\n }\n\n /** Remove the Points from the scene (they come back on the next emit). */\n detach(): void {\n if (!this.attached) return\n this.attached = false\n this.o.scene.remove(this.add.points, this.normal.points)\n }\n\n /** Spawn one particle with an explicit velocity. */\n spawn(kind: ParticleKind, p: Vec3, v: Vec3, opts?: SpawnOptions): void {\n const def = KINDS[kind]\n this.ensureAttached()\n ;(def.additive ? this.add : this.normal).spawn(KIND_INDEX[kind], p[0], p[1], p[2], v[0], v[1], v[2], def, this.rng, opts)\n }\n\n /** Spawn `count` particles leaving `point` around `normal` at about `speed` m/s. */\n burst(kind: ParticleKind, point: Vec3, normal: Vec3, count: number, speed = 1, opts?: SpawnOptions): void {\n const def = KINDS[kind]\n const n = Math.max(0, Math.round(count * this.o.density))\n const rnd = this.rng\n const nl = Math.hypot(normal[0], normal[1], normal[2]) || 1\n const nx = normal[0] / nl\n const ny = normal[1] / nl\n const nz = normal[2] / nl\n for (let k = 0; k < n; k++) {\n // random unit vector\n const u = rnd() * 2 - 1\n const ph = rnd() * Math.PI * 2\n const s = Math.sqrt(1 - u * u)\n const rx = s * Math.cos(ph)\n const ry = u\n const rz = s * Math.sin(ph)\n let dx = nx * def.cone + rx * (1 - def.cone)\n let dy = ny * def.cone + ry * (1 - def.cone)\n let dz = nz * def.cone + rz * (1 - def.cone)\n // a little scatter even for a pure cone, and never push into the surface for debris\n dx += rx * 0.35\n dy += ry * 0.35\n dz += rz * 0.35\n const l = Math.hypot(dx, dy, dz) || 1\n const sp = speed * (0.35 + 0.65 * rnd())\n const jitter = 0.01 + (def.size[1] > 0.5 ? 0.15 : 0.02)\n this.spawn(\n kind,\n [point[0] + (rnd() - 0.5) * jitter, point[1] + (rnd() - 0.5) * jitter, point[2] + (rnd() - 0.5) * jitter],\n [(dx / l) * sp, (dy / l) * sp, (dz / l) * sp],\n opts,\n )\n }\n }\n\n /** Blast wave: shove live particles away from a point. */\n push(point: Vec3, radius: number, speed: number): void {\n this.add.push(point[0], point[1], point[2], radius, speed)\n this.normal.push(point[0], point[1], point[2], radius, speed)\n }\n\n update(dt: number): void {\n if (this.add.live > 0 || this.add.points.geometry.drawRange.count > 0) this.add.update(dt, this.host)\n if (this.normal.live > 0 || this.normal.points.geometry.drawRange.count > 0) this.normal.update(dt, this.host)\n }\n\n clear(): void {\n this.add.clear()\n this.normal.clear()\n this.detach()\n }\n\n dispose(): void {\n this.detach()\n this.add.dispose()\n this.normal.dispose()\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { Vec3 } from '@adatechnology/game-destruction'\nimport type { PieceBody } from './internal'\nimport { clamp } from './math'\n\nexport interface PieceSystemOptions {\n groundAt: (x: number, z: number) => number\n gravity: number\n /** A piece hit the ground faster than 3 m/s (throttled per piece). */\n onHardLanding: (piece: PieceBody, point: Vec3, speed: number) => void\n /** Notified when a piece is about to be removed. */\n scene: THREE_NS.Scene\n}\n\nconst SUB_DT = 1 / 120\nconst MU = 0.7\nconst SLEEP_AFTER = 0.5\nconst HARD_LANDING = 3\n/** Contact tolerance in metres: corners this close to the ground count as touching, which keeps the contact set (and a resting box) stable. */\nconst SLOP = 0.002\n/** A resting support narrower than this fraction of the centre-of-mass height is a balancing act, not a rest: the piece topples. */\nconst NARROW = 0.3\n/** Angular acceleration (rad/s^2 per metre of height) that pushes a balancing piece off its edge, toward the side its centre of mass leans to. */\nconst TOPPLE = 3\n\n/**\n * Light rigid-body physics for loose pieces: gravity, the 8 corners of the local box against the ground with an impulse (restitution, friction,\n * angular response), damping, sleeping, and a gentle horizontal separation between pieces. Not a general solver: no piece-vs-scenery contact.\n */\nexport class PieceSystem {\n readonly list: PieceBody[] = []\n private time = 0\n private readonly p: THREE_NS.Vector3\n private readonly q: THREE_NS.Quaternion\n private readonly dq: THREE_NS.Quaternion\n private readonly m: THREE_NS.Matrix4\n private readonly ax: THREE_NS.Vector3\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly o: PieceSystemOptions,\n ) {\n this.p = new THREE.Vector3()\n this.q = new THREE.Quaternion()\n this.dq = new THREE.Quaternion()\n this.m = new THREE.Matrix4()\n this.ax = new THREE.Vector3()\n }\n\n get(objectId: string): PieceBody | null {\n return this.list.find((b) => b.objectId === objectId) ?? null\n }\n\n create(objectId: string, root: THREE_NS.Object3D, halfExtents: Vec3, localCenter: THREE_NS.Vector3, mass: number, velocity?: Vec3, angular?: Vec3): PieceBody {\n const existing = this.get(objectId)\n if (existing) {\n existing.root = root\n existing.halfExtents = halfExtents\n existing.mass = mass\n this.setCenter(existing, localCenter)\n if (velocity) existing.velocity = [...velocity]\n existing.sleeping = false\n return existing\n }\n const body: PieceBody = {\n objectId,\n root,\n velocity: velocity ? [...velocity] : [0, 0, 0],\n angularVelocity: angular ? [...angular] : [0, 0, 0],\n halfExtents: [Math.max(0.01, halfExtents[0]), Math.max(0.01, halfExtents[1]), Math.max(0.01, halfExtents[2])],\n mass: Math.max(0.05, mass),\n sleeping: false,\n held: false,\n localCenter: [localCenter.x, localCenter.y, localCenter.z],\n centerV: localCenter.clone(),\n still: 0,\n lastHit: -1,\n onGround: false,\n }\n this.list.push(body)\n return body\n }\n\n /** Move the centre of mass (after a part broke off). */\n setCenter(b: PieceBody, c: THREE_NS.Vector3): void {\n b.centerV.copy(c)\n b.localCenter = [c.x, c.y, c.z]\n }\n\n remove(objectId: string): void {\n const i = this.list.findIndex((b) => b.objectId === objectId)\n if (i >= 0) this.list.splice(i, 1)\n }\n\n clear(): void {\n this.list.length = 0\n }\n\n /** World position of the centre of mass. */\n centerOf(b: PieceBody, out: THREE_NS.Vector3): THREE_NS.Vector3 {\n return out.copy(b.centerV).applyQuaternion(b.root.quaternion).add(b.root.position)\n }\n\n impulse(b: PieceBody, impulse: Vec3, point?: Vec3): void {\n const inv = 1 / b.mass\n b.velocity[0] += impulse[0] * inv\n b.velocity[1] += impulse[1] * inv\n b.velocity[2] += impulse[2] * inv\n if (point) {\n const c = this.centerOf(b, this.p)\n const rx = point[0] - c.x\n const ry = point[1] - c.y\n const rz = point[2] - c.z\n // torque = r x J, angular velocity change = I^-1 torque\n const tx = ry * impulse[2] - rz * impulse[1]\n const ty = rz * impulse[0] - rx * impulse[2]\n const tz = rx * impulse[1] - ry * impulse[0]\n const w = this.mulInvInertia(b, tx, ty, tz)\n b.angularVelocity[0] += w[0]\n b.angularVelocity[1] += w[1]\n b.angularVelocity[2] += w[2]\n }\n b.sleeping = false\n b.still = 0\n }\n\n /** I^-1 * (x, y, z) in world space for a box with the body's half extents and mass (needs `this.m` to hold the body's rotation). */\n private mulInvInertia(b: PieceBody, x: number, y: number, z: number): Vec3 {\n this.m.makeRotationFromQuaternion(b.root.quaternion)\n return this.mulInvInertiaWith(b, this.m.elements, x, y, z)\n }\n\n private mulInvInertiaWith(b: PieceBody, e: ArrayLike<number>, x: number, y: number, z: number): Vec3 {\n const [hx, hy, hz] = b.halfExtents\n const k = 3 / b.mass\n const ix = k / (hy * hy + hz * hz)\n const iy = k / (hx * hx + hz * hz)\n const iz = k / (hx * hx + hy * hy)\n // local = R^T v (columns of R are the local axes in world space)\n const lx = (e[0] * x + e[1] * y + e[2] * z) * ix\n const ly = (e[4] * x + e[5] * y + e[6] * z) * iy\n const lz = (e[8] * x + e[9] * y + e[10] * z) * iz\n return [e[0] * lx + e[4] * ly + e[8] * lz, e[1] * lx + e[5] * ly + e[9] * lz, e[2] * lx + e[6] * ly + e[10] * lz]\n }\n\n update(dt: number): void {\n this.time += dt\n for (const b of this.list) {\n if (b.held) {\n b.velocity = [0, 0, 0]\n b.angularVelocity = [0, 0, 0]\n b.sleeping = false\n b.still = 0\n continue\n }\n if (b.sleeping) continue\n this.integrate(b, dt)\n }\n this.separate(dt)\n }\n\n private integrate(b: PieceBody, dt: number): void {\n const c = this.centerOf(b, this.p)\n const pos: Vec3 = [c.x, c.y, c.z]\n const q = this.q.copy(b.root.quaternion)\n const v = b.velocity\n const w = b.angularVelocity\n const [hx, hy, hz] = b.halfExtents\n const invM = 1 / b.mass\n const steps = clamp(Math.ceil(dt / SUB_DT), 1, 8)\n const h = dt / steps\n let landing = 0\n let landPoint: Vec3 = [pos[0], pos[1], pos[2]]\n let contactedLast = false\n let touched = false\n let unstable = false\n\n for (let s = 0; s < steps; s++) {\n v[1] -= this.o.gravity * h\n pos[0] += v[0] * h\n pos[1] += v[1] * h\n pos[2] += v[2] * h\n const wl = Math.hypot(w[0], w[1], w[2])\n if (wl > 1e-6) {\n this.dq.setFromAxisAngle(this.ax.set(w[0] / wl, w[1] / wl, w[2] / wl), wl * h)\n q.premultiply(this.dq).normalize()\n }\n const damp = Math.exp(-0.15 * h)\n w[0] *= damp\n w[1] *= damp\n w[2] *= damp\n\n this.m.makeRotationFromQuaternion(q)\n const e = this.m.elements\n const rs: Vec3[] = []\n let maxPen = 0\n for (let i = 0; i < 8; i++) {\n const sx = i & 1 ? hx : -hx\n const sy = i & 2 ? hy : -hy\n const sz = i & 4 ? hz : -hz\n const r: Vec3 = [e[0] * sx + e[4] * sy + e[8] * sz, e[1] * sx + e[5] * sy + e[9] * sz, e[2] * sx + e[6] * sy + e[10] * sz]\n const gy = this.o.groundAt(pos[0] + r[0], pos[2] + r[2])\n const pen = gy - (pos[1] + r[1])\n if (pen > -SLOP) {\n rs.push(r)\n if (pen > maxPen) maxPen = pen\n }\n }\n contactedLast = rs.length > 0\n if (contactedLast) touched = true\n if (!contactedLast) continue\n pos[1] += Math.max(0, maxPen - SLOP * 0.5)\n let impact = 0\n for (const r of rs) impact = Math.max(impact, -(v[1] + w[2] * r[0] - w[0] * r[2]))\n const restitution = impact > 2 ? 0.25 : 0\n if (impact > landing) {\n landing = impact\n let sx = 0\n let sz = 0\n for (const r of rs) {\n sx += r[0]\n sz += r[2]\n }\n const lx = pos[0] + sx / rs.length\n const lz = pos[2] + sz / rs.length\n landPoint = [lx, this.o.groundAt(lx, lz), lz]\n }\n for (let it = 0; it < 4; it++) {\n for (const r of rs) {\n // contact point velocity\n let vx = v[0] + (w[1] * r[2] - w[2] * r[1])\n let vy = v[1] + (w[2] * r[0] - w[0] * r[2])\n let vz = v[2] + (w[0] * r[1] - w[1] * r[0])\n const vn = vy\n if (vn >= 0) continue\n // normal impulse (n = +y): r x n = (-rz, 0, rx)\n const a = this.mulInvInertiaWith(b, e, -r[2], 0, r[0])\n const denom = invM + (a[2] * r[0] - a[0] * r[2])\n const j = (-(1 + (it === 0 ? restitution : 0)) * vn) / denom\n v[1] += j * invM\n const dw = this.mulInvInertiaWith(b, e, -r[2] * j, 0, r[0] * j)\n w[0] += dw[0]\n w[1] += dw[1]\n w[2] += dw[2]\n // friction in the contact plane\n vx = v[0] + (w[1] * r[2] - w[2] * r[1])\n vy = v[1] + (w[2] * r[0] - w[0] * r[2])\n vz = v[2] + (w[0] * r[1] - w[1] * r[0])\n const vt = Math.hypot(vx, vz)\n if (vt > 1e-5) {\n const tx = vx / vt\n const tz = vz / vt\n // r x t with t = (tx, 0, tz) = (0*tz - rz*0 ... ) -> (ry*tz, rz*tx - rx*tz, -ry*tx)\n const rx = r[1] * tz\n const ry = r[2] * tx - r[0] * tz\n const rz = -r[1] * tx\n const at = this.mulInvInertiaWith(b, e, rx, ry, rz)\n const cx = at[1] * r[2] - at[2] * r[1]\n const cz = at[0] * r[1] - at[1] * r[0]\n const denomT = invM + cx * tx + cz * tz\n const jt = Math.min(vt / denomT, MU * j)\n v[0] -= tx * jt * invM\n v[2] -= tz * jt * invM\n const dwt = this.mulInvInertiaWith(b, e, rx * jt, ry * jt, rz * jt)\n w[0] -= dwt[0]\n w[1] -= dwt[1]\n w[2] -= dwt[2]\n }\n }\n }\n // Support check. The corner contacts above are relative to the centre of mass, so they already give a torque when the centre of mass is\n // outside the support. What they cannot do is end a balancing act: a tall thin piece on its edge (or a single corner) is in equilibrium\n // with the centre of mass above a very small support, so it must not rest there. It gets a gentle topple push toward the side it leans\n // to (or toward the wider side when it leans nowhere), and it may not sleep.\n let x0 = Infinity, x1 = -Infinity, z0 = Infinity, z1 = -Infinity, low = 0\n for (const r of rs) {\n x0 = Math.min(x0, r[0]); x1 = Math.max(x1, r[0])\n z0 = Math.min(z0, r[2]); z1 = Math.max(z1, r[2])\n low = Math.min(low, r[1])\n }\n const height = -low\n const wx = x1 - x0\n const wz = z1 - z0\n unstable = Math.min(wx, wz) < NARROW * height || x0 > 0 || x1 < 0 || z0 > 0 || z1 < 0\n if (unstable) {\n // the support centre relative to the centre of mass: the piece falls away from it (toward +axis when it is centred)\n const dirX = x0 + x1 > 0 ? -1 : 1\n const dirZ = z0 + z1 > 0 ? -1 : 1\n const k = TOPPLE * Math.min(height, 1) * h\n // rotating about -z moves the top toward +x; rotating about +x moves it toward +z\n if (wx <= wz) w[2] -= dirX * k\n else w[0] += dirZ * k\n }\n // rolling / spinning resistance while touching the ground\n const rd = Math.exp((rs.length >= 3 ? -3 : -1.5) * h)\n w[0] *= rd\n w[1] *= rd\n w[2] *= rd\n const fd = Math.exp(-0.3 * h)\n v[0] *= fd\n v[2] *= fd\n }\n\n // write back\n b.root.quaternion.copy(q)\n const off = this.ax.copy(b.centerV).applyQuaternion(q)\n b.root.position.set(pos[0] - off.x, pos[1] - off.y, pos[2] - off.z)\n b.root.updateMatrixWorld(true)\n b.onGround = contactedLast\n\n if (landing > HARD_LANDING && this.time - b.lastHit > 0.15) {\n b.lastHit = this.time\n this.o.onHardLanding(b, landPoint, landing)\n }\n\n const still = touched && !unstable && Math.hypot(v[0], v[1], v[2]) < 0.12 && Math.hypot(w[0], w[1], w[2]) < 0.45\n if (still) {\n b.still += dt\n if (b.still >= SLEEP_AFTER) {\n b.sleeping = true\n v[0] = v[1] = v[2] = 0\n w[0] = w[1] = w[2] = 0\n }\n } else {\n b.still = 0\n }\n }\n\n /** Push overlapping pieces apart (horizontal bounding circles), gently, so they do not interpenetrate forever. */\n private separate(dt: number): void {\n const n = this.list.length\n if (n < 2) return\n const maxMove = 1.5 * dt\n const ca = new this.THREE.Vector3()\n const cb = new this.THREE.Vector3()\n for (let i = 0; i < n; i++) {\n const a = this.list[i]\n for (let j = i + 1; j < n; j++) {\n const b = this.list[j]\n if (a.held && b.held) continue\n if (a.sleeping && b.sleeping) continue\n const ra = Math.hypot(a.halfExtents[0], a.halfExtents[1], a.halfExtents[2])\n const rb = Math.hypot(b.halfExtents[0], b.halfExtents[1], b.halfExtents[2])\n this.centerOf(a, ca)\n this.centerOf(b, cb)\n if (Math.abs(ca.y - cb.y) > ra + rb) continue\n const rh = (Math.max(a.halfExtents[0], a.halfExtents[2]) + Math.max(b.halfExtents[0], b.halfExtents[2])) * 0.8\n let dx = cb.x - ca.x\n let dz = cb.z - ca.z\n let d = Math.hypot(dx, dz)\n if (d >= rh) continue\n if (d < 1e-5) {\n dx = 1\n dz = 0\n d = 1\n }\n const push = Math.min(maxMove, (rh - d) * 0.5)\n const wa = a.held ? 0 : b.held ? 1 : b.mass / (a.mass + b.mass)\n const wb = b.held ? 0 : a.held ? 1 : a.mass / (a.mass + b.mass)\n const ux = dx / (d || 1)\n const uz = dz / (d || 1)\n if (!a.held) {\n a.root.position.x -= ux * push * 2 * wa\n a.root.position.z -= uz * push * 2 * wa\n a.sleeping = false\n }\n if (!b.held) {\n b.root.position.x += ux * push * 2 * wb\n b.root.position.z += uz * push * 2 * wb\n b.sleeping = false\n }\n }\n }\n }\n}\n","import type * as THREE_NS from 'three'\nimport { guessMaterial, inferJoints } from '@adatechnology/game-destruction'\nimport type { JointKind, JointSpec, MaterialId, PartSpec } from '@adatechnology/game-destruction'\nimport type { Mesh, Object3D, SpecFromObjectOptions, SpecFromObjectResult, ThreeNamespace } from './types'\n\ninterface Entry {\n key: string\n meshes: Mesh[]\n box: THREE_NS.Box3\n material: MaterialId\n explicitId: string | null\n fill?: number\n hollow: boolean\n tags?: string[]\n /** Part id wished by the host (`userData.destructionPart`). */\n fixedId: boolean\n name: string\n /** `parent` / `kind` of an object-valued `destructionPart`: the part is attached to `parent` by a joint of that kind. */\n parent?: string\n jointKind?: JointKind\n}\n\n/** What `userData.destructionPart` says: a string (the part id) or an object `{ id, material?, parent?, kind? }`. */\nexport interface PartHint {\n id: string\n material?: string\n parent?: string\n kind?: string\n}\n\n/** Read `userData.destructionPart` (string or object with an `id`); null when it names no part. */\nexport function partHintOf(value: unknown): PartHint | null {\n if (typeof value === 'string') return value ? { id: value } : null\n if (!value || typeof value !== 'object') return null\n const v = value as Record<string, unknown>\n if (typeof v.id !== 'string' || !v.id) return null\n const str = (x: unknown): string | undefined => (typeof x === 'string' && x ? x : undefined)\n return { id: v.id, material: str(v.material), parent: str(v.parent), kind: str(v.kind) }\n}\n\nconst METAL = /steel|iron|metal|alumin|copper|brass|bronze|tin|titan|chrome|zinc|lead/i\n\nfunction sanitizeId(name: string): string {\n let id = name\n .trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n if (id && /^[0-9]/.test(id)) id = `p_${id}`\n return id\n}\n\nfunction isMesh(o: Object3D): o is Mesh {\n return (o as Mesh).isMesh === true\n}\n\nfunction sizeOf(box: THREE_NS.Box3): [number, number, number] {\n return [box.max.x - box.min.x, box.max.y - box.min.y, box.max.z - box.min.z]\n}\n\n/**\n * Build a `DestructibleSpec` from a three.js object: one part per mesh (meshes sharing `userData.destructionPart` become one part), each an\n * axis-aligned box in the root's space (rotation omitted), with the material taken from `options.materialOf`, `userData.destructionMaterial`\n * or a guess from the names. Tiny meshes are merged into the part they overlap most; joints are inferred from touching parts.\n *\n * Meshes that are invisible or have `userData.destructionIgnore` (or sit under such an object) are skipped. The result also tells which meshes\n * became which part, ready to be passed to `bind`.\n */\nexport function specFromObject3D(THREE: ThreeNamespace, root: Object3D, options: SpecFromObjectOptions = {}): SpecFromObjectResult {\n const fallback = options.fallback ?? 'plastic'\n const minSize = options.minSize ?? 0.015\n root.updateMatrixWorld(true)\n const inv = root.matrixWorld.clone().invert()\n\n // 1. collect meshes -> entries (grouped by an explicit part name)\n const entries: Entry[] = []\n const byKey = new Map<string, Entry>()\n const visit = (o: Object3D): void => {\n if (!o.visible || o.userData?.destructionIgnore) return\n if (isMesh(o) && o.geometry) {\n const geom = o.geometry\n if (!geom.boundingBox) geom.computeBoundingBox()\n if (geom.boundingBox && !geom.boundingBox.isEmpty()) {\n const box = geom.boundingBox.clone().applyMatrix4(new THREE.Matrix4().multiplyMatrices(inv, o.matrixWorld))\n const mats = Array.isArray(o.material) ? o.material : [o.material]\n const matName = mats[0]?.name ?? ''\n const ud = o.userData ?? {}\n const hint = partHintOf(ud.destructionPart)\n const material =\n options.materialOf?.(o) ??\n (typeof ud.destructionMaterial === 'string' ? (ud.destructionMaterial as string) : undefined) ??\n hint?.material ??\n guessMaterial(`${o.name} ${matName} ${typeof ud.material === 'string' ? ud.material : ''}`) ??\n fallback\n const explicit = hint?.id ?? null\n const hollow = ud.hollow === true || /hollow/i.test(o.name)\n const fill = options.fillOf?.(o, material)\n const tags = Array.isArray(ud.destructionTags) ? (ud.destructionTags as string[]) : undefined\n const existing = explicit ? byKey.get(explicit) : undefined\n if (existing) {\n const before = sizeOf(existing.box)\n const bv = before[0] * before[1] * before[2]\n const ns = sizeOf(box)\n existing.box.union(box)\n existing.meshes.push(o)\n if (ns[0] * ns[1] * ns[2] > bv) existing.material = material\n existing.hollow = existing.hollow || hollow\n if (fill !== undefined) existing.fill = fill\n } else {\n const e: Entry = { key: explicit ?? `m${entries.length}`, meshes: [o], box, material, explicitId: explicit, fill, hollow, tags, fixedId: !!explicit, name: o.name, parent: hint?.parent, jointKind: hint?.kind as JointKind | undefined }\n entries.push(e)\n if (explicit) byKey.set(explicit, e)\n }\n }\n }\n for (const c of o.children) visit(c)\n }\n visit(root)\n\n // 2. merge tiny meshes into the touching part they overlap most\n const eps = 0.005\n const overlapVolume = (a: THREE_NS.Box3, b: THREE_NS.Box3): number => {\n const x = Math.min(a.max.x, b.max.x) - Math.max(a.min.x, b.min.x) + eps\n const y = Math.min(a.max.y, b.max.y) - Math.max(a.min.y, b.min.y) + eps\n const z = Math.min(a.max.z, b.max.z) - Math.max(a.min.z, b.min.z) + eps\n return x > 0 && y > 0 && z > 0 ? x * y * z : 0\n }\n const largest = (e: Entry) => Math.max(...sizeOf(e.box))\n const kept: Entry[] = []\n const tiny: Entry[] = []\n for (const e of entries) (!e.fixedId && largest(e) < minSize ? tiny : kept).push(e)\n for (const t of tiny) {\n let best: Entry | null = null\n let bestV = 0\n for (const k of kept) {\n const v = overlapVolume(t.box, k.box)\n if (v > bestV) {\n bestV = v\n best = k\n }\n }\n if (!best) {\n // not touching anything: join the nearest part within a small distance\n let bd = 0.05\n for (const k of kept) {\n const d = k.box.distanceToPoint(t.box.getCenter(new THREE.Vector3()))\n if (d < bd) {\n bd = d\n best = k\n }\n }\n }\n if (best) {\n best.meshes.push(...t.meshes) // the box stays: a tiny mesh sits inside or on the surface of its part\n } else {\n kept.push(t) // isolated crumb: keep it as its own part\n }\n }\n\n // 3. ids, parts\n const used = new Set<string>()\n const parts: PartSpec[] = []\n const meshesOf: Record<string, Object3D[]> = {}\n let counter = 0\n for (const e of kept) {\n counter++\n let base = (e.explicitId ? sanitizeId(e.explicitId) : '') || sanitizeId(e.name) || `part_${counter}`\n let id = base\n for (let n = 2; used.has(id); n++) id = `${base}_${n}`\n used.add(id)\n base = id\n const size = sizeOf(e.box)\n const center = e.box.getCenter(new THREE.Vector3())\n const part: PartSpec = {\n id,\n material: e.material,\n shape: { kind: 'box', size: [Math.max(size[0], 0.002), Math.max(size[1], 0.002), Math.max(size[2], 0.002)] },\n position: [center.x, center.y, center.z],\n }\n const minSide = Math.min(...size)\n if (e.fill !== undefined) part.fill = e.fill\n else if (e.hollow) part.fill = 0.05\n if (minSide < 0.01 && METAL.test(e.material)) {\n part.fill = e.fill ?? 1\n part.thickness = Math.max(minSide, 0.0005)\n }\n if (e.tags) part.tags = [...e.tags]\n const ao = options.anchorBelow ?? -1\n if (ao >= 0 && e.box.min.y <= ao) part.anchored = true\n parts.push(part)\n meshesOf[id] = e.meshes\n }\n\n const spec: SpecFromObjectResult['spec'] = { parts }\n if (options.name !== undefined) spec.name = options.name\n else if (root.name) spec.name = root.name\n if (options.tags) spec.tags = [...options.tags]\n spec.joints = options.joints === false ? [] : inferJoints(parts)\n // explicit attachments from `destructionPart: { parent, kind }` win over the inferred joint between the same two parts\n if (options.joints !== false) {\n const finalId = new Map<Entry, string>()\n kept.forEach((e, i) => finalId.set(e, parts[i].id))\n const idOf = new Map<string, string>()\n for (const e of kept) if (e.explicitId) idOf.set(e.explicitId, finalId.get(e)!)\n const joints: JointSpec[] = spec.joints\n for (const e of kept) {\n if (!e.parent) continue\n const id = finalId.get(e)!\n const parent = idOf.get(e.parent) ?? (used.has(sanitizeId(e.parent)) ? sanitizeId(e.parent) : null)\n if (!parent || parent === id) continue\n const at = joints.findIndex((j) => (j.a === parent && j.b === id) || (j.a === id && j.b === parent))\n const kind = e.jointKind ?? (at >= 0 ? joints[at].kind : 'resting')\n const joint: JointSpec = { id: `${parent}~${id}`, a: parent, b: id, kind }\n if (at >= 0) joints[at] = joint\n else joints.push(joint)\n }\n }\n return { spec, parts: meshesOf }\n}\n","import { mixHex } from './math'\n\n/** Blackbody-ish stops: [temperature °C, colour]. Luminance grows with the temperature. */\nconst STOPS: Array<[number, number]> = [\n [450, 0x000000],\n [500, 0x2a0400],\n [650, 0x8a1500],\n [800, 0xd84a08],\n [950, 0xff8c14],\n [1100, 0xffc23a],\n [1250, 0xffe8a0],\n [1400, 0xffffff],\n]\n\n/**\n * Glow colour of a hot surface as `0xRRGGBB`: black (no glow) below about 450 °C, dark red around 500, orange around 800, yellow around 1100 and\n * white from 1400 °C. Brightness never decreases as the temperature rises. Use it as an emissive colour.\n */\nexport function heatColor(temperatureC: number): number {\n if (!(temperatureC > STOPS[0][0])) return 0\n const last = STOPS[STOPS.length - 1]\n if (temperatureC >= last[0]) return last[1]\n for (let i = 1; i < STOPS.length; i++) {\n const [t1, c1] = STOPS[i]\n if (temperatureC <= t1) {\n const [t0, c0] = STOPS[i - 1]\n return mixHex(c0, c1, (temperatureC - t0) / (t1 - t0))\n }\n }\n return last[1]\n}\n","import type * as THREE_NS from 'three'\nimport type { Dent } from '@adatechnology/game-destruction'\nimport { heatColor } from './heat'\nimport type { Decal, MeshVis, PartVis } from './internal'\nimport { clamp, createRng, lerp } from './math'\n\ntype Mesh = THREE_NS.Mesh\n\nconst POS_ATTR = 'position'\n\nfunction positionAttr(geo: THREE_NS.BufferGeometry): THREE_NS.BufferAttribute | null {\n const a = geo.getAttribute(POS_ATTR) as THREE_NS.BufferAttribute | THREE_NS.InterleavedBufferAttribute | undefined\n return a && !(a as THREE_NS.InterleavedBufferAttribute).isInterleavedBufferAttribute ? (a as THREE_NS.BufferAttribute) : null\n}\n\nfunction materialsOf(m: THREE_NS.Material | THREE_NS.Material[]): THREE_NS.Material[] {\n return Array.isArray(m) ? m : [m]\n}\n\nfunction colorOf(m: THREE_NS.Material): THREE_NS.Color | null {\n const c = (m as THREE_NS.MeshStandardMaterial).color\n return c && (c as THREE_NS.Color).isColor ? c : null\n}\n\n/** Shared resources for decals (one geometry, a few materials) created lazily and disposed together. */\nexport class DecalKit {\n private disc: THREE_NS.CircleGeometry | null = null\n private discMat: THREE_NS.MeshBasicMaterial | null = null\n private lineMats = new Map<number, THREE_NS.LineBasicMaterial>()\n constructor(private readonly THREE: typeof THREE_NS) {}\n\n discGeometry(): THREE_NS.CircleGeometry {\n return (this.disc ??= new this.THREE.CircleGeometry(1, 14))\n }\n\n discMaterial(): THREE_NS.MeshBasicMaterial {\n return (this.discMat ??= new this.THREE.MeshBasicMaterial({\n color: 0x050505,\n transparent: true,\n opacity: 0.92,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -4,\n polygonOffsetUnits: -4,\n }))\n }\n\n lineMaterial(color: number): THREE_NS.LineBasicMaterial {\n let m = this.lineMats.get(color)\n if (!m) {\n m = new this.THREE.LineBasicMaterial({ color, transparent: true, opacity: 0.9, depthWrite: false })\n this.lineMats.set(color, m)\n }\n return m\n }\n\n dispose(): void {\n this.disc?.dispose()\n this.discMat?.dispose()\n for (const m of this.lineMats.values()) m.dispose()\n this.disc = null\n this.discMat = null\n this.lineMats.clear()\n }\n}\n\nconst tmpV = (THREE: typeof THREE_NS) => new THREE.Vector3()\n\n/** Mesh-level visual changes: copy-on-write geometry and materials, dents, decals, char, glow, melt, hiding, restoring. */\nexport class Visuals {\n readonly kit: DecalKit\n private readonly a: THREE_NS.Vector3\n private readonly b: THREE_NS.Vector3\n private readonly m4: THREE_NS.Matrix4\n private readonly box: THREE_NS.Box3\n /** Total live decals across meshes (kept in sync by add/remove). */\n decalCount = 0\n\n constructor(\n private readonly THREE: typeof THREE_NS,\n private readonly lowQuality: boolean,\n private readonly decalCap: number,\n ) {\n this.kit = new DecalKit(THREE)\n this.a = tmpV(THREE)\n this.b = tmpV(THREE)\n this.m4 = new THREE.Matrix4()\n this.box = new THREE.Box3()\n }\n\n makeMeshVis(mesh: Mesh, home: string): MeshVis {\n return {\n mesh,\n home,\n origGeometry: mesh.geometry,\n origMaterial: mesh.material,\n origVisible: mesh.visible,\n origParent: mesh.parent,\n origPosition: mesh.position.clone(),\n origQuaternion: mesh.quaternion.clone(),\n origScale: mesh.scale.clone(),\n ownMat: false,\n ownGeo: false,\n work: null,\n baseColors: null,\n decals: [],\n meltApplied: 0,\n bottomY: 0,\n moved: false,\n }\n }\n\n vertexCount(mv: MeshVis): number {\n return mv.mesh.geometry.getAttribute(POS_ATTR)?.count ?? 0\n }\n\n private readonly tints = new WeakMap<THREE_NS.Mesh, THREE_NS.Color | null>()\n\n /**\n * Average vertex colour of a mesh whose material uses `vertexColors` (computed once per mesh, from its original geometry), else null. Fragments\n * and debris of such a mesh multiply it by `material.color`; without it they come out white.\n */\n vertexTint(mv: MeshVis): THREE_NS.Color | null {\n if (this.tints.has(mv.mesh)) return this.tints.get(mv.mesh) ?? null\n let tint: THREE_NS.Color | null = null\n const used = materialsOf(mv.origMaterial).some((m) => (m as THREE_NS.MeshStandardMaterial).vertexColors === true)\n const attr = used ? (mv.origGeometry.getAttribute('color') as THREE_NS.BufferAttribute | undefined) : undefined\n if (attr && attr.count > 0 && attr.itemSize >= 3) {\n let r = 0, g = 0, b = 0\n for (let i = 0; i < attr.count; i++) {\n r += attr.getX(i)\n g += attr.getY(i)\n b += attr.getZ(i)\n }\n tint = new this.THREE.Color(r / attr.count, g / attr.count, b / attr.count)\n }\n this.tints.set(mv.mesh, tint)\n return tint\n }\n\n /** Colour of the original material (before any char) times the vertex tint, `0xRRGGBB`, or -1. */\n baseColorHex(mv: MeshVis): number {\n const c = mv.baseColors?.[0] ?? colorOf(materialsOf(mv.origMaterial)[0])\n if (!c) return -1\n const tint = this.vertexTint(mv)\n return tint ? c.clone().multiply(tint).getHex() : c.getHex()\n }\n\n /** Is the original material transparent? */\n isTransparent(mv: MeshVis): boolean {\n return materialsOf(mv.origMaterial).some((m) => m.transparent && m.opacity < 1)\n }\n\n ownMaterial(mv: MeshVis): void {\n if (mv.ownMat) return\n mv.ownMat = true\n const src = materialsOf(mv.origMaterial)\n const cloned = src.map((m) => m.clone())\n mv.baseColors = src.map((m) => colorOf(m)?.clone() ?? new this.THREE.Color(0x888888))\n mv.mesh.material = Array.isArray(mv.origMaterial) ? cloned : cloned[0]\n }\n\n /** Clone the geometry (vertex edits); false when its positions cannot be edited. */\n ownGeometry(mv: MeshVis): boolean {\n if (mv.ownGeo) return true\n const pos = positionAttr(mv.mesh.geometry)\n if (!pos) return false\n mv.ownGeo = true\n const g = mv.mesh.geometry.clone()\n mv.mesh.geometry = g\n mv.work = new Float32Array((positionAttr(g) as THREE_NS.BufferAttribute).array as ArrayLike<number>)\n return true\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Dents\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /**\n * Push the vertices of the mesh within `dent.radius` of `worldPoint` inwards along `worldNormal` by `depth * (1 - (d/r)^2)^2`.\n * Returns false when nothing was changed (too far, low quality on a heavy mesh, or no editable positions).\n */\n applyDent(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, dent: Dent): boolean {\n const mesh = mv.mesh\n if (this.lowQuality && this.vertexCount(mv) > 20000) return false\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const lp = mesh.worldToLocal(this.a.copy(worldPoint))\n const ln = this.b.copy(worldNormal).transformDirection(this.m4.copy(mesh.matrixWorld).invert()).normalize()\n const r = dent.radius / s\n const depth = dent.depth / s\n // quick reject: the point must be near the mesh bounds\n const geo = mesh.geometry\n if (!geo.boundingBox) geo.computeBoundingBox()\n if (geo.boundingBox && geo.boundingBox.distanceToPoint(lp) > r) return false\n if (!this.ownGeometry(mv)) return false\n const work = mv.work as Float32Array\n const pos = positionAttr(mesh.geometry) as THREE_NS.BufferAttribute\n const r2 = r * r\n let touched = false\n const px = lp.x\n const py = lp.y\n const pz = lp.z\n const nx = ln.x\n const ny = ln.y\n const nz = ln.z\n for (let i = 0; i < work.length; i += 3) {\n const dx = work[i] - px\n const dy = work[i + 1] - py\n const dz = work[i + 2] - pz\n const d2 = dx * dx + dy * dy + dz * dz\n if (d2 >= r2) continue\n const f = 1 - d2 / r2\n const k = depth * f * f\n work[i] -= nx * k\n work[i + 1] -= ny * k\n work[i + 2] -= nz * k\n touched = true\n }\n if (!touched) return false\n this.writePositions(mv, pos)\n return true\n }\n\n /** Copy `work` (dents) into the geometry, adding the melt sag when the mesh is melting. */\n private writePositions(mv: MeshVis, pos: THREE_NS.BufferAttribute): void {\n const work = mv.work as Float32Array\n const arr = pos.array as unknown as Float32Array\n const melt = mv.meltApplied\n if (melt <= 0 || (this.lowQuality && work.length / 3 > 20000)) {\n arr.set(work)\n } else {\n const geo = mv.mesh.geometry\n if (!geo.boundingBox) geo.computeBoundingBox()\n const bb = geo.boundingBox as THREE_NS.Box3\n const h = Math.max(1e-4, bb.max.y - bb.min.y)\n const minY = bb.min.y\n for (let i = 0, v = 0; i < work.length; i += 3, v++) {\n const n = ((Math.imul(v + 1, 2654435761) >>> 0) % 1000) / 1000\n const n2 = ((Math.imul(v + 7, 40503) >>> 0) % 1000) / 1000\n const lowness = 1 - (work[i + 1] - minY) / h // 1 at the bottom, 0 at the top\n const spread = 1 + 0.12 * melt * (0.4 + n2) * (0.3 + lowness)\n arr[i] = work[i] * spread\n arr[i + 2] = work[i + 2] * spread\n arr[i + 1] = Math.max(minY, work[i + 1] - n * melt * h * 0.08)\n }\n }\n pos.needsUpdate = true\n const geo = mv.mesh.geometry\n geo.computeVertexNormals()\n geo.boundingBox = null\n geo.boundingSphere = null\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Decals\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Decal pose in mesh space: position and a rotation taking +Z to the surface normal. */\n private decalPose(mesh: Mesh, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, lift: number): { s: number; pos: THREE_NS.Vector3; quat: THREE_NS.Quaternion } {\n mesh.updateWorldMatrix(true, false)\n const s = mesh.matrixWorld.getMaxScaleOnAxis() || 1\n const ln = worldNormal.clone().transformDirection(this.m4.copy(mesh.matrixWorld).invert()).normalize()\n const pos = mesh.worldToLocal(worldPoint.clone()).addScaledVector(ln, lift / s)\n const quat = new this.THREE.Quaternion().setFromUnitVectors(new this.THREE.Vector3(0, 0, 1), ln)\n return { s, pos, quat }\n }\n\n private addDecal(mv: MeshVis, decal: Decal): void {\n mv.mesh.add(decal.obj)\n mv.decals.push(decal)\n this.decalCount++\n while (mv.decals.length > 48 || this.decalCount > this.decalCap) {\n const old = mv.decals.shift()\n if (!old) break\n this.disposeDecal(old)\n }\n }\n\n private disposeDecal(d: Decal): void {\n d.obj.parent?.remove(d.obj)\n d.geometry?.dispose()\n this.decalCount = Math.max(0, this.decalCount - 1)\n }\n\n addHole(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, diameter: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.0025)\n const disc = new this.THREE.Mesh(this.kit.discGeometry(), this.kit.discMaterial())\n disc.position.copy(pos)\n disc.quaternion.copy(quat)\n disc.scale.setScalar((Math.max(0.004, diameter) * 0.5 * 1.25) / s)\n disc.renderOrder = 2\n this.addDecal(mv, { obj: disc })\n }\n\n /** A star of jagged lines: `rays` rays up to `length` metres, seeded so the same event always draws the same star. */\n addCrack(mv: MeshVis, worldPoint: THREE_NS.Vector3, worldNormal: THREE_NS.Vector3, rays: number, length: number, color: number, seed: number): void {\n const { s, pos, quat } = this.decalPose(mv.mesh, worldPoint, worldNormal, 0.002)\n const rnd = createRng(seed)\n const verts: number[] = []\n const n = clamp(Math.round(rays), 3, 16)\n const L = Math.max(0.02, length) / s\n for (let r = 0; r < n; r++) {\n let ang = (r / n) * Math.PI * 2 + (rnd() - 0.5) * 0.5\n let x = 0\n let y = 0\n const segs = 3\n const total = L * (0.6 + 0.4 * rnd())\n for (let k = 0; k < segs; k++) {\n const step = (total / segs) * (0.7 + 0.6 * rnd())\n ang += (rnd() - 0.5) * 0.45\n const nx = x + Math.cos(ang) * step\n const ny = y + Math.sin(ang) * step\n verts.push(x, y, 0, nx, ny, 0)\n if (k > 0 && rnd() < 0.5) {\n const ba = ang + (rnd() < 0.5 ? -1 : 1) * (0.5 + rnd() * 0.5)\n const bl = step * (0.6 + 0.6 * rnd())\n verts.push(nx, ny, 0, nx + Math.cos(ba) * bl, ny + Math.sin(ba) * bl, 0)\n }\n x = nx\n y = ny\n }\n }\n // a faint ring around the impact\n const ringR = L * 0.12\n for (let k = 0; k < 8; k++) {\n const a0 = (k / 8) * Math.PI * 2\n const a1 = ((k + 1) / 8) * Math.PI * 2\n if (rnd() < 0.75) verts.push(Math.cos(a0) * ringR, Math.sin(a0) * ringR, 0, Math.cos(a1) * ringR, Math.sin(a1) * ringR, 0)\n }\n const geo = new this.THREE.BufferGeometry()\n geo.setAttribute('position', new this.THREE.Float32BufferAttribute(verts, 3))\n const lines = new this.THREE.LineSegments(geo, this.kit.lineMaterial(color))\n lines.position.copy(pos)\n lines.quaternion.copy(quat)\n lines.renderOrder = 2\n this.addDecal(mv, { obj: lines, geometry: geo })\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Char and heat glow\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n setChar(pv: PartVis, char: number, charColor: number): void {\n if (Math.abs(char - pv.charApplied) < 0.004) return\n pv.charApplied = char\n const target = new this.THREE.Color(charColor)\n for (const mv of pv.meshes) {\n this.ownMaterial(mv)\n const mats = materialsOf(mv.mesh.material)\n mats.forEach((m, i) => {\n const c = colorOf(m)\n const base = mv.baseColors?.[i]\n if (c && base) c.copy(base).lerp(target, clamp(char, 0, 1))\n })\n }\n }\n\n /** Emissive glow of a hot part. `temperature` below the glow threshold switches it off. */\n setGlow(pv: PartVis, temperatureC: number): void {\n const hex = heatColor(temperatureC)\n const key = hex === 0 ? 0 : Math.round(temperatureC / 5) * 5\n if (key === pv.glowApplied) return\n pv.glowApplied = key\n const intensity = hex === 0 ? 0 : clamp(0.35 + (temperatureC - 450) / 900, 0, 1.4)\n for (const mv of pv.meshes) {\n this.ownMaterial(mv)\n for (const m of materialsOf(mv.mesh.material)) {\n const e = (m as THREE_NS.MeshStandardMaterial).emissive\n if (e && (e as THREE_NS.Color).isColor) {\n e.setHex(hex)\n ;(m as THREE_NS.MeshStandardMaterial).emissiveIntensity = intensity\n }\n }\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Melt\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n /** Sag the part: shorter in Y (down to 25 %), a bit wider, vertices pushed down with noise, the bottom stays put. */\n setMelt(pv: PartVis, melt: number): void {\n const m = clamp(melt, 0, 1)\n if (Math.abs(m - pv.meltApplied) < 0.01) return\n pv.meltApplied = m\n for (const mv of pv.meshes) {\n const mesh = mv.mesh\n if (mv.meltApplied === 0 && m > 0) {\n mesh.updateWorldMatrix(true, false)\n mv.bottomY = this.box.setFromObject(mesh).min.y\n }\n mv.meltApplied = m\n mv.moved = true\n const sy = lerp(1, 0.25, m)\n const sxz = 1 + 0.18 * m\n mesh.scale.set(mv.origScale.x * sxz, mv.origScale.y * sy, mv.origScale.z * sxz)\n mesh.position.copy(mv.origPosition)\n mesh.updateWorldMatrix(true, false)\n const bottom = this.box.setFromObject(mesh).min.y\n const dy = mv.bottomY - bottom\n if (Math.abs(dy) > 1e-6 && mesh.parent) {\n mesh.parent.updateWorldMatrix(true, false)\n const inv = this.m4.copy(mesh.parent.matrixWorld).invert()\n this.a.set(0, dy, 0).applyMatrix4(inv)\n this.b.set(0, 0, 0).applyMatrix4(inv)\n mesh.position.copy(mv.origPosition).add(this.a.sub(this.b))\n }\n if (!(this.lowQuality && this.vertexCount(mv) > 20000) && this.ownGeometry(mv)) {\n this.writePositions(mv, positionAttr(mesh.geometry) as THREE_NS.BufferAttribute)\n }\n }\n }\n\n // ------------------------------------------------------------------------------------------------------------------------------------\n // Visibility and restore\n // ------------------------------------------------------------------------------------------------------------------------------------\n\n hide(pv: PartVis, reason: PartVis['gone']): void {\n pv.gone = reason\n for (const mv of pv.meshes) mv.mesh.visible = false\n }\n\n /** Bring one mesh back to how it was when it was bound. */\n restoreMesh(mv: MeshVis): void {\n const mesh = mv.mesh\n for (const d of mv.decals) this.disposeDecal(d)\n mv.decals.length = 0\n if (mv.ownGeo) {\n mesh.geometry.dispose()\n mesh.geometry = mv.origGeometry\n mv.ownGeo = false\n mv.work = null\n }\n if (mv.ownMat) {\n for (const m of materialsOf(mesh.material)) m.dispose()\n mesh.material = mv.origMaterial\n mv.ownMat = false\n mv.baseColors = null\n }\n mesh.visible = mv.origVisible\n if (mv.origParent && mesh.parent !== mv.origParent) {\n mv.origParent.add(mesh)\n mv.moved = true\n }\n if (mv.moved) {\n mesh.position.copy(mv.origPosition)\n mesh.quaternion.copy(mv.origQuaternion)\n mesh.scale.copy(mv.origScale)\n mv.moved = false\n }\n mv.meltApplied = 0\n }\n\n restorePart(pv: PartVis): void {\n for (const mv of pv.meshes) this.restoreMesh(mv)\n pv.charApplied = 0\n pv.glowApplied = 0\n pv.meltApplied = 0\n pv.gone = 'none'\n }\n\n dispose(): void {\n this.kit.dispose()\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { DebrisKind, DestructionEvent, MaterialDef, PartSpec, Vec3 } from '@adatechnology/game-destruction'\nimport { FragmentSystem } from './fragments'\nimport { GroundSpots } from './ground'\nimport type { Bound, PartVis, PieceBody } from './internal'\nimport { clamp, createRng, hashNumbers, hashString, mixHex } from './math'\nimport { ParticleSystem } from './particles'\nimport type { ParticleKind } from './particles'\nimport { PieceSystem } from './pieces'\nimport { partHintOf } from './spec'\nimport type { DestructionRenderer, BindOptions, Mesh, Object3D, Piece, RendererOptions, ThreeNamespace } from './types'\nimport { Visuals } from './visual'\n\ntype Ev<T extends DestructionEvent['type']> = Extract<DestructionEvent, { type: T }>\n\nconst GLOW_FROM_C = 430\nconst QUEUE_CAP = 4000\n\ninterface FireEmitter {\n object: string\n part: string\n point: Vec3\n accFire: number\n accSmoke: number\n}\n\ninterface Leak {\n object: string\n part: string\n fluid: string\n point: Vec3\n direction: Vec3\n rate: number\n pressurized: boolean\n acc: number\n}\n\nconst FLUID_COLORS: Record<string, number> = {\n water: 0x8cc8ff,\n fuel: 0xd9a032,\n oil: 0x2a2018,\n gas: 0xf2f2f2,\n sap: 0xb89b3a,\n acid: 0x9bd23c,\n blood: 0x8a0a0a,\n}\nconst SMOKE_TONES: Record<string, number> = { white: 0xe6e6e6, grey: 0x8a8a8a, black: 0x2a2a2a }\n\nconst DEFAULT_SPEED: Record<string, number> = {\n sparks: 3,\n splinters: 2.5,\n dust: 1,\n shards: 2.5,\n fibers: 1.2,\n leaves: 1.2,\n drips: 0.5,\n ash: 0.8,\n chips: 2.5,\n smoke: 0.8,\n steam: 1,\n fire: 1.2,\n flash: 0,\n foam: 2.5,\n}\n\n/** Sound key for an impact on a material. */\nfunction impactKey(def: MaterialDef | undefined): string {\n if (!def) return 'impact_wood'\n const tags = def.tags ?? []\n if (tags.includes('metal')) return 'impact_metal'\n if (def.visual?.transparent || def.fracture === 'shatter') return 'impact_glass'\n if (def.fracture === 'crumble') return 'impact_masonry'\n if (def.fracture === 'tear') return 'impact_soft'\n return def.fracture === 'none' ? 'impact_metal' : 'impact_wood'\n}\n\nfunction fractureKey(def: MaterialDef | undefined, style: string): string {\n switch (style) {\n case 'shatter':\n return 'shatter_glass'\n case 'crumble':\n return 'crumble'\n case 'splinter':\n return 'splinter'\n default:\n return impactKey(def)\n }\n}\n\nfunction fallbackColor(id: string, def: MaterialDef | undefined): number {\n if (def?.tags?.includes('metal')) return 0x8a8f96\n if (def?.visual?.transparent) return 0x9fd0e0\n const h = hashString(id)\n return mixHex(0x6b5a48, 0x9a9488, (h % 100) / 100)\n}\n\nfunction materialsOf(m: THREE_NS.Material | THREE_NS.Material[]): THREE_NS.Material[] {\n return Array.isArray(m) ? m : [m]\n}\n\n/** Create the renderer. See `DestructionRenderer`. */\nexport function createDestructionRenderer(THREE: ThreeNamespace, options: RendererOptions): DestructionRenderer {\n return new Renderer(THREE, options)\n}\n\nclass Renderer implements DestructionRenderer {\n private readonly world: RendererOptions['world']\n private readonly scene: THREE_NS.Scene\n private readonly quality: 'low' | 'medium' | 'high'\n private readonly low: boolean\n private readonly groundAt: (x: number, z: number) => number\n private readonly gravity: number\n private readonly autoSplit: boolean\n private readonly maxFragments: number\n private readonly bounds = new Map<string, Bound>()\n private readonly queue: DestructionEvent[] = []\n private readonly unsubscribe: () => void\n private readonly visuals: Visuals\n private readonly particles: ParticleSystem\n private readonly fragments: FragmentSystem\n private readonly ground: GroundSpots\n private readonly pieceSys: PieceSystem\n private readonly active = new Map<string, { object: string; part: string }>()\n private readonly fires = new Map<string, FireEmitter>()\n private readonly leaks: Leak[] = []\n private readonly homeTags: string[] = []\n private readonly throttles = new Map<string, number>()\n private readonly rng = createRng(0xc0ffee)\n private light: THREE_NS.PointLight | null = null\n private lightT = 0\n private lightDur = 0.3\n private lightPeak = 0\n private time = 0\n private scanTimer = 0\n private disposed = false\n private readonly box: THREE_NS.Box3\n private readonly tmpQ: THREE_NS.Quaternion\n private readonly v1: THREE_NS.Vector3\n private readonly v2: THREE_NS.Vector3\n\n constructor(\n private readonly THREE: ThreeNamespace,\n private readonly o: RendererOptions,\n ) {\n this.world = o.world\n this.scene = o.scene\n this.quality = o.quality ?? 'medium'\n this.low = this.quality === 'low'\n this.groundAt = o.groundAt ?? (() => 0)\n this.gravity = o.gravity ?? 9.81\n this.autoSplit = o.autoSplit !== false\n this.maxFragments = o.maxFragments ?? 160\n this.box = new THREE.Box3()\n this.tmpQ = new THREE.Quaternion()\n this.v1 = new THREE.Vector3()\n this.v2 = new THREE.Vector3()\n const maxParticles = Math.max(8, Math.floor((o.maxParticles ?? 2500) * (this.low ? 0.5 : 1)))\n this.visuals = new Visuals(THREE, this.low, 600)\n this.ground = new GroundSpots(THREE, o.scene, this.groundAt, 48)\n this.particles = new ParticleSystem(THREE, {\n capacity: maxParticles,\n scene: o.scene,\n density: this.low ? 0.6 : 1,\n pointScale: o.pointScale ?? 700,\n groundAt: this.groundAt,\n gravity: this.gravity,\n onLand: (x, _y, z, color, tag) => {\n const home = this.homeTags[tag - 1] ?? ''\n this.ground.add('puddle', x, z, 0.05 + this.rng() * 0.04, color, home)\n },\n })\n this.fragments = new FragmentSystem(THREE, {\n scene: o.scene,\n groundAt: this.groundAt,\n gravity: this.gravity,\n max: this.maxFragments,\n life: o.fragmentLife ?? 12,\n })\n this.pieceSys = new PieceSystem(THREE, {\n groundAt: this.groundAt,\n gravity: this.gravity,\n scene: o.scene,\n onHardLanding: (p, point, speed) => this.hardLanding(p, point, speed),\n })\n this.unsubscribe = this.world.on('*', (ev) => {\n if (this.queue.length < QUEUE_CAP) this.queue.push(ev)\n })\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Binding\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n bind(objectId: string, root: Object3D, options: BindOptions = {}): void {\n if (this.bounds.has(objectId)) this.unbind(objectId)\n const state = this.world.state(objectId)\n const partIds = new Set((state?.parts ?? []).map((p) => p.id))\n const byPart = new Map<string, Mesh[]>()\n const taken = new Set<Mesh>()\n const add = (pid: string, m: Mesh): void => {\n if (taken.has(m)) return\n taken.add(m)\n const l = byPart.get(pid)\n if (l) l.push(m)\n else byPart.set(pid, [m])\n }\n const meshesIn = (o: Object3D): Mesh[] => {\n const out: Mesh[] = []\n o.traverse((c) => {\n if ((c as Mesh).isMesh) out.push(c as Mesh)\n })\n return out\n }\n if (options.parts) {\n for (const [pid, v] of Object.entries(options.parts)) {\n for (const o of Array.isArray(v) ? v : [v]) for (const m of meshesIn(o)) add(pid, m)\n }\n } else {\n const leftovers: Mesh[] = []\n for (const m of meshesIn(root)) {\n const ud = partHintOf(m.userData?.destructionPart)?.id\n if (ud !== undefined && partIds.has(ud)) add(ud, m)\n else if (partIds.has(m.name)) add(m.name, m)\n else leftovers.push(m)\n }\n if (leftovers.length) this.matchByBox(objectId, root, leftovers, add)\n }\n const bound: Bound = { id: objectId, root, sync: options.syncTransform !== false, parts: new Map(), lastPos: null, lastQuat: null, piece: null, isSplit: false }\n for (const pid of partIds) bound.parts.set(pid, this.makePartVis(objectId, pid, state?.parts.find((p) => p.id === pid)?.material ?? '', byPart.get(pid) ?? []))\n for (const [pid, meshes] of byPart) {\n if (!bound.parts.has(pid)) bound.parts.set(pid, this.makePartVis(objectId, pid, this.world.part(objectId, pid)?.material ?? '', meshes))\n }\n this.bounds.set(objectId, bound)\n }\n\n private makePartVis(home: string, id: string, material: string, meshes: Mesh[]): PartVis {\n return { id, home, material, meshes: meshes.map((m) => this.visuals.makeMeshVis(m, home)), charApplied: 0, glowApplied: 0, meltApplied: 0, gone: 'none' }\n }\n\n /** Match unlabelled meshes to the part whose shape contains the centre of the mesh's bounding box. */\n private matchByBox(objectId: string, root: Object3D, meshes: Mesh[], add: (pid: string, m: Mesh) => void): void {\n let specParts: PartSpec[] | undefined\n try {\n specParts = this.world.serialize?.().objects.find((o) => o.id === objectId)?.spec.parts\n } catch {\n specParts = undefined\n }\n if (!specParts) return\n root.updateMatrixWorld(true)\n const e = new this.THREE.Euler()\n const q = new this.THREE.Quaternion()\n for (const m of meshes) {\n this.box.setFromObject(m)\n if (this.box.isEmpty()) continue\n const c = root.worldToLocal(this.box.getCenter(this.v1))\n let best: PartSpec | null = null\n let bestVol = Infinity\n for (const p of specParts) {\n const l = this.v2.set(c.x - p.position[0], c.y - p.position[1], c.z - p.position[2])\n if (p.rotation) l.applyQuaternion(q.setFromEuler(e.set(p.rotation[0], p.rotation[1], p.rotation[2], 'XYZ')).invert())\n let inside = false\n let vol = 0\n const s = p.shape\n if (s.kind === 'box') {\n inside = Math.abs(l.x) <= s.size[0] / 2 && Math.abs(l.y) <= s.size[1] / 2 && Math.abs(l.z) <= s.size[2] / 2\n vol = s.size[0] * s.size[1] * s.size[2]\n } else if (s.kind === 'cylinder') {\n inside = Math.hypot(l.x, l.z) <= s.radius && Math.abs(l.y) <= s.height / 2\n vol = Math.PI * s.radius * s.radius * s.height\n } else {\n inside = l.length() <= s.radius\n vol = (4 / 3) * Math.PI * s.radius ** 3\n }\n if (inside && vol < bestVol) {\n best = p\n bestVol = vol\n }\n }\n if (best) add(best.id, m)\n }\n }\n\n unbind(objectId: string): void {\n const b = this.bounds.get(objectId)\n if (!b) return\n this.restore(objectId)\n this.pieceSys.remove(objectId)\n this.bounds.delete(objectId)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Pieces\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n /** Half extents and centre of the box around some meshes, in the local space of `root`. */\n private measure(root: Object3D, meshes: Mesh[]): { half: Vec3; center: THREE_NS.Vector3 } {\n root.updateMatrixWorld(true)\n const inv = root.matrixWorld.clone().invert()\n const total = new this.THREE.Box3()\n const m4 = new this.THREE.Matrix4()\n for (const m of meshes) {\n const g = m.geometry\n if (!g.boundingBox) g.computeBoundingBox()\n if (!g.boundingBox || g.boundingBox.isEmpty()) continue\n total.union(g.boundingBox.clone().applyMatrix4(m4.multiplyMatrices(inv, m.matrixWorld)))\n }\n if (total.isEmpty()) return { half: [0.25, 0.25, 0.25], center: new this.THREE.Vector3() }\n const size = total.getSize(new this.THREE.Vector3())\n return { half: [Math.max(0.02, size.x / 2), Math.max(0.02, size.y / 2), Math.max(0.02, size.z / 2)], center: total.getCenter(new this.THREE.Vector3()) }\n }\n\n private meshesOf(b: Bound): Mesh[] {\n const out: Mesh[] = []\n for (const pv of b.parts.values()) if (pv.gone === 'none') for (const mv of pv.meshes) out.push(mv.mesh)\n return out\n }\n\n private massOf(objectId: string): number {\n const st = this.world.state(objectId)\n if (!st) return 5\n let m = 0\n for (const p of st.parts) if (p.status !== 'broken' && p.status !== 'melted' && p.status !== 'ashes') m += p.mass\n return m > 0 ? m : 5\n }\n\n makePiece(objectId: string, options: { mass?: number; velocity?: Vec3 } = {}): Piece {\n const b = this.bounds.get(objectId)\n if (!b) throw new Error(`game-destruction-three: object \"${objectId}\" is not bound`)\n if (b.root.parent && b.root.parent !== this.scene) this.scene.attach(b.root)\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n const piece = this.pieceSys.create(objectId, b.root, half, center, options.mass ?? this.massOf(objectId), options.velocity)\n b.piece = piece\n return piece\n }\n\n pieces(): Piece[] {\n return [...this.pieceSys.list]\n }\n\n piece(objectId: string): Piece | null {\n return this.pieceSys.get(objectId)\n }\n\n impulse(objectId: string, impulse: Vec3, point?: Vec3): void {\n const p = this.pieceSys.get(objectId)\n if (p) this.pieceSys.impulse(p, impulse, point)\n }\n\n private hardLanding(p: PieceBody, point: Vec3, speed: number): void {\n const key = this.impactSoundOf(p.objectId)\n this.sound(key, point, clamp(speed / 10, 0.2, 1))\n // the piece just moved this frame: the world must know where it is before the hit is resolved against its parts\n this.syncBound(p.objectId)\n try {\n this.world.hit(p.objectId, { type: 'blunt', point, energy: 0.5 * p.mass * speed * speed, radius: 0.08, direction: [0, -1, 0], source: 'fall' })\n } catch {\n // the object may have been removed from the world\n }\n }\n\n private impactSoundOf(objectId: string): string {\n const st = this.world.state(objectId)\n let best: MaterialDef | undefined\n let mass = -1\n for (const p of st?.parts ?? []) {\n if (p.mass > mass) {\n mass = p.mass\n best = this.world.materials.get(p.material)\n }\n }\n return impactKey(best)\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Update\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n update(dt: number): void {\n if (this.disposed) return\n dt = clamp(dt, 0, 0.1)\n this.time += dt\n this.drainQueue()\n this.updateActive(dt)\n this.updateLeaks(dt)\n this.pieceSys.update(dt)\n this.fragments.update(dt)\n this.ground.update(dt)\n this.updateLight(dt)\n this.particles.update(dt)\n this.syncTransforms()\n }\n\n private drainQueue(): void {\n // events produced while applying (a hard landing calls `hit`) wait for the next frame\n const batch = this.queue.splice(0, this.queue.length)\n for (const ev of batch) {\n try {\n this.apply(ev)\n } catch (err) {\n if (typeof console !== 'undefined') console.error('game-destruction-three: failed to apply', ev.type, err)\n }\n }\n }\n\n private syncTransforms(): void {\n for (const b of this.bounds.values()) this.syncOne(b)\n }\n\n /** Push the current transform of one bound object to the world right now (used before a landing hit). */\n private syncBound(objectId: string): void {\n const b = this.bounds.get(objectId)\n if (b) this.syncOne(b)\n }\n\n private syncOne(b: Bound): void {\n if (!b.sync) return\n const p = this.v1\n const q = this.tmpQ\n b.root.updateWorldMatrix(true, false)\n b.root.matrixWorld.decompose(p, q, this.v2)\n const last = b.lastPos\n const lq = b.lastQuat\n const moved = !last || !lq || Math.abs(p.x - last[0]) + Math.abs(p.y - last[1]) + Math.abs(p.z - last[2]) > 1e-5 || Math.abs(q.x - lq[0]) + Math.abs(q.y - lq[1]) + Math.abs(q.z - lq[2]) + Math.abs(q.w - lq[3]) > 1e-6\n if (!moved) return\n b.lastPos = [p.x, p.y, p.z]\n b.lastQuat = [q.x, q.y, q.z, q.w]\n if (this.world.has(b.id)) this.world.setTransform(b.id, [p.x, p.y, p.z], [q.x, q.y, q.z, q.w])\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Events\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n private apply(ev: DestructionEvent): void {\n switch (ev.type) {\n case 'damage':\n if (ev.damageType === 'heat' || ev.damageType === 'fire' || ev.damageType === 'explosive') this.activate(ev.object, ev.part)\n break\n case 'dent':\n this.onDent(ev)\n break\n case 'hole':\n this.onHole(ev)\n break\n case 'crack':\n this.onCrack(ev)\n break\n case 'ricochet': {\n const d = ev.direction\n this.particles.burst('sparks', ev.point, d, 4 + Math.min(10, ev.energy / 150), 4)\n this.sound('ricochet', ev.point, 0.7)\n break\n }\n case 'debris':\n this.particles.burst(ev.kind, ev.point, ev.normal, ev.count, ev.speed > 0 ? ev.speed : DEFAULT_SPEED[ev.kind] ?? 1, this.debrisOptions(ev.kind, ev.object, ev.part))\n break\n case 'fracture':\n this.onFracture(ev)\n break\n case 'detach':\n this.onDetach(ev)\n break\n case 'disassemble_progress': {\n const k = `unscrew:${ev.joint}`\n if (this.time - (this.throttles.get(k) ?? -1) > 0.25) {\n this.throttles.set(k, this.time)\n this.sound('unscrew', this.rootPoint(ev.object), clamp(0.3 + ev.progress * 0.5, 0, 1))\n }\n break\n }\n case 'ignite':\n this.fires.set(`${ev.object}|${ev.part}`, { object: ev.object, part: ev.part, point: ev.point, accFire: 0, accSmoke: 0 })\n this.activate(ev.object, ev.part)\n this.particles.burst('fire', ev.point, [0, 1, 0], 6, 1)\n this.sound('ignite', ev.point, 0.7)\n this.sound('burn_loop', ev.point, 0.5)\n break\n case 'extinguish': {\n const f = this.fires.get(`${ev.object}|${ev.part}`)\n if (f) {\n this.fires.delete(`${ev.object}|${ev.part}`)\n this.particles.burst('steam', f.point, [0, 1, 0], 14, 1.2)\n }\n this.activate(ev.object, ev.part)\n this.sound('extinguish', f?.point ?? this.rootPoint(ev.object), 0.6)\n break\n }\n case 'burnout': {\n this.fires.delete(`${ev.object}|${ev.part}`)\n this.particles.burst('ash', ev.point, [0, 1, 0], 16, 1)\n this.particles.burst('smoke', ev.point, [0, 1, 0], 6, 0.8, { color: SMOKE_TONES.grey })\n const pv = this.partVis(ev.object, ev.part)\n if (pv) {\n const def = this.world.materials.get(pv.material)\n this.visuals.setChar(pv, 1, def?.visual?.charColor ?? 0x1a1410)\n }\n this.activate(ev.object, ev.part)\n break\n }\n case 'melt':\n this.activate(ev.object, ev.part)\n if (this.time - (this.throttles.get(`melt:${ev.object}|${ev.part}`) ?? -9) > 1.5) {\n this.throttles.set(`melt:${ev.object}|${ev.part}`, this.time)\n this.sound('melt_sizzle', this.rootPoint(ev.object), 0.4)\n }\n break\n case 'drip': {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n const def = this.world.materials.get(ev.material)\n const color = (pv && this.partColor(pv, def)) ?? fallbackColor(ev.material, def)\n let tag = this.homeTags.indexOf(ev.object) + 1\n if (tag === 0) tag = this.homeTags.push(ev.object)\n this.particles.spawn('drips', ev.point, [(this.rng() - 0.5) * 0.1, -0.1, (this.rng() - 0.5) * 0.1], { color, tag })\n break\n }\n case 'leak': {\n const key = `${ev.object}|${ev.part}`\n const same = this.leaks.find((l) => l.object === ev.object && l.part === ev.part && Math.hypot(l.point[0] - ev.point[0], l.point[1] - ev.point[1], l.point[2] - ev.point[2]) < 0.03)\n if (same) {\n same.rate = ev.rate\n same.direction = ev.direction\n } else {\n if (this.leaks.length >= 24) this.leaks.shift()\n this.leaks.push({ object: ev.object, part: ev.part, fluid: ev.fluid, point: ev.point, direction: ev.direction, rate: ev.rate, pressurized: ev.pressurized, acc: 0 })\n }\n void key\n break\n }\n case 'explode':\n this.onExplode(ev)\n break\n case 'destroyed':\n break\n }\n }\n\n private rootPoint(objectId: string): Vec3 {\n const b = this.bounds.get(objectId)\n return b ? [b.root.position.x, b.root.position.y, b.root.position.z] : [0, 0, 0]\n }\n\n private sound(key: string, point: Vec3, volume: number): void {\n this.o.onSound?.(key, point, volume)\n }\n\n private partVis(objectId: string, partId: string): PartVis | null {\n return this.bounds.get(objectId)?.parts.get(partId) ?? null\n }\n\n private activate(objectId: string, partId: string): void {\n this.active.set(`${objectId}|${partId}`, { object: objectId, part: partId })\n }\n\n /** Current colour of the part's first mesh (char included), or null. */\n private partColor(pv: PartVis, def: MaterialDef | undefined): number | null {\n const mv = pv.meshes[0]\n if (!mv) return null\n const mat = materialsOf(mv.mesh.material)[0] as THREE_NS.MeshStandardMaterial | undefined\n const c = mat?.color\n if (c && (c as THREE_NS.Color).isColor) {\n const tint = this.visuals.vertexTint(mv)\n return tint ? c.clone().multiply(tint).getHex() : c.getHex()\n }\n return def ? fallbackColor(def.id, def) : null\n }\n\n private debrisOptions(kind: DebrisKind, objectId: string, partId: string): { color?: number } | undefined {\n const pv = this.partVis(objectId, partId)\n const def = pv ? this.world.materials.get(pv.material) : undefined\n if (kind === 'smoke') return { color: SMOKE_TONES[def?.thermal.smoke ?? 'grey'] }\n if (kind === 'fibers' || kind === 'leaves') {\n const c = pv ? this.visuals.baseColorHex(pv.meshes[0] ?? ({} as never)) : -1\n return c >= 0 ? { color: c } : undefined\n }\n if (kind === 'dust' || kind === 'chips') {\n const c = pv && pv.meshes[0] ? this.visuals.baseColorHex(pv.meshes[0]) : -1\n return c >= 0 && kind === 'chips' ? { color: c } : undefined\n }\n return undefined\n }\n\n /** Mesh of the part closest to a world point. */\n private nearestMesh(pv: PartVis, p: THREE_NS.Vector3): PartVis['meshes'][number] | null {\n let best: PartVis['meshes'][number] | null = null\n let bd = Infinity\n for (const mv of pv.meshes) {\n if (!mv.mesh.visible) continue\n const d = this.box.setFromObject(mv.mesh).distanceToPoint(p)\n if (d < bd) {\n bd = d\n best = mv\n }\n }\n return best\n }\n\n private worldDir(b: Bound, v: Vec3): THREE_NS.Vector3 {\n b.root.updateWorldMatrix(true, false)\n return new this.THREE.Vector3(v[0], v[1], v[2]).applyQuaternion(b.root.getWorldQuaternion(this.tmpQ)).normalize()\n }\n\n private onDent(ev: Ev<'dent'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const wp = new this.THREE.Vector3(ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2])\n const wn = this.worldDir(b, ev.dent.normal)\n for (const mv of pv.meshes) {\n if (!mv.mesh.visible) continue\n this.visuals.applyDent(mv, wp, wn, ev.dent)\n }\n if (def?.tags?.includes('metal')) this.particles.burst('sparks', ev.worldPoint, [wn.x, wn.y, wn.z], 4 + Math.min(8, ev.dent.depth * 150), 3.2)\n this.sound(impactKey(def), ev.worldPoint, clamp(0.3 + ev.dent.depth * 12, 0.3, 1))\n }\n\n private onHole(ev: Ev<'hole'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const n = this.worldDir(b, ev.hole.normal)\n const draw = (point: Vec3, normal: THREE_NS.Vector3): void => {\n const wp = new this.THREE.Vector3(point[0], point[1], point[2])\n const mv = this.nearestMesh(pv, wp)\n if (!mv) return\n if (def?.visual?.transparent) {\n const seed = hashNumbers(ev.time, point[0], point[1], point[2])\n this.visuals.addCrack(mv, wp, normal, 7, Math.max(0.05, ev.hole.diameter * 5), 0xe8f4ff, seed)\n } else {\n this.visuals.addHole(mv, wp, normal, ev.hole.diameter)\n }\n }\n draw(ev.worldPoint, n)\n if (ev.hole.through && ev.exitPoint) draw(ev.exitPoint, n.clone().negate())\n if (def?.tags?.includes('metal')) this.particles.burst('sparks', ev.worldPoint, [n.x, n.y, n.z], 6, 3.5)\n this.sound(impactKey(def), ev.worldPoint, 0.6)\n }\n\n private onCrack(ev: Ev<'crack'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n if (!b || !pv) return\n const def = this.world.materials.get(pv.material)\n const wp = new this.THREE.Vector3(ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2])\n const mv = this.nearestMesh(pv, wp)\n if (mv) {\n const color = def?.visual?.transparent ? 0xe8f4ff : 0x2a2724\n this.visuals.addCrack(mv, wp, this.worldDir(b, ev.crack.normal), ev.crack.rays, ev.crack.length, color, hashNumbers(ev.time, ev.worldPoint[0], ev.worldPoint[1], ev.worldPoint[2]))\n }\n this.sound(impactKey(def), ev.worldPoint, 0.5)\n }\n\n private onFracture(ev: Ev<'fracture'>): void {\n const b = this.bounds.get(ev.object)\n const pv = b?.parts.get(ev.part)\n const matId = pv?.material || (ev.fragments[0]?.material ?? '')\n const def = this.world.materials.get(matId)\n let color = fallbackColor(matId, def)\n let opacity = 0.5\n const transparent = def?.visual?.transparent === true\n if (pv) {\n const c = this.partColor(pv, def)\n if (c !== null) color = c\n const m = pv.meshes[0] ? (materialsOf(pv.meshes[0].origMaterial)[0] as THREE_NS.Material | undefined) : undefined\n if (m && m.transparent) opacity = clamp(m.opacity, 0.2, 0.8)\n this.visuals.hide(pv, 'broken')\n }\n const maxAlive = this.low ? Math.floor(this.maxFragments / 2) : this.maxFragments\n const step = this.low ? 2 : 1\n for (let i = 0; i < ev.fragments.length; i += step) {\n const fr = ev.fragments[i]\n const fdef = this.world.materials.get(fr.material)\n const mat = this.fragments.materialFor(fr.material, fdef === def || !fdef ? color : fallbackColor(fr.material, fdef), transparent || fdef?.visual?.transparent === true, opacity)\n this.fragments.spawn(fr, mat, ev.object, maxAlive)\n }\n const up: Vec3 = [0, 1, 0]\n const sizeK = clamp(ev.fragments.length / 10, 0.5, 2)\n switch (ev.style) {\n case 'shatter':\n this.particles.burst('shards', ev.point, up, 18 * sizeK, 3)\n break\n case 'crumble':\n this.particles.burst('dust', ev.point, up, 16 * sizeK, 1.2, { color: pv ? (this.partColor(pv, def) ?? undefined) : undefined })\n this.particles.burst('chips', ev.point, up, 6, 3)\n break\n case 'splinter':\n this.particles.burst('splinters', ev.point, up, 14 * sizeK, 3)\n this.particles.burst('dust', ev.point, up, 5, 0.8, { color: 0xb59a74 })\n break\n case 'tear':\n this.particles.burst('fibers', ev.point, up, 12 * sizeK, 1.6, { color: color })\n break\n case 'snap':\n this.particles.burst('chips', ev.point, up, 8 * sizeK, 3)\n break\n default:\n this.particles.burst('sparks', ev.point, up, 10, 4)\n }\n this.sound(fractureKey(def, ev.style), ev.point, clamp(0.4 + ev.fragments.length * 0.03, 0.4, 1))\n }\n\n private onDetach(ev: Ev<'detach'>): void {\n this.sound('detach', this.rootPoint(ev.object), 0.5)\n if (!this.autoSplit) return\n const b = this.bounds.get(ev.object)\n if (!b) return\n const st = this.world.state(ev.object)\n if (!st || st.groups.length < 2) return\n const loose = st.groups.length - 1\n for (let i = 0; i < loose; i++) {\n // the loose groups are always read from index 1: each split renumbers the rest\n let newId: string\n try {\n newId = this.world.splitGroup(ev.object, 1)\n } catch {\n break\n }\n this.adoptSplit(b, newId)\n }\n const old = b.piece\n if (old) {\n const { half, center } = this.measure(b.root, this.meshesOf(b))\n old.halfExtents = half\n this.pieceSys.setCenter(old, center)\n old.mass = Math.max(0.05, this.massOf(ev.object))\n old.sleeping = false\n }\n }\n\n /** The renderer side of `splitGroup`: a new group holding the meshes of the new object, made a piece. */\n private adoptSplit(from: Bound, newId: string): void {\n const state = this.world.state(newId)\n const root = from.root\n root.updateWorldMatrix(true, false)\n const group = new this.THREE.Group()\n group.name = `destruction-piece-${newId}`\n root.getWorldPosition(group.position)\n root.getWorldQuaternion(group.quaternion)\n this.scene.add(group)\n group.updateMatrixWorld(true)\n const nb: Bound = { id: newId, root: group, sync: true, parts: new Map(), lastPos: null, lastQuat: null, piece: null, isSplit: true }\n for (const p of state?.parts ?? []) {\n const pv = from.parts.get(p.id)\n if (!pv) continue\n from.parts.delete(p.id)\n nb.parts.set(p.id, pv)\n for (const mv of pv.meshes) {\n group.attach(mv.mesh)\n mv.moved = true\n }\n }\n this.bounds.set(newId, nb)\n const meshes = this.meshesOf(nb)\n if (meshes.length === 0) return\n const { half, center } = this.measure(group, meshes)\n let vel: Vec3 = [0, 0, 0]\n let ang: Vec3 = [0, 0, 0]\n const op = from.piece\n if (op) {\n vel = [...op.velocity]\n ang = [...op.angularVelocity]\n // linear velocity at the loose piece's centre\n const c = this.pieceSys.centerOf(op, new this.THREE.Vector3())\n const nc = center.clone().applyQuaternion(group.quaternion).add(group.position)\n vel[0] += ang[1] * (nc.z - c.z) - ang[2] * (nc.y - c.y)\n vel[1] += ang[2] * (nc.x - c.x) - ang[0] * (nc.z - c.z)\n vel[2] += ang[0] * (nc.y - c.y) - ang[1] * (nc.x - c.x)\n }\n const piece = this.pieceSys.create(newId, group, half, center, this.massOf(newId), vel, ang)\n nb.piece = piece\n this.o.onPiece?.(piece)\n }\n\n private onExplode(ev: Ev<'explode'>): void {\n const p = ev.point\n const k = clamp(ev.radius / 3, 0.4, 2.5)\n this.particles.burst('flash', p, [0, 1, 0], 1, 0, { size: k })\n this.particles.burst('fire', p, [0, 1, 0], 34 * k, 4 * k, { size: 1 + k * 0.5 })\n this.particles.burst('smoke', p, [0, 1, 0], 24 * k, 2.2, { color: SMOKE_TONES.black, size: 1 + k * 0.6 })\n this.particles.burst('dust', p, [0, 1, 0], 22 * k, 3.5 * k)\n this.particles.burst('sparks', p, [0, 1, 0], 16 * k, 8)\n this.particles.push(p, ev.radius, 4)\n if (this.o.explosionLight !== false) {\n if (!this.light) {\n this.light = new this.THREE.PointLight(0xffa860, 0, 10, 2)\n this.light.name = 'destruction-explosion-light'\n }\n if (!this.light.parent) this.scene.add(this.light)\n this.light.position.set(p[0], p[1] + 0.5, p[2])\n this.light.distance = Math.max(6, ev.radius * 3)\n this.lightPeak = clamp(Math.sqrt(Math.max(1, ev.energy)) * 0.6, 10, 400)\n this.lightDur = 0.35\n this.lightT = this.lightDur\n }\n // shove pieces and fragments\n const c = this.v1\n for (const pc of this.pieceSys.list) {\n this.pieceSys.centerOf(pc, c)\n const dx = c.x - p[0]\n const dy = c.y - p[1]\n const dz = c.z - p[2]\n const d = Math.hypot(dx, dy, dz)\n if (d > ev.radius) continue\n const fall = (1 - d / ev.radius) ** 2\n const speed = Math.min(30, Math.sqrt((2 * ev.energy * 0.02) / pc.mass)) * fall\n const inv = d > 1e-4 ? 1 / d : 0\n const dir: Vec3 = d > 1e-4 ? [dx * inv, dy * inv + 0.3, dz * inv] : [0, 1, 0]\n const spread = pc.halfExtents[0]\n this.pieceSys.impulse(pc, [dir[0] * speed * pc.mass, dir[1] * speed * pc.mass, dir[2] * speed * pc.mass], [c.x + (this.rng() - 0.5) * spread, c.y + spread * 0.5, c.z + (this.rng() - 0.5) * spread])\n }\n this.fragments.blast(p, ev.radius, Math.min(20, Math.sqrt(ev.energy) * 0.08))\n this.sound('explode', p, clamp(0.5 + ev.radius / 10, 0.5, 1))\n }\n\n private updateLight(dt: number): void {\n if (!this.light || this.lightT <= 0) return\n this.lightT = Math.max(0, this.lightT - dt)\n const t = this.lightT / this.lightDur\n this.light.intensity = this.lightPeak * t * t\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Fire, heat, char, melt, leaks\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n private updateActive(dt: number): void {\n this.scanTimer += dt\n if (this.scanTimer >= 0.4) {\n this.scanTimer = 0\n for (const b of this.bounds.values()) {\n for (const pv of b.parts.values()) {\n if (pv.gone !== 'none' && pv.gone !== 'broken') continue\n const ps = this.world.part(b.id, pv.id)\n if (!ps) continue\n const def = this.world.materials.get(pv.material)\n if (\n ps.burning ||\n (def?.visual?.glows && ps.temperature > GLOW_FROM_C) ||\n Math.abs(ps.char - pv.charApplied) > 0.01 ||\n Math.abs(ps.melt - pv.meltApplied) > 0.01 ||\n (pv.gone === 'none' && (ps.status === 'melted' || ps.status === 'ashes'))\n ) {\n this.activate(b.id, pv.id)\n }\n }\n }\n }\n for (const [key, a] of this.active) {\n const pv = this.partVis(a.object, a.part)\n const ps = pv ? this.world.part(a.object, a.part) : null\n if (!pv || !ps) {\n this.active.delete(key)\n continue\n }\n const def = this.world.materials.get(pv.material)\n if (pv.gone === 'none') {\n this.visuals.setChar(pv, ps.char, def?.visual?.charColor ?? 0x1a1410)\n if (def?.visual?.glows) this.visuals.setGlow(pv, ps.temperature)\n this.visuals.setMelt(pv, ps.melt)\n if (ps.status === 'melted') this.onGone(a.object, pv, 'melted', def)\n else if (ps.status === 'ashes') this.onGone(a.object, pv, 'ashes', def)\n }\n const fire = this.fires.get(key)\n if (fire) {\n if (ps.burning && ps.status !== 'broken' && ps.status !== 'ashes' && ps.status !== 'melted') this.emitFire(fire, pv, def, dt)\n else this.fires.delete(key)\n }\n const hot = def?.visual?.glows === true && ps.temperature > GLOW_FROM_C\n if (!ps.burning && !hot && Math.abs(ps.char - pv.charApplied) < 0.01 && Math.abs(ps.melt - pv.meltApplied) < 0.01) {\n if (def?.visual?.glows && pv.gone === 'none') this.visuals.setGlow(pv, 0)\n this.active.delete(key)\n }\n }\n }\n\n private onGone(objectId: string, pv: PartVis, reason: 'melted' | 'ashes', def: MaterialDef | undefined): void {\n const bb = new this.THREE.Box3()\n for (const mv of pv.meshes) bb.union(this.box.setFromObject(mv.mesh))\n this.visuals.hide(pv, reason)\n if (bb.isEmpty()) return\n const c = bb.getCenter(new this.THREE.Vector3())\n const s = bb.getSize(new this.THREE.Vector3())\n const footprint = Math.sqrt(Math.max(s.x * s.z, 1e-4))\n if (reason === 'melted') {\n this.ground.add('puddle', c.x, c.z, clamp(footprint * 0.55, 0.05, 1), this.partColor(pv, def) ?? fallbackColor(pv.material, def), objectId)\n } else {\n this.ground.add('ash', c.x, c.z, clamp(footprint * 0.35, 0.04, 0.5), 0x1d1a18, objectId)\n this.particles.burst('ash', [c.x, bb.max.y, c.z], [0, 1, 0], 10, 0.8)\n }\n }\n\n private emitFire(f: FireEmitter, pv: PartVis, def: MaterialDef | undefined, dt: number): void {\n const bb = this.box\n bb.makeEmpty()\n const tmp = new this.THREE.Box3()\n for (const mv of pv.meshes) if (mv.mesh.visible) bb.union(tmp.setFromObject(mv.mesh))\n let cx = f.point[0]\n let cy = f.point[1]\n let cz = f.point[2]\n let sx = 0.2\n let sy = 0.2\n let sz = 0.2\n if (!bb.isEmpty()) {\n const c = bb.getCenter(this.v1)\n const s = bb.getSize(this.v2)\n cx = c.x\n cy = bb.min.y\n cz = c.z\n sx = s.x\n sy = s.y\n sz = s.z\n }\n const vol = clamp(Math.cbrt(Math.max(sx * sy * sz, 1e-5)), 0.05, 1.5)\n f.accFire += (18 + 70 * vol) * dt\n f.accSmoke += (6 + 24 * vol) * dt\n const tone = SMOKE_TONES[def?.thermal.smoke ?? 'grey']\n const rnd = this.rng\n while (f.accFire >= 1) {\n f.accFire -= 1\n this.particles.spawn('fire', [cx + (rnd() - 0.5) * sx, cy + sy * (0.3 + 0.7 * rnd()), cz + (rnd() - 0.5) * sz], [(rnd() - 0.5) * 0.4, 0.5 + rnd() * 0.9, (rnd() - 0.5) * 0.4], { size: 0.6 + vol * 0.8 })\n }\n while (f.accSmoke >= 1) {\n f.accSmoke -= 1\n this.particles.spawn('smoke', [cx + (rnd() - 0.5) * sx, cy + sy * (0.8 + 0.4 * rnd()), cz + (rnd() - 0.5) * sz], [(rnd() - 0.5) * 0.3 + 0.1, 0.4 + rnd() * 0.5, (rnd() - 0.5) * 0.3], { color: tone, size: 0.6 + vol })\n }\n }\n\n private updateLeaks(dt: number): void {\n for (let i = this.leaks.length - 1; i >= 0; i--) {\n const l = this.leaks[i]\n const ps = this.world.part(l.object, l.part)\n if (!ps || ps.liters === undefined || ps.liters <= 0) {\n this.leaks.splice(i, 1)\n continue\n }\n l.acc += clamp(20 + l.rate * 400, 15, 120) * dt\n const color = FLUID_COLORS[l.fluid] ?? 0xaaaaaa\n const d = l.direction\n const dl = Math.hypot(d[0], d[1], d[2]) || 1\n const sp = l.pressurized ? 2.5 + this.rng() * 1.5 : 0.3 + this.rng() * 0.3\n while (l.acc >= 1) {\n l.acc -= 1\n const vel: Vec3 = [(d[0] / dl) * sp + (this.rng() - 0.5) * 0.25, (d[1] / dl) * sp + (this.rng() - 0.5) * 0.25, (d[2] / dl) * sp + (this.rng() - 0.5) * 0.25]\n if (l.fluid === 'gas') this.particles.spawn('steam', l.point, vel, { color, size: 0.5, alpha: 0.5 })\n else this.particles.spawn('drips', l.point, vel, { color, tag: this.rng() < 0.03 ? this.tagOf(l.object) : 0 })\n }\n }\n }\n\n private tagOf(object: string): number {\n let tag = this.homeTags.indexOf(object) + 1\n if (tag === 0) tag = this.homeTags.push(object)\n return tag\n }\n\n // ----------------------------------------------------------------------------------------------------------------------------------\n // Emit, clear, restore, stats, dispose\n // ----------------------------------------------------------------------------------------------------------------------------------\n\n emit(kind: DebrisKind | 'fire' | 'flash' | 'foam', point: Vec3, normal: Vec3, count: number, speed?: number): void {\n this.particles.burst(kind as ParticleKind, point, normal, count, speed ?? DEFAULT_SPEED[kind] ?? 1, kind === 'smoke' ? { color: SMOKE_TONES.grey } : undefined)\n }\n\n restore(objectId: string): void {\n const homes = new Set<string>([objectId])\n const self = this.bounds.get(objectId)\n if (self?.isSplit) for (const pv of self.parts.values()) homes.add(pv.home)\n for (const home of homes) this.restoreHome(home)\n for (const [key, a] of [...this.active]) if (homes.has(a.object)) this.active.delete(key)\n for (const [key, f] of [...this.fires]) if (homes.has(f.object)) this.fires.delete(key)\n for (let i = this.leaks.length - 1; i >= 0; i--) if (homes.has(this.leaks[i].object)) this.leaks.splice(i, 1)\n for (const home of homes) {\n this.fragments.removeHome(home)\n this.ground.removeHome(home)\n }\n }\n\n private restoreHome(home: string): void {\n const homeBound = this.bounds.get(home)\n for (const b of [...this.bounds.values()]) {\n for (const [pid, pv] of [...b.parts]) {\n if (pv.home !== home) continue\n this.visuals.restorePart(pv)\n if (b !== homeBound && homeBound) {\n b.parts.delete(pid)\n homeBound.parts.set(pid, pv)\n }\n }\n if (b.isSplit && b.parts.size === 0) {\n this.scene.remove(b.root)\n this.pieceSys.remove(b.id)\n this.bounds.delete(b.id)\n }\n }\n }\n\n clear(): void {\n this.queue.length = 0\n this.active.clear()\n this.fires.clear()\n this.leaks.length = 0\n for (const id of [...this.bounds.keys()]) if (this.bounds.has(id)) this.restore(id)\n // anything left of a split object whose home is gone\n for (const b of [...this.bounds.values()]) {\n if (b.isSplit) {\n for (const pv of b.parts.values()) this.visuals.restorePart(pv)\n this.scene.remove(b.root)\n this.pieceSys.remove(b.id)\n this.bounds.delete(b.id)\n }\n }\n this.fragments.clear()\n this.ground.clear()\n this.particles.clear()\n if (this.light) {\n this.light.intensity = 0\n this.lightT = 0\n this.scene.remove(this.light)\n }\n }\n\n stats(): { fragments: number; particles: number; pieces: number; decals: number } {\n return { fragments: this.fragments.count, particles: this.particles.live, pieces: this.pieceSys.list.length, decals: this.visuals.decalCount + this.ground.count }\n }\n\n dispose(): void {\n if (this.disposed) return\n this.unsubscribe()\n this.clear()\n for (const id of [...this.bounds.keys()]) this.unbind(id)\n this.fragments.dispose()\n this.ground.dispose()\n this.particles.dispose()\n this.visuals.dispose()\n this.light?.dispose?.()\n this.light = null\n this.disposed = true\n }\n}\n","[\n {\n \"id\": \"22lr\",\n \"label\": \".22 LR\",\n \"diameter\": 5.7,\n \"bulletGrams\": 2.6,\n \"muzzleSpeed\": 350,\n \"dragPer100m\": 0.15,\n \"kind\": \"rimfire\"\n },\n {\n \"id\": \"9x19\",\n \"label\": \"9×19 mm\",\n \"diameter\": 9,\n \"bulletGrams\": 7.5,\n \"muzzleSpeed\": 365,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"38spl\",\n \"label\": \".38 Special\",\n \"diameter\": 9.1,\n \"bulletGrams\": 10.2,\n \"muzzleSpeed\": 247,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"357mag\",\n \"label\": \".357 Magnum\",\n \"diameter\": 9.1,\n \"bulletGrams\": 10.2,\n \"muzzleSpeed\": 396,\n \"dragPer100m\": 0.18,\n \"kind\": \"hp\"\n },\n {\n \"id\": \"40sw\",\n \"label\": \".40 S&W\",\n \"diameter\": 10.2,\n \"bulletGrams\": 11.7,\n \"muzzleSpeed\": 310,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"45acp\",\n \"label\": \".45 ACP\",\n \"diameter\": 11.5,\n \"bulletGrams\": 14.9,\n \"muzzleSpeed\": 254,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"380acp\",\n \"label\": \".380 ACP\",\n \"diameter\": 9,\n \"bulletGrams\": 6.2,\n \"muzzleSpeed\": 295,\n \"dragPer100m\": 0.22,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"5_56x45\",\n \"label\": \"5.56×45 mm\",\n \"diameter\": 5.7,\n \"bulletGrams\": 4,\n \"muzzleSpeed\": 935,\n \"dragPer100m\": 0.1,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"7_62x39\",\n \"label\": \"7.62×39 mm\",\n \"diameter\": 7.9,\n \"bulletGrams\": 8,\n \"muzzleSpeed\": 725,\n \"dragPer100m\": 0.1,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"7_62x51\",\n \"label\": \"7.62×51 mm (.308)\",\n \"diameter\": 7.8,\n \"bulletGrams\": 9.7,\n \"muzzleSpeed\": 850,\n \"dragPer100m\": 0.08,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"338lapua\",\n \"label\": \".338 Lapua Magnum\",\n \"diameter\": 8.6,\n \"bulletGrams\": 16.2,\n \"muzzleSpeed\": 903,\n \"dragPer100m\": 0.06,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"50bmg\",\n \"label\": \".50 BMG\",\n \"diameter\": 12.7,\n \"bulletGrams\": 42,\n \"muzzleSpeed\": 925,\n \"dragPer100m\": 0.05,\n \"kind\": \"ap\"\n },\n {\n \"id\": \"12ga_00buck\",\n \"label\": \"12 ga 00 buck\",\n \"diameter\": 8.4,\n \"bulletGrams\": 3.5,\n \"muzzleSpeed\": 414,\n \"pellets\": 9,\n \"dragPer100m\": 0.45,\n \"kind\": \"buck\"\n },\n {\n \"id\": \"12ga_slug\",\n \"label\": \"12 ga slug\",\n \"diameter\": 18.5,\n \"bulletGrams\": 28,\n \"muzzleSpeed\": 463,\n \"dragPer100m\": 0.3,\n \"kind\": \"slug\"\n },\n {\n \"id\": \"12ga_birdshot\",\n \"label\": \"12 ga birdshot\",\n \"diameter\": 2.4,\n \"bulletGrams\": 0.2,\n \"muzzleSpeed\": 400,\n \"pellets\": 90,\n \"dragPer100m\": 0.6,\n \"kind\": \"birdshot\"\n },\n {\n \"id\": \"20ga_buck\",\n \"label\": \"20 ga buck\",\n \"diameter\": 6.9,\n \"bulletGrams\": 1.3,\n \"muzzleSpeed\": 400,\n \"pellets\": 20,\n \"dragPer100m\": 0.5,\n \"kind\": \"buck\"\n },\n {\n \"id\": \"arrow\",\n \"label\": \"Arrow (compound bow)\",\n \"diameter\": 7,\n \"bulletGrams\": 25,\n \"muzzleSpeed\": 90,\n \"dragPer100m\": 0.12,\n \"kind\": \"arrow\"\n },\n {\n \"id\": \"crossbow_bolt\",\n \"label\": \"Crossbow bolt\",\n \"diameter\": 8,\n \"bulletGrams\": 20,\n \"muzzleSpeed\": 122,\n \"dragPer100m\": 0.12,\n \"kind\": \"bolt\"\n }\n]\n","[\n {\n \"id\": \"hand\",\n \"name\": \"Hand\",\n \"category\": \"hand\",\n \"action\": {\n \"kind\": \"hand\",\n \"reach\": 2\n },\n \"mass\": 0,\n \"tags\": [\n \"grab\"\n ]\n },\n {\n \"id\": \"kick\",\n \"name\": \"Kick\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 250,\n \"radius\": 0.08,\n \"reach\": 1.1,\n \"rpm\": 60,\n \"noise\": 8\n },\n \"mass\": 0\n },\n {\n \"id\": \"shove\",\n \"name\": \"Shove\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 80,\n \"radius\": 0.1,\n \"reach\": 1.5,\n \"rpm\": 90,\n \"noise\": 5\n },\n \"mass\": 0\n },\n {\n \"id\": \"pistol_9mm\",\n \"name\": \"9 mm service pistol\",\n \"category\": \"pistol\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"9x19\",\n \"rpm\": 300,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 15,\n \"reload\": 2,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.6,\n \"recoveryDegPerS\": 4,\n \"recoil\": [\n 1.2,\n 0.4\n ],\n \"range\": 50,\n \"noise\": 150\n },\n \"mass\": 0.9,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"pistol_45\",\n \"name\": \".45 ACP pistol\",\n \"category\": \"pistol\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"45acp\",\n \"rpm\": 280,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 8,\n \"reload\": 2.2,\n \"barrel\": 1,\n \"spreadDeg\": 1.1,\n \"bloomDeg\": 0.8,\n \"recoveryDegPerS\": 4,\n \"recoil\": [\n 1.8,\n 0.6\n ],\n \"range\": 50,\n \"noise\": 160\n },\n \"mass\": 1.1,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"pistol_22\",\n \"name\": \".22 LR pistol\",\n \"category\": \"pistol\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"22lr\",\n \"rpm\": 360,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 10,\n \"reload\": 1.8,\n \"barrel\": 1,\n \"spreadDeg\": 0.9,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 5,\n \"recoil\": [\n 0.5,\n 0.2\n ],\n \"range\": 40,\n \"noise\": 90\n },\n \"mass\": 0.7,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"revolver_357\",\n \"name\": \".357 Magnum revolver\",\n \"category\": \"revolver\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"357mag\",\n \"rpm\": 150,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 6,\n \"reload\": 4,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.8,\n \"bloomDeg\": 1,\n \"recoveryDegPerS\": 3,\n \"recoil\": [\n 3,\n 0.9\n ],\n \"range\": 60,\n \"noise\": 220\n },\n \"mass\": 1.2,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"revolver_38\",\n \"name\": \".38 Special revolver\",\n \"category\": \"revolver\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"38spl\",\n \"rpm\": 160,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 6,\n \"reload\": 3.8,\n \"barrel\": 0.95,\n \"spreadDeg\": 0.9,\n \"bloomDeg\": 0.7,\n \"recoveryDegPerS\": 3.5,\n \"recoil\": [\n 1.6,\n 0.5\n ],\n \"range\": 45,\n \"noise\": 170\n },\n \"mass\": 0.9,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"smg_9mm\",\n \"name\": \"9 mm submachine gun\",\n \"category\": \"smg\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"9x19\",\n \"rpm\": 800,\n \"modes\": [\n \"auto\",\n \"burst\",\n \"semi\"\n ],\n \"burst\": 3,\n \"magazine\": 30,\n \"reload\": 2.4,\n \"barrel\": 1.1,\n \"spreadDeg\": 1.5,\n \"bloomDeg\": 0.35,\n \"recoveryDegPerS\": 6,\n \"recoil\": [\n 0.9,\n 0.5\n ],\n \"range\": 80,\n \"noise\": 180\n },\n \"mass\": 2.6,\n \"tags\": [\n \"automatic\"\n ]\n },\n {\n \"id\": \"carbine_22\",\n \"name\": \".22 LR carbine\",\n \"category\": \"carbine\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"22lr\",\n \"rpm\": 300,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 10,\n \"reload\": 2.2,\n \"barrel\": 1.4,\n \"spreadDeg\": 0.5,\n \"bloomDeg\": 0.15,\n \"recoveryDegPerS\": 5,\n \"recoil\": [\n 0.4,\n 0.15\n ],\n \"range\": 80,\n \"noise\": 100\n },\n \"mass\": 2.4,\n \"tags\": [\n \"small_game\"\n ]\n },\n {\n \"id\": \"rifle_5_56\",\n \"name\": \"5.56 mm assault rifle\",\n \"category\": \"rifle\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"5_56x45\",\n \"rpm\": 750,\n \"modes\": [\n \"auto\",\n \"burst\",\n \"semi\"\n ],\n \"burst\": 3,\n \"magazine\": 30,\n \"reload\": 2.5,\n \"barrel\": 1,\n \"spreadDeg\": 0.6,\n \"bloomDeg\": 0.25,\n \"recoveryDegPerS\": 5,\n \"recoil\": [\n 1,\n 0.6\n ],\n \"range\": 400,\n \"noise\": 300\n },\n \"mass\": 3.4,\n \"tags\": [\n \"automatic\"\n ]\n },\n {\n \"id\": \"rifle_7_62x39\",\n \"name\": \"7.62×39 mm assault rifle\",\n \"category\": \"rifle\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"7_62x39\",\n \"rpm\": 600,\n \"modes\": [\n \"auto\",\n \"semi\"\n ],\n \"magazine\": 30,\n \"reload\": 2.8,\n \"barrel\": 1,\n \"spreadDeg\": 0.8,\n \"bloomDeg\": 0.35,\n \"recoveryDegPerS\": 4.5,\n \"recoil\": [\n 1.5,\n 0.8\n ],\n \"range\": 350,\n \"noise\": 320\n },\n \"mass\": 3.8,\n \"tags\": [\n \"automatic\"\n ]\n },\n {\n \"id\": \"rifle_bolt_308\",\n \"name\": \".308 bolt-action rifle\",\n \"category\": \"rifle\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"7_62x51\",\n \"rpm\": 40,\n \"modes\": [\n \"bolt\"\n ],\n \"magazine\": 5,\n \"reload\": 3.5,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.25,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 3,\n \"recoil\": [\n 3,\n 0.5\n ],\n \"range\": 800,\n \"noise\": 350\n },\n \"mass\": 4,\n \"tags\": [\n \"hunting\"\n ]\n },\n {\n \"id\": \"sniper_338\",\n \"name\": \".338 Lapua sniper rifle\",\n \"category\": \"sniper\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"338lapua\",\n \"rpm\": 35,\n \"modes\": [\n \"bolt\"\n ],\n \"magazine\": 5,\n \"reload\": 4,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.1,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 2.5,\n \"recoil\": [\n 4.5,\n 0.7\n ],\n \"range\": 1500,\n \"noise\": 450\n },\n \"mass\": 6.5,\n \"tags\": [\n \"long_range\"\n ]\n },\n {\n \"id\": \"anti_materiel_50\",\n \"name\": \".50 BMG anti-materiel rifle\",\n \"category\": \"sniper\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"50bmg\",\n \"rpm\": 30,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 10,\n \"reload\": 4.5,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.15,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 2,\n \"recoil\": [\n 7,\n 1.2\n ],\n \"range\": 1800,\n \"noise\": 600\n },\n \"mass\": 12.5,\n \"tags\": [\n \"long_range\",\n \"heavy\"\n ]\n },\n {\n \"id\": \"shotgun_pump_12\",\n \"name\": \"12 gauge pump-action shotgun\",\n \"category\": \"shotgun\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"12ga_00buck\",\n \"rpm\": 60,\n \"modes\": [\n \"pump\"\n ],\n \"magazine\": 6,\n \"reload\": 0.6,\n \"perRound\": true,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 3,\n \"pelletSpreadDeg\": 3,\n \"recoil\": [\n 4,\n 1\n ],\n \"range\": 40,\n \"noise\": 400\n },\n \"mass\": 3.2,\n \"tags\": [\n \"shotgun\"\n ]\n },\n {\n \"id\": \"shotgun_double_12\",\n \"name\": \"12 gauge double-barrel shotgun\",\n \"category\": \"shotgun\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"12ga_00buck\",\n \"rpm\": 120,\n \"modes\": [\n \"break\"\n ],\n \"magazine\": 2,\n \"reload\": 3.5,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 3,\n \"pelletSpreadDeg\": 3,\n \"recoil\": [\n 4.5,\n 1.2\n ],\n \"range\": 35,\n \"noise\": 400\n },\n \"mass\": 3,\n \"tags\": [\n \"shotgun\"\n ]\n },\n {\n \"id\": \"shotgun_semi_12\",\n \"name\": \"12 gauge semi-automatic shotgun\",\n \"category\": \"shotgun\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"12ga_00buck\",\n \"rpm\": 180,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 5,\n \"reload\": 0.7,\n \"perRound\": true,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 3,\n \"pelletSpreadDeg\": 3,\n \"recoil\": [\n 3.4,\n 1\n ],\n \"range\": 40,\n \"noise\": 400\n },\n \"mass\": 3.4,\n \"tags\": [\n \"shotgun\"\n ]\n },\n {\n \"id\": \"bow_compound\",\n \"name\": \"Compound bow\",\n \"category\": \"bow\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"arrow\",\n \"rpm\": 20,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 1,\n \"reload\": 1.5,\n \"barrel\": 1,\n \"spreadDeg\": 0.4,\n \"bloomDeg\": 0.4,\n \"recoveryDegPerS\": 2,\n \"recoil\": [\n 0.3,\n 0.1\n ],\n \"range\": 60,\n \"noise\": 20\n },\n \"mass\": 1.8,\n \"tags\": [\n \"silent\"\n ]\n },\n {\n \"id\": \"crossbow\",\n \"name\": \"Crossbow\",\n \"category\": \"crossbow\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"crossbow_bolt\",\n \"rpm\": 8,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 1,\n \"reload\": 4,\n \"barrel\": 1,\n \"spreadDeg\": 0.3,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 2,\n \"recoil\": [\n 0.5,\n 0.1\n ],\n \"range\": 70,\n \"noise\": 25\n },\n \"mass\": 3,\n \"tags\": [\n \"silent\"\n ]\n },\n {\n \"id\": \"hammer\",\n \"name\": \"Hammer\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 60,\n \"radius\": 0.08,\n \"reach\": 0.7,\n \"rpm\": 70,\n \"noise\": 6\n },\n \"mass\": 1\n },\n {\n \"id\": \"sledgehammer\",\n \"name\": \"Sledgehammer\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 300,\n \"radius\": 0.15,\n \"reach\": 1.1,\n \"rpm\": 30,\n \"noise\": 8\n },\n \"mass\": 5.5,\n \"tags\": [\n \"heavy\"\n ]\n },\n {\n \"id\": \"baseball_bat\",\n \"name\": \"Baseball bat\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 150,\n \"radius\": 0.1,\n \"reach\": 1,\n \"rpm\": 60,\n \"noise\": 7\n },\n \"mass\": 0.9\n },\n {\n \"id\": \"crowbar\",\n \"name\": \"Crowbar\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 120,\n \"radius\": 0.08,\n \"reach\": 0.9,\n \"rpm\": 60,\n \"noise\": 7\n },\n \"mass\": 2,\n \"tags\": [\n \"pry\"\n ]\n },\n {\n \"id\": \"machete\",\n \"name\": \"Machete\",\n \"category\": \"melee_blade\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"slash\",\n \"energy\": 140,\n \"radius\": 0.06,\n \"reach\": 0.8,\n \"rpm\": 80,\n \"noise\": 6\n },\n \"mass\": 0.8\n },\n {\n \"id\": \"axe\",\n \"name\": \"Axe\",\n \"category\": \"melee_blade\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"slash\",\n \"energy\": 250,\n \"radius\": 0.08,\n \"reach\": 0.9,\n \"rpm\": 45,\n \"noise\": 8\n },\n \"mass\": 1.6\n },\n {\n \"id\": \"knife\",\n \"name\": \"Knife\",\n \"category\": \"melee_blade\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"slash\",\n \"energy\": 40,\n \"radius\": 0.03,\n \"reach\": 0.4,\n \"rpm\": 100,\n \"noise\": 5\n },\n \"mass\": 0.2\n },\n {\n \"id\": \"fists\",\n \"name\": \"Fists\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 25,\n \"radius\": 0.1,\n \"reach\": 0.6,\n \"rpm\": 120,\n \"noise\": 5\n },\n \"mass\": 0\n },\n {\n \"id\": \"lighter\",\n \"name\": \"Lighter\",\n \"category\": \"flame\",\n \"action\": {\n \"kind\": \"flame\",\n \"temperature\": 400,\n \"radius\": 0.03,\n \"range\": 0.15,\n \"fuelPerSecond\": 0.02,\n \"fuel\": 60,\n \"noise\": 0\n },\n \"mass\": 0.05,\n \"tags\": [\n \"fire\"\n ]\n },\n {\n \"id\": \"flamethrower\",\n \"name\": \"Flamethrower\",\n \"category\": \"flame\",\n \"action\": {\n \"kind\": \"flame\",\n \"temperature\": 900,\n \"radius\": 0.6,\n \"range\": 6,\n \"fuelPerSecond\": 1,\n \"fuel\": 20,\n \"cone\": true,\n \"noise\": 20\n },\n \"mass\": 15,\n \"tags\": [\n \"fire\"\n ]\n },\n {\n \"id\": \"molotov\",\n \"name\": \"Molotov cocktail\",\n \"category\": \"throwable\",\n \"action\": {\n \"kind\": \"throwable\",\n \"energy\": 500,\n \"radius\": 1.5,\n \"fuse\": 0,\n \"throwSpeed\": 12,\n \"fire\": {\n \"temperature\": 700,\n \"radius\": 1.5,\n \"seconds\": 12\n },\n \"noise\": 60\n },\n \"mass\": 0.8,\n \"tags\": [\n \"fire\",\n \"improvised\"\n ]\n },\n {\n \"id\": \"cutting_torch\",\n \"name\": \"Oxy-fuel cutting torch\",\n \"category\": \"heat\",\n \"action\": {\n \"kind\": \"heat\",\n \"temperature\": 3000,\n \"radius\": 0.02,\n \"range\": 0.25,\n \"fuelPerSecond\": 0.05,\n \"fuel\": 30,\n \"noise\": 15\n },\n \"mass\": 4,\n \"tags\": [\n \"fire\",\n \"cutting\"\n ]\n },\n {\n \"id\": \"blowtorch\",\n \"name\": \"Blowtorch\",\n \"category\": \"heat\",\n \"action\": {\n \"kind\": \"heat\",\n \"temperature\": 1300,\n \"radius\": 0.04,\n \"range\": 0.3,\n \"fuelPerSecond\": 0.04,\n \"fuel\": 30,\n \"noise\": 10\n },\n \"mass\": 0.6,\n \"tags\": [\n \"fire\"\n ]\n },\n {\n \"id\": \"frag_grenade\",\n \"name\": \"Fragmentation grenade\",\n \"category\": \"throwable\",\n \"action\": {\n \"kind\": \"throwable\",\n \"energy\": 200000,\n \"radius\": 6,\n \"fuse\": 4,\n \"throwSpeed\": 15,\n \"noise\": 400\n },\n \"mass\": 0.45,\n \"tags\": [\n \"explosive\"\n ]\n },\n {\n \"id\": \"pipe_bomb\",\n \"name\": \"Pipe bomb\",\n \"category\": \"throwable\",\n \"action\": {\n \"kind\": \"throwable\",\n \"energy\": 100000,\n \"radius\": 4,\n \"fuse\": 3,\n \"throwSpeed\": 13,\n \"noise\": 350\n },\n \"mass\": 0.7,\n \"tags\": [\n \"explosive\",\n \"improvised\"\n ]\n },\n {\n \"id\": \"screwdriver\",\n \"name\": \"Screwdriver\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"screwdriver\",\n \"reach\": 0.5,\n \"noise\": 5\n },\n \"mass\": 0.15\n },\n {\n \"id\": \"wrench\",\n \"name\": \"Wrench\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"wrench\",\n \"reach\": 0.6,\n \"noise\": 6\n },\n \"mass\": 0.5\n },\n {\n \"id\": \"pry_bar\",\n \"name\": \"Pry bar\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"pry_bar\",\n \"reach\": 0.8,\n \"noise\": 8\n },\n \"mass\": 0.8\n },\n {\n \"id\": \"hacksaw\",\n \"name\": \"Hacksaw\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"saw\",\n \"reach\": 0.7,\n \"noise\": 10\n },\n \"mass\": 0.6\n },\n {\n \"id\": \"utility_knife\",\n \"name\": \"Utility knife\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"knife\",\n \"reach\": 0.3,\n \"noise\": 3\n },\n \"mass\": 0.1\n },\n {\n \"id\": \"claw_hammer\",\n \"name\": \"Claw hammer\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"hammer\",\n \"reach\": 0.5,\n \"noise\": 8\n },\n \"mass\": 0.7\n },\n {\n \"id\": \"extinguisher\",\n \"name\": \"Fire extinguisher\",\n \"category\": \"extinguisher\",\n \"action\": {\n \"kind\": \"extinguisher\",\n \"range\": 4,\n \"coolC\": 300,\n \"charge\": 12,\n \"noise\": 25\n },\n \"mass\": 5,\n \"tags\": [\n \"safety\"\n ]\n }\n]\n","/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type WeaponsLocale = 'en' | 'pt-BR'\n\nexport interface WeaponsStrings {\n /** Display name of each weapon id. */\n weapons: Record<string, string>\n /** Display name of each fire mode. */\n modes: Record<string, string>\n /** Display name of each weapon category. */\n categories: Record<string, string>\n}\n\nconst modesEn = { single: 'single action', semi: 'semi-automatic', burst: 'burst', auto: 'automatic', pump: 'pump action', bolt: 'bolt action', lever: 'lever action', break: 'break action' }\nconst categoriesEn = {\n pistol: 'pistol', revolver: 'revolver', smg: 'submachine gun', rifle: 'rifle', carbine: 'carbine', sniper: 'sniper rifle', shotgun: 'shotgun',\n bow: 'bow', crossbow: 'crossbow', melee_blunt: 'blunt melee', melee_blade: 'bladed melee', flame: 'flame', heat: 'heat', throwable: 'throwable',\n tool: 'tool', extinguisher: 'extinguisher', hand: 'hand',\n}\n\nexport const locales: Record<WeaponsLocale, WeaponsStrings> = {\n en: {\n weapons: {\n hand: 'Hand', kick: 'Kick', shove: 'Shove', pistol_9mm: '9 mm service pistol', pistol_45: '.45 ACP pistol', pistol_22: '.22 LR pistol', revolver_357: '.357 Magnum revolver',\n revolver_38: '.38 Special revolver', smg_9mm: '9 mm submachine gun', carbine_22: '.22 LR carbine', rifle_5_56: '5.56 mm assault rifle',\n rifle_7_62x39: '7.62×39 mm assault rifle', rifle_bolt_308: '.308 bolt-action rifle', sniper_338: '.338 Lapua sniper rifle',\n anti_materiel_50: '.50 BMG anti-materiel rifle', shotgun_pump_12: '12 gauge pump-action shotgun', shotgun_double_12: '12 gauge double-barrel shotgun',\n shotgun_semi_12: '12 gauge semi-automatic shotgun', bow_compound: 'Compound bow', crossbow: 'Crossbow', hammer: 'Hammer', sledgehammer: 'Sledgehammer',\n baseball_bat: 'Baseball bat', crowbar: 'Crowbar', machete: 'Machete', axe: 'Axe', knife: 'Knife', fists: 'Fists', lighter: 'Lighter',\n flamethrower: 'Flamethrower', molotov: 'Molotov cocktail', cutting_torch: 'Oxy-fuel cutting torch', blowtorch: 'Blowtorch',\n frag_grenade: 'Fragmentation grenade', pipe_bomb: 'Pipe bomb', screwdriver: 'Screwdriver', wrench: 'Wrench', pry_bar: 'Pry bar', hacksaw: 'Hacksaw',\n utility_knife: 'Utility knife', claw_hammer: 'Claw hammer', extinguisher: 'Fire extinguisher',\n },\n modes: modesEn,\n categories: categoriesEn,\n },\n 'pt-BR': {\n weapons: {\n hand: 'mão', kick: 'chute', shove: 'empurrão', pistol_9mm: 'pistola 9 mm', pistol_45: 'pistola .45', pistol_22: 'pistola .22', revolver_357: 'revólver .357', revolver_38: 'revólver .38',\n smg_9mm: 'submetralhadora 9 mm', carbine_22: 'carabina .22', rifle_5_56: 'fuzil 5,56', rifle_7_62x39: 'fuzil 7,62×39', rifle_bolt_308: 'fuzil de ferrolho .308',\n sniper_338: 'fuzil de precisão .338', anti_materiel_50: 'fuzil antimaterial .50', shotgun_pump_12: 'espingarda de repetição calibre 12',\n shotgun_double_12: 'espingarda de dois canos calibre 12', shotgun_semi_12: 'espingarda semiautomática calibre 12', bow_compound: 'arco composto',\n crossbow: 'besta', hammer: 'martelo', sledgehammer: 'marreta', baseball_bat: 'taco de beisebol', crowbar: 'pé de cabra', machete: 'facão', axe: 'machado',\n knife: 'faca', fists: 'punhos', lighter: 'isqueiro', flamethrower: 'lança-chamas', molotov: 'coquetel molotov', cutting_torch: 'maçarico de corte',\n blowtorch: 'maçarico', frag_grenade: 'granada de fragmentação', pipe_bomb: 'bomba caseira', screwdriver: 'chave de fenda', wrench: 'chave inglesa',\n pry_bar: 'alavanca', hacksaw: 'serra de arco', utility_knife: 'estilete', claw_hammer: 'martelo de unha', extinguisher: 'extintor',\n },\n modes: { single: 'tiro único', semi: 'semiautomático', burst: 'rajada', auto: 'automático', pump: 'repetição', bolt: 'ferrolho', lever: 'alavanca', break: 'basculante' },\n categories: {\n pistol: 'pistola', revolver: 'revólver', smg: 'submetralhadora', rifle: 'fuzil', carbine: 'carabina', sniper: 'fuzil de precisão', shotgun: 'espingarda',\n bow: 'arco', crossbow: 'besta', melee_blunt: 'corpo a corpo contundente', melee_blade: 'corpo a corpo cortante', flame: 'chama', heat: 'calor',\n throwable: 'arremessável', tool: 'ferramenta', extinguisher: 'extintor', hand: 'mão',\n },\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): WeaponsStrings => locales[(locale as WeaponsLocale) ?? 'en'] ?? locales.en\n","import type { Vec3 } from './types'\n\n/** Deterministic mulberry32 generator; returns floats in [0, 1). */\nexport const createRng = (seed: number): (() => number) => {\n let a = seed >>> 0\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\nexport const normalize = (v: Vec3): Vec3 => {\n const l = Math.hypot(v[0], v[1], v[2])\n return l > 1e-12 ? [v[0] / l, v[1] / l, v[2] / l] : [0, 0, -1]\n}\n\nconst cross = (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\n\n/** Uniform direction inside a cone of half-angle `deg` around the unit vector `dir` (uniform over the solid angle). */\nexport const sampleCone = (dir: Vec3, deg: number, rng: () => number): Vec3 => {\n if (deg <= 0) return dir\n const cosMax = Math.cos((deg * Math.PI) / 180)\n const cosT = 1 - rng() * (1 - cosMax)\n const sinT = Math.sqrt(Math.max(0, 1 - cosT * cosT))\n const phi = rng() * Math.PI * 2\n const helper: Vec3 = Math.abs(dir[1]) < 0.9 ? [0, 1, 0] : [1, 0, 0]\n const u = normalize(cross(helper, dir))\n const v = cross(dir, u)\n const cx = Math.cos(phi) * sinT\n const cy = Math.sin(phi) * sinT\n return normalize([\n u[0] * cx + v[0] * cy + dir[0] * cosT,\n u[1] * cx + v[1] * cy + dir[1] * cosT,\n u[2] * cx + v[2] * cy + dir[2] * cosT,\n ])\n}\n","import { createRng, normalize, sampleCone } from './rng'\nimport type {\n CaliberDef,\n FireMode,\n Shot,\n TriggerResult,\n Use,\n Vec3,\n WeaponAction,\n WeaponDef,\n WeaponState,\n} from './types'\n\nconst EPS = 1e-9\nconst DEFAULT_THROWABLES = 3\n/** Total spread (base + bloom) never exceeds this many times the base spread. */\nexport const BLOOM_CAP = 4\n/** Fraction of the throw speed added upwards so a throw arcs. */\nconst THROW_LIFT = 0.15\n\n/** Muzzle energy in joules of ONE projectile (a bullet, or one pellet): 0.5 × mass × speed², speed scaled by the barrel factor. */\nexport const muzzleEnergy = (caliber: CaliberDef, barrel = 1): number => {\n const v = caliber.muzzleSpeed * barrel\n return 0.5 * (caliber.bulletGrams / 1000) * v * v\n}\n\nexport interface WeaponStateInit {\n def: WeaponDef\n caliber: CaliberDef | null\n seed: number\n reserve?: number\n}\n\nconst result = (status: TriggerResult['status'], extra: Partial<TriggerResult> = {}): TriggerResult => ({\n shots: [],\n uses: [],\n status,\n recoil: [0, 0],\n noise: 0,\n ...extra,\n})\n\n/** Runtime of one weapon. See `WeaponState` for the contract. */\nexport class WeaponRuntime implements WeaponState {\n readonly def: WeaponDef\n readonly caliber: CaliberDef | null\n reserve: number\n mode: FireMode\n private _ammo: number\n private readonly _capacity: number\n private readonly action: WeaponAction\n private readonly rng: () => number\n private readonly initialReserve: number\n\n private clock = 0\n /** Time already advanced by the other of update / trigger in the same frame (so calling both does not count `dt` twice). */\n private pend: { src: 'update' | 'trigger'; amt: number } | null = null\n private readyAt = 0\n private latched = false\n\n private _reloading = false\n private reloadEnd = 0\n\n /** Bloom degrees at `extraClock`. */\n private extra = 0\n private extraClock = 0\n\n constructor(init: WeaponStateInit) {\n this.def = init.def\n this.caliber = init.caliber\n this.action = init.def.action\n this.rng = createRng(init.seed)\n const a = this.action\n this.mode = a.kind === 'firearm' ? a.modes[0] ?? 'single' : 'single'\n switch (a.kind) {\n case 'firearm':\n this._capacity = a.magazine\n break\n case 'flame':\n case 'heat':\n this._capacity = a.fuel\n break\n case 'extinguisher':\n this._capacity = a.charge\n break\n case 'throwable':\n this._capacity = a.count ?? DEFAULT_THROWABLES\n break\n default:\n this._capacity = 0\n }\n this._ammo = this._capacity\n this.initialReserve = init.reserve ?? (a.kind === 'firearm' ? a.magazine * 3 : 0)\n this.reserve = this.initialReserve\n }\n\n get ammo(): number {\n return this._ammo\n }\n get capacity(): number {\n return this._capacity\n }\n get reloading(): boolean {\n return this._reloading\n }\n get spread(): number {\n if (this.action.kind !== 'firearm') return 0\n return this.action.spreadDeg + this.extraAt(this.clock)\n }\n\n private extraAt(t: number): number {\n if (this.action.kind !== 'firearm') return 0\n const rec = this.action.recoveryDegPerS ?? 4\n return Math.max(0, this.extra - rec * Math.max(0, t - this.extraClock))\n }\n\n // --- time -----------------------------------------------------------------------------------------------------------------------\n\n update(dt: number): void {\n const d = Math.max(0, dt)\n let eff = d\n if (this.pend && this.pend.src === 'trigger') {\n eff = Math.max(0, d - this.pend.amt)\n this.pend = null\n } else {\n this.pend = { src: 'update', amt: d }\n }\n this.clock += eff\n this.settle(this.clock)\n }\n\n /** Complete the reload steps that finish at or before `t`. */\n private settle(t: number): void {\n const a = this.action\n if (a.kind !== 'firearm') return\n while (this._reloading && this.reloadEnd <= t + EPS) {\n if (a.perRound) {\n if (this.reserve > 0 && this._ammo < this._capacity) {\n this._ammo += 1\n this.reserve -= 1\n }\n if (this._ammo >= this._capacity || this.reserve <= 0) this._reloading = false\n else this.reloadEnd += a.reload\n } else {\n const take = Math.min(this._capacity - this._ammo, this.reserve)\n this._ammo += take\n this.reserve -= take\n this._reloading = false\n }\n }\n }\n\n // --- commands -------------------------------------------------------------------------------------------------------------------\n\n release(): void {\n this.latched = false\n }\n\n reload(): boolean {\n const a = this.action\n if (a.kind === 'throwable') {\n if (this._ammo >= this._capacity || this.reserve <= 0) return false\n this._ammo += 1\n this.reserve -= 1\n return true\n }\n if (a.kind !== 'firearm' || this._reloading) return false\n if (this._ammo >= this._capacity || this.reserve <= 0) return false\n this._reloading = true\n this.reloadEnd = this.clock + a.reload\n return true\n }\n\n cycleMode(): FireMode {\n if (this.action.kind !== 'firearm') return this.mode\n const modes = this.action.modes\n const i = modes.indexOf(this.mode)\n this.mode = modes[(i + 1) % modes.length] ?? this.mode\n return this.mode\n }\n\n refill(): void {\n this._ammo = this._capacity\n this.reserve = this.initialReserve\n this._reloading = false\n this.readyAt = this.clock\n this.latched = false\n this.extra = 0\n }\n\n // --- trigger --------------------------------------------------------------------------------------------------------------------\n\n trigger(origin: Vec3, direction: Vec3, dt: number, held = false, source?: string): TriggerResult {\n const d = Math.max(0, dt)\n let overlap = 0\n if (this.pend && this.pend.src === 'update') {\n overlap = Math.min(this.pend.amt, d)\n this.pend = null\n } else {\n this.pend = { src: 'trigger', amt: d }\n }\n const start = this.clock - overlap\n const end = start + d\n this.settle(start)\n\n const dir = normalize(direction)\n let res: TriggerResult\n const a = this.action\n switch (a.kind) {\n case 'firearm':\n res = this.fireFirearm(a, origin, dir, start, end, held, source)\n break\n case 'melee':\n res = this.fireMelee(a, origin, dir, start, end)\n break\n case 'flame':\n case 'heat':\n res = this.fireFuel(a, origin, dir, d)\n break\n case 'extinguisher':\n res = this.fireExtinguisher(a, origin, dir, d)\n break\n case 'throwable':\n res = this.fireThrowable(a, origin, dir, held)\n break\n case 'tool':\n res = d > 0 ? result('ok', { uses: [{ kind: 'tool', tool: a.tool, reach: a.reach, duration: d, origin, direction: dir }], noise: a.noise }) : result('ok')\n break\n case 'hand':\n res = this.oncePerPull(held)\n ? result('ok', { uses: [{ kind: 'hand', reach: a.reach, origin, direction: dir }] })\n : result('cooldown')\n break\n }\n this.clock = Math.max(this.clock, end)\n this.settle(this.clock)\n return res\n }\n\n /** Semi-style gating: a held trigger that already fired does nothing until `release()` or a new pull (`held` false). */\n private oncePerPull(held: boolean): boolean {\n if (!held) this.latched = false\n if (this.latched) return false\n this.latched = true\n return true\n }\n\n private fireFirearm(a: Extract<WeaponAction, { kind: 'firearm' }>, origin: Vec3, dir: Vec3, start: number, end: number, held: boolean, source?: string): TriggerResult {\n if (this._reloading) {\n if (a.perRound && this._ammo > 0) this._reloading = false // a tube reload is interrupted by the trigger\n else return result('reloading')\n }\n const auto = this.mode === 'auto'\n if (!auto && !this.oncePerPull(held)) return result('cooldown')\n if (this._ammo <= 0) return result('empty')\n\n const iv = 60 / a.rpm\n const t0 = Math.max(start, this.readyAt)\n if (t0 > end + EPS) return result('cooldown')\n\n const res = result('ok')\n const fire = (t: number): void => {\n this.fireOne(a, origin, dir, t, res, source)\n }\n if (auto) {\n for (let t = t0, n = 0; this._ammo > 0 && (n === 0 ? t <= end + EPS : t < end - EPS); t += iv, n++) fire(t)\n } else if (this.mode === 'burst') {\n const count = Math.min(a.burst ?? 3, this._ammo)\n for (let k = 0; k < count; k++) fire(t0 + k * iv)\n } else {\n fire(t0)\n }\n return res\n }\n\n private fireOne(a: Extract<WeaponAction, { kind: 'firearm' }>, origin: Vec3, dir: Vec3, t: number, res: TriggerResult, source?: string): void {\n const cal = this.caliber as CaliberDef\n const barrel = a.barrel ?? 1\n const speed = cal.muzzleSpeed * barrel\n const energy = muzzleEnergy(cal, barrel)\n const drag = cal.dragPer100m ?? 0.1\n const energyAt = (distance: number): number => {\n const f = Math.pow(1 - drag, Math.max(0, distance) / 100)\n return energy * f * f\n }\n const bloomNow = this.extraAt(t)\n const spread = a.spreadDeg + bloomNow\n const aim = sampleCone(dir, spread, this.rng)\n const pellets = cal.pellets ?? 1\n const pelletSpread = pellets > 1 ? a.pelletSpreadDeg ?? 3 : 0\n for (let p = 0; p < pellets; p++) {\n const shot: Shot = {\n origin: [origin[0], origin[1], origin[2]],\n direction: sampleCone(aim, pelletSpread, this.rng),\n energy,\n caliber: cal.diameter,\n caliberId: cal.id,\n speed,\n energyAt,\n pellet: p,\n weapon: this.def.id,\n }\n if (source !== undefined) shot.source = source\n res.shots.push(shot)\n }\n this._ammo -= 1\n this.readyAt = t + 60 / a.rpm\n this.extra = Math.min(bloomNow + (a.bloomDeg ?? 0), a.spreadDeg * (BLOOM_CAP - 1))\n this.extraClock = t\n res.recoil = [res.recoil[0] + a.recoil[0], res.recoil[1] + (this.rng() * 2 - 1) * a.recoil[1]]\n res.noise = a.noise\n }\n\n private fireMelee(a: Extract<WeaponAction, { kind: 'melee' }>, origin: Vec3, dir: Vec3, start: number, end: number): TriggerResult {\n const t0 = Math.max(start, this.readyAt)\n if (t0 > end + EPS) return result('cooldown')\n this.readyAt = t0 + 60 / a.rpm\n const use: Use = { kind: 'melee', damage: a.damage, energy: a.energy, radius: a.radius, reach: a.reach, origin, direction: dir }\n return result('ok', { uses: [use], noise: a.noise })\n }\n\n private fireFuel(a: Extract<WeaponAction, { kind: 'flame' | 'heat' }>, origin: Vec3, dir: Vec3, dt: number): TriggerResult {\n if (this._ammo <= EPS) return result('no_fuel')\n if (dt <= 0) return result('ok')\n const need = a.fuelPerSecond * dt\n let duration = dt\n if (need > this._ammo) {\n duration = dt * (this._ammo / need)\n this._ammo = 0\n } else {\n this._ammo -= need\n }\n const use: Use =\n a.kind === 'flame'\n ? { kind: 'flame', temperature: a.temperature, radius: a.radius, range: a.range, cone: a.cone ?? false, duration, origin, direction: dir }\n : { kind: 'heat', temperature: a.temperature, radius: a.radius, range: a.range, duration, origin, direction: dir }\n return result('ok', { uses: [use], noise: a.noise })\n }\n\n private fireExtinguisher(a: Extract<WeaponAction, { kind: 'extinguisher' }>, origin: Vec3, dir: Vec3, dt: number): TriggerResult {\n if (this._ammo <= EPS) return result('no_fuel')\n if (dt <= 0) return result('ok')\n const duration = Math.min(dt, this._ammo)\n this._ammo -= duration\n return result('ok', { uses: [{ kind: 'extinguish', range: a.range, coolC: a.coolC, duration, origin, direction: dir }], noise: a.noise })\n }\n\n private fireThrowable(a: Extract<WeaponAction, { kind: 'throwable' }>, origin: Vec3, dir: Vec3, held: boolean): TriggerResult {\n if (!this.oncePerPull(held)) return result('cooldown')\n if (this._ammo <= 0) return result('empty')\n this._ammo -= 1\n const velocity: Vec3 = [dir[0] * a.throwSpeed, dir[1] * a.throwSpeed + a.throwSpeed * THROW_LIFT, dir[2] * a.throwSpeed]\n const use: Use = { kind: 'throw', energy: a.energy, radius: a.radius, fuse: a.fuse, velocity, origin }\n if (a.fire) use.fire = { ...a.fire }\n return result('ok', { uses: [use], noise: a.noise })\n }\n}\n","import calibersJson from './data/calibers.json'\nimport weaponsJson from './data/weapons.json'\nimport { resolveStrings } from './locale'\nimport type { Arsenal, ArsenalOptions, CaliberDef, CaliberId, WeaponCategory, WeaponDef, WeaponId, WeaponState } from './types'\nimport { muzzleEnergy, WeaponRuntime } from './weapon'\n\nexport const CALIBERS = calibersJson as unknown as CaliberDef[]\nexport const WEAPONS = weaponsJson as unknown as WeaponDef[]\n\n/** A reasonable starting kit for a test room or a sandbox. */\nexport const DEFAULT_LOADOUT: WeaponId[] = [\n 'hand', 'kick', 'shove', 'pistol_9mm', 'revolver_357', 'shotgun_pump_12', 'rifle_5_56', 'rifle_bolt_308', 'hammer', 'axe', 'machete', 'utility_knife', 'crowbar', 'lighter', 'flamethrower',\n 'cutting_torch', 'molotov', 'frag_grenade', 'screwdriver', 'wrench', 'pry_bar', 'hacksaw', 'extinguisher',\n]\n\nexport { muzzleEnergy }\n\n/** Create an arsenal: the built-in calibres and weapons merged (by id) with the ones in `options`. */\nexport const createArsenal = (options: ArsenalOptions = {}): Arsenal => {\n const calibers = new Map<CaliberId, CaliberDef>()\n for (const c of [...CALIBERS, ...(options.calibers ?? [])]) calibers.set(c.id, c)\n const weapons = new Map<WeaponId, WeaponDef>()\n for (const w of [...WEAPONS, ...(options.weapons ?? [])]) weapons.set(w.id, w)\n const strings = resolveStrings(options.locale)\n const baseSeed = options.seed ?? 1\n let counter = 0\n\n const create = (id: WeaponId, opts: { seed?: number; reserve?: number } = {}): WeaponState => {\n const def = weapons.get(id)\n if (!def) throw new Error(`game-weapons: unknown weapon \"${id}\"`)\n let caliber: CaliberDef | null = null\n if (def.action.kind === 'firearm') {\n caliber = calibers.get(def.action.caliber) ?? null\n if (!caliber) throw new Error(`game-weapons: weapon \"${id}\" uses unknown calibre \"${def.action.caliber}\"`)\n }\n counter += 1\n const seed = opts.seed ?? (baseSeed + Math.imul(counter, 0x9e3779b1)) >>> 0\n return new WeaponRuntime({ def, caliber, seed, reserve: opts.reserve })\n }\n\n return {\n calibers,\n weapons,\n create,\n muzzleEnergy(caliber, barrel = 1) {\n const c = calibers.get(caliber)\n if (!c) throw new Error(`game-weapons: unknown calibre \"${caliber}\"`)\n return muzzleEnergy(c, barrel)\n },\n name(id) {\n const w = weapons.get(id)\n if (w) return strings.weapons[id] ?? w.name ?? id\n return strings.modes[id] ?? strings.categories[id] ?? calibers.get(id)?.label ?? id\n },\n list(category?: WeaponCategory) {\n const all = [...weapons.values()]\n return category ? all.filter((w) => w.category === category) : all\n },\n }\n}\n","[\n {\n \"id\": \"water\",\n \"color\": 11064558,\n \"opacity\": 0.35,\n \"stainColor\": 7309206,\n \"viscosity\": 1,\n \"density\": 1000,\n \"dryTime\": 600,\n \"gloss\": 0.9,\n \"drink\": {\n \"thirst\": 100,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"clear\"\n ]\n },\n {\n \"id\": \"coffee\",\n \"color\": 3875604,\n \"opacity\": 0.95,\n \"stainColor\": 2824202,\n \"viscosity\": 1.5,\n \"density\": 1005,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 80,\n \"effects\": [\n \"caffeine\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"tea\",\n \"color\": 9063188,\n \"opacity\": 0.8,\n \"stainColor\": 6961682,\n \"viscosity\": 1.4,\n \"density\": 1005,\n \"dryTime\": 800,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"steamC\": 60,\n \"drink\": {\n \"thirst\": 90,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"hot\"\n ]\n },\n {\n \"id\": \"milk\",\n \"color\": 16052712,\n \"opacity\": 0.98,\n \"stainColor\": 14473160,\n \"viscosity\": 2,\n \"density\": 1030,\n \"dryTime\": 900,\n \"gloss\": 0.5,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 70,\n \"effects\": []\n },\n \"tags\": [\n \"drink\"\n ]\n },\n {\n \"id\": \"soda\",\n \"color\": 3808530,\n \"opacity\": 0.85,\n \"stainColor\": 2757901,\n \"viscosity\": 1.3,\n \"density\": 1040,\n \"dryTime\": 1200,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 60,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"juice\",\n \"color\": 15239467,\n \"opacity\": 0.9,\n \"stainColor\": 12741916,\n \"viscosity\": 2,\n \"density\": 1045,\n \"dryTime\": 1100,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 75,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"beer\",\n \"color\": 14259740,\n \"opacity\": 0.8,\n \"stainColor\": 11039764,\n \"viscosity\": 1.4,\n \"density\": 1010,\n \"dryTime\": 900,\n \"gloss\": 0.8,\n \"drink\": {\n \"thirst\": 50,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"wine\",\n \"color\": 7016223,\n \"opacity\": 0.9,\n \"stainColor\": 5048854,\n \"viscosity\": 1.6,\n \"density\": 990,\n \"dryTime\": 800,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 40,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"spirits\",\n \"color\": 13214042,\n \"opacity\": 0.6,\n \"stainColor\": 10320959,\n \"viscosity\": 1.8,\n \"density\": 940,\n \"dryTime\": 200,\n \"gloss\": 0.85,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 5,\n \"effects\": [\n \"alcohol\"\n ]\n },\n \"tags\": [\n \"drink\",\n \"alcohol\"\n ]\n },\n {\n \"id\": \"fuel\",\n \"color\": 14926682,\n \"opacity\": 0.6,\n \"stainColor\": 7232298,\n \"viscosity\": 0.6,\n \"density\": 740,\n \"dryTime\": 120,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\",\n \"gasoline\"\n ]\n },\n {\n \"id\": \"diesel\",\n \"color\": 12098094,\n \"opacity\": 0.8,\n \"stainColor\": 5917208,\n \"viscosity\": 3,\n \"density\": 830,\n \"dryTime\": 3600,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"fuel\"\n ]\n },\n {\n \"id\": \"motor_oil\",\n \"color\": 3877388,\n \"opacity\": 0.95,\n \"stainColor\": 1840134,\n \"viscosity\": 100,\n \"density\": 880,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\"\n ]\n },\n {\n \"id\": \"cooking_oil\",\n \"color\": 14267708,\n \"opacity\": 0.85,\n \"stainColor\": 11110698,\n \"viscosity\": 60,\n \"density\": 920,\n \"dryTime\": 0,\n \"gloss\": 1,\n \"leavesMark\": true,\n \"flammable\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"oil\",\n \"food\"\n ]\n },\n {\n \"id\": \"blood\",\n \"color\": 7997964,\n \"opacity\": 0.92,\n \"stainColor\": 4850950,\n \"viscosity\": 4,\n \"density\": 1060,\n \"dryTime\": 1200,\n \"gloss\": 0.75,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": [\n \"disgust\"\n ]\n },\n \"tags\": [\n \"organic\"\n ]\n },\n {\n \"id\": \"sap\",\n \"color\": 13146940,\n \"opacity\": 0.8,\n \"stainColor\": 10122282,\n \"viscosity\": 200,\n \"density\": 1100,\n \"dryTime\": 3600,\n \"gloss\": 0.8,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 20,\n \"effects\": []\n },\n \"tags\": [\n \"organic\",\n \"sticky\"\n ]\n },\n {\n \"id\": \"acid\",\n \"color\": 10146378,\n \"opacity\": 0.6,\n \"stainColor\": 7313970,\n \"viscosity\": 1.5,\n \"density\": 1200,\n \"dryTime\": 900,\n \"gloss\": 0.9,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"paint\",\n \"color\": 11740715,\n \"opacity\": 0.98,\n \"stainColor\": 9050655,\n \"viscosity\": 300,\n \"density\": 1300,\n \"dryTime\": 1800,\n \"gloss\": 0.6,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"paint\"\n ]\n },\n {\n \"id\": \"bleach\",\n \"color\": 15134688,\n \"opacity\": 0.7,\n \"stainColor\": 13621446,\n \"viscosity\": 1.2,\n \"density\": 1100,\n \"dryTime\": 900,\n \"gloss\": 0.85,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 0,\n \"effects\": [\n \"poison\"\n ]\n },\n \"tags\": [\n \"corrosive\"\n ]\n },\n {\n \"id\": \"honey\",\n \"color\": 14193162,\n \"opacity\": 0.9,\n \"stainColor\": 12089350,\n \"viscosity\": 3000,\n \"density\": 1420,\n \"dryTime\": 14400,\n \"gloss\": 0.95,\n \"leavesMark\": true,\n \"drink\": {\n \"thirst\": 10,\n \"effects\": []\n },\n \"tags\": [\n \"drink\",\n \"sticky\"\n ]\n }\n]","import liquidsData from './data/liquids.json'\nimport type { LiquidDef } from './types'\n\n/**\n * Built-in liquids (data in `data/liquids.json`; colours are `0xRRGGBB` stored as integers).\n * Viscosity is relative to water, density in kg/m³, `dryTime` in seconds for a thin film at 20 °C (0 = never dries).\n */\nexport const LIQUIDS: LiquidDef[] = liquidsData as unknown as LiquidDef[]\n","import type { Quat, Vec3 } from './types'\n\nexport const GRAVITY = 9.81\nexport const EPS = 1e-7\n\nexport const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\nexport const add = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\nexport const sub = (a: Vec3, b: Vec3): Vec3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\nexport const scale = (a: Vec3, s: number): Vec3 => [a[0] * s, a[1] * s, a[2] * s]\nexport const dot = (a: Vec3, b: Vec3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\nexport const cross = (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\nexport const length = (a: Vec3): number => Math.hypot(a[0], a[1], a[2])\nexport const distance = (a: Vec3, b: Vec3): number => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\nexport const normalize = (a: Vec3, fallback: Vec3 = [0, 1, 0]): Vec3 => {\n const l = length(a)\n return l < 1e-9 ? [fallback[0], fallback[1], fallback[2]] : [a[0] / l, a[1] / l, a[2] / l]\n}\nexport const copy3 = (a: Vec3): Vec3 => [a[0], a[1], a[2]]\nexport const lerp3 = (a: Vec3, b: Vec3, t: number): Vec3 => [lerp(a[0], b[0], t), lerp(a[1], b[1], t), lerp(a[2], b[2], t)]\n\n/** Rotate `v` by the unit quaternion `q` (x, y, z, w). */\nexport const quatRotate = (q: Quat, v: Vec3): Vec3 => {\n const u: Vec3 = [q[0], q[1], q[2]]\n const c1 = cross(u, v)\n const c2 = cross(u, c1)\n return [v[0] + 2 * (q[3] * c1[0] + c2[0]), v[1] + 2 * (q[3] * c1[1] + c2[1]), v[2] + 2 * (q[3] * c1[2] + c2[2])]\n}\nexport const quatConjugate = (q: Quat): Quat => [-q[0], -q[1], -q[2], q[3]]\nexport const quatMultiply = (a: Quat, b: Quat): Quat => [\n a[3] * b[0] + a[0] * b[3] + a[1] * b[2] - a[2] * b[1],\n a[3] * b[1] - a[0] * b[2] + a[1] * b[3] + a[2] * b[0],\n a[3] * b[2] + a[0] * b[1] - a[1] * b[0] + a[2] * b[3],\n a[3] * b[3] - a[0] * b[0] - a[1] * b[1] - a[2] * b[2],\n]\nexport const quatNormalize = (q: Quat): Quat => {\n const l = Math.hypot(q[0], q[1], q[2], q[3])\n return l < 1e-9 ? [0, 0, 0, 1] : [q[0] / l, q[1] / l, q[2] / l, q[3] / l]\n}\n/** Quaternion from Euler angles in XYZ order (the same convention as three.js). */\nexport const quatFromEuler = (x: number, y: number, z: number): Quat => {\n const c1 = Math.cos(x / 2)\n const c2 = Math.cos(y / 2)\n const c3 = Math.cos(z / 2)\n const s1 = Math.sin(x / 2)\n const s2 = Math.sin(y / 2)\n const s3 = Math.sin(z / 2)\n return [s1 * c2 * c3 + c1 * s2 * s3, c1 * s2 * c3 - s1 * c2 * s3, c1 * c2 * s3 + s1 * s2 * c3, c1 * c2 * c3 - s1 * s2 * s3]\n}\n\n/** Small seeded generator (mulberry32). Its whole state is one integer, so it serialises trivially. */\nexport class Rng {\n state: number\n constructor(seed: number) {\n this.state = (Math.imul((seed | 0) ^ 0x9e3779b9, 0x85ebca6b) >>> 0) || 1\n }\n next(): number {\n this.state = (this.state + 0x6d2b79f5) >>> 0\n let t = this.state\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 type { StreamState, Vec3 } from './types'\nimport { dot, sub } from './math'\nimport type { Basis } from './stains'\n\nexport const GROUND_ID = 'ground'\n/** Longest flight simulated for a stream before it counts as landing nowhere. */\nexport const MAX_FLIGHT = 3\n\n/** Position of a ballistic jet `t` seconds after leaving its origin. */\nexport const ballistic = (origin: Vec3, velocity: Vec3, gravity: number, t: number): Vec3 => [\n origin[0] + velocity[0] * t,\n origin[1] + velocity[1] * t - 0.5 * gravity * t * t,\n origin[2] + velocity[2] * t,\n]\n\n/** Point of a stream's path `t` seconds after its origin (use with `StreamState.flightTime` and the world's `gravity`). */\nexport const sampleStream = (stream: Pick<StreamState, 'origin' | 'velocity'>, gravity: number, t: number): Vec3 =>\n ballistic(stream.origin, stream.velocity, gravity, t)\n\nexport interface LandingSurface extends Basis {\n id: string\n point: Vec3\n half: [number, number]\n}\n\nexport interface Hit {\n t: number\n point: Vec3\n normal: Vec3\n surface: string\n /** Velocity of the jet at impact. */\n velocity: Vec3\n}\n\nconst velocityAt = (velocity: Vec3, gravity: number, t: number): Vec3 => [velocity[0], velocity[1] - gravity * t, velocity[2]]\n\n/** First thing a jet hits: an authored surface (plane with half extents) or else the ground. */\nexport const trace = (\n surfaces: Iterable<LandingSurface>,\n groundAt: (x: number, z: number) => number,\n origin: Vec3,\n velocity: Vec3,\n gravity: number,\n): Hit | null => {\n let best: Hit | null = null\n for (const s of surfaces) {\n const n = s.normal\n const c = dot(n, sub(origin, s.point))\n if (c < -0.005) continue\n const a = -0.5 * gravity * n[1]\n const b = dot(n, velocity)\n let t = Infinity\n if (Math.abs(a) < 1e-9) {\n if (b < -1e-9) t = -c / b\n } else {\n const disc = b * b - 4 * a * c\n if (disc >= 0) {\n const sq = Math.sqrt(disc)\n for (const root of [(-b - sq) / (2 * a), (-b + sq) / (2 * a)]) {\n if (root >= -1e-6 && b + 2 * a * root < 0 && root < t) t = root\n }\n }\n }\n if (!Number.isFinite(t) || t > MAX_FLIGHT) continue\n t = Math.max(0, t)\n if (best && t >= best.t) continue\n const p = ballistic(origin, velocity, gravity, t)\n const rel = sub(p, s.point)\n if (Math.abs(dot(rel, s.t1)) > s.half[0] || Math.abs(dot(rel, s.t2)) > s.half[1]) continue\n best = { t, point: p, normal: n, surface: s.id, velocity: velocityAt(velocity, gravity, t) }\n }\n\n // Ground: march the path and refine the crossing.\n const step = 0.02\n let prevT = 0\n const startOver = origin[1] - groundAt(origin[0], origin[2])\n const limit = best ? best.t : MAX_FLIGHT\n if (startOver <= 0) {\n return best && best.t <= 0 ? best : { t: 0, point: [origin[0], groundAt(origin[0], origin[2]), origin[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity }\n }\n for (let t = step; t <= limit + step; t += step) {\n const tt = Math.min(t, limit)\n const p = ballistic(origin, velocity, gravity, tt)\n const over = p[1] - groundAt(p[0], p[2])\n if (over <= 0) {\n let lo = prevT\n let hi = tt\n for (let i = 0; i < 18; i++) {\n const mid = (lo + hi) / 2\n const q = ballistic(origin, velocity, gravity, mid)\n if (q[1] - groundAt(q[0], q[2]) > 0) lo = mid\n else hi = mid\n }\n if (best && hi >= best.t - 1e-3) return best\n const q = ballistic(origin, velocity, gravity, hi)\n return { t: hi, point: [q[0], groundAt(q[0], q[2]), q[2]], normal: [0, 1, 0], surface: GROUND_ID, velocity: velocityAt(velocity, gravity, hi) }\n }\n prevT = tt\n if (tt >= limit) break\n }\n return best\n}\n","import type { FluidEvent, LiquidId } from './types'\n\n/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type FluidLocale = 'en' | 'pt-BR'\n\nexport interface FluidStrings {\n /** Display name per liquid id (unknown ids fall back to the id itself). */\n liquids: Record<LiquidId, string>\n /** Short label per event type. */\n events: Record<FluidEvent['type'], string>\n on: string\n off: string\n}\n\nexport const locales: Record<FluidLocale, FluidStrings> = {\n en: {\n liquids: {\n water: 'water',\n coffee: 'coffee',\n tea: 'tea',\n milk: 'milk',\n soda: 'soda',\n juice: 'juice',\n beer: 'beer',\n wine: 'wine',\n spirits: 'spirits',\n fuel: 'gasoline',\n diesel: 'diesel',\n motor_oil: 'motor oil',\n cooking_oil: 'cooking oil',\n blood: 'blood',\n sap: 'sap',\n acid: 'acid',\n paint: 'paint',\n bleach: 'bleach',\n honey: 'honey',\n },\n events: {\n fill: 'filled',\n pour: 'poured',\n spill: 'spilled',\n leak: 'leaking',\n drink: 'drank',\n empty: 'emptied',\n stream_end: 'stream ended',\n splash: 'splash',\n stain: 'stain',\n dried: 'dried',\n steam: 'steam',\n mix: 'mixed',\n tap: 'tap',\n },\n on: 'on',\n off: 'off',\n },\n 'pt-BR': {\n liquids: {\n water: 'água',\n coffee: 'café',\n tea: 'chá',\n milk: 'leite',\n soda: 'refrigerante',\n juice: 'suco',\n beer: 'cerveja',\n wine: 'vinho',\n spirits: 'destilado',\n fuel: 'gasolina',\n diesel: 'diesel',\n motor_oil: 'óleo de motor',\n cooking_oil: 'óleo de cozinha',\n blood: 'sangue',\n sap: 'seiva',\n acid: 'ácido',\n paint: 'tinta',\n bleach: 'água sanitária',\n honey: 'mel',\n },\n events: {\n fill: 'encheu',\n pour: 'despejou',\n spill: 'derramou',\n leak: 'vazando',\n drink: 'bebeu',\n empty: 'esvaziou',\n stream_end: 'parou de escorrer',\n splash: 'respingo',\n stain: 'mancha',\n dried: 'secou',\n steam: 'vapor',\n mix: 'misturou',\n tap: 'torneira',\n },\n on: 'ligado',\n off: 'desligado',\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): FluidStrings => locales[(locale as FluidLocale) ?? 'en'] ?? locales.en\n\nconst fmt = (n: number): string => `${(Math.round(n * 1000) / 1000).toString()} l`\nconst pt = (p: [number, number, number]): string => `(${p.map((v) => Math.round(v * 100) / 100).join(', ')})`\n\n/** One-line description of an event for logs and debug panels, e.g. `drank: coffee 0.03 l`. */\nexport const describeEvent = (strings: FluidStrings, event: FluidEvent): string => {\n const label = strings.events[event.type]\n const name = (id: LiquidId) => strings.liquids[id] ?? id\n switch (event.type) {\n case 'fill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}`\n case 'pour':\n case 'spill':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s`\n case 'leak':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.rate)}/s ${pt(event.point)}`\n case 'drink':\n return `${label}: ${event.container} ${name(event.liquid)} ${fmt(event.liters)}${event.effects.length ? ` [${event.effects.join(', ')}]` : ''}${event.burn ? ' !' : ''}`\n case 'empty':\n return `${label}: ${event.container}`\n case 'stream_end':\n return `${label}: ${event.stream}`\n case 'splash':\n return `${label}: ${name(event.liquid)} ${pt(event.point)}`\n case 'stain':\n return `${label}: ${event.stain} ${name(event.liquid)} ${event.surface} ${pt(event.point)}`\n case 'dried':\n return `${label}: ${event.stain}${event.mark ? ' (mark)' : ''}`\n case 'steam':\n return `${label}: ${event.container} ${event.on ? strings.on : strings.off}`\n case 'mix':\n return `${label}: ${event.container} ${name(event.from)} -> ${name(event.into)}`\n case 'tap':\n return `${label}: ${event.tap} ${event.on ? strings.on : strings.off}`\n }\n}\n","import type { ContainerSpec, Vec3 } from './types'\nimport { clamp, normalize } from './math'\n\nexport type Shape = ContainerSpec['shape']\n\n/** Sample columns of a container's inner volume: equal-weight (x, z) positions with the full height `h`. */\nexport interface Columns {\n x: Float64Array\n z: Float64Array\n h: number\n /** Radius (cylinder) or half extents (box) used for the extent of a plane. */\n kind: 'cylinder' | 'box'\n r: number\n hx: number\n hz: number\n}\n\nconst RINGS = 8\nconst SEGMENTS = 16\nconst GRID = 12\n\nexport const makeColumns = (shape: Shape): Columns => {\n if (shape.kind === 'cylinder') {\n const x = new Float64Array(RINGS * SEGMENTS)\n const z = new Float64Array(RINGS * SEGMENTS)\n let n = 0\n for (let k = 0; k < RINGS; k++) {\n const rr = shape.radius * Math.sqrt((k + 0.5) / RINGS)\n for (let m = 0; m < SEGMENTS; m++) {\n // Offset every other ring so the samples do not line up radially.\n const a = ((m + (k % 2) * 0.5) / SEGMENTS) * Math.PI * 2\n x[n] = Math.cos(a) * rr\n z[n] = Math.sin(a) * rr\n n++\n }\n }\n return { x, z, h: shape.height, kind: 'cylinder', r: shape.radius, hx: shape.radius, hz: shape.radius }\n }\n const [sx, sy, sz] = shape.size\n const x = new Float64Array(GRID * GRID)\n const z = new Float64Array(GRID * GRID)\n let n = 0\n for (let i = 0; i < GRID; i++) {\n for (let j = 0; j < GRID; j++) {\n x[n] = ((i + 0.5) / GRID - 0.5) * sx\n z[n] = ((j + 0.5) / GRID - 0.5) * sz\n n++\n }\n }\n return { x, z, h: sy, kind: 'box', r: Math.hypot(sx, sz) / 2, hx: sx / 2, hz: sz / 2 }\n}\n\n/** Range of `u · p` over the container: below `lo` it is empty, above `hi` it is full. */\nexport const planeRange = (c: Columns, u: Vec3): [number, number] => {\n const horizontal = c.kind === 'cylinder' ? c.r * Math.hypot(u[0], u[2]) : Math.abs(u[0]) * c.hx + Math.abs(u[2]) * c.hz\n const top = u[1] * c.h\n return [-horizontal + Math.min(0, top), horizontal + Math.max(0, top)]\n}\n\n/** Fraction (0..1) of the inner volume with `u · p <= d` (the liquid for a surface plane with normal `u` at offset `d`). */\nexport const planeFraction = (c: Columns, u: Vec3, d: number): number => {\n const uy = u[1]\n let total = 0\n const n = c.x.length\n for (let i = 0; i < n; i++) {\n const s0 = u[0] * c.x[i] + u[2] * c.z[i]\n let len: number\n if (uy > 1e-6) len = clamp((d - s0) / uy, 0, c.h)\n else if (uy < -1e-6) len = c.h - clamp((d - s0) / uy, 0, c.h)\n else len = s0 <= d ? c.h : 0\n total += len\n }\n return total / (n * c.h)\n}\n\n/** Plane offset `d` along unit normal `u` for which the liquid takes the volume fraction `f`. */\nexport const levelFor = (c: Columns, u: Vec3, f: number): number => {\n const [lo0, hi0] = planeRange(c, u)\n if (f <= 0) return lo0\n if (f >= 1) return hi0\n if (Math.abs(u[0]) + Math.abs(u[2]) < 1e-9) {\n return u[1] > 0 ? f * c.h * u[1] : u[1] * c.h - f * c.h * u[1]\n }\n let lo = lo0\n let hi = hi0\n for (let i = 0; i < 28; i++) {\n const mid = (lo + hi) / 2\n if (planeFraction(c, u, mid) < f) lo = mid\n else hi = mid\n }\n return (lo + hi) / 2\n}\n\n/** Radius of the lip circle (the opening); a closed spec (`opening` 0) uses half the container width once opened. */\nexport const lipRadius = (shape: Shape, opening: number): number => {\n const limit = shape.kind === 'cylinder' ? shape.radius : Math.min(shape.size[0], shape.size[2]) / 2\n return opening > 0 ? Math.min(opening, limit) : limit * 0.5\n}\n\nexport const shapeHeight = (shape: Shape): number => (shape.kind === 'cylinder' ? shape.height : shape.size[1])\n\nexport interface Lip {\n /** Lowest lip point along the surface normal, container space. */\n point: Vec3\n /** Centre of the lip circle, container space. */\n center: Vec3\n /** Outward direction (container space, horizontal in the container frame) the liquid leaves along, or null when upright. */\n outward: Vec3 | null\n /** `u · point`: the surface offset above which the liquid spills. */\n level: number\n}\n\nexport const lipOf = (shape: Shape, opening: number, u: Vec3): Lip => {\n const h = shapeHeight(shape)\n const ro = lipRadius(shape, opening)\n const center: Vec3 = [0, h, 0]\n const uh = Math.hypot(u[0], u[2])\n if (uh < 1e-6) return { point: center, center, outward: null, level: u[1] * h }\n const out: Vec3 = normalize([-u[0], 0, -u[2]])\n const point: Vec3 = [out[0] * ro, h, out[2] * ro]\n return { point, center, outward: out, level: u[0] * point[0] + u[1] * point[1] + u[2] * point[2] }\n}\n","import type { LiquidDef, StainState, Vec3 } from './types'\nimport { Rng, add, clamp, cross, dot, length, normalize, scale, sub } from './math'\n\n/** Number of radial samples of the flow front. */\nexport const SAMPLES = 16\n\nconst COS: number[] = []\nconst SIN: number[] = []\nfor (let i = 0; i < SAMPLES; i++) {\n COS.push(Math.cos((i / SAMPLES) * Math.PI * 2))\n SIN.push(Math.sin((i / SAMPLES) * Math.PI * 2))\n}\n\n/** Orthonormal frame of a surface: `normal`, `t1` (tangent) and `t2 = normal × t1`. */\nexport interface Basis {\n normal: Vec3\n t1: Vec3\n t2: Vec3\n}\n\nexport const makeBasis = (normalIn: Vec3, tangentIn?: Vec3): Basis => {\n const normal = normalize(normalIn)\n const ref: Vec3 = tangentIn && length(tangentIn) > 1e-6 ? tangentIn : Math.abs(normal[1]) > 0.9 ? [1, 0, 0] : [0, 1, 0]\n const t1 = normalize(sub(ref, scale(normal, dot(ref, normal))), [1, 0, 0])\n return { normal, t1, t2: cross(normal, t1) }\n}\n\n/** What a stain needs to know about the surface it lies on. */\nexport interface StainSurface extends Basis {\n point: Vec3\n half: [number, number]\n porosity: number\n}\n\nexport interface StainInt extends StainState {\n normal: Vec3\n tangent: Vec3\n noise: number[]\n /** Seconds since the last inflow. */\n sinceInflow: number\n /** Drying progress 0..1. */\n dry: number\n mark: boolean\n age: number\n}\n\n/** Direction (world space) of radial sample `i` on a surface frame. */\nexport const sampleDir = (b: Basis, i: number): Vec3 => [\n b.t1[0] * COS[i] + b.t2[0] * SIN[i],\n b.t1[1] * COS[i] + b.t2[1] * SIN[i],\n b.t1[2] * COS[i] + b.t2[2] * SIN[i],\n]\n\nexport const stainArea = (front: number[]): number => {\n let a = 0\n for (let i = 0; i < SAMPLES; i++) a += front[i] * front[(i + 1) % SAMPLES]\n return 0.5 * Math.sin((Math.PI * 2) / SAMPLES) * a\n}\n\nexport const meanRadius = (front: number[]): number => front.reduce((s, v) => s + v, 0) / front.length\n\n/** Thickness (m) a puddle of this liquid cannot get thinner than: 1 mm for water, thicker for viscous liquids. */\nexport const minFilm = (def: LiquidDef): number => 0.001 * (1 + 0.8 * Math.log10(Math.max(1, def.viscosity)))\n\n/** Per-direction growth multipliers: low harmonics plus smoothed seeded noise, so the outline is never a disc. */\nexport const makeNoise = (rng: Rng): number[] => {\n const amp = [0.12 + rng.next() * 0.18, 0.08 + rng.next() * 0.14, 0.05 + rng.next() * 0.08]\n const phase = [rng.next() * Math.PI * 2, rng.next() * Math.PI * 2, rng.next() * Math.PI * 2]\n const raw: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n const a = (i / SAMPLES) * Math.PI * 2\n let v = 1 + (rng.next() - 0.5) * 0.3\n for (let k = 0; k < 3; k++) v += amp[k] * Math.sin((k + 2) * a + phase[k])\n raw.push(v)\n }\n const out = raw.map((v, i) => 0.25 * raw[(i + SAMPLES - 1) % SAMPLES] + 0.5 * v + 0.25 * raw[(i + 1) % SAMPLES])\n return out.map((v) => clamp(v, 0.45, 1.7))\n}\n\n/** Horizontal run direction on a surface (downhill, unit, in the plane) and the slope strength 0..1 (sin of the angle). */\nexport const downhill = (normal: Vec3): { dir: Vec3; slope: number } => {\n const d = add([0, -1, 0], scale(normal, normal[1]))\n const slope = length(d)\n return slope < 1e-6 ? { dir: [0, 0, 0], slope: 0 } : { dir: scale(d, 1 / slope), slope }\n}\n\n/** Creates a stain at `center` (on the surface) with a small starting front. */\nexport const createStain = (\n id: string,\n surfaceId: string,\n def: LiquidDef,\n basis: Basis,\n center: Vec3,\n liters: number,\n rng: Rng,\n): StainInt => {\n const r0 = clamp(Math.sqrt(liters / 1000 / minFilm(def) / Math.PI) * 0.4, 0.012, 0.12)\n return {\n id,\n surface: surfaceId,\n liquid: def.id,\n center: [center[0], center[1], center[2]],\n front: new Array(SAMPLES).fill(r0),\n liters,\n soaked: 0,\n wetness: 1,\n wetRadius: 1,\n normal: basis.normal,\n tangent: basis.t1,\n noise: makeNoise(rng),\n sinceInflow: 0,\n dry: 0,\n mark: false,\n age: 0,\n }\n}\n\n/** Adds liquid to a stain (rewets a dried mark). `velocity` makes the front stretch the way the liquid came in. */\nexport const addInflow = (s: StainInt, liters: number, velocity: Vec3 | null): void => {\n s.liters += liters\n s.sinceInflow = 0\n if (s.dry > 0 || s.mark) {\n s.dry = 0\n s.mark = false\n s.wetness = 1\n s.wetRadius = 1\n }\n if (velocity) {\n const n = s.normal\n const tangential = sub(velocity, scale(n, dot(velocity, n)))\n if (length(tangential) > 0.2) s.flow = normalize(tangential)\n }\n}\n\n/** Moves the centre towards an inflow point without moving the outline. */\nexport const nudgeCenter = (s: StainInt, point: Vec3, weight: number, basis: Basis): void => {\n const delta = scale(sub(point, s.center), weight)\n if (length(delta) < 1e-6) return\n s.center = add(s.center, delta)\n for (let i = 0; i < SAMPLES; i++) s.front[i] = Math.max(0.008, s.front[i] - dot(delta, sampleDir(basis, i)))\n}\n\nexport type StainStatus = 'alive' | 'dried_mark' | 'dried_gone'\n\n/** Largest radius along each sample direction before the centre's surface rectangle ends. */\nconst edgeLimit = (s: StainInt, surface: StainSurface, i: number): number => {\n if (!Number.isFinite(surface.half[0]) && !Number.isFinite(surface.half[1])) return Infinity\n const rel = sub(s.center, surface.point)\n const cx = dot(rel, surface.t1)\n const cy = dot(rel, surface.t2)\n let limit = Infinity\n if (COS[i] > 1e-6) limit = Math.min(limit, (surface.half[0] - cx) / COS[i])\n else if (COS[i] < -1e-6) limit = Math.min(limit, (-surface.half[0] - cx) / COS[i])\n if (SIN[i] > 1e-6) limit = Math.min(limit, (surface.half[1] - cy) / SIN[i])\n else if (SIN[i] < -1e-6) limit = Math.min(limit, (-surface.half[1] - cy) / SIN[i])\n return Math.max(0.01, limit)\n}\n\n/**\n * Advances a stain: the front grows (faster downhill, with seeded noise, tapering as the area approaches what the liquid can cover at its\n * minimum film thickness), porous surfaces soak the pool, and once the inflow stopped the stain dries from the edge in.\n */\nexport const stepStain = (s: StainInt, def: LiquidDef, surface: StainSurface, ambientC: number, dt: number): StainStatus => {\n s.age += dt\n s.sinceInflow += dt\n const basis: Basis = surface\n const { dir: down, slope } = downhill(s.normal)\n\n // Soak into porous surfaces.\n if (s.liters > 0 && surface.porosity > 0) {\n const soak = Math.min(s.liters, surface.porosity * 0.2 * stainArea(s.front) * dt)\n s.liters -= soak\n s.soaked += soak\n }\n\n // Grow the flow front.\n if (s.liters > 1e-7 && s.wetness > 0) {\n const area = stainArea(s.front)\n const cover = s.liters / 1000 / (minFilm(def) * (1 - 0.7 * slope))\n if (area < cover) {\n const taper = clamp(1 - area / cover, 0, 1)\n const v0 = (0.02 + 0.2 * Math.sqrt(s.liters)) / Math.sqrt(Math.max(1, def.viscosity))\n const delta: number[] = []\n for (let i = 0; i < SAMPLES; i++) {\n let m = s.noise[i]\n if (s.flow) m *= 1 + 0.5 * Math.max(0, dot(sampleDir(basis, i), s.flow))\n if (slope > 0.02) {\n const a = dot(sampleDir(basis, i), down)\n m *= a > 0 ? 1 + 14 * slope * a : Math.max(0.1, 1 + 2.5 * slope * a)\n }\n delta.push(Math.max(0, Math.min(s.front[i] + v0 * m * taper * dt, edgeLimit(s, surface, i)) - s.front[i]))\n }\n // Never overshoot the area the liquid can cover: scale the growth (not the outline) down to fit.\n let lambda = 1\n const apply = (k: number) => s.front.map((r, i) => r + delta[i] * k)\n if (stainArea(apply(1)) > cover) {\n let lo = 0\n let hi = 1\n for (let i = 0; i < 14; i++) {\n const mid = (lo + hi) / 2\n if (stainArea(apply(mid)) > cover) hi = mid\n else lo = mid\n }\n lambda = lo\n }\n s.front = apply(lambda)\n }\n }\n\n // Dry from the edge in once the inflow stopped.\n if (s.sinceInflow > 1 && def.dryTime > 0 && s.dry < 1) {\n const warm = Math.pow(2, (ambientC - 20) / 12)\n const ds = (dt * warm * (1 + 0.5 * surface.porosity)) / def.dryTime\n const before = s.dry\n s.dry = Math.min(1, s.dry + ds)\n if (before < 1) s.liters *= 1 - (s.dry - before) / (1 - before)\n s.wetness = 1 - s.dry\n s.wetRadius = Math.sqrt(Math.max(0, 1 - s.dry))\n if (s.dry >= 1) {\n s.liters = 0\n s.wetness = 0\n s.wetRadius = 0\n if (def.leavesMark) {\n s.mark = true\n return 'dried_mark'\n }\n return 'dried_gone'\n }\n }\n return 'alive'\n}\n\n/** Unit direction (world space) of front sample `i` of a stain, from its `normal` and `tangent`. */\nexport const stainDirection = (s: Pick<StainState, 'normal' | 'tangent'>, i: number): Vec3 => sampleDir(makeBasis(s.normal ?? [0, 1, 0], s.tangent), i)\n","import { LIQUIDS } from './liquids'\nimport { GROUND_ID, MAX_FLIGHT, ballistic, trace } from './landing'\nimport type { Hit, LandingSurface } from './landing'\nimport { describeEvent, resolveStrings } from './locale'\nimport { GRAVITY, Rng, add, clamp, copy3, cross, distance, dot, length, normalize, quatConjugate, quatRotate, scale } from './math'\nimport { levelFor, lipOf, lipRadius, makeColumns, planeFraction, planeRange, shapeHeight } from './shapes'\nimport type { Columns } from './shapes'\nimport { addInflow, createStain, makeBasis, meanRadius, nudgeCenter, stepStain } from './stains'\nimport type { Basis, StainInt, StainSurface } from './stains'\nimport type {\n ContainerSpec,\n ContainerState,\n FluidEvent,\n FluidOptions,\n FluidWorld,\n LiquidDef,\n LiquidId,\n Quat,\n StainState,\n StreamCause,\n StreamState,\n SurfaceSpec,\n Vec3,\n} from './types'\n\ninterface Hole {\n point: Vec3\n normal: Vec3\n diameter: number\n}\n\ninterface ContainerInt {\n id: string\n spec: ContainerSpec\n cols: Columns\n liquid: LiquidId | null\n liters: number\n temperature: number\n closed: boolean\n position: Vec3\n rotation: Quat\n velocity: Vec3\n prevVelocity: Vec3\n hasPrev: boolean\n holes: Hole[]\n /** Slosh of the liquid surface: tilt offsets and their rates (x, z, vx, vz). */\n slosh: [number, number, number, number]\n /** Surface normal in world space (up plus slosh) and in container space, and the surface offset along it. */\n normal: Vec3\n u: Vec3\n d: number\n steaming: boolean\n outflow: number\n /** Stream key (`spill`, `pour`, `leak:<n>`) to stream id. */\n streams: Record<string, string>\n pourRate: number\n pourTTL: number\n pourVisual: boolean\n lastMix: number\n}\n\ninterface TapInt {\n id: string\n position: Vec3\n direction: Vec3\n liquid: LiquidId\n rate: number\n temperature: number\n on: boolean\n stream?: string\n}\n\ninterface StreamInt extends StreamState {\n key: string\n lastSplash: number\n visualOnly: boolean\n temperature: number\n}\n\ninterface SurfaceInt extends SurfaceSpec, StainSurface {}\n\ninterface Snapshot {\n version: 1\n time: number\n rng: number\n counters: { container: number; stream: number; stain: number; tap?: number }\n taps?: TapInt[]\n containers: Array<Omit<ContainerInt, 'cols'>>\n surfaces: SurfaceSpec[]\n streams: StreamInt[]\n stains: StainInt[]\n}\n\nconst GROUND_POROSITY = 0.2\nconst MAX_STEP = 0.1\nconst MAX_SUBSTEPS = 50\nconst MAX_HOLES = 32\n\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v)) as T\n\nexport function createFluids(options: FluidOptions = {}): FluidWorld {\n const strings = resolveStrings(options.locale)\n const liquids = new Map<LiquidId, LiquidDef>()\n for (const def of LIQUIDS) liquids.set(def.id, def)\n for (const def of options.liquids ?? []) liquids.set(def.id, def)\n const ambientC = options.ambientC ?? 20\n const gravity = options.gravity ?? GRAVITY\n const groundAt = options.groundAt ?? (() => 0)\n const mergeDistance = options.mergeDistance ?? 0.15\n const maxStains = options.maxStains ?? 64\n\n let rng = new Rng(options.seed ?? 1)\n let time = 0\n const counters = { container: 0, stream: 0, stain: 0, tap: 0 }\n let containers = new Map<string, ContainerInt>()\n let surfaces = new Map<string, SurfaceInt>()\n let streams = new Map<string, StreamInt>()\n let taps = new Map<string, TapInt>()\n let stains = new Map<string, StainInt>()\n const listeners = new Map<string, Set<(e: FluidEvent) => void>>()\n let queue: FluidEvent[] = []\n /** Only events produced by `update` are queued and returned by it; direct calls just notify the listeners. */\n let updating = false\n\n const groundSurface: StainSurface = {\n normal: [0, 1, 0],\n t1: [1, 0, 0],\n t2: [0, 0, -1],\n point: [0, 0, 0],\n half: [Infinity, Infinity],\n porosity: GROUND_POROSITY,\n }\n\n // ---- events ----\n\n const emit = (e: FluidEvent): void => {\n if (updating) queue.push(e)\n options.onEvent?.(e)\n listeners.get(e.type)?.forEach((fn) => fn(e))\n listeners.get('*')?.forEach((fn) => fn(e))\n }\n\n // ---- helpers ----\n\n const toWorld = (c: ContainerInt, p: Vec3): Vec3 => add(c.position, quatRotate(c.rotation, p))\n const defOf = (c: ContainerInt): LiquidDef | null => (c.liquid ? (liquids.get(c.liquid) ?? null) : null)\n const viscScale = (def: LiquidDef): number => 1 / Math.sqrt(Math.max(1, def.viscosity))\n\n const refreshLevel = (c: ContainerInt): void => {\n c.normal = normalize([c.slosh[0], 1, c.slosh[1]])\n c.u = normalize(quatRotate(quatConjugate(c.rotation), c.normal))\n c.d = levelFor(c.cols, c.u, c.spec.capacity > 0 ? c.liters / c.spec.capacity : 0)\n }\n\n const surfaceFor = (id: string): StainSurface => (id === GROUND_ID ? groundSurface : (surfaces.get(id) ?? groundSurface))\n\n const landingSurfaces = (): LandingSurface[] => {\n const list: LandingSurface[] = []\n for (const [id, s] of surfaces) list.push({ id, normal: s.normal, t1: s.t1, t2: s.t2, point: s.point, half: s.half })\n return list\n }\n\n const stopStream = (id: string): void => {\n const s = streams.get(id)\n if (!s) return\n streams.delete(id)\n const c = s.container ? containers.get(s.container) : undefined\n if (c) delete c.streams[s.key]\n const tap = s.tap ? taps.get(s.tap) : undefined\n if (tap && tap.stream === id) tap.stream = undefined\n emit({ type: 'stream_end', stream: id })\n }\n\n const endStreamKey = (c: ContainerInt, key: string): void => {\n const id = c.streams[key]\n if (id) stopStream(id)\n }\n\n /** Create or update the stream under `key` of a container; creating one emits the matching cause event. */\n const syncStream = (\n c: ContainerInt,\n key: string,\n cause: StreamCause,\n rate: number,\n origin: Vec3,\n velocity: Vec3,\n visualOnly = false,\n ): void => {\n if (rate < 1e-5 || !c.liquid) {\n endStreamKey(c, key)\n return\n }\n const existing = c.streams[key] ? streams.get(c.streams[key]) : undefined\n if (existing) {\n existing.rate = rate\n existing.origin = origin\n existing.velocity = velocity\n existing.thin = rate < 0.04\n existing.visualOnly = visualOnly\n existing.temperature = c.temperature\n return\n }\n const id = `stream_${++counters.stream}`\n const stream: StreamInt = {\n id,\n liquid: c.liquid,\n cause,\n container: c.id,\n origin,\n velocity,\n rate,\n landing: null,\n thin: rate < 0.04,\n flightTime: MAX_FLIGHT,\n key,\n lastSplash: -1,\n visualOnly,\n temperature: c.temperature,\n }\n streams.set(id, stream)\n c.streams[key] = id\n if (cause === 'leak') emit({ type: 'leak', container: c.id, liquid: c.liquid, rate, stream: id, point: copy3(origin) })\n else if (cause === 'spill') emit({ type: 'spill', container: c.id, liquid: c.liquid, rate, stream: id })\n else emit({ type: 'pour', container: c.id, liquid: c.liquid, rate, stream: id })\n }\n\n /** Speed (m/s) at which a tap's liquid leaves the nozzle. */\n const TAP_SPEED = 1.2\n\n /** Create or update the `tap` stream of a tap that is on; end it when it is off. */\n const syncTap = (t: TapInt): void => {\n if (!t.on || t.rate < 1e-5 || !liquids.has(t.liquid)) {\n if (t.stream) stopStream(t.stream)\n return\n }\n const velocity: Vec3 = [t.direction[0] * TAP_SPEED, t.direction[1] * TAP_SPEED, t.direction[2] * TAP_SPEED]\n const existing = t.stream ? streams.get(t.stream) : undefined\n if (existing) {\n existing.rate = t.rate\n existing.thin = t.rate < 0.04\n existing.temperature = t.temperature\n existing.velocity = velocity\n return\n }\n const id = `stream_${++counters.stream}`\n streams.set(id, {\n id,\n liquid: t.liquid,\n cause: 'tap',\n tap: t.id,\n origin: copy3(t.position),\n velocity,\n rate: t.rate,\n landing: null,\n thin: t.rate < 0.04,\n flightTime: MAX_FLIGHT,\n key: `tap:${t.id}`,\n lastSplash: -1,\n visualOnly: false,\n temperature: t.temperature,\n })\n t.stream = id\n }\n\n /** Where and how fast the liquid leaves over the lowest lip point. */\n const lipFlow = (c: ContainerInt, head: number): { origin: Vec3; velocity: Vec3 } => {\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const origin = toWorld(c, lip.point)\n let dir: Vec3 = [1, 0, 0]\n const horizontal = (v: Vec3): Vec3 | null => (Math.hypot(v[0], v[2]) > 1e-3 ? normalize([v[0], 0, v[2]]) : null)\n if (lip.outward) dir = horizontal(quatRotate(c.rotation, lip.outward)) ?? horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n else dir = horizontal(quatRotate(c.rotation, [1, 0, 0])) ?? dir\n const speed = clamp(0.3 + 0.5 * Math.sqrt(2 * gravity * Math.max(0, head)), 0.2, 2.5)\n return { origin, velocity: [dir[0] * speed, -0.1, dir[2] * speed] }\n }\n\n const removeLiters = (c: ContainerInt, amount: number): void => {\n c.liters = Math.max(0, c.liters - amount)\n }\n\n /** Clear a container that ran out and emit `empty` once. */\n const settle = (c: ContainerInt): void => {\n if (c.liquid && c.liters <= 1e-6) {\n c.liters = 0\n c.liquid = null\n emit({ type: 'empty', container: c.id })\n }\n }\n\n const fillInternal = (c: ContainerInt, liquid: LiquidId, liters: number, temperature: number | undefined, announce: boolean): number => {\n if (!(liters > 0) || !liquids.has(liquid)) return 0\n const room = c.spec.capacity - c.liters\n const accepted = Math.min(liters, Math.max(0, room))\n if (accepted <= 0) return 0\n const t = temperature ?? ambientC\n if (c.liquid && c.liquid !== liquid && c.liters > 1e-6) {\n const incomingWins = accepted > c.liters\n const into = incomingWins ? liquid : c.liquid\n const from = incomingWins ? c.liquid : liquid\n if (announce || time - c.lastMix > 0.5) {\n c.lastMix = time\n emit({ type: 'mix', container: c.id, from, into })\n }\n c.liquid = into\n } else if (!c.liquid || c.liters <= 1e-6) {\n c.liquid = liquid\n }\n c.temperature = c.liters > 1e-6 ? (c.temperature * c.liters + t * accepted) / (c.liters + accepted) : t\n c.liters += accepted\n if (announce) emit({ type: 'fill', container: c.id, liquid, liters: accepted })\n return accepted\n }\n\n // ---- stains ----\n\n const stainAt = (surfaceId: string, liquid: LiquidId, point: Vec3): StainInt | null => {\n let best: StainInt | null = null\n let bestD = Infinity\n for (const s of stains.values()) {\n if (s.surface !== surfaceId || s.liquid !== liquid) continue\n const d = distance(point, s.center)\n if (d < mergeDistance + 0.5 * meanRadius(s.front) && d < bestD) {\n best = s\n bestD = d\n }\n }\n return best\n }\n\n const evictStain = (): void => {\n let victim: StainInt | null = null\n for (const s of stains.values()) {\n const rank = (x: StainInt) => (x.wetness <= 0 ? 0 : 1) * 1e9 - x.age\n if (!victim || rank(s) < rank(victim)) victim = s\n }\n if (victim) stains.delete(victim.id)\n }\n\n const deposit = (liquid: LiquidId, hit: Pick<Hit, 'point' | 'surface' | 'normal'>, liters: number, velocity: Vec3 | null): void => {\n const def = liquids.get(liquid)\n if (!def || liters <= 0) return\n let s = stainAt(hit.surface, liquid, hit.point)\n if (s) {\n const basis: Basis = { normal: s.normal, t1: s.tangent, t2: cross(s.normal, s.tangent) }\n nudgeCenter(s, hit.point, clamp((liters / (s.liters + liters)) * 0.5, 0, 0.5), basis)\n addInflow(s, liters, velocity)\n return\n }\n while (stains.size >= maxStains) evictStain()\n const surface = surfaceFor(hit.surface)\n const basis: Basis = hit.surface === GROUND_ID ? makeBasis(hit.normal) : surface\n s = createStain(`stain_${++counters.stain}`, hit.surface, def, basis, hit.point, liters, rng)\n if (velocity) addInflow(s, 0, velocity)\n s.sinceInflow = 0\n stains.set(s.id, s)\n emit({ type: 'stain', stain: s.id, surface: hit.surface, liquid, point: copy3(hit.point) })\n }\n\n // ---- streams ----\n\n const lipCenterWorld = (c: ContainerInt): Vec3 => toWorld(c, [0, shapeHeight(c.spec.shape), 0])\n\n /** A container whose opening the jet passes through before it lands (pouring into a cup). */\n const catcher = (s: StreamInt, landingT: number): { container: ContainerInt; t: number; point: Vec3 } | null => {\n let best: { container: ContainerInt; t: number; point: Vec3 } | null = null\n for (const oc of containers.values()) {\n if (oc.id === s.container || oc.closed || oc.liters >= oc.spec.capacity) continue\n const lip = lipCenterWorld(oc)\n const disc = s.velocity[1] * s.velocity[1] - 2 * gravity * (lip[1] - s.origin[1])\n if (disc < 0) continue\n const t = (s.velocity[1] + Math.sqrt(disc)) / gravity\n if (t <= 0 || t >= landingT || (best && t >= best.t)) continue\n const p = ballistic(s.origin, s.velocity, gravity, t)\n if (Math.hypot(p[0] - lip[0], p[2] - lip[2]) <= lipRadius(oc.spec.shape, oc.spec.opening) + 0.01) best = { container: oc, t, point: p }\n }\n return best\n }\n\n const stepStream = (s: StreamInt, dt: number): void => {\n const hit = trace(landingSurfaces(), groundAt, s.origin, s.velocity, gravity)\n const caught = catcher(s, hit ? hit.t : MAX_FLIGHT)\n if (caught) {\n s.landing = caught.point\n s.flightTime = caught.t\n if (!s.visualOnly) fillInternal(caught.container, s.liquid, s.rate * dt, s.temperature, false)\n return\n }\n s.landing = hit ? copy3(hit.point) : null\n s.flightTime = hit ? hit.t : MAX_FLIGHT\n if (!hit || s.visualOnly) return\n const speed = length(hit.velocity)\n if (time - s.lastSplash >= 0.12) {\n s.lastSplash = time\n emit({ type: 'splash', liquid: s.liquid, point: copy3(hit.point), intensity: clamp(0.15 + s.rate * 1.2 + speed * 0.05, 0, 1) })\n }\n deposit(s.liquid, hit, s.rate * dt, hit.velocity)\n }\n\n // ---- containers ----\n\n const spillRate = (c: ContainerInt, def: LiquidDef, h: number): number => {\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const area = 2 * ro * Math.min(h, ro)\n return Math.max(0.6 * area * Math.sqrt(2 * gravity * h) * 1000 * viscScale(def), 0.004)\n }\n\n const steamThreshold = (def: LiquidDef): number => def.steamC ?? (def.drink && def.drink.thirst > 0 ? 60 : Infinity)\n\n const stepContainer = (c: ContainerInt, dt: number): void => {\n // Slosh: the surface tilts towards the horizontal acceleration and settles with a damped spring.\n if (c.hasPrev && dt > 0) {\n const ax = (c.velocity[0] - c.prevVelocity[0]) / dt\n const az = (c.velocity[2] - c.prevVelocity[2]) / dt\n const tx = clamp(ax / gravity, -0.35, 0.35)\n const tz = clamp(az / gravity, -0.35, 0.35)\n const w = 9\n const z = 0.12\n c.slosh[2] += (w * w * (tx - c.slosh[0]) - 2 * z * w * c.slosh[2]) * dt\n c.slosh[3] += (w * w * (tz - c.slosh[1]) - 2 * z * w * c.slosh[3]) * dt\n } else {\n c.slosh[2] *= 0.5\n c.slosh[3] *= 0.5\n }\n c.slosh[0] += c.slosh[2] * dt\n c.slosh[1] += c.slosh[3] * dt\n if (Math.abs(c.slosh[0]) + Math.abs(c.slosh[1]) + Math.abs(c.slosh[2]) + Math.abs(c.slosh[3]) < 1e-5) c.slosh = [0, 0, 0, 0]\n c.prevVelocity = copy3(c.velocity)\n c.hasPrev = true\n\n // Cooling towards ambient (insulated containers 10× slower).\n if (c.temperature !== ambientC) {\n const tau = (600 + 2400 * c.liters) * (c.spec.insulated ? 10 : 1)\n c.temperature = ambientC + (c.temperature - ambientC) * Math.exp(-dt / tau)\n if (Math.abs(c.temperature - ambientC) < 0.01) c.temperature = ambientC\n }\n\n refreshLevel(c)\n const def = defOf(c)\n\n const steaming = !!def && c.liters > 1e-6 && !c.closed && c.temperature > steamThreshold(def)\n if (steaming !== c.steaming) {\n c.steaming = steaming\n emit({ type: 'steam', container: c.id, on: steaming })\n }\n\n c.outflow = 0\n if (!def || c.liters <= 1e-6) {\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n c.pourTTL = 0\n settle(c)\n return\n }\n\n // Pour (driven by `pour()`), else spill over the lip when the tilted surface rises above it.\n if (c.pourTTL > 0) {\n c.pourTTL -= dt\n if (c.pourTTL > 0) {\n const flow = lipFlow(c, 0.05)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n c.outflow += c.pourRate\n } else endStreamKey(c, 'pour')\n endStreamKey(c, 'spill')\n } else {\n endStreamKey(c, 'pour')\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const h = c.d - lip.level\n let handled = false\n if (!c.closed && h > 1e-5) {\n const excess = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, lip.level)\n if (excess > 1e-6) {\n const rate = Math.min(spillRate(c, def, h), excess / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, excess, c.liters))\n const flow = lipFlow(c, h)\n syncStream(c, 'spill', 'spill', rate, flow.origin, flow.velocity)\n c.outflow += rate\n handled = true\n }\n }\n if (!handled) endStreamKey(c, 'spill')\n }\n\n // Holes leak by Torricelli with the head above each hole.\n for (let i = 0; i < c.holes.length; i++) {\n const hole = c.holes[i]\n const key = `leak:${i}`\n const hh = dot(c.u, hole.point)\n const head = c.d - hh\n if (c.liters > 1e-6 && head > 1e-4) {\n const area = Math.PI * (hole.diameter / 2) ** 2\n const natural = 0.6 * area * Math.sqrt(2 * gravity * head) * 1000 * viscScale(def)\n const avail = c.liters - c.spec.capacity * planeFraction(c.cols, c.u, hh)\n if (avail > 1e-7) {\n const rate = Math.min(natural, avail / Math.max(dt, 1e-6))\n removeLiters(c, Math.min(rate * dt, avail))\n const nW = normalize(quatRotate(c.rotation, hole.normal))\n const v = Math.min(3, 0.6 * Math.sqrt(2 * gravity * head))\n syncStream(c, key, 'leak', rate, toWorld(c, hole.point), [nW[0] * v, nW[1] * v - 0.05, nW[2] * v])\n c.outflow += rate\n continue\n }\n }\n endStreamKey(c, key)\n }\n if (c.holes.length > 0 || c.outflow > 0) refreshLevel(c)\n settle(c)\n }\n\n const step = (dt: number): void => {\n time += dt\n for (const c of [...containers.values()]) stepContainer(c, dt)\n for (const s of [...streams.values()]) stepStream(s, dt)\n for (const st of [...stains.values()]) {\n const def = liquids.get(st.liquid)\n if (!def) continue\n const status = stepStain(st, def, surfaceFor(st.surface), ambientC, dt)\n if (status === 'dried_mark') emit({ type: 'dried', stain: st.id, mark: true })\n else if (status === 'dried_gone') {\n stains.delete(st.id)\n emit({ type: 'dried', stain: st.id, mark: false })\n }\n }\n }\n\n // ---- public state views ----\n\n const stateOf = (c: ContainerInt): ContainerState => ({\n id: c.id,\n liquid: c.liquid,\n liters: c.liters,\n capacity: c.spec.capacity,\n temperature: c.temperature,\n closed: c.closed,\n surfaceHeight: c.liters > 0 ? c.d : 0,\n surfacePoint: add(c.position, scale(c.normal, c.liters > 0 ? c.d : 0)),\n surfaceNormal: copy3(c.normal),\n holes: c.holes.map((h) => ({ point: copy3(h.point), normal: copy3(h.normal), diameter: h.diameter })),\n outflow: c.outflow,\n steaming: c.steaming,\n shape: c.spec.shape,\n lipRadius: lipRadius(c.spec.shape, c.spec.opening),\n position: copy3(c.position),\n rotation: [...c.rotation] as Quat,\n })\n\n const streamView = (s: StreamInt): StreamState => ({\n id: s.id,\n liquid: s.liquid,\n cause: s.cause,\n container: s.container,\n tap: s.tap,\n origin: copy3(s.origin),\n velocity: copy3(s.velocity),\n rate: s.rate,\n landing: s.landing ? copy3(s.landing) : null,\n thin: s.thin,\n flightTime: s.flightTime,\n })\n\n const stainView = (s: StainInt): StainState => ({\n id: s.id,\n surface: s.surface,\n liquid: s.liquid,\n center: copy3(s.center),\n front: [...s.front],\n liters: s.liters,\n soaked: s.soaked,\n wetness: s.wetness,\n wetRadius: s.wetRadius,\n normal: copy3(s.normal),\n tangent: copy3(s.tangent),\n flow: s.flow ? copy3(s.flow) : undefined,\n mark: s.mark,\n age: s.age,\n })\n\n // ---- world API ----\n\n const world: FluidWorld = {\n liquids,\n gravity,\n describe: (event) => describeEvent(strings, event),\n\n addContainer(spec, opts = {}) {\n const id = opts.id ?? `container_${++counters.container}`\n if (containers.has(id)) world.removeContainer(id)\n const liquid = spec.liquid && liquids.has(spec.liquid) ? spec.liquid : null\n const liters = liquid ? clamp(spec.liters ?? 0, 0, spec.capacity) : 0\n const c: ContainerInt = {\n id,\n spec: clone(spec),\n cols: makeColumns(spec.shape),\n liquid: liters > 0 ? liquid : null,\n liters,\n temperature: spec.temperature ?? ambientC,\n closed: spec.closed ?? spec.opening <= 0,\n position: copy3(opts.position ?? [0, 0, 0]),\n rotation: opts.rotation ? ([...opts.rotation] as Quat) : [0, 0, 0, 1],\n velocity: [0, 0, 0],\n prevVelocity: [0, 0, 0],\n hasPrev: false,\n holes: [],\n slosh: [0, 0, 0, 0],\n normal: [0, 1, 0],\n u: [0, 1, 0],\n d: 0,\n steaming: false,\n outflow: 0,\n streams: {},\n pourRate: 0,\n pourTTL: 0,\n pourVisual: false,\n lastMix: -10,\n }\n containers.set(id, c)\n refreshLevel(c)\n return id\n },\n\n addTap(spec) {\n const id = spec.id ?? `tap_${++counters.tap}`\n if (taps.has(id)) world.removeTap(id)\n const d = spec.direction ?? [0, -1, 0]\n const len = Math.hypot(d[0], d[1], d[2]) || 1\n const t: TapInt = {\n id,\n position: copy3(spec.position),\n direction: [d[0] / len, d[1] / len, d[2] / len],\n liquid: spec.liquid,\n rate: Math.max(0, spec.rate),\n temperature: spec.temperature ?? ambientC,\n on: false,\n }\n taps.set(id, t)\n if (spec.on ?? true) world.setTap(id, true)\n return id\n },\n\n setTap(id, on, rate) {\n const t = taps.get(id)\n if (!t) return\n if (rate !== undefined) t.rate = Math.max(0, rate)\n const changed = t.on !== on\n t.on = on\n syncTap(t)\n if (changed) emit({ type: 'tap', tap: id, on })\n },\n\n removeTap(id) {\n const t = taps.get(id)\n if (!t) return\n t.on = false\n syncTap(t)\n taps.delete(id)\n },\n\n taps: () => [...taps.values()].map((t) => ({ id: t.id, position: copy3(t.position), direction: copy3(t.direction), liquid: t.liquid, rate: t.rate, temperature: t.temperature, on: t.on, stream: t.stream })),\n\n removeContainer(id) {\n const c = containers.get(id)\n if (!c) return\n for (const key of Object.keys(c.streams)) endStreamKey(c, key)\n containers.delete(id)\n },\n\n setTransform(id, position, rotation, velocity) {\n const c = containers.get(id)\n if (!c) return\n c.position = copy3(position)\n c.rotation = [...rotation] as Quat\n if (velocity) c.velocity = copy3(velocity)\n refreshLevel(c)\n },\n\n open(id) {\n const c = containers.get(id)\n if (c) c.closed = false\n },\n\n close(id) {\n const c = containers.get(id)\n if (!c) return\n c.closed = true\n for (const key of ['pour', 'spill']) endStreamKey(c, key)\n c.pourTTL = 0\n },\n\n fill(id, liquid, liters, temperature) {\n const c = containers.get(id)\n if (!c || c.closed) return 0\n const accepted = fillInternal(c, liquid, liters, temperature, true)\n refreshLevel(c)\n return accepted\n },\n\n pour(id, dt, into) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(dt > 0)) return 0\n refreshLevel(c)\n const lip = lipOf(c.spec.shape, c.spec.opening, c.u)\n const depth = Math.max(0, c.d - planeRange(c.cols, c.u)[0])\n const head = Math.max(c.d - lip.level, 0.02 + 0.5 * depth)\n const ro = lipRadius(c.spec.shape, c.spec.opening)\n const natural = 0.6 * Math.PI * ro * ro * Math.sqrt(2 * gravity * head) * 1000\n const rate = Math.min(natural, 0.15 + 12 * ro) * viscScale(def)\n const out = Math.min(rate * dt, c.liters)\n const target = into ? containers.get(into) : undefined\n let delivered = out\n if (target) {\n delivered = fillInternal(target, c.liquid as LiquidId, out, c.temperature, false)\n refreshLevel(target)\n const overflow = out - delivered\n if (overflow > 1e-6) {\n const flow = lipFlow(c, head)\n const hit = trace(landingSurfaces(), groundAt, flow.origin, flow.velocity, gravity)\n if (hit) deposit(c.liquid as LiquidId, hit, overflow, hit.velocity)\n }\n }\n removeLiters(c, out)\n c.pourRate = out / dt\n c.pourTTL = Math.max(0.12, dt * 1.5)\n c.pourVisual = !!target\n const flow = lipFlow(c, head)\n syncStream(c, 'pour', 'pour', c.pourRate, flow.origin, flow.velocity, c.pourVisual)\n refreshLevel(c)\n settle(c)\n return out\n },\n\n drink(id, liters) {\n const c = containers.get(id)\n const def = c ? defOf(c) : null\n if (!c || !def || c.closed || c.liters <= 1e-6 || !(liters > 0)) return null\n const amount = Math.min(liters, c.liters)\n removeLiters(c, amount)\n const event: Extract<FluidEvent, { type: 'drink' }> = {\n type: 'drink',\n container: c.id,\n liquid: def.id,\n liters: amount,\n temperature: c.temperature,\n thirst: (def.drink?.thirst ?? 0) * amount,\n effects: [...(def.drink?.effects ?? [])],\n burn: c.temperature > 65,\n }\n emit(event)\n refreshLevel(c)\n settle(c)\n return event\n },\n\n puncture(id, point, normal, diameter) {\n const c = containers.get(id)\n if (!c || !(diameter > 0) || c.holes.length >= MAX_HOLES) return\n c.holes.push({ point: copy3(point), normal: normalize(normal), diameter })\n },\n\n heat(id, deltaC) {\n const c = containers.get(id)\n if (c) c.temperature = clamp(c.temperature + deltaC, -50, 1000)\n },\n\n addSurface(spec) {\n const basis = makeBasis(spec.normal, spec.tangent)\n surfaces.set(spec.id, {\n ...clone(spec),\n ...basis,\n point: copy3(spec.point),\n half: [spec.halfSize[0], spec.halfSize[1]],\n })\n },\n\n removeSurface(id) {\n surfaces.delete(id)\n for (const s of [...stains.values()]) if (s.surface === id) stains.delete(s.id)\n },\n\n splash(liquid, point, liters, velocity) {\n if (!liquids.has(liquid) || !(liters > 0)) return\n const v: Vec3 = velocity ?? [0, -0.1, 0]\n const origin = add(point, [0, 0.02, 0])\n const hit = trace(landingSurfaces(), groundAt, origin, v, gravity)\n if (!hit) return\n emit({ type: 'splash', liquid, point: copy3(hit.point), intensity: clamp(0.3 + liters * 2, 0, 1) })\n deposit(liquid, hit, liters, length(v) > 0.3 ? hit.velocity : null)\n },\n\n clearStains(point, radius) {\n for (const s of [...stains.values()]) {\n if (distance(point, s.center) <= radius + 0.5 * meanRadius(s.front)) {\n stains.delete(s.id)\n emit({ type: 'dried', stain: s.id, mark: false })\n }\n }\n },\n\n update(dt) {\n if (dt > 0) {\n const n = clamp(Math.ceil(dt / MAX_STEP), 1, MAX_SUBSTEPS)\n updating = true\n try {\n for (let i = 0; i < n; i++) step(dt / n)\n } finally {\n updating = false\n }\n }\n const out = queue\n queue = []\n return out\n },\n\n container: (id) => {\n const c = containers.get(id)\n return c ? stateOf(c) : null\n },\n containers: () => [...containers.values()].map(stateOf),\n streams: () => [...streams.values()].map(streamView),\n stains: () => [...stains.values()].map(stainView),\n\n on(type, fn) {\n let set = listeners.get(type)\n if (!set) listeners.set(type, (set = new Set()))\n set.add(fn)\n return () => {\n set?.delete(fn)\n }\n },\n\n serialize() {\n const snapshot: Snapshot = {\n version: 1,\n time,\n rng: rng.state,\n counters: { ...counters },\n containers: [...containers.values()].map((c) => {\n const { cols: _cols, ...rest } = c\n return clone(rest)\n }),\n surfaces: [...surfaces.values()].map((s) => clone({ id: s.id, point: s.point, normal: s.normal, halfSize: s.half, tangent: s.t1, porosity: s.porosity })),\n streams: [...streams.values()].map((s) => clone(s)),\n taps: [...taps.values()].map((t) => clone(t)),\n stains: [...stains.values()].map((s) => clone(s)),\n }\n return snapshot\n },\n\n load(input) {\n const snap = clone(input) as Snapshot\n if (!snap || snap.version !== 1) throw new Error('game-fluids: unsupported snapshot')\n time = snap.time\n rng = new Rng(0)\n rng.state = snap.rng\n counters.container = snap.counters.container\n counters.stream = snap.counters.stream\n counters.stain = snap.counters.stain\n containers = new Map()\n for (const raw of snap.containers) containers.set(raw.id, { ...raw, cols: makeColumns(raw.spec.shape) })\n surfaces = new Map()\n for (const s of snap.surfaces) world.addSurface(s)\n counters.tap = snap.counters.tap ?? 0\n streams = new Map(snap.streams.map((s) => [s.id, s]))\n taps = new Map((snap.taps ?? []).map((t) => [t.id, t]))\n stains = new Map(snap.stains.map((s) => [s.id, s]))\n queue = []\n },\n }\n\n return world\n}\n","[\n {\n \"id\": \"sip\",\n \"duration\": 1.2,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.35,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.45,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.06\n },\n {\n \"t\": 0.95,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -0.9,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.2,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"drink\",\n \"duration\": 2.5,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.1667\n },\n {\n \"t\": 2.0,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.22,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 2.5,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"chug\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.9,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"drink\",\n \"rate\": 0.2\n },\n {\n \"t\": 3.4,\n \"position\": [\n 0.0,\n 0.02,\n -0.2\n ],\n \"rotation\": [\n -1.45,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour\",\n \"duration\": 3,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.8,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 1\n },\n {\n \"t\": 2.4,\n \"position\": [\n 0.1,\n 0.0,\n -0.35\n ],\n \"rotation\": [\n -1.745,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 3,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"pour_out\",\n \"duration\": 4,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.5,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1.0,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"pour\",\n \"rate\": 40\n },\n {\n \"t\": 3.2,\n \"position\": [\n 0.1,\n 0.1,\n -0.35\n ],\n \"rotation\": [\n -2.2,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 4,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"open\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"open\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n },\n {\n \"id\": \"close\",\n \"duration\": 1,\n \"keys\": [\n {\n \"t\": 0,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 0.25,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"close\"\n },\n {\n \"t\": 0.7,\n \"position\": [\n 0.1,\n 0,\n -0.3\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n },\n {\n \"t\": 1,\n \"position\": [\n 0.22,\n -0.2,\n -0.4\n ],\n \"rotation\": [\n 0,\n 0,\n 0\n ],\n \"action\": \"none\"\n }\n ]\n }\n]","import itemUsesData from './data/item-uses.json'\nimport { lerp3, quatFromEuler, quatMultiply, quatRotate, add } from './math'\nimport type { FluidEvent, FluidWorld, ItemUseDef, ItemUsePlayer, Quat, Vec3 } from './types'\n\n/** Built-in scripted uses of a held item (data in `data/item-uses.json`): `sip`, `drink`, `chug`, `pour`, `pour_out`, `open`, `close`. */\nexport const ITEM_USES: ItemUseDef[] = itemUsesData as unknown as ItemUseDef[]\n\n/** World transform of the hand (or any holder) the item pose is relative to. */\nexport type HandTransform = () => { position: Vec3; rotation: Quat }\n\nconst DEFAULT_DRINK_RATE = 0.1\n\n/**\n * Plays an item use on a container: interpolates the keys, applies `drink` (rate × dt litres) and `pour` (`world.pour`, `rate` multiplies the\n * time) while the current key has that action, and fires `open` / `close` once when their key is reached. When `getHandTransform` is given, the\n * container's world transform follows hand ∘ pose every update; otherwise the host animates the viewmodel from `pose()`.\n */\nexport function createItemUse(world: FluidWorld, containerId: string, def: ItemUseDef, getHandTransform?: HandTransform): ItemUsePlayer {\n const keys = [...def.keys].sort((a, b) => a.t - b.t)\n let time = 0\n let done = keys.length === 0 || def.duration <= 0\n let checked = false\n let lastPos: Vec3 | null = null\n const fired = new Set<number>()\n\n const pose = (): { position: Vec3; rotation: Vec3 } => {\n if (keys.length === 0) return { position: [0, 0, 0], rotation: [0, 0, 0] }\n if (time <= keys[0].t) return { position: [...keys[0].position], rotation: [...keys[0].rotation] }\n for (let i = 0; i < keys.length - 1; i++) {\n const a = keys[i]\n const b = keys[i + 1]\n if (time <= b.t) {\n const k = b.t > a.t ? (time - a.t) / (b.t - a.t) : 1\n return { position: lerp3(a.position, b.position, k), rotation: lerp3(a.rotation, b.rotation, k) }\n }\n }\n const last = keys[keys.length - 1]\n return { position: [...last.position], rotation: [...last.rotation] }\n }\n\n const follow = (dt: number): void => {\n if (!getHandTransform) return\n const hand = getHandTransform()\n const p = pose()\n const position = add(hand.position, quatRotate(hand.rotation, p.position))\n const rotation = quatMultiply(hand.rotation, quatFromEuler(p.rotation[0], p.rotation[1], p.rotation[2]))\n const velocity: Vec3 | undefined =\n lastPos && dt > 0 ? [(position[0] - lastPos[0]) / dt, (position[1] - lastPos[1]) / dt, (position[2] - lastPos[2]) / dt] : undefined\n lastPos = position\n world.setTransform(containerId, position, rotation, velocity)\n }\n\n const player: ItemUsePlayer = {\n def,\n get time() {\n return time\n },\n get done() {\n return done\n },\n pose,\n update(dt) {\n if (done) return []\n const events: FluidEvent[] = []\n const off = world.on('*', (e) => events.push(e))\n try {\n if (!checked) {\n checked = true\n const state = world.container(containerId)\n if (!state || (def.liquids && def.liquids.length > 0 && (!state.liquid || !def.liquids.includes(state.liquid)))) {\n done = true\n return events\n }\n }\n const start = time\n const end = Math.min(def.duration, time + Math.max(0, dt))\n for (let i = 0; i < keys.length && !done; i++) {\n const key = keys[i]\n const spanStart = key.t\n const spanEnd = i + 1 < keys.length ? keys[i + 1].t : def.duration\n if ((key.action === 'open' || key.action === 'close') && !fired.has(i) && end >= spanStart) {\n fired.add(i)\n if (key.action === 'open') world.open(containerId)\n else world.close(containerId)\n }\n const overlap = Math.min(end, spanEnd) - Math.max(start, spanStart)\n if (overlap <= 0) continue\n if (key.action === 'drink') {\n const ev = world.drink(containerId, (key.rate ?? DEFAULT_DRINK_RATE) * overlap)\n const left = world.container(containerId)\n if (!ev || !left || left.liters <= 1e-6) {\n time = def.duration\n done = true\n }\n } else if (key.action === 'pour') {\n world.pour(containerId, overlap * (key.rate ?? 1))\n }\n }\n if (!done) {\n time = end\n done = time >= def.duration\n }\n follow(dt)\n } finally {\n off()\n }\n return events\n },\n cancel() {\n done = true\n },\n }\n return player\n}\n","/**\n * Convex solids (a cylinder or a box, in container space) clipped by the liquid surface plane `u · p <= d`.\n * This is robust for any tilt (upright, lying on its side, upside down): the result is exactly the part of the container the liquid fills,\n * with the surface cap lying on the plane. Written into preallocated buffers, no per-frame geometry is created.\n */\nexport type V3 = [number, number, number]\n\nexport interface SolidFace {\n p: V3[]\n n: V3[]\n}\n\nexport interface Solid {\n faces: SolidFace[]\n /** Upper bound of the vertices a clip can write (non-indexed triangles). */\n maxVertices: number\n}\n\nconst sub = (a: V3, b: V3): V3 => [a[0] - b[0], a[1] - b[1], a[2] - b[2]]\nconst cross = (a: V3, b: V3): V3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\nconst dot = (a: V3, b: V3): number => a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\nconst norm = (a: V3): V3 => {\n const l = Math.hypot(a[0], a[1], a[2]) || 1\n return [a[0] / l, a[1] / l, a[2] / l]\n}\n\n/** Reverse the winding when the face does not look outward. */\nconst orient = (p: V3[], n: V3[], outward: V3): SolidFace => {\n if (dot(cross(sub(p[1], p[0]), sub(p[2], p[0])), outward) < 0) return { p: [...p].reverse(), n: [...n].reverse() }\n return { p, n }\n}\n\nconst finish = (faces: SolidFace[]): Solid => {\n let maxVertices = 0\n for (const f of faces) maxVertices += (f.p.length * 2 + 2) * 3\n // The surface cap: at most one point per face edge cut.\n maxVertices += faces.length * 3 * 2 + 64\n return { faces, maxVertices }\n}\n\nexport const cylinderSolid = (radius: number, height: number, segments: number): Solid => {\n const faces: SolidFace[] = []\n const ring = (y: number, i: number): V3 => {\n const a = (i / segments) * Math.PI * 2\n return [Math.cos(a) * radius, y, Math.sin(a) * radius]\n }\n const radial = (i: number): V3 => {\n const a = (i / segments) * Math.PI * 2\n return [Math.cos(a), 0, Math.sin(a)]\n }\n for (let i = 0; i < segments; i++) {\n const j = (i + 1) % segments\n const mid = norm([radial(i)[0] + radial(j)[0], 0, radial(i)[2] + radial(j)[2]])\n faces.push(orient([ring(0, i), ring(0, j), ring(height, j), ring(height, i)], [radial(i), radial(j), radial(j), radial(i)], mid))\n }\n const bottom: V3[] = []\n const top: V3[] = []\n for (let i = 0; i < segments; i++) {\n bottom.push(ring(0, i))\n top.push(ring(height, i))\n }\n faces.push(orient(bottom, bottom.map((): V3 => [0, -1, 0]), [0, -1, 0]))\n faces.push(orient(top, top.map((): V3 => [0, 1, 0]), [0, 1, 0]))\n return finish(faces)\n}\n\nexport const boxSolid = (size: V3): Solid => {\n const hx = size[0] / 2\n const hz = size[2] / 2\n const hy = size[1]\n const c = (x: number, y: number, z: number): V3 => [x * hx, y * hy, z * hz]\n const quad = (a: V3, b: V3, cc: V3, d: V3, n: V3): SolidFace => orient([a, b, cc, d], [n, n, n, n], n)\n return finish([\n quad(c(1, 0, -1), c(1, 1, -1), c(1, 1, 1), c(1, 0, 1), [1, 0, 0]),\n quad(c(-1, 0, -1), c(-1, 1, -1), c(-1, 1, 1), c(-1, 0, 1), [-1, 0, 0]),\n quad(c(-1, 1, -1), c(1, 1, -1), c(1, 1, 1), c(-1, 1, 1), [0, 1, 0]),\n quad(c(-1, 0, -1), c(1, 0, -1), c(1, 0, 1), c(-1, 0, 1), [0, -1, 0]),\n quad(c(-1, 0, 1), c(1, 0, 1), c(1, 1, 1), c(-1, 1, 1), [0, 0, 1]),\n quad(c(-1, 0, -1), c(1, 0, -1), c(1, 1, -1), c(-1, 1, -1), [0, 0, -1]),\n ])\n}\n\nconst polyP: number[] = []\nconst polyN: number[] = []\nconst cut: number[] = []\n\n/**\n * Writes the triangles of `solid ∩ { u · p <= d }` into `pos` / `nor` (non-indexed, 3 floats per vertex) and returns the vertex count.\n * The cap on the plane has normal `u`.\n */\nexport const clipSolid = (solid: Solid, u: V3, d: number, pos: Float32Array, nor: Float32Array): number => {\n let count = 0\n const capacity = Math.floor(pos.length / 3)\n cut.length = 0\n const put = (px: number, py: number, pz: number, nx: number, ny: number, nz: number): void => {\n if (count >= capacity) return\n pos[count * 3] = px\n pos[count * 3 + 1] = py\n pos[count * 3 + 2] = pz\n nor[count * 3] = nx\n nor[count * 3 + 1] = ny\n nor[count * 3 + 2] = nz\n count++\n }\n\n for (const face of solid.faces) {\n const m = face.p.length\n polyP.length = 0\n polyN.length = 0\n for (let i = 0; i < m; i++) {\n const a = face.p[i]\n const b = face.p[(i + 1) % m]\n const na = face.n[i]\n const nb = face.n[(i + 1) % m]\n const da = u[0] * a[0] + u[1] * a[1] + u[2] * a[2] - d\n const db = u[0] * b[0] + u[1] * b[1] + u[2] * b[2] - d\n const ina = da <= 0\n const inb = db <= 0\n if (ina) {\n polyP.push(a[0], a[1], a[2])\n polyN.push(na[0], na[1], na[2])\n if (da > -1e-7) cut.push(a[0], a[1], a[2])\n }\n if (ina !== inb) {\n const t = da / (da - db)\n const x = a[0] + (b[0] - a[0]) * t\n const y = a[1] + (b[1] - a[1]) * t\n const z = a[2] + (b[2] - a[2]) * t\n polyP.push(x, y, z)\n polyN.push(na[0] + (nb[0] - na[0]) * t, na[1] + (nb[1] - na[1]) * t, na[2] + (nb[2] - na[2]) * t)\n cut.push(x, y, z)\n }\n }\n const n = polyP.length / 3\n for (let i = 1; i < n - 1; i++) {\n for (const k of [0, i, i + 1]) put(polyP[k * 3], polyP[k * 3 + 1], polyP[k * 3 + 2], polyN[k * 3], polyN[k * 3 + 1], polyN[k * 3 + 2])\n }\n }\n\n // Cap on the plane: unique cut points sorted around their centre.\n const pts: V3[] = []\n for (let i = 0; i < cut.length; i += 3) {\n let dup = false\n for (const q of pts) {\n if (Math.abs(q[0] - cut[i]) + Math.abs(q[1] - cut[i + 1]) + Math.abs(q[2] - cut[i + 2]) < 1e-6) {\n dup = true\n break\n }\n }\n if (!dup) pts.push([cut[i], cut[i + 1], cut[i + 2]])\n }\n if (pts.length >= 3) {\n const c: V3 = [0, 0, 0]\n for (const q of pts) {\n c[0] += q[0] / pts.length\n c[1] += q[1] / pts.length\n c[2] += q[2] / pts.length\n }\n const e1 = norm(cross(u, Math.abs(u[0]) < 0.9 ? [1, 0, 0] : [0, 1, 0]))\n const e2 = cross(u, e1)\n const keyed = pts.map((q) => ({ q, a: Math.atan2(dot(sub(q, c), e2), dot(sub(q, c), e1)) })).sort((p, r) => p.a - r.a)\n for (let i = 0; i < keyed.length; i++) {\n for (const q of [c, keyed[i].q, keyed[(i + 1) % keyed.length].q]) put(q[0], q[1], q[2], u[0], u[1], u[2])\n }\n }\n return count\n}\n","import type * as THREE_NS from 'three'\nimport type { ContainerState, FluidWorld, Vec3 } from '@adatechnology/game-fluids'\nimport { boxSolid, clipSolid, cylinderSolid } from './clip'\nimport type { Solid, V3 } from './clip'\nimport type { MaterialCache } from './materials'\nimport type { ParticlePool } from './particles'\nimport type { QualityProfile } from './quality'\nimport type { ThreeLib } from './types'\n\n/** How far the liquid is kept inside the container walls so it does not fight with them. */\nconst INSET = 0.985\n\n/**\n * The liquid inside one bound container: the container's inner shape clipped by the world surface plane, expressed in the bound object's space,\n * so the cap always lies on the plane whatever the tilt. Plus steam puffs above a hot surface.\n */\nexport class LiquidBody {\n readonly group: THREE_NS.Group\n private mesh: THREE_NS.Mesh | null = null\n private geometry: THREE_NS.BufferGeometry | null = null\n private pos: Float32Array = new Float32Array(0)\n private nor: Float32Array = new Float32Array(0)\n private solid: Solid | null = null\n private shapeKey = ''\n private steamAcc = 0\n private readonly inverse: THREE_NS.Matrix4\n private readonly tmpN: THREE_NS.Vector3\n private readonly tmpP: THREE_NS.Vector3\n vertices = 0\n\n constructor(\n private readonly THREE: ThreeLib,\n readonly containerId: string,\n readonly object: THREE_NS.Object3D,\n offset: Vec3,\n ) {\n this.group = new THREE.Group()\n this.group.name = 'fluid_liquid_body'\n this.group.position.set(offset[0], offset[1], offset[2])\n this.inverse = new THREE.Matrix4()\n this.tmpN = new THREE.Vector3()\n this.tmpP = new THREE.Vector3()\n object.add(this.group)\n }\n\n get visible(): boolean {\n return !!this.mesh && this.mesh.visible\n }\n\n private build(state: ContainerState, quality: QualityProfile): void {\n const shape = state.shape\n if (!shape) return\n const key = JSON.stringify(shape) + quality.bodySegments\n if (key === this.shapeKey) return\n this.shapeKey = key\n this.solid =\n shape.kind === 'cylinder'\n ? cylinderSolid(shape.radius * INSET, shape.height * INSET, quality.bodySegments)\n : boxSolid([shape.size[0] * INSET, shape.size[1] * INSET, shape.size[2] * INSET])\n const T = this.THREE\n this.geometry?.dispose()\n this.pos = new Float32Array(this.solid.maxVertices * 3)\n this.nor = new Float32Array(this.solid.maxVertices * 3)\n this.geometry = new T.BufferGeometry()\n const p = new T.BufferAttribute(this.pos, 3)\n const n = new T.BufferAttribute(this.nor, 3)\n p.setUsage(T.DynamicDrawUsage)\n n.setUsage(T.DynamicDrawUsage)\n this.geometry.setAttribute('position', p)\n this.geometry.setAttribute('normal', n)\n if (!this.mesh) {\n this.mesh = new T.Mesh(this.geometry)\n this.mesh.name = 'fluid_liquid'\n this.mesh.frustumCulled = false\n this.mesh.renderOrder = 3\n this.group.add(this.mesh)\n } else this.mesh.geometry = this.geometry\n }\n\n update(dt: number, world: FluidWorld, materials: MaterialCache, quality: QualityProfile, particles: ParticlePool): void {\n const state = world.container(this.containerId)\n const def = state?.liquid ? world.liquids.get(state.liquid) : undefined\n if (!state || !state.shape || !def || state.liters <= 1e-6) {\n if (this.mesh) this.mesh.visible = false\n this.vertices = 0\n return\n }\n this.build(state, quality)\n if (!this.mesh || !this.solid) return\n this.mesh.material = materials.liquidBody(def)\n\n // The surface plane in the group's space.\n this.object.updateWorldMatrix(true, false)\n this.group.updateWorldMatrix(true, false)\n this.inverse.copy(this.group.matrixWorld).invert()\n this.tmpN.set(state.surfaceNormal[0], state.surfaceNormal[1], state.surfaceNormal[2]).transformDirection(this.inverse)\n this.tmpP.set(state.surfacePoint[0], state.surfacePoint[1], state.surfacePoint[2]).applyMatrix4(this.inverse)\n const u: V3 = [this.tmpN.x, this.tmpN.y, this.tmpN.z]\n const d = u[0] * this.tmpP.x + u[1] * this.tmpP.y + u[2] * this.tmpP.z\n\n this.vertices = clipSolid(this.solid, u, d, this.pos, this.nor)\n const geometry = this.geometry as THREE_NS.BufferGeometry\n geometry.setDrawRange(0, this.vertices)\n ;(geometry.getAttribute('position') as THREE_NS.BufferAttribute).needsUpdate = true\n ;(geometry.getAttribute('normal') as THREE_NS.BufferAttribute).needsUpdate = true\n this.mesh.visible = this.vertices > 0\n\n // Steam above a hot open surface.\n if (state.steaming && this.vertices > 0) {\n this.steamAcc += dt * quality.steamRate\n while (this.steamAcc >= 1) {\n this.steamAcc -= 1\n const o = this.tmpP.set(state.surfacePoint[0], state.surfacePoint[1], state.surfacePoint[2])\n particles.steam([o.x, o.y + 0.01, o.z])\n }\n } else this.steamAcc = 0\n }\n\n get triangles(): number {\n return this.visible ? Math.floor(this.vertices / 3) : 0\n }\n\n dispose(): void {\n this.object.remove(this.group)\n this.geometry?.dispose()\n this.geometry = null\n this.mesh = null\n }\n}\n","export const clamp = (v: number, lo: number, hi: number): number => (v < lo ? lo : v > hi ? hi : v)\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n\n/** Small seeded generator for cosmetic randomness (droplet directions): the same input gives the same droplets. */\nexport class Rng {\n private state: number\n constructor(seed: number) {\n this.state = (seed >>> 0) || 1\n }\n next(): number {\n this.state = (this.state + 0x6d2b79f5) >>> 0\n let t = this.state\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\n/** Integer hash of a point, to seed cosmetic randomness from world state. */\nexport const hashPoint = (x: number, y: number, z: number): number => {\n let h = 2166136261\n for (const v of [x, y, z]) h = Math.imul(h ^ Math.round(v * 1000), 16777619)\n return h >>> 0\n}\n","import type * as THREE_NS from 'three'\nimport type { LiquidDef } from '@adatechnology/game-fluids'\nimport { clamp } from './util'\nimport type { ThreeLib } from './types'\n\n/** Colour of a stain: the liquid's `stainColor`, else a darker `color`. */\nexport const stainColorOf = (def: LiquidDef): number => {\n if (def.stainColor !== undefined) return def.stainColor\n const r = ((def.color >> 16) & 255) * 0.65\n const g = ((def.color >> 8) & 255) * 0.65\n const b = (def.color & 255) * 0.65\n return (Math.round(r) << 16) | (Math.round(g) << 8) | Math.round(b)\n}\n\n/**\n * One material per liquid and role, created on demand and shared by every mesh: each liquid is its own material (colour, opacity, gloss).\n * Wet surfaces use a low roughness from `gloss` so they reflect the scene's environment.\n */\nexport class MaterialCache {\n private body = new Map<string, THREE_NS.MeshStandardMaterial>()\n private stream = new Map<string, THREE_NS.MeshStandardMaterial>()\n private film = new Map<string, THREE_NS.MeshStandardMaterial>()\n private wet = new Map<string, THREE_NS.MeshStandardMaterial>()\n\n constructor(\n private readonly THREE: ThreeLib,\n private readonly envMap: THREE_NS.Texture | null,\n ) {}\n\n private make(params: THREE_NS.MeshStandardMaterialParameters): THREE_NS.MeshStandardMaterial {\n const m = new this.THREE.MeshStandardMaterial({ metalness: 0, ...params })\n if (this.envMap) m.envMap = this.envMap\n return m\n }\n\n /** The volume of liquid inside a container. */\n liquidBody(def: LiquidDef): THREE_NS.MeshStandardMaterial {\n let m = this.body.get(def.id)\n if (!m) {\n m = this.make({\n color: def.color,\n opacity: def.opacity,\n transparent: def.opacity < 0.999,\n roughness: clamp(1 - def.gloss * 0.9, 0.04, 1),\n envMapIntensity: 0.5 + def.gloss * 0.9,\n depthWrite: def.opacity >= 0.999,\n })\n this.body.set(def.id, m)\n }\n return m\n }\n\n /** A jet or a drop in the air. */\n liquidStream(def: LiquidDef): THREE_NS.MeshStandardMaterial {\n let m = this.stream.get(def.id)\n if (!m) {\n m = this.make({\n color: def.color,\n opacity: clamp(def.opacity + 0.1, 0.35, 1),\n transparent: true,\n roughness: clamp(1 - def.gloss * 0.95, 0.03, 1),\n envMapIntensity: 0.8 + def.gloss,\n side: this.THREE.DoubleSide,\n depthWrite: false,\n })\n this.stream.set(def.id, m)\n }\n return m\n }\n\n /** The thin outer film of a stain (and the permanent mark): tinted by vertex colour, soft rim by vertex alpha, mostly matte. */\n stainFilm(def: LiquidDef): THREE_NS.MeshStandardMaterial {\n let m = this.film.get(def.id)\n if (!m) {\n m = this.make({\n color: 0xffffff,\n vertexColors: true,\n transparent: true,\n roughness: clamp(0.95 - def.gloss * 0.45, 0.3, 1),\n envMapIntensity: 0.4 + def.gloss * 0.4,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -2,\n })\n this.film.set(def.id, m)\n }\n return m\n }\n\n /** The glossy wet part of a stain, which shrinks while it dries. */\n stainWet(def: LiquidDef): THREE_NS.MeshStandardMaterial {\n let m = this.wet.get(def.id)\n if (!m) {\n m = this.make({\n color: 0xffffff,\n vertexColors: true,\n transparent: true,\n roughness: clamp(1 - def.gloss, 0.02, 0.7),\n envMapIntensity: 0.9 + def.gloss * 1.4,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -3,\n polygonOffsetUnits: -3,\n })\n this.wet.set(def.id, m)\n }\n return m\n }\n\n dispose(): void {\n for (const map of [this.body, this.stream, this.film, this.wet]) {\n for (const m of map.values()) m.dispose()\n map.clear()\n }\n }\n}\n","import type * as THREE_NS from 'three'\nimport { Rng, clamp, hashPoint } from './util'\nimport type { ThreeLib } from './types'\n\nconst VERTEX = /* glsl */ `\nattribute float aSize;\nattribute vec4 aColor;\nattribute float aSoft;\nuniform float uScale;\nvarying vec4 vColor;\nvarying float vSoft;\nvoid main() {\n vColor = aColor;\n vSoft = aSoft;\n vec4 mv = modelViewMatrix * vec4(position, 1.0);\n gl_PointSize = aSize * uScale / max(0.1, -mv.z);\n gl_Position = projectionMatrix * mv;\n}\n`\n\n// Round sprite drawn in the fragment shader: no textures.\nconst FRAGMENT = /* glsl */ `\nvarying vec4 vColor;\nvarying float vSoft;\nvoid main() {\n float d = length(gl_PointCoord - vec2(0.5)) * 2.0;\n if (d > 1.0 || vColor.a <= 0.001) discard;\n float edge = mix(smoothstep(1.0, 0.8, d), 1.0 - d, vSoft);\n gl_FragColor = vec4(vColor.rgb, vColor.a * edge);\n}\n`\n\n/**\n * A fixed pool of round point sprites: splash droplets (ballistic, they die on the floor they hit) and steam (soft, rising puffs).\n * One draw call. When the pool is full the oldest slot is reused.\n */\nexport class ParticlePool {\n readonly points: THREE_NS.Points\n private readonly geometry: THREE_NS.BufferGeometry\n private readonly material: THREE_NS.ShaderMaterial\n private readonly capacity: number\n private next = 0\n private readonly pos: Float32Array\n private readonly size: Float32Array\n private readonly color: Float32Array\n private readonly soft: Float32Array\n private readonly vel: Float32Array\n private readonly life: Float32Array\n private readonly maxLife: Float32Array\n private readonly size0: Float32Array\n private readonly size1: Float32Array\n private readonly alpha: Float32Array\n private readonly floorY: Float32Array\n private readonly kind: Uint8Array\n private readonly rgb: Float32Array\n private readonly rng = new Rng(1234567)\n private alive = 0\n\n constructor(\n private readonly THREE: ThreeLib,\n capacity: number,\n pointScale: number,\n ) {\n this.capacity = capacity\n this.pos = new Float32Array(capacity * 3)\n this.size = new Float32Array(capacity)\n this.color = new Float32Array(capacity * 4)\n this.soft = new Float32Array(capacity)\n this.vel = new Float32Array(capacity * 3)\n this.life = new Float32Array(capacity)\n this.maxLife = new Float32Array(capacity)\n this.size0 = new Float32Array(capacity)\n this.size1 = new Float32Array(capacity)\n this.alpha = new Float32Array(capacity)\n this.floorY = new Float32Array(capacity)\n this.kind = new Uint8Array(capacity)\n this.rgb = new Float32Array(capacity * 3)\n this.life.fill(0)\n const T = THREE\n this.geometry = new T.BufferGeometry()\n const attr = (array: Float32Array, n: number) => {\n const a = new T.BufferAttribute(array, n)\n a.setUsage(T.DynamicDrawUsage)\n return a\n }\n this.geometry.setAttribute('position', attr(this.pos, 3))\n this.geometry.setAttribute('aSize', attr(this.size, 1))\n this.geometry.setAttribute('aColor', attr(this.color, 4))\n this.geometry.setAttribute('aSoft', attr(this.soft, 1))\n this.material = new T.ShaderMaterial({\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n uniforms: { uScale: { value: pointScale } },\n transparent: true,\n depthWrite: false,\n })\n this.points = new T.Points(this.geometry, this.material)\n this.points.frustumCulled = false\n this.points.renderOrder = 4\n this.points.name = 'fluid_particles'\n }\n\n get count(): number {\n return this.alive\n }\n\n private slot(): number {\n const i = this.next\n this.next = (this.next + 1) % this.capacity\n return i\n }\n\n private setColor(i: number, hex: number): void {\n this.rgb[i * 3] = ((hex >> 16) & 255) / 255\n this.rgb[i * 3 + 1] = ((hex >> 8) & 255) / 255\n this.rgb[i * 3 + 2] = (hex & 255) / 255\n }\n\n /** Droplets thrown up by an impact; `floorY` is the height they stop at. */\n splash(point: [number, number, number], intensity: number, hex: number, opacity: number, count: number): void {\n const rng = new Rng(hashPoint(point[0], point[1], point[2]) ^ this.next)\n const n = Math.max(2, Math.round(count * (0.35 + 0.65 * clamp(intensity, 0, 1))))\n for (let k = 0; k < n; k++) {\n const i = this.slot()\n const a = rng.next() * Math.PI * 2\n const h = (0.25 + rng.next() * 0.9) * (0.4 + intensity)\n const up = (0.7 + rng.next() * 1.5) * (0.5 + intensity)\n this.pos.set([point[0], point[1] + 0.01, point[2]], i * 3)\n this.vel.set([Math.cos(a) * h, up, Math.sin(a) * h], i * 3)\n this.life[i] = this.maxLife[i] = 0.45 + rng.next() * 0.45\n this.size0[i] = 0.012 + rng.next() * 0.014\n this.size1[i] = this.size0[i] * 0.7\n this.alpha[i] = clamp(opacity + 0.2, 0.35, 1)\n this.soft[i] = 0\n this.kind[i] = 0\n this.floorY[i] = point[1]\n this.setColor(i, hex)\n }\n }\n\n /** One puff of steam rising from `point`. */\n steam(point: [number, number, number]): void {\n const i = this.slot()\n const r = this.rng\n this.pos.set([point[0] + (r.next() - 0.5) * 0.04, point[1], point[2] + (r.next() - 0.5) * 0.04], i * 3)\n this.vel.set([(r.next() - 0.5) * 0.06, 0.22 + r.next() * 0.12, (r.next() - 0.5) * 0.06], i * 3)\n this.life[i] = this.maxLife[i] = 1.2 + r.next() * 0.6\n this.size0[i] = 0.03\n this.size1[i] = 0.1\n this.alpha[i] = 0.24\n this.soft[i] = 1\n this.kind[i] = 1\n this.floorY[i] = -1e9\n this.setColor(i, 0xf4f8ff)\n }\n\n update(dt: number, gravity: number): void {\n let alive = 0\n for (let i = 0; i < this.capacity; i++) {\n if (this.life[i] <= 0) {\n this.size[i] = 0\n this.color[i * 4 + 3] = 0\n continue\n }\n this.life[i] -= dt\n const k = 1 - this.life[i] / this.maxLife[i]\n if (this.life[i] <= 0) {\n this.size[i] = 0\n this.color[i * 4 + 3] = 0\n continue\n }\n alive++\n if (this.kind[i] === 0) {\n this.vel[i * 3 + 1] -= gravity * dt\n } else {\n // Steam drifts sideways a little while rising.\n this.vel[i * 3] += Math.sin((k + i) * 7) * 0.02 * dt\n }\n this.pos[i * 3] += this.vel[i * 3] * dt\n this.pos[i * 3 + 1] += this.vel[i * 3 + 1] * dt\n this.pos[i * 3 + 2] += this.vel[i * 3 + 2] * dt\n if (this.kind[i] === 0 && this.pos[i * 3 + 1] < this.floorY[i]) {\n this.life[i] = 0\n alive--\n this.size[i] = 0\n this.color[i * 4 + 3] = 0\n continue\n }\n this.size[i] = this.size0[i] + (this.size1[i] - this.size0[i]) * k\n const fade = this.kind[i] === 1 ? Math.min(1, k * 4) * (1 - k) : 1 - k * k\n this.color[i * 4] = this.rgb[i * 3]\n this.color[i * 4 + 1] = this.rgb[i * 3 + 1]\n this.color[i * 4 + 2] = this.rgb[i * 3 + 2]\n this.color[i * 4 + 3] = this.alpha[i] * fade\n }\n this.alive = alive\n for (const name of ['position', 'aSize', 'aColor', 'aSoft']) (this.geometry.getAttribute(name) as THREE_NS.BufferAttribute).needsUpdate = true\n }\n\n clear(): void {\n this.life.fill(0)\n this.alive = 0\n this.update(0, 0)\n }\n\n dispose(): void {\n this.geometry.dispose()\n this.material.dispose()\n }\n}\n","import type { FluidQuality } from './types'\n\nexport interface QualityProfile {\n /** Radial segments of the container liquid volume. */\n bodySegments: number\n /** Samples along a stream and sides of its tube. */\n streamSamples: number\n streamSides: number\n /** Drops of a thin stream. */\n thinDrops: number\n /** Subdivisions per front sample of a stain outline (16 samples). */\n stainSubdiv: number\n maxStains: number\n maxStreams: number\n maxParticles: number\n /** Steam puffs per second of a steaming container. */\n steamRate: number\n /** Droplets of a full-intensity splash. */\n splashDroplets: number\n}\n\nexport const PROFILES: Record<FluidQuality, QualityProfile> = {\n low: { bodySegments: 10, streamSamples: 8, streamSides: 4, thinDrops: 4, stainSubdiv: 1, maxStains: 24, maxStreams: 12, maxParticles: 96, steamRate: 4, splashDroplets: 5 },\n medium: { bodySegments: 14, streamSamples: 12, streamSides: 5, thinDrops: 6, stainSubdiv: 2, maxStains: 48, maxStreams: 24, maxParticles: 256, steamRate: 8, splashDroplets: 9 },\n high: { bodySegments: 20, streamSamples: 20, streamSides: 8, thinDrops: 8, stainSubdiv: 4, maxStains: 96, maxStreams: 48, maxParticles: 512, steamRate: 14, splashDroplets: 14 },\n}\n\nexport const profileOf = (q: FluidQuality | undefined): QualityProfile => PROFILES[q ?? 'medium'] ?? PROFILES.medium\n","import type * as THREE_NS from 'three'\nimport { STAIN_SAMPLES } from '@adatechnology/game-fluids'\nimport type { LiquidDef, StainState, Vec3 } from '@adatechnology/game-fluids'\nimport type { MaterialCache } from './materials'\nimport { stainColorOf } from './materials'\nimport type { QualityProfile } from './quality'\nimport { clamp } from './util'\nimport type { ThreeLib } from './types'\n\n/** Periodic Catmull-Rom of the 16 front radii: a smooth outline with `subdiv` points per sample. */\nexport const smoothOutline = (front: number[], subdiv: number, out?: number[]): number[] => {\n const n = front.length\n const res = out ?? []\n res.length = n * subdiv\n for (let i = 0; i < n; i++) {\n const p0 = front[(i + n - 1) % n]\n const p1 = front[i]\n const p2 = front[(i + 1) % n]\n const p3 = front[(i + 2) % n]\n for (let j = 0; j < subdiv; j++) {\n const t = j / subdiv\n const r = 0.5 * (2 * p1 + (-p0 + p2) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t + (-p0 + 3 * p1 - 3 * p2 + p3) * t * t * t)\n res[i * subdiv + j] = Math.max(0.004, r)\n }\n }\n return res\n}\n\ninterface Fan {\n mesh: THREE_NS.Mesh\n position: Float32Array\n color: Float32Array\n}\n\n/**\n * One stain: an outer film (the whole flow-front polygon, soft at the rim) and an inner glossy fan at `wetRadius` that recedes while it dries.\n * Both are triangle fans with preallocated buffers, lying on the surface plane a hair above it.\n */\nexport class StainVisual {\n readonly group: THREE_NS.Group\n private readonly outer: Fan\n private readonly inner: Fan\n private readonly ring: number\n private readonly radii: number[] = []\n private readonly tint: THREE_NS.Color\n stainId = ''\n signature = Number.NaN\n triangles = 0\n\n constructor(\n private readonly THREE: ThreeLib,\n profile: QualityProfile,\n readonly slot: number,\n ) {\n this.ring = STAIN_SAMPLES * profile.stainSubdiv\n this.group = new THREE.Group()\n this.group.name = 'fluid_stain'\n this.tint = new THREE.Color()\n this.outer = this.makeFan('fluid_stain_film', 1)\n this.inner = this.makeFan('fluid_stain_wet', 2)\n this.group.add(this.outer.mesh, this.inner.mesh)\n this.group.visible = false\n }\n\n private makeFan(name: string, order: number): Fan {\n const T = this.THREE\n const count = 1 + this.ring\n const position = new Float32Array(count * 3)\n const color = new Float32Array(count * 4)\n const normal = new Float32Array(count * 3)\n const geometry = new T.BufferGeometry()\n const p = new T.BufferAttribute(position, 3)\n const c = new T.BufferAttribute(color, 4)\n p.setUsage(T.DynamicDrawUsage)\n c.setUsage(T.DynamicDrawUsage)\n geometry.setAttribute('position', p)\n geometry.setAttribute('normal', new T.BufferAttribute(normal, 3))\n geometry.setAttribute('color', c)\n const index: number[] = []\n for (let i = 0; i < this.ring; i++) index.push(0, 1 + i, 1 + ((i + 1) % this.ring))\n geometry.setIndex(index)\n const mesh = new T.Mesh(geometry)\n mesh.name = name\n mesh.frustumCulled = false\n mesh.renderOrder = order\n return { mesh, position, color }\n }\n\n assign(def: LiquidDef, materials: MaterialCache): void {\n this.outer.mesh.material = materials.stainFilm(def)\n this.inner.mesh.material = materials.stainWet(def)\n }\n\n hide(): void {\n this.group.visible = false\n this.stainId = ''\n this.signature = Number.NaN\n this.triangles = 0\n }\n\n /** Rebuild the vertices from the stain state (skipped when nothing changed). */\n update(stain: StainState, def: LiquidDef, profile: QualityProfile): void {\n const sig =\n stain.center[0] * 3 +\n stain.center[1] * 5 +\n stain.center[2] * 7 +\n stain.front.reduce((s, v, i) => s + v * (i + 1), 0) * 11 +\n stain.wetness * 13 +\n stain.wetRadius * 17 +\n (stain.soaked / (stain.soaked + stain.liters + 1e-6)) * 19\n if (sig === this.signature && this.group.visible) return\n this.signature = sig\n\n const n: Vec3 = stain.normal ?? [0, 1, 0]\n const t1: Vec3 = stain.tangent ?? [1, 0, 0]\n const t2: Vec3 = [n[1] * t1[2] - n[2] * t1[1], n[2] * t1[0] - n[0] * t1[2], n[0] * t1[1] - n[1] * t1[0]]\n smoothOutline(stain.front, profile.stainSubdiv, this.radii)\n const ring = this.ring\n const lift = 0.0015 + 0.0004 * (this.slot % 6)\n const mean = stain.front.reduce((s, v) => s + v, 0) / stain.front.length\n const wet = clamp(stain.wetness, 0, 1)\n const soakRatio = stain.soaked / (stain.soaked + stain.liters + 1e-6)\n\n // Outer film: tinted by the liquid, darker while wet and where it soaked in, fainter once only the mark is left.\n this.tint.setHex(stainColorOf(def))\n const dark = 1 - 0.3 * wet - 0.2 * soakRatio\n const markAlpha = def.leavesMark ? 0.34 : 0.1\n const aMid = (markAlpha + (0.62 - markAlpha) * wet) * (0.75 + 0.25 * Math.min(1, stain.liters * 20 + soakRatio))\n this.writeFan(this.outer, stain.center, n, t1, t2, lift, 1, this.tint.r * dark, this.tint.g * dark, this.tint.b * dark, aMid, aMid * 0.45)\n this.outer.mesh.visible = true\n\n // Inner glossy wet fan, centred where the liquid came in, shrinking as it dries.\n const wr = clamp(stain.wetRadius, 0, 1)\n const showInner = wr > 0.05 && wet > 0.03\n this.inner.mesh.visible = showInner\n if (showInner) {\n this.tint.setHex(def.color)\n const shift = stain.flow ? -mean * 0.1 * (1 - wr) : 0\n const centre: Vec3 = stain.flow\n ? [stain.center[0] + stain.flow[0] * shift, stain.center[1] + stain.flow[1] * shift, stain.center[2] + stain.flow[2] * shift]\n : stain.center\n const a = clamp(def.opacity, 0.2, 0.85) * wet * 0.8\n this.writeFan(this.inner, centre, n, t1, t2, lift + 0.0007, 0.9 * wr, this.tint.r, this.tint.g, this.tint.b, a, a * 0.5)\n }\n this.triangles = ring * (showInner ? 2 : 1)\n this.group.visible = true\n }\n\n private writeFan(\n fan: Fan,\n center: Vec3,\n n: Vec3,\n t1: Vec3,\n t2: Vec3,\n lift: number,\n scale: number,\n r: number,\n g: number,\n b: number,\n aCentre: number,\n aRim: number,\n ): void {\n const ring = this.ring\n const px = center[0] + n[0] * lift\n const py = center[1] + n[1] * lift\n const pz = center[2] + n[2] * lift\n fan.position[0] = px\n fan.position[1] = py\n fan.position[2] = pz\n fan.color[0] = r * 0.85\n fan.color[1] = g * 0.85\n fan.color[2] = b * 0.85\n fan.color[3] = aCentre\n const normalAttr = fan.mesh.geometry.getAttribute('normal') as THREE_NS.BufferAttribute\n for (let i = 0; i <= ring; i++) {\n normalAttr.setXYZ(i, n[0], n[1], n[2])\n }\n normalAttr.needsUpdate = true\n for (let i = 0; i < ring; i++) {\n const a = (i / ring) * Math.PI * 2\n const c = Math.cos(a) * this.radii[i] * scale\n const s = Math.sin(a) * this.radii[i] * scale\n const o = (1 + i) * 3\n fan.position[o] = px + t1[0] * c + t2[0] * s\n fan.position[o + 1] = py + t1[1] * c + t2[1] * s\n fan.position[o + 2] = pz + t1[2] * c + t2[2] * s\n const k = (1 + i) * 4\n fan.color[k] = r\n fan.color[k + 1] = g\n fan.color[k + 2] = b\n fan.color[k + 3] = aRim\n }\n const geometry = fan.mesh.geometry\n ;(geometry.getAttribute('position') as THREE_NS.BufferAttribute).needsUpdate = true\n ;(geometry.getAttribute('color') as THREE_NS.BufferAttribute).needsUpdate = true\n }\n\n dispose(): void {\n for (const fan of [this.outer, this.inner]) fan.mesh.geometry.dispose()\n }\n}\n","import type * as THREE_NS from 'three'\nimport { sampleStream } from '@adatechnology/game-fluids'\nimport type { StreamState } from '@adatechnology/game-fluids'\nimport type { QualityProfile } from './quality'\nimport { clamp } from './util'\nimport type { ThreeLib } from './types'\n\n/** Seconds a stream takes to break up into drops after the world ended it. */\nconst GHOST_TIME = 0.4\n\n/**\n * One stream: a thread along the ballistic path (a tube updated in place) with a growing drop at its leading tip, a trailing drop while it ends,\n * and for thin streams only a sequence of falling drops. The jet narrows as it accelerates.\n */\nexport class StreamVisual {\n readonly tube: THREE_NS.Mesh\n readonly drops: THREE_NS.InstancedMesh\n private readonly positions: Float32Array\n private readonly normals: Float32Array\n private readonly samples: number\n private readonly sides: number\n private readonly matrix: THREE_NS.Matrix4\n private readonly maxDrops: number\n id = ''\n age = 0\n ghostAge = -1\n /** Last known state, kept while the stream breaks into drops. */\n state: StreamState | null = null\n triangles = 0\n\n constructor(\n private readonly THREE: ThreeLib,\n profile: QualityProfile,\n dropGeometry: THREE_NS.SphereGeometry,\n ) {\n const T = THREE\n this.samples = profile.streamSamples\n this.sides = profile.streamSides\n this.maxDrops = Math.max(profile.thinDrops, 2) + 2\n this.positions = new Float32Array(this.samples * this.sides * 3)\n this.normals = new Float32Array(this.samples * this.sides * 3)\n const geometry = new T.BufferGeometry()\n const p = new T.BufferAttribute(this.positions, 3)\n const n = new T.BufferAttribute(this.normals, 3)\n p.setUsage(T.DynamicDrawUsage)\n n.setUsage(T.DynamicDrawUsage)\n geometry.setAttribute('position', p)\n geometry.setAttribute('normal', n)\n const index: number[] = []\n for (let i = 0; i < this.samples - 1; i++) {\n for (let j = 0; j < this.sides; j++) {\n const a = i * this.sides + j\n const b = i * this.sides + ((j + 1) % this.sides)\n const c = (i + 1) * this.sides + j\n const d = (i + 1) * this.sides + ((j + 1) % this.sides)\n index.push(a, c, b, b, c, d)\n }\n }\n geometry.setIndex(index)\n this.tube = new T.Mesh(geometry)\n this.tube.name = 'fluid_stream'\n this.tube.frustumCulled = false\n this.tube.renderOrder = 2\n this.drops = new T.InstancedMesh(dropGeometry, undefined as unknown as THREE_NS.Material, this.maxDrops)\n this.drops.name = 'fluid_stream_drops'\n this.drops.frustumCulled = false\n this.drops.renderOrder = 2\n this.drops.instanceMatrix.setUsage(T.DynamicDrawUsage)\n this.drops.count = 0\n this.matrix = new T.Matrix4()\n }\n\n setMaterial(material: THREE_NS.Material): void {\n this.tube.material = material\n this.drops.material = material\n }\n\n hide(): void {\n this.tube.visible = false\n this.drops.visible = false\n this.drops.count = 0\n this.triangles = 0\n }\n\n private dropAt(slot: number, x: number, y: number, z: number, radius: number): void {\n this.matrix.makeScale(radius, radius, radius).setPosition(x, y, z)\n this.drops.setMatrixAt(slot, this.matrix)\n }\n\n /**\n * Draw the stream. `state` is the world's stream while it lives, or the last known one while ghost (`ghostAge >= 0`).\n */\n update(state: StreamState, gravity: number, dt: number, profile: QualityProfile, time: number): void {\n this.state = state\n this.age += dt\n if (this.ghostAge >= 0) this.ghostAge += dt\n\n const flight = Math.max(0.02, state.flightTime ?? 1)\n const [vx, vy, vz] = state.velocity\n const speed0 = Math.max(0.3, Math.hypot(vx, vy, vz))\n const q = Math.max(state.rate, 0) / 1000\n const r0 = clamp(Math.sqrt(q / (Math.PI * speed0)), 0.0015, 0.03)\n\n const tB = Math.min(flight, this.age)\n // The tail leaves the origin at free fall once the world stopped the stream.\n const tA = this.ghostAge >= 0 ? Math.min(flight, this.ghostAge) : 0\n\n let drops = 0\n const thin = state.thin && this.ghostAge < 0\n\n if (thin) {\n this.tube.visible = false\n this.triangles = 0\n const n = profile.thinDrops\n const phase = time * 1.3\n for (let k = 0; k < n && drops < this.maxDrops; k++) {\n const tau = ((phase + k / n) % 1) * flight\n if (tau > tB) continue\n const p = sampleStream(state, gravity, tau)\n const grow = Math.min(1, tau / (0.12 * flight + 0.02))\n this.dropAt(drops++, p[0], p[1], p[2], Math.max(0.002, r0 * 1.8) * (0.4 + 0.6 * grow))\n }\n } else if (tB - tA > 0.015) {\n this.writeTube(state, gravity, tA, tB, r0, speed0)\n this.tube.visible = true\n this.triangles = (this.samples - 1) * this.sides * 2\n // Leading drop that grows and detaches while the jet is still advancing; trailing drop while it ends.\n if (tB < flight) {\n const p = sampleStream(state, gravity, tB)\n const w = this.radiusAt(state, gravity, tB, r0, speed0)\n this.dropAt(drops++, p[0], p[1], p[2], w * 1.35)\n }\n if (this.ghostAge >= 0) {\n const p = sampleStream(state, gravity, tA)\n const w = this.radiusAt(state, gravity, tA, r0, speed0)\n this.dropAt(drops++, p[0], p[1], p[2], w * 1.4 * (1 - this.ghostAge / GHOST_TIME * 0.4))\n }\n } else {\n this.tube.visible = false\n this.triangles = 0\n if (tA < flight) {\n // Only the drop is left.\n const p = sampleStream(state, gravity, this.ghostAge >= 0 ? tA : tB)\n this.dropAt(drops++, p[0], p[1], p[2], Math.max(0.003, r0 * 1.3))\n }\n }\n\n this.drops.count = drops\n this.drops.visible = drops > 0\n this.drops.instanceMatrix.needsUpdate = true\n this.triangles += drops * 24\n }\n\n /** The ghost is over once its tail reached the landing. */\n get finished(): boolean {\n return this.ghostAge >= 0 && (this.ghostAge >= GHOST_TIME || this.ghostAge >= (this.state?.flightTime ?? 0))\n }\n\n private radiusAt(state: StreamState, gravity: number, t: number, r0: number, speed0: number): number {\n const vy = state.velocity[1] - gravity * t\n const speed = Math.max(0.3, Math.hypot(state.velocity[0], vy, state.velocity[2]))\n const fade = this.ghostAge >= 0 ? clamp(1 - this.ghostAge / GHOST_TIME, 0.15, 1) : 1\n return r0 * Math.sqrt(speed0 / speed) * fade\n }\n\n private writeTube(state: StreamState, gravity: number, tA: number, tB: number, r0: number, speed0: number): void {\n const n = this.samples\n const sides = this.sides\n for (let i = 0; i < n; i++) {\n const k = i / (n - 1)\n const t = tA + (tB - tA) * k\n const p = sampleStream(state, gravity, t)\n const vx = state.velocity[0]\n const vy = state.velocity[1] - gravity * t\n const vz = state.velocity[2]\n const l = Math.hypot(vx, vy, vz) || 1\n const tx = vx / l\n const ty = vy / l\n const tz = vz / l\n // Any vector not parallel to the tangent gives the first side axis.\n const ax = Math.abs(tz) < 0.9 ? 0 : 1\n const az = Math.abs(tz) < 0.9 ? 1 : 0\n let b1x = ty * az - tz * 0\n let b1y = tz * ax - tx * az\n let b1z = tx * 0 - ty * ax\n const bl = Math.hypot(b1x, b1y, b1z) || 1\n b1x /= bl\n b1y /= bl\n b1z /= bl\n const b2x = ty * b1z - tz * b1y\n const b2y = tz * b1x - tx * b1z\n const b2z = tx * b1y - ty * b1x\n // Rounded ends: the radius tapers to a bead at both ends.\n const end = Math.min(1, 0.35 + Math.min(k, 1 - k) * 8)\n const r = this.radiusAt(state, gravity, t, r0, speed0) * end\n for (let j = 0; j < sides; j++) {\n const a = (j / sides) * Math.PI * 2\n const c = Math.cos(a)\n const s = Math.sin(a)\n const nx = b1x * c + b2x * s\n const ny = b1y * c + b2y * s\n const nz = b1z * c + b2z * s\n const o = (i * sides + j) * 3\n this.positions[o] = p[0] + nx * r\n this.positions[o + 1] = p[1] + ny * r\n this.positions[o + 2] = p[2] + nz * r\n this.normals[o] = nx\n this.normals[o + 1] = ny\n this.normals[o + 2] = nz\n }\n }\n const g = this.tube.geometry\n ;(g.getAttribute('position') as THREE_NS.BufferAttribute).needsUpdate = true\n ;(g.getAttribute('normal') as THREE_NS.BufferAttribute).needsUpdate = true\n }\n\n start(id: string): void {\n this.id = id\n this.age = 0\n this.ghostAge = -1\n this.state = null\n }\n\n dispose(): void {\n this.tube.geometry.dispose()\n this.drops.dispose()\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { FluidEvent, StainState, StreamState } from '@adatechnology/game-fluids'\nimport { LiquidBody } from './liquid-body'\nimport { MaterialCache } from './materials'\nimport { ParticlePool } from './particles'\nimport { profileOf } from './quality'\nimport { StainVisual } from './stains'\nimport { StreamVisual } from './streams'\nimport type { BindOptions, FluidQuality, FluidRenderer, FluidRendererOptions, FluidRendererStats, ThreeLib } from './types'\n\n/**\n * Draws a `FluidWorld` with three.js. It only reads the world state (plus `splash` events for droplets), so a LAN client that receives the\n * same world state draws the same liquids.\n */\nexport function createFluidRenderer(THREE: ThreeLib, options: FluidRendererOptions): FluidRenderer {\n const { scene, fluids } = options\n const quality: FluidQuality = options.quality ?? 'medium'\n const profile = profileOf(quality)\n const materials = new MaterialCache(THREE, options.envMap ?? null)\n const root = new THREE.Group()\n root.name = 'fluid_renderer'\n scene.add(root)\n const particles = new ParticlePool(THREE, profile.maxParticles, options.pointScale ?? 600)\n root.add(particles.points)\n const dropGeometry = new THREE.SphereGeometry(1, 8, 6)\n\n const bodies = new Map<string, LiquidBody>()\n const streamsActive = new Map<string, StreamVisual>()\n const streamsFree: StreamVisual[] = []\n let streamsCreated = 0\n const stainsActive = new Map<string, StainVisual>()\n const stainsFree: StainVisual[] = []\n let stainsCreated = 0\n let time = 0\n let disposed = false\n\n const offSplash = fluids.on('splash', (e: FluidEvent) => {\n if (e.type !== 'splash' || disposed) return\n const def = fluids.liquids.get(e.liquid)\n if (!def) return\n particles.splash(e.point, e.intensity, def.color, def.opacity, profile.splashDroplets)\n })\n\n // ---- streams ----\n\n const acquireStream = (id: string): StreamVisual | null => {\n let v = streamsFree.pop() ?? null\n if (!v) {\n if (streamsCreated >= profile.maxStreams) return null\n streamsCreated++\n v = new StreamVisual(THREE, profile, dropGeometry)\n root.add(v.tube, v.drops)\n }\n v.start(id)\n return v\n }\n\n const releaseStream = (v: StreamVisual): void => {\n v.hide()\n streamsActive.delete(v.id)\n streamsFree.push(v)\n }\n\n const syncStreams = (dt: number): void => {\n const live = fluids.streams()\n const seen = new Set<string>()\n // Biggest first, so the budget keeps the visible ones.\n live.sort((a: StreamState, b: StreamState) => b.rate - a.rate)\n for (const s of live) {\n seen.add(s.id)\n let v = streamsActive.get(s.id)\n if (!v) {\n const fresh = acquireStream(s.id)\n if (!fresh) continue\n v = fresh\n streamsActive.set(s.id, v)\n }\n const def = fluids.liquids.get(s.liquid)\n if (!def) continue\n v.ghostAge = -1\n v.setMaterial(materials.liquidStream(def))\n v.update(s, fluids.gravity, dt, profile, time)\n }\n for (const v of [...streamsActive.values()]) {\n if (seen.has(v.id)) continue\n // The world ended it: let it break into drops.\n if (v.ghostAge < 0) v.ghostAge = 0\n if (!v.state || v.finished) {\n releaseStream(v)\n continue\n }\n v.update(v.state, fluids.gravity, dt, profile, time)\n if (v.finished) releaseStream(v)\n }\n }\n\n // ---- stains ----\n\n const syncStains = (): void => {\n const all = fluids.stains()\n // Keep the newest stains when the budget is smaller than the world.\n const wanted = all.length > profile.maxStains ? [...all].sort((a: StainState, b: StainState) => (a.age ?? 0) - (b.age ?? 0)).slice(0, profile.maxStains) : all\n const ids = new Set(wanted.map((s: StainState) => s.id))\n for (const [id, v] of [...stainsActive]) {\n if (ids.has(id)) continue\n v.hide()\n stainsActive.delete(id)\n stainsFree.push(v)\n }\n for (const s of wanted) {\n const def = fluids.liquids.get(s.liquid)\n if (!def) continue\n let v = stainsActive.get(s.id)\n if (!v) {\n v = stainsFree.pop()\n if (!v) {\n if (stainsCreated >= profile.maxStains) continue\n v = new StainVisual(THREE, profile, stainsCreated++)\n root.add(v.group)\n }\n v.stainId = s.id\n v.signature = Number.NaN\n v.assign(def, materials)\n stainsActive.set(s.id, v)\n }\n v.update(s, def, profile)\n }\n }\n\n // ---- public ----\n\n const renderer: FluidRenderer = {\n bindContainer(containerId: string, object: THREE_NS.Object3D, opts: BindOptions = {}) {\n renderer.unbindContainer(containerId)\n bodies.set(containerId, new LiquidBody(THREE, containerId, object, opts.innerOffset ?? [0, 0, 0]))\n },\n\n unbindContainer(containerId: string) {\n const body = bodies.get(containerId)\n if (!body) return\n body.dispose()\n bodies.delete(containerId)\n },\n\n update(dt: number) {\n if (disposed) return\n time += dt\n for (const body of bodies.values()) body.update(dt, fluids, materials, profile, particles)\n syncStreams(dt)\n syncStains()\n particles.update(dt, fluids.gravity)\n },\n\n clear() {\n for (const v of [...streamsActive.values()]) releaseStream(v)\n for (const [id, v] of [...stainsActive]) {\n v.hide()\n stainsActive.delete(id)\n stainsFree.push(v)\n }\n particles.clear()\n },\n\n dispose() {\n if (disposed) return\n disposed = true\n offSplash()\n for (const body of bodies.values()) body.dispose()\n bodies.clear()\n for (const v of [...streamsActive.values(), ...streamsFree]) v.dispose()\n for (const v of [...stainsActive.values(), ...stainsFree]) v.dispose()\n streamsActive.clear()\n stainsActive.clear()\n streamsFree.length = 0\n stainsFree.length = 0\n particles.dispose()\n dropGeometry.dispose()\n materials.dispose()\n scene.remove(root)\n root.clear()\n },\n\n stats(): FluidRendererStats {\n let triangles = 0\n let containers = 0\n for (const body of bodies.values()) {\n triangles += body.triangles\n if (body.visible) containers++\n }\n for (const v of streamsActive.values()) triangles += v.triangles\n for (const v of stainsActive.values()) triangles += v.triangles\n return {\n quality,\n containers,\n streams: streamsActive.size,\n stains: stainsActive.size,\n particles: particles.count,\n triangles,\n budget: { stains: profile.maxStains, streams: profile.maxStreams, particles: profile.maxParticles },\n }\n },\n }\n\n return renderer\n}\n\n","import type * as THREE_NS from 'three'\nimport type { DestructibleSpec, PartSpec } from '@adatechnology/game-destruction'\n\n/** Default look of each built-in destruction material (`0xRRGGBB`). */\nexport const MATERIAL_COLORS: Record<string, number> = {\n steel: 0x8d949c,\n cast_iron: 0x4a4d52,\n aluminium: 0xc4c9ce,\n copper: 0xb8733a,\n wood_soft: 0xb9854f,\n wood_hard: 0x7a4a26,\n plywood: 0xc9a46a,\n mdf: 0xa88b64,\n glass: 0x9cd6e6,\n tempered_glass: 0x9cd6e6,\n ceramic: 0xe9e4da,\n concrete: 0x9a9a96,\n brick: 0xa5472e,\n plaster: 0xe6e1d4,\n stone: 0x77746f,\n plastic: 0x3b78c4,\n rubber: 0x1f1f22,\n fabric: 0x8a4b5e,\n foam: 0xe3c458,\n leather: 0x5b3a26,\n paper: 0xeeeadf,\n foliage: 0x3f8f3a,\n green_wood: 0x6b4a2b,\n cactus: 0x3e7d4a,\n flesh_fruit: 0xd24b32,\n wax: 0xefe2b5,\n soil: 0x4a3322,\n}\n\nexport interface BuildFromSpecOptions {\n /** Colour per part id, then per material id (falls back to `MATERIAL_COLORS`, then grey). */\n colors?: Record<string, number>\n /** Segments of cylinders and spheres (default 12: low poly on purpose). */\n segments?: number\n /** Cast and receive shadows (default true). */\n shadows?: boolean\n}\n\nconst TRANSPARENT: Record<string, number> = { glass: 0.38, tempered_glass: 0.38 }\n\n/**\n * Draw any `DestructibleSpec` as plain meshes: one mesh per part (box, cylinder or sphere) with `name` and `userData.destructionPart` set to the\n * part id and `userData.destructionMaterial` to its material, so `renderer.bind` and `specFromObject3D` find them. Useful for teams that describe\n * objects as specs and want something to look at while they tune them.\n */\nexport function buildFromSpec(THREE: typeof THREE_NS, spec: DestructibleSpec, options: BuildFromSpecOptions = {}): THREE_NS.Group {\n const root = new THREE.Group()\n root.name = spec.name ?? 'object'\n const seg = options.segments ?? 12\n const shadows = options.shadows !== false\n const mats = new Map<string, THREE_NS.Material>()\n const materialFor = (p: PartSpec): THREE_NS.Material => {\n const color = options.colors?.[p.id] ?? options.colors?.[p.material] ?? MATERIAL_COLORS[p.material] ?? 0x888888\n const key = `${p.material}:${color}`\n let m = mats.get(key)\n if (!m) {\n const alpha = TRANSPARENT[p.material]\n const metal = p.material === 'steel' || p.material === 'aluminium' || p.material === 'copper' || p.material === 'cast_iron'\n m = new THREE.MeshStandardMaterial({\n color,\n roughness: alpha ? 0.1 : metal ? 0.45 : 0.85,\n metalness: metal ? 0.7 : 0,\n transparent: !!alpha,\n opacity: alpha ?? 1,\n depthWrite: !alpha,\n })\n mats.set(key, m)\n }\n return m\n }\n for (const p of spec.parts) {\n let geo: THREE_NS.BufferGeometry\n const s = p.shape\n if (s.kind === 'box') geo = new THREE.BoxGeometry(s.size[0], s.size[1], s.size[2])\n else if (s.kind === 'cylinder') geo = new THREE.CylinderGeometry(s.radius, s.radius, s.height, seg)\n else geo = new THREE.SphereGeometry(s.radius, seg, Math.max(6, seg - 4))\n const mesh = new THREE.Mesh(geo, materialFor(p))\n mesh.name = p.id\n mesh.userData.destructionPart = p.id\n mesh.userData.destructionMaterial = p.material\n mesh.position.set(p.position[0], p.position[1], p.position[2])\n if (p.rotation) mesh.rotation.set(p.rotation[0], p.rotation[1], p.rotation[2], 'XYZ')\n mesh.castShadow = shadows && !TRANSPARENT[p.material]\n mesh.receiveShadow = shadows\n root.add(mesh)\n }\n return root\n}\n","/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type TestRoomLocale = 'en' | 'pt-BR'\n\nexport interface RoomStrings {\n /** Display name per demo item id (see `DEMO_ITEMS`). */\n items: Record<string, string>\n /** Display name per demo catalogue group. */\n groups: Record<string, string>\n /** Every other text: UI, log lines, scenario names and checks. `{name}` placeholders are replaced. */\n text: Record<string, string>\n}\n\nconst en: RoomStrings = {\n items: {\n chair: 'Wooden chair',\n sofa: 'Sofa',\n shelf: 'Shelf with boards',\n old_tv: 'Old TV',\n steel_sheet: 'Steel sheet on a stand',\n glass_pane: 'Glass pane',\n concrete_block: 'Concrete block',\n brick_column: 'Brick column',\n building_frame: 'Building frame',\n car_door: 'Car door',\n small_tree: 'Small tree',\n potted_plant: 'Potted plant',\n coffee_cup: 'Cup of coffee',\n glass_bottle: 'Glass bottle',\n wooden_crate: 'Wooden crate',\n steel_drum: 'Steel drum',\n plastic_bucket: 'Plastic bucket',\n jerrycan: 'Jerrycan',\n gas_bottle: 'Gas bottle',\n },\n groups: { furniture: 'Furniture', structure: 'Structure', vehicles: 'Vehicles', plants: 'Plants', items: 'Items', containers: 'Containers' },\n text: {\n 'locale.decimal': '.',\n yes: 'yes',\n no: 'no',\n piece: 'piece',\n coords: 'x {x} · z {z}',\n 'count.piece.one': '1 piece',\n 'count.piece.other': '{n} pieces',\n 'count.joint.one': '1 joint',\n 'count.joint.other': '{n} joints',\n 'count.dent.one': '1 dent',\n 'count.dent.other': '{n} dents',\n 'count.hole.one': '1 hole',\n 'count.hole.other': '{n} holes',\n 'count.crack.one': '1 crack',\n 'count.crack.other': '{n} cracks',\n 'joint.generic': 'joint',\n 'lost.broken': 'broke',\n 'lost.melted': 'melted away',\n 'lost.ashes': 'burned to ash',\n 'tool.none': 'by hand only',\n 'arena.target_wall': 'Target wall',\n 'arena.table': 'Table',\n 'arena.shelf': 'Shelf',\n 'surface.floor': 'on the floor',\n 'surface.ground': 'on the floor',\n 'surface.table': 'on the table',\n 'by.break': 'broken loose',\n 'by.tool': 'undone with a tool',\n 'by.part_lost': 'the part next to it was lost',\n 'dmg.ballistic': 'ballistic',\n 'dmg.blunt': 'blunt',\n 'dmg.slash': 'slash',\n 'dmg.explosive': 'blast',\n 'dmg.fire': 'fire',\n 'dmg.heat': 'heat',\n 'effect.caffeine': 'caffeine',\n 'effect.alcohol': 'alcohol',\n 'effect.poison': 'poison',\n 'effect.disgust': 'disgust',\n\n 'ev.dent': '{where}: dent of {mm} mm, {hp}',\n 'ev.hole.through': '{where}: {mm} mm hole went through, {hp}',\n 'ev.hole.stuck': '{where}: {mm} mm hole, did not go through, {hp}',\n 'ev.dents': '{where}: {n} dents, deepest {mm} mm, {hp}',\n 'ev.holes': '{where}: {n} holes of {mm} mm, {thr} went through, {hp}',\n 'ev.leak.tail': ', leaking {liquid} at {rate} l/s',\n 'ev.leak.alone': '{where}: leaking {liquid} at {rate} l/s',\n 'ev.crack': '{where}: cracked, {rays} rays up to {cm} cm, {hp}',\n 'ev.ricochet': '{where}: bullet ricocheted, {energy} J left',\n 'ev.fracture.shatter': '{where}: shattered into {n} shards',\n 'ev.fracture.crumble': '{where}: crumbled into {n} chunks',\n 'ev.fracture.splinter': '{where}: splintered into {n} pieces',\n 'ev.fracture.tear': '{where}: torn into {n} scraps',\n 'ev.fracture.snap': '{where}: snapped into {n} pieces',\n 'ev.fracture.none': '{where}: broke into {n} pieces',\n 'ev.detach': '{obj}: {a} came off {b} ({by}); the object now has {pieces}',\n 'ev.detach.many.break': '{obj}: {joints} broke loose; the object now has {pieces}',\n 'ev.detach.many.tool': '{obj}: {joints} undone with a tool; the object now has {pieces}',\n 'ev.lost.tail': ' and came loose from {joints}; the object now has {pieces}',\n 'ev.lost.alone': '{where}: {verb} and came loose from {joints}; the object now has {pieces}',\n 'ev.cracks': '{where}: cracking under the load, {n} cracks so far, longest {cm} cm, {hp}',\n 'ev.disassemble': '{obj}: undoing the {kind} between {a} and {b} with {tool}: {pct}%',\n 'ev.ignite': '{where}: caught fire at {temp} °C',\n 'ev.ignite.many': '{obj}: {n} parts caught fire at {temp} °C ({parts})',\n 'ev.extinguish': '{where}: fire put out',\n 'ev.extinguish.many': '{obj}: fire put out on {n} parts ({parts})',\n 'ev.burnout': '{where}: burned to ash',\n 'ev.melt': '{where}: melting, {pct}% melted away',\n 'ev.drip': '{where}: dripping molten material',\n 'ev.explode': '{where}: exploded, {energy} J within {radius} m',\n 'ev.destroyed': '{obj}: destroyed',\n 'ev.damage': '{where}: {type} damage {amount}, {hp}',\n 'ev.damage.overload': '{where}: crushed by the weight it carries, lost {amount} hp so far, {hp}',\n 'ev.stress': '{where}: overloaded at {stress}% of its capacity, carrying {load} kg',\n 'ev.collapse': '{obj}: collapsed, {pieces} fell ({mass} kg): {parts}',\n 'ev.stain_ignite': 'The {liquid} stain at x {x} · z {z} caught fire and will burn for about {seconds} s',\n 'ev.stain_burned': 'The burning stain burned itself out',\n 'ev.fire_dries': 'Fire dried the wet stains nearby',\n\n 'fl.fill': '{who}: filled with {liquid} (+{liters} l)',\n 'fl.pour': '{who}: pouring {liquid} at {rate} l/s',\n 'fl.spill': '{who}: spilled {liquid} over the lip at {rate} l/s',\n 'fl.leak': '{who}: leaking {liquid} at {rate} l/s',\n 'fl.drink': '{who}: drank {liters} l, thirst +{thirst}',\n 'fl.burn': 'too hot: burned the mouth',\n 'fl.empty': '{who}: empty',\n 'fl.splash': 'Splash of {liquid}',\n 'fl.stain': 'Stain of {liquid} {surface} at {where}',\n 'fl.stains': '{n} stains of {liquid} {surface}, the latest at {where}',\n 'fl.dried': 'A stain dried up',\n 'fl.dried.mark': 'A stain dried and left a mark',\n 'fl.dried.known': 'The {liquid} stain {surface} at {where} dried up',\n 'fl.dried.known.mark': 'The {liquid} stain {surface} at {where} dried and left a mark',\n 'fl.dried.many': '{n} {liquid} stains dried up',\n 'fl.dried.many.mark': '{n} {liquid} stains dried and left marks',\n 'fl.mix': '{who}: {from} mixed into {into}',\n\n 'act.anim_start': '{name}: animation \"{clip}\" ({seconds} s)',\n 'act.anim_event': '{name}: \"{clip}\" event {type}',\n 'act.anim_end': '{name}: animation \"{clip}\" finished',\n 'act.module_loaded': 'Module \"{name}\" loaded: {items} item(s), {scenarios} scenario(s), contract checks: {result}',\n 'mod.all_ok': 'all passed',\n 'mod.some_failed': 'some FAILED',\n 'mod.destructible_ok': '{name}: destructible contract ok ({parts} parts, hit and state well-formed)',\n 'mod.destructible_fail': '{name}: destructible contract broken: {problems}',\n 'mod.animation_ok': '{name}: animation \"{clip}\" ok ({seconds} s)',\n 'mod.spec_ok': '{name}: spec ok ({parts} parts)',\n 'mod.spec_fail': '{name}: spec broken: {problems}',\n 'mod.spec_warn': '{name}: spec warning: {warning}',\n 'mod.animation_fail': '{name}: animation \"{clip}\" broken: {problems}',\n 'ui.animations': 'Animations',\n 'ui.animations_aim': 'Aim at an item or hold it to see its animations.',\n 'ui.animations_none': 'This item brings no animations.',\n 'act.spawn': 'Spawned {name} at x {x} · z {z}',\n 'act.clear': 'Cleared the room',\n 'act.reset': 'Repaired every object',\n 'act.tool': 'Equipped {weapon}',\n 'act.shoot.hit': '{weapon}: shot, {energy} J, hit {where} at {dist} m',\n 'act.shoot.miss': '{weapon}: shot, {energy} J, hit nothing',\n 'act.shoot.pellets': '{weapon}: shot, {n} projectiles of up to {energy} J, {hits} hit {where} at {dist} m',\n 'act.melee.hit': '{weapon}: strike, {energy} J, hit {where} at {dist} m',\n 'act.melee.miss': '{weapon}: struck the air',\n 'act.flame.hit': '{weapon}: flame at {temp} °C on {where}',\n 'act.flame.air': '{weapon}: flame, nothing in range',\n 'act.heat.hit': '{weapon}: heating {where} at {temp} °C',\n 'act.heat.air': '{weapon}: nothing in range',\n 'act.throw.grenade': '{weapon}: thrown, fuse {fuse} s',\n 'act.throw.molotov': '{weapon}: thrown, breaks on impact',\n 'act.explode': '{weapon}: exploded, {energy} J within {radius} m, {n} objects in range',\n 'act.molotov_fire': '{weapon}: fire on the ground, radius {radius} m for {seconds} s',\n 'act.tool.none': '{weapon}: nothing in reach',\n 'act.tool.nojoint': '{weapon}: no joint near {where}',\n 'act.tool.refused': '{weapon} cannot undo the {kind} of {obj}; it needs: {need}',\n 'act.extinguish.hit': '{weapon}: foam on {what}',\n 'act.extinguish.air': '{weapon}: foam, nothing in range',\n 'act.grab': 'Grabbed {name} ({kg} kg)',\n 'act.drop': 'Dropped {name}',\n 'act.throw': 'Threw {name} at {speed} m/s',\n 'act.landing': '{name} landed at {speed} m/s: {energy} J',\n 'act.impact': '{name} hit {where} at {speed} m/s: {energy} J of blunt damage',\n 'act.use_item': '{name}: {use}',\n 'act.tap.on': 'Tap opened',\n 'act.tap.off': 'Tap closed',\n\n 'use.drink': 'drink',\n 'use.sip': 'sip',\n 'use.chug': 'chug',\n 'use.pour': 'pour',\n 'use.pour_out': 'pour out',\n 'use.open': 'open',\n 'use.close': 'close',\n\n 'hud.reloading': 'Reloading...',\n 'hud.empty': 'Empty',\n 'hud.no_fuel': 'Out of fuel',\n 'hud.nothing_to_grab': 'Nothing to grab here',\n 'hud.cannot_grab': '{name} cannot be picked up',\n 'hud.too_heavy': '{name} is too heavy ({kg} kg)',\n 'hud.empty_container': '{name} is empty',\n 'hud.refused': 'Wrong tool for the {kind}',\n 'hud.drop': 'drop',\n 'hud.rotate': 'rotate',\n 'hud.throw': 'throw',\n 'hud.tilt': 'tilt (hold)',\n 'hud.equip': 'equip {weapon}',\n\n 'ui.help': 'Click: look · WASD: walk · Shift: run · Space: jump · 1-0 / wheel: tool · LMB: use · E: grab/drop · G or RMB: throw · Tab: panels · Esc: free the mouse',\n 'ui.log': 'Behaviour log',\n 'ui.filter.action': 'actions',\n 'ui.filter.event': 'events',\n 'ui.filter.check': 'checks',\n 'ui.autoscroll': 'autoscroll',\n 'log.export_cancelled': 'export cancelled',\n 'ui.copy_json': 'Copy JSON',\n 'ui.download_ndjson': 'Download NDJSON',\n 'ui.download_txt': 'Download TXT',\n 'ui.clear_log': 'Clear',\n 'ui.catalog': 'Catalogue',\n 'ui.clear': 'Clear',\n 'ui.reset_all': 'Reset all',\n 'ui.slow': 'Slow motion 0.25×',\n 'ui.fast': 'Time ×10',\n 'ui.tap': 'Tap',\n 'ui.quality': 'Quality',\n 'ui.quality.low': 'low',\n 'ui.quality.medium': 'medium',\n 'ui.quality.high': 'high',\n 'ui.equip': 'Equip as a tool',\n 'ui.objects': '{n} objects',\n 'ui.tests': 'Tests',\n 'ui.run_all': 'Run all',\n 'ui.running': 'Running...',\n 'ui.report': '{passed} passed, {failed} failed',\n 'ui.panel': 'Panels',\n 'ui.inspector': 'Inspector',\n 'ui.aim_at_something': 'Aim at an object',\n 'ins.material': 'Material',\n 'ins.status': 'Status',\n 'ins.burning': 'burning',\n 'ins.hp': 'Hit points',\n 'ins.temperature': 'Temperature',\n 'ins.char': 'Charred',\n 'ins.melt': 'Melted',\n 'ins.liters': 'Liquid',\n 'ins.damage': 'Marks',\n 'ins.damage_counts': '{dents}, {holes}, {cracks}',\n 'ins.mass': 'Mass',\n 'ins.load': 'Load',\n 'ins.stress': 'Stress',\n 'ins.joints': 'Joints',\n 'ins.open': 'open',\n\n 'sc.start': 'Scenario: {name}',\n 'sc.pass': 'Scenario passed: {name}',\n 'sc.fail': 'Scenario FAILED: {name}',\n 'sc.error': 'the scenario threw an error: {msg}',\n 'leg.still': 'leg_1 still attached',\n 'leg.gone': 'leg_1 came off',\n\n 'sc.steel_through_hole': '9 mm into a steel sheet makes a through hole',\n 'sc.steel_through_hole.check': '9 mm into 3 mm steel: {holes} hole(s) of {mm} mm, went through: {through}, sheet {hp} hp (expected: through)',\n 'sc.concrete_stops_bullet': '9 mm into a concrete block does not go through',\n 'sc.concrete_stops_bullet.check': '9 mm into 40 cm of concrete: went through: {through}, {dents}, {holes}, {cracks}, block {hp} hp (expected: stopped, wall behind untouched)',\n 'sc.hammer_dents_drum': 'Hammer dents a steel drum',\n 'sc.hammer_dents_drum.check': 'Hammer on the drum: {swings} swing(s), {dents} dent(s), first {depth} mm deep, body {hp} hp (expected: dented, not broken)',\n 'sc.glass_shatters': 'Glass pane shatters after a few 9 mm shots',\n 'sc.glass_shatters.check': 'Glass pane: broken after {shots} shot(s) into {n} shards (expected: broken, at least 4 shards)',\n 'sc.shotgun_splinters_crate': 'Shotgun splinters a wooden crate',\n 'sc.shotgun_splinters_crate.check': '12 ga on the crate: {shots} shot(s), {splinters} board(s) splintered, {holes} holes (expected: at least one splintered)',\n 'sc.kick_chair_leg': 'A kick takes a chair leg off',\n 'sc.kick_chair_leg.check': 'Chair: {kicks} kick(s), {groups} group(s), loose pieces {before} → {after}, {leg} (expected: a loose piece appears)',\n 'sc.kick_detaches_leg_via_tool': 'The kick tool (hotbar) takes a chair leg off',\n 'sc.kick_detaches_leg_via_tool.check': 'Chair, kick tool: {kicks} kick(s), loose pieces {before} → {after}, {leg} (expected: a loose piece appears)',\n 'sc.screwdriver_shelf_board': 'Screwdriver takes a screwed shelf board off in about 2.5 s',\n 'sc.screwdriver_shelf_board.check': 'Screwdriver on the shelf board: took {secs} s, expected about {want} s, the shelf is now in {pieces}',\n 'sc.wrong_tool_refused': 'The wrong tool is refused',\n 'sc.wrong_tool_refused.check': 'Screwdriver on a weld: refused {refused} time(s), joints opened {opened} (expected: refused, none opened)',\n 'sc.lighter_burns_crate': 'A lighter ignites a wooden crate and it ends as ash',\n 'sc.lighter_burns_crate.lit': 'Lighter on the crate: burning: {lit} (expected: yes)',\n 'sc.lighter_burns_crate.ash': 'After burning for 500 s: {ash} of {total} boards are ash, most charred {char}% (expected: all ash or charred)',\n 'sc.torch_melts_steel': 'Wood fire does not melt a steel drum, the cutting torch does',\n 'sc.torch_melts_steel.wood': 'Burning crate next to the drum: drum peaked at {peak} °C, melted {melt}%, crate still burning: {crate} (expected: no melt)',\n 'sc.torch_melts_steel.torch': 'Cutting torch on the drum: {temp} °C, melted {melt}% (expected: melting)',\n 'sc.bucket_melts_drips': 'A plastic bucket melts and drips near fire',\n 'sc.bucket_melts_drips.check': 'Bucket in flames: melted {melt}%, {temp} °C, {drips} drip line(s) (expected: melting)',\n 'sc.gas_bottle_explodes': 'A gas bottle in a fire explodes and pushes a crate',\n 'sc.gas_bottle_explodes.explode': 'Gas bottle in fire: exploded after {seconds} s (expected: explodes)',\n 'sc.gas_bottle_explodes.push': 'Crate 1.3 m away: moved {moved} m, lost {lost} (expected: pushed or broken)',\n 'sc.bottle_drop_shatters': 'A glass bottle dropped from 1.5 m shatters',\n 'sc.bottle_drop_shatters.check': 'Bottle dropped from 1.5 m: status {status}, {cracks} cracks, water stain: {stain} (expected: broken, water on the floor)',\n 'sc.throw_chair_at_wall': 'A chair thrown at the wall deals blunt damage',\n 'sc.throw_chair_at_wall.check': 'Chair thrown at the wall: {impacts} impact(s), first {energy} J, {wall} damage line(s) on the wall (expected: impact and damage)',\n 'sc.coffee_three_sips': 'Three sips of coffee lower the level and log caffeine',\n 'sc.coffee_three_sips.check': 'Coffee: {sips} sip(s), level {before} → {after} l, caffeine logged: {caffeine}, burned the mouth: {burn} (expected: 3 sips, caffeine)',\n 'sc.tilt_cup_spills': 'Tilting the cup spills coffee and leaves a stain',\n 'sc.tilt_cup_spills.check': 'Cup tilted: level {before} → {after} l, {stains} coffee stain(s) (expected: spilled with a stain)',\n 'sc.jerrycan_leaks_fuel': 'Shooting the jerrycan makes a leak and a fuel stain',\n 'sc.jerrycan_leaks_fuel.check': 'Jerrycan shot: {streams} leak stream(s), fuel stain: {stain}, {left} l left of 20, hole line mentions the leak: {leak} (expected: leaking, stain)',\n 'sc.fuel_stain_burns': 'A lit fuel stain burns',\n 'sc.fuel_stain_burns.stain': 'Fuel stain on the floor after the leak: {stain} (expected: yes)',\n 'sc.fuel_stain_burns.ignite': 'Lighter on the stain: {ignited} ignition(s), fire reached nearby objects: {near} (expected: ignited)',\n 'sc.fuel_stain_burns.out': 'After 30 s the stain burned out: {burned} (expected: yes)',\n 'roof.standing': 'roof standing',\n 'roof.fell': 'roof fell',\n 'sc.one_column_roof_stands': 'One column destroyed: the roof stays up',\n 'sc.one_column_roof_stands.check': 'Frame with one column gone: {roof}, heaviest collapse {heavy} kg, peak stress {stress}% (expected: standing, no big collapse)',\n 'sc.two_columns_roof_collapses': 'Two columns destroyed: the roof collapses',\n 'sc.two_columns_roof_collapses.check': 'Frame with two columns gone: the others at {stress}% right away, then heavy loose pieces: {pieces} ({kg} kg), collapse event logged: {logged} (expected: the roof comes down)',\n 'sc.extinguisher_puts_out_fire': 'The extinguisher puts out a burning crate',\n 'sc.extinguisher_puts_out_fire.burning': 'Crate set on fire: burning: {burning} (expected: yes)',\n 'sc.extinguisher_puts_out_fire.out': 'After the extinguisher: still burning: {burning}, {events} extinguish event(s) (expected: out)',\n },\n}\n\nconst ptBR: RoomStrings = {\n items: {\n chair: 'Cadeira de madeira',\n sofa: 'Sofá',\n shelf: 'Estante com prateleiras',\n old_tv: 'TV antiga',\n steel_sheet: 'Chapa de aço com suporte',\n glass_pane: 'Vidro de janela',\n concrete_block: 'Bloco de concreto',\n brick_column: 'Coluna de tijolos',\n building_frame: 'Estrutura de prédio',\n car_door: 'Porta de carro',\n small_tree: 'Árvore pequena',\n potted_plant: 'Vaso de planta',\n coffee_cup: 'Copo de café',\n glass_bottle: 'Garrafa de vidro',\n wooden_crate: 'Caixote de madeira',\n steel_drum: 'Tambor de aço',\n plastic_bucket: 'Balde de plástico',\n jerrycan: 'Galão',\n gas_bottle: 'Botijão de gás',\n },\n groups: { furniture: 'Móveis', structure: 'Estrutura', vehicles: 'Veículos', plants: 'Plantas', items: 'Itens', containers: 'Recipientes' },\n text: {\n 'locale.decimal': ',',\n yes: 'sim',\n no: 'não',\n piece: 'peça',\n coords: 'x {x} · z {z}',\n 'count.piece.one': '1 peça',\n 'count.piece.other': '{n} peças',\n 'count.joint.one': '1 encaixe',\n 'count.joint.other': '{n} encaixes',\n 'count.dent.one': '1 amassado',\n 'count.dent.other': '{n} amassados',\n 'count.hole.one': '1 furo',\n 'count.hole.other': '{n} furos',\n 'count.crack.one': '1 trinca',\n 'count.crack.other': '{n} trincas',\n 'joint.generic': 'junta',\n 'lost.broken': 'quebrou',\n 'lost.melted': 'derreteu',\n 'lost.ashes': 'virou cinza',\n 'tool.none': 'só com a mão',\n 'arena.target_wall': 'Parede de alvo',\n 'arena.table': 'Mesa',\n 'arena.shelf': 'Estante',\n 'surface.floor': 'no chão',\n 'surface.ground': 'no chão',\n 'surface.table': 'na mesa',\n 'by.break': 'arrebentou',\n 'by.tool': 'desmontado com ferramenta',\n 'by.part_lost': 'a peça ao lado se perdeu',\n 'dmg.ballistic': 'de tiro',\n 'dmg.blunt': 'de impacto',\n 'dmg.slash': 'de corte',\n 'dmg.explosive': 'de explosão',\n 'dmg.fire': 'de fogo',\n 'dmg.heat': 'de calor',\n 'effect.caffeine': 'cafeína',\n 'effect.alcohol': 'álcool',\n 'effect.poison': 'veneno',\n 'effect.disgust': 'nojo',\n\n 'ev.dent': '{where}: amassado de {mm} mm, {hp}',\n 'ev.hole.through': '{where}: furo de {mm} mm atravessou, {hp}',\n 'ev.hole.stuck': '{where}: furo de {mm} mm não atravessou, {hp}',\n 'ev.dents': '{where}: {n} amassados, o mais fundo com {mm} mm, {hp}',\n 'ev.holes': '{where}: {n} furos de {mm} mm, {thr} atravessaram, {hp}',\n 'ev.leak.tail': ', vazando {liquid} a {rate} l/s',\n 'ev.leak.alone': '{where}: vazando {liquid} a {rate} l/s',\n 'ev.crack': '{where}: trincou, {rays} raios de até {cm} cm, {hp}',\n 'ev.ricochet': '{where}: a bala ricocheteou, sobraram {energy} J',\n 'ev.fracture.shatter': '{where}: estilhaçou em {n} cacos',\n 'ev.fracture.crumble': '{where}: esfarelou em {n} pedaços',\n 'ev.fracture.splinter': '{where}: lascou em {n} pedaços',\n 'ev.fracture.tear': '{where}: rasgou em {n} retalhos',\n 'ev.fracture.snap': '{where}: partiu em {n} pedaços',\n 'ev.fracture.none': '{where}: quebrou em {n} pedaços',\n 'ev.detach': '{obj}: {a} soltou de {b} ({by}); o objeto agora tem {pieces}',\n 'ev.detach.many.break': '{obj}: {joints} arrebentaram; o objeto agora tem {pieces}',\n 'ev.detach.many.tool': '{obj}: {joints} soltos com ferramenta; o objeto agora tem {pieces}',\n 'ev.lost.tail': ' e se soltou de {joints}; o objeto agora tem {pieces}',\n 'ev.lost.alone': '{where}: {verb} e se soltou de {joints}; o objeto agora tem {pieces}',\n 'ev.cracks': '{where}: rachando sob o peso, {n} trincas até agora, a maior com {cm} cm, {hp}',\n 'ev.disassemble': '{obj}: soltando {kind} entre {a} e {b} com {tool}: {pct}%',\n 'ev.ignite': '{where}: pegou fogo a {temp} °C',\n 'ev.ignite.many': '{obj}: {n} peças pegaram fogo a {temp} °C ({parts})',\n 'ev.extinguish': '{where}: fogo apagado',\n 'ev.extinguish.many': '{obj}: fogo apagado em {n} peças ({parts})',\n 'ev.burnout': '{where}: virou cinza',\n 'ev.melt': '{where}: derretendo, {pct}% já derreteu',\n 'ev.drip': '{where}: pingando material derretido',\n 'ev.explode': '{where}: explodiu, {energy} J em {radius} m',\n 'ev.destroyed': '{obj}: destruído',\n 'ev.damage': '{where}: dano {type} de {amount}, {hp}',\n 'ev.damage.overload': '{where}: esmagado pelo peso que sustenta, perdeu {amount} hp até agora, {hp}',\n 'ev.stress': '{where}: sobrecarregado a {stress}% da capacidade, sustentando {load} kg',\n 'ev.collapse': '{obj}: desabou, caíram {pieces} ({mass} kg): {parts}',\n 'ev.stain_ignite': 'A mancha de {liquid} em x {x} · z {z} pegou fogo e vai queimar por uns {seconds} s',\n 'ev.stain_burned': 'A mancha em chamas se consumiu',\n 'ev.fire_dries': 'O fogo secou as manchas molhadas por perto',\n\n 'fl.fill': '{who}: encheu de {liquid} (+{liters} l)',\n 'fl.pour': '{who}: despejando {liquid} a {rate} l/s',\n 'fl.spill': '{who}: derramou {liquid} pela borda a {rate} l/s',\n 'fl.leak': '{who}: vazando {liquid} a {rate} l/s',\n 'fl.drink': '{who}: bebeu {liters} l, sede +{thirst}',\n 'fl.burn': 'quente demais: queimou a boca',\n 'fl.empty': '{who}: vazio',\n 'fl.splash': 'Respingo de {liquid}',\n 'fl.stain': 'Mancha de {liquid} {surface} em {where}',\n 'fl.stains': '{n} manchas de {liquid} {surface}, a última em {where}',\n 'fl.dried': 'Uma mancha secou',\n 'fl.dried.mark': 'Uma mancha secou e deixou marca',\n 'fl.dried.known': 'A mancha de {liquid} {surface} em {where} secou',\n 'fl.dried.known.mark': 'A mancha de {liquid} {surface} em {where} secou e deixou marca',\n 'fl.dried.many': '{n} manchas de {liquid} secaram',\n 'fl.dried.many.mark': '{n} manchas de {liquid} secaram e deixaram marca',\n 'fl.mix': '{who}: {from} misturou em {into}',\n\n 'act.anim_start': '{name}: animação \"{clip}\" ({seconds} s)',\n 'act.anim_event': '{name}: \"{clip}\" evento {type}',\n 'act.anim_end': '{name}: animação \"{clip}\" terminou',\n 'act.module_loaded': 'Módulo \"{name}\" carregado: {items} item(ns), {scenarios} cenário(s), verificações do contrato: {result}',\n 'mod.all_ok': 'todas passaram',\n 'mod.some_failed': 'algumas FALHARAM',\n 'mod.destructible_ok': '{name}: contrato de destruição ok ({parts} peças, golpe e estado bem formados)',\n 'mod.destructible_fail': '{name}: contrato de destruição quebrado: {problems}',\n 'mod.animation_ok': '{name}: animação \"{clip}\" ok ({seconds} s)',\n 'mod.spec_ok': '{name}: spec ok ({parts} peças)',\n 'mod.spec_fail': '{name}: spec quebrada: {problems}',\n 'mod.spec_warn': '{name}: aviso na spec: {warning}',\n 'mod.animation_fail': '{name}: animação \"{clip}\" quebrada: {problems}',\n 'ui.animations': 'Animações',\n 'ui.animations_aim': 'Mire num item ou segure-o para ver as animações.',\n 'ui.animations_none': 'Este item não traz animações.',\n 'act.spawn': 'Criou {name} em x {x} · z {z}',\n 'act.clear': 'Limpou a sala',\n 'act.reset': 'Consertou todos os objetos',\n 'act.tool': 'Equipou {weapon}',\n 'act.shoot.hit': '{weapon}: disparo, {energy} J, acertou {where} a {dist} m',\n 'act.shoot.miss': '{weapon}: disparo, {energy} J, não acertou nada',\n 'act.shoot.pellets': '{weapon}: disparo, {n} projéteis de até {energy} J, {hits} acertaram {where} a {dist} m',\n 'act.melee.hit': '{weapon}: golpe, {energy} J, acertou {where} a {dist} m',\n 'act.melee.miss': '{weapon}: golpe no ar',\n 'act.flame.hit': '{weapon}: chama a {temp} °C em {where}',\n 'act.flame.air': '{weapon}: chama, nada ao alcance',\n 'act.heat.hit': '{weapon}: esquentando {where} a {temp} °C',\n 'act.heat.air': '{weapon}: nada ao alcance',\n 'act.throw.grenade': '{weapon}: arremessada, pavio de {fuse} s',\n 'act.throw.molotov': '{weapon}: arremessado, quebra no impacto',\n 'act.explode': '{weapon}: explodiu, {energy} J em {radius} m, {n} objetos ao alcance',\n 'act.molotov_fire': '{weapon}: fogo no chão, raio de {radius} m por {seconds} s',\n 'act.tool.none': '{weapon}: nada ao alcance',\n 'act.tool.nojoint': '{weapon}: nenhuma junta perto de {where}',\n 'act.tool.refused': '{weapon} não solta {kind} de {obj}; precisa de: {need}',\n 'act.extinguish.hit': '{weapon}: espuma em {what}',\n 'act.extinguish.air': '{weapon}: espuma, nada ao alcance',\n 'act.grab': 'Pegou {name} ({kg} kg)',\n 'act.drop': 'Soltou {name}',\n 'act.throw': 'Arremessou {name} a {speed} m/s',\n 'act.landing': '{name} caiu a {speed} m/s: {energy} J',\n 'act.impact': '{name} bateu em {where} a {speed} m/s: {energy} J de dano de impacto',\n 'act.use_item': '{name}: {use}',\n 'act.tap.on': 'Abriu a torneira',\n 'act.tap.off': 'Fechou a torneira',\n\n 'use.drink': 'beber',\n 'use.sip': 'golinho',\n 'use.chug': 'virar',\n 'use.pour': 'despejar',\n 'use.pour_out': 'esvaziar',\n 'use.open': 'abrir',\n 'use.close': 'fechar',\n\n 'hud.reloading': 'Recarregando...',\n 'hud.empty': 'Sem munição',\n 'hud.no_fuel': 'Sem combustível',\n 'hud.nothing_to_grab': 'Nada para pegar aqui',\n 'hud.cannot_grab': '{name} não dá para pegar',\n 'hud.too_heavy': '{name} é pesado demais ({kg} kg)',\n 'hud.empty_container': '{name} está vazio',\n 'hud.refused': 'Ferramenta errada para {kind}',\n 'hud.drop': 'soltar',\n 'hud.rotate': 'girar',\n 'hud.throw': 'arremessar',\n 'hud.tilt': 'inclinar (segurar)',\n 'hud.equip': 'equipar {weapon}',\n\n 'ui.help': 'Clique: olhar · WASD: andar · Shift: correr · Espaço: pular · 1-0 / roda: ferramenta · botão esquerdo: usar · E: pegar/soltar · G ou botão direito: arremessar · Tab: painéis · Esc: soltar o mouse',\n 'ui.log': 'Registro de comportamento',\n 'ui.filter.action': 'ações',\n 'ui.filter.event': 'eventos',\n 'ui.filter.check': 'testes',\n 'ui.autoscroll': 'rolar sozinho',\n 'log.export_cancelled': 'exportação cancelada',\n 'ui.copy_json': 'Copiar JSON',\n 'ui.download_ndjson': 'Baixar NDJSON',\n 'ui.download_txt': 'Baixar TXT',\n 'ui.clear_log': 'Limpar',\n 'ui.catalog': 'Catálogo',\n 'ui.clear': 'Limpar',\n 'ui.reset_all': 'Consertar tudo',\n 'ui.slow': 'Câmera lenta 0,25×',\n 'ui.fast': 'Tempo ×10',\n 'ui.tap': 'Torneira',\n 'ui.quality': 'Qualidade',\n 'ui.quality.low': 'baixa',\n 'ui.quality.medium': 'média',\n 'ui.quality.high': 'alta',\n 'ui.equip': 'Equipar como ferramenta',\n 'ui.objects': '{n} objetos',\n 'ui.tests': 'Testes',\n 'ui.run_all': 'Rodar todos',\n 'ui.running': 'Rodando...',\n 'ui.report': '{passed} passaram, {failed} falharam',\n 'ui.panel': 'Painéis',\n 'ui.inspector': 'Inspetor',\n 'ui.aim_at_something': 'Mire em um objeto',\n 'ins.material': 'Material',\n 'ins.status': 'Estado',\n 'ins.burning': 'em chamas',\n 'ins.hp': 'Pontos de vida',\n 'ins.temperature': 'Temperatura',\n 'ins.char': 'Carbonizado',\n 'ins.melt': 'Derretido',\n 'ins.liters': 'Líquido',\n 'ins.damage': 'Marcas',\n 'ins.damage_counts': '{dents}, {holes}, {cracks}',\n 'ins.mass': 'Massa',\n 'ins.load': 'Carga',\n 'ins.stress': 'Tensão',\n 'ins.joints': 'Juntas',\n 'ins.open': 'aberta',\n\n 'sc.start': 'Cenário: {name}',\n 'sc.pass': 'Cenário passou: {name}',\n 'sc.fail': 'Cenário FALHOU: {name}',\n 'sc.error': 'o cenário lançou um erro: {msg}',\n 'leg.still': 'leg_1 continua presa',\n 'leg.gone': 'leg_1 soltou',\n\n 'sc.steel_through_hole': 'Tiro de 9 mm em chapa de aço faz furo que atravessa',\n 'sc.steel_through_hole.check': '9 mm em aço de 3 mm: {holes} furo(s) de {mm} mm, atravessou: {through}, chapa com {hp} hp (esperado: atravessar)',\n 'sc.concrete_stops_bullet': 'Tiro de 9 mm em bloco de concreto não atravessa',\n 'sc.concrete_stops_bullet.check': '9 mm em 40 cm de concreto: atravessou: {through}, {dents}, {holes}, {cracks}, bloco com {hp} hp (esperado: parou, parede atrás intacta)',\n 'sc.hammer_dents_drum': 'Martelo amassa um tambor de aço',\n 'sc.hammer_dents_drum.check': 'Martelo no tambor: {swings} golpe(s), {dents} amassado(s), o primeiro com {depth} mm, corpo com {hp} hp (esperado: amassado, sem quebrar)',\n 'sc.glass_shatters': 'Vidro estilhaça depois de alguns tiros de 9 mm',\n 'sc.glass_shatters.check': 'Vidro: quebrou depois de {shots} tiro(s) em {n} cacos (esperado: quebrado, pelo menos 4 cacos)',\n 'sc.shotgun_splinters_crate': 'Escopeta lasca um caixote de madeira',\n 'sc.shotgun_splinters_crate.check': 'Calibre 12 no caixote: {shots} tiro(s), {splinters} tábua(s) lascada(s), {holes} furos (esperado: pelo menos uma lascada)',\n 'sc.kick_chair_leg': 'Um chute solta a perna da cadeira',\n 'sc.kick_chair_leg.check': 'Cadeira: {kicks} chute(s), {groups} grupo(s), peças soltas {before} → {after}, {leg} (esperado: aparece uma peça solta)',\n 'sc.kick_detaches_leg_via_tool': 'A ferramenta chute (barra de atalhos) solta a perna da cadeira',\n 'sc.kick_detaches_leg_via_tool.check': 'Cadeira, ferramenta chute: {kicks} chute(s), peças soltas {before} → {after}, {leg} (esperado: aparece uma peça solta)',\n 'sc.screwdriver_shelf_board': 'Chave de fenda solta a prateleira parafusada em cerca de 2,5 s',\n 'sc.screwdriver_shelf_board.check': 'Chave de fenda na prateleira: levou {secs} s, esperado cerca de {want} s, a estante agora está em {pieces}',\n 'sc.wrong_tool_refused': 'A ferramenta errada é recusada',\n 'sc.wrong_tool_refused.check': 'Chave de fenda numa solda: recusou {refused} vez(es), juntas abertas {opened} (esperado: recusar, nenhuma aberta)',\n 'sc.lighter_burns_crate': 'Isqueiro acende o caixote de madeira e ele vira cinza',\n 'sc.lighter_burns_crate.lit': 'Isqueiro no caixote: pegou fogo: {lit} (esperado: sim)',\n 'sc.lighter_burns_crate.ash': 'Depois de queimar por 500 s: {ash} de {total} tábuas viraram cinza, a mais queimada {char}% (esperado: tudo cinza ou carbonizado)',\n 'sc.torch_melts_steel': 'Fogo de madeira não derrete o tambor de aço, o maçarico derrete',\n 'sc.torch_melts_steel.wood': 'Caixote em chamas ao lado do tambor: o tambor chegou a {peak} °C, derreteu {melt}%, caixote ainda queimando: {crate} (esperado: sem derreter)',\n 'sc.torch_melts_steel.torch': 'Maçarico no tambor: {temp} °C, derreteu {melt}% (esperado: derretendo)',\n 'sc.bucket_melts_drips': 'Balde de plástico derrete e pinga perto do fogo',\n 'sc.bucket_melts_drips.check': 'Balde nas chamas: derreteu {melt}%, {temp} °C, {drips} linha(s) de pingos (esperado: derretendo)',\n 'sc.gas_bottle_explodes': 'Botijão de gás no fogo explode e empurra um caixote',\n 'sc.gas_bottle_explodes.explode': 'Botijão no fogo: explodiu depois de {seconds} s (esperado: explode)',\n 'sc.gas_bottle_explodes.push': 'Caixote a 1,3 m: andou {moved} m, perdeu {lost} (esperado: empurrado ou quebrado)',\n 'sc.bottle_drop_shatters': 'Garrafa de vidro solta de 1,5 m estilhaça',\n 'sc.bottle_drop_shatters.check': 'Garrafa solta de 1,5 m: estado {status}, {cracks} trincas, mancha de água: {stain} (esperado: quebrada, água no chão)',\n 'sc.throw_chair_at_wall': 'Cadeira arremessada na parede causa dano de impacto',\n 'sc.throw_chair_at_wall.check': 'Cadeira na parede: {impacts} impacto(s), o primeiro com {energy} J, {wall} linha(s) de dano na parede (esperado: impacto e dano)',\n 'sc.coffee_three_sips': 'Três goles de café baixam o nível e registram cafeína',\n 'sc.coffee_three_sips.check': 'Café: {sips} gole(s), nível {before} → {after} l, cafeína registrada: {caffeine}, queimou a boca: {burn} (esperado: 3 goles, cafeína)',\n 'sc.tilt_cup_spills': 'Inclinar o copo derrama café e deixa mancha',\n 'sc.tilt_cup_spills.check': 'Copo inclinado: nível {before} → {after} l, {stains} mancha(s) de café (esperado: derramou com mancha)',\n 'sc.jerrycan_leaks_fuel': 'Tiro no galão faz vazamento e mancha de combustível',\n 'sc.jerrycan_leaks_fuel.check': 'Galão baleado: {streams} jato(s) de vazamento, mancha de combustível: {stain}, restam {left} l de 20, a linha do furo cita o vazamento: {leak} (esperado: vazando, mancha)',\n 'sc.fuel_stain_burns': 'Mancha de combustível acesa queima',\n 'sc.fuel_stain_burns.stain': 'Mancha de combustível no chão depois do vazamento: {stain} (esperado: sim)',\n 'sc.fuel_stain_burns.ignite': 'Isqueiro na mancha: {ignited} ignição(ões), o fogo alcançou objetos por perto: {near} (esperado: acendeu)',\n 'sc.fuel_stain_burns.out': 'Depois de 30 s a mancha se consumiu: {burned} (esperado: sim)',\n 'roof.standing': 'laje de pé',\n 'roof.fell': 'laje caiu',\n 'sc.one_column_roof_stands': 'Pilar destruído: a laje fica de pé',\n 'sc.one_column_roof_stands.check': 'Estrutura sem um pilar: {roof}, maior desabamento {heavy} kg, tensão máxima {stress}% (esperado: de pé, sem desabamento grande)',\n 'sc.two_columns_roof_collapses': 'Dois pilares destruídos: a laje desaba',\n 'sc.two_columns_roof_collapses.check': 'Estrutura sem dois pilares: os outros logo a {stress}%, depois peças pesadas soltas: {pieces} ({kg} kg), evento de desabamento registrado: {logged} (esperado: a laje desaba)',\n 'sc.extinguisher_puts_out_fire': 'Extintor apaga um caixote em chamas',\n 'sc.extinguisher_puts_out_fire.burning': 'Caixote incendiado: queimando: {burning} (esperado: sim)',\n 'sc.extinguisher_puts_out_fire.out': 'Depois do extintor: ainda queimando: {burning}, {events} evento(s) de apagar (esperado: apagado)',\n },\n}\n\nexport const locales: Record<TestRoomLocale, RoomStrings> = { en, 'pt-BR': ptBR }\n\nexport const resolveStrings = (locale: string | undefined): RoomStrings => locales[(locale as TestRoomLocale) ?? 'en'] ?? locales.en\n","import type * as THREE_NS from 'three'\nimport { buildFrame } from '@adatechnology/game-destruction'\nimport type { DestructibleSpec, JointSpec, MaterialDef, PartSpec, Vec3 } from '@adatechnology/game-destruction'\nimport { buildFromSpec } from './build-from-spec'\nimport { resolveStrings } from './locale'\nimport type { TestRoomItem } from './types'\n\n/**\n * Extra materials the demo items need on top of the core ones. None any more (the bottle uses the core `glass`, which now breaks from a drop);\n * kept so that code passing it to `worldOptions.materials` keeps working.\n */\nexport const DEMO_MATERIALS: MaterialDef[] = []\n\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n// Small spec helpers\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n\ntype Extra = Partial<Omit<PartSpec, 'id' | 'material' | 'shape' | 'position'>>\n\nconst box = (id: string, material: string, size: Vec3, position: Vec3, extra: Extra = {}): PartSpec => ({ id, material, shape: { kind: 'box', size }, position, ...extra })\nconst cyl = (id: string, material: string, radius: number, height: number, position: Vec3, extra: Extra = {}): PartSpec => ({\n id,\n material,\n shape: { kind: 'cylinder', radius, height },\n position,\n ...extra,\n})\nconst sph = (id: string, material: string, radius: number, position: Vec3, extra: Extra = {}): PartSpec => ({ id, material, shape: { kind: 'sphere', radius }, position, ...extra })\nconst joint = (a: string, b: string, kind: JointSpec['kind'], extra: Partial<JointSpec> = {}): JointSpec => ({ a, b, kind, ...extra })\n\n/** Spec of the brick target wall: `cols` x `rows` brick panels, the bottom row anchored, mortar joints between neighbours. */\nexport function brickWallSpec(cols = 8, rows = 6, panel: Vec3 = [1.25, 0.5, 0.2]): DestructibleSpec {\n const parts: PartSpec[] = []\n const joints: JointSpec[] = []\n const id = (c: number, r: number): string => `brick_${r}_${c}`\n for (let r = 0; r < rows; r++) {\n for (let c = 0; c < cols; c++) {\n parts.push(box(id(c, r), 'brick', panel, [(c - (cols - 1) / 2) * panel[0], panel[1] / 2 + r * panel[1], 0], { anchored: r === 0 }))\n if (c > 0) joints.push(joint(id(c - 1, r), id(c, r), 'mortar'))\n if (r > 0) joints.push(joint(id(c, r - 1), id(c, r), 'mortar'))\n }\n }\n return { name: 'brick wall', parts, joints, tags: ['structure'] }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n// Demo specs\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n\nconst chair = (): DestructibleSpec => {\n const legs = [\n [-0.18, -0.18],\n [0.18, -0.18],\n [-0.18, 0.18],\n [0.18, 0.18],\n ]\n return {\n name: 'chair',\n parts: [\n box('seat', 'wood_soft', [0.42, 0.04, 0.42], [0, 0.45, 0]),\n ...legs.map(([x, z], i) => box(`leg_${i + 1}`, 'wood_soft', [0.04, 0.43, 0.04], [x, 0.215, z])),\n box('backrest', 'wood_soft', [0.4, 0.3, 0.03], [0, 0.64, -0.195]),\n ],\n joints: [...legs.map((_, i) => joint(`leg_${i + 1}`, 'seat', 'screw')), joint('backrest', 'seat', 'screw')],\n tags: ['furniture'],\n }\n}\n\nconst crate = (): DestructibleSpec => ({\n name: 'wooden crate',\n parts: [\n box('front', 'wood_soft', [0.5, 0.5, 0.02], [0, 0.25, 0.24], { hp: 70 }),\n box('back', 'wood_soft', [0.5, 0.5, 0.02], [0, 0.25, -0.24], { hp: 70 }),\n box('left', 'wood_soft', [0.02, 0.5, 0.46], [-0.24, 0.25, 0], { hp: 70 }),\n box('right', 'wood_soft', [0.02, 0.5, 0.46], [0.24, 0.25, 0], { hp: 70 }),\n box('bottom', 'wood_soft', [0.46, 0.02, 0.46], [0, 0.01, 0], { hp: 70 }),\n ],\n joints: [\n joint('front', 'left', 'nail'),\n joint('front', 'right', 'nail'),\n joint('back', 'left', 'nail'),\n joint('back', 'right', 'nail'),\n joint('front', 'bottom', 'nail'),\n joint('back', 'bottom', 'nail'),\n joint('left', 'bottom', 'nail'),\n joint('right', 'bottom', 'nail'),\n ],\n tags: ['container'],\n})\n\nconst drum = (): DestructibleSpec => ({\n name: 'steel drum',\n parts: [\n cyl('drum_body', 'steel', 0.29, 0.86, [0, 0.45, 0], { mass: 12, thickness: 0.0012 }),\n cyl('drum_top', 'steel', 0.29, 0.02, [0, 0.89, 0], { mass: 1.5, thickness: 0.0012 }),\n cyl('drum_bottom', 'steel', 0.29, 0.02, [0, 0.01, 0], { mass: 1.5, thickness: 0.0012 }),\n ],\n joints: [joint('drum_body', 'drum_top', 'weld'), joint('drum_body', 'drum_bottom', 'weld')],\n tags: ['container'],\n})\n\nconst steelSheet = (): DestructibleSpec => ({\n name: 'steel sheet',\n parts: [\n box('sheet', 'steel', [1, 1, 0.003], [0, 1.1, 0]),\n box('post_l', 'steel', [0.04, 0.54, 0.04], [-0.35, 0.33, 0], { mass: 4 }),\n box('post_r', 'steel', [0.04, 0.54, 0.04], [0.35, 0.33, 0], { mass: 4 }),\n box('foot_l', 'steel', [0.06, 0.06, 0.5], [-0.35, 0.03, 0], { mass: 6 }),\n box('foot_r', 'steel', [0.06, 0.06, 0.5], [0.35, 0.03, 0], { mass: 6 }),\n ],\n joints: [joint('sheet', 'post_l', 'weld'), joint('sheet', 'post_r', 'weld'), joint('post_l', 'foot_l', 'weld'), joint('post_r', 'foot_r', 'weld')],\n tags: ['structure'],\n})\n\nconst glassPane = (): DestructibleSpec => ({\n name: 'glass pane',\n parts: [\n box('pane', 'glass', [0.8, 1, 0.006], [0, 1.05, 0], { hp: 40 }),\n box('frame_top', 'aluminium', [0.88, 0.04, 0.04], [0, 1.57, 0], { mass: 1 }),\n box('frame_bottom', 'aluminium', [0.88, 0.04, 0.04], [0, 0.53, 0], { mass: 1 }),\n box('frame_l', 'aluminium', [0.04, 1.04, 0.04], [-0.42, 1.05, 0], { mass: 1 }),\n box('frame_r', 'aluminium', [0.04, 1.04, 0.04], [0.42, 1.05, 0], { mass: 1 }),\n box('foot_l', 'steel', [0.06, 0.5, 0.4], [-0.35, 0.25, 0], { mass: 5 }),\n box('foot_r', 'steel', [0.06, 0.5, 0.4], [0.35, 0.25, 0], { mass: 5 }),\n ],\n joints: [\n joint('pane', 'frame_top', 'clip'),\n joint('pane', 'frame_bottom', 'clip'),\n joint('pane', 'frame_l', 'clip'),\n joint('pane', 'frame_r', 'clip'),\n joint('frame_bottom', 'foot_l', 'bolt'),\n joint('frame_bottom', 'foot_r', 'bolt'),\n joint('frame_l', 'frame_top', 'weld'),\n joint('frame_r', 'frame_top', 'weld'),\n joint('frame_l', 'frame_bottom', 'weld'),\n joint('frame_r', 'frame_bottom', 'weld'),\n ],\n tags: ['structure'],\n})\n\nconst concreteBlock = (): DestructibleSpec => ({\n name: 'concrete block',\n parts: [box('block', 'concrete', [0.4, 0.4, 0.4], [0, 0.2, 0])],\n tags: ['structure'],\n})\n\nconst brickColumn = (): DestructibleSpec => {\n const parts: PartSpec[] = []\n const joints: JointSpec[] = []\n const layers = 8\n const id = (l: number, x: number, z: number): string => `brick_${l}_${x}${z}`\n for (let l = 0; l < layers; l++) {\n for (let x = 0; x < 2; x++) {\n for (let z = 0; z < 2; z++) {\n parts.push(box(id(l, x, z), 'brick', [0.2, 0.2, 0.2], [(x - 0.5) * 0.2, 0.1 + l * 0.2, (z - 0.5) * 0.2], { anchored: l === 0 }))\n if (x > 0) joints.push(joint(id(l, x - 1, z), id(l, x, z), 'mortar'))\n if (z > 0) joints.push(joint(id(l, x, z - 1), id(l, x, z), 'mortar'))\n if (l > 0) joints.push(joint(id(l - 1, x, z), id(l, x, z), 'mortar'))\n }\n }\n }\n return { name: 'brick column', parts, joints, tags: ['structure'] }\n}\n\n/**\n * A small house frame (2 x 2 columns on foundations, beams, a roof slab) from the core's `buildFrame`. The columns are rated at 4.4 t so that\n * losing one column leaves the roof standing (the others carry about 90% of their capacity) and losing two overloads the rest until the roof\n * comes down.\n */\nconst frame = (): DestructibleSpec => ({ ...buildFrame({ spanX: 4, spanZ: 4, columnsX: 2, columnsZ: 2, height: 2.8, floors: 1, walls: false, roof: true, columnCapacity: 4400 }), name: 'building frame' })\n\nconst bucket = (): DestructibleSpec => ({\n name: 'plastic bucket',\n parts: [\n cyl('bucket_body', 'plastic', 0.14, 0.28, [0, 0.14, 0], { mass: 0.5, thickness: 0.002 }),\n box('handle', 'plastic', [0.3, 0.012, 0.012], [0, 0.3, 0], { mass: 0.05 }),\n ],\n joints: [joint('handle', 'bucket_body', 'clip')],\n tags: ['container'],\n})\n\nconst bottle = (): DestructibleSpec => ({\n name: 'glass bottle',\n parts: [\n cyl('bottle_body', 'glass', 0.037, 0.17, [0, 0.085, 0], { mass: 0.3, thickness: 0.003, contains: { fluid: 'water', liters: 0.5 } }),\n cyl('bottle_neck', 'glass', 0.015, 0.09, [0, 0.215, 0], { mass: 0.08, thickness: 0.002 }),\n ],\n joints: [joint('bottle_neck', 'bottle_body', 'fused')],\n tags: ['item'],\n})\n\nconst cup = (): DestructibleSpec => ({\n name: 'coffee cup',\n parts: [\n cyl('cup', 'ceramic', 0.05, 0.11, [0, 0.055, 0], { mass: 0.3, thickness: 0.004, contains: { fluid: 'coffee', liters: 0.25 } }),\n box('cup_handle', 'ceramic', [0.02, 0.06, 0.014], [0.068, 0.06, 0], { mass: 0.04 }),\n ],\n joints: [joint('cup_handle', 'cup', 'fused')],\n tags: ['item'],\n})\n\nconst jerrycan = (): DestructibleSpec => ({\n name: 'jerrycan',\n parts: [\n box('tank', 'plastic', [0.34, 0.45, 0.14], [0, 0.225, 0], { mass: 1.2, thickness: 0.003, contains: { fluid: 'fuel', liters: 20 } }),\n cyl('cap', 'plastic', 0.025, 0.03, [0.08, 0.465, 0], { mass: 0.05 }),\n box('handle', 'plastic', [0.1, 0.03, 0.03], [-0.07, 0.465, 0], { mass: 0.1 }),\n ],\n joints: [joint('cap', 'tank', 'screw'), joint('handle', 'tank', 'fused')],\n tags: ['container'],\n})\n\nconst gasBottle = (): DestructibleSpec => ({\n name: 'gas bottle',\n parts: [\n cyl('cylinder', 'steel', 0.15, 0.7, [0, 0.4, 0], {\n mass: 11,\n thickness: 0.003,\n contains: { fluid: 'gas', liters: 13, pressurized: true },\n explodes: { energy: 120000, radius: 5, atC: 300 },\n }),\n cyl('valve', 'steel', 0.03, 0.1, [0, 0.8, 0], { mass: 0.5 }),\n cyl('foot_ring', 'steel', 0.14, 0.05, [0, 0.025, 0], { mass: 1 }),\n ],\n joints: [joint('valve', 'cylinder', 'weld'), joint('foot_ring', 'cylinder', 'weld')],\n tags: ['container'],\n})\n\nconst tree = (): DestructibleSpec => ({\n name: 'small tree',\n parts: [\n cyl('trunk', 'green_wood', 0.08, 2.2, [0, 1.1, 0], { anchored: true }),\n cyl('branch_1', 'green_wood', 0.03, 0.8, [0.34, 1.7, 0], { rotation: [0, 0, -0.9] }),\n cyl('branch_2', 'green_wood', 0.03, 0.8, [-0.3, 1.9, 0.12], { rotation: [0, 0, 0.8] }),\n cyl('branch_3', 'green_wood', 0.025, 0.7, [0.05, 2.0, -0.28], { rotation: [0.8, 0, 0] }),\n sph('crown_top', 'foliage', 0.55, [0, 2.55, 0], { mass: 2 }),\n sph('crown_1', 'foliage', 0.38, [0.62, 2.0, 0], { mass: 1 }),\n sph('crown_2', 'foliage', 0.38, [-0.58, 2.2, 0.15], { mass: 1 }),\n sph('crown_3', 'foliage', 0.32, [0.05, 2.3, -0.55], { mass: 1 }),\n ],\n joints: [\n joint('branch_1', 'trunk', 'stem'),\n joint('branch_2', 'trunk', 'stem'),\n joint('branch_3', 'trunk', 'stem'),\n joint('crown_top', 'trunk', 'stem'),\n joint('crown_1', 'branch_1', 'stem'),\n joint('crown_2', 'branch_2', 'stem'),\n joint('crown_3', 'branch_3', 'stem'),\n ],\n tags: ['plant'],\n})\n\nconst pottedPlant = (): DestructibleSpec => ({\n name: 'potted plant',\n parts: [\n cyl('pot', 'ceramic', 0.15, 0.25, [0, 0.125, 0], { mass: 2, thickness: 0.008 }),\n cyl('soil', 'soil', 0.14, 0.06, [0, 0.26, 0], { mass: 1.5 }),\n sph('leaves_1', 'foliage', 0.16, [0, 0.46, 0], { mass: 0.3 }),\n sph('leaves_2', 'foliage', 0.12, [0.12, 0.38, 0.04], { mass: 0.2 }),\n sph('leaves_3', 'foliage', 0.12, [-0.1, 0.4, -0.06], { mass: 0.2 }),\n ],\n joints: [joint('soil', 'pot', 'fused'), joint('leaves_1', 'soil', 'stem'), joint('leaves_2', 'soil', 'stem'), joint('leaves_3', 'soil', 'stem')],\n tags: ['plant'],\n})\n\nconst oldTv = (): DestructibleSpec => ({\n name: 'old TV',\n parts: [\n box('stand', 'wood_soft', [0.6, 0.35, 0.42], [0, 0.175, 0]),\n box('shell', 'plastic', [0.58, 0.44, 0.42], [0, 0.57, 0], { mass: 3, thickness: 0.004 }),\n box('screen', 'glass', [0.42, 0.32, 0.012], [0, 0.57, 0.212], { mass: 1.5 }),\n box('coil', 'copper', [0.2, 0.1, 0.2], [0, 0.55, -0.05], { mass: 1.5 }),\n ],\n joints: [joint('shell', 'stand', 'screw'), joint('screen', 'shell', 'clip'), joint('coil', 'shell', 'screw')],\n tags: ['furniture'],\n})\n\nconst carDoor = (): DestructibleSpec => ({\n name: 'car door',\n parts: [\n box('post', 'steel', [0.1, 1.3, 0.1], [-0.58, 0.65, 0], { mass: 12, anchored: true }),\n box('skin', 'steel', [1, 0.8, 0.05], [0, 0.75, 0], { mass: 14, thickness: 0.0008 }),\n box('window', 'glass', [0.78, 0.32, 0.01], [0.04, 1.31, 0.01], { mass: 3 }),\n box('seal', 'rubber', [0.84, 0.03, 0.03], [0.04, 1.14, 0.01], { mass: 0.3 }),\n ],\n joints: [\n joint('skin', 'post', 'hinge', { id: 'hinge_upper' }),\n joint('skin', 'post', 'hinge', { id: 'hinge_lower' }),\n joint('window', 'seal', 'clip'),\n joint('seal', 'skin', 'clip'),\n ],\n tags: ['vehicle'],\n})\n\nconst sofa = (): DestructibleSpec => ({\n name: 'sofa',\n parts: [\n box('frame', 'wood_soft', [1.8, 0.3, 0.8], [0, 0.15, 0], { mass: 14 }),\n box('seat_cushion', 'foam', [1.5, 0.18, 0.62], [0, 0.39, 0.06], { mass: 4 }),\n box('back_cushion', 'foam', [1.5, 0.5, 0.16], [0, 0.65, -0.3], { mass: 4 }),\n box('arm_l', 'fabric', [0.15, 0.4, 0.8], [-0.82, 0.5, 0], { mass: 3 }),\n box('arm_r', 'fabric', [0.15, 0.4, 0.8], [0.82, 0.5, 0], { mass: 3 }),\n ],\n joints: [\n joint('seat_cushion', 'frame', 'clip'),\n joint('back_cushion', 'frame', 'clip'),\n joint('arm_l', 'frame', 'screw'),\n joint('arm_r', 'frame', 'screw'),\n ],\n tags: ['furniture'],\n})\n\nconst shelf = (): DestructibleSpec => ({\n name: 'shelf',\n parts: [\n box('back', 'plywood', [0.84, 1.5, 0.012], [0, 0.75, -0.14], { anchored: true }),\n box('board_1', 'wood_soft', [0.8, 0.025, 0.28], [0, 0.35, 0]),\n box('board_2', 'wood_soft', [0.8, 0.025, 0.28], [0, 0.75, 0]),\n box('board_3', 'wood_soft', [0.8, 0.025, 0.28], [0, 1.15, 0]),\n box('board_4', 'wood_soft', [0.8, 0.025, 0.28], [0, 1.5, 0]),\n ],\n joints: [joint('board_1', 'back', 'screw'), joint('board_2', 'back', 'screw'), joint('board_3', 'back', 'screw'), joint('board_4', 'back', 'screw')],\n tags: ['furniture'],\n})\n\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n// Catalogue\n// ---------------------------------------------------------------------------------------------------------------------------------------------\n\ninterface DemoDef {\n id: string\n group: string\n spec: () => DestructibleSpec\n colors?: Record<string, number>\n movable?: boolean\n fluid?: TestRoomItem['fluid']\n}\n\nconst DEFS: DemoDef[] = [\n { id: 'chair', group: 'furniture', spec: chair, colors: { wood_soft: 0xa8703a } },\n { id: 'sofa', group: 'furniture', spec: sofa, colors: { frame: 0x6b4426, seat_cushion: 0x7d3b4c, back_cushion: 0x7d3b4c, arm_l: 0x6a2f40, arm_r: 0x6a2f40 } },\n { id: 'shelf', group: 'furniture', spec: shelf, colors: { back: 0xd9c9a3 }, movable: false },\n { id: 'old_tv', group: 'furniture', spec: oldTv, colors: { shell: 0x6d5a3e, stand: 0x8a5a30, screen: 0x4f6f68 } },\n { id: 'steel_sheet', group: 'structure', spec: steelSheet, movable: false, colors: { sheet: 0xb5bcc4 } },\n { id: 'glass_pane', group: 'structure', spec: glassPane, movable: false },\n { id: 'concrete_block', group: 'structure', spec: concreteBlock },\n { id: 'brick_column', group: 'structure', spec: brickColumn, movable: false },\n { id: 'building_frame', group: 'structure', spec: frame, movable: false, colors: { roof: 0x7d7d79 } },\n { id: 'car_door', group: 'vehicles', spec: carDoor, movable: false, colors: { skin: 0xc0392b, window: 0x9cd6e6 } },\n { id: 'small_tree', group: 'plants', spec: tree, movable: false },\n { id: 'potted_plant', group: 'plants', spec: pottedPlant, colors: { pot: 0xc4673a } },\n { id: 'coffee_cup', group: 'items', spec: cup, colors: { cup: 0xf3efe6 }, fluid: { container: { capacity: 0.6, liquid: 'coffee', liters: 0.25, temperature: 80, shape: { kind: 'cylinder', radius: 0.045, height: 0.1 }, opening: 0.045 }, part: 'cup', uses: ['drink', 'sip', 'pour'], offset: [0, 0.01, 0] } },\n {\n id: 'glass_bottle',\n group: 'items',\n spec: bottle,\n colors: { bottle_body: 0x7fd6b0, bottle_neck: 0x7fd6b0 },\n fluid: { container: { capacity: 0.5, liquid: 'water', liters: 0.5, temperature: 18, shape: { kind: 'cylinder', radius: 0.034, height: 0.14 }, opening: 0.012 }, part: 'bottle_body', uses: ['drink', 'sip', 'pour'], offset: [0, 0.015, 0] },\n },\n { id: 'wooden_crate', group: 'containers', spec: crate },\n { id: 'steel_drum', group: 'containers', spec: drum, colors: { drum_body: 0x2b5f9e, drum_top: 0x2b5f9e, drum_bottom: 0x2b5f9e } },\n { id: 'plastic_bucket', group: 'containers', spec: bucket, colors: { bucket_body: 0xd9482b, handle: 0x8a8a8a } },\n {\n id: 'jerrycan',\n group: 'containers',\n spec: jerrycan,\n colors: { tank: 0xc23b22, cap: 0xf2c230, handle: 0xc23b22 },\n fluid: { container: { capacity: 20, liquid: 'fuel', liters: 20, temperature: 20, shape: { kind: 'box', size: [0.33, 0.44, 0.13] }, opening: 0.025, closed: true }, part: 'tank', uses: ['pour', 'open', 'close'], offset: [0, 0.008, 0] },\n },\n { id: 'gas_bottle', group: 'containers', spec: gasBottle, colors: { cylinder: 0xd8d8d0, valve: 0x777777, foot_ring: 0x555555 } },\n]\n\n/**\n * The generic demo catalogue, names and groups translated for `locale` (`en` or `pt-BR`). Every item is a procedural low-poly build (one mesh per\n * destruction part, drawn by `buildFromSpec`) plus an explicit destruction spec. Containers carry a fluid container where it makes sense.\n */\nexport function demoItems(locale = 'en', extra: TestRoomItem[] = []): TestRoomItem[] {\n const s = resolveStrings(locale)\n const out: TestRoomItem[] = DEFS.map((d) => ({\n id: d.id,\n name: s.items[d.id] ?? d.id,\n group: s.groups[d.group] ?? d.group,\n build: (THREE: typeof THREE_NS) => buildFromSpec(THREE, d.spec(), { colors: d.colors }),\n spec: d.spec,\n movable: d.movable,\n fluid: d.fluid,\n }))\n return [...out, ...extra]\n}\n\n/** The demo catalogue in English (see `demoItems` for other locales). */\nexport const DEMO_ITEMS: TestRoomItem[] = demoItems('en')\n","import type * as THREE_NS from 'three'\nimport type { DestructibleSpec, JointSpec, PartSpec, Vec3 } from '@adatechnology/game-destruction'\nimport type { SurfaceSpec } from '@adatechnology/game-fluids'\nimport { brickWallSpec } from './items'\n\nexport interface ArenaObject {\n id: string\n spec: DestructibleSpec\n position: Vec3\n colors?: Record<string, number>\n}\n\n/** The static part of the room: lights, floor, grid, ruler and the destructible scenery. */\nexport interface Arena {\n group: THREE_NS.Group\n /** Objects to register in the world (target wall, table, shelf). */\n objects: ArenaObject[]\n surfaces: SurfaceSpec[]\n /** `[minX, minZ, maxX, maxZ]` boxes the player cannot walk into. */\n colliders: Array<[number, number, number, number]>\n playerStart: Vec3\n wallZ: number\n /** Rectangle and height of the table top (pieces rest on it while the table stands). */\n table: { minX: number; maxX: number; minZ: number; maxZ: number; top: number; id: string; topPart: string }\n tapSpout: Vec3\n sun: THREE_NS.DirectionalLight\n}\n\nconst tableSpec = (): DestructibleSpec => {\n const parts: PartSpec[] = [{ id: 'top', material: 'wood_hard', shape: { kind: 'box', size: [1.6, 0.05, 0.8] }, position: [0, 0.755, 0] }]\n const joints: JointSpec[] = []\n for (const [i, [x, z]] of [\n [-0.72, -0.32],\n [0.72, -0.32],\n [-0.72, 0.32],\n [0.72, 0.32],\n ].entries()) {\n parts.push({ id: `leg_${i + 1}`, material: 'wood_hard', shape: { kind: 'box', size: [0.06, 0.73, 0.06] }, position: [x, 0.365, z], anchored: true })\n joints.push({ a: `leg_${i + 1}`, b: 'top', kind: 'screw' })\n }\n return { name: 'table', parts, joints, tags: ['furniture'] }\n}\n\nconst shelfSpec = (): DestructibleSpec => {\n const parts: PartSpec[] = []\n const joints: JointSpec[] = []\n for (const [i, x] of [-0.6, 0.6].entries()) {\n parts.push({ id: `upright_${i + 1}`, material: 'wood_hard', shape: { kind: 'box', size: [0.04, 1.7, 0.4] }, position: [x, 0.85, 0], anchored: true })\n }\n for (const [i, y] of [0.4, 0.9, 1.4].entries()) {\n parts.push({ id: `board_${i + 1}`, material: 'wood_soft', shape: { kind: 'box', size: [1.2, 0.03, 0.4] }, position: [0, y, 0] })\n joints.push({ a: `board_${i + 1}`, b: 'upright_1', kind: 'screw' }, { a: `board_${i + 1}`, b: 'upright_2', kind: 'screw' })\n }\n return { name: 'shelf', parts, joints, tags: ['furniture'] }\n}\n\nexport function createArena(THREE: typeof THREE_NS, size: number, scene: THREE_NS.Scene): Arena {\n const group = new THREE.Group()\n group.name = 'test-room-arena'\n scene.background = new THREE.Color(0x9fb4c8)\n\n group.add(new THREE.HemisphereLight(0xcfe3ff, 0x6b6257, 0.75))\n const sun = new THREE.DirectionalLight(0xffffff, 2.1)\n sun.position.set(7, 13, 8)\n sun.castShadow = true\n sun.shadow.mapSize.set(1024, 1024)\n const sc = sun.shadow.camera\n sc.left = -16\n sc.right = 16\n sc.top = 16\n sc.bottom = -16\n sc.near = 1\n sc.far = 40\n sun.shadow.bias = -0.0006\n group.add(sun)\n\n const floor = new THREE.Mesh(new THREE.PlaneGeometry(size * 2, size * 2), new THREE.MeshStandardMaterial({ color: 0x8e8e8a, roughness: 0.95 }))\n floor.rotation.x = -Math.PI / 2\n floor.receiveShadow = true\n floor.name = 'floor'\n group.add(floor)\n\n const grid = new THREE.GridHelper(size * 2, size * 2, 0x4c4c52, 0x77777b)\n grid.position.y = 0.004\n group.add(grid)\n\n const wallZ = -11\n const playerStart: Vec3 = [0, 1.7, 5]\n\n // distance ruler along the left of the lane: a tick every metre (taller every 5 m) and a label every 5 m\n const pts: number[] = []\n const rx = -1.6\n for (let z = Math.round(playerStart[2]); z >= wallZ; z--) {\n const d = playerStart[2] - z\n const len = d % 5 === 0 ? 0.5 : 0.2\n pts.push(rx, 0.01, z, rx + len, 0.01, z)\n }\n pts.push(rx, 0.01, playerStart[2], rx, 0.01, wallZ)\n const rg = new THREE.BufferGeometry()\n rg.setAttribute('position', new THREE.Float32BufferAttribute(pts, 3))\n group.add(new THREE.LineSegments(rg, new THREE.LineBasicMaterial({ color: 0xffd23f })))\n for (let d = 5; playerStart[2] - d >= wallZ; d += 5) {\n try {\n const canvas = document.createElement('canvas')\n canvas.width = 128\n canvas.height = 64\n const ctx = canvas.getContext('2d')\n if (!ctx) break\n ctx.fillStyle = '#ffd23f'\n ctx.font = 'bold 44px sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText(`${d} m`, 64, 48)\n const sprite = new THREE.Sprite(new THREE.SpriteMaterial({ map: new THREE.CanvasTexture(canvas), transparent: true, depthWrite: false }))\n sprite.scale.set(1.2, 0.6, 1)\n sprite.position.set(rx - 0.8, 0.45, playerStart[2] - d)\n group.add(sprite)\n } catch {\n break\n }\n }\n\n // tap on a post at the end of the table, spout over the tabletop\n const tableX = 3.5\n const tapMat = new THREE.MeshStandardMaterial({ color: 0xb9bec4, metalness: 0.8, roughness: 0.35 })\n const post = new THREE.Mesh(new THREE.CylinderGeometry(0.04, 0.04, 1.4, 10), tapMat)\n post.position.set(tableX + 1.15, 0.7, 0)\n const arm = new THREE.Mesh(new THREE.CylinderGeometry(0.025, 0.025, 1.15 - 0.3, 10), tapMat)\n arm.rotation.z = Math.PI / 2\n arm.position.set(tableX + (1.15 + 0.3) / 2, 1.38, 0)\n const spoutMesh = new THREE.Mesh(new THREE.CylinderGeometry(0.025, 0.025, 0.1, 10), tapMat)\n spoutMesh.position.set(tableX + 0.3, 1.33, 0)\n for (const m of [post, arm, spoutMesh]) {\n m.castShadow = true\n group.add(m)\n }\n const tapSpout: Vec3 = [tableX + 0.3, 1.28, 0]\n\n const objects: ArenaObject[] = [\n { id: 'target_wall', spec: brickWallSpec(), position: [0, 0, wallZ], colors: { brick: 0xa5472e } },\n { id: 'table', spec: tableSpec(), position: [tableX, 0, 0] },\n { id: 'shelf', spec: shelfSpec(), position: [-3.5, 0, 0], colors: { wood_soft: 0xc79a62 } },\n ]\n\n return {\n group,\n objects,\n surfaces: [\n { id: 'floor', point: [0, 0, 0], normal: [0, 1, 0], halfSize: [size, size], porosity: 0.05 },\n { id: 'table', point: [tableX, 0.78, 0], normal: [0, 1, 0], halfSize: [0.8, 0.4], porosity: 0.3 },\n ],\n colliders: [\n [tableX - 0.8, -0.4, tableX + 0.8, 0.4],\n [tableX + 1.1, -0.1, tableX + 1.2, 0.1],\n [-3.5 - 0.62, -0.2, -3.5 + 0.62, 0.2],\n [-size, wallZ - 1, size, wallZ + 0.2],\n ],\n playerStart,\n wallZ,\n table: { minX: tableX - 0.8, maxX: tableX + 0.8, minZ: -0.4, maxZ: 0.4, top: 0.78, id: 'table', topPart: 'top' },\n tapSpout,\n sun,\n }\n}\n","import type { LogEntry, NewLogEntry, TestRoomLog } from './types'\n\nexport type NewEntry = NewLogEntry\n\n/** The log the room writes to (a `TestRoomLog` plus the write side). */\nexport interface WritableLog extends TestRoomLog {\n /** Called before every read, so pending work (the room batches events per frame) is flushed first. */\n setBeforeRead(fn: (() => void) | null): void\n setClock(fn: () => number): void\n}\n\nconst MAX_ENTRIES = 5000\n\nconst pad = (n: number, w = 2): string => String(n).padStart(w, '0')\n\n/** `00:03.21` style clock for the text export. */\nexport const formatTime = (t: number): string => {\n const m = Math.floor(t / 60)\n const s = t - m * 60\n return `${pad(m)}:${s.toFixed(2).padStart(5, '0')}`\n}\n\n/** Minimal shape of the `downloads` capability a claude.ai Artifact page gets from `claude.use('downloads')`. */\ninterface DownloadsApi {\n save(request: { filename: string; data: string }): Promise<unknown>\n}\n\nexport interface LogOptions {\n /** Text of the `action` line written when the viewer declines (or fails) an export from an Artifact page. */\n exportCancelled?: () => string\n}\n\nexport function createLog(options: LogOptions = {}): WritableLog {\n // In a claude.ai Artifact the page cannot use <a download> / blob links: it asks the host for the `downloads` capability. The promise is\n // created once, never awaited here (`use` may take up to 10 s and resolve null); `download` awaits it when somebody actually exports.\n const host = (globalThis as { claude?: { use?: (name: string) => Promise<unknown> } }).claude\n let downloadsP: Promise<DownloadsApi | null> | null = null\n if (host && typeof host.use === 'function') {\n try {\n downloadsP = Promise.resolve(host.use('downloads')).then((d) => (d as DownloadsApi | null) ?? null, () => null)\n } catch {\n downloadsP = null\n }\n }\n let list: LogEntry[] = []\n let seq = 0\n let clock = (): number => 0\n let beforeRead: (() => void) | null = null\n const listeners = new Set<(entry: LogEntry, updated: boolean) => void>()\n const keyed = new Map<string, { entry: LogEntry; last: number; count: number }>()\n\n const read = (): LogEntry[] => {\n beforeRead?.()\n return list\n }\n const emit = (e: LogEntry, updated: boolean): void => {\n for (const fn of listeners) {\n try {\n fn(e, updated)\n } catch {\n // a broken listener must not break the room\n }\n }\n }\n\n const add = (entry: NewEntry): LogEntry => {\n const { t, ...rest } = entry\n const e: LogEntry = { seq: seq++, t: Math.round((t ?? clock()) * 1000) / 1000, ...rest }\n list.push(e)\n if (list.length > MAX_ENTRIES) list = list.slice(list.length - MAX_ENTRIES)\n emit(e, false)\n return e\n }\n\n const log: WritableLog = {\n add,\n coalesce(key, entry, windowS = 1) {\n const now = entry.t ?? clock()\n const k = keyed.get(key)\n if (k && now - k.last <= windowS && list.includes(k.entry)) {\n const { t: _t, ...rest } = entry\n k.count++\n Object.assign(k.entry, rest)\n k.entry.data = { ...(rest.data ?? {}), updates: k.count }\n k.last = now\n emit(k.entry, true)\n return k.entry\n }\n const e = add(entry)\n keyed.set(key, { entry: e, last: now, count: 1 })\n return e\n },\n setBeforeRead(fn) {\n beforeRead = fn\n },\n setClock(fn) {\n clock = fn\n },\n entries(filter) {\n const all = read()\n if (!filter) return all.slice()\n return all.filter(\n (e) =>\n (!filter.channel || e.channel === filter.channel) && (!filter.type || e.type === filter.type) && (!filter.objectId || e.objectId === filter.objectId),\n )\n },\n clear() {\n beforeRead?.()\n list = []\n keyed.clear()\n },\n toJSON: () => JSON.stringify(read(), null, 2),\n toNDJSON: () => read().map((e) => JSON.stringify(e)).join('\\n') + (list.length ? '\\n' : ''),\n toText: () => read().map((e) => `[${formatTime(e.t)}] ${e.channel.padEnd(6)} ${e.text}`).join('\\n'),\n async download(format = 'ndjson') {\n const body = format === 'json' ? log.toJSON() : format === 'txt' ? log.toText() : log.toNDJSON()\n const downloads = downloadsP ? await downloadsP : null\n if (downloads) {\n // the Artifact allowlist has no `.ndjson`: it goes out as text\n const filename = format === 'ndjson' ? 'test-room-log.ndjson.txt' : `test-room-log.${format}`\n try {\n await downloads.save({ filename, data: body })\n } catch (err) {\n const code = (err as { code?: unknown } | null)?.code\n log.add({ channel: 'action', type: 'export_cancelled', text: options.exportCancelled?.() ?? 'export cancelled', data: { format, ...(typeof code === 'string' ? { code } : {}) } })\n }\n return\n }\n if (typeof document === 'undefined' || typeof Blob === 'undefined' || typeof URL === 'undefined' || !URL.createObjectURL) return\n const mime = format === 'json' ? 'application/json' : 'text/plain'\n const url = URL.createObjectURL(new Blob([body], { type: mime }))\n const a = document.createElement('a')\n a.href = url\n a.download = `test-room-log.${format}`\n document.body.appendChild(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n },\n summary() {\n const byType: Record<string, number> = {}\n const byMaterial: Record<string, number> = {}\n const objects = new Set<string>()\n let destroyed = 0\n for (const e of read()) {\n byType[e.type] = (byType[e.type] ?? 0) + 1\n if (e.material) byMaterial[e.material] = (byMaterial[e.material] ?? 0) + 1\n if (e.objectId) objects.add(e.objectId)\n if (e.type === 'destroyed') destroyed++\n }\n return { byType, byMaterial, objects: objects.size, destroyed }\n },\n on(fn) {\n listeners.add(fn)\n return () => listeners.delete(fn)\n },\n }\n return log\n}\n","import type { DestructionEvent, DestructionWorld, PartState, ToolKind } from '@adatechnology/game-destruction'\nimport type { FluidEvent, FluidWorld } from '@adatechnology/game-fluids'\nimport type { WritableLog } from './log'\nimport type { LogEntry } from './types'\n\ntype Vars = Record<string, string | number>\n\n/** What the narrator needs to know about the room. */\nexport interface NarrateContext {\n world: DestructionWorld\n fluids: FluidWorld\n log: WritableLog\n /** Current room time in seconds. */\n now: () => number\n t: (key: string, vars?: Vars) => string\n /** Locale number: `1.5` -> `1,5` in pt-BR. */\n num: (n: number, digits?: number) => string\n /** Item display name of an object id (also loose pieces). */\n nameOf: (objectId: string) => string\n itemIdOf: (objectId: string) => string | undefined\n materialName: (id: string) => string\n liquidName: (id: string) => string\n jointKind: (kind: string) => string\n toolName: (tool: string) => string\n /** Display name of the item that carries a fluid container. */\n containerName: (containerId: string) => { name: string; objectId?: string; itemId?: string } | undefined\n /** Where a part lives now: its object, or the loose piece it broke off into. */\n locatePart?: (objectId: string, partId: string) => { objectId: string; part: PartState } | null\n}\n\nconst SKIP_DAMAGE: ReadonlySet<string> = new Set(['fire', 'heat'])\n\n/**\n * Turns destruction and fluid events into plain log lines in the room locale. Events of one frame arrive as a batch: a `damage` event is merged\n * into the dent, hole or crack it caused, a `leak` event into the hole that opened it, and the noisy ones (melt, drip, disassembly) become one\n * line that is updated while it goes on.\n */\nexport function createNarrator(c: NarrateContext) {\n const { t, num } = c\n\n /** Materials seen per `object|part`, so a line about a part that already broke off its object still names the material. */\n const materialMemo = new Map<string, string>()\n const findPart = (objectId: string, partId: string): PartState | null => {\n const p = c.world.part(objectId, partId) ?? c.locatePart?.(objectId, partId)?.part ?? null\n if (p) materialMemo.set(`${objectId}|${partId}`, p.material)\n return p\n }\n const plural = (key: string, n: number): string => t(`${key}.${n === 1 ? 'one' : 'other'}`, { n })\n const pieces = (n: number): string => plural('count.piece', n)\n const joints = (n: number): string => plural('count.joint', n)\n const xz = (x: number, z: number): string => t('coords', { x: num(x, 1), z: num(z, 1) })\n\n const where = (objectId: string, partId: string): string => {\n const p = findPart(objectId, partId)\n const m = p?.material ?? materialMemo.get(`${objectId}|${partId}`)\n return `${c.nameOf(objectId)} › ${partId}${m ? ` (${c.materialName(m)})` : ''}`\n }\n\n const stateOf = (objectId: string, partId: string): LogEntry['state'] => {\n const p = findPart(objectId, partId)\n if (!p) return undefined\n const s: Record<string, number | string | boolean> = {\n status: p.status,\n hp: Math.round(p.hp * 10) / 10,\n maxHp: Math.round(p.maxHp * 10) / 10,\n temperature: Math.round(p.temperature),\n char: Math.round(p.char * 100) / 100,\n melt: Math.round(p.melt * 100) / 100,\n }\n if (p.liters !== undefined) s.liters = Math.round(p.liters * 1000) / 1000\n return s\n }\n\n const base = (ev: DestructionEvent, part?: string): Pick<LogEntry, 'channel' | 'objectId' | 'itemId' | 'part' | 'material' | 'state'> => ({\n channel: 'event',\n objectId: ev.object,\n itemId: c.itemIdOf(ev.object),\n part,\n material: part ? (findPart(ev.object, part)?.material ?? materialMemo.get(`${ev.object}|${part}`)) : undefined,\n state: part ? stateOf(ev.object, part) : undefined,\n })\n\n const hpText = (obj: string, part: string): string => {\n const p = findPart(obj, part)\n return p ? `hp ${num(p.hp, 0)}/${num(p.maxHp, 0)}` : ''\n }\n\n const isLost = (obj: string, part: string): boolean => {\n const st = findPart(obj, part)?.status\n return st === 'broken' || st === 'melted' || st === 'ashes'\n }\n\n /** Per-part running totals for lines that repeat while something goes on (cracks under load, overload damage). */\n const crackAcc = new Map<string, { n: number; cm: number; last: number }>()\n const damageAcc = new Map<string, { total: number; last: number }>()\n const stressAt = new Map<string, number>()\n const leakAt = new Map<string, number>()\n const list = (names: string[]): string => (names.length > 6 ? `${names.slice(0, 6).join(', ')}…` : names.join(', '))\n\n const events = (batch: DestructionEvent[]): void => {\n const now = c.now()\n const damage = new Map<string, { amount: number; type: string }>()\n const holes = new Map<string, LogEntry>()\n const dents = new Map<string, LogEntry>()\n for (const ev of batch) {\n if (ev.type !== 'damage') continue\n const k = `${ev.object}|${ev.part}`\n const prev = damage.get(k)\n damage.set(k, { amount: (prev?.amount ?? 0) + ev.amount, type: ev.damageType })\n }\n\n // A part that breaks, melts or burns away opens every joint it had: those `detach` events become part of ONE line about the part\n // (appended to its fracture or burnout line, or standing alone), instead of one line per joint.\n const lostJoints = new Map<string, { obj: string; part: string; joints: number; groups: number; merged: boolean }>()\n // Joints that open for another reason (a blow, a tool) are counted per object.\n const openJoints = new Map<string, { obj: string; by: string; list: Array<{ joint: string; a: string; b: string }>; groups: number; done: boolean }>()\n // Several parts of one object catching fire or being put out at once are one line.\n const fireParts = new Map<string, { obj: string; parts: string[]; temp: number; done: boolean }>()\n const outParts = new Map<string, { obj: string; parts: string[]; done: boolean }>()\n for (const ev of batch) {\n if (ev.type === 'detach') {\n if (ev.by === 'part_lost') {\n const [a, b] = ev.parts\n const lost = isLost(ev.object, a) && !isLost(ev.object, b) ? a : isLost(ev.object, b) && !isLost(ev.object, a) ? b : isLost(ev.object, a) ? a : b\n const key = `${ev.object}|${lost}`\n const g = lostJoints.get(key) ?? { obj: ev.object, part: lost, joints: 0, groups: 0, merged: false }\n g.joints++\n g.groups = ev.groups.length\n lostJoints.set(key, g)\n } else {\n const key = `${ev.object}|${ev.by}`\n const g = openJoints.get(key) ?? { obj: ev.object, by: ev.by, list: [], groups: 0, done: false }\n const [a, b] = ev.parts\n g.list.push({ joint: ev.joint, a, b })\n g.groups = ev.groups.length\n openJoints.set(key, g)\n }\n } else if (ev.type === 'ignite') {\n const g = fireParts.get(ev.object) ?? { obj: ev.object, parts: [], temp: 0, done: false }\n g.parts.push(ev.part)\n g.temp = Math.max(g.temp, findPart(ev.object, ev.part)?.temperature ?? 0)\n fireParts.set(ev.object, g)\n } else if (ev.type === 'extinguish') {\n const g = outParts.get(ev.object) ?? { obj: ev.object, parts: [], done: false }\n g.parts.push(ev.part)\n outParts.set(ev.object, g)\n }\n }\n const lostTail = (key: string): string => {\n const g = lostJoints.get(key)\n if (!g) return ''\n g.merged = true\n return t('ev.lost.tail', { joints: joints(g.joints), pieces: pieces(g.groups) })\n }\n const lostData = (key: string): Record<string, unknown> => {\n const g = lostJoints.get(key)\n return g ? { jointsOpened: g.joints, pieces: g.groups } : {}\n }\n\n for (const ev of batch) {\n switch (ev.type) {\n case 'damage':\n break\n case 'dent': {\n const k = `${ev.object}|${ev.part}`\n const d = damage.get(k)\n damage.delete(k)\n const mm = ev.dent.depth * 1000\n const prev = dents.get(k)\n if (prev) {\n const n = Number(prev.data?.count ?? 1) + 1\n const deepest = Math.max(Number(prev.data?.depthMm ?? 0), mm)\n prev.text = t('ev.dents', { where: where(ev.object, ev.part), n, mm: num(deepest, 0), hp: hpText(ev.object, ev.part) })\n prev.data = { ...prev.data, count: n, depthMm: Math.round(deepest * 10) / 10 }\n break\n }\n dents.set(\n k,\n c.log.add({\n ...base(ev, ev.part),\n type: 'dent',\n text: t('ev.dent', { where: where(ev.object, ev.part), mm: num(mm, 0), hp: hpText(ev.object, ev.part) }),\n data: { count: 1, depthMm: Math.round(mm * 10) / 10, radius: ev.dent.radius, damage: d?.amount, point: ev.worldPoint, source: ev.source },\n }),\n )\n break\n }\n case 'hole': {\n const k = `${ev.object}|${ev.part}`\n const d = damage.get(k)\n damage.delete(k)\n const mm = ev.hole.diameter * 1000\n const prev = holes.get(k)\n if (prev) {\n const n = Number(prev.data?.count ?? 1) + 1\n const through = Number(prev.data?.throughCount ?? 0) + (ev.hole.through ? 1 : 0)\n prev.text = t('ev.holes', { where: where(ev.object, ev.part), n, mm: num(mm, 0), thr: through, hp: hpText(ev.object, ev.part) })\n prev.data = { ...prev.data, count: n, throughCount: through, through: through > 0 }\n break\n }\n holes.set(\n k,\n c.log.add({\n ...base(ev, ev.part),\n type: 'hole',\n text: t(ev.hole.through ? 'ev.hole.through' : 'ev.hole.stuck', { where: where(ev.object, ev.part), mm: num(mm, 0), hp: hpText(ev.object, ev.part) }),\n data: { count: 1, throughCount: ev.hole.through ? 1 : 0, diameterMm: Math.round(mm * 10) / 10, through: ev.hole.through, damage: d?.amount, point: ev.worldPoint, source: ev.source },\n }),\n )\n break\n }\n case 'crack': {\n const k = `${ev.object}|${ev.part}`\n const d = damage.get(k)\n damage.delete(k)\n // a part under load cracks again and again: that is one line that counts them (a cracking shot or blow stays its own line)\n const loaded = (findPart(ev.object, ev.part)?.stress ?? 0) > 0.8 && ev.source === undefined\n const cm = ev.crack.length * 100\n if (loaded) {\n const acc = crackAcc.get(k)\n const n = acc && now - acc.last <= 1 ? acc.n + 1 : 1\n const longest = acc && n > 1 ? Math.max(acc.cm, cm) : cm\n crackAcc.set(k, { n, cm: longest, last: now })\n c.log.coalesce(\n `crack:${k}`,\n {\n ...base(ev, ev.part),\n type: 'crack',\n text: t('ev.cracks', { where: where(ev.object, ev.part), n, cm: num(longest, 0), hp: hpText(ev.object, ev.part) }),\n data: { rays: ev.crack.rays, lengthM: ev.crack.length, count: n, underLoad: true },\n },\n 1,\n )\n break\n }\n c.log.add({\n ...base(ev, ev.part),\n type: 'crack',\n text: t('ev.crack', { where: where(ev.object, ev.part), rays: ev.crack.rays, cm: num(cm, 0), hp: hpText(ev.object, ev.part) }),\n data: { rays: ev.crack.rays, lengthM: ev.crack.length, damage: d?.amount, source: ev.source },\n })\n break\n }\n case 'ricochet':\n c.log.add({\n ...base(ev, ev.part),\n type: 'ricochet',\n text: t('ev.ricochet', { where: where(ev.object, ev.part), energy: num(ev.energy, 0) }),\n data: { energy: ev.energy, direction: ev.direction },\n })\n break\n case 'leak': {\n const k = `${ev.object}|${ev.part}`\n const liquid = c.liquidName(ev.fluid)\n const hole = holes.get(k)\n const rate = num(ev.rate, 2)\n leakAt.set(ev.object, now)\n if (hole) {\n hole.text += t('ev.leak.tail', { liquid, rate })\n hole.data = { ...hole.data, leak: { fluid: ev.fluid, ratePerS: ev.rate, pressurized: ev.pressurized } }\n } else {\n c.log.add({ ...base(ev, ev.part), type: 'leak', text: t('ev.leak.alone', { where: where(ev.object, ev.part), liquid, rate }), data: { fluid: ev.fluid, ratePerS: ev.rate } })\n }\n break\n }\n case 'fracture': {\n const k = `${ev.object}|${ev.part}`\n const d = damage.get(k)\n damage.delete(k)\n c.log.add({\n ...base(ev, ev.part),\n type: 'fracture',\n text: t(`ev.fracture.${ev.style}`, { where: where(ev.object, ev.part), n: ev.fragments.length }) + lostTail(k),\n data: { style: ev.style, fragments: ev.fragments.length, damage: d?.amount, point: ev.point, source: ev.source, ...lostData(k) },\n })\n break\n }\n case 'detach': {\n if (ev.by === 'part_lost') {\n // the part's own line (fracture, burnout) already says it; with none in this batch, say it here, once\n const [a, b] = ev.parts\n const lost = isLost(ev.object, a) && !isLost(ev.object, b) ? a : isLost(ev.object, b) && !isLost(ev.object, a) ? b : isLost(ev.object, a) ? a : b\n const key = `${ev.object}|${lost}`\n const g = lostJoints.get(key)\n if (!g || g.merged) break\n const hasOwnLine = batch.some((e) => (e.type === 'fracture' || e.type === 'burnout') && e.object === ev.object && e.part === lost)\n if (hasOwnLine) break\n g.merged = true\n const status = findPart(ev.object, lost)?.status\n const verb = t(`lost.${status === 'ashes' ? 'ashes' : status === 'melted' ? 'melted' : 'broken'}`)\n c.log.add({\n ...base(ev, lost),\n type: 'detach',\n text: t('ev.lost.alone', { where: where(ev.object, lost), verb, joints: joints(g.joints), pieces: pieces(g.groups) }),\n data: { parts: [a, b], by: ev.by, ...lostData(key) },\n })\n break\n }\n const key = `${ev.object}|${ev.by}`\n const g = openJoints.get(key)\n if (!g || g.done) break\n g.done = true\n const [a, b] = ev.parts\n const many = g.list.length > 1\n c.log.add({\n channel: 'event',\n type: 'detach',\n objectId: ev.object,\n itemId: c.itemIdOf(ev.object),\n text: many\n ? t(`ev.detach.many.${ev.by === 'tool' ? 'tool' : 'break'}`, { obj: c.nameOf(ev.object), joints: joints(g.list.length), pieces: pieces(g.groups) })\n : t('ev.detach', { obj: c.nameOf(ev.object), a, b, by: t(`by.${ev.by}`), pieces: pieces(g.groups) }),\n data: { joint: ev.joint, joints: g.list.map((j) => j.joint), parts: ev.parts, by: ev.by, groups: g.groups },\n })\n break\n }\n case 'disassemble_progress': {\n const pct = Math.round(ev.progress * 100)\n const kind = kindOf(ev.object, ev.joint)\n const [a, b] = ev.joint.split('~')\n c.log.coalesce(\n `dis:${ev.object}:${ev.joint}`,\n {\n channel: 'event',\n type: 'disassemble_progress',\n objectId: ev.object,\n itemId: c.itemIdOf(ev.object),\n text: t('ev.disassemble', { obj: c.nameOf(ev.object), a: a ?? ev.joint, b: b ?? '', kind: kind ? c.jointKind(kind) : t('joint.generic'), tool: c.toolName(ev.tool as ToolKind), pct }),\n data: { joint: ev.joint, tool: ev.tool, progress: ev.progress },\n },\n 1.5,\n )\n break\n }\n case 'ignite': {\n const g = fireParts.get(ev.object)\n if (g && g.parts.length >= 3) {\n if (g.done) break\n g.done = true\n c.log.add({\n channel: 'event',\n type: 'ignite',\n objectId: ev.object,\n itemId: c.itemIdOf(ev.object),\n text: t('ev.ignite.many', { obj: c.nameOf(ev.object), n: g.parts.length, temp: num(g.temp, 0), parts: list(g.parts) }),\n data: { parts: g.parts, temperature: Math.round(g.temp) },\n })\n break\n }\n c.log.add({ ...base(ev, ev.part), type: 'ignite', text: t('ev.ignite', { where: where(ev.object, ev.part), temp: num(findPart(ev.object, ev.part)?.temperature ?? 0, 0) }) })\n break\n }\n case 'extinguish': {\n const g = outParts.get(ev.object)\n if (g && g.parts.length >= 3) {\n if (g.done) break\n g.done = true\n c.log.add({\n channel: 'event',\n type: 'extinguish',\n objectId: ev.object,\n itemId: c.itemIdOf(ev.object),\n text: t('ev.extinguish.many', { obj: c.nameOf(ev.object), n: g.parts.length, parts: list(g.parts) }),\n data: { parts: g.parts },\n })\n break\n }\n c.log.add({ ...base(ev, ev.part), type: 'extinguish', text: t('ev.extinguish', { where: where(ev.object, ev.part) }) })\n break\n }\n case 'burnout': {\n const k = `${ev.object}|${ev.part}`\n c.log.add({ ...base(ev, ev.part), type: 'burnout', text: t('ev.burnout', { where: where(ev.object, ev.part) }) + lostTail(k), data: lostData(k) })\n break\n }\n case 'melt':\n c.log.coalesce(\n `melt:${ev.object}:${ev.part}`,\n { ...base(ev, ev.part), type: 'melt', text: t('ev.melt', { where: where(ev.object, ev.part), pct: Math.round(ev.melt * 100) }), data: { melt: ev.melt } },\n 2,\n )\n break\n case 'drip':\n c.log.coalesce(`drip:${ev.object}:${ev.part}`, { ...base(ev, ev.part), type: 'drip', text: t('ev.drip', { where: where(ev.object, ev.part) }), data: { point: ev.point } }, 2)\n break\n case 'explode':\n c.log.add({\n ...base(ev, ev.part),\n type: 'explode',\n text: t('ev.explode', { where: where(ev.object, ev.part), energy: num(ev.energy, 0), radius: num(ev.radius, 1) }),\n data: { energy: ev.energy, radius: ev.radius, point: ev.point },\n })\n break\n case 'destroyed':\n c.log.add({ channel: 'event', type: 'destroyed', objectId: ev.object, itemId: c.itemIdOf(ev.object), text: t('ev.destroyed', { obj: c.nameOf(ev.object) }) })\n break\n default: {\n // structural events (`stress`, `collapse`) come from newer versions of the core\n const x = ev as unknown as Record<string, unknown> & { type: string; object: string; time: number }\n if (x.type === 'stress') {\n const part = String(x.part ?? '')\n stressAt.set(`${x.object}|${part}`, now)\n c.log.coalesce(\n `stress:${x.object}:${part}`,\n {\n ...base(ev, part),\n type: 'stress',\n text: t('ev.stress', { where: where(x.object, part), stress: num(Number(x.stress ?? 0) * 100, 0), load: num(Number(x.load ?? 0), 0) }),\n data: { stress: x.stress, load: x.load },\n },\n 1,\n )\n } else if (x.type === 'collapse') {\n const parts = Array.isArray(x.parts) ? (x.parts as unknown[]).map(String) : []\n c.log.add({\n channel: 'event',\n type: 'collapse',\n objectId: x.object,\n itemId: c.itemIdOf(x.object),\n text: t('ev.collapse', { obj: c.nameOf(x.object), pieces: pieces(parts.length), mass: num(Number(x.mass ?? 0), 0), parts: list(parts) }),\n data: { parts: parts.length, partIds: parts, massKg: x.mass, cause: x.cause },\n })\n }\n }\n }\n }\n // damage that no dent, hole, crack or fracture explained (blunt thuds, blast, absorbed bullets, a structure carrying too much)\n for (const [k, d] of damage) {\n if (SKIP_DAMAGE.has(d.type) || d.amount < 0.5) continue\n const [obj, part] = k.split('|')\n const overload = d.type === 'blunt' && now - (stressAt.get(k) ?? -99) <= 3\n const entry = {\n channel: 'event' as const,\n type: 'damage',\n objectId: obj,\n itemId: c.itemIdOf(obj),\n part,\n material: findPart(obj, part)?.material ?? materialMemo.get(k),\n state: stateOf(obj, part),\n }\n if (!overload) {\n c.log.add({ ...entry, text: t('ev.damage', { where: where(obj, part), type: t(`dmg.${d.type}`), amount: num(d.amount, 0), hp: hpText(obj, part) }), data: { amount: d.amount, damageType: d.type } })\n continue\n }\n // a structure carrying too much loses hit points every tick: one line with the running total\n const acc = damageAcc.get(k)\n const total = acc && now - acc.last <= 1 ? acc.total + d.amount : d.amount\n damageAcc.set(k, { total, last: now })\n c.log.coalesce(\n `damage:${k}`,\n { ...entry, text: t('ev.damage.overload', { where: where(obj, part), amount: num(total, 0), hp: hpText(obj, part) }), data: { amount: total, damageType: d.type, overload: true } },\n 1,\n )\n }\n }\n\n const kindMemo = new Map<string, string>()\n const kindOf = (objectId: string, jointId: string): string => {\n const key = `${objectId}|${jointId}`\n const own = c.world.state(objectId)?.joints.find((j) => j.id === jointId)?.kind\n if (own) {\n kindMemo.set(key, own)\n return own\n }\n const known = kindMemo.get(key)\n if (known) return known\n for (const id of c.world.ids()) {\n const k = c.world.state(id)?.joints.find((j) => j.id === jointId)?.kind\n if (k) return k\n }\n return ''\n }\n\n const stainInfo = new Map<string, { liquid: string; surface: string; x: number; z: number }>()\n const stainAcc = new Map<string, { n: number; last: number }>()\n const driedAcc = new Map<string, { n: number; last: number }>()\n const drinkAcc = new Map<string, { liters: number; thirst: number; burn: boolean; effects: Set<string>; last: number; start: number }>()\n const fluid = (ev: FluidEvent): void => {\n const who = (id: string): string => c.containerName(id)?.name ?? id\n const meta = (id: string): { objectId?: string; itemId?: string } => {\n const m = c.containerName(id)\n return { objectId: m?.objectId, itemId: m?.itemId }\n }\n const f = 'fluid.'\n switch (ev.type) {\n case 'fill':\n c.log.coalesce(`fill:${ev.container}`, { channel: 'event', type: f + 'fill', ...meta(ev.container), text: t('fl.fill', { who: who(ev.container), liquid: c.liquidName(ev.liquid), liters: num(ev.liters, 2) }), data: { liters: ev.liters } }, 1.5)\n break\n case 'pour':\n c.log.coalesce(`pour:${ev.container}`, { channel: 'event', type: f + 'pour', ...meta(ev.container), text: t('fl.pour', { who: who(ev.container), liquid: c.liquidName(ev.liquid), rate: num(ev.rate, 2) }), data: { rate: ev.rate } }, 2)\n break\n case 'spill':\n c.log.coalesce(`spill:${ev.container}`, { channel: 'event', type: f + 'spill', ...meta(ev.container), text: t('fl.spill', { who: who(ev.container), liquid: c.liquidName(ev.liquid), rate: num(ev.rate, 2) }), data: { rate: ev.rate } }, 2)\n break\n case 'leak': {\n // the hole line of the destruction event already says the object is leaking\n const owner = meta(ev.container).objectId\n if (owner && c.now() - (leakAt.get(owner) ?? -99) <= 2) break\n c.log.coalesce(`fleak:${ev.container}`, { channel: 'event', type: f + 'leak', ...meta(ev.container), text: t('fl.leak', { who: who(ev.container), liquid: c.liquidName(ev.liquid), rate: num(ev.rate, ev.rate < 0.01 ? 3 : 2) }), data: { rate: ev.rate, point: ev.point } }, 2)\n break\n }\n case 'drink': {\n // a sip arrives as many small drink events: one line per sip, updated while it goes on\n const now = c.now()\n let acc = drinkAcc.get(ev.container)\n if (!acc || now - acc.last > 0.5) acc = { liters: 0, thirst: 0, burn: false, effects: new Set<string>(), last: now, start: now }\n acc.liters += ev.liters\n acc.thirst += ev.thirst\n acc.burn = acc.burn || ev.burn\n for (const e of ev.effects) acc.effects.add(e)\n acc.last = now\n drinkAcc.set(ev.container, acc)\n const effects = [...acc.effects].map((e) => t(`effect.${e}`)).join(', ')\n c.log.coalesce(\n `drink:${ev.container}:${acc.start}`,\n {\n channel: 'event',\n type: f + 'drink',\n ...meta(ev.container),\n text:\n t('fl.drink', { who: who(ev.container), liters: num(acc.liters, 2), thirst: num(acc.thirst, 0) }) +\n (effects ? `, ${effects}` : '') +\n (acc.burn ? `, ${t('fl.burn')}` : ''),\n data: { liters: acc.liters, temperature: ev.temperature, thirst: acc.thirst, effects: [...acc.effects], burn: acc.burn },\n },\n 0.5,\n )\n break\n }\n case 'empty':\n c.log.add({ channel: 'event', type: f + 'empty', ...meta(ev.container), text: t('fl.empty', { who: who(ev.container) }) })\n break\n case 'splash':\n c.log.coalesce(`splash:${ev.liquid}`, { channel: 'event', type: f + 'splash', text: t('fl.splash', { liquid: c.liquidName(ev.liquid) }), data: { point: ev.point, intensity: ev.intensity } }, 1)\n break\n case 'stain': {\n const surface = t(`surface.${ev.surface}`)\n const liquid = c.liquidName(ev.liquid)\n stainInfo.set(ev.stain, { liquid: ev.liquid, surface, x: ev.point[0], z: ev.point[2] })\n // a leak or a spill makes several stains in a row: one line that counts them\n const key = `stain:${ev.liquid}:${ev.surface}`\n const acc = stainAcc.get(key)\n const n = acc && c.now() - acc.last <= 1 ? acc.n + 1 : 1\n stainAcc.set(key, { n, last: c.now() })\n c.log.coalesce(\n key,\n {\n channel: 'event',\n type: f + 'stain',\n text: n > 1 ? t('fl.stains', { n, liquid, surface, where: xz(ev.point[0], ev.point[2]) }) : t('fl.stain', { liquid, surface, where: xz(ev.point[0], ev.point[2]) }),\n data: { stain: ev.stain, surface: ev.surface, liquid: ev.liquid, point: ev.point, count: n },\n },\n 1,\n )\n break\n }\n case 'dried': {\n const info = stainInfo.get(ev.stain)\n const key = `dried:${info?.liquid ?? '?'}:${ev.mark}`\n const acc = driedAcc.get(key)\n const n = acc && c.now() - acc.last <= 1.5 ? acc.n + 1 : 1\n driedAcc.set(key, { n, last: c.now() })\n const vars = { liquid: info ? c.liquidName(info.liquid) : '', surface: info?.surface ?? '', where: info ? xz(info.x, info.z) : '', n }\n const text = !info\n ? t(ev.mark ? 'fl.dried.mark' : 'fl.dried')\n : n > 1\n ? t(ev.mark ? 'fl.dried.many.mark' : 'fl.dried.many', vars)\n : t(ev.mark ? 'fl.dried.known.mark' : 'fl.dried.known', vars)\n c.log.coalesce(key, { channel: 'event', type: f + 'dried', text, data: { stain: ev.stain, mark: ev.mark, count: n } }, 1.5)\n break\n }\n case 'mix':\n c.log.add({ channel: 'event', type: f + 'mix', ...meta(ev.container), text: t('fl.mix', { who: who(ev.container), from: c.liquidName(ev.from), into: c.liquidName(ev.into) }) })\n break\n default:\n break\n }\n }\n\n return { events, fluid }\n}\n","import type * as THREE_NS from 'three'\nimport type { Vec3 } from '@adatechnology/game-destruction'\n\nexport interface PlayerHooks {\n /** Primary button pressed / released (use the tool). `click` is a press without a drag, for the no-pointer-lock fallback. */\n primaryDown(): void\n primaryUp(): void\n secondary(): void\n key(code: string, down: boolean, event: KeyboardEvent): void\n wheel(direction: 1 | -1): void\n}\n\nexport interface PlayerOptions {\n camera: THREE_NS.PerspectiveCamera\n dom: HTMLElement\n /** `[minX, minZ, maxX, maxZ]` boxes to stay out of. */\n colliders: Array<[number, number, number, number]>\n /** Half size of the arena. */\n limit: number\n start: Vec3\n hooks: PlayerHooks\n}\n\nexport interface Player {\n readonly yaw: number\n readonly pitch: number\n readonly locked: boolean\n /** Held keys, by `KeyboardEvent.code`. */\n keys: ReadonlySet<string>\n update(dt: number): void\n setPose(position: Vec3, yaw: number, pitch: number): void\n /** Put the eye at `position` looking at `target`. */\n look(position: Vec3, target: Vec3): void\n /** Camera kick in degrees. */\n kick(pitchDeg: number, yawDeg: number): void\n /** Move the player by a world offset on the floor plane, stopped by the colliders and the arena limit (scripted walks). */\n moveBy(dx: number, dz: number): void\n /** Walk by hand (tests): moves the player `forward` and `right` metres along its facing. */\n walk(forward: number, right: number): void\n dispose(): void\n}\n\nconst EYE = 1.7\nconst RADIUS = 0.3\nconst WALK = 3.4\nconst RUN = 6.2\nconst JUMP = 4.6\nconst GRAVITY = 13\nconst LOOK = 0.0022\n\n/**\n * First-person controller: WASD, Shift, Space, mouse look with pointer lock, and a drag-to-look fallback for pages where the lock is not\n * available (iframes, headless browsers, touch). In the fallback a press that does not move is a click (tool use), a drag looks around.\n */\nexport function createPlayer(THREE: typeof THREE_NS, o: PlayerOptions): Player {\n const cam = o.camera\n let yaw = 0\n let pitch = 0\n let y = 0\n let eye = EYE\n let vy = 0\n const px = { x: o.start[0], z: o.start[2] }\n let locked = false\n const keys = new Set<string>()\n const euler = new THREE.Euler(0, 0, 0, 'YXZ')\n\n const apply = (): void => {\n euler.set(pitch, yaw, 0, 'YXZ')\n cam.quaternion.setFromEuler(euler)\n cam.position.set(px.x, eye + y, px.z)\n cam.updateMatrixWorld(true)\n }\n apply()\n\n const blocked = (x: number, z: number): boolean => {\n if (Math.abs(x) > o.limit - RADIUS || Math.abs(z) > o.limit - RADIUS) return true\n for (const c of o.colliders) if (x > c[0] - RADIUS && x < c[2] + RADIUS && z > c[1] - RADIUS && z < c[3] + RADIUS) return true\n return false\n }\n const move = (dx: number, dz: number): void => {\n if (!blocked(px.x + dx, px.z)) px.x += dx\n if (!blocked(px.x, px.z + dz)) px.z += dz\n }\n\n let dragging = false\n let moved = 0\n let downAt = 0\n let useStarted = false\n let holdTimer: ReturnType<typeof setTimeout> | null = null\n\n const look = (dx: number, dy: number): void => {\n yaw -= dx * LOOK\n pitch = Math.max(-1.5, Math.min(1.5, pitch - dy * LOOK))\n }\n const onLockChange = (): void => {\n locked = document.pointerLockElement === o.dom\n }\n const onMouseDown = (e: MouseEvent): void => {\n o.dom.focus?.()\n if (e.button === 2) {\n e.preventDefault()\n o.hooks.secondary()\n return\n }\n if (e.button !== 0) return\n if (!locked) {\n try {\n const r = (o.dom.requestPointerLock as unknown as (() => Promise<void> | void) | undefined)?.call(o.dom)\n if (r && typeof (r as Promise<void>).catch === 'function') (r as Promise<void>).catch(() => undefined)\n } catch {\n // no pointer lock here: drag to look\n }\n dragging = true\n moved = 0\n downAt = performance.now()\n useStarted = false\n holdTimer = setTimeout(() => {\n if (dragging && moved < 4 && !useStarted) {\n useStarted = true\n o.hooks.primaryDown()\n }\n }, 220)\n return\n }\n useStarted = true\n o.hooks.primaryDown()\n }\n const onMouseUp = (e: MouseEvent): void => {\n if (e.button !== 0) return\n if (holdTimer) clearTimeout(holdTimer)\n if (dragging) {\n dragging = false\n if (!useStarted && moved < 4 && performance.now() - downAt < 400) {\n o.hooks.primaryDown()\n o.hooks.primaryUp()\n } else if (useStarted) o.hooks.primaryUp()\n useStarted = false\n return\n }\n if (useStarted) o.hooks.primaryUp()\n useStarted = false\n }\n const onMouseMove = (e: MouseEvent): void => {\n if (locked) look(e.movementX, e.movementY)\n else if (dragging) {\n moved += Math.abs(e.movementX) + Math.abs(e.movementY)\n if (moved >= 4) {\n if (useStarted) {\n useStarted = false\n o.hooks.primaryUp()\n }\n look(e.movementX, e.movementY)\n }\n }\n }\n const onWheel = (e: WheelEvent): void => {\n e.preventDefault()\n o.hooks.wheel(e.deltaY > 0 ? 1 : -1)\n }\n const typing = (e: Event): boolean => {\n const t = e.target as HTMLElement | null\n return !!t && (t.tagName === 'INPUT' || t.tagName === 'SELECT' || t.tagName === 'TEXTAREA')\n }\n const onKeyDown = (e: KeyboardEvent): void => {\n if (typing(e)) return\n if (e.code === 'Space' || e.code === 'Tab') e.preventDefault()\n if (!e.repeat) keys.add(e.code)\n o.hooks.key(e.code, true, e)\n }\n const onKeyUp = (e: KeyboardEvent): void => {\n keys.delete(e.code)\n if (typing(e)) return\n o.hooks.key(e.code, false, e)\n }\n const onContext = (e: Event): void => e.preventDefault()\n const onBlur = (): void => keys.clear()\n\n o.dom.addEventListener('mousedown', onMouseDown)\n window.addEventListener('mouseup', onMouseUp)\n window.addEventListener('mousemove', onMouseMove)\n o.dom.addEventListener('wheel', onWheel, { passive: false })\n o.dom.addEventListener('contextmenu', onContext)\n document.addEventListener('pointerlockchange', onLockChange)\n window.addEventListener('keydown', onKeyDown)\n window.addEventListener('keyup', onKeyUp)\n window.addEventListener('blur', onBlur)\n\n return {\n get yaw() {\n return yaw\n },\n get pitch() {\n return pitch\n },\n get locked() {\n return locked\n },\n keys,\n update(dt) {\n const run = keys.has('ShiftLeft') || keys.has('ShiftRight')\n const speed = run ? RUN : WALK\n let f = 0\n let r = 0\n if (keys.has('KeyW') || keys.has('ArrowUp')) f += 1\n if (keys.has('KeyS') || keys.has('ArrowDown')) f -= 1\n if (keys.has('KeyD') || keys.has('ArrowRight')) r += 1\n if (keys.has('KeyA') || keys.has('ArrowLeft')) r -= 1\n if ((f || r || keys.has('Space')) && eye !== EYE) eye = EYE\n if (f || r) {\n const len = Math.hypot(f, r)\n const fx = -Math.sin(yaw)\n const fz = -Math.cos(yaw)\n const rx = Math.cos(yaw)\n const rz = -Math.sin(yaw)\n move(((fx * f + rx * r) / len) * speed * dt, ((fz * f + rz * r) / len) * speed * dt)\n }\n if (y <= 0 && keys.has('Space')) vy = JUMP\n if (y > 0 || vy > 0) {\n vy -= GRAVITY * dt\n y += vy * dt\n if (y <= 0) {\n y = 0\n vy = 0\n }\n }\n apply()\n },\n setPose(position, yw, pt) {\n px.x = position[0]\n px.z = position[2]\n eye = position[1]\n y = 0\n vy = 0\n yaw = yw\n pitch = pt\n apply()\n },\n look(position, target) {\n px.x = position[0]\n px.z = position[2]\n eye = position[1]\n y = 0\n vy = 0\n const dx = target[0] - position[0]\n const dy = target[1] - position[1]\n const dz = target[2] - position[2]\n yaw = Math.atan2(-dx, -dz)\n pitch = Math.atan2(dy, Math.hypot(dx, dz))\n apply()\n },\n kick(pitchDeg, yawDeg) {\n pitch = Math.max(-1.5, Math.min(1.5, pitch + (pitchDeg * Math.PI) / 180))\n yaw += (yawDeg * Math.PI) / 180\n apply()\n },\n moveBy(dx, dz) {\n move(dx, dz)\n apply()\n },\n walk(forward, right) {\n move(-Math.sin(yaw) * forward + Math.cos(yaw) * right, -Math.cos(yaw) * forward - Math.sin(yaw) * right)\n apply()\n },\n dispose() {\n if (holdTimer) clearTimeout(holdTimer)\n o.dom.removeEventListener('mousedown', onMouseDown)\n window.removeEventListener('mouseup', onMouseUp)\n window.removeEventListener('mousemove', onMouseMove)\n o.dom.removeEventListener('wheel', onWheel)\n o.dom.removeEventListener('contextmenu', onContext)\n document.removeEventListener('pointerlockchange', onLockChange)\n window.removeEventListener('keydown', onKeyDown)\n window.removeEventListener('keyup', onKeyUp)\n window.removeEventListener('blur', onBlur)\n if (document.pointerLockElement === o.dom) document.exitPointerLock?.()\n },\n }\n}\n","import { JOINT_DEFAULTS, rotateVec, toWorld } from '@adatechnology/game-destruction'\nimport type { Vec3 } from '@adatechnology/game-destruction'\nimport { resolveStrings } from './locale'\nimport type { ScenarioContext, TestRoom, TestRoomScenario } from './types'\n\ntype T = (key: string, vars?: Record<string, string | number>) => string\ntype Num = (n: number, digits?: number) => string\n\n/** Built-in scripted checks over the generic `DEMO_ITEMS`. Names and check texts come from the room locale. */\nexport function makeScenarios(t: T, num: Num, _locale = 'en'): TestRoomScenario[] {\n const yn = (b: boolean): string => t(b ? 'yes' : 'no')\n const cn = (what: string, n: number): string => t(`count.${what}.${n === 1 ? 'one' : 'other'}`, { n })\n const pc = (n: number): string => t(n === 1 ? 'count.piece.one' : 'count.piece.other', { n })\n const sc = (id: string, run: (c: ScenarioContext) => void | Promise<void>): TestRoomScenario => ({ id, name: t(`sc.${id}`), run })\n\n const at = (room: TestRoom, itemId: string, x: number, z: number, y = 0, rot = 0): string => room.spawn(itemId, [x, y, z], rot).objectId\n const look = (room: TestRoom, from: Vec3, to: Vec3): void => room.look(from, to)\n const part = (room: TestRoom, id: string, p: string) => room.world.part(id, p)\n const count = (room: TestRoom, type: string, objectId?: string): number => room.log.entries({ type, objectId }).length\n const anyBurning = (room: TestRoom, id: string): boolean => (room.world.state(id)?.parts ?? []).some((p) => p.burning)\n const igniteHit = (room: TestRoom, id: string, point: Vec3, temperature = 900, seconds = 3): void => {\n room.world.hit(id, { type: 'fire', point, temperature, radius: 0.6, duration: seconds })\n }\n\n // columns of the demo `building_frame` placed at (0, 0, -6): x = -2 / 2, z = -8 / -4\n const COLUMN: Record<string, Vec3> = { column_0_0_0: [-2, 1.4, -8], column_0_1_0: [2, 1.4, -8], column_0_0_1: [-2, 1.4, -4], column_0_1_1: [2, 1.4, -4] }\n const killColumns = (room: TestRoom, id: string, ids: string[]): void => {\n for (const c of ids) room.world.hitPart(id, c, { type: 'blunt', point: COLUMN[c], energy: 3e6, radius: 0.05, source: 'test' })\n }\n const heavyCollapse = (room: TestRoom): number => room.log.entries({ type: 'collapse' }).reduce((m, e) => Math.max(m, Number(e.data?.massKg ?? 0)), 0)\n\n return [\n sc('steel_through_hole', ({ room, step, expect }) => {\n const id = at(room, 'steel_sheet', 0, -4)\n room.setTool('pistol_9mm')\n look(room, [0, 1.1, -1.5], [0, 1.1, -4])\n room.use()\n step(0.2)\n const p = part(room, id, 'sheet')\n const hole = p?.holes[0]\n expect(\n !!hole?.through,\n t('sc.steel_through_hole.check', { mm: num((hole?.diameter ?? 0) * 1000, 0), through: yn(!!hole?.through), holes: p?.holes.length ?? 0, hp: `${num(p?.hp ?? 0, 0)}/${num(p?.maxHp ?? 0, 0)}` }),\n { holes: p?.holes.length, through: hole?.through },\n )\n }),\n\n sc('concrete_stops_bullet', ({ room, step, expect }) => {\n const id = at(room, 'concrete_block', 0, -4)\n room.setTool('pistol_9mm')\n look(room, [0, 0.5, -1.5], [0, 0.2, -3.8])\n room.use()\n step(0.2)\n const p = part(room, id, 'block')\n const wall = part(room, 'target_wall', 'brick_1_4')\n const through = p?.holes.some((h) => h.through) ?? true\n expect(\n !through && (p?.holes.length ?? 0) + (p?.dents.length ?? 0) + (p?.cracks.length ?? 0) > 0 && (wall?.holes.length ?? 0) === 0,\n t('sc.concrete_stops_bullet.check', { through: yn(through), dents: cn('dent', p?.dents.length ?? 0), holes: cn('hole', p?.holes.length ?? 0), cracks: cn('crack', p?.cracks.length ?? 0), hp: `${num(p?.hp ?? 0, 0)}/${num(p?.maxHp ?? 0, 0)}` }),\n { through },\n )\n }),\n\n sc('hammer_dents_drum', ({ room, step, expect }) => {\n const id = at(room, 'steel_drum', 0, -4)\n room.setTool('hammer')\n look(room, [0, 0.6, -3.35], [0, 0.5, -4])\n let swings = 0\n for (; swings < 8 && (part(room, id, 'drum_body')?.dents.length ?? 0) === 0; swings++) {\n room.use()\n step(1)\n }\n const p = part(room, id, 'drum_body')\n expect(\n (p?.dents.length ?? 0) > 0 && p?.status !== 'broken',\n t('sc.hammer_dents_drum.check', { swings, dents: p?.dents.length ?? 0, depth: num((p?.dents[0]?.depth ?? 0) * 1000, 1), hp: `${num(p?.hp ?? 0, 0)}/${num(p?.maxHp ?? 0, 0)}` }),\n { swings },\n )\n }),\n\n sc('glass_shatters', ({ room, step, expect }) => {\n const id = at(room, 'glass_pane', 0, -4)\n room.setTool('pistol_9mm')\n look(room, [0, 1.3, -1.5], [0, 1.05, -4])\n let shots = 0\n for (; shots < 10 && part(room, id, 'pane')?.status !== 'broken'; shots++) {\n room.use()\n step(0.25)\n }\n step(0.5)\n const fr = room.log.entries({ type: 'fracture', objectId: id }).find((e) => e.part === 'pane')\n const n = Number(fr?.data?.fragments ?? 0)\n expect(part(room, id, 'pane')?.status === 'broken' && n >= 4, t('sc.glass_shatters.check', { shots, n }), { shots, fragments: n })\n }),\n\n sc('shotgun_splinters_crate', ({ room, step, expect }) => {\n const id = at(room, 'wooden_crate', 0, -4)\n room.setTool('shotgun_pump_12')\n look(room, [0, 0.6, -1.8], [0, 0.25, -3.77])\n let shots = 0\n const splinters = (): number => room.log.entries({ type: 'fracture', objectId: id }).filter((e) => e.data?.style === 'splinter').length\n for (; shots < 4 && splinters() === 0; shots++) {\n room.use()\n step(1.1)\n }\n const holes = (room.world.state(id)?.parts ?? []).reduce((n, p) => n + p.holes.length, 0)\n expect(splinters() > 0, t('sc.shotgun_splinters_crate.check', { shots, splinters: splinters(), holes }), { shots })\n }),\n\n sc('kick_chair_leg', ({ room, step, expect }) => {\n const id = at(room, 'chair', 0, -4)\n const before = room.renderer.pieces().length\n const leg = part(room, id, 'leg_1')\n void leg\n let kicks = 0\n for (; kicks < 6 && room.renderer.pieces().length <= before && part(room, id, 'leg_1'); kicks++) {\n room.world.hitPart(id, 'leg_1', { type: 'blunt', point: [-0.18, 0.2, -4.18], direction: [1, 0, 0], energy: 220, radius: 0.05, source: 'kick' })\n step(0.3)\n }\n step(0.5)\n const after = room.renderer.pieces().length\n const groups = room.world.state(id)?.groups.length ?? 1\n expect(\n after > before,\n t('sc.kick_chair_leg.check', { kicks, groups, before, after, leg: part(room, id, 'leg_1') ? t('leg.still') : t('leg.gone') }),\n { kicks, before, after },\n )\n }),\n\n sc('kick_detaches_leg_via_tool', ({ room, step, expect }) => {\n const id = at(room, 'chair', 0, -4)\n const before = room.renderer.pieces().length\n room.setTool('kick')\n let kicks = 0\n for (; kicks < 8 && room.renderer.pieces().length <= before && part(room, id, 'leg_1'); kicks++) {\n // the chair moves when it is kicked: aim at the leg where it is now, from the side\n const st = room.world.state(id)!\n const leg = toWorld(st.position, st.rotation, [-0.18, 0.2, -0.18])\n const side = rotateVec(st.rotation, [-0.8, 0, 0])\n look(room, [leg[0] + side[0], leg[1] + side[1], leg[2] + side[2]], leg)\n room.use()\n step(1.05)\n }\n step(0.5)\n const after = room.renderer.pieces().length\n expect(after > before, t('sc.kick_detaches_leg_via_tool.check', { kicks, before, after, leg: part(room, id, 'leg_1') ? t('leg.still') : t('leg.gone') }), { kicks, before, after })\n }),\n\n sc('screwdriver_shelf_board', ({ room, step, expect }) => {\n const id = at(room, 'shelf', 0, -4)\n room.setTool('screwdriver')\n look(room, [0, 0.8, -3.5], [0, 0.75, -3.86])\n const t0 = room.log.entries().length ? room.log.entries().slice(-1)[0].t : 0\n room.use(5)\n const done = room.log.entries({ type: 'detach', objectId: id })[0]\n const elapsed = done ? done.t - t0 : 5\n const want = JOINT_DEFAULTS.screw.seconds\n const groups = room.renderer.pieces().length\n expect(!!done && Math.abs(elapsed - want) < 0.6 && groups >= 1, t('sc.screwdriver_shelf_board.check', { secs: num(elapsed, 1), want: num(want, 1), pieces: pc(groups) }), { elapsed, want })\n step(0.2)\n }),\n\n sc('wrong_tool_refused', ({ room, expect }) => {\n const id = at(room, 'steel_sheet', 0, -4)\n room.setTool('screwdriver')\n look(room, [0.2, 1.05, -3.6], [0.34, 1.0, -4])\n room.use(0.5)\n const refused = count(room, 'tool_refused')\n const opened = (room.world.state(id)?.joints ?? []).filter((j) => j.open).length\n expect(refused > 0 && opened === 0, t('sc.wrong_tool_refused.check', { refused, opened }), { refused, opened })\n }),\n\n sc('lighter_burns_crate', ({ room, step, expect }) => {\n const id = at(room, 'wooden_crate', 0, -4)\n room.setTool('lighter')\n look(room, [0, 0.3, -3.65], [0, 0.25, -3.76])\n room.use(5)\n const lit = anyBurning(room, id)\n expect(lit, t('sc.lighter_burns_crate.lit', { lit: yn(lit) }))\n step(500)\n const parts = room.world.state(id)?.parts ?? []\n const ash = parts.filter((p) => p.status === 'ashes').length\n const charred = Math.max(...parts.map((p) => p.char))\n expect(ash === parts.length || (ash > 0 && parts.every((p) => p.status === 'ashes' || p.status === 'broken' || p.char > 0.8)), t('sc.lighter_burns_crate.ash', { ash, total: parts.length, char: num(charred * 100, 0) }), { ash, total: parts.length })\n }),\n\n sc('torch_melts_steel', ({ room, step, expect }) => {\n const drum = at(room, 'steel_drum', 0, -4)\n const crate = at(room, 'wooden_crate', 0.7, -4)\n igniteHit(room, crate, [0.7, 0.25, -3.8], 900, 2)\n let peak = 0\n for (let i = 0; i < 40; i++) {\n step(1)\n peak = Math.max(peak, part(room, drum, 'drum_body')?.temperature ?? 0)\n }\n const melt0 = part(room, drum, 'drum_body')?.melt ?? 0\n expect(melt0 === 0 && peak < 1450, t('sc.torch_melts_steel.wood', { peak: num(peak, 0), melt: num(melt0 * 100, 0), crate: yn(anyBurning(room, crate)) }), { peak })\n room.setTool('cutting_torch')\n look(room, [-0.15, 0.55, -3.55], [-0.15, 0.5, -3.72])\n room.use(20)\n const p = part(room, drum, 'drum_body')\n expect((p?.melt ?? 0) > 0.02 || p?.status === 'melted' || (p?.holes.length ?? 0) > 0, t('sc.torch_melts_steel.torch', { temp: num(p?.temperature ?? 0, 0), melt: num((p?.melt ?? 0) * 100, 0) }), { temperature: p?.temperature, melt: p?.melt })\n }),\n\n sc('bucket_melts_drips', ({ room, step, expect }) => {\n const id = at(room, 'plastic_bucket', 0, -4)\n room.setTool('flamethrower')\n look(room, [0, 0.5, -2.4], [0, 0.15, -4])\n room.use(2.5)\n step(10)\n const p = part(room, id, 'bucket_body')\n const drips = count(room, 'drip', id)\n expect((p?.melt ?? 0) > 0.05 || p?.status === 'melted', t('sc.bucket_melts_drips.check', { melt: num((p?.melt ?? 0) * 100, 0), drips, temp: num(p?.temperature ?? 0, 0) }), { melt: p?.melt, drips })\n }),\n\n sc('gas_bottle_explodes', ({ room, step, expect }) => {\n const bottle = at(room, 'gas_bottle', 0, -4)\n const crate = at(room, 'wooden_crate', 1.3, -4)\n const c0 = room.spawned().find((s) => s.objectId === crate)?.root.position.clone()\n let seconds = 0\n for (; seconds < 60 && count(room, 'explode', bottle) === 0; seconds++) {\n igniteHit(room, bottle, [0, 0.4, -3.9], 1000, 1)\n step(1)\n }\n step(1.5)\n const c1 = room.spawned().find((s) => s.objectId === crate)?.root.position\n const moved = c0 && c1 ? c0.distanceTo(c1) : 0\n const state = room.world.state(crate)\n const lost = (state?.parts ?? []).filter((p) => p.status === 'broken').length + (state && state.groups.length > 1 ? 1 : 0)\n expect(count(room, 'explode', bottle) > 0, t('sc.gas_bottle_explodes.explode', { seconds }), { seconds })\n expect(moved > 0.3 || lost > 0, t('sc.gas_bottle_explodes.push', { moved: num(moved, 1), lost: pc(lost) }), { moved, lost })\n }),\n\n sc('bottle_drop_shatters', ({ room, step, expect }) => {\n const id = at(room, 'glass_bottle', 0, -3, 1.5)\n step(2)\n const p = part(room, id, 'bottle_body')\n const stain = room.fluids.stains().find((s) => s.liquid === 'water')\n expect(p?.status === 'broken', t('sc.bottle_drop_shatters.check', { status: p?.status ?? '?', cracks: p?.cracks.length ?? 0, stain: yn(!!stain) }), { status: p?.status })\n }),\n\n sc('throw_chair_at_wall', ({ room, step, expect }) => {\n const id = at(room, 'chair', 0, -5.2)\n look(room, [0, 1.7, -4.2], [0, 0.35, -5.2])\n room.grab()\n look(room, [0, 1.7, -4.2], [0, 2.3, -11])\n step(0.3)\n room.throwHeld(16)\n step(2.5)\n const hits = room.log.entries({ type: 'impact' })\n const wallDamage = room.log.entries().filter((e) => e.objectId === 'target_wall' && (e.type === 'dent' || e.type === 'damage' || e.type === 'crack' || e.type === 'fracture')).length\n expect(hits.length > 0 && wallDamage > 0, t('sc.throw_chair_at_wall.check', { impacts: hits.length, wall: wallDamage, energy: num(Number(hits[0]?.data?.energyJ ?? 0), 0) }), { id })\n }),\n\n sc('coffee_three_sips', ({ room, step, expect }) => {\n const id = at(room, 'coffee_cup', 0, -3)\n look(room, [0, 1.0, -1.8], [0, 0.05, -3])\n const cid = `${id}_fluid`\n const before = room.fluids.container(cid)?.liters ?? 0\n room.grab()\n for (let i = 0; i < 3; i++) {\n room.useItem('sip')\n step(1.4)\n }\n const after = room.fluids.container(cid)?.liters ?? 0\n const drinks = room.log.entries().filter((e) => e.type === 'fluid.drink')\n const caffeine = drinks.some((e) => Array.isArray(e.data?.effects) && (e.data?.effects as string[]).includes('caffeine'))\n expect(drinks.length === 3 && before - after > 0.06 && caffeine, t('sc.coffee_three_sips.check', { sips: drinks.length, before: num(before, 2), after: num(after, 2), caffeine: yn(caffeine), burn: yn(drinks.some((e) => !!e.data?.burn)) }), { before, after })\n }),\n\n sc('tilt_cup_spills', ({ room, step, expect }) => {\n const id = at(room, 'coffee_cup', 0, -3)\n look(room, [0, 1.0, -1.8], [0, 0.05, -3])\n const cid = `${id}_fluid`\n const before = room.fluids.container(cid)?.liters ?? 0\n room.grab()\n step(0.6)\n room.tilt(2.0)\n step(2.5)\n const after = room.fluids.container(cid)?.liters ?? 0\n const stains = room.fluids.stains().filter((s) => s.liquid === 'coffee').length\n expect(before - after > 0.03 && stains > 0, t('sc.tilt_cup_spills.check', { before: num(before, 2), after: num(after, 2), stains }), { before, after })\n }),\n\n sc('jerrycan_leaks_fuel', ({ room, step, expect }) => {\n const id = at(room, 'jerrycan', 0, -3.5)\n room.setTool('pistol_9mm')\n look(room, [0, 0.4, -1.5], [0, 0.12, -3.43])\n room.use()\n step(1.5)\n const streams = room.fluids.streams().filter((s) => s.cause === 'leak' && s.liquid === 'fuel')\n step(5)\n const stain = room.fluids.stains().find((s) => s.liquid === 'fuel')\n const left = room.fluids.container(`${id}_fluid`)?.liters ?? 20\n const hole = room.log.entries({ type: 'hole', objectId: id })[0]\n expect(streams.length > 0 && !!stain && left < 20, t('sc.jerrycan_leaks_fuel.check', { streams: streams.length, stain: yn(!!stain), left: num(left, 2), leak: hole?.data?.leak ? yn(true) : yn(false) }), { left })\n }),\n\n sc('fuel_stain_burns', ({ room, step, expect }) => {\n const id = at(room, 'jerrycan', 0, -3.5)\n const crate = at(room, 'wooden_crate', 0.9, -3.2)\n room.setTool('pistol_9mm')\n look(room, [0, 0.4, -1.5], [0, 0.12, -3.43])\n room.use()\n step(6)\n const stain = room.fluids.stains().find((s) => s.liquid === 'fuel')\n expect(!!stain, t('sc.fuel_stain_burns.stain', { stain: yn(!!stain) }))\n if (!stain) return\n room.setTool('lighter')\n look(room, [stain.center[0], 0.1, stain.center[2] + 0.06], [stain.center[0], 0, stain.center[2]])\n room.use(1)\n step(4)\n const ignited = count(room, 'stain_ignite')\n const fireHits = (room.world.state(id)?.parts ?? []).some((p) => p.burning || p.temperature > 100) || anyBurning(room, crate)\n expect(ignited > 0, t('sc.fuel_stain_burns.ignite', { ignited, near: yn(fireHits) }), { ignited })\n step(30)\n expect(count(room, 'stain_burned') > 0 || room.fluids.stains().filter((s) => s.liquid === 'fuel' && s.wetness > 0.05).length === 0, t('sc.fuel_stain_burns.out', { burned: count(room, 'stain_burned') }))\n }),\n\n sc('one_column_roof_stands', ({ room, step, expect }) => {\n const id = at(room, 'building_frame', 0, -6)\n killColumns(room, id, ['column_0_0_0'])\n step(40)\n const roof = part(room, id, 'roof')\n const neighbour = (part(room, id, 'column_0_0_1') as unknown as { stress?: number } | null)?.stress ?? 0\n const heavy = Math.max(heavyCollapse(room), ...room.renderer.pieces().map((p) => p.mass))\n expect(!!roof && roof.status !== 'broken' && heavy < 2000, t('sc.one_column_roof_stands.check', { roof: roof ? t('roof.standing') : t('roof.fell'), heavy: num(heavy, 0), stress: num(neighbour * 100, 0) }), { heavy, neighbour })\n }),\n\n sc('two_columns_roof_collapses', ({ room, step, expect }) => {\n const id = at(room, 'building_frame', 0, -6)\n killColumns(room, id, ['column_0_0_0', 'column_0_1_0'])\n const stress0 = (room.world.part(id, 'column_0_0_1') as unknown as { stress?: number } | null)?.stress ?? 0\n step(40)\n const pieces = room.renderer.pieces().filter((p) => p.mass >= 2000)\n const logged = heavyCollapse(room) >= 2000\n const kg = pieces.reduce((m, p) => m + p.mass, 0)\n expect(!part(room, id, 'roof') && pieces.length > 0, t('sc.two_columns_roof_collapses.check', { stress: num(stress0 * 100, 0), pieces: pc(pieces.length), kg: num(kg, 0), logged: yn(logged) }), { kg, logged })\n }),\n\n sc('extinguisher_puts_out_fire', ({ room, step, expect }) => {\n const id = at(room, 'wooden_crate', 0, -4)\n igniteHit(room, id, [0, 0.25, -3.8], 900, 4)\n step(6)\n const before = anyBurning(room, id)\n expect(before, t('sc.extinguisher_puts_out_fire.burning', { burning: yn(before) }))\n room.setTool('extinguisher')\n look(room, [0, 0.9, -2.2], [0, 0.25, -4])\n room.use(2.5)\n step(1)\n const after = anyBurning(room, id)\n expect(!after, t('sc.extinguisher_puts_out_fire.out', { burning: yn(after), events: count(room, 'extinguish', id) }), { events: count(room, 'extinguish', id) })\n }),\n ]\n}\n\nconst makeT =\n (locale: string): T =>\n (key, vars) => {\n let s = resolveStrings(locale).text[key] ?? key\n if (vars) for (const k of Object.keys(vars)) s = s.split(`{${k}}`).join(String(vars[k]))\n return s\n }\n\n/** The built-in scenarios for a locale (`en` or `pt-BR`), standalone: no room needed to list them. */\nexport function scenariosFor(locale = 'en'): TestRoomScenario[] {\n const pt = locale.toLowerCase().startsWith('pt')\n return makeScenarios(makeT(locale), (n, d = 1) => (pt ? (Math.round(n * 10 ** d) / 10 ** d).toFixed(d).replace('.', ',') : (Math.round(n * 10 ** d) / 10 ** d).toFixed(d)), locale)\n}\n\n/** The built-in scenarios in English. The room offers them in its own locale. */\nexport const SCENARIOS: TestRoomScenario[] = scenariosFor('en')\n","import type { WritableLog } from './log'\nimport type { RoomStrings } from './locale'\nimport type { AnimationInfo, LogEntry, ScenarioReport, TestRoomItem, TestRoomScenario } from './types'\n\nexport interface InspectInfo {\n object: string\n objectId: string\n part: string\n material: string\n status: string\n hp: number\n maxHp: number\n temperature: number\n burning: boolean\n char: number\n melt: number\n liters?: number\n dents: number\n holes: number\n cracks: number\n mass: number\n /** Structural load in kg and stress (load / capacity) when the core reports them. */\n load?: number\n stress?: number\n joints: Array<{ id: string; kind: string; tools: string[]; open: boolean; progress: number }>\n note?: string\n distance: number\n}\n\nexport interface HudState {\n toolName: string\n toolId: string\n ammo: string\n slots: string[]\n slot: number\n page: number\n pages: number\n status: string\n progress: { label: string; value: number } | null\n held: { name: string; uses: Array<{ key: string; label: string }>; weapon?: string; using: string } | null\n inspect: InspectInfo | null\n /** Animations of the aimed or held item. */\n animations: AnimationInfo | null\n locked: boolean\n timeScale: number\n fast: boolean\n tap: boolean\n quality: string\n objects: number\n}\n\nexport interface UiOptions {\n container: HTMLElement\n strings: RoomStrings\n t: (key: string, vars?: Record<string, string | number>) => string\n log: WritableLog\n groups: () => Map<string, TestRoomItem[]>\n loadout: () => Array<{ id: string; name: string }>\n onSpawn: (itemId: string) => void\n onEquip: (itemId: string) => void\n onClear: () => void\n onResetAll: () => void\n onSlow: (on: boolean) => void\n onFast: (on: boolean) => void\n onQuality: (q: 'low' | 'medium' | 'high') => void\n quality: 'low' | 'medium' | 'high'\n scenarios: () => TestRoomScenario[]\n onRun: (s: TestRoomScenario) => Promise<ScenarioReport | void>\n onRunAll: () => Promise<ScenarioReport | void>\n onTool: (index: number) => void\n onTap: () => void\n onPlay: (objectId: string, clipId: string) => void\n onResize: () => void\n}\n\nexport interface RoomUi {\n hud(state: HudState): void\n toast(text: string): void\n /** Re-read the catalogue and the scenarios (after `loadModule`). */\n refresh(): void\n togglePanels(): void\n dispose(): void\n}\n\nconst CSS = `\n.tr-root{position:absolute;inset:0;pointer-events:none;font:12px/1.35 system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;color:#e8eaee;overflow:hidden}\n.tr-root *{box-sizing:border-box}\n.tr-root button,.tr-root select,.tr-root label{pointer-events:auto}\n.tr-cross{position:absolute;left:50%;top:50%;width:18px;height:18px;margin:-9px 0 0 -9px}\n.tr-cross:before,.tr-cross:after{content:\"\";position:absolute;background:#fff;opacity:.85;box-shadow:0 0 2px #000}\n.tr-cross:before{left:8px;top:0;width:2px;height:18px}.tr-cross:after{top:8px;left:0;height:2px;width:18px}\n.tr-cross i{position:absolute;left:6px;top:6px;width:6px;height:6px;background:#0b0c0e;border-radius:50%;z-index:1}\n.tr-top{position:absolute;top:8px;left:50%;transform:translateX(-50%);text-align:center;max-width:46vw}\n.tr-tool{display:inline-block;background:rgba(10,12,16,.72);padding:4px 12px;border-radius:6px;font-size:14px;font-weight:600}\n.tr-tool small{font-weight:400;opacity:.8;margin-left:8px}\n.tr-status{margin-top:4px;min-height:16px;color:#ffd23f;text-shadow:0 1px 2px #000}\n.tr-prog{margin:4px auto 0;width:260px;background:rgba(10,12,16,.72);border-radius:6px;padding:4px 8px;display:none}\n.tr-prog b{display:block;font-weight:500;margin-bottom:3px}\n.tr-bar{height:7px;background:#2a2e36;border-radius:4px;overflow:hidden}\n.tr-bar i{display:block;height:100%;background:#4fc3f7;width:0}\n.tr-bar.hp i{background:#66bb6a}.tr-bar.warn i{background:#ffb300}.tr-bar.bad i{background:#ef5350}\n.tr-bottom{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);text-align:center;max-width:56vw}\n.tr-held{margin-bottom:6px;background:rgba(10,12,16,.72);padding:4px 10px;border-radius:6px;display:none}\n.tr-held kbd,.tr-help kbd{background:#2a2e36;border:1px solid #4a505c;border-radius:3px;padding:0 4px;font:inherit;font-weight:700}\n.tr-hotbar{display:inline-flex;gap:3px;flex-wrap:wrap;justify-content:center}\n.tr-slot{pointer-events:auto;min-width:64px;max-width:92px;padding:3px 5px;background:rgba(10,12,16,.68);border:1px solid #3a404c;border-radius:5px;color:#cfd3da;cursor:pointer;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.tr-slot b{color:#ffd23f;margin-right:3px}\n.tr-slot.on{border-color:#ffd23f;color:#fff;background:rgba(60,50,10,.8)}\n.tr-help{position:absolute;left:8px;bottom:8px;max-width:360px;opacity:.75;font-size:11px;background:rgba(10,12,16,.55);padding:4px 8px;border-radius:6px}\n.tr-left{position:absolute;top:8px;left:8px;bottom:70px;width:min(400px,36vw);display:flex;flex-direction:column;gap:8px}\n.tr-right{position:absolute;top:8px;right:8px;bottom:8px;width:min(310px,34vw);display:flex;flex-direction:column;gap:8px}\n.tr-panel{background:rgba(12,14,19,.82);border:1px solid #2c313b;border-radius:8px;padding:8px;pointer-events:auto;overflow:auto}\n.tr-panel h3{margin:0 0 6px;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:#9aa3b2;font-weight:600}\n.tr-insp{flex:0 0 auto;max-height:46%;min-height:60px}\n.tr-insp .r{display:flex;justify-content:space-between;gap:8px}.tr-insp .r span:first-child{color:#9aa3b2}\n.tr-insp .t{font-weight:600;font-size:13px;margin-bottom:3px}\n.tr-log{flex:1 1 auto;display:flex;flex-direction:column;min-height:120px;overflow:hidden}\n.tr-logbar{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:5px;align-items:center}\n.tr-logbody{flex:1;overflow:auto;font:11px/1.4 ui-monospace,SFMono-Regular,Menlo,monospace;background:#090a0d;border-radius:5px;padding:4px 6px}\n.tr-logbody div{white-space:pre-wrap;word-break:break-word;border-bottom:1px solid #15171c}\n.tr-logbody .action{color:#8fd3ff}.tr-logbody .event{color:#dfe3ea}.tr-logbody .check{color:#c8e6c9}.tr-logbody .check.fail{color:#ff8a80;font-weight:700}.tr-logbody .check.pass{color:#9be59f}\n.tr-logbody time{color:#6b7280;margin-right:6px}\n.tr-btn,.tr-root button.tr-btn{background:#232831;border:1px solid #3a404c;color:#e8eaee;border-radius:5px;padding:3px 8px;cursor:pointer;font:inherit}\n.tr-btn:hover{background:#2d3440}.tr-btn.on{background:#3b3a14;border-color:#ffd23f;color:#fff}\n.tr-btn.pass{border-color:#4caf50}.tr-btn.fail{border-color:#ef5350;background:#3a1d1d}\n.tr-tabs{display:flex;flex-wrap:wrap;gap:3px;margin-bottom:6px}\n.tr-items{display:grid;grid-template-columns:1fr 1fr;gap:4px}\n.tr-item{display:flex;gap:2px}.tr-item .tr-btn:first-child{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.tr-cat{flex:0 1 auto;max-height:40%}\n.tr-anim{flex:0 0 auto;max-height:18%}\n.tr-anim .list{display:flex;flex-wrap:wrap;gap:4px}.tr-anim .sub{color:#9aa3b2;margin-bottom:4px}\n.tr-tests{flex:1 1 auto;min-height:100px}\n.tr-tests .list{display:flex;flex-direction:column;gap:3px;margin-top:6px}.tr-tests .list .tr-btn{text-align:left}\n.tr-row{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;align-items:center}\n.tr-toggle{position:absolute;top:8px;right:8px;display:none}\n.tr-summary{margin-top:6px;color:#9aa3b2}\n@media (max-width:980px){.tr-left,.tr-right{display:none}.tr-root.open .tr-left,.tr-root.open .tr-right{display:flex}.tr-toggle{display:block;pointer-events:auto}.tr-root.open .tr-toggle{right:min(310px,34vw)}.tr-left{width:min(400px,46vw)}.tr-help{display:none}}\n`\n\nconst mk = <K extends keyof HTMLElementTagNameMap>(tag: K, cls?: string, text?: string): HTMLElementTagNameMap[K] => {\n const e = document.createElement(tag)\n if (cls) e.className = cls\n if (text !== undefined) e.textContent = text\n return e\n}\n\nexport function createUi(o: UiOptions): RoomUi {\n const { t } = o\n const style = mk('style')\n style.textContent = CSS\n const root = mk('div', 'tr-root')\n const pos = getComputedStyle?.(o.container)?.position\n if (!pos || pos === 'static') o.container.style.position = 'relative'\n root.appendChild(style)\n o.container.appendChild(root)\n\n // crosshair, top bar\n const cross = mk('div', 'tr-cross')\n cross.appendChild(mk('i'))\n const top = mk('div', 'tr-top')\n const toolBox = mk('div', 'tr-tool')\n const status = mk('div', 'tr-status')\n const prog = mk('div', 'tr-prog')\n const progLabel = mk('b')\n const progBar = mk('div', 'tr-bar')\n const progFill = mk('i')\n progBar.appendChild(progFill)\n prog.append(progLabel, progBar)\n top.append(toolBox, status, prog)\n\n // bottom: held hint and hotbar\n const bottom = mk('div', 'tr-bottom')\n const held = mk('div', 'tr-held')\n const hotbar = mk('div', 'tr-hotbar')\n bottom.append(held, hotbar)\n const help = mk('div', 'tr-help')\n help.textContent = t('ui.help')\n\n // left: inspector + log\n const left = mk('div', 'tr-left')\n const insp = mk('div', 'tr-panel tr-insp')\n const logPanel = mk('div', 'tr-panel tr-log')\n left.append(insp, logPanel)\n\n // log panel\n const logTitle = mk('h3', undefined, t('ui.log'))\n const logBar = mk('div', 'tr-logbar')\n const logBody = mk('div', 'tr-logbody')\n const filters: Record<LogEntry['channel'], boolean> = { action: true, event: true, check: true }\n const filterBtns: HTMLButtonElement[] = []\n for (const ch of ['action', 'event', 'check'] as const) {\n const b = mk('button', 'tr-btn on', t(`ui.filter.${ch}`))\n b.type = 'button'\n b.onclick = () => {\n filters[ch] = !filters[ch]\n b.classList.toggle('on', filters[ch])\n rebuildLog()\n }\n filterBtns.push(b)\n logBar.appendChild(b)\n }\n let autoscroll = true\n const asLabel = mk('label')\n const asBox = mk('input')\n asBox.type = 'checkbox'\n asBox.checked = true\n asBox.onchange = () => {\n autoscroll = asBox.checked\n }\n asLabel.append(asBox, document.createTextNode(' ' + t('ui.autoscroll')))\n logBar.appendChild(asLabel)\n const logBtn = (label: string, fn: () => void): void => {\n const b = mk('button', 'tr-btn', label)\n b.type = 'button'\n b.onclick = fn\n logBar.appendChild(b)\n }\n logBtn(t('ui.copy_json'), () => {\n const text = o.log.toJSON()\n // no clipboard API (an Artifact iframe, file://): select the text in a textarea and ask the browser to copy it, leaving it selected\n const select = (): void => {\n const ta = mk('textarea')\n ta.value = text\n ta.setAttribute('readonly', '')\n ta.style.cssText = 'position:fixed;left:8px;bottom:8px;width:min(480px,80vw);height:120px;z-index:99999'\n document.body.appendChild(ta)\n ta.focus()\n ta.select()\n let copied = false\n try {\n copied = !!document.execCommand?.('copy')\n } catch {\n copied = false\n }\n if (copied) ta.remove()\n else ta.onblur = () => ta.remove()\n }\n if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) navigator.clipboard.writeText(text).catch(select)\n else select()\n })\n logBtn(t('ui.download_ndjson'), () => o.log.download('ndjson'))\n logBtn(t('ui.download_txt'), () => o.log.download('txt'))\n logBtn(t('ui.clear_log'), () => {\n o.log.clear()\n logBody.textContent = ''\n nodes.clear()\n })\n logPanel.append(logTitle, logBar, logBody)\n\n const MAX_LINES = 200\n const nodes = new Map<number, HTMLElement>()\n const fmtTime = (s: number): string => `${Math.floor(s / 60)\n .toString()\n .padStart(2, '0')}:${(s % 60).toFixed(1).padStart(4, '0')}`\n const lineClass = (e: LogEntry): string => `${e.channel}${e.type === 'fail' || e.type === 'scenario_fail' ? ' fail' : e.type === 'pass' || e.type === 'scenario_pass' ? ' pass' : ''}`\n const fill = (n: HTMLElement, e: LogEntry): void => {\n n.className = lineClass(e)\n n.textContent = ''\n const tm = mk('time', undefined, fmtTime(e.t))\n n.append(tm, document.createTextNode(e.text))\n }\n const addNode = (e: LogEntry): void => {\n if (!filters[e.channel]) return\n const n = mk('div')\n fill(n, e)\n nodes.set(e.seq, n)\n logBody.appendChild(n)\n while (logBody.childElementCount > MAX_LINES) {\n const first = logBody.firstElementChild as HTMLElement\n for (const [k, v] of nodes) if (v === first) nodes.delete(k)\n first.remove()\n }\n if (autoscroll) logBody.scrollTop = logBody.scrollHeight\n }\n function rebuildLog(): void {\n logBody.textContent = ''\n nodes.clear()\n for (const e of o.log.entries().slice(-MAX_LINES * 3)) addNode(e)\n }\n const offLog = o.log.on((e, updated) => {\n if (updated) {\n const n = nodes.get(e.seq)\n if (n) fill(n, e)\n } else addNode(e)\n })\n\n // right: catalogue and tests\n const right = mk('div', 'tr-right')\n const cat = mk('div', 'tr-panel tr-cat')\n const anim = mk('div', 'tr-panel tr-anim')\n const tests = mk('div', 'tr-panel tr-tests')\n right.append(cat, anim, tests)\n\n cat.appendChild(mk('h3', undefined, t('ui.catalog')))\n const tabs = mk('div', 'tr-tabs')\n const items = mk('div', 'tr-items')\n cat.append(tabs, items)\n let activeGroup = ''\n const renderItems = (): void => {\n items.textContent = ''\n for (const it of o.groups().get(activeGroup) ?? []) {\n const wrap = mk('div', 'tr-item')\n const b = mk('button', 'tr-btn', it.name)\n b.type = 'button'\n b.title = it.note ?? it.name\n b.onclick = () => o.onSpawn(it.id)\n wrap.appendChild(b)\n if (it.weapon) {\n const w = mk('button', 'tr-btn', '⚔')\n w.type = 'button'\n w.title = t('ui.equip')\n w.onclick = () => o.onEquip(it.id)\n wrap.appendChild(w)\n }\n items.appendChild(wrap)\n }\n }\n const renderTabs = (): void => {\n tabs.textContent = ''\n const groupNames = [...o.groups().keys()]\n if (!groupNames.includes(activeGroup)) activeGroup = groupNames[0] ?? ''\n for (const g of groupNames) {\n const b = mk('button', g === activeGroup ? 'tr-btn on' : 'tr-btn', g)\n b.type = 'button'\n b.onclick = () => {\n activeGroup = g\n renderTabs()\n }\n tabs.appendChild(b)\n }\n renderItems()\n }\n renderTabs()\n\n const controls = mk('div', 'tr-row')\n const ctl = (label: string, fn: (b: HTMLButtonElement) => void): HTMLButtonElement => {\n const b = mk('button', 'tr-btn', label)\n b.type = 'button'\n b.onclick = () => fn(b)\n controls.appendChild(b)\n return b\n }\n ctl(t('ui.clear'), () => o.onClear())\n ctl(t('ui.reset_all'), () => o.onResetAll())\n let slow = false\n ctl(t('ui.slow'), (b) => {\n slow = !slow\n b.classList.toggle('on', slow)\n o.onSlow(slow)\n })\n let fast = false\n ctl(t('ui.fast'), (b) => {\n fast = !fast\n b.classList.toggle('on', fast)\n o.onFast(fast)\n })\n const tapBtn = ctl(t('ui.tap'), () => o.onTap())\n const qSel = mk('select')\n for (const q of ['low', 'medium', 'high'] as const) {\n const op = mk('option', undefined, t(`ui.quality.${q}`))\n op.value = q\n qSel.appendChild(op)\n }\n qSel.value = o.quality\n qSel.onchange = () => o.onQuality(qSel.value as 'low' | 'medium' | 'high')\n const qLabel = mk('label', undefined, t('ui.quality') + ' ')\n qLabel.appendChild(qSel)\n controls.appendChild(qLabel)\n const count = mk('span')\n controls.appendChild(count)\n cat.appendChild(controls)\n\n // tests\n tests.appendChild(mk('h3', undefined, t('ui.tests')))\n const runAll = mk('button', 'tr-btn', t('ui.run_all'))\n runAll.type = 'button'\n const summary = mk('div', 'tr-summary')\n const list = mk('div', 'list')\n tests.append(runAll, summary, list)\n const scBtns = new Map<string, HTMLButtonElement>()\n let busy = false\n const mark = (rep: ScenarioReport | void): void => {\n if (!rep) return\n for (const r of rep.results) {\n const b = scBtns.get(r.id)\n if (!b) continue\n b.classList.remove('pass', 'fail')\n b.classList.add(r.ok ? 'pass' : 'fail')\n b.textContent = `${r.ok ? '✓' : '✗'} ${r.name}`\n }\n summary.textContent = t('ui.report', { passed: rep.passed, failed: rep.failed })\n }\n const renderScenarios = (): void => {\n list.textContent = ''\n scBtns.clear()\n for (const s of o.scenarios()) {\n const b = mk('button', 'tr-btn', s.name)\n b.type = 'button'\n b.onclick = async () => {\n if (busy) return\n busy = true\n try {\n mark(await o.onRun(s))\n } finally {\n busy = false\n }\n }\n scBtns.set(s.id, b)\n list.appendChild(b)\n }\n }\n renderScenarios()\n runAll.onclick = async () => {\n if (busy) return\n busy = true\n summary.textContent = t('ui.running')\n try {\n mark(await o.onRunAll())\n } finally {\n busy = false\n }\n }\n\n const toggle = mk('button', 'tr-btn tr-toggle', t('ui.panel'))\n toggle.type = 'button'\n const togglePanels = (): void => {\n root.classList.toggle('open')\n o.onResize()\n }\n toggle.onclick = togglePanels\n\n root.append(cross, top, bottom, help, left, right, toggle)\n\n // inspector\n const bar = (value: number, max: number, cls: string): HTMLElement => {\n const b = mk('div', `tr-bar ${cls}`)\n const i = mk('i')\n i.style.width = `${Math.max(0, Math.min(100, (value / Math.max(1e-9, max)) * 100))}%`\n b.appendChild(i)\n return b\n }\n const row = (k: string, v: string): HTMLElement => {\n const r = mk('div', 'r')\n r.append(mk('span', undefined, k), mk('span', undefined, v))\n return r\n }\n const num = (n: number, d = 1): string => {\n const s = (Math.round(n * 10 ** d) / 10 ** d).toFixed(d)\n return t('locale.decimal') === ',' ? s.replace('.', ',') : s\n }\n const renderInspector = (i: InspectInfo | null): void => {\n insp.textContent = ''\n insp.appendChild(mk('h3', undefined, t('ui.inspector')))\n if (!i) {\n insp.appendChild(mk('div', undefined, t('ui.aim_at_something')))\n return\n }\n insp.appendChild(mk('div', 't', `${i.object} › ${i.part}`))\n insp.appendChild(row(t('ins.material'), i.material))\n insp.appendChild(row(t('ins.status'), i.status + (i.burning ? ` · ${t('ins.burning')}` : '')))\n insp.appendChild(row(t('ins.hp'), `${num(i.hp, 0)} / ${num(i.maxHp, 0)}`))\n const frac = i.hp / Math.max(1e-9, i.maxHp)\n insp.appendChild(bar(i.hp, i.maxHp, frac < 0.25 ? 'bad' : frac < 0.6 ? 'warn' : 'hp'))\n insp.appendChild(row(t('ins.temperature'), `${num(i.temperature, 0)} °C`))\n if (i.char > 0.01) insp.appendChild(row(t('ins.char'), `${num(i.char * 100, 0)} %`))\n if (i.melt > 0.01) insp.appendChild(row(t('ins.melt'), `${num(i.melt * 100, 0)} %`))\n if (i.liters !== undefined) insp.appendChild(row(t('ins.liters'), `${num(i.liters, 2)} l`))\n const cn = (what: string, n: number): string => t(`count.${what}.${n === 1 ? 'one' : 'other'}`, { n })\n insp.appendChild(row(t('ins.damage'), t('ins.damage_counts', { dents: cn('dent', i.dents), holes: cn('hole', i.holes), cracks: cn('crack', i.cracks) })))\n insp.appendChild(row(t('ins.mass'), `${num(i.mass, 1)} kg`))\n if (i.load !== undefined) insp.appendChild(row(t('ins.load'), `${num(i.load, 0)} kg`))\n if (i.stress !== undefined) {\n insp.appendChild(row(t('ins.stress'), `${num(i.stress * 100, 0)} %`))\n insp.appendChild(bar(Math.min(i.stress, 1.2), 1.2, i.stress > 1 ? 'bad' : i.stress > 0.7 ? 'warn' : 'hp'))\n }\n if (i.joints.length) {\n insp.appendChild(mk('div', undefined, t('ins.joints') + ':'))\n for (const j of i.joints) {\n const tools = j.tools.length ? j.tools.join(', ') : t('tool.none')\n insp.appendChild(mk('div', undefined, `• ${j.kind} (${j.id})${j.open ? ` · ${t('ins.open')}` : ` → ${tools}`}`))\n }\n }\n if (i.note) insp.appendChild(mk('div', undefined, i.note))\n }\n\n let lastAnim = ''\n const renderAnimations = (a: AnimationInfo | null): void => {\n anim.textContent = ''\n anim.appendChild(mk('h3', undefined, t('ui.animations')))\n if (!a) {\n anim.appendChild(mk('div', 'sub', t('ui.animations_aim')))\n return\n }\n anim.appendChild(mk('div', 'sub', a.name))\n if (a.clips.length === 0) {\n anim.appendChild(mk('div', 'sub', t('ui.animations_none')))\n return\n }\n const l = mk('div', 'list')\n for (const c of a.clips) {\n const b = mk('button', a.playing === c.id ? 'tr-btn on' : 'tr-btn', `▶ ${t(`anim.${c.id}`) === `anim.${c.id}` ? c.id : t(`anim.${c.id}`)} (${num(c.duration, 1)} s)`)\n b.type = 'button'\n b.onclick = () => o.onPlay(a.objectId, c.id)\n l.appendChild(b)\n }\n anim.appendChild(l)\n }\n renderAnimations(null)\n\n let toastTimer: ReturnType<typeof setTimeout> | null = null\n const slotsEl: HTMLButtonElement[] = []\n let lastSlotsKey = ''\n let lastInspect = ''\n let hudPage = 0\n\n const api: RoomUi = {\n hud(s) {\n toolBox.textContent = ''\n toolBox.append(document.createTextNode(s.toolName))\n if (s.ammo) toolBox.append(mk('small', undefined, s.ammo))\n if (s.status) status.textContent = s.status\n else if (!toastTimer) status.textContent = ''\n if (s.progress) {\n prog.style.display = 'block'\n progLabel.textContent = s.progress.label\n progFill.style.width = `${Math.round(s.progress.value * 100)}%`\n } else prog.style.display = 'none'\n if (s.held) {\n held.style.display = 'block'\n held.textContent = ''\n held.append(document.createTextNode(`${s.held.name} · `))\n const keys: Array<[string, string]> = [\n ['E', t('hud.drop')],\n ['R', t('hud.rotate')],\n ['G', t('hud.throw')],\n ['Z', t('hud.tilt')],\n ...s.held.uses.map((u) => [u.key, u.label] as [string, string]),\n ]\n if (s.held.weapon) keys.push(['H', t('hud.equip', { weapon: s.held.weapon })])\n for (const [k, label] of keys) {\n held.append(mk('kbd', undefined, k), document.createTextNode(` ${label} `))\n }\n } else held.style.display = 'none'\n const key = s.slots.join('|') + s.page\n if (key !== lastSlotsKey) {\n lastSlotsKey = key\n hotbar.textContent = ''\n slotsEl.length = 0\n hudPage = s.page - 1\n s.slots.forEach((name, i) => {\n const b = mk('button', 'tr-slot')\n b.type = 'button'\n b.append(mk('b', undefined, String((i + 1) % 10)), document.createTextNode(name))\n b.title = name\n b.onclick = () => o.onTool(hudPage * 10 + i)\n hotbar.appendChild(b)\n slotsEl.push(b)\n })\n }\n slotsEl.forEach((b, i) => b.classList.toggle('on', i === s.slot))\n tapBtn.classList.toggle('on', s.tap)\n count.textContent = t('ui.objects', { n: s.objects })\n const ak = JSON.stringify(s.animations)\n if (ak !== lastAnim) {\n lastAnim = ak\n renderAnimations(s.animations)\n }\n const ik = JSON.stringify(s.inspect)\n if (ik !== lastInspect) {\n lastInspect = ik\n renderInspector(s.inspect)\n }\n },\n toast(text) {\n status.textContent = text\n if (toastTimer) clearTimeout(toastTimer)\n toastTimer = setTimeout(() => {\n toastTimer = null\n }, 2000)\n },\n refresh() {\n renderTabs()\n renderScenarios()\n },\n togglePanels,\n dispose() {\n offLog()\n if (toastTimer) clearTimeout(toastTimer)\n root.remove()\n },\n }\n rebuildLog()\n return api\n}\n","import type * as THREE_NS from 'three'\nimport { createDestruction, JOINT_DEFAULTS, resolveStrings as resolveDestructionStrings } from '@adatechnology/game-destruction'\nimport type { DestructibleImpl, DestructibleSpec, DestructionEvent, JointState, Quat, RayHit, ToolKind, Vec3 } from '@adatechnology/game-destruction'\nimport { createDestructionRenderer, specFromObject3D } from '@adatechnology/game-destruction-three'\nimport type { Piece } from '@adatechnology/game-destruction-three'\nimport { createArsenal, DEFAULT_LOADOUT } from '@adatechnology/game-weapons'\nimport type { Shot, Use, WeaponState } from '@adatechnology/game-weapons'\nimport { createFluids, createItemUse, ITEM_USES, resolveStrings as resolveFluidStrings } from '@adatechnology/game-fluids'\nimport type { FluidEvent, ItemUsePlayer, StainState } from '@adatechnology/game-fluids'\nimport { createFluidRenderer } from '@adatechnology/game-fluids-three'\nimport type { FluidRenderer } from '@adatechnology/game-fluids-three'\nimport { checkAnimation, checkDestructible, checkSpec } from '@adatechnology/game-contracts'\nimport type { AnimationClipSpec, TestableModule } from '@adatechnology/game-contracts'\nimport { createArena } from './arena'\nimport type { Arena } from './arena'\nimport { buildFromSpec } from './build-from-spec'\nimport { DEMO_MATERIALS, demoItems } from './items'\nimport { createLog } from './log'\nimport { createNarrator } from './narrate'\nimport { createPlayer } from './player'\nimport { makeScenarios } from './scenarios'\nimport { resolveStrings } from './locale'\nimport { createUi } from './ui'\nimport type { HudState, InspectInfo, RoomUi } from './ui'\nimport type {\n AnimationInfo,\n ModuleReport,\n ScenarioContext,\n ScenarioReport,\n SpawnedObject,\n TestRoom,\n TestRoomItem,\n TestRoomOptions,\n TestRoomScenario,\n} from './types'\n\ntype Vars = Record<string, string | number>\n\ninterface Entry {\n so: SpawnedObject\n item?: TestRoomItem\n name: string\n arena: boolean\n containerId?: string\n fluidPart?: string\n fluidOffset: Vec3\n uses: string[]\n piece: Piece | null\n last: Vec3\n velocity: Vec3\n}\n\ninterface Projectile {\n mesh: THREE_NS.Object3D\n pos: THREE_NS.Vector3\n vel: THREE_NS.Vector3\n weapon: string\n fuse: number\n burstOnImpact: boolean\n energy: number\n radius: number\n fire?: { temperature: number; radius: number; seconds: number }\n age: number\n}\n\ninterface FireZone {\n point: Vec3\n radius: number\n temperature: number\n remaining: number\n acc: number\n}\n\ninterface BurningStain {\n center: Vec3\n remaining: number\n acc: number\n}\n\nconst FIXED_DT = 1 / 60\n\nconst v3 = (v: THREE_NS.Vector3): Vec3 => [v.x, v.y, v.z]\nconst dist3 = (a: Vec3, b: Vec3): number => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2])\n\n/**\n * Create the test room. See `TestRoomOptions`. The room owns a renderer, scene and camera unless you pass them; with your own renderer you call\n * `room.update(dt)` every frame and render yourself.\n */\nexport function createTestRoom(options: TestRoomOptions): TestRoom {\n const THREE = options.THREE\n const locale = options.locale ?? 'en'\n const S = resolveStrings(locale)\n const dStrings = resolveDestructionStrings(locale)\n const fStrings = resolveFluidStrings(locale)\n const t = (key: string, vars?: Vars): string => {\n let s = S.text[key] ?? key\n if (vars) for (const k of Object.keys(vars)) s = s.split(`{${k}}`).join(String(vars[k]))\n return s\n }\n const num = (n: number, digits = 1): string => {\n const s = (Math.round(n * 10 ** digits) / 10 ** digits).toFixed(digits)\n return locale.toLowerCase().startsWith('pt') ? s.replace('.', ',') : s\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Renderer, scene, camera\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const ownRenderer = !options.renderer\n const gl: THREE_NS.WebGLRenderer = options.renderer ?? new THREE.WebGLRenderer({ antialias: true })\n const container = options.container\n const width = (): number => container.clientWidth || 960\n const height = (): number => container.clientHeight || 600\n if (ownRenderer) {\n const r = gl as THREE_NS.WebGLRenderer\n r.setPixelRatio(Math.min(typeof devicePixelRatio === 'number' ? devicePixelRatio : 1, 2))\n r.shadowMap.enabled = true\n r.shadowMap.type = THREE.PCFSoftShadowMap\n r.toneMapping = THREE.ACESFilmicToneMapping\n r.toneMappingExposure = 1\n r.outputColorSpace = THREE.SRGBColorSpace\n container.appendChild(r.domElement)\n }\n gl.setSize(width(), height())\n const dom = gl.domElement\n if (dom && !dom.hasAttribute?.('tabindex')) dom.setAttribute?.('tabindex', '0')\n const scene = options.scene ?? new THREE.Scene()\n const camera = options.camera ?? new THREE.PerspectiveCamera(72, width() / height(), 0.05, 140)\n if (!options.camera) scene.add(camera)\n const resize = (): void => {\n const w = width()\n const h = height()\n gl.setSize(w, h)\n camera.aspect = w / h\n camera.updateProjectionMatrix()\n }\n const onResize = (): void => resize()\n window.addEventListener('resize', onResize)\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Worlds\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const arenaSize = options.arenaSize ?? 14\n const arena: Arena = createArena(THREE, arenaSize, scene)\n scene.add(arena.group)\n\n const ownWorld = !options.world\n const world = options.world ?? createDestruction({ seed: 1, ...options.worldOptions, materials: [...DEMO_MATERIALS, ...(options.worldOptions?.materials ?? [])] })\n const pristineWorld = ownWorld ? world.serialize() : null\n const tableOk = (): boolean => {\n const p = world.part(arena.table.id, arena.table.topPart)\n return !!p && p.status !== 'broken' && p.status !== 'melted' && p.status !== 'ashes'\n }\n const groundAt = (x: number, z: number): number =>\n x > arena.table.minX && x < arena.table.maxX && z > arena.table.minZ && z < arena.table.maxZ && tableOk() ? arena.table.top : 0\n\n const ownFluids = !options.fluids\n const fluids = options.fluids ?? createFluids({ seed: 1, locale, liquids: options.liquids, groundAt })\n const pristineFluids = ownFluids ? fluids.serialize() : null\n for (const s of [...arena.surfaces, ...(options.surfaces ?? [])]) fluids.addSurface(s)\n const itemUseDefs = [...ITEM_USES, ...(options.itemUses ?? [])]\n\n const quality = options.quality ?? 'medium'\n const pointScale = height() / (2 * Math.tan((camera.fov * Math.PI) / 360))\n const rendererPieces = new Map<string, Piece>()\n const entries = new Map<string, Entry>()\n const splitOf = new Map<string, Entry>()\n let simTime = 0\n const log = createLog({ exportCancelled: () => t('log.export_cancelled') })\n log.setClock(() => simTime)\n\n const renderer = createDestructionRenderer(THREE, {\n scene,\n world,\n quality,\n groundAt,\n pointScale,\n onSound: options.onSound,\n onPiece: (piece) => {\n rendererPieces.set(piece.objectId, piece)\n loose.push(piece)\n // find the entry it came from: the one whose spec holds all its parts and that is nearest\n const st = world.state(piece.objectId)\n if (!st) return\n let best: Entry | null = null\n let bestD = Infinity\n for (const e of entries.values()) {\n const spec = specs.get(e.so.objectId)\n if (!spec) continue\n const ids = new Set(spec.parts.map((p) => p.id))\n if (!st.parts.every((p) => ids.has(p.id))) continue\n const d = e.so.root.position.distanceTo(piece.root.position)\n if (d < bestD) {\n bestD = d\n best = e\n }\n }\n if (best) splitOf.set(piece.objectId, best)\n },\n })\n const fluidView: FluidRenderer = createFluidRenderer(THREE, { scene, fluids, quality, pointScale })\n const specs = new Map<string, DestructibleSpec>()\n const loose: Piece[] = []\n\n const arsenal = options.arsenal ?? createArsenal({ locale, weapons: options.weapons, seed: 1 })\n const loadout = (options.loadout ?? DEFAULT_LOADOUT).filter((id) => arsenal.weapons.has(id))\n const tools = new Map<string, WeaponState>()\n let toolIndex = Math.max(0, loadout.indexOf('hand'))\n let toolId = loadout[toolIndex] ?? 'hand'\n const toolState = (id: string): WeaponState => {\n let s = tools.get(id)\n if (!s) {\n s = arsenal.create(id, { seed: 7, reserve: 999 })\n s.refill()\n tools.set(id, s)\n }\n return s\n }\n let tool = toolState(toolId)\n\n const catalogMap = new Map<string, TestRoomItem>()\n for (const i of demoItems(locale)) catalogMap.set(i.id, i)\n for (const i of options.catalog) catalogMap.set(i.id, i)\n const catalog = [...options.catalog]\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Names and narration\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const entryOf = (objectId: string): Entry | undefined => entries.get(objectId) ?? splitOf.get(objectId)\n const nameOf = (objectId: string): string => {\n const e = entries.get(objectId)\n if (e) return e.name\n const s = splitOf.get(objectId)\n return s ? `${s.name} (${t('piece')})` : objectId\n }\n const narrator = createNarrator({\n world,\n fluids,\n log,\n now: () => simTime,\n t,\n num,\n nameOf,\n itemIdOf: (id) => entryOf(id)?.so.itemId,\n materialName: (id) => S.text[`material.${id}`] ?? dStrings.materialNames[id] ?? id,\n liquidName: (id) => fStrings.liquids[id] ?? id,\n jointKind: (k) => dStrings.jointKinds[k as keyof typeof dStrings.jointKinds] ?? k,\n toolName: (k) => dStrings.toolKinds[k as keyof typeof dStrings.toolKinds] ?? k,\n locatePart: (objectId, partId) => {\n const own = world.part(objectId, partId)\n if (own) return { objectId, part: own }\n for (const [id, owner] of splitOf) {\n if (owner.so.objectId !== objectId) continue\n const p = world.part(id, partId)\n if (p) return { objectId: id, part: p }\n }\n return null\n },\n containerName: (cid) => {\n for (const e of entries.values()) if (e.containerId === cid) return { name: e.name, objectId: e.so.objectId, itemId: e.so.itemId }\n return undefined\n },\n })\n\n let pending: DestructionEvent[] = []\n const eventListeners = new Set<(d: unknown) => void>()\n const listeners: Record<string, Set<(d: unknown) => void>> = { spawn: new Set(), tool: new Set(), grab: new Set(), throw: new Set(), event: eventListeners }\n const fire = (type: string, data: unknown): void => {\n for (const fn of listeners[type] ?? []) fn(data)\n }\n world.on('*', (ev) => {\n pending.push(ev)\n })\n fluids.on('*', (ev: FluidEvent) => {\n narrator.fluid(ev)\n fire('event', ev)\n })\n\n const action = (type: string, text: string, extra: Partial<{ objectId: string; itemId: string; part: string; data: Record<string, unknown>; material: string }> = {}): void => {\n log.add({ channel: 'action', type, text, ...extra })\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Flush: events of the frame -> log, fluids glue, fire glue\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const tmpV = new THREE.Vector3()\n const tmpV2 = new THREE.Vector3()\n const tmpQ = new THREE.Quaternion()\n const tmpM = new THREE.Matrix4()\n\n const hostOf = (e: Entry): { objectId: string; root: THREE_NS.Object3D } => {\n if (e.fluidPart && !e.arena && !world.part(e.so.objectId, e.fluidPart)) {\n for (const [id, owner] of splitOf) {\n if (owner === e && world.part(id, e.fluidPart)) {\n const p = rendererPieces.get(id)\n if (p) return { objectId: id, root: p.root }\n }\n }\n }\n return { objectId: e.so.objectId, root: e.so.root }\n }\n\n const puncture = (ev: Extract<DestructionEvent, { type: 'leak' }>): void => {\n const e = entryOf(ev.object)\n if (!e?.containerId || e.fluidPart !== ev.part) return\n const host = hostOf(e)\n host.root.updateMatrixWorld(true)\n tmpM.copy(host.root.matrixWorld).invert()\n const local = tmpV.set(ev.point[0], ev.point[1], ev.point[2]).applyMatrix4(tmpM)\n local.x -= e.fluidOffset[0]\n local.y -= e.fluidOffset[1]\n local.z -= e.fluidOffset[2]\n host.root.getWorldQuaternion(tmpQ).invert()\n const n = tmpV2.set(ev.direction[0], ev.direction[1], ev.direction[2]).applyQuaternion(tmpQ)\n const part = world.part(host.objectId, ev.part)\n const hole = part?.holes[part.holes.length - 1]\n fluids.puncture(e.containerId, [local.x, local.y, local.z], [n.x, n.y, n.z], hole?.diameter ?? 0.009)\n }\n\n const flush = (): void => {\n if (pending.length === 0) return\n const batch = pending\n pending = []\n narrator.events(batch)\n for (const ev of batch) {\n if (ev.type === 'leak') puncture(ev)\n else if (ev.type === 'ignite') igniteNear(ev.point, 0.9)\n fire('event', ev)\n options.onEvent?.(ev)\n }\n }\n log.setBeforeRead(flush)\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Player\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let useHeld = false\n let useFirst = false\n const player = createPlayer(THREE, {\n camera,\n dom,\n colliders: arena.colliders,\n limit: arenaSize,\n start: arena.playerStart,\n hooks: {\n primaryDown: () => {\n useHeld = true\n useFirst = true\n },\n primaryUp: () => {\n useHeld = false\n tool.release()\n },\n secondary: () => {\n if (heldEntry) throwHeld()\n else grab()\n },\n key: (code, down, e) => onKey(code, down, e),\n wheel: (dir) => cycleTool(dir),\n },\n })\n player.look(arena.playerStart, [0, 1.5, arena.wallZ])\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Spawning\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let counter = 0\n let slot = 0\n const maxCarry = options.maxCarryKg ?? 60\n\n const massOfObject = (id: string): number => {\n const st = world.state(id)\n let m = 0\n for (const p of st?.parts ?? []) if (p.status !== 'broken' && p.status !== 'melted' && p.status !== 'ashes') m += p.mass\n return m\n }\n\n const registerEntry = (\n objectId: string,\n itemId: string,\n root: THREE_NS.Object3D,\n spec: DestructibleSpec,\n name: string,\n parts: Record<string, THREE_NS.Object3D | THREE_NS.Object3D[]> | undefined,\n item: TestRoomItem | undefined,\n arenaObject: boolean,\n movable: boolean,\n ): Entry => {\n specs.set(objectId, spec)\n renderer.bind(objectId, root, parts ? { parts } : undefined)\n const so: SpawnedObject = { objectId, itemId, root, movable }\n const e: Entry = { so, item, name, arena: arenaObject, fluidOffset: [0, 0, 0], uses: [], piece: null, last: [root.position.x, root.position.y, root.position.z], velocity: [0, 0, 0] }\n entries.set(objectId, e)\n if (movable) {\n e.piece = renderer.makePiece(objectId, { mass: Math.max(0.2, massOfObject(objectId)) })\n rendererPieces.set(objectId, e.piece)\n }\n const f = item?.fluid\n if (f) {\n e.fluidPart = f.part\n e.fluidOffset = f.offset ?? [0, 0, 0]\n e.uses = f.uses ?? ['drink', 'sip', 'pour']\n root.updateMatrixWorld(true)\n const q = root.getWorldQuaternion(tmpQ)\n const p = tmpV.set(e.fluidOffset[0], e.fluidOffset[1], e.fluidOffset[2]).applyMatrix4(root.matrixWorld)\n e.containerId = fluids.addContainer(f.container, { id: `${objectId}_fluid`, position: [p.x, p.y, p.z], rotation: [q.x, q.y, q.z, q.w] })\n fluidView.bindContainer(e.containerId, root, { innerOffset: e.fluidOffset })\n }\n return e\n }\n\n const resolveSpec = (item: TestRoomItem, root: THREE_NS.Object3D): { spec: DestructibleSpec; parts?: Record<string, THREE_NS.Object3D[]> } => {\n if (typeof item.spec === 'function') return { spec: structuredCloneSpec(item.spec(root)) }\n if (item.spec) return { spec: structuredCloneSpec(item.spec) }\n const r = specFromObject3D(THREE, root, { name: item.id, ...item.specOptions })\n return { spec: r.spec, parts: r.parts }\n }\n\n const addArena = (): void => {\n for (const o of arena.objects) {\n const root = buildFromSpec(THREE, o.spec, { colors: o.colors })\n root.position.set(o.position[0], o.position[1], o.position[2])\n scene.add(root)\n root.updateMatrixWorld(true)\n world.add(structuredCloneSpec(o.spec), { id: o.id, position: o.position })\n registerEntry(o.id, o.id, root, o.spec, S.text[`arena.${o.id}`] ?? o.id, undefined, undefined, true, false)\n }\n }\n addArena()\n\n const spawn = (itemId: string, position?: Vec3, rotationY?: number): SpawnedObject => {\n const item = catalogMap.get(itemId)\n if (!item) throw new Error(`game-test-room: unknown item \"${itemId}\"`)\n const root = item.build(THREE)\n let pos: Vec3\n if (position) pos = [position[0], position[1], position[2]]\n else {\n const fx = -Math.sin(player.yaw)\n const fz = -Math.cos(player.yaw)\n const rx = Math.cos(player.yaw)\n const rz = -Math.sin(player.yaw)\n const side = ((slot++ % 5) - 2) * 0.55\n const x = camera.position.x + fx * 2.4 + rx * side\n const z = camera.position.z + fz * 2.4 + rz * side\n const lim = arenaSize - 1\n pos = [Math.max(-lim, Math.min(lim, x)), groundAt(x, z), Math.max(-lim, Math.min(lim, z))]\n }\n root.position.set(pos[0], pos[1], pos[2])\n root.rotation.y = rotationY ?? player.yaw\n root.name = item.id\n scene.add(root)\n root.updateMatrixWorld(true)\n const objectId = `${item.id}_${++counter}`\n let own: DestructibleImpl | undefined\n let resolved: { spec: DestructibleSpec; parts?: Record<string, THREE_NS.Object3D[]> }\n if (item.impl) {\n own = item.impl(root, objectId)\n if (own.id !== objectId) throw new Error(`game-test-room: item \"${item.id}\": DestructibleImpl.id is \"${own.id}\", the room gave it \"${objectId}\" (use the id passed to impl)`)\n resolved = { spec: structuredCloneSpec(own.describe()) }\n } else resolved = resolveSpec(item, root)\n const { spec, parts } = resolved\n root.updateMatrixWorld(true)\n const mass = spec.parts.reduce((m, p) => m + (p.mass ?? 0), 0)\n const heavy = (mass || massGuess(spec)) > maxCarry\n const movable = own ? false : (item.movable ?? !heavy)\n if (movable) {\n // things that can fall rest on the floor or the table by the bottom of their bounding box (or hang at the height asked for): no drop on spawn\n const box = new THREE.Box3().setFromObject(root)\n const base = Math.max(pos[1], groundAt(pos[0], pos[2]))\n pos = [pos[0], pos[1] + (base - box.min.y), pos[2]]\n root.position.set(pos[0], pos[1], pos[2])\n root.updateMatrixWorld(true)\n }\n const q = root.getWorldQuaternion(tmpQ)\n if (own) world.register(own, { id: objectId, position: pos, rotation: [q.x, q.y, q.z, q.w] })\n else world.add(spec, { id: objectId, position: pos, rotation: [q.x, q.y, q.z, q.w] })\n const e = registerEntry(objectId, item.id, root, spec, item.name, parts, item, false, movable)\n action('spawn', t('act.spawn', { name: item.name, x: num(pos[0], 1), z: num(pos[2], 1) }), { objectId, itemId: item.id, data: { position: pos, movable, massKg: Math.round(massOfObject(objectId) * 10) / 10 } })\n fire('spawn', e.so)\n return e.so\n }\n const massGuess = (spec: DestructibleSpec): number => {\n let m = 0\n for (const p of spec.parts) {\n const s = p.shape\n const vol = s.kind === 'box' ? s.size[0] * s.size[1] * s.size[2] : s.kind === 'cylinder' ? Math.PI * s.radius * s.radius * s.height : (4 / 3) * Math.PI * s.radius ** 3\n m += p.mass ?? vol * (world.materials.get(p.material)?.density ?? 500) * (p.fill ?? 1)\n }\n return m\n }\n\n const removeEntry = (id: string): void => {\n const e = entries.get(id)\n if (!e) return\n if (heldEntry === e) releaseHeld()\n for (let i = playing.length - 1; i >= 0; i--) if (playing[i].entry === e) playing.splice(i, 1)\n if (e.containerId) {\n fluidView.unbindContainer(e.containerId)\n fluids.removeContainer(e.containerId)\n }\n try {\n renderer.unbind(id)\n } catch {\n // not bound\n }\n if (world.has(id)) world.remove(id)\n e.so.root.removeFromParent()\n entries.delete(id)\n rendererPieces.delete(id)\n specs.delete(id)\n }\n\n const clearLoose = (): void => {\n for (const [id, owner] of [...splitOf]) {\n void owner\n const p = rendererPieces.get(id)\n try {\n renderer.unbind(id)\n } catch {\n // gone already\n }\n if (world.has(id)) world.remove(id)\n p?.root.removeFromParent()\n rendererPieces.delete(id)\n splitOf.delete(id)\n }\n loose.length = 0\n }\n\n const clearEverything = (): void => {\n if (heldEntry || heldPiece) releaseHeld()\n useItemPlayer = null\n playing.length = 0\n projectiles.length = 0\n clearProjectileMeshes()\n fireZones.length = 0\n burningStains.length = 0\n for (const id of [...entries.keys()]) if (!entries.get(id)?.arena) removeEntry(id)\n clearLoose()\n for (const e of entries.values()) {\n world.reset(e.so.objectId)\n renderer.restore(e.so.objectId)\n }\n renderer.clear()\n fluids.clearStains([0, 0, 0], 1e4)\n fluidView.clear()\n fluids.setTap(TAP_ID, false)\n }\n\n const clear = (): void => {\n clearEverything()\n pending = []\n action('clear', t('act.clear'))\n }\n\n const resetAll = (): void => {\n for (const e of entries.values()) {\n if (heldEntry === e) continue\n world.reset(e.so.objectId)\n renderer.restore(e.so.objectId)\n if (e.containerId) {\n const c = fluids.container(e.containerId)\n const f = e.item?.fluid?.container\n if (c && f && f.liquid) fluids.fill(e.containerId, f.liquid, Math.max(0, (f.liters ?? 0) - c.liters), f.temperature)\n }\n }\n action('reset', t('act.reset'))\n }\n\n /** Reset the worlds to their seeded start: used by scenarios so that each one is deterministic. */\n const hardReset = (): void => {\n clearEverything()\n for (const id of [...entries.keys()]) removeEntry(id)\n tools.clear()\n tool = toolState(toolId)\n if (pristineWorld) {\n for (const id of world.ids()) world.remove(id)\n world.load(pristineWorld)\n }\n if (pristineFluids) {\n fluids.load(pristineFluids)\n for (const s of [...arena.surfaces, ...(options.surfaces ?? [])]) fluids.addSurface(s)\n }\n pending = []\n rng = 12345\n counter = 0\n slot = 0\n prevVy.clear()\n lastImpact.clear()\n addArena()\n timeScale = 1\n fastForward = false\n walkPlan = null\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Aiming\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const aimO: Vec3 = [0, 0, 0]\n const aimD: Vec3 = [0, 0, -1]\n const aim = (): void => {\n camera.updateMatrixWorld(true)\n camera.getWorldPosition(tmpV)\n camera.getWorldDirection(tmpV2)\n aimO[0] = tmpV.x\n aimO[1] = tmpV.y\n aimO[2] = tmpV.z\n aimD[0] = tmpV2.x\n aimD[1] = tmpV2.y\n aimD[2] = tmpV2.z\n }\n\n const FAR: Quat = [0, 0, 0, 1]\n /** Run `fn` with the held object moved away, so that rays and bullets do not hit what the player carries. */\n const withoutHeld = <T,>(fn: () => T): T => {\n const e = heldEntry\n if (!e || !world.has(e.so.objectId)) return fn()\n const p = e.so.root.position\n const q = e.so.root.quaternion\n world.setTransform(e.so.objectId, [0, -5000, 0], FAR)\n try {\n return fn()\n } finally {\n world.setTransform(e.so.objectId, [p.x, p.y, p.z], [q.x, q.y, q.z, q.w])\n }\n }\n\n const rayWorld = (o: Vec3, d: Vec3, max: number): RayHit | null => withoutHeld(() => world.raycast(o, d, max))\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Particles helpers and a tiny seeded rng for visuals\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let rng = 12345\n const rnd = (): number => {\n rng = (rng * 1664525 + 1013904223) >>> 0\n return rng / 4294967296\n }\n\n const muzzle = (): Vec3 => {\n aim()\n const e = camera.matrixWorld.elements\n // right = x axis, up = y axis of the camera\n return [\n aimO[0] + aimD[0] * 0.45 + e[0] * 0.16 - e[4] * 0.1,\n aimO[1] + aimD[1] * 0.45 + e[1] * 0.16 - e[5] * 0.1,\n aimO[2] + aimD[2] * 0.45 + e[2] * 0.16 - e[6] * 0.1,\n ]\n }\n\n // tracers\n const tracers: Array<{ line: THREE_NS.Line; life: number }> = []\n const tracerMat = new THREE.LineBasicMaterial({ color: 0xffe9a8, transparent: true, opacity: 0.9 })\n const tracer = (a: Vec3, b: Vec3): void => {\n let tr = tracers.find((x) => x.life <= 0)\n if (!tr) {\n if (tracers.length >= 12) return\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(6, 3))\n const line = new THREE.Line(g, tracerMat)\n line.frustumCulled = false\n scene.add(line)\n tr = { line, life: 0 }\n tracers.push(tr)\n }\n const attr = tr.line.geometry.getAttribute('position') as THREE_NS.BufferAttribute\n attr.setXYZ(0, a[0], a[1], a[2])\n attr.setXYZ(1, b[0], b[1], b[2])\n attr.needsUpdate = true\n tr.line.visible = true\n tr.life = 0.07\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Fire glue: stains of flammable liquids, fire zones (molotov), dry water near fire\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const fireZones: FireZone[] = []\n const burningStains: BurningStain[] = []\n const stainRadius = (s: StainState): number => {\n let sum = 0\n for (const r of s.front) sum += r\n return s.front.length ? sum / s.front.length : 0.1\n }\n const stainBurning = (s: StainState): boolean => burningStains.some((b) => dist3(b.center, s.center) < 0.05)\n\n function igniteNear(point: Vec3, reach: number): void {\n let lit = false\n let water = false\n for (const s of fluids.stains()) {\n if (s.wetness < 0.05) continue\n if (Math.hypot(s.center[0] - point[0], s.center[2] - point[2]) > reach + stainRadius(s) || Math.abs(s.center[1] - point[1]) > 1.5) continue\n if (fluids.liquids.get(s.liquid)?.flammable) {\n if (stainBurning(s)) continue\n const seconds = Math.max(3, Math.min(20, 4 + s.liters * 30 + stainRadius(s) * 6))\n burningStains.push({ center: [s.center[0], s.center[1], s.center[2]], remaining: seconds, acc: 0 })\n lit = true\n log.add({\n channel: 'event',\n type: 'stain_ignite',\n text: t('ev.stain_ignite', { liquid: fStrings.liquids[s.liquid] ?? s.liquid, x: num(s.center[0], 1), z: num(s.center[2], 1), seconds: num(seconds, 0) }),\n data: { stain: s.id, liquid: s.liquid, seconds },\n })\n } else water = true\n }\n if (water && !lit) {\n fluids.clearStains(point, Math.max(0.5, reach))\n log.coalesce('dry', { channel: 'event', type: 'stain_dried_by_fire', text: t('ev.fire_dries'), data: { point } }, 2)\n }\n }\n\n const hitFireAround = (point: Vec3, radius: number, temperature: number, duration: number): void => {\n for (const id of world.ids()) world.hit(id, { type: 'fire', point, temperature, radius, duration, source: 'fire' })\n }\n\n const updateFires = (dt: number): void => {\n for (let i = fireZones.length - 1; i >= 0; i--) {\n const z = fireZones[i]\n z.remaining -= dt\n z.acc += dt\n if (z.acc >= 0.1) {\n hitFireAround(z.point, z.radius, z.temperature, z.acc)\n igniteNear(z.point, z.radius)\n z.acc = 0\n }\n const a = rnd() * Math.PI * 2\n const r = Math.sqrt(rnd()) * z.radius\n renderer.emit('fire', [z.point[0] + Math.cos(a) * r, z.point[1] + 0.05, z.point[2] + Math.sin(a) * r], [0, 1, 0], 2, 1.5)\n if (z.remaining <= 0) fireZones.splice(i, 1)\n }\n if (burningStains.length) {\n const stains = fluids.stains()\n for (let i = burningStains.length - 1; i >= 0; i--) {\n const b = burningStains[i]\n b.remaining -= dt\n b.acc += dt\n const st = stains.find((s) => dist3(s.center, b.center) < 0.05)\n const r = st ? stainRadius(st) : 0.3\n if (b.acc >= 0.1) {\n hitFireAround([b.center[0], b.center[1] + 0.1, b.center[2]], r + 0.2, 800, b.acc)\n b.acc = 0\n }\n const a = rnd() * Math.PI * 2\n const rr = Math.sqrt(rnd()) * r\n renderer.emit('fire', [b.center[0] + Math.cos(a) * rr, b.center[1] + 0.05, b.center[2] + Math.sin(a) * rr], [0, 1, 0], 3, 1.8)\n if (rnd() < 0.2) renderer.emit('smoke', [b.center[0], b.center[1] + 0.3, b.center[2]], [0, 1, 0], 1, 1)\n if (b.remaining <= 0 || !st) {\n fluids.clearStains(b.center, r + 0.1)\n log.add({ channel: 'event', type: 'stain_burned', text: t('ev.stain_burned'), data: { point: b.center } })\n burningStains.splice(i, 1)\n }\n }\n }\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Tools\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let progress: { label: string; value: number; at: number } | null = null\n let statusLine = ''\n let statusAt = 0\n const say = (msg: string): void => {\n statusLine = msg\n statusAt = simTime\n ui?.toast(msg)\n }\n\n const toolName = (id = toolId): string => arsenal.name(id)\n const hitWhere = (r: RayHit): string => {\n const p = world.part(r.object, r.part)\n return `${nameOf(r.object)} › ${r.part}${p ? ` (${dStrings.materialNames[p.material] ?? p.material})` : ''}`\n }\n\n const pushPiece = (objectId: string, dir: Vec3, momentum: number, point: Vec3): void => {\n if (!rendererPieces.has(objectId)) return\n renderer.impulse(objectId, [dir[0] * momentum, dir[1] * momentum, dir[2] * momentum], point)\n }\n\n const fireShots = (shots: Shot[], recoil: [number, number]): void => {\n if (shots.length === 0) return\n const w = toolName()\n const m = muzzle()\n renderer.emit('flash', m, [aimD[0], aimD[1], aimD[2]], 1, 0)\n renderer.emit('sparks', m, [aimD[0], aimD[1], aimD[2]], 4, 6)\n let hits = 0\n let first: RayHit | null = null\n let energy = 0\n withoutHeld(() => {\n for (const s of shots) {\n energy = Math.max(energy, s.energy)\n const results = world.shoot(s.origin, s.direction, s.energy, s.caliber, 'player')\n const r0 = results.find((r) => r.part && r.point)\n let end: Vec3 = [s.origin[0] + s.direction[0] * 40, s.origin[1] + s.direction[1] * 40, s.origin[2] + s.direction[2] * 40]\n if (r0?.point && r0.part) {\n hits++\n end = r0.point\n if (!first) first = { object: r0.object, part: r0.part, point: r0.point, normal: [0, 1, 0], distance: dist3(s.origin, r0.point) }\n const speed = Math.max(80, s.speed)\n pushPiece(r0.object, s.direction, (2 * s.energy) / speed, r0.point)\n }\n if (shots.length <= 3 || rnd() < 0.34) tracer(m, end)\n }\n })\n player.kick(recoil[0], recoil[1])\n const f = first as RayHit | null\n const d = f ? num(f.distance, 1) : ''\n let text: string\n if (shots.length === 1) text = t(f ? 'act.shoot.hit' : 'act.shoot.miss', { weapon: w, energy: num(energy, 0), where: f ? hitWhere(f) : '', dist: d })\n else text = t('act.shoot.pellets', { weapon: w, n: shots.length, energy: num(energy, 0), hits, where: f ? hitWhere(f) : '', dist: d })\n action('shoot', text, {\n objectId: f?.object,\n itemId: f ? entryOf(f.object)?.so.itemId : undefined,\n part: f?.part,\n data: { weapon: toolId, shots: shots.length, hits, energyJ: Math.round(energy), caliberMm: shots[0].caliber, distanceM: f ? Math.round(f.distance * 100) / 100 : null },\n })\n }\n\n const fireRays = (u: { origin: Vec3; direction: Vec3; range: number; cone: boolean; radius: number }): Array<Vec3> => {\n const d = new THREE.Vector3(u.direction[0], u.direction[1], u.direction[2]).normalize()\n const out: Vec3[] = [[d.x, d.y, d.z]]\n if (u.cone) {\n const a = Math.min(0.2, Math.atan2(u.radius, Math.max(0.1, u.range)))\n const right = new THREE.Vector3().crossVectors(d, new THREE.Vector3(0, 1, 0))\n if (right.lengthSq() < 1e-6) right.set(1, 0, 0)\n right.normalize()\n const up = new THREE.Vector3().crossVectors(right, d).normalize()\n for (const [x, y] of [\n [1, 0],\n [-1, 0],\n [0, 1],\n [0, -1],\n ]) {\n const r = d.clone().addScaledVector(right, x * a).addScaledVector(up, y * a).normalize()\n out.push([r.x, r.y, r.z])\n }\n }\n return out\n }\n\n const heatRays = (u: Extract<Use, { kind: 'flame' | 'heat' }>, type: 'fire' | 'heat'): void => {\n const w = toolName()\n const cone = u.kind === 'flame' ? u.cone : false\n const rays = fireRays({ origin: u.origin, direction: u.direction, range: u.range, cone, radius: u.radius })\n let target: RayHit | null = null\n const m = muzzle()\n withoutHeld(() => {\n for (const d of rays) {\n const r = world.raycast(u.origin, d, u.range)\n if (!r) continue\n if (!target) target = r\n world.hit(r.object, { type, point: r.point, direction: d, temperature: u.temperature, radius: Math.min(u.radius, 0.3), duration: u.duration, source: 'player' })\n if (type === 'fire') igniteNear(r.point, 0.25)\n else renderer.emit('sparks', r.point, r.normal, 2, 4)\n }\n })\n if (type === 'fire') {\n renderer.emit('fire', m, [u.direction[0], u.direction[1], u.direction[2]], cone ? 5 : 1, Math.max(0.6, u.range * 1.1))\n if (cone) renderer.emit('smoke', m, [u.direction[0], u.direction[1] + 0.3, u.direction[2]], 1, u.range * 0.5)\n // nothing hit: the stain on the ground in front may still catch\n if (!target && u.direction[1] < -0.2) {\n const t0 = (0.05 - u.origin[1]) / u.direction[1]\n if (t0 > 0 && t0 < u.range) igniteNear([u.origin[0] + u.direction[0] * t0, 0.05, u.origin[2] + u.direction[2] * t0], 0.3)\n }\n }\n const tg = target as RayHit | null\n log.coalesce(\n `use:${toolId}`,\n {\n channel: 'action',\n type,\n text: tg ? t(type === 'fire' ? 'act.flame.hit' : 'act.heat.hit', { weapon: w, where: hitWhere(tg), temp: num(u.temperature, 0) }) : t(type === 'fire' ? 'act.flame.air' : 'act.heat.air', { weapon: w }),\n objectId: tg?.object,\n part: tg?.part,\n data: { weapon: toolId, temperatureC: u.temperature },\n },\n 1,\n )\n }\n\n const meleeUse = (u: Extract<Use, { kind: 'melee' }>, id = toolId): void => {\n const w = toolName(id)\n const r = rayWorld(u.origin, u.direction, u.reach)\n if (!r) {\n action('melee', t('act.melee.miss', { weapon: w }), { data: { weapon: id } })\n return\n }\n world.hitPart(r.object, r.part, { type: u.damage, point: r.point, direction: u.direction, energy: u.energy, radius: u.radius, source: 'player' })\n pushPiece(r.object, u.direction, (2 * u.energy) / 6, r.point)\n action('melee', t('act.melee.hit', { weapon: w, energy: num(u.energy, 0), where: hitWhere(r), dist: num(r.distance, 1) }), {\n objectId: r.object,\n itemId: entryOf(r.object)?.so.itemId,\n part: r.part,\n data: { weapon: id, damage: u.damage, energyJ: u.energy, distanceM: Math.round(r.distance * 100) / 100 },\n })\n }\n\n const toolWork = (u: Extract<Use, { kind: 'tool' }>, dt: number): void => {\n const w = toolName()\n const r = rayWorld(u.origin, u.direction, u.reach)\n if (!r) {\n progress = null\n log.coalesce(`use:${toolId}`, { channel: 'action', type: 'tool', text: t('act.tool.none', { weapon: w }), data: { weapon: toolId } }, 1)\n return\n }\n const j: JointState | null = world.nearestJoint(r.object, r.point, 0.45, u.tool as ToolKind)\n if (!j) {\n progress = null\n log.coalesce(`use:${toolId}`, { channel: 'action', type: 'tool', text: t('act.tool.nojoint', { weapon: w, where: hitWhere(r) }), objectId: r.object, part: r.part }, 1)\n return\n }\n const tool_ = u.tool as ToolKind\n const p = world.disassemble(r.object, j.id, tool_, dt)\n const kind = dStrings.jointKinds[j.kind] ?? j.kind\n if (p < 0) {\n const need = JOINT_DEFAULTS[j.kind].tools.map((k) => dStrings.toolKinds[k] ?? k).join(', ') || t('tool.none')\n progress = { label: t('hud.refused', { kind }), value: 0, at: simTime }\n log.coalesce(\n `refuse:${r.object}:${j.id}:${toolId}`,\n {\n channel: 'action',\n type: 'tool_refused',\n text: t('act.tool.refused', { weapon: w, kind, obj: nameOf(r.object), need }),\n objectId: r.object,\n itemId: entryOf(r.object)?.so.itemId,\n data: { weapon: toolId, joint: j.id, kind: j.kind, needs: JOINT_DEFAULTS[j.kind].tools },\n },\n 2,\n )\n return\n }\n progress = { label: `${kind} (${j.id})`, value: p, at: simTime }\n renderer.emit('sparks', r.point, r.normal, 1, 2)\n }\n\n const extinguishUse = (u: Extract<Use, { kind: 'extinguish' }>): void => {\n const w = toolName()\n const rays = fireRays({ origin: u.origin, direction: u.direction, range: u.range, cone: true, radius: 0.6 })\n const m = muzzle()\n renderer.emit('foam', m, [u.direction[0], u.direction[1], u.direction[2]], 8, u.range * 1.2)\n const hit = new Set<string>()\n withoutHeld(() => {\n for (const d of rays) {\n const r = world.raycast(u.origin, d, u.range)\n if (!r) continue\n hit.add(r.object)\n world.extinguish(r.object, undefined, u.coolC * Math.max(u.duration, 0.05) * 6)\n fluids.clearStains(r.point, 0.5)\n for (let i = burningStains.length - 1; i >= 0; i--) if (Math.hypot(burningStains[i].center[0] - r.point[0], burningStains[i].center[2] - r.point[2]) < 1.2) burningStains.splice(i, 1)\n for (let i = fireZones.length - 1; i >= 0; i--) if (Math.hypot(fireZones[i].point[0] - r.point[0], fireZones[i].point[2] - r.point[2]) < 1.5) fireZones.splice(i, 1)\n }\n })\n log.coalesce(\n `use:${toolId}`,\n { channel: 'action', type: 'extinguish', text: hit.size ? t('act.extinguish.hit', { weapon: w, what: [...hit].map(nameOf).join(', ') }) : t('act.extinguish.air', { weapon: w }), data: { objects: [...hit] } },\n 1,\n )\n }\n\n // ----- projectiles (grenades and molotovs)\n const projectiles: Projectile[] = []\n const projMeshes: THREE_NS.Object3D[] = []\n const clearProjectileMeshes = (): void => {\n for (const m of projMeshes) m.removeFromParent()\n projMeshes.length = 0\n }\n const throwUse = (u: Extract<Use, { kind: 'throw' }>): void => {\n const w = toolName()\n const molotov = !!u.fire\n const mesh = new THREE.Mesh(\n molotov ? new THREE.CylinderGeometry(0.035, 0.04, 0.2, 8) : new THREE.SphereGeometry(0.045, 8, 6),\n new THREE.MeshStandardMaterial({ color: molotov ? 0x3b7a3b : 0x4b5320, roughness: 0.6, metalness: molotov ? 0 : 0.4 }),\n )\n mesh.castShadow = true\n mesh.position.set(u.origin[0], u.origin[1], u.origin[2])\n scene.add(mesh)\n projMeshes.push(mesh)\n projectiles.push({\n mesh,\n pos: new THREE.Vector3(u.origin[0], u.origin[1], u.origin[2]),\n vel: new THREE.Vector3(u.velocity[0], u.velocity[1], u.velocity[2]),\n weapon: toolId,\n fuse: u.fuse,\n burstOnImpact: molotov && u.fuse <= 0,\n energy: u.energy,\n radius: u.radius,\n fire: u.fire,\n age: 0,\n })\n action('throw_projectile', t(molotov ? 'act.throw.molotov' : 'act.throw.grenade', { weapon: w, fuse: num(u.fuse, 1) }), { data: { weapon: toolId, fuse: u.fuse } })\n }\n\n const detonate = (p: Projectile, at: Vec3, impact: boolean): void => {\n const w = toolName(p.weapon)\n const results = world.explode(at, p.energy, p.radius, 'player')\n action('explode', t('act.explode', { weapon: w, energy: num(p.energy, 0), radius: num(p.radius, 1), n: results.length }), { data: { weapon: p.weapon, energyJ: p.energy, radius: p.radius, point: at } })\n if (p.fire) {\n fluids.splash('fuel', [at[0], Math.max(at[1], groundAt(at[0], at[2])), at[2]], 0.5)\n fireZones.push({ point: [at[0], Math.max(0.02, groundAt(at[0], at[2])), at[2]], radius: p.fire.radius, temperature: p.fire.temperature, remaining: p.fire.seconds, acc: 0 })\n renderer.emit('fire', at, [0, 1, 0], 24, 3)\n action('molotov_fire', t('act.molotov_fire', { weapon: w, seconds: num(p.fire.seconds, 0), radius: num(p.fire.radius, 1) }), { data: { weapon: p.weapon, impact } })\n }\n }\n\n const updateProjectiles = (dt: number): void => {\n for (let i = projectiles.length - 1; i >= 0; i--) {\n const p = projectiles[i]\n p.age += dt\n p.vel.y -= 9.81 * dt\n const speed = p.vel.length()\n const step = speed * dt\n let burst = false\n if (step > 1e-6) {\n const d: Vec3 = [p.vel.x / speed, p.vel.y / speed, p.vel.z / speed]\n const r = withoutHeld(() => world.raycast(v3(p.pos), d, step + 0.05))\n if (r && r.distance <= step + 0.04) {\n p.pos.set(r.point[0] - d[0] * 0.03, r.point[1] - d[1] * 0.03, r.point[2] - d[2] * 0.03)\n if (p.burstOnImpact) burst = true\n else {\n const n = r.normal\n const vn = p.vel.x * n[0] + p.vel.y * n[1] + p.vel.z * n[2]\n p.vel.x = (p.vel.x - 2 * vn * n[0]) * 0.35\n p.vel.y = (p.vel.y - 2 * vn * n[1]) * 0.35\n p.vel.z = (p.vel.z - 2 * vn * n[2]) * 0.35\n }\n } else p.pos.addScaledVector(p.vel, dt)\n }\n const g = groundAt(p.pos.x, p.pos.z) + 0.045\n if (p.pos.y < g) {\n p.pos.y = g\n if (p.burstOnImpact) burst = true\n else {\n p.vel.y = Math.abs(p.vel.y) * 0.35\n p.vel.x *= 0.7\n p.vel.z *= 0.7\n }\n }\n p.mesh.position.copy(p.pos)\n p.mesh.rotation.x += dt * 8\n p.fuse -= dt\n if (burst || (!p.burstOnImpact && p.fuse <= 0) || p.age > 30) {\n detonate(p, v3(p.pos), burst)\n p.mesh.removeFromParent()\n projMeshes.splice(projMeshes.indexOf(p.mesh), 1)\n projectiles.splice(i, 1)\n }\n }\n }\n\n // ----- the trigger\n const useTool = (dt: number, held: boolean): void => {\n aim()\n const cat = tool.def.category\n if (cat === 'hand') return\n const res = tool.trigger([aimO[0], aimO[1], aimO[2]], [aimD[0], aimD[1], aimD[2]], dt, held, 'player')\n if (res.status === 'empty') {\n if (!tool.reloading && tool.reserve > 0) tool.reload()\n say(t(tool.reloading ? 'hud.reloading' : 'hud.empty'))\n return\n }\n if (res.status !== 'ok') {\n if (res.status === 'reloading') say(t('hud.reloading'))\n else if (res.status === 'no_fuel') say(t('hud.no_fuel'))\n return\n }\n if (res.shots.length) fireShots(res.shots, res.recoil)\n for (const u of res.uses) {\n switch (u.kind) {\n case 'melee':\n meleeUse(u)\n break\n case 'flame':\n heatRays(u, 'fire')\n break\n case 'heat':\n heatRays(u, 'heat')\n break\n case 'throw':\n throwUse(u)\n break\n case 'tool':\n toolWork(u, dt)\n break\n case 'extinguish':\n extinguishUse(u)\n break\n default:\n break\n }\n }\n }\n\n /** The V shortcut: a kick with the `kick` tool, whatever tool is selected (it keeps its own cooldown). */\n const kick = (): void => {\n if (!arsenal.weapons.has('kick')) return\n aim()\n const res = toolState('kick').trigger([aimO[0], aimO[1], aimO[2]], [aimD[0], aimD[1], aimD[2]], 0, false, 'player')\n if (res.status !== 'ok') return\n for (const u of res.uses) if (u.kind === 'melee') meleeUse(u, 'kick')\n }\n const setTool = (id: string): void => {\n if (!arsenal.weapons.has(id)) throw new Error(`game-test-room: unknown weapon \"${id}\"`)\n tool.release()\n toolId = id\n const i = loadout.indexOf(id)\n if (i >= 0) toolIndex = i\n tool = toolState(id)\n progress = null\n action('tool', t('act.tool', { weapon: toolName(id) }), { data: { weapon: id } })\n fire('tool', id)\n }\n const cycleTool = (dir: 1 | -1): void => {\n if (!loadout.length) return\n toolIndex = (toolIndex + dir + loadout.length) % loadout.length\n setTool(loadout[toolIndex])\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Grabbing, carrying, throwing\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let heldEntry: Entry | null = null\n let heldPiece: Piece | null = null\n let heldName = ''\n let heldYaw = 0\n let heldTilt = 0\n let tiltKey = 0\n const heldLocal = new THREE.Vector3()\n const heldVel: Vec3 = [0, 0, 0]\n let useItemPlayer: ItemUsePlayer | null = null\n let useItemName = ''\n\n const releaseHeld = (): void => {\n if (heldPiece) {\n heldPiece.held = false\n heldPiece.sleeping = false\n heldPiece.velocity = [heldVel[0], heldVel[1], heldVel[2]]\n }\n useItemPlayer?.cancel()\n useItemPlayer = null\n heldEntry = null\n heldPiece = null\n heldTilt = 0\n }\n\n const grab = (): boolean => {\n if (heldPiece) {\n const name = heldName\n releaseHeld()\n action('drop', t('act.drop', { name }))\n fire('grab', { held: false })\n return true\n }\n aim()\n const r = rayWorld([aimO[0], aimO[1], aimO[2]], [aimD[0], aimD[1], aimD[2]], 3.2)\n if (!r) {\n say(t('hud.nothing_to_grab'))\n return false\n }\n const piece = rendererPieces.get(r.object)\n if (!piece) {\n say(t('hud.cannot_grab', { name: nameOf(r.object) }))\n return false\n }\n const kg = piece.mass\n if (kg > maxCarry) {\n say(t('hud.too_heavy', { name: nameOf(r.object), kg: num(kg, 0) }))\n return false\n }\n heldPiece = piece\n heldEntry = entries.get(r.object) ?? null\n heldName = nameOf(r.object)\n piece.held = true\n piece.sleeping = false\n // centre of the object's bounding box in its own space, to hold it by its middle\n const box = new THREE.Box3().setFromObject(piece.root)\n const c = box.getCenter(new THREE.Vector3())\n piece.root.updateMatrixWorld(true)\n heldLocal.copy(c).sub(piece.root.position)\n heldLocal.applyQuaternion(piece.root.quaternion.clone().invert())\n heldYaw = 0\n heldTilt = 0\n heldVel[0] = heldVel[1] = heldVel[2] = 0\n action('grab', t('act.grab', { name: heldName, kg: num(kg, 1) }), { objectId: r.object, itemId: entryOf(r.object)?.so.itemId, data: { massKg: Math.round(kg * 10) / 10 } })\n fire('grab', { held: true, objectId: r.object })\n return true\n }\n\n const throwHeld = (speed = 9): boolean => {\n if (!heldPiece) return false\n const piece = heldPiece\n const name = heldName\n const id = piece.objectId\n aim()\n releaseHeld()\n piece.velocity = [0, 0, 0]\n renderer.impulse(id, [aimD[0] * speed * piece.mass, (aimD[1] * speed + 1.2) * piece.mass, aimD[2] * speed * piece.mass])\n action('throw', t('act.throw', { name, speed: num(speed, 1) }), { objectId: id, itemId: entryOf(id)?.so.itemId, data: { speedMs: speed, massKg: piece.mass } })\n fire('throw', { objectId: id, speed })\n return true\n }\n\n const followHeld = (dt: number): void => {\n const piece = heldPiece\n if (!piece) return\n camera.updateMatrixWorld(true)\n const root = piece.root\n let pos: THREE_NS.Vector3\n const targetQ = tmpQ\n if (useItemPlayer) {\n // the hand frame follows the camera's yaw only, so looking down at the item does not tilt it\n const pose = useItemPlayer.pose()\n const handQ = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), player.yaw)\n pos = tmpV.set(pose.position[0], pose.position[1], pose.position[2]).applyQuaternion(handQ).add(camera.position)\n const eq = new THREE.Quaternion().setFromEuler(new THREE.Euler(pose.rotation[0], pose.rotation[1], pose.rotation[2], 'XYZ'))\n targetQ.copy(handQ).multiply(eq)\n targetQ.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), heldYaw))\n } else {\n pos = tmpV.set(0.05, -0.28, -1.15).applyMatrix4(camera.matrixWorld)\n targetQ.setFromAxisAngle(new THREE.Vector3(0, 1, 0), player.yaw + heldYaw)\n targetQ.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -heldTilt))\n }\n const k = Math.min(1, (useItemPlayer ? 30 : 16) * dt)\n const px = root.position.x\n const py = root.position.y\n const pz = root.position.z\n root.quaternion.slerp(targetQ, Math.min(1, k * 0.9))\n // the middle of the carried object follows the target; the offset uses the current rotation so it does not orbit\n const off2 = tmpV2.copy(heldLocal).applyQuaternion(root.quaternion)\n root.position.set(root.position.x + (pos.x - off2.x - root.position.x) * k, root.position.y + (pos.y - off2.y - root.position.y) * k, root.position.z + (pos.z - off2.z - root.position.z) * k)\n if (dt > 0) {\n heldVel[0] = (root.position.x - px) / dt\n heldVel[1] = (root.position.y - py) / dt\n heldVel[2] = (root.position.z - pz) / dt\n }\n root.updateMatrixWorld(true)\n }\n\n const useItem = (useId: string): boolean => {\n const e = heldEntry\n if (!e?.containerId) return false\n const def = itemUseDefs.find((u) => u.id === useId)\n if (!def) return false\n const c = fluids.container(e.containerId)\n if (!c) return false\n if (def.liquids && def.liquids.length > 0 && (!c.liquid || !def.liquids.includes(c.liquid))) return false\n if ((useId === 'drink' || useId === 'sip' || useId === 'chug' || useId === 'pour' || useId === 'pour_out') && c.liters <= 1e-6) {\n say(t('hud.empty_container', { name: e.name }))\n return false\n }\n if (useItemPlayer && !useItemPlayer.done) return false\n useItemPlayer = createItemUse(fluids, e.containerId, def)\n useItemName = def.id\n action('use_item', t('act.use_item', { name: e.name, use: S.text[`use.${def.id}`] ?? def.id }), { objectId: e.so.objectId, itemId: e.so.itemId, data: { use: def.id } })\n return true\n }\n\n const updateItemUse = (dt: number): void => {\n if (!useItemPlayer) return\n useItemPlayer.update(dt)\n if (useItemPlayer.done) {\n useItemPlayer = null\n useItemName = ''\n }\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Tap\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const TAP_ID = 'room_tap'\n const TAP_RATE = 0.25\n fluids.addTap({ id: TAP_ID, position: arena.tapSpout, liquid: 'water', rate: TAP_RATE, temperature: 16, on: false })\n const isTapOn = (): boolean => fluids.taps().some((x) => x.id === TAP_ID && x.on)\n const toggleTap = (on = !isTapOn()): boolean => {\n fluids.setTap(TAP_ID, on)\n action('tap', t(on ? 'act.tap.on' : 'act.tap.off'))\n return on\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Thrown and falling pieces: damage to what they hit\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const lastImpact = new Map<string, number>()\n /** Landings slower than this (m/s) are not logged (the renderer only treats 3 m/s and up as a hard landing; nothing below 1.5 m/s is ever worth a line). */\n const MIN_LANDING_LOG = 3\n const updateImpacts = (): void => {\n const check = (piece: Piece): void => {\n if (piece.held || piece.sleeping) return\n const v = piece.velocity\n const speed = Math.hypot(v[0], v[1], v[2])\n if (speed < 3.5) return\n if ((lastImpact.get(piece.objectId) ?? -9) > simTime - 0.25) return\n const dir: Vec3 = [v[0] / speed, v[1] / speed, v[2] / speed]\n const c = tmpV.copy(new THREE.Vector3(0, 0, 0))\n void c\n const box = tmpBox.setFromObject(piece.root)\n const centre = box.getCenter(tmpV)\n const size = box.getSize(tmpV2)\n const reach = Math.max(size.x, size.y, size.z) * 0.5\n const origin: Vec3 = [centre.x + dir[0] * (reach + 0.02), centre.y + dir[1] * (reach + 0.02), centre.z + dir[2] * (reach + 0.02)]\n const r = withoutHeld(() => world.raycast(origin, dir, speed * FIXED_DT * 2 + 0.06))\n if (!r || r.object === piece.objectId) return\n const energy = 0.5 * piece.mass * speed * speed\n lastImpact.set(piece.objectId, simTime)\n world.hitPart(r.object, r.part, { type: 'blunt', point: r.point, direction: dir, energy, radius: 0.08, source: 'thrown' })\n if (world.has(piece.objectId)) world.hit(piece.objectId, { type: 'blunt', point: r.point, direction: [-dir[0], -dir[1], -dir[2]], energy: energy * 0.4, radius: 0.08, source: 'thrown' })\n pushPiece(r.object, dir, piece.mass * speed * 0.5, r.point)\n piece.velocity = [-v[0] * 0.25, Math.abs(v[1]) * 0.3 + 0.5, -v[2] * 0.25]\n action('impact', t('act.impact', { name: nameOf(piece.objectId), where: hitWhere(r), energy: num(energy, 0), speed: num(speed, 1) }), {\n objectId: piece.objectId,\n itemId: entryOf(piece.objectId)?.so.itemId,\n data: { energyJ: Math.round(energy), speedMs: Math.round(speed * 10) / 10, target: r.object, targetPart: r.part },\n })\n }\n const land = (piece: Piece): void => {\n const vy = piece.velocity[1]\n const prev = prevVy.get(piece.objectId) ?? 0\n prevVy.set(piece.objectId, vy)\n // the renderer applies the landing damage itself (source 'fall'); here we only describe it in the log\n if (piece.held || prev > -MIN_LANDING_LOG || vy < prev + 2 || !world.has(piece.objectId)) return\n const energy = 0.5 * piece.mass * prev * prev\n action('landing', t('act.landing', { name: nameOf(piece.objectId), speed: num(-prev, 1), energy: num(energy, energy < 100 ? 1 : 0) }), {\n objectId: piece.objectId,\n itemId: entryOf(piece.objectId)?.so.itemId,\n data: { energyJ: Math.round(energy * 10) / 10, speedMs: Math.round(-prev * 10) / 10 },\n })\n }\n for (const e of entries.values()) if (e.piece) { check(e.piece); land(e.piece) }\n for (const p of loose) { check(p); land(p) }\n }\n const prevVy = new Map<string, number>()\n const tmpBox = new THREE.Box3()\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Keys\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const onKey = (code: string, down: boolean, e: KeyboardEvent): void => {\n if (!down) {\n if (code === 'KeyZ') tiltKey = 0\n return\n }\n const digit = /^Digit(\\d)$/.exec(code)\n if (digit && !e.ctrlKey && !e.metaKey) {\n const n = (Number(digit[1]) + 9) % 10\n const page = Math.floor(toolIndex / 10)\n const idx = page * 10 + n\n if (idx < loadout.length) setTool(loadout[idx])\n return\n }\n switch (code) {\n case 'KeyE':\n grab()\n break\n case 'KeyG':\n throwHeld()\n break\n case 'KeyR':\n if (heldPiece) heldYaw += Math.PI / 8\n else {\n tool.reload()\n say(t('hud.reloading'))\n }\n break\n case 'KeyQ':\n tool.cycleMode()\n break\n case 'KeyZ':\n tiltKey = 1\n break\n case 'KeyF':\n if (heldEntry?.uses[0]) useItem(heldEntry.uses[0])\n break\n case 'KeyC':\n if (heldEntry?.uses[1]) useItem(heldEntry.uses[1])\n break\n case 'KeyV':\n if (heldEntry?.uses[2]) useItem(heldEntry.uses[2])\n else kick()\n break\n case 'KeyT':\n toggleTap()\n break\n case 'KeyH': {\n const w = (heldEntry ?? entryOf(inspectTarget()?.object ?? ''))?.item?.weapon\n if (w) equip(w)\n break\n }\n case 'BracketRight':\n toolIndex = Math.min(loadout.length - 1, (Math.floor(toolIndex / 10) + 1) * 10)\n setTool(loadout[toolIndex])\n break\n case 'BracketLeft':\n toolIndex = Math.max(0, (Math.floor(toolIndex / 10) - 1) * 10)\n setTool(loadout[toolIndex])\n break\n case 'Tab':\n ui?.togglePanels()\n break\n default:\n break\n }\n }\n\n const equip = (weaponId: string): void => {\n if (!arsenal.weapons.has(weaponId)) return\n if (!loadout.includes(weaponId)) loadout.push(weaponId)\n setTool(weaponId)\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Inspector\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const inspectTarget = (): RayHit | null => {\n aim()\n return rayWorld(aimO, aimD, 14)\n }\n\n const inspectInfo = (): InspectInfo | null => {\n const r = inspectTarget()\n if (!r) return null\n const st = world.state(r.object)\n const p = world.part(r.object, r.part)\n if (!st || !p) return null\n const e = entryOf(r.object)\n const joints = st.joints\n .filter((j) => j.a === r.part || j.b === r.part)\n .map((j) => ({\n id: j.id,\n kind: dStrings.jointKinds[j.kind] ?? j.kind,\n tools: JOINT_DEFAULTS[j.kind].tools.map((k) => dStrings.toolKinds[k] ?? k),\n open: j.open,\n progress: j.progress,\n }))\n const ext = p as unknown as { load?: number; stress?: number }\n return {\n object: nameOf(r.object),\n objectId: r.object,\n part: r.part,\n material: S.text[`material.${p.material}`] ?? dStrings.materialNames[p.material] ?? p.material,\n status: dStrings.partStatus[p.status] ?? p.status,\n hp: p.hp,\n maxHp: p.maxHp,\n temperature: p.temperature,\n burning: p.burning,\n char: p.char,\n melt: p.melt,\n liters: p.liters,\n dents: p.dents.length,\n holes: p.holes.length,\n cracks: p.cracks.length,\n mass: p.mass,\n load: ext.load,\n stress: ext.stress,\n joints,\n note: e?.item?.note,\n distance: r.distance,\n }\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Frame\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let timeScale = 1\n let fastForward = false\n let hudAcc = 1\n let qualityName: 'low' | 'medium' | 'high' = quality\n\n const syncContainers = (sdt: number): void => {\n for (const e of entries.values()) {\n if (!e.containerId) continue\n const host = hostOf(e)\n host.root.updateMatrixWorld(true)\n const q = host.root.getWorldQuaternion(tmpQ)\n const p = tmpV.set(e.fluidOffset[0], e.fluidOffset[1], e.fluidOffset[2]).applyMatrix4(host.root.matrixWorld)\n const vel: Vec3 | undefined = sdt > 0 ? [(p.x - e.last[0]) / sdt, (p.y - e.last[1]) / sdt, (p.z - e.last[2]) / sdt] : undefined\n e.last = [p.x, p.y, p.z]\n fluids.setTransform(e.containerId, [p.x, p.y, p.z], [q.x, q.y, q.z, q.w], vel)\n }\n }\n\n const syncLiters = (): void => {\n for (const e of entries.values()) {\n if (!e.containerId || !e.fluidPart) continue\n const c = fluids.container(e.containerId)\n if (!c) continue\n const host = hostOf(e)\n const part = world.part(host.objectId, e.fluidPart)\n if (part && part.liters !== undefined && Math.abs(part.liters - c.liters) > 1e-4) world.setLiters(host.objectId, e.fluidPart, c.liters)\n }\n }\n\n let paused = false\n let walkPlan: { x: number; z: number; remaining: number } | null = null\n const stepWalk = (dt: number): void => {\n if (!walkPlan) return\n const f = walkPlan.remaining <= dt ? 1 : dt / walkPlan.remaining\n player.moveBy((walkPlan.x - camera.position.x) * f, (walkPlan.z - camera.position.z) * f)\n walkPlan.remaining -= dt\n if (walkPlan.remaining <= 1e-9) walkPlan = null\n }\n\n const stepSim = (dt: number): void => {\n if (paused) return\n // `dt` is simulated seconds; real time only drives input\n simTime += dt\n stepWalk(dt)\n const reps = fastForward ? 10 : 1\n updateAnimations(dt)\n updateItemUse(dt)\n updateProjectiles(dt)\n syncContainers(dt)\n for (let i = 0; i < reps; i++) {\n world.update(dt)\n if (i === 0) updateFires(dt)\n fluids.update(dt)\n }\n syncLiters()\n renderer.update(dt)\n updateImpacts()\n fluidView.update(dt)\n for (const s of tools.values()) s.update(dt)\n for (const tr of tracers) {\n if (tr.life > 0) {\n tr.life -= dt\n if (tr.life <= 0) tr.line.visible = false\n }\n }\n flush()\n }\n\n const update = (dt: number): void => {\n player.update(dt)\n if (tiltKey || heldTilt > 0) {\n heldTilt = Math.max(0, Math.min(2.4, heldTilt + (tiltKey ? 2.2 : -3) * dt))\n }\n if (useHeld && !paused) {\n if (tool.def.category === 'hand') {\n if (useFirst) grab()\n } else useTool(dt, !useFirst)\n useFirst = false\n }\n if (!paused) followHeld(dt)\n stepSim(dt * timeScale)\n if (progress && simTime - progress.at > 0.25) progress = null\n hudAcc += dt\n if (hudAcc >= 0.1 && ui) {\n hudAcc = 0\n ui.hud(hudState())\n }\n }\n\n const hudState = (): HudState => {\n const page = Math.floor(toolIndex / 10)\n const slots = loadout.slice(page * 10, page * 10 + 10).map((id) => arsenal.name(id))\n const ammo = tool.def.action.kind === 'firearm' ? `${tool.ammo}/${tool.capacity}${tool.reserve ? ` · ${tool.reserve}` : ''}` : tool.def.action.kind === 'hand' ? '' : tool.def.action.kind === 'melee' || tool.def.action.kind === 'tool' ? '' : `${num(tool.ammo, 0)}`\n return {\n toolName: toolName(),\n toolId,\n ammo,\n slots,\n slot: toolIndex - page * 10,\n page: page + 1,\n pages: Math.max(1, Math.ceil(loadout.length / 10)),\n status: simTime - statusAt < 2 ? statusLine : '',\n progress: progress ? { label: progress.label, value: progress.value } : null,\n held: heldEntry || heldPiece ? { name: heldName, uses: (heldEntry?.uses ?? []).map((u, i) => ({ key: ['F', 'C', 'V'][i] ?? '', label: S.text[`use.${u}`] ?? u })), weapon: heldEntry?.item?.weapon ? arsenal.name(heldEntry.item.weapon) : undefined, using: useItemName } : null,\n inspect: inspectInfo(),\n animations: animationsOf(),\n locked: player.locked,\n timeScale,\n fast: fastForward,\n tap: isTapOn(),\n quality: qualityName,\n objects: [...entries.values()].filter((e) => !e.arena).length,\n }\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Item animations (clips of AnimationClipSpec)\n // ---------------------------------------------------------------------------------------------------------------------------------------\n interface Playing {\n entry: Entry\n clip: AnimationClipSpec\n t: number\n fired: number\n targets: Map<string, THREE_NS.Object3D>\n }\n const playing: Playing[] = []\n const restPose = new WeakMap<THREE_NS.Object3D, { p: Vec3; r: Vec3 }>()\n const ZERO: Vec3 = [0, 0, 0]\n const animTarget = (): Entry | undefined => {\n if (heldEntry) return heldEntry\n const r = inspectTarget()\n return r ? entryOf(r.object) : undefined\n }\n const poseAt = (clip: AnimationClipSpec, id: string | null, time: number): { position: Vec3; rotation: Vec3 } => {\n const pick = (k: AnimationClipSpec['keys'][number]): { position?: Vec3; rotation?: Vec3 } | undefined => (id === null ? k : k.parts?.[id])\n const pts = clip.keys.map((k) => ({ t: k.t, position: pick(k)?.position ?? ZERO, rotation: pick(k)?.rotation ?? ZERO }))\n if (pts.length === 0 || pts[0].t > 0) pts.unshift({ t: 0, position: ZERO, rotation: ZERO })\n let a = pts[0]\n let b = pts[pts.length - 1]\n if (time >= b.t) a = b\n else for (let i = 0; i < pts.length - 1; i++) if (time >= pts[i].t && time < pts[i + 1].t) [a, b] = [pts[i], pts[i + 1]]\n const f = a === b || b.t <= a.t ? 0 : (time - a.t) / (b.t - a.t)\n const mix = (x: Vec3, y: Vec3): Vec3 => [x[0] + (y[0] - x[0]) * f, x[1] + (y[1] - x[1]) * f, x[2] + (y[2] - x[2]) * f]\n return { position: mix(a.position, b.position), rotation: mix(a.rotation, b.rotation) }\n }\n const applyClip = (pl: Playing): void => {\n for (const [id, obj] of pl.targets) {\n const rest = restPose.get(obj)\n if (!rest) continue\n const pose = poseAt(pl.clip, id === '' ? null : id, pl.t)\n obj.position.set(rest.p[0] + pose.position[0], rest.p[1] + pose.position[1], rest.p[2] + pose.position[2])\n obj.rotation.set(rest.r[0] + pose.rotation[0], rest.r[1] + pose.rotation[1], rest.r[2] + pose.rotation[2])\n // animations are visual only: move the part's collision/raycast shape to the same pose (spec rest + clip offset)\n const ps = id === '' ? undefined : specs.get(pl.entry.so.objectId)?.parts.find((p) => p.id === id)\n if (ps) {\n const r0 = ps.rotation ?? ZERO\n world.setPartPose(\n pl.entry.so.objectId, id,\n [ps.position[0] + pose.position[0], ps.position[1] + pose.position[1], ps.position[2] + pose.position[2]],\n [r0[0] + pose.rotation[0], r0[1] + pose.rotation[1], r0[2] + pose.rotation[2]],\n )\n }\n }\n }\n const updateAnimations = (dt: number): void => {\n for (let i = playing.length - 1; i >= 0; i--) {\n const pl = playing[i]\n pl.t = Math.min(pl.clip.duration, pl.t + dt)\n applyClip(pl)\n const evs = pl.clip.events ?? []\n while (pl.fired < evs.length && evs[pl.fired].t <= pl.t) {\n const ev = evs[pl.fired++]\n action('animation_event', t('act.anim_event', { name: pl.entry.name, clip: pl.clip.id, type: ev.type }), { objectId: pl.entry.so.objectId, itemId: pl.entry.so.itemId, data: { clip: pl.clip.id, type: ev.type, at: ev.t, ...(ev.data ?? {}) } })\n const key = ev.type === 'sound' ? ev.data?.key : undefined\n if (typeof key === 'string') options.onSound?.(key, v3(pl.entry.so.root.getWorldPosition(tmpV)), 1)\n }\n if (pl.t >= pl.clip.duration) {\n playing.splice(i, 1)\n action('animation_end', t('act.anim_end', { name: pl.entry.name, clip: pl.clip.id }), { objectId: pl.entry.so.objectId, itemId: pl.entry.so.itemId, data: { clip: pl.clip.id } })\n }\n }\n }\n const animationsOf = (): AnimationInfo | null => {\n const e = animTarget()\n if (!e || e.arena) return null\n const clips = (e.item?.animations ?? []).map((c) => ({ id: c.id, duration: c.duration }))\n return { objectId: e.so.objectId, itemId: e.so.itemId, name: e.name, clips, playing: playing.find((p) => p.entry === e)?.clip.id ?? null }\n }\n const playAnimation = (clipId: string, objectId?: string): boolean => {\n const e = objectId ? entries.get(objectId) : animTarget()\n const clip = e?.item?.animations?.find((c) => c.id === clipId)\n if (!e || !clip) return false\n for (let i = playing.length - 1; i >= 0; i--) if (playing[i].entry === e && playing[i].clip.id === clipId) playing.splice(i, 1)\n const targets = new Map<string, THREE_NS.Object3D>()\n const ids = new Set<string>()\n for (const k of clip.keys) for (const id of Object.keys(k.parts ?? {})) ids.add(id)\n const grab = (key: string, obj: THREE_NS.Object3D | undefined): void => {\n if (!obj) return\n if (!restPose.has(obj)) restPose.set(obj, { p: [obj.position.x, obj.position.y, obj.position.z], r: [obj.rotation.x, obj.rotation.y, obj.rotation.z] })\n targets.set(key, obj)\n }\n if (clip.keys.some((k) => k.position || k.rotation)) grab('', e.so.root)\n for (const id of ids) grab(id, e.so.root.getObjectByName(id) ?? undefined)\n const pl: Playing = { entry: e, clip, t: 0, fired: 0, targets }\n playing.push(pl)\n applyClip(pl)\n action('animation', t('act.anim_start', { name: e.name, clip: clip.id, seconds: num(clip.duration, 1) }), { objectId: e.so.objectId, itemId: e.so.itemId, data: { clip: clip.id, duration: clip.duration } })\n return true\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // Scenarios and modules\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const extraScenarios: TestRoomScenario[] = [...(options.scenarios ?? [])]\n const moduleCheck = (ok: boolean, text: string, data: Record<string, unknown>, itemId?: string): void => {\n log.add({ channel: 'check', type: ok ? 'pass' : 'fail', text: `${ok ? '✓' : '✗'} ${text}`, itemId, data: { ok, ...data } })\n }\n const loadModule = (mod: TestableModule<ScenarioContext>): ModuleReport => {\n const report: ModuleReport = { module: mod.id, items: [], scenarios: [], ok: true, problems: [] }\n const fail = (problem: string): void => {\n report.ok = false\n report.problems.push(problem)\n }\n const added = mod.items(locale)\n for (const ti of added) {\n const item: TestRoomItem = {\n id: ti.id,\n name: ti.name,\n group: mod.group,\n build: (T) => ti.build(T) as THREE_NS.Object3D,\n spec: ti.spec as TestRoomItem['spec'],\n movable: ti.movable,\n fluid: ti.fluid,\n weapon: ti.weapon,\n impl: ti.impl as TestRoomItem['impl'],\n animations: ti.animations,\n }\n catalogMap.set(item.id, item)\n const at = catalog.findIndex((c) => c.id === item.id)\n if (at >= 0) catalog[at] = item\n else catalog.push(item)\n report.items.push(item.id)\n // contract checks on a throwaway build of the item (never added to the scene)\n let partIds: string[] = []\n const base = { module: mod.id, item: item.id }\n try {\n const root = item.build(THREE)\n root.updateMatrixWorld(true)\n if (item.impl) {\n const probe = item.impl(root, `${item.id}_check`)\n const r = checkDestructible(probe, { materials: world.materials.keys() })\n partIds = probe.describe().parts.map((p) => p.id)\n moduleCheck(r.ok, r.ok ? t('mod.destructible_ok', { name: item.name, parts: partIds.length }) : t('mod.destructible_fail', { name: item.name, problems: r.problems.join('; ') }), { ...base, check: 'destructible', problems: r.problems }, item.id)\n for (const p of r.problems) fail(`${item.id}: ${p}`)\n }\n if (!item.impl || item.spec) {\n // the spec is resolved after the build (it may be a function of the root, or derived from the meshes)\n const spec = resolveSpec(item, root).spec\n if (!item.impl) partIds = spec.parts.map((p) => p.id)\n const r = checkSpec(spec, { materials: world.materials.keys() })\n moduleCheck(r.ok, r.ok ? t('mod.spec_ok', { name: item.name, parts: spec.parts.length }) : t('mod.spec_fail', { name: item.name, problems: r.problems.join('; ') }), { ...base, check: 'spec', problems: r.problems, warnings: r.warnings }, item.id)\n for (const p of r.problems) fail(`${item.id}: ${p}`)\n for (const w of r.warnings) log.add({ channel: 'check', type: 'warn', text: `⚠ ${t('mod.spec_warn', { name: item.name, warning: w })}`, itemId: item.id, data: { ok: true, ...base, check: 'spec', warning: w } })\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n moduleCheck(false, t('mod.destructible_fail', { name: item.name, problems: msg }), { ...base, check: 'destructible', problems: [msg] }, item.id)\n fail(`${item.id}: ${msg}`)\n }\n for (const clip of item.animations ?? []) {\n const r = checkAnimation(clip, partIds)\n moduleCheck(r.ok, r.ok ? t('mod.animation_ok', { name: item.name, clip: clip.id, seconds: num(clip.duration, 1) }) : t('mod.animation_fail', { name: item.name, clip: clip.id, problems: r.problems.join('; ') }), { ...base, check: 'animation', clip: clip.id, problems: r.problems }, item.id)\n for (const p of r.problems) fail(`${item.id}: ${p}`)\n }\n }\n for (const ms of mod.scenarios?.(locale) ?? []) {\n const sc: TestRoomScenario = { id: ms.id, name: ms.name, run: ms.run }\n const at = extraScenarios.findIndex((x) => x.id === sc.id)\n if (at >= 0) extraScenarios[at] = sc\n else extraScenarios.push(sc)\n report.scenarios.push(sc.id)\n }\n action('module', t('act.module_loaded', { name: mod.name, items: report.items.length, scenarios: report.scenarios.length, result: t(report.ok ? 'mod.all_ok' : 'mod.some_failed') }), { data: { module: mod.id, items: report.items, scenarios: report.scenarios, ok: report.ok } })\n ui?.refresh()\n return report\n }\n\n const allScenarios = (): TestRoomScenario[] => [...makeScenarios(t, num, locale), ...extraScenarios]\n let scenarioRunning = false\n\n const step = (seconds: number): void => {\n const dt = seconds > 6 ? 1 / 30 : FIXED_DT\n const n = Math.max(1, Math.round(seconds / dt))\n for (let i = 0; i < n; i++) {\n player.update(0)\n followHeld(dt)\n stepSim(dt)\n }\n }\n\n const runScenarios = async (list?: TestRoomScenario[]): Promise<ScenarioReport> => {\n const all = list ?? allScenarios()\n const report: ScenarioReport = { passed: 0, failed: 0, results: [] }\n scenarioRunning = true\n const wasPaused = paused\n paused = false\n try {\n for (const sc of all) {\n hardReset()\n player.look(arena.playerStart, [0, 1.5, arena.wallZ])\n useHeld = false\n const checks: Array<{ label: string; ok: boolean }> = []\n log.add({ channel: 'check', type: 'scenario', text: t('sc.start', { name: sc.name }), data: { id: sc.id } })\n const ctx: ScenarioContext = {\n room,\n step,\n expect(condition, label, data) {\n checks.push({ label, ok: !!condition })\n log.add({ channel: 'check', type: condition ? 'pass' : 'fail', text: `${condition ? '✓' : '✗'} ${label}`, data: { scenario: sc.id, ok: !!condition, ...(data ?? {}) } })\n },\n }\n try {\n await sc.run(ctx)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n ctx.expect(false, t('sc.error', { msg }))\n }\n flush()\n const ok = checks.length > 0 && checks.every((c) => c.ok)\n report.results.push({ id: sc.id, name: sc.name, ok, checks })\n if (ok) report.passed++\n else report.failed++\n log.add({ channel: 'check', type: ok ? 'scenario_pass' : 'scenario_fail', text: t(ok ? 'sc.pass' : 'sc.fail', { name: sc.name }), data: { id: sc.id, ok } })\n await new Promise<void>((res) => setTimeout(res, 0))\n }\n } finally {\n scenarioRunning = false\n paused = wasPaused\n }\n return report\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // The room object\n // ---------------------------------------------------------------------------------------------------------------------------------------\n const room: TestRoom & {\n tilt(rad: number): void\n toggleTap(on?: boolean): boolean\n setSlowMotion(on: boolean): void\n setFastForward(on: boolean): void\n equip(weaponId: string): void\n readonly scenarios: TestRoomScenario[]\n readonly fluidRenderer: FluidRenderer\n inspectInfo(): InspectInfo | null\n } = {\n world,\n renderer,\n scene,\n camera,\n arsenal,\n fluids,\n fluidRenderer: fluidView,\n log,\n get tool() {\n return tool\n },\n get scenarios() {\n return allScenarios()\n },\n spawn,\n clear,\n resetAll,\n setTool,\n useItem,\n use(hold = 0) {\n if (tool.def.category === 'hand') {\n grab()\n return\n }\n useTool(FIXED_DT, false)\n flush()\n let t0 = 0\n while (t0 < hold) {\n useTool(FIXED_DT, true)\n stepSim(FIXED_DT)\n t0 += FIXED_DT\n }\n tool.release()\n },\n grab,\n throwHeld,\n look(position, target) {\n player.look(position, target)\n },\n inspect() {\n const r = inspectTarget()\n if (!r) return null\n return { objectId: r.object, partId: r.part, itemId: entryOf(r.object)?.so.itemId ?? '' }\n },\n inspectInfo,\n spawned() {\n return [...entries.values()].filter((e) => !e.arena).map((e) => e.so)\n },\n update,\n on(type, fn) {\n listeners[type].add(fn)\n return () => listeners[type].delete(fn)\n },\n runScenarios,\n tilt(rad) {\n heldTilt = rad\n },\n toggleTap,\n pause() {\n paused = true\n },\n resume() {\n paused = false\n },\n get paused() {\n return paused\n },\n walk(to, seconds) {\n walkPlan = seconds > 0 ? { x: to[0], z: to[2], remaining: seconds } : null\n if (!walkPlan) player.moveBy(to[0] - camera.position.x, to[2] - camera.position.z)\n },\n setSlowMotion(on) {\n timeScale = on ? 0.25 : 1\n },\n setFastForward(on) {\n fastForward = on\n },\n equip,\n loadModule,\n animations: animationsOf,\n playAnimation,\n dispose() {\n cancelAnimationFrame?.(raf)\n window.removeEventListener('resize', onResize)\n player.dispose()\n ui?.dispose()\n renderer.dispose()\n fluidView.dispose()\n for (const tr of tracers) tr.line.removeFromParent()\n clearProjectileMeshes()\n if (ownRenderer) {\n gl.dispose()\n dom.remove()\n }\n },\n }\n\n // ---------------------------------------------------------------------------------------------------------------------------------------\n // UI and loop\n // ---------------------------------------------------------------------------------------------------------------------------------------\n let ui: RoomUi | null = null\n if (options.ui !== false) {\n const groups = (): Map<string, TestRoomItem[]> => {\n const m = new Map<string, TestRoomItem[]>()\n for (const i of catalog) {\n const g = m.get(i.group) ?? []\n g.push(i)\n m.set(i.group, g)\n }\n return m\n }\n ui = createUi({\n container,\n strings: S,\n t,\n log,\n groups,\n loadout: () => loadout.map((id) => ({ id, name: arsenal.name(id) })),\n onSpawn: (id) => {\n spawn(id)\n },\n onEquip: (itemId) => {\n const w = catalogMap.get(itemId)?.weapon\n if (w) equip(w)\n },\n onClear: clear,\n onResetAll: resetAll,\n onSlow: (on) => room.setSlowMotion(on),\n onFast: (on) => room.setFastForward(on),\n onQuality: (q) => {\n qualityName = q\n if (ownRenderer) {\n gl.shadowMap.enabled = q !== 'low'\n gl.setPixelRatio(q === 'low' ? 1 : Math.min(typeof devicePixelRatio === 'number' ? devicePixelRatio : 1, 2))\n arena.sun.shadow.mapSize.set(q === 'high' ? 2048 : 1024, q === 'high' ? 2048 : 1024)\n arena.sun.shadow.map?.dispose()\n arena.sun.shadow.map = null\n resize()\n }\n },\n quality: qualityName,\n scenarios: allScenarios,\n onRun: async (sc) => {\n await runScenarios([sc])\n },\n onRunAll: async () => {\n await runScenarios()\n },\n onTool: (index) => {\n toolIndex = index\n setTool(loadout[index])\n },\n onTap: () => toggleTap(),\n onPlay: (objectId, clipId) => {\n playAnimation(clipId, objectId)\n },\n onResize: resize,\n })\n ui.hud(hudState())\n }\n\n let raf = 0\n if (ownRenderer && typeof requestAnimationFrame === 'function') {\n let last = performance.now()\n const loop = (now: number): void => {\n raf = requestAnimationFrame(loop)\n const dt = Math.min(0.05, (now - last) / 1000)\n last = now\n if (!scenarioRunning) update(dt)\n gl.render(scene, camera)\n }\n raf = requestAnimationFrame(loop)\n }\n\n if (options.initial) {\n for (const [i, id] of options.initial.entries()) spawn(id, [(i - (options.initial.length - 1) / 2) * 1.3, 0, 0.5])\n }\n\n return room\n}\n\nfunction structuredCloneSpec(spec: DestructibleSpec): DestructibleSpec {\n return JSON.parse(JSON.stringify(spec)) as DestructibleSpec\n}\n"],"mappings":"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;MACA,QAAU;QACT,OAAS;MACV;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,aAAe;MACf,SAAW;QACV,OAAS;QACT,UAAY;QACZ,cAAgB;QAChB,cAAgB;MACjB;MACA,QAAU;QACT,OAAS;MACV;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,aAAe;MACf,SAAW;QACV,OAAS;QACT,UAAY;QACZ,cAAgB;QAChB,cAAgB;MACjB;MACA,QAAU;QACT,OAAS;MACV;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;QACT,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,aAAe;MACf,SAAW;QACV,OAAS;QACT,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,eAAiB;MAClB;MACA,QAAU;QACT,OAAS;QACT,aAAe;MAChB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,aAAe;MACf,SAAW;QACV,OAAS;QACT,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,eAAiB;MAClB;MACA,QAAU;QACT,OAAS;QACT,aAAe;MAChB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,cAAgB;QAChB,cAAgB;QAChB,eAAiB;MAClB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,WAAa;MACd;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,cAAgB;QAChB,cAAgB;MACjB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,cAAgB;QAChB,cAAgB;MACjB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,cAAgB;QAChB,cAAgB;MACjB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,cAAgB;QAChB,cAAgB;MACjB;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,OAAS;QACT,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;QACT,WAAa;MACd;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;QACT,WAAa;MACd;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;QACT,WAAa;MACd;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM;MACN,SAAW;MACX,SAAW;MACX,aAAe;MACf,WAAa;MACb,UAAY;MACZ,cAAgB;QACf;QACA;MACD;MACA,aAAe;QACd,OAAS;MACV;MACA,WAAa;MACb,aAAe;MACf,SAAW;QACV,WAAa;QACb,QAAU;QACV,cAAgB;QAChB,UAAY;QACZ,cAAgB;QAChB,cAAgB;QAChB,OAAS;MACV;MACA,QAAU;QACT,WAAa;MACd;MACA,MAAQ;QACP;QACA;QACA;MACD;MACA,aAAe;IAChB;IACA;MACC,IAAM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UACP;UACA;UACA;QACF;QACA,OAAS;QACT,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;UACA;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,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CN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,QAAU;MACV,OAAS;QACP,QAAU;QACV,SAAW,CAAC;MACd;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW,CAAC;MACd;MACA,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW,CAAC;MACd;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW,CAAC;MACd;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,WAAa;MACb,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,WAAa;MACb,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,WAAa;MACb,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,WAAa;MACb,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,WAAa;MACb,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW,CAAC;MACd;MACA,MAAQ;QACN;QACA;MACF;IACF;IACA;MACE,IAAM;MACN,OAAS;MACT,SAAW;MACX,YAAc;MACd,WAAa;MACb,SAAW;MACX,SAAW;MACX,OAAS;MACT,YAAc;MACd,OAAS;QACP,QAAU;QACV,SAAW;UACT;QACF;MACF;MACA,MAAQ;QACN;MACF;IACF;IACA;MACE,IA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AY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;UACV,MAAQ;QACV;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;IACA;MACE,IAAM;MACN,UAAY;MACZ,MAAQ;QACN;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;UACV,MAAQ;QACV;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;IACA;MACE,IAAM;MACN,UAAY;MACZ,MAAQ;QACN;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;UACV,MAAQ;QACV;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;IACA;MACE,IAAM;MACN,UAAY;MACZ,MAAQ;QACN;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;UACV,MAAQ;QACV;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;IACA;MACE,IAAM;MACN,UAAY;MACZ,MAAQ;QACN;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;UACV,MAAQ;QACV;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;IACA;MACE,IAAM;MACN,UAAY;MACZ,MAAQ;QACN;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;IACA;MACE,IAAM;MACN,UAAY;MACZ,MAAQ;QACN;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;QACA;UACE,GAAK;UACL,UAAY;YACV;YACA;YACA;UACF;UACA,UAAY;YACV;YACA;YACA;UACF;UACA,QAAU;QACZ;MACF;IACF;EACF;ACzfO,MAAM,YAA0B;AAKvC,MAAM,qBAAqB;AAOpB,WAAS,cAAc,OAAmB,aAAqB,KAAiB,kBAAiD;AACtI,UAAM,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AACnD,QAAI,OAAO;AACX,QAAI,OAAO,KAAK,WAAW,KAAK,IAAI,YAAY;AAChD,QAAI,UAAU;AACd,QAAI,UAAuB;AAC3B,UAAM,QAAQ,oBAAI,IAAY;AAE9B,UAAM,OAAO,MAA0C;AACrD,UAAI,KAAK,WAAW,EAAG,QAAO,EAAE,UAAU,CAAC,GAAG,GA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","names":["locales","resolveStrings","n0","n1","a","c","t0","t1","dy","inside","sign","n","b","th","clamp","pos","length","ballistic","scale","dmg","pt","sub","createRng","clamp","box","joint","geo","quat","length","materialsOf","add","locales","resolveStrings","createRng","EPS","__publicField","distance","clamp","lerp","cross","normalize","quatFromEuler","__publicField","q","locales","resolveStrings","x","z","n","clone","resolveStrings","toWorld","normalize","clamp","basis","cross","flow","quatFromEuler","sub","cross","dot","__publicField","clamp","Rng","scale","locales","resolveStrings","frame","resolveStrings","add","isLost","a","b","key","g","GRAVITY","pt","drum","crate","bottle","resolveStrings","pt","cross","resolveStrings","tmpV","tmpV2","box","step","grab"]}