@adatechnology/game-items-three 0.1.5 → 0.1.6
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.
- package/README.md +5 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.global.js +1820 -288
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kit.ts","../src/wear.ts","../src/shapes.ts","../src/data/models.json","../src/models/canned-beans.ts","../src/models/water-bottle.ts","../src/models/rice.ts","../src/models/military-ration.ts","../src/models/cachaca.ts","../src/models/first-aid-kit.ts","../src/models/bandage.ts","../src/models/amoxicillin.ts","../src/models/crowbar.ts","../src/models/hammer.ts","../src/models/machete.ts","../src/models/axe.ts","../src/models/nail-bat.ts","../src/models/hiking-backpack-40l.ts","../src/models/flashlight.ts","../src/models/portable-radio.ts","../src/models/house-key.ts","../src/models/survivor-diary.ts","../src/models/motorcycle-helmet.ts","../src/models/lpg-cylinder-13kg.ts","../src/models/fuel-jerrycan.ts","../src/models/walkie-talkies.ts","../src/models/batteries.ts","../src/models/wooden-plank.ts","../src/models/shipped.ts","../src/models/registry.ts","../src/build-item.ts","../src/merge.ts","../src/budgets.ts","../src/lod.ts","../src/models/deviations.ts","../src/thumbnails.ts","../src/area.ts","../src/area-layout.ts"],"sourcesContent":["import type * as THREE_NS from 'three'\n\ntype Three = typeof THREE_NS\n\n/** The material tags the team's showcase wears: what `setWear` turns toward its spoiled colour. */\nexport const WEAR_TAGS = ['metal', 'wood', 'cloth', 'plastic', 'paper', 'food', 'glass'] as const\nexport type WearTag = (typeof WEAR_TAGS)[number]\n\n/** What a material of the kit remembers so that `setWear` can go back to new: the colour it was made with (as three read it, and as sRGB floats), its tag and its roughness. */\nexport interface ItemMaterialData {\n base: THREE_NS.Color\n baseRgb: readonly [number, number, number]\n tag: string\n rough: number\n}\n\nexport type Vec3Tuple = readonly [number, number, number]\ntype Triple = [number, number, number]\n\n/**\n * The helpers the showcase page defines before its models (`M`, `mesh`, `cyl`, `bx`, `lathe`, `torus`, `extrude`, `G` and the seven material makers), so that the\n * builders ported from the page read the same as the originals. `T` is the three.js the kit was made with; `materials` lists every material it made, in order.\n */\nexport interface ItemKit {\n readonly T: Three\n readonly materials: THREE_NS.MeshStandardMaterial[]\n M(color: number, tag: string, options?: THREE_NS.MeshStandardMaterialParameters): THREE_NS.MeshStandardMaterial\n mesh(geometry: THREE_NS.BufferGeometry, material: THREE_NS.Material, position?: Vec3Tuple, rotation?: Vec3Tuple, scale?: Vec3Tuple): THREE_NS.Mesh\n cyl(radiusTop: number, radiusBottom: number, height: number, segments?: number): THREE_NS.CylinderGeometry\n bx(width: number, height: number, depth: number): THREE_NS.BoxGeometry\n lathe(points: ReadonlyArray<readonly [number, number]>, segments?: number): THREE_NS.LatheGeometry\n torus(radius: number, tube: number, arc?: number): THREE_NS.TorusGeometry\n extrude(points: ReadonlyArray<readonly [number, number]>, depth: number, bevel?: number): THREE_NS.ExtrudeGeometry\n G(...children: THREE_NS.Object3D[]): THREE_NS.Group\n metal(color: number): THREE_NS.MeshStandardMaterial\n wood(color: number): THREE_NS.MeshStandardMaterial\n cloth(color: number): THREE_NS.MeshStandardMaterial\n plastic(color: number): THREE_NS.MeshStandardMaterial\n paper(color: number): THREE_NS.MeshStandardMaterial\n food(color: number): THREE_NS.MeshStandardMaterial\n glass(color: number, opacity: number): THREE_NS.MeshStandardMaterial\n}\n\n/** The channels of a hex as r128 (the team's three.js) stores them: each one over 255, as given, with no conversion. */\nconst channelsOf = (hex: number): readonly [number, number, number] => [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n\n/** The helpers of the showcase page on a given three.js; every kit has its own list of materials. */\nexport function createItemKit(T: Three): ItemKit {\n const materials: THREE_NS.MeshStandardMaterial[] = []\n const M: ItemKit['M'] = (color, tag, options = {}) => {\n const material = new T.MeshStandardMaterial(Object.assign({ color, roughness: 0.78, metalness: 0 }, options))\n const base = new T.Color(color)\n const data: ItemMaterialData = { base, baseRgb: channelsOf(color), tag, rough: material.roughness }\n material.userData = data\n materials.push(material)\n return material\n }\n const mesh: ItemKit['mesh'] = (geometry, material, position = [0, 0, 0], rotation = [0, 0, 0], scale) => {\n const object = new T.Mesh(geometry, material)\n object.position.set(...(position as Triple))\n object.rotation.set(...(rotation as Triple))\n if (scale) object.scale.set(...(scale as Triple))\n return object\n }\n return {\n T,\n materials,\n M,\n mesh,\n cyl: (radiusTop, radiusBottom, height, segments = 14) => new T.CylinderGeometry(radiusTop, radiusBottom, height, segments),\n bx: (width, height, depth) => new T.BoxGeometry(width, height, depth),\n lathe: (points, segments = 16) => new T.LatheGeometry(points.map(([x, y]) => new T.Vector2(x, y)), segments),\n torus: (radius, tube, arc = Math.PI * 2) => new T.TorusGeometry(radius, tube, 8, 18, arc),\n extrude: (points, depth, bevel = 0.015) => {\n const shape = new T.Shape()\n points.forEach(([x, y], index) => (index ? shape.lineTo(x, y) : shape.moveTo(x, y)))\n return new T.ExtrudeGeometry(shape, { depth, bevelEnabled: true, bevelThickness: bevel, bevelSize: bevel, bevelSegments: 2 })\n },\n G: (...children) => {\n const group = new T.Group()\n children.forEach((child) => group.add(child))\n return group\n },\n metal: (color) => M(color, 'metal', { metalness: 0.55, roughness: 0.45 }),\n wood: (color) => M(color, 'wood'),\n cloth: (color) => M(color, 'cloth', { roughness: 0.95 }),\n plastic: (color) => M(color, 'plastic', { roughness: 0.6 }),\n paper: (color) => M(color, 'paper', { roughness: 0.9 }),\n food: (color) => M(color, 'food', { roughness: 0.85 }),\n glass: (color, opacity) => M(color, 'glass', { roughness: 0.15, metalness: 0.1, transparent: true, opacity }),\n }\n}\n","import type * as THREE_NS from 'three'\n\nimport type { ItemMaterialData } from './kit'\n\n/** 0 new, 1 used, 2 spoiled (the three stages of the showcase). */\nexport type WearStage = 0 | 1 | 2\n\n/** The colour each material tag turns toward as it wears (`STAGE_TARGET` of the showcase). */\nexport const WEAR_TARGET: Readonly<Record<string, number>> = { food: 0x5d6b2e, metal: 0x7a3e1d, wood: 0x3f3326, cloth: 0x4a4033, plastic: 0x6b6556, paper: 0x8a7a52, glass: 0x55503a }\n\n/** How far toward the target colour each stage goes (`AMT`). */\nexport const WEAR_AMOUNT: readonly [number, number, number] = [0, 0.3, 0.62]\n\nconst hexToRgb = (hex: number): readonly [number, number, number] => [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n\nconst dataOf = (material: THREE_NS.Material): ItemMaterialData | undefined => {\n const data = material.userData as Partial<ItemMaterialData>\n return data.base && data.baseRgb && data.tag !== undefined && data.rough !== undefined ? (data as ItemMaterialData) : undefined\n}\n\n/** Every material under `root` that the kit made (with a tag), once each. */\nexport function wearableMaterials(root: THREE_NS.Object3D): THREE_NS.MeshStandardMaterial[] {\n const found = new Set<THREE_NS.MeshStandardMaterial>()\n root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh) return\n for (const material of Array.isArray(mesh.material) ? mesh.material : [mesh.material]) if (dataOf(material)) found.add(material as THREE_NS.MeshStandardMaterial)\n })\n return [...found]\n}\n\n/**\n * Sets the wear of an item (`setStage` of the showcase): each material goes from its own colour toward the target of its tag by `WEAR_AMOUNT[stage]`, gets rougher, and\n * metal loses its shine. The colours are mixed in sRGB, as the page mixes them (three r128 had no colour management), so stage 0 is exactly the colour the material was made with.\n * Takes the object or the list of materials of a kit.\n */\nexport function setWear(target: THREE_NS.Object3D | readonly THREE_NS.MeshStandardMaterial[], stage: WearStage): void {\n const materials = 'traverse' in target ? wearableMaterials(target) : target\n if ('traverse' in target) target.userData.wear = stage\n const amount = WEAR_AMOUNT[stage]\n for (const material of materials) {\n const data = dataOf(material)\n if (!data) continue\n const goal = WEAR_TARGET[data.tag]\n if (goal === undefined) continue\n const [tr, tg, tb] = hexToRgb(goal)\n const [r, g, b] = data.baseRgb\n material.color.setRGB(r + (tr - r) * amount, g + (tg - g) * amount, b + (tb - b) * amount, 'srgb')\n material.roughness = Math.min(1, data.rough + (0.2 * stage) / 2)\n if (data.tag === 'metal') material.metalness = Math.max(0.1, 0.55 - 0.2 * stage)\n }\n}\n","import type * as THREE_NS from 'three'\n\nimport type { ItemKit, Vec3Tuple } from './kit'\n\n/** The simple shapes the kit draws at the real size of an item, by the `shape` hint of its definition. */\nexport const SHAPES = [\n 'can', 'bag', 'box', 'bottle', 'tool', 'roll', 'dish', 'cloth', 'shoe', 'jar', 'paper', 'fruit', 'cup', 'tube',\n 'blade', 'long_tool', 'garment', 'backpack', 'jerrycan', 'tank', 'book', 'key', 'battery', 'plank', 'device',\n] as const\nexport type ShapeId = (typeof SHAPES)[number]\n\n/** What a shape drawer is given: the kit, the size in metres, the colour of the item and the level of detail (1 full, 0.5 half the segments). */\nexport interface ShapeContext {\n k: ItemKit\n w: number\n h: number\n d: number\n color: number\n detail: number\n}\ntype Drawer = (c: ShapeContext) => THREE_NS.Group\n\nconst DEFAULT_COLOR = 0x8a8f94\nconst PI = Math.PI\n\n/** The colour `factor` times lighter (above 1) or darker (below 1), per channel. */\nexport function shade(color: number, factor: number): number {\n const channel = (shift: number): number => Math.max(0, Math.min(255, Math.round(((color >> shift) & 255) * factor)))\n return (channel(16) << 16) | (channel(8) << 8) | channel(0)\n}\n\n/** Segments of a round part at a level of detail: never below 5. */\nconst seg = (c: ShapeContext, n: number): number => Math.max(5, Math.round(n * c.detail))\n\n/** The long axis of a size and the three sides in the frame where that axis is x: `L` long, `a` the next, `b` the shortest of the other two in their own order. */\nexport function canonicalFrame(size: Vec3Tuple): { axis: 0 | 1 | 2; L: number; a: number; b: number } {\n const [w, h, d] = size\n if (h >= w && h >= d) return { axis: 1, L: h, a: w, b: d }\n if (d >= w && d >= h) return { axis: 2, L: d, a: h, b: w }\n return { axis: 0, L: w, a: h, b: d }\n}\n\n/** Turns a group drawn with its long side on x so that the long side lies on the given axis. */\nfunction orient(c: ShapeContext, group: THREE_NS.Group, axis: 0 | 1 | 2): THREE_NS.Group {\n if (axis === 0) return group\n const holder = c.k.G(group)\n if (axis === 1) holder.rotation.z = PI / 2\n else holder.rotation.y = -PI / 2\n return holder\n}\n\n/** A shape drawn along x in the frame `(L, a, b)`, then turned onto the long axis of the size. */\nconst alongLong = (draw: (c: ShapeContext, L: number, a: number, b: number) => THREE_NS.Group): Drawer => (c) => {\n const { axis, L, a, b } = canonicalFrame([c.w, c.h, c.d])\n return orient(c, draw(c, L, a, b), axis)\n}\n\n/** A group drawn with a radius of 0.5 and stretched to the width and depth of the item (an oval can fills its box). */\nconst across = (c: ShapeContext, group: THREE_NS.Group): THREE_NS.Group => {\n group.scale.set(c.w, 1, c.d)\n return c.k.G(group)\n}\n\nconst can: Drawer = (c) => {\n const { k, h } = c\n const body = k.metal(0x8d9096)\n return across(c, k.G(k.mesh(k.cyl(0.5, 0.5, h * 0.94, seg(c, 14)), body), k.mesh(k.cyl(0.5, 0.5, h * 0.5, seg(c, 14)), k.food(c.color), [0, 0, 0], [0, 0, 0], [1.0, 1, 1.0]), k.mesh(k.cyl(0.5, 0.5, h * 0.03, seg(c, 14)), body, [0, h * 0.485, 0]), k.mesh(k.cyl(0.5, 0.5, h * 0.03, seg(c, 14)), body, [0, -h * 0.485, 0])))\n}\n\nconst bottle: Drawer = (c) => {\n const { k, h } = c\n const r = 0.5\n const profile: Array<[number, number]> = [[0, -h / 2], [r, -h / 2], [r, h * 0.12], [r * 0.45, h * 0.3], [r * 0.4, h * 0.4], [0, h * 0.4]]\n return across(c, k.G(k.mesh(k.lathe(profile, seg(c, 14)), k.glass(c.color, 0.6)), k.mesh(k.cyl(r * 0.42, r * 0.42, h * 0.1, seg(c, 10)), k.plastic(shade(c.color, 0.5)), [0, h * 0.45, 0])))\n}\n\nconst jar: Drawer = (c) => {\n const { k, h } = c\n return across(c, k.G(k.mesh(k.cyl(0.5, 0.5, h * 0.82, seg(c, 14)), k.glass(c.color, 0.55), [0, -h * 0.09, 0]), k.mesh(k.cyl(0.5, 0.5, h * 0.18, seg(c, 14)), k.metal(0xb8913a), [0, h * 0.41, 0])))\n}\n\nconst bag: Drawer = (c) => {\n const { k, w, h, d } = c\n return k.G(k.mesh(k.bx(w, h * 0.88, d), k.paper(c.color), [0, -h * 0.06, 0]), k.mesh(k.bx(w * 1.0, h * 0.12, d * 0.5), k.paper(shade(c.color, 0.85)), [0, h * 0.44, 0]), k.mesh(k.bx(w * 0.7, h * 0.3, d * 1.0), k.paper(shade(c.color, 1.2)), [0, 0, 0]))\n}\n\nconst box: Drawer = (c) => {\n const { k, w, h, d } = c\n return k.G(k.mesh(k.bx(w, h, d), k.paper(c.color)), k.mesh(k.bx(w, h * 0.12, d), k.paper(shade(c.color, 0.8)), [0, h * 0.44, 0]), k.mesh(k.bx(w * 0.62, h * 0.4, d), k.paper(shade(c.color, 1.25)), [0, -h * 0.02, 0]))\n}\n\nconst cloth: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.cloth(c.color)\n return k.G(k.mesh(k.bx(w, h * 0.55, d), material, [0, -h * 0.225, 0]), k.mesh(k.bx(w * 0.96, h * 0.45, d * 0.96), k.cloth(shade(c.color, 0.9)), [0, h * 0.275, 0]))\n}\n\nconst paper: Drawer = (c) => {\n const { k, w, h, d } = c\n const sheet = k.paper(c.color)\n return k.G(k.mesh(k.bx(w, h / 3, d), sheet, [0, -h / 3, 0]), k.mesh(k.bx(w * 0.98, h / 3, d * 0.98), k.paper(shade(c.color, 0.95)), [0, 0, 0]), k.mesh(k.bx(w, h / 3, d), sheet, [0, h / 3, 0]))\n}\n\nconst fruit: Drawer = (c) => {\n const { k, w, h, d } = c\n const sphere = new k.T.SphereGeometry(0.5, seg(c, 12), seg(c, 8))\n return k.G(k.mesh(sphere, k.food(c.color), [0, -h * 0.04, 0], [0, 0, 0], [w, h * 0.92, d]), k.mesh(k.cyl(h * 0.02, h * 0.02, h * 0.1, 6), k.wood(0x5a3a22), [0, h * 0.45, 0]))\n}\n\nconst dish: Drawer = (c) => {\n const { k, w, h, d } = c\n return k.G(k.mesh(k.cyl(0.5, 0.35, h, seg(c, 16)), k.plastic(c.color), [0, 0, 0], [0, 0, 0], [w, 1, d]))\n}\n\nconst cup: Drawer = (c) => {\n const { k, w, h, d } = c\n const profile: Array<[number, number]> = [[0, -h / 2], [0.38, -h / 2], [0.5, h / 2], [0.44, h / 2], [0.33, -h / 2 + h * 0.06], [0, -h / 2 + h * 0.06]]\n return k.G(k.mesh(k.lathe(profile, seg(c, 14)), k.plastic(c.color), [0, 0, 0], [0, 0, 0], [w, 1, d]))\n}\n\nconst tube: Drawer = (c) => {\n const { k, h } = c\n const material = k.plastic(c.color)\n return across(c, k.G(k.mesh(k.cyl(0.5, 0.42, h * 0.86, seg(c, 12)), material, [0, -h * 0.04, 0]), k.mesh(k.cyl(0.35, 0.35, h * 0.12, seg(c, 12)), k.plastic(shade(c.color, 0.6)), [0, h * 0.44, 0]), k.mesh(k.bx(1, h * 0.06, 0.25), material, [0, -h * 0.47, 0])))\n}\n\nconst roll: Drawer = (c) => {\n const { k, w, h, d } = c\n // the roll lies with its axis along the shortest side; the other two sides are the (oval) section\n const body = k.G(k.mesh(k.cyl(0.5, 0.5, 1, seg(c, 18)), k.paper(c.color)), k.mesh(k.cyl(0.18, 0.18, 0.98, seg(c, 12)), k.paper(0xb59d78)))\n if (h <= w && h <= d) body.scale.set(w, h, d)\n else if (w <= d) {\n body.rotation.z = PI / 2\n body.scale.set(h, w, d)\n } else {\n body.rotation.x = PI / 2\n body.scale.set(w, d, h)\n }\n return k.G(body)\n}\n\nconst shoe: Drawer = (c) => {\n const { k, w, h, d } = c\n const upper = k.cloth(c.color)\n return k.G(k.mesh(k.bx(w, h * 0.22, d), k.plastic(0x22251f), [0, -h * 0.39, 0]), k.mesh(k.bx(w * 0.42, h * 0.78, d * 0.96), upper, [-w * 0.29, h * 0.11, 0]), k.mesh(k.bx(w * 0.5, h * 0.5, d * 0.96), upper, [w * 0.25, -h * 0.03, 0]))\n}\n\nconst tool: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const radius = Math.max(0.004, Math.min(a, b) / 2)\n return k.G(k.mesh(k.cyl(radius, radius, L * 0.74, seg(c, 10)), k.wood(0x8a643c), [-L * 0.13, 0, 0], [0, 0, PI / 2]), k.mesh(k.bx(L * 0.26, a, b), k.metal(shade(c.color, 1)), [L * 0.37, 0, 0]))\n})\n\nconst longTool: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const radius = Math.max(0.004, Math.min(a, b) / 2) * 0.55\n return k.G(k.mesh(k.cyl(radius, radius, L * 0.94, seg(c, 10)), k.wood(0x9a7448), [0, 0, 0], [0, 0, PI / 2]), k.mesh(k.bx(L * 0.12, a, b), k.metal(c.color), [L * 0.44, 0, 0]))\n})\n\nconst blade: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const edge = Math.min(0.0002, b * 0.05)\n const steel = k.extrude([[0, 0], [L * 0.66, 0], [L * 0.68, a * 0.4], [0, a]], Math.max(0.0005, b * 0.4 - 2 * edge), edge)\n return k.G(k.mesh(steel, k.metal(0xa9adb0), [-L * 0.18, -a / 2, -b * 0.2 + edge]), k.mesh(k.bx(L * 0.34, a * 0.6, b), k.wood(0x3b2a20), [-L * 0.33, 0, 0]))\n})\n\nconst garment: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.cloth(c.color)\n return k.G(k.mesh(k.bx(w * 0.56, h, d), material), k.mesh(k.bx(w * 0.22, h * 0.42, d * 0.9), material, [-w * 0.39, h * 0.29, 0]), k.mesh(k.bx(w * 0.22, h * 0.42, d * 0.9), material, [w * 0.39, h * 0.29, 0]))\n}\n\nconst backpack: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.cloth(c.color)\n const dome = new k.T.SphereGeometry(0.5, seg(c, 12), seg(c, 6), 0, PI * 2, 0, PI / 2)\n const strap = k.cloth(shade(c.color, 0.6))\n return k.G(k.mesh(k.bx(w, h * 0.78, d * 0.68), material, [0, -h * 0.11, -d * 0.14]), k.mesh(dome, material, [0, h * 0.28, -d * 0.14], [0, 0, 0], [w, h * 0.44, d * 0.68]), k.mesh(k.bx(w * 0.7, h * 0.4, d * 0.3), k.cloth(shade(c.color, 0.75)), [0, -h * 0.18, d * 0.35]), k.mesh(k.bx(w * 0.1, h * 0.7, d * 0.04), strap, [-w * 0.25, -h * 0.05, -d * 0.48]), k.mesh(k.bx(w * 0.1, h * 0.7, d * 0.04), strap, [w * 0.25, -h * 0.05, -d * 0.48]))\n}\n\nconst jerrycan: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.plastic(c.color)\n return k.G(k.mesh(k.bx(w, h * 0.86, d), material, [0, -h * 0.07, 0]), k.mesh(k.bx(w * 0.4, h * 0.1, d * 0.5), material, [-w * 0.2, h * 0.45, 0]), k.mesh(k.cyl(d * 0.14, d * 0.18, h * 0.12, seg(c, 10)), k.plastic(0xd9a441), [w * 0.3, h * 0.44, 0]))\n}\n\nconst tank: Drawer = (c) => {\n const { k, h } = c\n const r = 0.5\n const profile: Array<[number, number]> = [[0, -h / 2], [r * 0.9, -h / 2], [r, -h * 0.4], [r, h * 0.22], [r * 0.6, h * 0.36], [r * 0.2, h * 0.4], [0, h * 0.4]]\n const metal = k.metal(c.color)\n return across(c, k.G(k.mesh(k.lathe(profile, seg(c, 14)), metal), k.mesh(k.cyl(r * 0.62, r * 0.62, h * 0.05, seg(c, 14)), metal, [0, h * 0.3, 0]), k.mesh(k.cyl(r * 0.18, r * 0.18, h * 0.12, seg(c, 8)), k.metal(0xb8913a), [0, h * 0.44, 0])))\n}\n\nconst book: Drawer = (c) => {\n const { k, w, h, d } = c\n const cover = k.paper(c.color)\n return k.G(k.mesh(k.bx(w, h, d * 0.14), cover, [0, 0, d * 0.43]), k.mesh(k.bx(w, h, d * 0.14), cover, [0, 0, -d * 0.43]), k.mesh(k.bx(w * 0.94, h * 0.96, d * 0.72), k.paper(0xe9e1cc), [w * 0.02, 0, 0]), k.mesh(k.bx(w * 0.08, h, d), k.paper(shade(c.color, 0.8)), [-w * 0.46, 0, 0]))\n}\n\nconst key: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const metal = k.metal(0xb8913a)\n const ring = a * 0.5\n const tube = Math.min(b * 0.4, ring * 0.2)\n return k.G(k.mesh(new c.k.T.TorusGeometry(ring * 0.8, tube, 5, seg(c, 10)), k.metal(0x9a9da0), [-L / 2 + ring * 0.8 + tube, 0, 0]), k.mesh(k.bx(L * 0.62, a * 0.28, b), metal, [L * 0.12, 0, 0]), k.mesh(k.bx(L * 0.08, a * 0.22, b), metal, [L * 0.36, -a * 0.2, 0]), k.mesh(k.bx(L * 0.06, a * 0.22, b), metal, [L * 0.2, -a * 0.2, 0]))\n})\n\nconst battery: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const r = Math.min(a, b) / 2\n return k.G(k.mesh(k.cyl(r, r, L * 0.94, seg(c, 14)), k.metal(c.color), [0, 0, 0], [0, 0, PI / 2]), k.mesh(k.cyl(r * 0.36, r * 0.36, L * 0.06, seg(c, 8)), k.metal(0xb9bdc0), [L * 0.47, 0, 0], [0, 0, PI / 2]))\n})\n\nconst plank: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const nail = k.metal(0x7d8186)\n return k.G(k.mesh(k.bx(L, a, b), k.wood(0xa88459)), k.mesh(k.cyl(Math.min(a, b) * 0.1, Math.min(a, b) * 0.1, b * 0.98, 6), nail, [-L * 0.4, 0, 0], [PI / 2, 0, 0]), k.mesh(k.cyl(Math.min(a, b) * 0.1, Math.min(a, b) * 0.1, b * 0.98, 6), nail, [L * 0.4, 0, 0], [PI / 2, 0, 0]))\n})\n\nconst device: Drawer = (c) => {\n const { k, w, h, d } = c\n const screen = k.M(0x9fbf8a, 'glass', { emissive: 0x2f4a22, emissiveIntensity: 0.6, roughness: 0.2 })\n return k.G(k.mesh(k.bx(w, h, d * 0.96), k.plastic(c.color), [0, 0, -d * 0.02]), k.mesh(k.bx(w * 0.7, h * 0.32, d * 0.06), screen, [0, h * 0.22, d * 0.47]), k.mesh(k.cyl(Math.min(w, h) * 0.08, Math.min(w, h) * 0.08, d * 0.1, seg(c, 8)), k.metal(0xb9bdc0), [w * 0.25, -h * 0.18, d * 0.45], [PI / 2, 0, 0]))\n}\n\nconst DRAWERS: Readonly<Record<ShapeId, Drawer>> = {\n can, bag, box, bottle, tool, roll, dish, cloth, shoe, jar, paper, fruit, cup, tube, blade, long_tool: longTool, garment, backpack, jerrycan, tank, book, key, battery, plank, device,\n}\n\nexport const isShape = (value: string | undefined): value is ShapeId => value !== undefined && value in DRAWERS\n\n/** The item fields the shape choice reads. */\nexport interface ShapeSubject {\n category: string\n size: Vec3Tuple\n shape?: string\n color?: number\n}\n\n/**\n * The shape an item is drawn with: its own `shape` when it names one of the 25, else a box. The hints the household catalog uses (`tool`, `cloth`, `bag`, `box`, `paper`) are\n * refined by the category and the proportions, so that a rake is a long tool, a jacket a garment, a rucksack a backpack, a phone a device and a diary a book.\n */\nexport function shapeOf(subject: ShapeSubject): ShapeId {\n const hint = subject.shape\n if (!isShape(hint)) return 'box'\n const [w, h, d] = subject.size\n const { L, a, b } = canonicalFrame(subject.size)\n const long = L / Math.max(a, b, 1e-6) >= 4\n const flat = Math.min(w, h, d) / Math.max(w, h, d) <= 0.2\n switch (hint) {\n case 'tool':\n if (subject.category === 'keys') return 'key'\n if (subject.category === 'electronics') return 'device'\n if (long) return subject.category === 'melee' && Math.min(a, b) / L <= 0.1 && flat ? 'blade' : 'long_tool'\n return hint\n case 'cloth':\n return subject.category === 'clothing' ? 'garment' : hint\n case 'bag':\n return subject.category === 'bags' ? 'backpack' : hint\n case 'box':\n if (subject.category === 'electronics') return 'device'\n if (subject.category === 'books') return 'book'\n if (subject.category === 'keys') return 'key'\n return hint\n case 'paper':\n return subject.category === 'books' ? 'book' : hint\n default:\n return hint\n }\n}\n\n/** Draws the simple shape of an item at its real size, centred on the origin (the long side of long shapes lies on the long axis of `size`). */\nexport function drawShape(k: ItemKit, shape: ShapeId, size: Vec3Tuple, options: { color?: number; detail?: number } = {}): THREE_NS.Group {\n const [w, h, d] = size\n return DRAWERS[shape]({ k, w, h, d, color: options.color ?? DEFAULT_COLOR, detail: options.detail ?? 1 })\n}\n","[\n {\n \"id\": \"canned_beans\",\n \"teamId\": \"feijao_lata\",\n \"teamBox\": [\n 0.67,\n 0.57,\n 0.66\n ],\n \"scale\": 0.119403\n },\n {\n \"id\": \"water_bottle\",\n \"teamId\": \"agua_500\",\n \"teamBox\": [\n 0.452,\n 1.25,\n 0.452\n ],\n \"scale\": 0.146018\n },\n {\n \"id\": \"rice\",\n \"teamId\": \"arroz\",\n \"teamBox\": [\n 0.72,\n 1.055,\n 0.3\n ],\n \"scale\": 0.236967\n },\n {\n \"id\": \"military_ration\",\n \"teamId\": \"racao_militar\",\n \"teamBox\": [\n 0.77,\n 1.03,\n 0.235\n ],\n \"scale\": 0.252427\n },\n {\n \"id\": \"cachaca\",\n \"teamId\": \"cachaca\",\n \"teamBox\": [\n 0.552,\n 1.31,\n 0.552\n ],\n \"scale\": 0.163043\n },\n {\n \"id\": \"first_aid_kit\",\n \"teamId\": \"kit_ps\",\n \"teamBox\": [\n 1.07,\n 0.915,\n 0.41\n ],\n \"scale\": 0.233645\n },\n {\n \"id\": \"bandage\",\n \"teamId\": \"atadura\",\n \"teamBox\": [\n 0.9851,\n 0.7575,\n 0.43\n ],\n \"scale\": 0.102528\n },\n {\n \"id\": \"amoxicillin\",\n \"teamId\": \"amoxicilina\",\n \"teamBox\": [\n 0.8859,\n 0.47,\n 0.607\n ],\n \"scale\": 0.11288\n },\n {\n \"id\": \"crowbar\",\n \"teamId\": \"pe_cabra\",\n \"teamBox\": [\n 0.428,\n 1.7087,\n 0.11\n ],\n \"scale\": 0.43893\n },\n {\n \"id\": \"hammer\",\n \"teamId\": \"martelo\",\n \"teamBox\": [\n 0.6487,\n 1.3477,\n 0.19\n ],\n \"scale\": 0.244862\n },\n {\n \"id\": \"machete\",\n \"teamId\": \"facao\",\n \"teamBox\": [\n 1.8759,\n 0.2906,\n 0.12\n ],\n \"scale\": 0.293193\n },\n {\n \"id\": \"axe\",\n \"teamId\": \"machado\",\n \"teamBox\": [\n 0.5952,\n 1.6693,\n 0.14\n ],\n \"scale\": 0.419337\n },\n {\n \"id\": \"nail_bat\",\n \"teamId\": \"taco_pregos\",\n \"teamBox\": [\n 0.4384,\n 1.69,\n 0.4352\n ],\n \"scale\": 0.508876\n },\n {\n \"id\": \"hiking_backpack_40l\",\n \"teamId\": \"mochila_trilha\",\n \"teamBox\": [\n 0.8,\n 1.07,\n 0.62\n ],\n \"scale\": 0.514019\n },\n {\n \"id\": \"flashlight\",\n \"teamId\": \"lanterna\",\n \"teamBox\": [\n 0.38,\n 1.08,\n 0.38\n ],\n \"scale\": 0.148148\n },\n {\n \"id\": \"portable_radio\",\n \"teamId\": \"radio_portatil\",\n \"teamBox\": [\n 1.1041,\n 1.4821,\n 0.35\n ],\n \"scale\": 0.199257\n },\n {\n \"id\": \"house_key\",\n \"teamId\": \"chave_casa\",\n \"teamBox\": [\n 1.5433,\n 0.8305,\n 0.08\n ],\n \"scale\": 0.055077\n },\n {\n \"id\": \"survivor_diary\",\n \"teamId\": \"diario\",\n \"teamBox\": [\n 0.8,\n 1.04,\n 0.27\n ],\n \"scale\": 0.201923\n },\n {\n \"id\": \"motorcycle_helmet\",\n \"teamId\": \"capacete_moto\",\n \"teamBox\": [\n 1.11,\n 1.0825,\n 1.17\n ],\n \"scale\": 0.234234\n },\n {\n \"id\": \"lpg_cylinder_13kg\",\n \"teamId\": \"botijao\",\n \"teamBox\": [\n 0.9257,\n 1.285,\n 0.94\n ],\n \"scale\": 0.381323\n },\n {\n \"id\": \"fuel_jerrycan\",\n \"teamId\": \"galao\",\n \"teamBox\": [\n 0.8788,\n 1.342,\n 0.44\n ],\n \"scale\": 0.350224\n },\n {\n \"id\": \"walkie_talkies\",\n \"teamId\": \"walkie\",\n \"teamBox\": [\n 0.465,\n 1.47,\n 0.22\n ],\n \"scale\": 0.14966\n },\n {\n \"id\": \"batteries\",\n \"teamId\": \"pilha_aa\",\n \"teamBox\": [\n 0.744,\n 1.005,\n 0.344\n ],\n \"scale\": 0.050249\n },\n {\n \"id\": \"wooden_plank\",\n \"teamId\": \"tabua\",\n \"teamBox\": [\n 1.5203,\n 0.4741,\n 0.5377\n ],\n \"scale\": 0.526212\n }\n]\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"feijao_lata\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L145), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `canned_beans`.\n */\nexport const cannedBeans: ItemModelBuilder = ({ mesh, cyl, torus, G, metal, paper, food }) => { const m = metal(0x8d9096); return G(mesh(cyl(.32, .32, .52), m), mesh(cyl(.326, .326, .34, 14), food(0x9b3a24)), mesh(cyl(.33, .33, .06), paper(0xe2c36a), [0, .02, 0]), mesh(torus(.31, .025), m, [0, .26, 0], [Math.PI / 2, 0, 0]), mesh(torus(.31, .025), m, [0, -.26, 0], [Math.PI / 2, 0, 0])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"agua_500\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L146), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `water_bottle`.\n */\nexport const waterBottle: ItemModelBuilder = ({ mesh, cyl, lathe, G, plastic, paper, glass }) => G(mesh(lathe([[0, -.6], [.2, -.6], [.22, -.5], [.22, .2], [.19, .32], [.09, .45], [.08, .55], [0, .55]]), glass(0x8fc3dc, .55)), mesh(cyl(.085, .085, .1, 12), plastic(0x2c5d8a), [0, .6, 0]), mesh(cyl(.225, .225, .22, 16), paper(0xe9ecef), [0, -.15, 0]), mesh(cyl(.226, .226, .05, 16), plastic(0x3a78a8), [0, -.12, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"arroz\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L147), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `rice`.\n */\nexport const rice: ItemModelBuilder = ({ mesh, bx, G, paper, food }) => G(mesh(bx(.7, .95, .28), paper(0xe6dcc0)), mesh(bx(.72, .12, .1), paper(0xd5c9a8), [0, .52, 0]), mesh(bx(.5, .3, .02), food(0xb5521f), [0, .05, .15]), mesh(bx(.3, .1, .02), paper(0x3f7a45), [0, -.25, .15]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"racao_militar\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L148), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `military_ration`.\n */\nexport const militaryRation: ItemModelBuilder = ({ mesh, bx, G, plastic, paper }) => G(mesh(bx(.75, 1, .22), plastic(0x5a6146)), mesh(bx(.77, .1, .23), plastic(0x474d37), [0, .48, 0]), mesh(bx(.5, .14, .01), paper(0x22251f), [0, .18, .115]), mesh(bx(.36, .06, .01), paper(0x22251f), [0, -.02, .115]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"cachaca\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L149), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `cachaca`.\n */\nexport const cachaca: ItemModelBuilder = ({ mesh, cyl, lathe, G, wood, paper, food, glass }) => G(mesh(lathe([[0, -.6], [.25, -.6], [.27, -.52], [.27, .1], [.2, .25], [.09, .35], [.09, .58], [0, .58]]), glass(0xc28a2a, .78)), mesh(cyl(.08, .07, .14, 10), wood(0x8a6a44), [0, .64, 0]), mesh(cyl(.275, .275, .34, 16), paper(0xe9e1cc), [0, -.25, 0]), mesh(cyl(.276, .276, .06, 16), food(0x7a2f1f), [0, -.15, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"kit_ps\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L150), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `first_aid_kit`.\n */\nexport const firstAidKit: ItemModelBuilder = ({ mesh, bx, torus, G, plastic }) => { const r = plastic(0xb23a2c); return G(mesh(bx(1.05, .72, .38), plastic(0xe6e3d8)), mesh(bx(1.07, .06, .4), plastic(0xbdb8aa), [0, 0, 0]), mesh(bx(.36, .1, .02), r, [0, .1, .2]), mesh(bx(.1, .36, .02), r, [0, .1, .2]), mesh(torus(.16, .035, Math.PI), plastic(0x55534c), [0, .36, 0])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"atadura\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L151), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `bandage`.\n */\nexport const bandage: ItemModelBuilder = ({ mesh, cyl, bx, G, cloth }) => { const c = cloth(0xece5d2); return G(mesh(cyl(.34, .34, .38, 18), c, [0, 0, 0], [Math.PI / 2, 0, 0]), mesh(cyl(.1, .1, .4, 12), cloth(0x8a8577), [0, 0, 0], [Math.PI / 2, 0, 0]), mesh(bx(.36, .02, .36), c, [.2, -.33, .05], [0, 0, -.25]), mesh(bx(.3, .02, .36), c, [.5, -.4, .05], [0, 0, -.05])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"amoxicilina\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L152), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `amoxicillin`.\n */\nexport const amoxicillin: ItemModelBuilder = ({ T, mesh, bx, G, metal, plastic, paper }) => G(mesh(bx(.8, .42, .24), paper(0xf0eee6)), mesh(bx(.81, .1, .25), plastic(0x4e7287), [0, .1, 0]), mesh(bx(.6, .04, .3), metal(0xb9bdc0), [.15, -.24, .25], [0, .3, 0]), ...[0, 1, 2, 3].map(k => mesh(new T.SphereGeometry(.05, 10, 8), plastic(0xd9a441), [-.05 + k * .14, -.21, .3], [0, 0, 0], [1, .6, 1])))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"pe_cabra\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L153), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `crowbar`.\n */\nexport const crowbar: ItemModelBuilder = ({ T, mesh, cyl, G, metal }) => { const c = new T.CatmullRomCurve3([[0, -.8, 0], [0, .45, 0], [.02, .62, 0], [.12, .72, 0], [.26, .7, 0], [.32, .6, 0]].map(p => new T.Vector3(...p))); return G(mesh(new T.TubeGeometry(c, 30, .055, 8), metal(0x9b2a1f)), mesh(cyl(.02, .055, .14, 8), metal(0x3a3c3e), [0, -.86, 0])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"martelo\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L154), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `hammer`.\n */\nexport const hammer: ItemModelBuilder = ({ T, mesh, cyl, bx, G, metal, wood, plastic }) => G(mesh(cyl(.05, .065, 1.1, 10), wood(0x8a643c), [0, -.15, 0]), mesh(cyl(.07, .07, .3, 10), plastic(0x22251f), [0, -.6, 0]), mesh(bx(.28, .15, .15), metal(0x55595d), [.05, .45, 0]), mesh(cyl(.08, .08, .1, 12), metal(0x55595d), [.22, .45, 0], [0, 0, Math.PI / 2]), mesh(new T.ConeGeometry(.06, .3, 6), metal(0x55595d), [-.22, .5, .035], [0, 0, 1.9]), mesh(new T.ConeGeometry(.06, .3, 6), metal(0x55595d), [-.22, .5, -.035], [0, 0, 1.9]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"facao\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L155), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `machete`.\n */\nexport const machete: ItemModelBuilder = ({ mesh, cyl, bx, extrude, G, metal, wood }) => G(mesh(extrude([[0, 0], [1.25, .05], [1.4, .14], [1.3, .26], [0, .2]], .03), metal(0xa9adb0), [-.55, 0, 0]), mesh(bx(.45, .2, .1), wood(0x3b2a20), [-.78, .1, .015]), ...[-.9, -.68].map(x => mesh(cyl(.025, .025, .12, 8), metal(0xb8913a), [x, .1, .015], [Math.PI / 2, 0, 0])))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"machado\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L156), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `axe`.\n */\nexport const axe: ItemModelBuilder = ({ M, mesh, cyl, bx, extrude, G, metal, wood }) => G(mesh(cyl(.05, .06, 1.5, 10), wood(0x9a7448), [0, -.1, 0]), mesh(extrude([[0, 0], [.42, -.16], [.5, .05], [.48, .3], [.4, .42], [0, .22]], .07), metal(0x6c7075), [.02, .38, -.05]), mesh(bx(.12, .26, .14), metal(0x4a4d50), [0, .5, 0]), mesh(bx(.1, .2, .08), M(0x9b2a1f, \"plastic\"), [0, .55, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"taco_pregos\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L157), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `nail_bat`.\n */\nexport const nailBat: ItemModelBuilder = ({ mesh, cyl, lathe, G, metal, wood }) => { const g = G(mesh(lathe([[0, -.85], [.05, -.85], [.05, -.8], [.035, -.75], [.04, -.2], [.09, .3], [.11, .7], [.09, .82], [0, .84]], 14), wood(0xb08a5a))); const nm = metal(0x7d8186); for (let k = 0; k < 9; k++) { const a = k * 2.4, y = .25 + (k % 5) * .12; const n = mesh(cyl(.012, .012, .2, 6), nm, [Math.cos(a) * .12, y, Math.sin(a) * .12], [0, 0, 0]); n.lookAt(Math.cos(a) * 2, y, Math.sin(a) * 2); n.rotateX(Math.PI / 2); g.add(n); } return g; }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"mochila_trilha\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L158), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `hiking_backpack_40l`.\n */\nexport const hikingBackpack40L: ItemModelBuilder = ({ T, mesh, bx, G, cloth, plastic }) => { const c = cloth(0x4f6b3a), d = cloth(0x36472a); return G(mesh(bx(.78, .9, .42), c), mesh(new T.SphereGeometry(.4, 14, 8, 0, Math.PI * 2, 0, Math.PI / 2), c, [0, .44, 0], [0, 0, 0], [.98, .45, .53]), mesh(bx(.56, .4, .16), d, [0, -.15, .27]), mesh(bx(.8, .12, .46), d, [0, .2, 0]), mesh(bx(.06, .9, .06), cloth(0x22251f), [-.22, 0, -.24]), mesh(bx(.06, .9, .06), cloth(0x22251f), [.22, 0, -.24]), mesh(bx(.1, .08, .04), plastic(0xd9a441), [0, .2, .24])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"lanterna\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L159), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `flashlight`.\n */\nexport const flashlight: ItemModelBuilder = ({ M, mesh, cyl, bx, torus, G, metal, plastic }) => G(mesh(cyl(.11, .11, .8, 14), metal(0x2a2c2e), [0, -.15, 0]), mesh(cyl(.19, .12, .28, 16), metal(0x3a3d40), [0, .37, 0]), mesh(cyl(.17, .17, .02, 16), M(0xfff1c0, \"glass\", { emissive: 0xffe08a, emissiveIntensity: .9 }), [0, .52, 0]), mesh(bx(.06, .1, .05), plastic(0xb5521f), [0, .05, .11]), ...[-.4, -.3, -.2].map(y => mesh(torus(.112, .012), plastic(0x1b1c1d), [0, y, 0], [Math.PI / 2, 0, 0])))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"radio_portatil\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L160), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `portable_radio`.\n */\nexport const portableRadio: ItemModelBuilder = ({ M, mesh, cyl, bx, torus, G, metal, plastic }) => { const g = G(mesh(bx(1.05, .62, .3), plastic(0x3a3d35)), mesh(cyl(.2, .2, .02, 18), plastic(0x1e1f1b), [-.24, -.04, .16], [Math.PI / 2, 0, 0]), mesh(bx(.36, .14, .02), M(0xd9a441, \"glass\", { emissive: 0x6a4a10, emissiveIntensity: .6 }), [.26, .1, .16]), mesh(cyl(.06, .06, .06, 12), plastic(0x8d8a80), [.18, -.15, .17], [Math.PI / 2, 0, 0]), mesh(cyl(.06, .06, .06, 12), plastic(0x8d8a80), [.36, -.15, .17], [Math.PI / 2, 0, 0]), mesh(torus(.24, .03, Math.PI), plastic(0x22251f), [0, .3, 0])); const a = mesh(cyl(.012, .02, .95, 6), metal(0xb9bdc0), [.4, .72, 0], [0, 0, -.35]); g.add(a); return g; }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"chave_casa\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L161), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `house_key`.\n */\nexport const houseKey: ItemModelBuilder = ({ mesh, bx, torus, extrude, G, metal, plastic }) => { const b = metal(0xb8913a); return G(mesh(torus(.22, .04), metal(0x9a9da0), [-.55, .1, 0]), mesh(extrude([[0, -.2], [.25, -.22], [.3, -.1], [.3, .1], [.25, .22], [0, .2]], .05), b, [-.38, .02, -.025]), mesh(extrude([[0, 0], [.75, 0], [.75, -.08], [.66, -.08], [.66, -.14], [.56, -.08], [.46, -.14], [.4, -.08], [0, -.08]], .035), b, [-.1, .06, -.017]), mesh(bx(.24, .34, .03), plastic(0xb5521f), [-.72, -.28, 0], [0, 0, .25])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"diario\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L162), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `survivor_diary`.\n */\nexport const survivorDiary: ItemModelBuilder = ({ mesh, bx, G, cloth, paper }) => G(mesh(bx(.78, 1.02, .05), paper(0x6b3f2a), [0, 0, .1]), mesh(bx(.78, 1.02, .05), paper(0x6b3f2a), [0, 0, -.1]), mesh(bx(.74, .98, .16), paper(0xe9e1cc), [.01, 0, 0]), mesh(bx(.06, 1.02, .25), paper(0x5a3322), [-.38, 0, 0]), mesh(bx(.03, 1.04, .27), cloth(0x22251f), [.25, 0, 0]), mesh(bx(.18, .3, .002), paper(0xd5c9a8), [.05, .2, .126], [0, 0, .08]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"capacete_moto\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L163), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `motorcycle_helmet`.\n */\nexport const motorcycleHelmet: ItemModelBuilder = ({ T, M, mesh, cyl, bx, G, plastic }) => G(mesh(new T.SphereGeometry(.55, 18, 12), plastic(0x2b2f3a), [0, 0, 0], [0, 0, 0], [1, .95, 1.08]), mesh(new T.SphereGeometry(.56, 18, 10, -0.9, 1.8, 1.05, .75), M(0x14171c, \"glass\", { roughness: .15, metalness: .4 }), [0, .02, .02], [0, 0, 0], [1, .95, 1.08]), mesh(bx(.2, .12, .02), plastic(0xe0773f), [.42, .2, .22], [0, .95, 0]), mesh(cyl(.5, .55, .12, 18), plastic(0x1d2028), [0, -.5, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"botijao\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L164), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `lpg_cylinder_13kg`.\n */\nexport const lpgCylinder13Kg: ItemModelBuilder = ({ mesh, cyl, bx, lathe, torus, G, metal }) => G(mesh(lathe([[0, -.6], [.38, -.6], [.42, -.55], [.45, -.3], [.45, .15], [.4, .32], [.28, .42], [.12, .46], [0, .46]], 18), metal(0x355f86)), mesh(cyl(.47, .47, .1, 18), metal(0x29486a), [0, -.62, 0]), mesh(torus(.24, .035), metal(0x29486a), [0, .58, 0], [Math.PI / 2, 0, 0]), mesh(cyl(.07, .07, .14, 10), metal(0xb8913a), [0, .5, 0]), mesh(bx(.04, .2, .04), metal(0x29486a), [.22, .5, 0]), mesh(bx(.04, .2, .04), metal(0x29486a), [-.22, .5, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"galao\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L165), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `fuel_jerrycan`.\n */\nexport const fuelJerrycan: ItemModelBuilder = ({ mesh, cyl, bx, G, plastic }) => G(mesh(bx(.85, 1, .42), plastic(0xa3322a)), mesh(bx(.6, .1, .3), plastic(0x7e2620), [0, .45, 0]), mesh(bx(.36, .2, .1), plastic(0xa3322a), [-.12, .62, 0]), mesh(cyl(.05, .07, .35, 10), plastic(0xd9a441), [.3, .66, 0], [0, 0, -.6]), mesh(bx(.6, .5, .02), plastic(0x8a2a22), [0, -.1, .22]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"walkie\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L166), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `walkie_talkies`.\n */\nexport const walkieTalkies: ItemModelBuilder = ({ M, mesh, cyl, bx, G, plastic }) => G(mesh(bx(.42, .9, .2), plastic(0x2a2d27)), mesh(bx(.34, .3, .02), plastic(0x161814), [0, -.12, .11]), mesh(bx(.24, .12, .02), M(0x9fbf8a, \"glass\", { emissive: 0x2f4a22, emissiveIntensity: .7 }), [0, .22, .11]), mesh(cyl(.035, .045, .6, 8), plastic(0x1b1c1a), [.12, .72, 0]), mesh(cyl(.04, .04, .08, 10), plastic(0xb5521f), [-.12, .48, 0]), mesh(bx(.05, .2, .1), plastic(0x3a3d35), [-.23, .05, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"pilha_aa\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L167), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `batteries`.\n */\nexport const batteries: ItemModelBuilder = ({ mesh, cyl, G, metal }) => { const g = G(); [-.2, .2].forEach((x, k) => g.add(mesh(cyl(.17, .17, .95, 16), metal(k ? 0xb5521f : 0x2a2c2e), [x, 0, 0]), mesh(cyl(.172, .172, .3, 16), metal(0xc9a227), [x, .33, 0]), mesh(cyl(.06, .06, .06, 10), metal(0xb9bdc0), [x, .5, 0]))); return g; }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"tabua\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L168), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `wooden_plank`.\n */\nexport const woodenPlank: ItemModelBuilder = ({ mesh, cyl, bx, G, metal, wood }) => { const g = G(); [0xa88459, 0x8e6c45, 0xb49268].forEach((c, k) => g.add(mesh(bx(1.5, .07, .26), wood(c), [0, -.15 + k * .12, (k - 1) * .05], [0, (k - 1) * .12, 0]))); const nm = metal(0x7d8186); [-.5, -.3, .4].forEach((x, k) => g.add(mesh(cyl(.012, .012, .18, 6), nm, [x, .18 + k * .01, .2], [0, 0, (k - 1) * .3]))); return g; }\n","import data from '../data/models.json'\n\nimport { cannedBeans } from './canned-beans'\nimport { waterBottle } from './water-bottle'\nimport { rice } from './rice'\nimport { militaryRation } from './military-ration'\nimport { cachaca } from './cachaca'\nimport { firstAidKit } from './first-aid-kit'\nimport { bandage } from './bandage'\nimport { amoxicillin } from './amoxicillin'\nimport { crowbar } from './crowbar'\nimport { hammer } from './hammer'\nimport { machete } from './machete'\nimport { axe } from './axe'\nimport { nailBat } from './nail-bat'\nimport { hikingBackpack40L } from './hiking-backpack-40l'\nimport { flashlight } from './flashlight'\nimport { portableRadio } from './portable-radio'\nimport { houseKey } from './house-key'\nimport { survivorDiary } from './survivor-diary'\nimport { motorcycleHelmet } from './motorcycle-helmet'\nimport { lpgCylinder13Kg } from './lpg-cylinder-13kg'\nimport { fuelJerrycan } from './fuel-jerrycan'\nimport { walkieTalkies } from './walkie-talkies'\nimport { batteries } from './batteries'\nimport { woodenPlank } from './wooden-plank'\nimport type { ItemModelBuilder, ItemModelEntry } from './registry'\n\n/** The builder of each model of the showcase, by catalog id. */\nconst BUILDERS: Readonly<Record<string, ItemModelBuilder>> = {\n canned_beans: cannedBeans,\n water_bottle: waterBottle,\n rice: rice,\n military_ration: militaryRation,\n cachaca: cachaca,\n first_aid_kit: firstAidKit,\n bandage: bandage,\n amoxicillin: amoxicillin,\n crowbar: crowbar,\n hammer: hammer,\n machete: machete,\n axe: axe,\n nail_bat: nailBat,\n hiking_backpack_40l: hikingBackpack40L,\n flashlight: flashlight,\n portable_radio: portableRadio,\n house_key: houseKey,\n survivor_diary: survivorDiary,\n motorcycle_helmet: motorcycleHelmet,\n lpg_cylinder_13kg: lpgCylinder13Kg,\n fuel_jerrycan: fuelJerrycan,\n walkie_talkies: walkieTalkies,\n batteries: batteries,\n wooden_plank: woodenPlank,\n}\n\n/** The 24 models of the showcase in the page's order: the entry of `data/models.json` (generated by `tools/items-catalog`) and the builder ported from the page. */\nexport const SHIPPED_MODELS: ReadonlyArray<{ readonly entry: ItemModelEntry; readonly builder: ItemModelBuilder }> = (data as unknown as ItemModelEntry[]).map((entry) => {\n const builder = BUILDERS[entry.id]\n if (!builder) throw new Error(`game-items-three: no builder for the model \"${entry.id}\"`)\n return { entry, builder }\n})\n","import type * as THREE_NS from 'three'\n\nimport type { ItemKit } from '../kit'\nimport { SHIPPED_MODELS } from './shipped'\n\n/** One model of the showcase as `data/models.json` keeps it: the item it draws, the id the team gave it, the box it has in the units of the page and the scale to metres. */\nexport interface ItemModelEntry {\n /** Catalog id of the item (`canned_beans`). */\n readonly id: string\n /** The id in the team's `MODELS` (`feijao_lata`). */\n readonly teamId: string\n /** Box of the builder's group in the page's units (`Box3.setFromObject`), x y z. */\n readonly teamBox: readonly [number, number, number]\n /** Metres per unit of the page, from one real measure of the object. */\n readonly scale: number\n}\n\n/** A builder of the showcase, ported as it is: it draws in the page's units and returns the group. */\nexport type ItemModelBuilder = (kit: ItemKit) => THREE_NS.Group\n\nconst entries = new Map<string, ItemModelEntry>(SHIPPED_MODELS.map(({ entry }) => [entry.id, entry]))\nconst builders = new Map<string, ItemModelBuilder>(SHIPPED_MODELS.map(({ entry, builder }) => [entry.id, builder]))\n\n/** Adds (or replaces) the model of an item: `entry.id` is the catalog id the item's `model` field names. */\nexport function registerItemModel(entry: ItemModelEntry, builder: ItemModelBuilder): void {\n entries.set(entry.id, entry)\n builders.set(entry.id, builder)\n}\n\n/** Takes a model out (a game that wants the simple shape instead). */\nexport function unregisterItemModel(id: string): void {\n entries.delete(id)\n builders.delete(id)\n}\n\nexport const itemModelEntry = (id: string): ItemModelEntry | undefined => entries.get(id)\nexport const itemModelBuilder = (id: string): ItemModelBuilder | undefined => builders.get(id)\nexport const hasItemModel = (id: string): boolean => builders.has(id)\n/** The ids of the models registered, in the order of registration (the order of the showcase for the ones the kit ships). */\nexport const listItemModels = (): string[] => [...entries.keys()]\n","import type * as THREE_NS from 'three'\n\nimport { createItemKit } from './kit'\nimport type { ItemKit, Vec3Tuple } from './kit'\nimport { itemModelBuilder, itemModelEntry } from './models/registry'\nimport { drawShape, shapeOf } from './shapes'\nimport type { ShapeId, ShapeSubject } from './shapes'\nimport { setWear } from './wear'\nimport type { WearStage } from './wear'\n\n/** The fields of an item the drawing reads (an `ItemDef` of `game-items` has them all). */\nexport interface DrawableItem extends ShapeSubject {\n id: string\n size: Vec3Tuple\n /** Key of a showcase model; without one (or when the model is not registered) the simple shape is drawn. */\n model?: string\n}\n\nexport interface BuildItemOptions {\n /** Wear of the materials, 0 new (default), 1 used, 2 spoiled. */\n wear?: WearStage\n /** Draw the simple shape even when the item has a model (the second level of detail). */\n simple?: boolean\n /** Level of detail of the simple shape, 1 (default) or 0.5 for half the segments. */\n detail?: number\n /** A kit to draw with (and to collect the materials in); default a new one. */\n kit?: ItemKit\n}\n\n/** What `buildItem` returns. */\nexport interface ItemModel {\n /** The object to add to a scene: origin at the bottom centre of the item, y up, in metres. */\n readonly root: THREE_NS.Group\n /** `model` when the showcase builder drew it, `shape` otherwise. */\n readonly kind: 'model' | 'shape'\n readonly shape?: ShapeId\n /** Size in metres the drawing was fitted to (the item's `size`). */\n readonly size: Vec3Tuple\n /** The materials made for this item. */\n readonly materials: readonly THREE_NS.MeshStandardMaterial[]\n}\n\n/** Moves a group so that its box has the centre of its base at the origin. */\nfunction restOnBase(T: typeof THREE_NS, inner: THREE_NS.Object3D): void {\n const box = new T.Box3().setFromObject(inner)\n const centre = box.getCenter(new T.Vector3())\n inner.position.set(-centre.x, -box.min.y, -centre.z)\n}\n\n/**\n * Draws an item at its real size. An item whose `model` is registered gets the showcase builder, ported as it is (page units, scaled to metres by the scale of\n * `models.json` on the root, so that the group inside is still the team's); every other item gets the simple shape of its `shape` hint (refined by category and\n * proportions) at its `size`. Either way the origin is the bottom centre and y is up.\n */\nexport function buildItem(T: typeof THREE_NS, item: DrawableItem, options: BuildItemOptions = {}): ItemModel {\n const kit = options.kit ?? createItemKit(T)\n const first = kit.materials.length\n const root = new T.Group()\n root.name = item.id\n const entry = item.model === undefined ? undefined : itemModelEntry(item.model)\n const builder = item.model === undefined ? undefined : itemModelBuilder(item.model)\n let kind: ItemModel['kind'] = 'shape'\n let shape: ShapeId | undefined\n if (entry && builder && !options.simple) {\n kind = 'model'\n const inner = builder(kit)\n inner.name = entry.teamId\n root.scale.setScalar(entry.scale)\n root.add(inner)\n restOnBase(T, inner)\n } else {\n shape = shapeOf(item)\n const inner = drawShape(kit, shape, item.size, { ...(item.color === undefined ? {} : { color: item.color }), ...(options.detail === undefined ? {} : { detail: options.detail }) })\n inner.name = shape\n root.add(inner)\n restOnBase(T, inner)\n }\n const materials = kit.materials.slice(first)\n if (options.wear) setWear(materials, options.wear)\n root.userData.wear = options.wear ?? 0\n return { root, kind, ...(shape ? { shape } : {}), size: item.size, materials }\n}\n","import { mergeByMaterial } from '@adatechnology/game-props3d'\nimport type * as THREE_NS from 'three'\n\nimport type { ItemModel } from './build-item'\n\n/**\n * The same item with its meshes joined by material: one mesh and one draw call per material instead of one per part (the \"one material for all the items\" of the page's\n * budget, as far as the materials of the kit allow). The materials are the same objects, so `setWear` still reaches them. The model's scale stays on the root.\n */\nexport function mergeItem(T: typeof THREE_NS, model: ItemModel): ItemModel {\n model.root.updateMatrixWorld(true)\n const merged = new T.Group()\n merged.name = model.root.name\n merged.scale.copy(model.root.scale)\n merged.userData = { ...model.root.userData }\n // baked into the space of the root, which leaves the root's own scale out of the geometry\n merged.add(...mergeByMaterial(T, model.root, model.root))\n return { ...model, root: merged }\n}\n","import type * as THREE_NS from 'three'\n\nexport type Vec3Like = readonly [number, number, number]\n\n/** The draw budgets of the Itens do Vale Cinzento page (section \"Desempenho com hordas\"). */\nexport interface ItemBudgets {\n /** Draw calls of all the items in a frame. */\n drawCalls: number\n /** A small item: at most this many triangles, and it disappears at `cullDistance`. */\n small: { triangles: number; cullDistance: number }\n /** A large item. */\n large: { triangles: number; cullDistance: number }\n /** The second level of detail has this share of the triangles of the first. */\n lod1Ratio: number\n /** Longest side (m) from which an item counts as large: the page does not say where small ends, so this is the kit's reading and a game can change it. */\n largeFrom: number\n}\n\nexport const ITEM_BUDGETS: ItemBudgets = {\n drawCalls: 30,\n small: { triangles: 400, cullDistance: 30 },\n large: { triangles: 1200, cullDistance: 60 },\n lod1Ratio: 0.5,\n largeFrom: 0.6,\n}\n\nexport type ItemSizeClass = 'small' | 'large'\n\nexport const sizeClassOf = (size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): ItemSizeClass => (Math.max(...size) >= budgets.largeFrom ? 'large' : 'small')\n\nexport const triangleBudgetOf = (size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): number => budgets[sizeClassOf(size, budgets)].triangles\n\nexport const cullDistanceOf = (size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): number => budgets[sizeClassOf(size, budgets)].cullDistance\n\n/** Triangles under `root`: visible meshes only, indexed or not. */\nexport function countTriangles(root: THREE_NS.Object3D): number {\n let total = 0\n root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh || !mesh.visible) return\n const geometry = mesh.geometry\n total += geometry.index ? geometry.index.count / 3 : geometry.getAttribute('position').count / 3\n })\n return Math.round(total)\n}\n\n/** Draw calls under `root`: one per visible mesh (a mesh with a material list counts once per group). */\nexport function countDrawCalls(root: THREE_NS.Object3D): number {\n let total = 0\n root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh || !mesh.visible) return\n total += Array.isArray(mesh.material) ? Math.max(1, mesh.geometry.groups.length) : 1\n })\n return total\n}\n\nexport interface BudgetReport {\n triangles: number\n limit: number\n drawCalls: number\n sizeClass: ItemSizeClass\n ok: boolean\n}\n\n/** How an item's model measures against its triangle budget (a model of the team above it is a known deviation, not an error). */\nexport function checkBudget(root: THREE_NS.Object3D, size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): BudgetReport {\n const triangles = countTriangles(root)\n const limit = triangleBudgetOf(size, budgets)\n return { triangles, limit, drawCalls: countDrawCalls(root), sizeClass: sizeClassOf(size, budgets), ok: triangles <= limit }\n}\n","import type * as THREE_NS from 'three'\n\nimport { ITEM_BUDGETS, cullDistanceOf } from './budgets'\nimport type { ItemBudgets } from './budgets'\nimport { buildItem } from './build-item'\nimport type { BuildItemOptions, DrawableItem, ItemModel } from './build-item'\nimport { createItemKit } from './kit'\nimport { mergeItem } from './merge'\n\nexport interface ItemLodOptions extends Omit<BuildItemOptions, 'simple' | 'detail' | 'kit'> {\n budgets?: ItemBudgets\n /** Join the meshes of each level by material (default true). */\n merge?: boolean\n /** Distance of the second level in metres; default a third of the distance at which the item disappears. */\n lod1Distance?: number\n}\n\nexport interface ItemLod {\n /** Add this to the scene and call `update(camera)` (or let the renderer do it). */\n readonly root: THREE_NS.LOD\n /** Full detail: the showcase model, or the shape at full segments. */\n readonly near: ItemModel\n /** The simple shape at half the segments. */\n readonly far: ItemModel\n /** Metres from the camera at which the item is no longer drawn. */\n readonly cullDistance: number\n readonly lod1Distance: number\n}\n\n/**\n * Three levels of an item: the model (or the shape) up close, the simple shape at half the segments from `lod1Distance`, and nothing from the distance of its class\n * (a small item goes at 30 m, a large one at 60 m).\n */\nexport function buildItemLod(T: typeof THREE_NS, item: DrawableItem, options: ItemLodOptions = {}): ItemLod {\n const budgets = options.budgets ?? ITEM_BUDGETS\n const cullDistance = cullDistanceOf(item.size, budgets)\n const lod1Distance = options.lod1Distance ?? cullDistance / 3\n const joined = (model: ItemModel): ItemModel => (options.merge === false ? model : mergeItem(T, model))\n const wear = options.wear === undefined ? {} : { wear: options.wear }\n const near = joined(buildItem(T, item, { ...wear, kit: createItemKit(T) }))\n const far = joined(buildItem(T, item, { ...wear, simple: true, detail: budgets.lod1Ratio, kit: createItemKit(T) }))\n const root = new T.LOD()\n root.name = item.id\n root.addLevel(near.root, 0)\n root.addLevel(far.root, lod1Distance)\n root.addLevel(new T.Group(), cullDistance)\n root.userData.wear = options.wear ?? 0\n return { root, near, far, cullDistance, lod1Distance }\n}\n","/**\n * Models of the showcase that go over the triangle budget of their class (400 for a small item, 1200 for a large one) as the team drew them, with the count they have.\n * The page set the budget for the game and drew the models for a showcase; the models stay as delivered (the builder is the team's) and a scene at a distance wears the\n * simple shape of the second level of detail (`buildItemLod`), which is inside the budget. A model that changes its count is a drawing that changed: the test flags it.\n */\nexport const MODEL_BUDGET_DEVIATIONS: Readonly<Record<string, number>> = {\n canned_beans: 744,\n amoxicillin: 596,\n flashlight: 1060,\n portable_radio: 504,\n house_key: 472,\n motorcycle_helmet: 840,\n lpg_cylinder_13kg: 712,\n}\n","import type { Thumbnail } from '@adatechnology/game-contracts'\nimport type * as THREE_NS from 'three'\n\nimport { buildItem } from './build-item'\nimport type { DrawableItem } from './build-item'\nimport { hasItemModel } from './models/registry'\nimport { shade, shapeOf } from './shapes'\nimport type { ShapeId } from './shapes'\nimport { setWear } from './wear'\nimport type { WearStage } from './wear'\n\nconst hex = (color: number): string => `#${(color & 0xffffff).toString(16).padStart(6, '0')}`\nconst DEFAULT_COLOR = 0x8a8f94\nconst STEEL = '#9aa0a6'\nconst BRASS = '#b8913a'\nconst WOOD = '#8a643c'\nconst PAPER = '#ece4d0'\n\n/** The SVG art of each shape on a 64 x 64 board, from the colour of the item (`c`), a darker (`d`) and a lighter (`l`) tone of it. */\nconst ART: Readonly<Record<ShapeId, (c: string, d: string, l: string) => string>> = {\n can: (c, d, l) => `<rect x=\"19\" y=\"13\" width=\"26\" height=\"42\" rx=\"3\" fill=\"${c}\"/><rect x=\"19\" y=\"24\" width=\"26\" height=\"18\" fill=\"${l}\"/><rect x=\"18\" y=\"11\" width=\"28\" height=\"5\" rx=\"2\" fill=\"${STEEL}\"/><rect x=\"18\" y=\"52\" width=\"28\" height=\"4\" rx=\"2\" fill=\"${STEEL}\"/>`,\n bag: (c, d, l) => `<path d=\"M16 55 L13 25 Q32 14 51 25 L48 55 Z\" fill=\"${c}\"/><rect x=\"14\" y=\"17\" width=\"36\" height=\"7\" rx=\"2\" fill=\"${d}\"/><rect x=\"22\" y=\"32\" width=\"20\" height=\"14\" rx=\"2\" fill=\"${l}\"/>`,\n box: (c, d, l) => `<rect x=\"11\" y=\"18\" width=\"42\" height=\"37\" fill=\"${c}\"/><rect x=\"11\" y=\"18\" width=\"42\" height=\"8\" fill=\"${d}\"/><rect x=\"22\" y=\"33\" width=\"20\" height=\"13\" fill=\"${l}\"/>`,\n bottle: (c, d) => `<rect x=\"28\" y=\"7\" width=\"8\" height=\"8\" rx=\"2\" fill=\"${d}\"/><path d=\"M23 56 V30 Q23 23 28 18 H36 Q41 23 41 30 V56 Z\" fill=\"${c}\" fill-opacity=\".75\"/><rect x=\"23\" y=\"34\" width=\"18\" height=\"14\" fill=\"${PAPER}\" fill-opacity=\".9\"/>`,\n tool: (c) => `<rect x=\"29\" y=\"20\" width=\"6\" height=\"37\" rx=\"2\" fill=\"${WOOD}\"/><rect x=\"17\" y=\"9\" width=\"30\" height=\"13\" rx=\"2\" fill=\"${c === '#808080' ? STEEL : c}\"/>`,\n roll: (c, d) => `<circle cx=\"32\" cy=\"34\" r=\"22\" fill=\"${c}\"/><circle cx=\"32\" cy=\"34\" r=\"8\" fill=\"${d}\"/>`,\n dish: (c, d, l) => `<ellipse cx=\"32\" cy=\"44\" rx=\"27\" ry=\"9\" fill=\"${c}\"/><ellipse cx=\"32\" cy=\"42\" rx=\"19\" ry=\"5\" fill=\"${l}\"/><ellipse cx=\"32\" cy=\"42\" rx=\"9\" ry=\"2\" fill=\"${d}\"/>`,\n cloth: (c, d) => `<rect x=\"9\" y=\"34\" width=\"46\" height=\"21\" rx=\"3\" fill=\"${c}\"/><rect x=\"13\" y=\"22\" width=\"38\" height=\"14\" rx=\"3\" fill=\"${d}\"/>`,\n shoe: (c) => `<path d=\"M9 48 V27 H26 L30 36 H47 Q56 38 56 48 Z\" fill=\"${c}\"/><rect x=\"7\" y=\"48\" width=\"50\" height=\"7\" rx=\"2\" fill=\"#22251f\"/>`,\n jar: (c) => `<rect x=\"17\" y=\"22\" width=\"30\" height=\"33\" rx=\"6\" fill=\"${c}\" fill-opacity=\".7\"/><rect x=\"16\" y=\"13\" width=\"32\" height=\"10\" rx=\"2\" fill=\"${BRASS}\"/>`,\n paper: (c, d) => `<rect x=\"14\" y=\"10\" width=\"36\" height=\"46\" fill=\"${PAPER}\"/><rect x=\"19\" y=\"18\" width=\"26\" height=\"3\" fill=\"${d}\"/><rect x=\"19\" y=\"26\" width=\"26\" height=\"3\" fill=\"${d}\"/><rect x=\"19\" y=\"34\" width=\"18\" height=\"3\" fill=\"${d}\"/><rect x=\"19\" y=\"42\" width=\"22\" height=\"3\" fill=\"${c}\"/>`,\n fruit: (c) => `<circle cx=\"32\" cy=\"38\" r=\"18\" fill=\"${c}\"/><rect x=\"31\" y=\"13\" width=\"3\" height=\"9\" fill=\"#5a3a22\"/><path d=\"M34 16 Q44 10 48 16 Q40 20 34 16 Z\" fill=\"#4f7a3a\"/>`,\n cup: (c, d) => `<path d=\"M18 16 H46 L41 56 H23 Z\" fill=\"${c}\"/><rect x=\"18\" y=\"14\" width=\"28\" height=\"4\" fill=\"${d}\"/>`,\n tube: (c, d) => `<path d=\"M23 15 H41 V48 L37 56 H27 L23 48 Z\" fill=\"${c}\"/><rect x=\"25\" y=\"7\" width=\"14\" height=\"9\" rx=\"2\" fill=\"${d}\"/>`,\n blade: () => `<rect x=\"5\" y=\"33\" width=\"18\" height=\"8\" rx=\"2\" fill=\"#3b2a20\"/><path d=\"M23 33 H55 L60 38 L23 42 Z\" fill=\"#a9adb0\"/><rect x=\"22\" y=\"31\" width=\"3\" height=\"12\" fill=\"${BRASS}\"/>`,\n long_tool: (c) => `<rect x=\"5\" y=\"30\" width=\"50\" height=\"5\" rx=\"2\" fill=\"${WOOD}\"/><rect x=\"47\" y=\"21\" width=\"12\" height=\"22\" rx=\"2\" fill=\"${c === '#808080' ? STEEL : c}\"/>`,\n garment: (c, d) => `<path d=\"M20 12 L6 24 L13 33 L20 28 V56 H44 V28 L51 33 L58 24 L44 12 Q32 22 20 12 Z\" fill=\"${c}\"/><path d=\"M20 12 Q32 22 44 12 Q32 28 20 12 Z\" fill=\"${d}\"/>`,\n backpack: (c, d) => `<path d=\"M24 18 Q32 4 40 18\" fill=\"none\" stroke=\"${d}\" stroke-width=\"3\"/><rect x=\"15\" y=\"16\" width=\"34\" height=\"40\" rx=\"9\" fill=\"${c}\"/><rect x=\"21\" y=\"35\" width=\"22\" height=\"16\" rx=\"3\" fill=\"${d}\"/>`,\n jerrycan: (c, d) => `<rect x=\"13\" y=\"17\" width=\"38\" height=\"39\" rx=\"3\" fill=\"${c}\"/><rect x=\"17\" y=\"8\" width=\"16\" height=\"10\" rx=\"2\" fill=\"${d}\"/><rect x=\"39\" y=\"9\" width=\"9\" height=\"9\" fill=\"#d9a441\"/>`,\n tank: (c, d) => `<rect x=\"21\" y=\"18\" width=\"22\" height=\"38\" rx=\"10\" fill=\"${c}\"/><rect x=\"28\" y=\"9\" width=\"8\" height=\"10\" fill=\"${BRASS}\"/><rect x=\"20\" y=\"43\" width=\"24\" height=\"3\" fill=\"${d}\"/>`,\n book: (c, d) => `<rect x=\"14\" y=\"9\" width=\"37\" height=\"47\" fill=\"${c}\"/><rect x=\"14\" y=\"9\" width=\"6\" height=\"47\" fill=\"${d}\"/><rect x=\"23\" y=\"13\" width=\"25\" height=\"39\" fill=\"#e9e1cc\"/>`,\n key: () => `<circle cx=\"16\" cy=\"32\" r=\"9\" fill=\"none\" stroke=\"#9a9da0\" stroke-width=\"5\"/><rect x=\"24\" y=\"30\" width=\"33\" height=\"5\" fill=\"${BRASS}\"/><rect x=\"45\" y=\"35\" width=\"4\" height=\"7\" fill=\"${BRASS}\"/><rect x=\"51\" y=\"35\" width=\"3\" height=\"5\" fill=\"${BRASS}\"/>`,\n battery: (c, d, l) => `<rect x=\"23\" y=\"14\" width=\"18\" height=\"42\" rx=\"2\" fill=\"${c}\"/><rect x=\"28\" y=\"9\" width=\"8\" height=\"6\" fill=\"#b9bdc0\"/><rect x=\"23\" y=\"26\" width=\"18\" height=\"16\" fill=\"${l}\"/><rect x=\"23\" y=\"47\" width=\"18\" height=\"9\" fill=\"${d}\"/>`,\n plank: (c) => `<rect x=\"5\" y=\"26\" width=\"54\" height=\"13\" fill=\"${WOOD}\"/><rect x=\"5\" y=\"30\" width=\"54\" height=\"2\" fill=\"${c === '#808080' ? '#6b4a2c' : c}\" fill-opacity=\".5\"/><circle cx=\"12\" cy=\"32\" r=\"2\" fill=\"#7d8186\"/><circle cx=\"52\" cy=\"32\" r=\"2\" fill=\"#7d8186\"/>`,\n device: (c) => `<rect x=\"15\" y=\"7\" width=\"34\" height=\"50\" rx=\"5\" fill=\"${c}\"/><rect x=\"20\" y=\"13\" width=\"24\" height=\"18\" rx=\"2\" fill=\"#9fbf8a\"/><circle cx=\"26\" cy=\"43\" r=\"4\" fill=\"#b9bdc0\"/><rect x=\"35\" y=\"40\" width=\"9\" height=\"6\" rx=\"1\" fill=\"#b9bdc0\"/>`,\n}\n\n/** The SVG picture of a shape in the colour of an item: a 64 x 64 board with plain shapes, no script and no reference. */\nexport function shapeThumbnailSvg(shape: ShapeId, color: number = DEFAULT_COLOR): string {\n const art = ART[shape]\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\">${art(hex(color), hex(shade(color, 0.7)), hex(shade(color, 1.3)))}</svg>`\n}\n\n/**\n * The picture of an item for catalogues and inventories: an item that has a 3D model asks the host to draw it (`render: true`), every other gets the SVG of its shape in\n * its colour.\n */\nexport function itemThumbnail(item: DrawableItem): Thumbnail {\n if (item.model !== undefined && hasItemModel(item.model)) return { render: true }\n return { svg: shapeThumbnailSvg(shapeOf(item), item.color) }\n}\n\n/** The SVG of an item whatever it has: its shape in its colour (what a host with no renderer shows for a modeled item). */\nexport const itemThumbnailSvg = (item: DrawableItem): string => shapeThumbnailSvg(shapeOf(item), item.color)\n\n/** `{ id: { thumbnail } }` for `createItems({ patch })`, so that a catalog carries its pictures. */\nexport function thumbnailPatch(items: Iterable<DrawableItem>): Record<string, { thumbnail: Thumbnail }> {\n const patch: Record<string, { thumbnail: Thumbnail }> = {}\n for (const item of items) patch[item.id] = { thumbnail: itemThumbnail(item) }\n return patch\n}\n\nexport interface ThumbnailRenderOptions {\n /** Side of the picture in pixels (default 128). */\n size?: number\n /** Turn of the item around y and the lift of the camera, radians (default a three-quarter view from above). */\n yaw?: number\n pitch?: number\n /** Multiplies the distance that just fits the item (default 1). */\n distance?: number\n wear?: WearStage\n}\n\nexport interface ThumbnailScene {\n scene: THREE_NS.Scene\n camera: THREE_NS.PerspectiveCamera\n}\n\nconst FIT_MARGIN = 1.15\nconst FIELD_OF_VIEW = 30\n\n/** The scene and camera that frame an item for its picture: the item at the origin, lit like the showcase (hemisphere, sun, rim), the camera far enough to fit all of it. */\nexport function composeThumbnailScene(T: typeof THREE_NS, item: DrawableItem, options: ThumbnailRenderOptions = {}): ThumbnailScene {\n const { yaw = -0.6, pitch = 0.45, distance = 1, wear = 0 } = options\n const scene = new T.Scene()\n const model = buildItem(T, item)\n if (wear) setWear(model.root, wear)\n scene.add(model.root)\n scene.add(new T.HemisphereLight(0xdfe6ee, 0x3a3428, 0.85))\n const sun = new T.DirectionalLight(0xffe2bf, 1.1)\n sun.position.set(2.5, 3.5, 2.5)\n scene.add(sun)\n const rim = new T.DirectionalLight(0x8fb2d6, 0.45)\n rim.position.set(-3, 1, -2.5)\n scene.add(rim)\n const box = new T.Box3().setFromObject(model.root)\n const centre = box.getCenter(new T.Vector3())\n const radius = box.getSize(new T.Vector3()).length() / 2\n const camera = new T.PerspectiveCamera(FIELD_OF_VIEW, 1, radius / 50, radius * 40)\n const fit = (radius * FIT_MARGIN) / Math.sin((FIELD_OF_VIEW * Math.PI) / 360)\n const away = fit * distance\n camera.position.set(centre.x + away * Math.cos(pitch) * Math.sin(yaw), centre.y + away * Math.sin(pitch), centre.z + away * Math.cos(pitch) * Math.cos(yaw))\n camera.lookAt(centre)\n camera.updateMatrixWorld(true)\n return { scene, camera }\n}\n\n/** What `renderItemThumbnail` needs of a renderer (a `WebGLRenderer`, or anything that draws a scene to a canvas). */\nexport interface ThumbnailRenderer {\n setSize(width: number, height: number): void\n setClearColor?(color: number, alpha?: number): void\n render(scene: THREE_NS.Scene, camera: THREE_NS.Camera): void\n domElement: { toDataURL(type?: string): string }\n}\n\n/** Draws the item with the host's renderer and returns the PNG as a data URL (transparent background). */\nexport function renderItemThumbnail(T: typeof THREE_NS, renderer: ThumbnailRenderer, item: DrawableItem, options: ThumbnailRenderOptions = {}): string {\n const { scene, camera } = composeThumbnailScene(T, item, options)\n const size = options.size ?? 128\n renderer.setSize(size, size)\n renderer.setClearColor?.(0x000000, 0)\n renderer.render(scene, camera)\n return renderer.domElement.toDataURL('image/png')\n}\n","import type * as THREE_NS from 'three'\nimport type { AreaPlacement, BenchChange, ModuleArea, ModuleControl, ModuleHost, ModuleLayer, ModuleMetric, ModuleScenario, TestableItem, TestableModule, Vec3 } from '@adatechnology/game-contracts'\nimport { rng } from '@adatechnology/game-interactables'\nimport { canCraft, craft, createFindsProvider, freshness, ITEM_CATEGORIES } from '@adatechnology/game-items'\nimport type { FindStack, FindsProvider, FindsQuery, ItemDef, ItemsCatalog, RecipeDef } from '@adatechnology/game-items'\n\nimport { ITEM_PREFIX, SHELF_HEIGHT, SHOWCASE_PREFIX, shelvesLayout } from './area-layout'\nimport type { ShelfPlan } from './area-layout'\nimport { buildItem } from './build-item'\nimport type { DrawableItem } from './build-item'\nimport { checkBudget, countDrawCalls, countTriangles, ITEM_BUDGETS } from './budgets'\nimport { MODEL_BUDGET_DEVIATIONS } from './models/deviations'\nimport { itemThumbnailSvg } from './thumbnails'\nimport { hasItemModel, itemModelEntry, listItemModels } from './models/registry'\nimport { setWear } from './wear'\nimport type { WearStage } from './wear'\n\nexport interface ItemsTestModuleOptions {\n /** The catalog to lay out (for example `createGoodsItems()` of `game-items-goods`). The module knows no content of its own. */\n catalog: ItemsCatalog\n /** `en` or `pt-BR` (default). */\n locale?: string\n /** Text of a key such as `item.canned_beans`, `place.house`, `category.food`, `container.fridge`, `recipe.stew` (the goods package has them in `goodsText`); without it the module falls back to the id. */\n translate?: (key: string, locale: string) => string | undefined\n /** Seed of the finds roll (default 1). */\n seed?: number\n /** Wear the items start with: `new` (default), `used` or `spoiled`. */\n wear?: string\n /** The finds provider; default the one of `game-items` over `catalog`. A game gives its own (floorplan bindings, pools). */\n provider?: FindsProvider\n}\n\nexport const SHOWCASE_STAND_ID = 'stand_models'\nexport const RULER_ID = 'ruler_155'\nexport const HUMAN_ID = 'human_180'\nexport const FINDS_TABLE_ID = 'finds_table'\nexport const RULER_HEIGHT = 1.55\nexport const HUMAN_HEIGHT = 1.8\n\nconst STAND = { at: [0, 0, 9.5] as Vec3, radius: 2.1, height: 0.8, ring: 1.35 }\nconst RULER_AT: Vec3 = [-6.5, 0, 9]\nconst HUMAN_AT: Vec3 = [-5.4, 0, 9]\nconst TABLE = { at: [7, 0, 9.5] as Vec3, length: 3.2, depth: 1, height: 0.8 }\nconst WEARS = ['new', 'used', 'spoiled'] as const\nconst WEAR_STAGE: Readonly<Record<string, WearStage>> = { new: 0, used: 1, spoiled: 2 }\nconst SPIN = 0.6\nconst MAX_COPIES = 5\nconst CATEGORY_ALL = 'all'\nconst BOX_COLOR = 0x4fc3f7\nconst HIGHLIGHT = 0x6a3a00\n\ninterface Text {\n group: string\n name: string\n shelf: string\n stand: string\n ruler: string\n human: string\n table: string\n control: Record<'category' | 'wear' | 'age_days' | 'storage' | 'powered' | 'place' | 'container' | 'state' | 'day' | 'seed' | 'roll_finds' | 'recipe' | 'craft', string>\n hint: Record<'age_days' | 'powered' | 'day' | 'roll_finds' | 'craft', string>\n all: string\n wears: Record<(typeof WEARS)[number], string>\n states: Record<'normal' | 'fortified' | 'abandoned', string>\n storages: Record<string, string>\n layers: Record<'labels' | 'boxes' | 'simple_shapes', string>\n metrics: Record<'items' | 'draw_calls' | 'triangles' | 'modeled' | 'finds', string>\n rolled: string\n rolledNothing: string\n crafted: string\n craftMissing: string\n craftEffect: string\n scenarios: Record<'real_size' | 'models' | 'budgets' | 'ruler' | 'finds' | 'freshness' | 'craft', string>\n}\n\nconst TEXT: Record<string, Text> = {\n en: {\n group: 'Items',\n name: 'Items area',\n shelf: 'Shelf of {category}',\n stand: 'Showcase stand of the 3D models',\n ruler: 'Ruler 1.55 m',\n human: 'Human figure 1.80 m',\n table: 'Finds table',\n control: {\n category: 'Category',\n wear: 'Wear',\n age_days: 'Age',\n storage: 'Storage',\n powered: 'Storage has power',\n place: 'Place',\n container: 'Container',\n state: 'State of the place',\n day: 'Outbreak day',\n seed: 'Seed',\n roll_finds: 'Roll finds',\n recipe: 'Recipe',\n craft: 'Craft',\n },\n hint: {\n age_days: 'Days the food has been kept: it spoils by its shelf life, faster or slower by the storage',\n powered: 'A fridge or freezer only keeps the food while it has power',\n day: 'Days since the outbreak: 0 is the normal world',\n roll_finds: 'Draws what the container holds and lays the stacks on the finds table',\n craft: 'Makes the recipe with exactly what it asks for and lays the result on the finds table',\n },\n all: 'All',\n wears: { new: 'New', used: 'Used', spoiled: 'Spoiled' },\n states: { normal: 'Normal', fortified: 'Fortified', abandoned: 'Abandoned' },\n storages: {},\n layers: { labels: 'Labels', boxes: 'Size boxes', simple_shapes: 'Highlight simple shapes' },\n metrics: { items: 'Items shown', draw_calls: 'Draw calls', triangles: 'Triangles', modeled: 'With a team model', finds: 'Stacks on the table' },\n rolled: 'Finds in {container} of {place} ({state}, day {day}): {stacks} stacks',\n rolledNothing: '{container} of {place} holds nothing',\n crafted: 'Crafted {recipe}: {output} ({seconds} s)',\n craftMissing: 'Cannot craft {recipe}: missing {missing}',\n craftEffect: 'effect {effect}',\n scenarios: {\n real_size: 'Every item is drawn at its real size',\n models: 'The 24 models of the team are shipped and draw their items',\n budgets: 'Models and shapes stay within the triangle and draw call budgets',\n ruler: 'The ruler is 1.55 m and the human figure 1.80 m',\n finds: 'The finds roll is the same for the same seed',\n freshness: 'Food spoils with age and the fridge slows it down',\n craft: 'A recipe made with what it asks for gives its output',\n },\n },\n 'pt-BR': {\n group: 'Itens',\n name: 'Área de itens',\n shelf: 'Prateleira de {category}',\n stand: 'Pedestal dos modelos 3D',\n ruler: 'Régua de 1,55 m',\n human: 'Silhueta humana de 1,80 m',\n table: 'Mesa de achados',\n control: {\n category: 'Categoria',\n wear: 'Desgaste',\n age_days: 'Idade',\n storage: 'Armazenamento',\n powered: 'Armazenamento com energia',\n place: 'Lugar',\n container: 'Recipiente',\n state: 'Estado do lugar',\n day: 'Dia do surto',\n seed: 'Semente',\n roll_finds: 'Sortear achados',\n recipe: 'Receita',\n craft: 'Fabricar',\n },\n hint: {\n age_days: 'Dias que a comida ficou guardada: estraga pela validade, mais rápido ou mais devagar conforme onde está',\n powered: 'Geladeira e freezer só conservam enquanto têm energia',\n day: 'Dias desde o surto: 0 é o mundo normal',\n roll_finds: 'Sorteia o que o recipiente guarda e põe as pilhas na mesa de achados',\n craft: 'Faz a receita com exatamente o que ela pede e põe o resultado na mesa de achados',\n },\n all: 'Todas',\n wears: { new: 'Novo', used: 'Usado', spoiled: 'Estragado' },\n states: { normal: 'Normal', fortified: 'Fortificado', abandoned: 'Abandonado' },\n storages: {},\n layers: { labels: 'Rótulos', boxes: 'Caixas de tamanho', simple_shapes: 'Destacar formas simples' },\n metrics: { items: 'Itens à mostra', draw_calls: 'Chamadas de desenho', triangles: 'Triângulos', modeled: 'Com modelo do time', finds: 'Pilhas na mesa' },\n rolled: 'Achados em {container} de {place} ({state}, dia {day}): {stacks} pilhas',\n rolledNothing: '{container} de {place} não tem nada',\n crafted: 'Fabricou {recipe}: {output} ({seconds} s)',\n craftMissing: 'Não dá para fabricar {recipe}: falta {missing}',\n craftEffect: 'efeito {effect}',\n scenarios: {\n real_size: 'Todo item é desenhado no tamanho real',\n models: 'Os 24 modelos do time vêm no kit e desenham os seus itens',\n budgets: 'Modelos e formas ficam dentro do orçamento de triângulos e de chamadas de desenho',\n ruler: 'A régua tem 1,55 m e a silhueta humana 1,80 m',\n finds: 'O sorteio de achados é o mesmo para a mesma semente',\n freshness: 'A comida estraga com a idade e a geladeira atrasa isso',\n craft: 'Uma receita feita com o que ela pede dá o que promete',\n },\n },\n}\nconst textOf = (locale: string): Text => TEXT[locale] ?? (TEXT.en as Text)\nconst fill = (template: string, vars: Record<string, string | number>): string => template.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(vars[key] ?? ''))\nconst humanize = (id: string): string => id.replace(/_/g, ' ').replace(/^./, (c) => c.toUpperCase())\n\n/** What the scenarios of the area ask of the module (and what a host or a test may read). */\nexport interface ItemsAreaState {\n readonly category: string\n readonly wear: string\n readonly ageDays: number\n readonly storage: string\n readonly powered: boolean\n readonly place: string\n readonly container: string\n readonly state: string\n readonly day: number\n readonly seed: number\n readonly recipe: string\n}\n\nexport interface ItemsTestModule extends TestableModule {\n /** Everything the module has put in the scene so far, with what was measured when it was drawn. */\n placed(): ReadonlyArray<{ id: string; itemId: string; group: 'shelf' | 'showcase'; kind: 'model' | 'shape'; size: readonly [number, number, number]; root: THREE_NS.Object3D }>\n /** The stacks now on the finds table. */\n finds(): readonly FindStack[]\n /** The shelves of the layout. */\n shelves(): readonly ShelfPlan[]\n readonly state: ItemsAreaState\n /** The bench actions, callable without a host (what the buttons do). */\n rollFinds(): readonly FindStack[]\n craftSelected(): { ok: boolean; missing: readonly string[] }\n selectRecipe(id: string): void\n /** The box of a drawn object, metres [x, y, z] (needs the host's three.js namespace: null before the module is attached or an item built). */\n measure(root: THREE_NS.Object3D): [number, number, number] | null\n}\n\n/** Wear stage of an item from the age the bench sets: a food past its best turns spoiled, a food getting old turns used. */\nconst stageOf = (catalog: ItemsCatalog, item: ItemDef, base: WearStage, ageDays: number, storage: string, powered: boolean): WearStage => {\n if (item.shelfLife === undefined || ageDays <= 0) return base\n const state = freshness(item, { ageDays: 0, since: 0, storage, storedAt: 0 }, ageDays, { powered, rules: catalog.rules })\n const aged: WearStage = state === 'fresh' ? 0 : state === 'stale' ? 1 : 2\n return Math.max(base, aged) as WearStage\n}\n\nconst sizeOfModel = (id: string): [number, number, number] | undefined => {\n const entry = itemModelEntry(id)\n return entry ? [entry.teamBox[0] * entry.scale, entry.teamBox[1] * entry.scale, entry.teamBox[2] * entry.scale] : undefined\n}\n\n/**\n * The items test area as a `TestableModule` of @adatechnology/game-contracts: every item of a catalog on shelves by category at real size (the real model of the team where there is\n * one, the simple shape of its category elsewhere), a stand where the 24 models turn, a ruler and a human figure to judge the scale, and a table where the finds of a container\n * and the result of a recipe are laid. The bench sets wear, age and storage, the place, container, state, outbreak day and seed of the finds, and the recipe.\n */\nexport function createItemsTestModule(options: ItemsTestModuleOptions): ItemsTestModule {\n const { catalog } = options\n const locale = options.locale ?? 'pt-BR'\n const text = textOf(locale)\n const label = (key: string, fallback: string): string => {\n const found = options.translate?.(key, locale)\n return found !== undefined && found !== key ? found : fallback\n }\n const nameOf = (item: ItemDef): string => label(item.name ?? `item.${item.id}`, label(`item.${item.id}`, humanize(item.id)))\n const categoryName = (id: string): string => label(`category.${id}`, humanize(id))\n const provider = options.provider ?? createFindsProvider(catalog)\n\n const items = catalog.list()\n const categories = [...ITEM_CATEGORIES.map((c) => c.id), ...[...catalog.categories.keys()].filter((id) => !ITEM_CATEGORIES.some((c) => c.id === id))].filter((id) => items.some((item) => item.category === id))\n const shelves = shelvesLayout(items, categories)\n const showcase = listItemModels().map((id) => ({ id, size: sizeOfModel(id) as [number, number, number], def: catalog.has(id) ? catalog.get(id) : undefined }))\n\n const state: { -readonly [K in keyof ItemsAreaState]: ItemsAreaState[K] } = {\n category: CATEGORY_ALL,\n wear: WEARS.includes(options.wear as (typeof WEARS)[number]) ? (options.wear as string) : 'new',\n ageDays: 0,\n storage: catalog.rules.storage.ambient ? 'ambient' : (Object.keys(catalog.rules.storage)[0] ?? 'ambient'),\n powered: true,\n place: catalog.places.has('house') ? 'house' : ([...catalog.places.keys()][0] ?? 'house'),\n container: catalog.containers.has('fridge') ? 'fridge' : ([...catalog.containers.keys()][0] ?? 'fridge'),\n state: 'normal',\n day: 0,\n seed: options.seed ?? 1,\n recipe: [...catalog.recipes.keys()][0] ?? '',\n }\n\n interface Entry {\n id: string\n itemId: string\n group: 'shelf' | 'showcase'\n category: string\n def: ItemDef | undefined\n kind: 'model' | 'shape'\n size: readonly [number, number, number]\n root: THREE_NS.Group\n triangles: number\n drawCalls: number\n }\n const entries: Entry[] = []\n let host: ModuleHost | null = null\n let latestTHREE: typeof THREE_NS | null = null\n let stack: FindStack[] = []\n let findsGroup: THREE_NS.Group | null = null\n let boxes: THREE_NS.Object3D[] = []\n const layers = { labels: true, boxes: false, simple_shapes: false }\n\n const baseStage = (): WearStage => WEAR_STAGE[state.wear] ?? 0\n const stageFor = (def: ItemDef | undefined): WearStage => (def ? stageOf(catalog, def, baseStage(), state.ageDays, state.storage, state.powered) : baseStage())\n\n const drawable = (def: ItemDef): DrawableItem => def\n const register = (entry: Omit<Entry, 'triangles' | 'drawCalls'>): void => {\n entries.push({ ...entry, triangles: countTriangles(entry.root), drawCalls: countDrawCalls(entry.root) })\n }\n\n const shelfItem = (plan: ShelfPlan): TestableItem => ({\n id: plan.id,\n name: fill(text.shelf, { category: categoryName(plan.category) }),\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const wood = new T.MeshStandardMaterial({ color: 0x8a6a45, roughness: 0.85 })\n const frame = new T.MeshStandardMaterial({ color: 0x4a4d52, roughness: 0.7, metalness: 0.3 })\n const top = new T.Mesh(new T.BoxGeometry(plan.length, 0.04, plan.depth), wood)\n top.position.y = SHELF_HEIGHT - 0.02\n group.add(top)\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) {\n const leg = new T.Mesh(new T.BoxGeometry(0.05, SHELF_HEIGHT - 0.04, 0.05), frame)\n leg.position.set((sx * (plan.length - 0.1)) / 2, (SHELF_HEIGHT - 0.04) / 2, (sz * (plan.depth - 0.1)) / 2)\n group.add(leg)\n }\n group.userData.category = plan.category\n group.userData.shelf = true\n shelfRoots.push(group)\n return group\n },\n })\n const shelfRoots: THREE_NS.Group[] = []\n\n const itemOf = (def: ItemDef): TestableItem => ({\n id: `${ITEM_PREFIX}${def.id}`,\n name: nameOf(def),\n movable: true,\n thumbnail: itemThumbnailSvg(drawable(def)),\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n latestTHREE = T\n const model = buildItem(T, drawable(def), { wear: stageFor(def) })\n register({ id: `${ITEM_PREFIX}${def.id}`, itemId: def.id, group: 'shelf', category: def.category, def, kind: model.kind, size: def.size, root: model.root })\n return model.root\n },\n })\n\n const showcaseItem = (model: (typeof showcase)[number]): TestableItem => ({\n id: `${SHOWCASE_PREFIX}${model.id}`,\n name: model.def ? nameOf(model.def) : label(`item.${model.id}`, humanize(model.id)),\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const subject: DrawableItem = { id: model.id, category: model.def?.category ?? '', size: model.size, model: model.id }\n const built = buildItem(T, subject, { wear: stageFor(model.def) })\n register({ id: `${SHOWCASE_PREFIX}${model.id}`, itemId: model.id, group: 'showcase', category: model.def?.category ?? '', def: model.def, kind: built.kind, size: model.size, root: built.root })\n return built.root\n },\n })\n\n const standItem = (): TestableItem => ({\n id: SHOWCASE_STAND_ID,\n name: text.stand,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const base = new T.Mesh(new T.CylinderGeometry(STAND.radius, STAND.radius + 0.1, STAND.height - 0.04, 40), new T.MeshStandardMaterial({ color: 0x3a3d44, roughness: 0.8 }))\n base.position.y = (STAND.height - 0.04) / 2\n const top = new T.Mesh(new T.CylinderGeometry(STAND.radius, STAND.radius, 0.04, 40), new T.MeshStandardMaterial({ color: 0xcfcab8, roughness: 0.6 }))\n top.position.y = STAND.height - 0.02\n group.add(base, top)\n return group\n },\n })\n\n const rulerItem = (): TestableItem => ({\n id: RULER_ID,\n name: text.ruler,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const post = new T.Mesh(new T.BoxGeometry(0.06, RULER_HEIGHT, 0.02), new T.MeshStandardMaterial({ color: 0xe8e2c8, roughness: 0.7 }))\n post.position.y = RULER_HEIGHT / 2\n group.add(post)\n const tick = new T.MeshStandardMaterial({ color: 0x1b1b1b })\n for (let cm = 0; cm <= 155; cm += 5) {\n const long = cm % 10 === 0\n const mark = new T.Mesh(new T.BoxGeometry(long ? 0.05 : 0.03, 0.004, 0.024), tick)\n mark.position.set(0.03 + (long ? 0.025 : 0.015), cm / 100, 0)\n group.add(mark)\n }\n const base = new T.Mesh(new T.BoxGeometry(0.3, 0.03, 0.3), new T.MeshStandardMaterial({ color: 0x55585c }))\n base.position.y = 0.015\n group.add(base)\n group.userData.height = RULER_HEIGHT\n return group\n },\n })\n\n const humanItem = (): TestableItem => ({\n id: HUMAN_ID,\n name: text.human,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const skin = new T.MeshStandardMaterial({ color: 0x9aa3ad, roughness: 0.9 })\n const part = (geometry: THREE_NS.BufferGeometry, x: number, y: number): void => {\n const mesh = new T.Mesh(geometry, skin)\n mesh.position.set(x, y, 0)\n group.add(mesh)\n }\n // 1.80 m: legs to 0.88, torso to 1.50, neck and head to 1.80\n for (const x of [-0.09, 0.09]) part(new T.CylinderGeometry(0.075, 0.06, 0.88, 10), x, 0.44)\n part(new T.BoxGeometry(0.4, 0.62, 0.22), 0, 0.88 + 0.31)\n for (const x of [-0.26, 0.26]) part(new T.CylinderGeometry(0.045, 0.04, 0.6, 8), x, 1.2)\n part(new T.CylinderGeometry(0.05, 0.055, 0.07, 8), 0, 1.535)\n part(new T.SphereGeometry(0.115, 14, 10), 0, 1.685)\n group.userData.height = HUMAN_HEIGHT\n return group\n },\n })\n\n const tableItem = (): TestableItem => ({\n id: FINDS_TABLE_ID,\n name: text.table,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const top = new T.Mesh(new T.BoxGeometry(TABLE.length, 0.05, TABLE.depth), new T.MeshStandardMaterial({ color: 0x7a6a55, roughness: 0.8 }))\n top.position.y = TABLE.height - 0.025\n group.add(top)\n const frame = new T.MeshStandardMaterial({ color: 0x3d3f44 })\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) {\n const leg = new T.Mesh(new T.BoxGeometry(0.06, TABLE.height - 0.05, 0.06), frame)\n leg.position.set((sx * (TABLE.length - 0.12)) / 2, (TABLE.height - 0.05) / 2, (sz * (TABLE.depth - 0.12)) / 2)\n group.add(leg)\n }\n return group\n },\n })\n\n const liveEntries = (): Entry[] => entries.filter((entry) => entry.root.parent !== null)\n const visibleEntries = (): Entry[] => liveEntries().filter((entry) => entry.root.visible)\n\n const applyCategory = (): void => {\n for (const entry of entries) if (entry.group === 'shelf') entry.root.visible = state.category === CATEGORY_ALL || entry.category === state.category\n for (const shelf of shelfRoots) shelf.visible = state.category === CATEGORY_ALL || shelf.userData.category === state.category\n }\n const applyWear = (): void => {\n for (const entry of entries) setWear(entry.root, stageFor(entry.def))\n }\n const applyHighlight = (): void => {\n for (const entry of entries) {\n entry.root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh) return\n for (const material of Array.isArray(mesh.material) ? mesh.material : [mesh.material]) {\n const standard = material as THREE_NS.MeshStandardMaterial\n if (standard.emissive) standard.emissive.setHex(layers.simple_shapes && entry.kind === 'shape' ? HIGHLIGHT : 0x000000)\n }\n })\n }\n }\n const clearBoxes = (): void => {\n for (const box of boxes) {\n box.parent?.remove(box)\n }\n boxes = []\n }\n const applyBoxes = (): void => {\n clearBoxes()\n if (!layers.boxes || !host || !latestTHREE) return\n const T = latestTHREE\n const scene = host.scene as THREE_NS.Scene\n for (const entry of liveEntries()) {\n if (!entry.root.visible) continue\n const box = new T.Box3().setFromObject(entry.root)\n if (box.isEmpty()) continue\n const helper = new T.Box3Helper(box, BOX_COLOR)\n scene.add(helper)\n boxes.push(helper)\n }\n }\n\n const clearFinds = (): void => {\n if (findsGroup) {\n findsGroup.parent?.remove(findsGroup)\n findsGroup = null\n }\n }\n const labelSprite = (T: typeof THREE_NS, content: string): THREE_NS.Sprite | null => {\n if (typeof document === 'undefined') return null\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')\n if (!context) return null\n canvas.width = 256\n canvas.height = 64\n context.fillStyle = 'rgba(15,17,20,0.78)'\n context.fillRect(0, 0, 256, 64)\n context.fillStyle = '#ffffff'\n context.font = '24px sans-serif'\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n context.fillText(content.length > 22 ? `${content.slice(0, 21)}…` : content, 128, 32)\n const texture = new T.CanvasTexture(canvas)\n const sprite = new T.Sprite(new T.SpriteMaterial({ map: texture, depthTest: false, transparent: true }))\n sprite.scale.set(0.5, 0.125, 1)\n sprite.renderOrder = 10\n return sprite\n }\n /** Draws the stacks on the finds table: each item once per unit (up to five) side by side at real size, with a label of its name and count. */\n const showFinds = (): void => {\n clearFinds()\n if (!host || !latestTHREE) return\n const T = latestTHREE\n const group = new T.Group()\n group.position.set(TABLE.at[0], TABLE.height + 0.005, TABLE.at[2])\n let cursor = -TABLE.length / 2 + 0.1\n const scale = 1\n for (const found of stack) {\n const def = catalog.get(found.itemId)\n const copies = Math.min(found.count, MAX_COPIES)\n const start = cursor\n for (let i = 0; i < copies; i++) {\n const model = buildItem(T, drawable(def), { wear: stageFor(def) })\n model.root.position.set(cursor + (def.size[0] * scale) / 2, 0, 0)\n group.add(model.root)\n cursor += def.size[0] + 0.03\n }\n const sprite = labelSprite(T, `${nameOf(def)} x${found.count}`)\n if (sprite) {\n sprite.position.set((start + cursor) / 2, Math.max(def.size[1], 0.1) + 0.12, 0)\n sprite.visible = layers.labels\n sprite.userData.label = true\n group.add(sprite)\n }\n cursor += 0.1\n }\n ;(host.scene as THREE_NS.Scene).add(group)\n findsGroup = group\n }\n const applyLabels = (): void => {\n findsGroup?.traverse((object) => {\n if (object.userData.label) object.visible = layers.labels\n })\n }\n\n const rollFinds = (): readonly FindStack[] => {\n const query: FindsQuery = { place: state.place, container: state.container, state: state.state, rng: rng(state.seed), day: state.day }\n stack = [...(provider.findsFor(query) ?? [])]\n showFinds()\n const container = label(`container.${state.container}`, humanize(state.container))\n const place = label(`place.${state.place}`, humanize(state.place))\n host?.log(stack.length > 0 ? fill(text.rolled, { container, place, state: text.states[state.state as keyof Text['states']] ?? state.state, day: state.day, stacks: stack.length }) : fill(text.rolledNothing, { container, place }), { place: state.place, container: state.container, seed: state.seed })\n return stack\n }\n\n /** What the character needs to make `recipe`: the items, the stations and the tools it asks for, once. */\n const kitFor = (recipe: RecipeDef): { inventory: Map<string, number>; world: Set<string> } => {\n const inventory = new Map<string, number>()\n const world = new Set<string>()\n const add = (id: string, count: number): void => void inventory.set(id, (inventory.get(id) ?? 0) + count)\n for (const input of recipe.inputs) {\n if (input.world) for (const w of input.world) world.add(w)\n else if (input.item !== undefined) add(input.item, input.qty ?? 1)\n else if (input.any?.[0] !== undefined) add(input.any[0], input.qty ?? 1)\n else if (input.match) {\n const pick = catalog.list().find((item) => (input.match?.category === undefined || item.category === input.match.category) && (input.match?.cookable === undefined || item.cookable === input.match.cookable))\n if (pick) add(pick.id, input.qty ?? 1)\n }\n }\n for (const tool of recipe.tools) {\n if (tool.anyOf[0] !== undefined) add(tool.anyOf[0], 1)\n for (const w of tool.world ?? []) world.add(w)\n }\n return { inventory, world }\n }\n const craftSelected = (): { ok: boolean; missing: readonly string[] } => {\n const recipe = catalog.recipes.get(state.recipe)\n if (!recipe) return { ok: false, missing: [state.recipe] }\n const { inventory, world } = kitFor(recipe)\n const fluids: Record<string, number> = {}\n for (const input of recipe.inputs) if (input.fluid !== undefined) fluids[input.fluid] = (fluids[input.fluid] ?? 0) + (input.liters ?? 1)\n const context = { catalog, inventory, world, fluids }\n const name = label(`recipe.${recipe.id}`, humanize(recipe.id))\n const check = canCraft(recipe, context)\n if (!check.isPossible) {\n host?.log(fill(text.craftMissing, { recipe: name, missing: check.missing.join(', ') }), { recipe: recipe.id })\n return { ok: false, missing: check.missing }\n }\n const result = craft(recipe, context, rng(state.seed))\n if (!result.isCrafted) return { ok: false, missing: result.missing }\n if ('item' in result.output) {\n stack = [{ itemId: result.output.item, count: result.output.count }]\n showFinds()\n }\n const output = 'item' in result.output ? `${nameOf(catalog.get(result.output.item))} x${result.output.count}` : fill(text.craftEffect, { effect: result.output.effect })\n host?.log(fill(text.crafted, { recipe: name, output, seconds: result.seconds }), { recipe: recipe.id })\n return { ok: true, missing: [] }\n }\n\n const areaPlacements = (): AreaPlacement[] => {\n const placements: AreaPlacement[] = []\n for (const shelf of shelves) {\n placements.push({ item: shelf.id, position: shelf.position, surface: { halfSize: [shelf.length / 2, shelf.depth / 2], height: SHELF_HEIGHT } }, ...shelf.items)\n }\n placements.push({ item: SHOWCASE_STAND_ID, position: STAND.at, surface: { halfSize: [STAND.radius, STAND.radius], height: STAND.height } })\n showcase.forEach((model, index) => {\n const angle = (index / showcase.length) * Math.PI * 2\n placements.push({ item: `${SHOWCASE_PREFIX}${model.id}`, position: [STAND.at[0] + Math.cos(angle) * STAND.ring, STAND.height + 0.01, STAND.at[2] + Math.sin(angle) * STAND.ring], asleep: true })\n })\n placements.push({ item: RULER_ID, position: RULER_AT }, { item: HUMAN_ID, position: HUMAN_AT })\n placements.push({ item: FINDS_TABLE_ID, position: TABLE.at, surface: { halfSize: [TABLE.length / 2, TABLE.depth / 2], height: TABLE.height } })\n return placements\n }\n\n const onChange = (change: BenchChange): void => {\n if (change.kind === 'layer') {\n if (change.id === 'labels' || change.id === 'boxes' || change.id === 'simple_shapes') layers[change.id] = change.on\n if (change.id === 'labels') applyLabels()\n else if (change.id === 'boxes') applyBoxes()\n else if (change.id === 'simple_shapes') applyHighlight()\n return\n }\n if (change.kind === 'action') {\n if (change.id === 'roll_finds') rollFinds()\n else if (change.id === 'craft') craftSelected()\n return\n }\n const value = change.value\n switch (change.id) {\n case 'category':\n state.category = String(value)\n applyCategory()\n if (layers.boxes) applyBoxes()\n break\n case 'wear':\n state.wear = String(value)\n applyWear()\n break\n case 'age_days':\n state.ageDays = Number(value)\n applyWear()\n break\n case 'storage':\n state.storage = String(value)\n applyWear()\n break\n case 'powered':\n state.powered = Boolean(value)\n applyWear()\n break\n case 'place':\n state.place = String(value)\n break\n case 'container':\n state.container = String(value)\n break\n case 'state':\n state.state = String(value)\n break\n case 'day':\n state.day = Number(value)\n break\n case 'seed':\n state.seed = Number(value)\n break\n case 'recipe':\n state.recipe = String(value)\n break\n }\n }\n\n const choice = (id: keyof Text['control'], values: ReadonlyArray<{ id: string; name: string }>, def: string): ModuleControl => ({ kind: 'choice', id, name: text.control[id], options: values, default: def })\n\n const module: ItemsTestModule = {\n id: 'items_area',\n name: text.name,\n group: text.group,\n state,\n placed: () => entries.map((entry) => ({ id: entry.id, itemId: entry.itemId, group: entry.group, kind: entry.kind, size: entry.size, root: entry.root })),\n finds: () => stack,\n shelves: () => shelves,\n rollFinds,\n craftSelected,\n selectRecipe: (id) => {\n state.recipe = id\n },\n measure: (root) => {\n if (!latestTHREE) return null\n const size = new latestTHREE.Box3().setFromObject(root).getSize(new latestTHREE.Vector3())\n return [size.x, size.y, size.z]\n },\n items: () => [\n ...items.map(itemOf),\n ...shelves.map(shelfItem),\n standItem(),\n ...showcase.map(showcaseItem),\n rulerItem(),\n humanItem(),\n tableItem(),\n ],\n area: (): ModuleArea => ({ placements: areaPlacements(), view: { eye: [0, 5.5, 16], target: [0, 0.8, 0] } }),\n controls: (): ModuleControl[] => [\n choice('category', [{ id: CATEGORY_ALL, name: text.all }, ...categories.map((id) => ({ id, name: categoryName(id) }))], CATEGORY_ALL),\n choice('wear', WEARS.map((id) => ({ id, name: text.wears[id] })), state.wear),\n { kind: 'number', id: 'age_days', name: text.control.age_days, hint: text.hint.age_days, unit: 'd', min: 0, max: 400, step: 5, default: 0 },\n choice('storage', Object.keys(catalog.rules.storage).map((id) => ({ id, name: label(`storage.${id}`, humanize(id)) })), state.storage),\n { kind: 'boolean', id: 'powered', name: text.control.powered, hint: text.hint.powered, default: true },\n choice('place', [...catalog.places.keys()].map((id) => ({ id, name: label(`place.${id}`, humanize(id)) })), state.place),\n choice('container', [...catalog.containers.keys()].map((id) => ({ id, name: label(`container.${id}`, humanize(id)) })), state.container),\n choice('state', (['normal', 'fortified', 'abandoned'] as const).map((id) => ({ id, name: text.states[id] })), 'normal'),\n { kind: 'number', id: 'day', name: text.control.day, hint: text.hint.day, unit: 'd', min: 0, max: 60, step: 1, default: 0 },\n { kind: 'number', id: 'seed', name: text.control.seed, min: 1, max: 9999, step: 1, default: state.seed },\n { kind: 'action', id: 'roll_finds', name: text.control.roll_finds, hint: text.hint.roll_finds },\n ...(state.recipe ? [choice('recipe', [...catalog.recipes.keys()].map((id) => ({ id, name: label(`recipe.${id}`, humanize(id)) })), state.recipe)] : []),\n ...(state.recipe ? [{ kind: 'action', id: 'craft', name: text.control.craft, hint: text.hint.craft } as ModuleControl] : []),\n ],\n layers: (): ModuleLayer[] => [\n { id: 'labels', name: text.layers.labels },\n { id: 'boxes', name: text.layers.boxes, default: false },\n { id: 'simple_shapes', name: text.layers.simple_shapes, default: false },\n ],\n metrics: (): ModuleMetric[] => [\n { id: 'items', name: text.metrics.items, digits: 0, read: () => visibleEntries().length },\n { id: 'draw_calls', name: text.metrics.draw_calls, digits: 0, read: () => visibleEntries().reduce((sum, entry) => sum + entry.drawCalls, 0) },\n { id: 'triangles', name: text.metrics.triangles, digits: 0, read: () => visibleEntries().reduce((sum, entry) => sum + entry.triangles, 0) },\n {\n id: 'modeled',\n name: text.metrics.modeled,\n read: () => {\n const shown = visibleEntries().filter((entry) => entry.group === 'shelf')\n return `${shown.filter((entry) => entry.kind === 'model').length}/${shown.length}`\n },\n },\n { id: 'finds', name: text.metrics.finds, digits: 0, read: () => stack.length },\n ],\n scenarios: (): Array<ModuleScenario<ScenarioLike>> => scenariosOf(module, catalog, text, provider),\n attach(lent) {\n host = lent\n latestTHREE = lent.THREE as typeof THREE_NS\n const offChange = lent.bench?.onChange(onChange)\n const offFrame = lent.onFrame((dt) => {\n for (const entry of entries) if (entry.group === 'showcase' && entry.root.parent) entry.root.rotation.y += dt * SPIN\n })\n return () => {\n offChange?.()\n offFrame()\n clearBoxes()\n clearFinds()\n host = null\n }\n },\n }\n return module\n}\n\n/** What the scenarios use of the context the test room passes (`ScenarioContext`). */\nexport interface ScenarioLike {\n expect(condition: boolean, label: string, data?: Record<string, unknown>): void\n}\n\n/** A drawing never grows past its item's size, and its longest side is within 8% of it (a bag is a little lower than its box). */\nconst OVER = 0.02\nconst UNDER = 0.08\n\nfunction scenariosOf(module: ItemsTestModule, catalog: ItemsCatalog, text: Text, provider: FindsProvider): Array<ModuleScenario<ScenarioLike>> {\n const names = text.scenarios\n const shelf = (): ReturnType<ItemsTestModule['placed']> => module.placed().filter((entry) => entry.group === 'shelf')\n return [\n {\n id: 'real_size',\n name: names.real_size,\n run: ({ expect }) => {\n const shown = shelf()\n expect(shown.length > 0, 'items are on the shelves', { count: shown.length })\n for (const entry of shown) {\n const measured = module.measure(entry.root)\n if (!measured) continue\n const longest = Math.max(...entry.size)\n const axis = entry.size.indexOf(longest)\n const ok = measured.every((side, a) => side <= (entry.size[a] as number) * (1 + OVER) + 0.002) && Math.abs((measured[axis] as number) - longest) <= longest * UNDER + 0.002\n expect(ok, `${entry.itemId} measures its real size`, { measured, size: entry.size })\n }\n },\n },\n {\n id: 'models',\n name: names.models,\n run: ({ expect }) => {\n const models = listItemModels()\n expect(models.length === 24, '24 models are shipped', { count: models.length })\n const withModel = catalog.list().filter((item) => item.model !== undefined && hasItemModel(item.model))\n expect(withModel.length === 23, '23 items of the catalog name a model', { count: withModel.length })\n const stand = module.placed().filter((entry) => entry.group === 'showcase')\n expect(stand.length === 0 || stand.every((entry) => entry.kind === 'model'), 'every piece of the stand is drawn by the model of the team')\n },\n },\n {\n id: 'budgets',\n name: names.budgets,\n run: ({ expect }) => {\n for (const entry of module.placed()) {\n const report = checkBudget(entry.root, entry.size)\n expect(report.drawCalls <= ITEM_BUDGETS.drawCalls, `${entry.itemId} stays within ${ITEM_BUDGETS.drawCalls} draw calls`, { drawCalls: report.drawCalls })\n const deviation = entry.kind === 'model' ? MODEL_BUDGET_DEVIATIONS[entry.itemId] : undefined\n expect(report.ok || (deviation !== undefined && report.triangles <= deviation), `${entry.itemId} stays within its triangle budget`, { triangles: report.triangles, limit: report.limit })\n }\n },\n },\n {\n id: 'ruler',\n name: names.ruler,\n run: ({ expect }) => {\n expect(RULER_HEIGHT === 1.55 && HUMAN_HEIGHT === 1.8, 'the references have the measures of the page')\n },\n },\n {\n id: 'finds',\n name: names.finds,\n run: ({ expect }) => {\n const query = (seed: number): FindsQuery => ({ place: module.state.place, container: module.state.container, state: 'normal', rng: rng(seed), day: 0 })\n const a = JSON.stringify(provider.findsFor(query(7)))\n const b = JSON.stringify(provider.findsFor(query(7)))\n expect(a === b, 'the same seed gives the same finds')\n expect((provider.findsFor(query(7)) ?? []).every((found) => catalog.has(found.itemId)), 'every find is an item of the catalog')\n },\n },\n {\n id: 'freshness',\n name: names.freshness,\n run: ({ expect }) => {\n const food = catalog.list().find((item) => item.shelfLife !== undefined && item.shelfLife > 0)\n if (!food) return expect(false, 'the catalog has a food that spoils')\n const at = (storage: string, days: number): string => freshness(food, { ageDays: 0, since: 0, storage, storedAt: 0 }, days, { rules: catalog.rules })\n const days = (food.shelfLife as number) * 1.2\n expect(at('ambient', days) !== 'fresh', 'at room temperature it is past its best', { food: food.id })\n if ('fridge' in catalog.rules.storage) expect(at('fridge', days) !== at('ambient', days) || at('fridge', days) === 'fresh', 'in the fridge it keeps better', { food: food.id })\n },\n },\n {\n id: 'craft',\n name: names.craft,\n run: ({ expect }) => {\n const before = module.state.recipe\n for (const id of catalog.recipes.keys()) {\n module.selectRecipe(id)\n const result = module.craftSelected()\n expect(result.ok, `recipe ${id} is made with what it asks for`, { missing: result.missing })\n }\n module.selectRecipe(before)\n },\n },\n ]\n}\n","import type { AreaPlacement, Vec3 } from '@adatechnology/game-contracts'\n\n/** What the layout needs of an item: its id, category and real size [width, height, depth] in metres. */\nexport interface LayoutItem {\n readonly id: string\n readonly category: string\n readonly size: readonly [number, number, number]\n}\n\n/** Height of the top of a shelf, metres. */\nexport const SHELF_HEIGHT = 0.9\n/** Longest row of items on a shelf, metres. */\nexport const ROW_LIMIT = 5\nconst GAP = 0.06\nconst EDGE = 0.12\nconst COLUMNS = 4\nconst COLUMN_PITCH = 6.2\nconst ROW_GAP = 1.5\nconst FIRST_Z = -11\n\n/** One shelf: a category's items laid out in rows at real size, the shelf's footprint and where its items sit on its top. */\nexport interface ShelfPlan {\n category: string\n /** Item id of the shelf in the module (`shelf_<category>`). */\n id: string\n /** Footprint on the floor: length along x, depth along z. */\n length: number\n depth: number\n position: Vec3\n /** Where each item sits, in world coordinates. */\n items: AreaPlacement[]\n}\n\nexport const SHELF_PREFIX = 'shelf_'\nexport const ITEM_PREFIX = 'item_'\nexport const SHOWCASE_PREFIX = 'showcase_'\n\ninterface Row {\n items: LayoutItem[]\n width: number\n depth: number\n}\n\nconst rowsOf = (items: readonly LayoutItem[]): Row[] => {\n const rows: Row[] = []\n for (const item of items) {\n const [w, , d] = item.size\n let row = rows[rows.length - 1]\n if (!row || (row.items.length > 0 && row.width + w + GAP > ROW_LIMIT)) {\n row = { items: [], width: 0, depth: 0 }\n rows.push(row)\n }\n row.items.push(item)\n row.width += w + GAP\n row.depth = Math.max(row.depth, d)\n }\n return rows\n}\n\n/**\n * The shelves of the area: one per category, in the order the categories come, with every item of the category side by side at real size, wrapped in rows of at most\n * `ROW_LIMIT` metres. Shelves stand in a grid of four columns; an item that is longer than the row limit gets a row to itself. Pure: the same items always land in the same spots.\n */\nexport function shelvesLayout(items: readonly LayoutItem[], categories: readonly string[]): ShelfPlan[] {\n const plans = categories.flatMap((category) => {\n const own = items.filter((item) => item.category === category)\n if (own.length === 0) return []\n const rows = rowsOf(own)\n const length = Math.max(...rows.map((row) => row.width - GAP)) + 2 * EDGE\n const depth = rows.reduce((sum, row) => sum + row.depth + GAP, 0) - GAP + 2 * EDGE\n return [{ category, rows, length, depth }]\n })\n const result: ShelfPlan[] = []\n let z = FIRST_Z\n for (let start = 0; start < plans.length; start += COLUMNS) {\n const line = plans.slice(start, start + COLUMNS)\n const lineDepth = Math.max(...line.map((plan) => plan.depth))\n line.forEach((plan, column) => {\n const x = (column - (COLUMNS - 1) / 2) * COLUMN_PITCH\n const centre: Vec3 = [x, 0, z + plan.depth / 2]\n const placed: AreaPlacement[] = []\n let rowZ = -plan.depth / 2 + EDGE\n for (const row of plan.rows) {\n let cursor = -plan.length / 2 + EDGE\n for (const item of row.items) {\n const [w, , d] = item.size\n placed.push({ item: `${ITEM_PREFIX}${item.id}`, position: [centre[0] + cursor + w / 2, SHELF_HEIGHT + 0.01, centre[2] + rowZ + d / 2], asleep: true })\n cursor += w + GAP\n }\n rowZ += row.depth + GAP\n }\n result.push({ category: plan.category, id: `${SHELF_PREFIX}${plan.category}`, length: plan.length, depth: plan.depth, position: centre, items: placed })\n })\n z += lineDepth + ROW_GAP\n }\n return result\n}\n"],"mappings":"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","names":["hex","tube","hex","tube","paper","paper","paper","paper","paper","cloth","paper","cloth","cloth","paper","box","DEFAULT_COLOR","box","key","entries","box","tool","days"]}
|
|
1
|
+
{"version":3,"sources":["../src/kit.ts","../src/wear.ts","../src/shapes.ts","../src/data/models.json","../src/models/canned-beans.ts","../src/models/water-bottle.ts","../src/models/rice.ts","../src/models/military-ration.ts","../src/models/cachaca.ts","../src/models/first-aid-kit.ts","../src/models/bandage.ts","../src/models/amoxicillin.ts","../src/models/crowbar.ts","../src/models/hammer.ts","../src/models/machete.ts","../src/models/axe.ts","../src/models/nail-bat.ts","../src/models/hiking-backpack-40l.ts","../src/models/flashlight.ts","../src/models/portable-radio.ts","../src/models/house-key.ts","../src/models/survivor-diary.ts","../src/models/motorcycle-helmet.ts","../src/models/lpg-cylinder-13kg.ts","../src/models/fuel-jerrycan.ts","../src/models/walkie-talkies.ts","../src/models/batteries.ts","../src/models/wooden-plank.ts","../src/models/shipped.ts","../src/models/registry.ts","../src/build-item.ts","../src/merge.ts","../src/budgets.ts","../src/lod.ts","../src/models/deviations.ts","../src/thumbnails.ts","../src/area.ts","../src/area-layout.ts"],"sourcesContent":["import { shapeGeometries } from '@adatechnology/game-shapes-three'\nimport type * as THREE_NS from 'three'\n\ntype Three = typeof THREE_NS\n\n/** The material tags the team's showcase wears: what `setWear` turns toward its spoiled colour. */\nexport const WEAR_TAGS = ['metal', 'wood', 'cloth', 'plastic', 'paper', 'food', 'glass'] as const\nexport type WearTag = (typeof WEAR_TAGS)[number]\n\n/** What a material of the kit remembers so that `setWear` can go back to new: the colour it was made with (as three read it, and as sRGB floats), its tag and its roughness. */\nexport interface ItemMaterialData {\n base: THREE_NS.Color\n baseRgb: readonly [number, number, number]\n tag: string\n rough: number\n}\n\nexport type Vec3Tuple = readonly [number, number, number]\ntype Triple = [number, number, number]\n\n/**\n * The helpers the showcase page defines before its models (`M`, `mesh`, `cyl`, `bx`, `lathe`, `torus`, `extrude`, `G` and the seven material makers), so that the\n * builders ported from the page read the same as the originals. `T` is the three.js the kit was made with, with its box, cylinder, cone, sphere, plane, lathe, torus and\n * (straight-edged) extrude geometries made by game-shapes (`shapeGeometries`: the same bytes, the same classes, a template cache); `materials` lists every material it made,\n * in order.\n */\nexport interface ItemKit {\n readonly T: Three\n readonly materials: THREE_NS.MeshStandardMaterial[]\n M(color: number, tag: string, options?: THREE_NS.MeshStandardMaterialParameters): THREE_NS.MeshStandardMaterial\n mesh(geometry: THREE_NS.BufferGeometry, material: THREE_NS.Material, position?: Vec3Tuple, rotation?: Vec3Tuple, scale?: Vec3Tuple): THREE_NS.Mesh\n cyl(radiusTop: number, radiusBottom: number, height: number, segments?: number): THREE_NS.CylinderGeometry\n bx(width: number, height: number, depth: number): THREE_NS.BoxGeometry\n lathe(points: ReadonlyArray<readonly [number, number]>, segments?: number): THREE_NS.LatheGeometry\n torus(radius: number, tube: number, arc?: number): THREE_NS.TorusGeometry\n extrude(points: ReadonlyArray<readonly [number, number]>, depth: number, bevel?: number): THREE_NS.ExtrudeGeometry\n G(...children: THREE_NS.Object3D[]): THREE_NS.Group\n metal(color: number): THREE_NS.MeshStandardMaterial\n wood(color: number): THREE_NS.MeshStandardMaterial\n cloth(color: number): THREE_NS.MeshStandardMaterial\n plastic(color: number): THREE_NS.MeshStandardMaterial\n paper(color: number): THREE_NS.MeshStandardMaterial\n food(color: number): THREE_NS.MeshStandardMaterial\n glass(color: number, opacity: number): THREE_NS.MeshStandardMaterial\n}\n\n/** The channels of a hex as r128 (the team's three.js) stores them: each one over 255, as given, with no conversion. */\nconst channelsOf = (hex: number): readonly [number, number, number] => [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n\n/** The helpers of the showcase page on a given three.js; every kit has its own list of materials. */\nexport function createItemKit(three: Three): ItemKit {\n const T = shapeGeometries(three)\n const materials: THREE_NS.MeshStandardMaterial[] = []\n const M: ItemKit['M'] = (color, tag, options = {}) => {\n const material = new T.MeshStandardMaterial(Object.assign({ color, roughness: 0.78, metalness: 0 }, options))\n const base = new T.Color(color)\n const data: ItemMaterialData = { base, baseRgb: channelsOf(color), tag, rough: material.roughness }\n material.userData = data\n materials.push(material)\n return material\n }\n const mesh: ItemKit['mesh'] = (geometry, material, position = [0, 0, 0], rotation = [0, 0, 0], scale) => {\n const object = new T.Mesh(geometry, material)\n object.position.set(...(position as Triple))\n object.rotation.set(...(rotation as Triple))\n if (scale) object.scale.set(...(scale as Triple))\n return object\n }\n return {\n T,\n materials,\n M,\n mesh,\n cyl: (radiusTop, radiusBottom, height, segments = 14) => new T.CylinderGeometry(radiusTop, radiusBottom, height, segments),\n bx: (width, height, depth) => new T.BoxGeometry(width, height, depth),\n lathe: (points, segments = 16) => new T.LatheGeometry(points.map(([x, y]) => new T.Vector2(x, y)), segments),\n torus: (radius, tube, arc = Math.PI * 2) => new T.TorusGeometry(radius, tube, 8, 18, arc),\n extrude: (points, depth, bevel = 0.015) => {\n const shape = new T.Shape()\n points.forEach(([x, y], index) => (index ? shape.lineTo(x, y) : shape.moveTo(x, y)))\n return new T.ExtrudeGeometry(shape, { depth, bevelEnabled: true, bevelThickness: bevel, bevelSize: bevel, bevelSegments: 2 })\n },\n G: (...children) => {\n const group = new T.Group()\n children.forEach((child) => group.add(child))\n return group\n },\n metal: (color) => M(color, 'metal', { metalness: 0.55, roughness: 0.45 }),\n wood: (color) => M(color, 'wood'),\n cloth: (color) => M(color, 'cloth', { roughness: 0.95 }),\n plastic: (color) => M(color, 'plastic', { roughness: 0.6 }),\n paper: (color) => M(color, 'paper', { roughness: 0.9 }),\n food: (color) => M(color, 'food', { roughness: 0.85 }),\n glass: (color, opacity) => M(color, 'glass', { roughness: 0.15, metalness: 0.1, transparent: true, opacity }),\n }\n}\n","import type * as THREE_NS from 'three'\n\nimport type { ItemMaterialData } from './kit'\n\n/** 0 new, 1 used, 2 spoiled (the three stages of the showcase). */\nexport type WearStage = 0 | 1 | 2\n\n/** The colour each material tag turns toward as it wears (`STAGE_TARGET` of the showcase). */\nexport const WEAR_TARGET: Readonly<Record<string, number>> = { food: 0x5d6b2e, metal: 0x7a3e1d, wood: 0x3f3326, cloth: 0x4a4033, plastic: 0x6b6556, paper: 0x8a7a52, glass: 0x55503a }\n\n/** How far toward the target colour each stage goes (`AMT`). */\nexport const WEAR_AMOUNT: readonly [number, number, number] = [0, 0.3, 0.62]\n\nconst hexToRgb = (hex: number): readonly [number, number, number] => [((hex >> 16) & 255) / 255, ((hex >> 8) & 255) / 255, (hex & 255) / 255]\n\nconst dataOf = (material: THREE_NS.Material): ItemMaterialData | undefined => {\n const data = material.userData as Partial<ItemMaterialData>\n return data.base && data.baseRgb && data.tag !== undefined && data.rough !== undefined ? (data as ItemMaterialData) : undefined\n}\n\n/** Every material under `root` that the kit made (with a tag), once each. */\nexport function wearableMaterials(root: THREE_NS.Object3D): THREE_NS.MeshStandardMaterial[] {\n const found = new Set<THREE_NS.MeshStandardMaterial>()\n root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh) return\n for (const material of Array.isArray(mesh.material) ? mesh.material : [mesh.material]) if (dataOf(material)) found.add(material as THREE_NS.MeshStandardMaterial)\n })\n return [...found]\n}\n\n/**\n * Sets the wear of an item (`setStage` of the showcase): each material goes from its own colour toward the target of its tag by `WEAR_AMOUNT[stage]`, gets rougher, and\n * metal loses its shine. The colours are mixed in sRGB, as the page mixes them (three r128 had no colour management), so stage 0 is exactly the colour the material was made with.\n * Takes the object or the list of materials of a kit.\n */\nexport function setWear(target: THREE_NS.Object3D | readonly THREE_NS.MeshStandardMaterial[], stage: WearStage): void {\n const materials = 'traverse' in target ? wearableMaterials(target) : target\n if ('traverse' in target) target.userData.wear = stage\n const amount = WEAR_AMOUNT[stage]\n for (const material of materials) {\n const data = dataOf(material)\n if (!data) continue\n const goal = WEAR_TARGET[data.tag]\n if (goal === undefined) continue\n const [tr, tg, tb] = hexToRgb(goal)\n const [r, g, b] = data.baseRgb\n material.color.setRGB(r + (tr - r) * amount, g + (tg - g) * amount, b + (tb - b) * amount, 'srgb')\n material.roughness = Math.min(1, data.rough + (0.2 * stage) / 2)\n if (data.tag === 'metal') material.metalness = Math.max(0.1, 0.55 - 0.2 * stage)\n }\n}\n","import type * as THREE_NS from 'three'\n\nimport type { ItemKit, Vec3Tuple } from './kit'\n\n/** The simple shapes the kit draws at the real size of an item, by the `shape` hint of its definition. */\nexport const SHAPES = [\n 'can', 'bag', 'box', 'bottle', 'tool', 'roll', 'dish', 'cloth', 'shoe', 'jar', 'paper', 'fruit', 'cup', 'tube',\n 'blade', 'long_tool', 'garment', 'backpack', 'jerrycan', 'tank', 'book', 'key', 'battery', 'plank', 'device',\n] as const\nexport type ShapeId = (typeof SHAPES)[number]\n\n/** What a shape drawer is given: the kit, the size in metres, the colour of the item and the level of detail (1 full, 0.5 half the segments). */\nexport interface ShapeContext {\n k: ItemKit\n w: number\n h: number\n d: number\n color: number\n detail: number\n}\ntype Drawer = (c: ShapeContext) => THREE_NS.Group\n\nconst DEFAULT_COLOR = 0x8a8f94\nconst PI = Math.PI\n\n/** The colour `factor` times lighter (above 1) or darker (below 1), per channel. */\nexport function shade(color: number, factor: number): number {\n const channel = (shift: number): number => Math.max(0, Math.min(255, Math.round(((color >> shift) & 255) * factor)))\n return (channel(16) << 16) | (channel(8) << 8) | channel(0)\n}\n\n/** Segments of a round part at a level of detail: never below 5. */\nconst seg = (c: ShapeContext, n: number): number => Math.max(5, Math.round(n * c.detail))\n\n/** The long axis of a size and the three sides in the frame where that axis is x: `L` long, `a` the next, `b` the shortest of the other two in their own order. */\nexport function canonicalFrame(size: Vec3Tuple): { axis: 0 | 1 | 2; L: number; a: number; b: number } {\n const [w, h, d] = size\n if (h >= w && h >= d) return { axis: 1, L: h, a: w, b: d }\n if (d >= w && d >= h) return { axis: 2, L: d, a: h, b: w }\n return { axis: 0, L: w, a: h, b: d }\n}\n\n/** Turns a group drawn with its long side on x so that the long side lies on the given axis. */\nfunction orient(c: ShapeContext, group: THREE_NS.Group, axis: 0 | 1 | 2): THREE_NS.Group {\n if (axis === 0) return group\n const holder = c.k.G(group)\n if (axis === 1) holder.rotation.z = PI / 2\n else holder.rotation.y = -PI / 2\n return holder\n}\n\n/** A shape drawn along x in the frame `(L, a, b)`, then turned onto the long axis of the size. */\nconst alongLong = (draw: (c: ShapeContext, L: number, a: number, b: number) => THREE_NS.Group): Drawer => (c) => {\n const { axis, L, a, b } = canonicalFrame([c.w, c.h, c.d])\n return orient(c, draw(c, L, a, b), axis)\n}\n\n/** A group drawn with a radius of 0.5 and stretched to the width and depth of the item (an oval can fills its box). */\nconst across = (c: ShapeContext, group: THREE_NS.Group): THREE_NS.Group => {\n group.scale.set(c.w, 1, c.d)\n return c.k.G(group)\n}\n\nconst can: Drawer = (c) => {\n const { k, h } = c\n const body = k.metal(0x8d9096)\n return across(c, k.G(k.mesh(k.cyl(0.5, 0.5, h * 0.94, seg(c, 14)), body), k.mesh(k.cyl(0.5, 0.5, h * 0.5, seg(c, 14)), k.food(c.color), [0, 0, 0], [0, 0, 0], [1.0, 1, 1.0]), k.mesh(k.cyl(0.5, 0.5, h * 0.03, seg(c, 14)), body, [0, h * 0.485, 0]), k.mesh(k.cyl(0.5, 0.5, h * 0.03, seg(c, 14)), body, [0, -h * 0.485, 0])))\n}\n\nconst bottle: Drawer = (c) => {\n const { k, h } = c\n const r = 0.5\n const profile: Array<[number, number]> = [[0, -h / 2], [r, -h / 2], [r, h * 0.12], [r * 0.45, h * 0.3], [r * 0.4, h * 0.4], [0, h * 0.4]]\n return across(c, k.G(k.mesh(k.lathe(profile, seg(c, 14)), k.glass(c.color, 0.6)), k.mesh(k.cyl(r * 0.42, r * 0.42, h * 0.1, seg(c, 10)), k.plastic(shade(c.color, 0.5)), [0, h * 0.45, 0])))\n}\n\nconst jar: Drawer = (c) => {\n const { k, h } = c\n return across(c, k.G(k.mesh(k.cyl(0.5, 0.5, h * 0.82, seg(c, 14)), k.glass(c.color, 0.55), [0, -h * 0.09, 0]), k.mesh(k.cyl(0.5, 0.5, h * 0.18, seg(c, 14)), k.metal(0xb8913a), [0, h * 0.41, 0])))\n}\n\nconst bag: Drawer = (c) => {\n const { k, w, h, d } = c\n return k.G(k.mesh(k.bx(w, h * 0.88, d), k.paper(c.color), [0, -h * 0.06, 0]), k.mesh(k.bx(w * 1.0, h * 0.12, d * 0.5), k.paper(shade(c.color, 0.85)), [0, h * 0.44, 0]), k.mesh(k.bx(w * 0.7, h * 0.3, d * 1.0), k.paper(shade(c.color, 1.2)), [0, 0, 0]))\n}\n\nconst box: Drawer = (c) => {\n const { k, w, h, d } = c\n return k.G(k.mesh(k.bx(w, h, d), k.paper(c.color)), k.mesh(k.bx(w, h * 0.12, d), k.paper(shade(c.color, 0.8)), [0, h * 0.44, 0]), k.mesh(k.bx(w * 0.62, h * 0.4, d), k.paper(shade(c.color, 1.25)), [0, -h * 0.02, 0]))\n}\n\nconst cloth: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.cloth(c.color)\n return k.G(k.mesh(k.bx(w, h * 0.55, d), material, [0, -h * 0.225, 0]), k.mesh(k.bx(w * 0.96, h * 0.45, d * 0.96), k.cloth(shade(c.color, 0.9)), [0, h * 0.275, 0]))\n}\n\nconst paper: Drawer = (c) => {\n const { k, w, h, d } = c\n const sheet = k.paper(c.color)\n return k.G(k.mesh(k.bx(w, h / 3, d), sheet, [0, -h / 3, 0]), k.mesh(k.bx(w * 0.98, h / 3, d * 0.98), k.paper(shade(c.color, 0.95)), [0, 0, 0]), k.mesh(k.bx(w, h / 3, d), sheet, [0, h / 3, 0]))\n}\n\nconst fruit: Drawer = (c) => {\n const { k, w, h, d } = c\n const sphere = new k.T.SphereGeometry(0.5, seg(c, 12), seg(c, 8))\n return k.G(k.mesh(sphere, k.food(c.color), [0, -h * 0.04, 0], [0, 0, 0], [w, h * 0.92, d]), k.mesh(k.cyl(h * 0.02, h * 0.02, h * 0.1, 6), k.wood(0x5a3a22), [0, h * 0.45, 0]))\n}\n\nconst dish: Drawer = (c) => {\n const { k, w, h, d } = c\n return k.G(k.mesh(k.cyl(0.5, 0.35, h, seg(c, 16)), k.plastic(c.color), [0, 0, 0], [0, 0, 0], [w, 1, d]))\n}\n\nconst cup: Drawer = (c) => {\n const { k, w, h, d } = c\n const profile: Array<[number, number]> = [[0, -h / 2], [0.38, -h / 2], [0.5, h / 2], [0.44, h / 2], [0.33, -h / 2 + h * 0.06], [0, -h / 2 + h * 0.06]]\n return k.G(k.mesh(k.lathe(profile, seg(c, 14)), k.plastic(c.color), [0, 0, 0], [0, 0, 0], [w, 1, d]))\n}\n\nconst tube: Drawer = (c) => {\n const { k, h } = c\n const material = k.plastic(c.color)\n return across(c, k.G(k.mesh(k.cyl(0.5, 0.42, h * 0.86, seg(c, 12)), material, [0, -h * 0.04, 0]), k.mesh(k.cyl(0.35, 0.35, h * 0.12, seg(c, 12)), k.plastic(shade(c.color, 0.6)), [0, h * 0.44, 0]), k.mesh(k.bx(1, h * 0.06, 0.25), material, [0, -h * 0.47, 0])))\n}\n\nconst roll: Drawer = (c) => {\n const { k, w, h, d } = c\n // the roll lies with its axis along the shortest side; the other two sides are the (oval) section\n const body = k.G(k.mesh(k.cyl(0.5, 0.5, 1, seg(c, 18)), k.paper(c.color)), k.mesh(k.cyl(0.18, 0.18, 0.98, seg(c, 12)), k.paper(0xb59d78)))\n if (h <= w && h <= d) body.scale.set(w, h, d)\n else if (w <= d) {\n body.rotation.z = PI / 2\n body.scale.set(h, w, d)\n } else {\n body.rotation.x = PI / 2\n body.scale.set(w, d, h)\n }\n return k.G(body)\n}\n\nconst shoe: Drawer = (c) => {\n const { k, w, h, d } = c\n const upper = k.cloth(c.color)\n return k.G(k.mesh(k.bx(w, h * 0.22, d), k.plastic(0x22251f), [0, -h * 0.39, 0]), k.mesh(k.bx(w * 0.42, h * 0.78, d * 0.96), upper, [-w * 0.29, h * 0.11, 0]), k.mesh(k.bx(w * 0.5, h * 0.5, d * 0.96), upper, [w * 0.25, -h * 0.03, 0]))\n}\n\nconst tool: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const radius = Math.max(0.004, Math.min(a, b) / 2)\n return k.G(k.mesh(k.cyl(radius, radius, L * 0.74, seg(c, 10)), k.wood(0x8a643c), [-L * 0.13, 0, 0], [0, 0, PI / 2]), k.mesh(k.bx(L * 0.26, a, b), k.metal(shade(c.color, 1)), [L * 0.37, 0, 0]))\n})\n\nconst longTool: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const radius = Math.max(0.004, Math.min(a, b) / 2) * 0.55\n return k.G(k.mesh(k.cyl(radius, radius, L * 0.94, seg(c, 10)), k.wood(0x9a7448), [0, 0, 0], [0, 0, PI / 2]), k.mesh(k.bx(L * 0.12, a, b), k.metal(c.color), [L * 0.44, 0, 0]))\n})\n\nconst blade: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const edge = Math.min(0.0002, b * 0.05)\n const steel = k.extrude([[0, 0], [L * 0.66, 0], [L * 0.68, a * 0.4], [0, a]], Math.max(0.0005, b * 0.4 - 2 * edge), edge)\n return k.G(k.mesh(steel, k.metal(0xa9adb0), [-L * 0.18, -a / 2, -b * 0.2 + edge]), k.mesh(k.bx(L * 0.34, a * 0.6, b), k.wood(0x3b2a20), [-L * 0.33, 0, 0]))\n})\n\nconst garment: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.cloth(c.color)\n return k.G(k.mesh(k.bx(w * 0.56, h, d), material), k.mesh(k.bx(w * 0.22, h * 0.42, d * 0.9), material, [-w * 0.39, h * 0.29, 0]), k.mesh(k.bx(w * 0.22, h * 0.42, d * 0.9), material, [w * 0.39, h * 0.29, 0]))\n}\n\nconst backpack: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.cloth(c.color)\n const dome = new k.T.SphereGeometry(0.5, seg(c, 12), seg(c, 6), 0, PI * 2, 0, PI / 2)\n const strap = k.cloth(shade(c.color, 0.6))\n return k.G(k.mesh(k.bx(w, h * 0.78, d * 0.68), material, [0, -h * 0.11, -d * 0.14]), k.mesh(dome, material, [0, h * 0.28, -d * 0.14], [0, 0, 0], [w, h * 0.44, d * 0.68]), k.mesh(k.bx(w * 0.7, h * 0.4, d * 0.3), k.cloth(shade(c.color, 0.75)), [0, -h * 0.18, d * 0.35]), k.mesh(k.bx(w * 0.1, h * 0.7, d * 0.04), strap, [-w * 0.25, -h * 0.05, -d * 0.48]), k.mesh(k.bx(w * 0.1, h * 0.7, d * 0.04), strap, [w * 0.25, -h * 0.05, -d * 0.48]))\n}\n\nconst jerrycan: Drawer = (c) => {\n const { k, w, h, d } = c\n const material = k.plastic(c.color)\n return k.G(k.mesh(k.bx(w, h * 0.86, d), material, [0, -h * 0.07, 0]), k.mesh(k.bx(w * 0.4, h * 0.1, d * 0.5), material, [-w * 0.2, h * 0.45, 0]), k.mesh(k.cyl(d * 0.14, d * 0.18, h * 0.12, seg(c, 10)), k.plastic(0xd9a441), [w * 0.3, h * 0.44, 0]))\n}\n\nconst tank: Drawer = (c) => {\n const { k, h } = c\n const r = 0.5\n const profile: Array<[number, number]> = [[0, -h / 2], [r * 0.9, -h / 2], [r, -h * 0.4], [r, h * 0.22], [r * 0.6, h * 0.36], [r * 0.2, h * 0.4], [0, h * 0.4]]\n const metal = k.metal(c.color)\n return across(c, k.G(k.mesh(k.lathe(profile, seg(c, 14)), metal), k.mesh(k.cyl(r * 0.62, r * 0.62, h * 0.05, seg(c, 14)), metal, [0, h * 0.3, 0]), k.mesh(k.cyl(r * 0.18, r * 0.18, h * 0.12, seg(c, 8)), k.metal(0xb8913a), [0, h * 0.44, 0])))\n}\n\nconst book: Drawer = (c) => {\n const { k, w, h, d } = c\n const cover = k.paper(c.color)\n return k.G(k.mesh(k.bx(w, h, d * 0.14), cover, [0, 0, d * 0.43]), k.mesh(k.bx(w, h, d * 0.14), cover, [0, 0, -d * 0.43]), k.mesh(k.bx(w * 0.94, h * 0.96, d * 0.72), k.paper(0xe9e1cc), [w * 0.02, 0, 0]), k.mesh(k.bx(w * 0.08, h, d), k.paper(shade(c.color, 0.8)), [-w * 0.46, 0, 0]))\n}\n\nconst key: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const metal = k.metal(0xb8913a)\n const ring = a * 0.5\n const tube = Math.min(b * 0.4, ring * 0.2)\n return k.G(k.mesh(new c.k.T.TorusGeometry(ring * 0.8, tube, 5, seg(c, 10)), k.metal(0x9a9da0), [-L / 2 + ring * 0.8 + tube, 0, 0]), k.mesh(k.bx(L * 0.62, a * 0.28, b), metal, [L * 0.12, 0, 0]), k.mesh(k.bx(L * 0.08, a * 0.22, b), metal, [L * 0.36, -a * 0.2, 0]), k.mesh(k.bx(L * 0.06, a * 0.22, b), metal, [L * 0.2, -a * 0.2, 0]))\n})\n\nconst battery: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const r = Math.min(a, b) / 2\n return k.G(k.mesh(k.cyl(r, r, L * 0.94, seg(c, 14)), k.metal(c.color), [0, 0, 0], [0, 0, PI / 2]), k.mesh(k.cyl(r * 0.36, r * 0.36, L * 0.06, seg(c, 8)), k.metal(0xb9bdc0), [L * 0.47, 0, 0], [0, 0, PI / 2]))\n})\n\nconst plank: Drawer = alongLong((c, L, a, b) => {\n const { k } = c\n const nail = k.metal(0x7d8186)\n return k.G(k.mesh(k.bx(L, a, b), k.wood(0xa88459)), k.mesh(k.cyl(Math.min(a, b) * 0.1, Math.min(a, b) * 0.1, b * 0.98, 6), nail, [-L * 0.4, 0, 0], [PI / 2, 0, 0]), k.mesh(k.cyl(Math.min(a, b) * 0.1, Math.min(a, b) * 0.1, b * 0.98, 6), nail, [L * 0.4, 0, 0], [PI / 2, 0, 0]))\n})\n\nconst device: Drawer = (c) => {\n const { k, w, h, d } = c\n const screen = k.M(0x9fbf8a, 'glass', { emissive: 0x2f4a22, emissiveIntensity: 0.6, roughness: 0.2 })\n return k.G(k.mesh(k.bx(w, h, d * 0.96), k.plastic(c.color), [0, 0, -d * 0.02]), k.mesh(k.bx(w * 0.7, h * 0.32, d * 0.06), screen, [0, h * 0.22, d * 0.47]), k.mesh(k.cyl(Math.min(w, h) * 0.08, Math.min(w, h) * 0.08, d * 0.1, seg(c, 8)), k.metal(0xb9bdc0), [w * 0.25, -h * 0.18, d * 0.45], [PI / 2, 0, 0]))\n}\n\nconst DRAWERS: Readonly<Record<ShapeId, Drawer>> = {\n can, bag, box, bottle, tool, roll, dish, cloth, shoe, jar, paper, fruit, cup, tube, blade, long_tool: longTool, garment, backpack, jerrycan, tank, book, key, battery, plank, device,\n}\n\nexport const isShape = (value: string | undefined): value is ShapeId => value !== undefined && value in DRAWERS\n\n/** The item fields the shape choice reads. */\nexport interface ShapeSubject {\n category: string\n size: Vec3Tuple\n shape?: string\n color?: number\n}\n\n/**\n * The shape an item is drawn with: its own `shape` when it names one of the 25, else a box. The hints the household catalog uses (`tool`, `cloth`, `bag`, `box`, `paper`) are\n * refined by the category and the proportions, so that a rake is a long tool, a jacket a garment, a rucksack a backpack, a phone a device and a diary a book.\n */\nexport function shapeOf(subject: ShapeSubject): ShapeId {\n const hint = subject.shape\n if (!isShape(hint)) return 'box'\n const [w, h, d] = subject.size\n const { L, a, b } = canonicalFrame(subject.size)\n const long = L / Math.max(a, b, 1e-6) >= 4\n const flat = Math.min(w, h, d) / Math.max(w, h, d) <= 0.2\n switch (hint) {\n case 'tool':\n if (subject.category === 'keys') return 'key'\n if (subject.category === 'electronics') return 'device'\n if (long) return subject.category === 'melee' && Math.min(a, b) / L <= 0.1 && flat ? 'blade' : 'long_tool'\n return hint\n case 'cloth':\n return subject.category === 'clothing' ? 'garment' : hint\n case 'bag':\n return subject.category === 'bags' ? 'backpack' : hint\n case 'box':\n if (subject.category === 'electronics') return 'device'\n if (subject.category === 'books') return 'book'\n if (subject.category === 'keys') return 'key'\n return hint\n case 'paper':\n return subject.category === 'books' ? 'book' : hint\n default:\n return hint\n }\n}\n\n/** Draws the simple shape of an item at its real size, centred on the origin (the long side of long shapes lies on the long axis of `size`). */\nexport function drawShape(k: ItemKit, shape: ShapeId, size: Vec3Tuple, options: { color?: number; detail?: number } = {}): THREE_NS.Group {\n const [w, h, d] = size\n return DRAWERS[shape]({ k, w, h, d, color: options.color ?? DEFAULT_COLOR, detail: options.detail ?? 1 })\n}\n","[\n {\n \"id\": \"canned_beans\",\n \"teamId\": \"feijao_lata\",\n \"teamBox\": [\n 0.67,\n 0.57,\n 0.66\n ],\n \"scale\": 0.119403\n },\n {\n \"id\": \"water_bottle\",\n \"teamId\": \"agua_500\",\n \"teamBox\": [\n 0.452,\n 1.25,\n 0.452\n ],\n \"scale\": 0.146018\n },\n {\n \"id\": \"rice\",\n \"teamId\": \"arroz\",\n \"teamBox\": [\n 0.72,\n 1.055,\n 0.3\n ],\n \"scale\": 0.236967\n },\n {\n \"id\": \"military_ration\",\n \"teamId\": \"racao_militar\",\n \"teamBox\": [\n 0.77,\n 1.03,\n 0.235\n ],\n \"scale\": 0.252427\n },\n {\n \"id\": \"cachaca\",\n \"teamId\": \"cachaca\",\n \"teamBox\": [\n 0.552,\n 1.31,\n 0.552\n ],\n \"scale\": 0.163043\n },\n {\n \"id\": \"first_aid_kit\",\n \"teamId\": \"kit_ps\",\n \"teamBox\": [\n 1.07,\n 0.915,\n 0.41\n ],\n \"scale\": 0.233645\n },\n {\n \"id\": \"bandage\",\n \"teamId\": \"atadura\",\n \"teamBox\": [\n 0.9851,\n 0.7575,\n 0.43\n ],\n \"scale\": 0.102528\n },\n {\n \"id\": \"amoxicillin\",\n \"teamId\": \"amoxicilina\",\n \"teamBox\": [\n 0.8859,\n 0.47,\n 0.607\n ],\n \"scale\": 0.11288\n },\n {\n \"id\": \"crowbar\",\n \"teamId\": \"pe_cabra\",\n \"teamBox\": [\n 0.428,\n 1.7087,\n 0.11\n ],\n \"scale\": 0.43893\n },\n {\n \"id\": \"hammer\",\n \"teamId\": \"martelo\",\n \"teamBox\": [\n 0.6487,\n 1.3477,\n 0.19\n ],\n \"scale\": 0.244862\n },\n {\n \"id\": \"machete\",\n \"teamId\": \"facao\",\n \"teamBox\": [\n 1.8759,\n 0.2906,\n 0.12\n ],\n \"scale\": 0.293193\n },\n {\n \"id\": \"axe\",\n \"teamId\": \"machado\",\n \"teamBox\": [\n 0.5952,\n 1.6693,\n 0.14\n ],\n \"scale\": 0.419337\n },\n {\n \"id\": \"nail_bat\",\n \"teamId\": \"taco_pregos\",\n \"teamBox\": [\n 0.4384,\n 1.69,\n 0.4352\n ],\n \"scale\": 0.508876\n },\n {\n \"id\": \"hiking_backpack_40l\",\n \"teamId\": \"mochila_trilha\",\n \"teamBox\": [\n 0.8,\n 1.07,\n 0.62\n ],\n \"scale\": 0.514019\n },\n {\n \"id\": \"flashlight\",\n \"teamId\": \"lanterna\",\n \"teamBox\": [\n 0.38,\n 1.08,\n 0.38\n ],\n \"scale\": 0.148148\n },\n {\n \"id\": \"portable_radio\",\n \"teamId\": \"radio_portatil\",\n \"teamBox\": [\n 1.1041,\n 1.4821,\n 0.35\n ],\n \"scale\": 0.199257\n },\n {\n \"id\": \"house_key\",\n \"teamId\": \"chave_casa\",\n \"teamBox\": [\n 1.5433,\n 0.8305,\n 0.08\n ],\n \"scale\": 0.055077\n },\n {\n \"id\": \"survivor_diary\",\n \"teamId\": \"diario\",\n \"teamBox\": [\n 0.8,\n 1.04,\n 0.27\n ],\n \"scale\": 0.201923\n },\n {\n \"id\": \"motorcycle_helmet\",\n \"teamId\": \"capacete_moto\",\n \"teamBox\": [\n 1.11,\n 1.0825,\n 1.17\n ],\n \"scale\": 0.234234\n },\n {\n \"id\": \"lpg_cylinder_13kg\",\n \"teamId\": \"botijao\",\n \"teamBox\": [\n 0.9257,\n 1.285,\n 0.94\n ],\n \"scale\": 0.381323\n },\n {\n \"id\": \"fuel_jerrycan\",\n \"teamId\": \"galao\",\n \"teamBox\": [\n 0.8788,\n 1.342,\n 0.44\n ],\n \"scale\": 0.350224\n },\n {\n \"id\": \"walkie_talkies\",\n \"teamId\": \"walkie\",\n \"teamBox\": [\n 0.465,\n 1.47,\n 0.22\n ],\n \"scale\": 0.14966\n },\n {\n \"id\": \"batteries\",\n \"teamId\": \"pilha_aa\",\n \"teamBox\": [\n 0.744,\n 1.005,\n 0.344\n ],\n \"scale\": 0.050249\n },\n {\n \"id\": \"wooden_plank\",\n \"teamId\": \"tabua\",\n \"teamBox\": [\n 1.5203,\n 0.4741,\n 0.5377\n ],\n \"scale\": 0.526212\n }\n]\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"feijao_lata\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L145), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `canned_beans`.\n */\nexport const cannedBeans: ItemModelBuilder = ({ mesh, cyl, torus, G, metal, paper, food }) => { const m = metal(0x8d9096); return G(mesh(cyl(.32, .32, .52), m), mesh(cyl(.326, .326, .34, 14), food(0x9b3a24)), mesh(cyl(.33, .33, .06), paper(0xe2c36a), [0, .02, 0]), mesh(torus(.31, .025), m, [0, .26, 0], [Math.PI / 2, 0, 0]), mesh(torus(.31, .025), m, [0, -.26, 0], [Math.PI / 2, 0, 0])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"agua_500\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L146), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `water_bottle`.\n */\nexport const waterBottle: ItemModelBuilder = ({ mesh, cyl, lathe, G, plastic, paper, glass }) => G(mesh(lathe([[0, -.6], [.2, -.6], [.22, -.5], [.22, .2], [.19, .32], [.09, .45], [.08, .55], [0, .55]]), glass(0x8fc3dc, .55)), mesh(cyl(.085, .085, .1, 12), plastic(0x2c5d8a), [0, .6, 0]), mesh(cyl(.225, .225, .22, 16), paper(0xe9ecef), [0, -.15, 0]), mesh(cyl(.226, .226, .05, 16), plastic(0x3a78a8), [0, -.12, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"arroz\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L147), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `rice`.\n */\nexport const rice: ItemModelBuilder = ({ mesh, bx, G, paper, food }) => G(mesh(bx(.7, .95, .28), paper(0xe6dcc0)), mesh(bx(.72, .12, .1), paper(0xd5c9a8), [0, .52, 0]), mesh(bx(.5, .3, .02), food(0xb5521f), [0, .05, .15]), mesh(bx(.3, .1, .02), paper(0x3f7a45), [0, -.25, .15]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"racao_militar\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L148), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `military_ration`.\n */\nexport const militaryRation: ItemModelBuilder = ({ mesh, bx, G, plastic, paper }) => G(mesh(bx(.75, 1, .22), plastic(0x5a6146)), mesh(bx(.77, .1, .23), plastic(0x474d37), [0, .48, 0]), mesh(bx(.5, .14, .01), paper(0x22251f), [0, .18, .115]), mesh(bx(.36, .06, .01), paper(0x22251f), [0, -.02, .115]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"cachaca\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L149), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `cachaca`.\n */\nexport const cachaca: ItemModelBuilder = ({ mesh, cyl, lathe, G, wood, paper, food, glass }) => G(mesh(lathe([[0, -.6], [.25, -.6], [.27, -.52], [.27, .1], [.2, .25], [.09, .35], [.09, .58], [0, .58]]), glass(0xc28a2a, .78)), mesh(cyl(.08, .07, .14, 10), wood(0x8a6a44), [0, .64, 0]), mesh(cyl(.275, .275, .34, 16), paper(0xe9e1cc), [0, -.25, 0]), mesh(cyl(.276, .276, .06, 16), food(0x7a2f1f), [0, -.15, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"kit_ps\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L150), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `first_aid_kit`.\n */\nexport const firstAidKit: ItemModelBuilder = ({ mesh, bx, torus, G, plastic }) => { const r = plastic(0xb23a2c); return G(mesh(bx(1.05, .72, .38), plastic(0xe6e3d8)), mesh(bx(1.07, .06, .4), plastic(0xbdb8aa), [0, 0, 0]), mesh(bx(.36, .1, .02), r, [0, .1, .2]), mesh(bx(.1, .36, .02), r, [0, .1, .2]), mesh(torus(.16, .035, Math.PI), plastic(0x55534c), [0, .36, 0])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"atadura\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L151), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `bandage`.\n */\nexport const bandage: ItemModelBuilder = ({ mesh, cyl, bx, G, cloth }) => { const c = cloth(0xece5d2); return G(mesh(cyl(.34, .34, .38, 18), c, [0, 0, 0], [Math.PI / 2, 0, 0]), mesh(cyl(.1, .1, .4, 12), cloth(0x8a8577), [0, 0, 0], [Math.PI / 2, 0, 0]), mesh(bx(.36, .02, .36), c, [.2, -.33, .05], [0, 0, -.25]), mesh(bx(.3, .02, .36), c, [.5, -.4, .05], [0, 0, -.05])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"amoxicilina\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L152), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `amoxicillin`.\n */\nexport const amoxicillin: ItemModelBuilder = ({ T, mesh, bx, G, metal, plastic, paper }) => G(mesh(bx(.8, .42, .24), paper(0xf0eee6)), mesh(bx(.81, .1, .25), plastic(0x4e7287), [0, .1, 0]), mesh(bx(.6, .04, .3), metal(0xb9bdc0), [.15, -.24, .25], [0, .3, 0]), ...[0, 1, 2, 3].map(k => mesh(new T.SphereGeometry(.05, 10, 8), plastic(0xd9a441), [-.05 + k * .14, -.21, .3], [0, 0, 0], [1, .6, 1])))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"pe_cabra\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L153), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `crowbar`.\n */\nexport const crowbar: ItemModelBuilder = ({ T, mesh, cyl, G, metal }) => { const c = new T.CatmullRomCurve3([[0, -.8, 0], [0, .45, 0], [.02, .62, 0], [.12, .72, 0], [.26, .7, 0], [.32, .6, 0]].map(p => new T.Vector3(...p))); return G(mesh(new T.TubeGeometry(c, 30, .055, 8), metal(0x9b2a1f)), mesh(cyl(.02, .055, .14, 8), metal(0x3a3c3e), [0, -.86, 0])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"martelo\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L154), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `hammer`.\n */\nexport const hammer: ItemModelBuilder = ({ T, mesh, cyl, bx, G, metal, wood, plastic }) => G(mesh(cyl(.05, .065, 1.1, 10), wood(0x8a643c), [0, -.15, 0]), mesh(cyl(.07, .07, .3, 10), plastic(0x22251f), [0, -.6, 0]), mesh(bx(.28, .15, .15), metal(0x55595d), [.05, .45, 0]), mesh(cyl(.08, .08, .1, 12), metal(0x55595d), [.22, .45, 0], [0, 0, Math.PI / 2]), mesh(new T.ConeGeometry(.06, .3, 6), metal(0x55595d), [-.22, .5, .035], [0, 0, 1.9]), mesh(new T.ConeGeometry(.06, .3, 6), metal(0x55595d), [-.22, .5, -.035], [0, 0, 1.9]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"facao\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L155), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `machete`.\n */\nexport const machete: ItemModelBuilder = ({ mesh, cyl, bx, extrude, G, metal, wood }) => G(mesh(extrude([[0, 0], [1.25, .05], [1.4, .14], [1.3, .26], [0, .2]], .03), metal(0xa9adb0), [-.55, 0, 0]), mesh(bx(.45, .2, .1), wood(0x3b2a20), [-.78, .1, .015]), ...[-.9, -.68].map(x => mesh(cyl(.025, .025, .12, 8), metal(0xb8913a), [x, .1, .015], [Math.PI / 2, 0, 0])))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"machado\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L156), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `axe`.\n */\nexport const axe: ItemModelBuilder = ({ M, mesh, cyl, bx, extrude, G, metal, wood }) => G(mesh(cyl(.05, .06, 1.5, 10), wood(0x9a7448), [0, -.1, 0]), mesh(extrude([[0, 0], [.42, -.16], [.5, .05], [.48, .3], [.4, .42], [0, .22]], .07), metal(0x6c7075), [.02, .38, -.05]), mesh(bx(.12, .26, .14), metal(0x4a4d50), [0, .5, 0]), mesh(bx(.1, .2, .08), M(0x9b2a1f, \"plastic\"), [0, .55, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"taco_pregos\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L157), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `nail_bat`.\n */\nexport const nailBat: ItemModelBuilder = ({ mesh, cyl, lathe, G, metal, wood }) => { const g = G(mesh(lathe([[0, -.85], [.05, -.85], [.05, -.8], [.035, -.75], [.04, -.2], [.09, .3], [.11, .7], [.09, .82], [0, .84]], 14), wood(0xb08a5a))); const nm = metal(0x7d8186); for (let k = 0; k < 9; k++) { const a = k * 2.4, y = .25 + (k % 5) * .12; const n = mesh(cyl(.012, .012, .2, 6), nm, [Math.cos(a) * .12, y, Math.sin(a) * .12], [0, 0, 0]); n.lookAt(Math.cos(a) * 2, y, Math.sin(a) * 2); n.rotateX(Math.PI / 2); g.add(n); } return g; }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"mochila_trilha\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L158), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `hiking_backpack_40l`.\n */\nexport const hikingBackpack40L: ItemModelBuilder = ({ T, mesh, bx, G, cloth, plastic }) => { const c = cloth(0x4f6b3a), d = cloth(0x36472a); return G(mesh(bx(.78, .9, .42), c), mesh(new T.SphereGeometry(.4, 14, 8, 0, Math.PI * 2, 0, Math.PI / 2), c, [0, .44, 0], [0, 0, 0], [.98, .45, .53]), mesh(bx(.56, .4, .16), d, [0, -.15, .27]), mesh(bx(.8, .12, .46), d, [0, .2, 0]), mesh(bx(.06, .9, .06), cloth(0x22251f), [-.22, 0, -.24]), mesh(bx(.06, .9, .06), cloth(0x22251f), [.22, 0, -.24]), mesh(bx(.1, .08, .04), plastic(0xd9a441), [0, .2, .24])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"lanterna\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L159), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `flashlight`.\n */\nexport const flashlight: ItemModelBuilder = ({ M, mesh, cyl, bx, torus, G, metal, plastic }) => G(mesh(cyl(.11, .11, .8, 14), metal(0x2a2c2e), [0, -.15, 0]), mesh(cyl(.19, .12, .28, 16), metal(0x3a3d40), [0, .37, 0]), mesh(cyl(.17, .17, .02, 16), M(0xfff1c0, \"glass\", { emissive: 0xffe08a, emissiveIntensity: .9 }), [0, .52, 0]), mesh(bx(.06, .1, .05), plastic(0xb5521f), [0, .05, .11]), ...[-.4, -.3, -.2].map(y => mesh(torus(.112, .012), plastic(0x1b1c1d), [0, y, 0], [Math.PI / 2, 0, 0])))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"radio_portatil\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L160), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `portable_radio`.\n */\nexport const portableRadio: ItemModelBuilder = ({ M, mesh, cyl, bx, torus, G, metal, plastic }) => { const g = G(mesh(bx(1.05, .62, .3), plastic(0x3a3d35)), mesh(cyl(.2, .2, .02, 18), plastic(0x1e1f1b), [-.24, -.04, .16], [Math.PI / 2, 0, 0]), mesh(bx(.36, .14, .02), M(0xd9a441, \"glass\", { emissive: 0x6a4a10, emissiveIntensity: .6 }), [.26, .1, .16]), mesh(cyl(.06, .06, .06, 12), plastic(0x8d8a80), [.18, -.15, .17], [Math.PI / 2, 0, 0]), mesh(cyl(.06, .06, .06, 12), plastic(0x8d8a80), [.36, -.15, .17], [Math.PI / 2, 0, 0]), mesh(torus(.24, .03, Math.PI), plastic(0x22251f), [0, .3, 0])); const a = mesh(cyl(.012, .02, .95, 6), metal(0xb9bdc0), [.4, .72, 0], [0, 0, -.35]); g.add(a); return g; }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"chave_casa\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L161), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `house_key`.\n */\nexport const houseKey: ItemModelBuilder = ({ mesh, bx, torus, extrude, G, metal, plastic }) => { const b = metal(0xb8913a); return G(mesh(torus(.22, .04), metal(0x9a9da0), [-.55, .1, 0]), mesh(extrude([[0, -.2], [.25, -.22], [.3, -.1], [.3, .1], [.25, .22], [0, .2]], .05), b, [-.38, .02, -.025]), mesh(extrude([[0, 0], [.75, 0], [.75, -.08], [.66, -.08], [.66, -.14], [.56, -.08], [.46, -.14], [.4, -.08], [0, -.08]], .035), b, [-.1, .06, -.017]), mesh(bx(.24, .34, .03), plastic(0xb5521f), [-.72, -.28, 0], [0, 0, .25])); }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"diario\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L162), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `survivor_diary`.\n */\nexport const survivorDiary: ItemModelBuilder = ({ mesh, bx, G, cloth, paper }) => G(mesh(bx(.78, 1.02, .05), paper(0x6b3f2a), [0, 0, .1]), mesh(bx(.78, 1.02, .05), paper(0x6b3f2a), [0, 0, -.1]), mesh(bx(.74, .98, .16), paper(0xe9e1cc), [.01, 0, 0]), mesh(bx(.06, 1.02, .25), paper(0x5a3322), [-.38, 0, 0]), mesh(bx(.03, 1.04, .27), cloth(0x22251f), [.25, 0, 0]), mesh(bx(.18, .3, .002), paper(0xd5c9a8), [.05, .2, .126], [0, 0, .08]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"capacete_moto\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L163), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `motorcycle_helmet`.\n */\nexport const motorcycleHelmet: ItemModelBuilder = ({ T, M, mesh, cyl, bx, G, plastic }) => G(mesh(new T.SphereGeometry(.55, 18, 12), plastic(0x2b2f3a), [0, 0, 0], [0, 0, 0], [1, .95, 1.08]), mesh(new T.SphereGeometry(.56, 18, 10, -0.9, 1.8, 1.05, .75), M(0x14171c, \"glass\", { roughness: .15, metalness: .4 }), [0, .02, .02], [0, 0, 0], [1, .95, 1.08]), mesh(bx(.2, .12, .02), plastic(0xe0773f), [.42, .2, .22], [0, .95, 0]), mesh(cyl(.5, .55, .12, 18), plastic(0x1d2028), [0, -.5, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"botijao\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L164), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `lpg_cylinder_13kg`.\n */\nexport const lpgCylinder13Kg: ItemModelBuilder = ({ mesh, cyl, bx, lathe, torus, G, metal }) => G(mesh(lathe([[0, -.6], [.38, -.6], [.42, -.55], [.45, -.3], [.45, .15], [.4, .32], [.28, .42], [.12, .46], [0, .46]], 18), metal(0x355f86)), mesh(cyl(.47, .47, .1, 18), metal(0x29486a), [0, -.62, 0]), mesh(torus(.24, .035), metal(0x29486a), [0, .58, 0], [Math.PI / 2, 0, 0]), mesh(cyl(.07, .07, .14, 10), metal(0xb8913a), [0, .5, 0]), mesh(bx(.04, .2, .04), metal(0x29486a), [.22, .5, 0]), mesh(bx(.04, .2, .04), metal(0x29486a), [-.22, .5, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"galao\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L165), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `fuel_jerrycan`.\n */\nexport const fuelJerrycan: ItemModelBuilder = ({ mesh, cyl, bx, G, plastic }) => G(mesh(bx(.85, 1, .42), plastic(0xa3322a)), mesh(bx(.6, .1, .3), plastic(0x7e2620), [0, .45, 0]), mesh(bx(.36, .2, .1), plastic(0xa3322a), [-.12, .62, 0]), mesh(cyl(.05, .07, .35, 10), plastic(0xd9a441), [.3, .66, 0], [0, 0, -.6]), mesh(bx(.6, .5, .02), plastic(0x8a2a22), [0, -.1, .22]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"walkie\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L166), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `walkie_talkies`.\n */\nexport const walkieTalkies: ItemModelBuilder = ({ M, mesh, cyl, bx, G, plastic }) => G(mesh(bx(.42, .9, .2), plastic(0x2a2d27)), mesh(bx(.34, .3, .02), plastic(0x161814), [0, -.12, .11]), mesh(bx(.24, .12, .02), M(0x9fbf8a, \"glass\", { emissive: 0x2f4a22, emissiveIntensity: .7 }), [0, .22, .11]), mesh(cyl(.035, .045, .6, 8), plastic(0x1b1c1a), [.12, .72, 0]), mesh(cyl(.04, .04, .08, 10), plastic(0xb5521f), [-.12, .48, 0]), mesh(bx(.05, .2, .1), plastic(0x3a3d35), [-.23, .05, 0]))\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"pilha_aa\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L167), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `batteries`.\n */\nexport const batteries: ItemModelBuilder = ({ mesh, cyl, G, metal }) => { const g = G(); [-.2, .2].forEach((x, k) => g.add(mesh(cyl(.17, .17, .95, 16), metal(k ? 0xb5521f : 0x2a2c2e), [x, 0, 0]), mesh(cyl(.172, .172, .3, 16), metal(0xc9a227), [x, .33, 0]), mesh(cyl(.06, .06, .06, 10), metal(0xb9bdc0), [x, .5, 0]))); return g; }\n","import type { ItemModelBuilder } from './registry'\n\n/**\n * `MODELS[\"tabua\"]` of the Itens do Vale Cinzento showcase (`armas-itens__itens-vale-cinzento.js` L168), ported as it is: same units, same parts, same order, same materials by tag.\n * It draws in the units of the page; `data/models.json` gives the scale to metres of the item `wooden_plank`.\n */\nexport const woodenPlank: ItemModelBuilder = ({ mesh, cyl, bx, G, metal, wood }) => { const g = G(); [0xa88459, 0x8e6c45, 0xb49268].forEach((c, k) => g.add(mesh(bx(1.5, .07, .26), wood(c), [0, -.15 + k * .12, (k - 1) * .05], [0, (k - 1) * .12, 0]))); const nm = metal(0x7d8186); [-.5, -.3, .4].forEach((x, k) => g.add(mesh(cyl(.012, .012, .18, 6), nm, [x, .18 + k * .01, .2], [0, 0, (k - 1) * .3]))); return g; }\n","import data from '../data/models.json'\n\nimport { cannedBeans } from './canned-beans'\nimport { waterBottle } from './water-bottle'\nimport { rice } from './rice'\nimport { militaryRation } from './military-ration'\nimport { cachaca } from './cachaca'\nimport { firstAidKit } from './first-aid-kit'\nimport { bandage } from './bandage'\nimport { amoxicillin } from './amoxicillin'\nimport { crowbar } from './crowbar'\nimport { hammer } from './hammer'\nimport { machete } from './machete'\nimport { axe } from './axe'\nimport { nailBat } from './nail-bat'\nimport { hikingBackpack40L } from './hiking-backpack-40l'\nimport { flashlight } from './flashlight'\nimport { portableRadio } from './portable-radio'\nimport { houseKey } from './house-key'\nimport { survivorDiary } from './survivor-diary'\nimport { motorcycleHelmet } from './motorcycle-helmet'\nimport { lpgCylinder13Kg } from './lpg-cylinder-13kg'\nimport { fuelJerrycan } from './fuel-jerrycan'\nimport { walkieTalkies } from './walkie-talkies'\nimport { batteries } from './batteries'\nimport { woodenPlank } from './wooden-plank'\nimport type { ItemModelBuilder, ItemModelEntry } from './registry'\n\n/** The builder of each model of the showcase, by catalog id. */\nconst BUILDERS: Readonly<Record<string, ItemModelBuilder>> = {\n canned_beans: cannedBeans,\n water_bottle: waterBottle,\n rice: rice,\n military_ration: militaryRation,\n cachaca: cachaca,\n first_aid_kit: firstAidKit,\n bandage: bandage,\n amoxicillin: amoxicillin,\n crowbar: crowbar,\n hammer: hammer,\n machete: machete,\n axe: axe,\n nail_bat: nailBat,\n hiking_backpack_40l: hikingBackpack40L,\n flashlight: flashlight,\n portable_radio: portableRadio,\n house_key: houseKey,\n survivor_diary: survivorDiary,\n motorcycle_helmet: motorcycleHelmet,\n lpg_cylinder_13kg: lpgCylinder13Kg,\n fuel_jerrycan: fuelJerrycan,\n walkie_talkies: walkieTalkies,\n batteries: batteries,\n wooden_plank: woodenPlank,\n}\n\n/** The 24 models of the showcase in the page's order: the entry of `data/models.json` (generated by `tools/items-catalog`) and the builder ported from the page. */\nexport const SHIPPED_MODELS: ReadonlyArray<{ readonly entry: ItemModelEntry; readonly builder: ItemModelBuilder }> = (data as unknown as ItemModelEntry[]).map((entry) => {\n const builder = BUILDERS[entry.id]\n if (!builder) throw new Error(`game-items-three: no builder for the model \"${entry.id}\"`)\n return { entry, builder }\n})\n","import type * as THREE_NS from 'three'\n\nimport type { ItemKit } from '../kit'\nimport { SHIPPED_MODELS } from './shipped'\n\n/** One model of the showcase as `data/models.json` keeps it: the item it draws, the id the team gave it, the box it has in the units of the page and the scale to metres. */\nexport interface ItemModelEntry {\n /** Catalog id of the item (`canned_beans`). */\n readonly id: string\n /** The id in the team's `MODELS` (`feijao_lata`). */\n readonly teamId: string\n /** Box of the builder's group in the page's units (`Box3.setFromObject`), x y z. */\n readonly teamBox: readonly [number, number, number]\n /** Metres per unit of the page, from one real measure of the object. */\n readonly scale: number\n}\n\n/** A builder of the showcase, ported as it is: it draws in the page's units and returns the group. */\nexport type ItemModelBuilder = (kit: ItemKit) => THREE_NS.Group\n\nconst entries = new Map<string, ItemModelEntry>(SHIPPED_MODELS.map(({ entry }) => [entry.id, entry]))\nconst builders = new Map<string, ItemModelBuilder>(SHIPPED_MODELS.map(({ entry, builder }) => [entry.id, builder]))\n\n/** Adds (or replaces) the model of an item: `entry.id` is the catalog id the item's `model` field names. */\nexport function registerItemModel(entry: ItemModelEntry, builder: ItemModelBuilder): void {\n entries.set(entry.id, entry)\n builders.set(entry.id, builder)\n}\n\n/** Takes a model out (a game that wants the simple shape instead). */\nexport function unregisterItemModel(id: string): void {\n entries.delete(id)\n builders.delete(id)\n}\n\nexport const itemModelEntry = (id: string): ItemModelEntry | undefined => entries.get(id)\nexport const itemModelBuilder = (id: string): ItemModelBuilder | undefined => builders.get(id)\nexport const hasItemModel = (id: string): boolean => builders.has(id)\n/** The ids of the models registered, in the order of registration (the order of the showcase for the ones the kit ships). */\nexport const listItemModels = (): string[] => [...entries.keys()]\n","import type * as THREE_NS from 'three'\n\nimport { createItemKit } from './kit'\nimport type { ItemKit, Vec3Tuple } from './kit'\nimport { itemModelBuilder, itemModelEntry } from './models/registry'\nimport { drawShape, shapeOf } from './shapes'\nimport type { ShapeId, ShapeSubject } from './shapes'\nimport { setWear } from './wear'\nimport type { WearStage } from './wear'\n\n/** The fields of an item the drawing reads (an `ItemDef` of `game-items` has them all). */\nexport interface DrawableItem extends ShapeSubject {\n id: string\n size: Vec3Tuple\n /** Key of a showcase model; without one (or when the model is not registered) the simple shape is drawn. */\n model?: string\n}\n\nexport interface BuildItemOptions {\n /** Wear of the materials, 0 new (default), 1 used, 2 spoiled. */\n wear?: WearStage\n /** Draw the simple shape even when the item has a model (the second level of detail). */\n simple?: boolean\n /** Level of detail of the simple shape, 1 (default) or 0.5 for half the segments. */\n detail?: number\n /** A kit to draw with (and to collect the materials in); default a new one. */\n kit?: ItemKit\n}\n\n/** What `buildItem` returns. */\nexport interface ItemModel {\n /** The object to add to a scene: origin at the bottom centre of the item, y up, in metres. */\n readonly root: THREE_NS.Group\n /** `model` when the showcase builder drew it, `shape` otherwise. */\n readonly kind: 'model' | 'shape'\n readonly shape?: ShapeId\n /** Size in metres the drawing was fitted to (the item's `size`). */\n readonly size: Vec3Tuple\n /** The materials made for this item. */\n readonly materials: readonly THREE_NS.MeshStandardMaterial[]\n}\n\n/** Moves a group so that its box has the centre of its base at the origin. */\nfunction restOnBase(T: typeof THREE_NS, inner: THREE_NS.Object3D): void {\n const box = new T.Box3().setFromObject(inner)\n const centre = box.getCenter(new T.Vector3())\n inner.position.set(-centre.x, -box.min.y, -centre.z)\n}\n\n/**\n * Draws an item at its real size. An item whose `model` is registered gets the showcase builder, ported as it is (page units, scaled to metres by the scale of\n * `models.json` on the root, so that the group inside is still the team's); every other item gets the simple shape of its `shape` hint (refined by category and\n * proportions) at its `size`. Either way the origin is the bottom centre and y is up.\n */\nexport function buildItem(T: typeof THREE_NS, item: DrawableItem, options: BuildItemOptions = {}): ItemModel {\n const kit = options.kit ?? createItemKit(T)\n const first = kit.materials.length\n const root = new T.Group()\n root.name = item.id\n const entry = item.model === undefined ? undefined : itemModelEntry(item.model)\n const builder = item.model === undefined ? undefined : itemModelBuilder(item.model)\n let kind: ItemModel['kind'] = 'shape'\n let shape: ShapeId | undefined\n if (entry && builder && !options.simple) {\n kind = 'model'\n const inner = builder(kit)\n inner.name = entry.teamId\n root.scale.setScalar(entry.scale)\n root.add(inner)\n restOnBase(T, inner)\n } else {\n shape = shapeOf(item)\n const inner = drawShape(kit, shape, item.size, { ...(item.color === undefined ? {} : { color: item.color }), ...(options.detail === undefined ? {} : { detail: options.detail }) })\n inner.name = shape\n root.add(inner)\n restOnBase(T, inner)\n }\n const materials = kit.materials.slice(first)\n if (options.wear) setWear(materials, options.wear)\n root.userData.wear = options.wear ?? 0\n return { root, kind, ...(shape ? { shape } : {}), size: item.size, materials }\n}\n","import { mergeByMaterial } from '@adatechnology/game-shapes-three'\nimport type * as THREE_NS from 'three'\n\nimport type { ItemModel } from './build-item'\n\n/**\n * The same item with its meshes joined by material: one mesh and one draw call per material instead of one per part (the \"one material for all the items\" of the page's\n * budget, as far as the materials of the kit allow). The materials are the same objects, so `setWear` still reaches them. The model's scale stays on the root.\n */\nexport function mergeItem(T: typeof THREE_NS, model: ItemModel): ItemModel {\n model.root.updateMatrixWorld(true)\n const merged = new T.Group()\n merged.name = model.root.name\n merged.scale.copy(model.root.scale)\n merged.userData = { ...model.root.userData }\n // baked into the space of the root, which leaves the root's own scale out of the geometry\n merged.add(...mergeByMaterial(T, model.root, model.root))\n return { ...model, root: merged }\n}\n","import type * as THREE_NS from 'three'\n\nexport type Vec3Like = readonly [number, number, number]\n\n/** The draw budgets of the Itens do Vale Cinzento page (section \"Desempenho com hordas\"). */\nexport interface ItemBudgets {\n /** Draw calls of all the items in a frame. */\n drawCalls: number\n /** A small item: at most this many triangles, and it disappears at `cullDistance`. */\n small: { triangles: number; cullDistance: number }\n /** A large item. */\n large: { triangles: number; cullDistance: number }\n /** The second level of detail has this share of the triangles of the first. */\n lod1Ratio: number\n /** Longest side (m) from which an item counts as large: the page does not say where small ends, so this is the kit's reading and a game can change it. */\n largeFrom: number\n}\n\nexport const ITEM_BUDGETS: ItemBudgets = {\n drawCalls: 30,\n small: { triangles: 400, cullDistance: 30 },\n large: { triangles: 1200, cullDistance: 60 },\n lod1Ratio: 0.5,\n largeFrom: 0.6,\n}\n\nexport type ItemSizeClass = 'small' | 'large'\n\nexport const sizeClassOf = (size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): ItemSizeClass => (Math.max(...size) >= budgets.largeFrom ? 'large' : 'small')\n\nexport const triangleBudgetOf = (size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): number => budgets[sizeClassOf(size, budgets)].triangles\n\nexport const cullDistanceOf = (size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): number => budgets[sizeClassOf(size, budgets)].cullDistance\n\n/** Triangles under `root`: visible meshes only, indexed or not. */\nexport function countTriangles(root: THREE_NS.Object3D): number {\n let total = 0\n root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh || !mesh.visible) return\n const geometry = mesh.geometry\n total += geometry.index ? geometry.index.count / 3 : geometry.getAttribute('position').count / 3\n })\n return Math.round(total)\n}\n\n/** Draw calls under `root`: one per visible mesh (a mesh with a material list counts once per group). */\nexport function countDrawCalls(root: THREE_NS.Object3D): number {\n let total = 0\n root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh || !mesh.visible) return\n total += Array.isArray(mesh.material) ? Math.max(1, mesh.geometry.groups.length) : 1\n })\n return total\n}\n\nexport interface BudgetReport {\n triangles: number\n limit: number\n drawCalls: number\n sizeClass: ItemSizeClass\n ok: boolean\n}\n\n/** How an item's model measures against its triangle budget (a model of the team above it is a known deviation, not an error). */\nexport function checkBudget(root: THREE_NS.Object3D, size: Vec3Like, budgets: ItemBudgets = ITEM_BUDGETS): BudgetReport {\n const triangles = countTriangles(root)\n const limit = triangleBudgetOf(size, budgets)\n return { triangles, limit, drawCalls: countDrawCalls(root), sizeClass: sizeClassOf(size, budgets), ok: triangles <= limit }\n}\n","import type * as THREE_NS from 'three'\n\nimport { ITEM_BUDGETS, cullDistanceOf } from './budgets'\nimport type { ItemBudgets } from './budgets'\nimport { buildItem } from './build-item'\nimport type { BuildItemOptions, DrawableItem, ItemModel } from './build-item'\nimport { createItemKit } from './kit'\nimport { mergeItem } from './merge'\n\nexport interface ItemLodOptions extends Omit<BuildItemOptions, 'simple' | 'detail' | 'kit'> {\n budgets?: ItemBudgets\n /** Join the meshes of each level by material (default true). */\n merge?: boolean\n /** Distance of the second level in metres; default a third of the distance at which the item disappears. */\n lod1Distance?: number\n}\n\nexport interface ItemLod {\n /** Add this to the scene and call `update(camera)` (or let the renderer do it). */\n readonly root: THREE_NS.LOD\n /** Full detail: the showcase model, or the shape at full segments. */\n readonly near: ItemModel\n /** The simple shape at half the segments. */\n readonly far: ItemModel\n /** Metres from the camera at which the item is no longer drawn. */\n readonly cullDistance: number\n readonly lod1Distance: number\n}\n\n/**\n * Three levels of an item: the model (or the shape) up close, the simple shape at half the segments from `lod1Distance`, and nothing from the distance of its class\n * (a small item goes at 30 m, a large one at 60 m).\n */\nexport function buildItemLod(T: typeof THREE_NS, item: DrawableItem, options: ItemLodOptions = {}): ItemLod {\n const budgets = options.budgets ?? ITEM_BUDGETS\n const cullDistance = cullDistanceOf(item.size, budgets)\n const lod1Distance = options.lod1Distance ?? cullDistance / 3\n const joined = (model: ItemModel): ItemModel => (options.merge === false ? model : mergeItem(T, model))\n const wear = options.wear === undefined ? {} : { wear: options.wear }\n const near = joined(buildItem(T, item, { ...wear, kit: createItemKit(T) }))\n const far = joined(buildItem(T, item, { ...wear, simple: true, detail: budgets.lod1Ratio, kit: createItemKit(T) }))\n const root = new T.LOD()\n root.name = item.id\n root.addLevel(near.root, 0)\n root.addLevel(far.root, lod1Distance)\n root.addLevel(new T.Group(), cullDistance)\n root.userData.wear = options.wear ?? 0\n return { root, near, far, cullDistance, lod1Distance }\n}\n","/**\n * Models of the showcase that go over the triangle budget of their class (400 for a small item, 1200 for a large one) as the team drew them, with the count they have.\n * The page set the budget for the game and drew the models for a showcase; the models stay as delivered (the builder is the team's) and a scene at a distance wears the\n * simple shape of the second level of detail (`buildItemLod`), which is inside the budget. A model that changes its count is a drawing that changed: the test flags it.\n */\nexport const MODEL_BUDGET_DEVIATIONS: Readonly<Record<string, number>> = {\n canned_beans: 744,\n amoxicillin: 596,\n flashlight: 1060,\n portable_radio: 504,\n house_key: 472,\n motorcycle_helmet: 840,\n lpg_cylinder_13kg: 712,\n}\n","import type { Thumbnail } from '@adatechnology/game-contracts'\nimport type * as THREE_NS from 'three'\n\nimport { buildItem } from './build-item'\nimport type { DrawableItem } from './build-item'\nimport { hasItemModel } from './models/registry'\nimport { shade, shapeOf } from './shapes'\nimport type { ShapeId } from './shapes'\nimport { setWear } from './wear'\nimport type { WearStage } from './wear'\n\nconst hex = (color: number): string => `#${(color & 0xffffff).toString(16).padStart(6, '0')}`\nconst DEFAULT_COLOR = 0x8a8f94\nconst STEEL = '#9aa0a6'\nconst BRASS = '#b8913a'\nconst WOOD = '#8a643c'\nconst PAPER = '#ece4d0'\n\n/** The SVG art of each shape on a 64 x 64 board, from the colour of the item (`c`), a darker (`d`) and a lighter (`l`) tone of it. */\nconst ART: Readonly<Record<ShapeId, (c: string, d: string, l: string) => string>> = {\n can: (c, d, l) => `<rect x=\"19\" y=\"13\" width=\"26\" height=\"42\" rx=\"3\" fill=\"${c}\"/><rect x=\"19\" y=\"24\" width=\"26\" height=\"18\" fill=\"${l}\"/><rect x=\"18\" y=\"11\" width=\"28\" height=\"5\" rx=\"2\" fill=\"${STEEL}\"/><rect x=\"18\" y=\"52\" width=\"28\" height=\"4\" rx=\"2\" fill=\"${STEEL}\"/>`,\n bag: (c, d, l) => `<path d=\"M16 55 L13 25 Q32 14 51 25 L48 55 Z\" fill=\"${c}\"/><rect x=\"14\" y=\"17\" width=\"36\" height=\"7\" rx=\"2\" fill=\"${d}\"/><rect x=\"22\" y=\"32\" width=\"20\" height=\"14\" rx=\"2\" fill=\"${l}\"/>`,\n box: (c, d, l) => `<rect x=\"11\" y=\"18\" width=\"42\" height=\"37\" fill=\"${c}\"/><rect x=\"11\" y=\"18\" width=\"42\" height=\"8\" fill=\"${d}\"/><rect x=\"22\" y=\"33\" width=\"20\" height=\"13\" fill=\"${l}\"/>`,\n bottle: (c, d) => `<rect x=\"28\" y=\"7\" width=\"8\" height=\"8\" rx=\"2\" fill=\"${d}\"/><path d=\"M23 56 V30 Q23 23 28 18 H36 Q41 23 41 30 V56 Z\" fill=\"${c}\" fill-opacity=\".75\"/><rect x=\"23\" y=\"34\" width=\"18\" height=\"14\" fill=\"${PAPER}\" fill-opacity=\".9\"/>`,\n tool: (c) => `<rect x=\"29\" y=\"20\" width=\"6\" height=\"37\" rx=\"2\" fill=\"${WOOD}\"/><rect x=\"17\" y=\"9\" width=\"30\" height=\"13\" rx=\"2\" fill=\"${c === '#808080' ? STEEL : c}\"/>`,\n roll: (c, d) => `<circle cx=\"32\" cy=\"34\" r=\"22\" fill=\"${c}\"/><circle cx=\"32\" cy=\"34\" r=\"8\" fill=\"${d}\"/>`,\n dish: (c, d, l) => `<ellipse cx=\"32\" cy=\"44\" rx=\"27\" ry=\"9\" fill=\"${c}\"/><ellipse cx=\"32\" cy=\"42\" rx=\"19\" ry=\"5\" fill=\"${l}\"/><ellipse cx=\"32\" cy=\"42\" rx=\"9\" ry=\"2\" fill=\"${d}\"/>`,\n cloth: (c, d) => `<rect x=\"9\" y=\"34\" width=\"46\" height=\"21\" rx=\"3\" fill=\"${c}\"/><rect x=\"13\" y=\"22\" width=\"38\" height=\"14\" rx=\"3\" fill=\"${d}\"/>`,\n shoe: (c) => `<path d=\"M9 48 V27 H26 L30 36 H47 Q56 38 56 48 Z\" fill=\"${c}\"/><rect x=\"7\" y=\"48\" width=\"50\" height=\"7\" rx=\"2\" fill=\"#22251f\"/>`,\n jar: (c) => `<rect x=\"17\" y=\"22\" width=\"30\" height=\"33\" rx=\"6\" fill=\"${c}\" fill-opacity=\".7\"/><rect x=\"16\" y=\"13\" width=\"32\" height=\"10\" rx=\"2\" fill=\"${BRASS}\"/>`,\n paper: (c, d) => `<rect x=\"14\" y=\"10\" width=\"36\" height=\"46\" fill=\"${PAPER}\"/><rect x=\"19\" y=\"18\" width=\"26\" height=\"3\" fill=\"${d}\"/><rect x=\"19\" y=\"26\" width=\"26\" height=\"3\" fill=\"${d}\"/><rect x=\"19\" y=\"34\" width=\"18\" height=\"3\" fill=\"${d}\"/><rect x=\"19\" y=\"42\" width=\"22\" height=\"3\" fill=\"${c}\"/>`,\n fruit: (c) => `<circle cx=\"32\" cy=\"38\" r=\"18\" fill=\"${c}\"/><rect x=\"31\" y=\"13\" width=\"3\" height=\"9\" fill=\"#5a3a22\"/><path d=\"M34 16 Q44 10 48 16 Q40 20 34 16 Z\" fill=\"#4f7a3a\"/>`,\n cup: (c, d) => `<path d=\"M18 16 H46 L41 56 H23 Z\" fill=\"${c}\"/><rect x=\"18\" y=\"14\" width=\"28\" height=\"4\" fill=\"${d}\"/>`,\n tube: (c, d) => `<path d=\"M23 15 H41 V48 L37 56 H27 L23 48 Z\" fill=\"${c}\"/><rect x=\"25\" y=\"7\" width=\"14\" height=\"9\" rx=\"2\" fill=\"${d}\"/>`,\n blade: () => `<rect x=\"5\" y=\"33\" width=\"18\" height=\"8\" rx=\"2\" fill=\"#3b2a20\"/><path d=\"M23 33 H55 L60 38 L23 42 Z\" fill=\"#a9adb0\"/><rect x=\"22\" y=\"31\" width=\"3\" height=\"12\" fill=\"${BRASS}\"/>`,\n long_tool: (c) => `<rect x=\"5\" y=\"30\" width=\"50\" height=\"5\" rx=\"2\" fill=\"${WOOD}\"/><rect x=\"47\" y=\"21\" width=\"12\" height=\"22\" rx=\"2\" fill=\"${c === '#808080' ? STEEL : c}\"/>`,\n garment: (c, d) => `<path d=\"M20 12 L6 24 L13 33 L20 28 V56 H44 V28 L51 33 L58 24 L44 12 Q32 22 20 12 Z\" fill=\"${c}\"/><path d=\"M20 12 Q32 22 44 12 Q32 28 20 12 Z\" fill=\"${d}\"/>`,\n backpack: (c, d) => `<path d=\"M24 18 Q32 4 40 18\" fill=\"none\" stroke=\"${d}\" stroke-width=\"3\"/><rect x=\"15\" y=\"16\" width=\"34\" height=\"40\" rx=\"9\" fill=\"${c}\"/><rect x=\"21\" y=\"35\" width=\"22\" height=\"16\" rx=\"3\" fill=\"${d}\"/>`,\n jerrycan: (c, d) => `<rect x=\"13\" y=\"17\" width=\"38\" height=\"39\" rx=\"3\" fill=\"${c}\"/><rect x=\"17\" y=\"8\" width=\"16\" height=\"10\" rx=\"2\" fill=\"${d}\"/><rect x=\"39\" y=\"9\" width=\"9\" height=\"9\" fill=\"#d9a441\"/>`,\n tank: (c, d) => `<rect x=\"21\" y=\"18\" width=\"22\" height=\"38\" rx=\"10\" fill=\"${c}\"/><rect x=\"28\" y=\"9\" width=\"8\" height=\"10\" fill=\"${BRASS}\"/><rect x=\"20\" y=\"43\" width=\"24\" height=\"3\" fill=\"${d}\"/>`,\n book: (c, d) => `<rect x=\"14\" y=\"9\" width=\"37\" height=\"47\" fill=\"${c}\"/><rect x=\"14\" y=\"9\" width=\"6\" height=\"47\" fill=\"${d}\"/><rect x=\"23\" y=\"13\" width=\"25\" height=\"39\" fill=\"#e9e1cc\"/>`,\n key: () => `<circle cx=\"16\" cy=\"32\" r=\"9\" fill=\"none\" stroke=\"#9a9da0\" stroke-width=\"5\"/><rect x=\"24\" y=\"30\" width=\"33\" height=\"5\" fill=\"${BRASS}\"/><rect x=\"45\" y=\"35\" width=\"4\" height=\"7\" fill=\"${BRASS}\"/><rect x=\"51\" y=\"35\" width=\"3\" height=\"5\" fill=\"${BRASS}\"/>`,\n battery: (c, d, l) => `<rect x=\"23\" y=\"14\" width=\"18\" height=\"42\" rx=\"2\" fill=\"${c}\"/><rect x=\"28\" y=\"9\" width=\"8\" height=\"6\" fill=\"#b9bdc0\"/><rect x=\"23\" y=\"26\" width=\"18\" height=\"16\" fill=\"${l}\"/><rect x=\"23\" y=\"47\" width=\"18\" height=\"9\" fill=\"${d}\"/>`,\n plank: (c) => `<rect x=\"5\" y=\"26\" width=\"54\" height=\"13\" fill=\"${WOOD}\"/><rect x=\"5\" y=\"30\" width=\"54\" height=\"2\" fill=\"${c === '#808080' ? '#6b4a2c' : c}\" fill-opacity=\".5\"/><circle cx=\"12\" cy=\"32\" r=\"2\" fill=\"#7d8186\"/><circle cx=\"52\" cy=\"32\" r=\"2\" fill=\"#7d8186\"/>`,\n device: (c) => `<rect x=\"15\" y=\"7\" width=\"34\" height=\"50\" rx=\"5\" fill=\"${c}\"/><rect x=\"20\" y=\"13\" width=\"24\" height=\"18\" rx=\"2\" fill=\"#9fbf8a\"/><circle cx=\"26\" cy=\"43\" r=\"4\" fill=\"#b9bdc0\"/><rect x=\"35\" y=\"40\" width=\"9\" height=\"6\" rx=\"1\" fill=\"#b9bdc0\"/>`,\n}\n\n/** The SVG picture of a shape in the colour of an item: a 64 x 64 board with plain shapes, no script and no reference. */\nexport function shapeThumbnailSvg(shape: ShapeId, color: number = DEFAULT_COLOR): string {\n const art = ART[shape]\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\">${art(hex(color), hex(shade(color, 0.7)), hex(shade(color, 1.3)))}</svg>`\n}\n\n/**\n * The picture of an item for catalogues and inventories: an item that has a 3D model asks the host to draw it (`render: true`), every other gets the SVG of its shape in\n * its colour.\n */\nexport function itemThumbnail(item: DrawableItem): Thumbnail {\n if (item.model !== undefined && hasItemModel(item.model)) return { render: true }\n return { svg: shapeThumbnailSvg(shapeOf(item), item.color) }\n}\n\n/** The SVG of an item whatever it has: its shape in its colour (what a host with no renderer shows for a modeled item). */\nexport const itemThumbnailSvg = (item: DrawableItem): string => shapeThumbnailSvg(shapeOf(item), item.color)\n\n/** `{ id: { thumbnail } }` for `createItems({ patch })`, so that a catalog carries its pictures. */\nexport function thumbnailPatch(items: Iterable<DrawableItem>): Record<string, { thumbnail: Thumbnail }> {\n const patch: Record<string, { thumbnail: Thumbnail }> = {}\n for (const item of items) patch[item.id] = { thumbnail: itemThumbnail(item) }\n return patch\n}\n\nexport interface ThumbnailRenderOptions {\n /** Side of the picture in pixels (default 128). */\n size?: number\n /** Turn of the item around y and the lift of the camera, radians (default a three-quarter view from above). */\n yaw?: number\n pitch?: number\n /** Multiplies the distance that just fits the item (default 1). */\n distance?: number\n wear?: WearStage\n}\n\nexport interface ThumbnailScene {\n scene: THREE_NS.Scene\n camera: THREE_NS.PerspectiveCamera\n}\n\nconst FIT_MARGIN = 1.15\nconst FIELD_OF_VIEW = 30\n\n/** The scene and camera that frame an item for its picture: the item at the origin, lit like the showcase (hemisphere, sun, rim), the camera far enough to fit all of it. */\nexport function composeThumbnailScene(T: typeof THREE_NS, item: DrawableItem, options: ThumbnailRenderOptions = {}): ThumbnailScene {\n const { yaw = -0.6, pitch = 0.45, distance = 1, wear = 0 } = options\n const scene = new T.Scene()\n const model = buildItem(T, item)\n if (wear) setWear(model.root, wear)\n scene.add(model.root)\n scene.add(new T.HemisphereLight(0xdfe6ee, 0x3a3428, 0.85))\n const sun = new T.DirectionalLight(0xffe2bf, 1.1)\n sun.position.set(2.5, 3.5, 2.5)\n scene.add(sun)\n const rim = new T.DirectionalLight(0x8fb2d6, 0.45)\n rim.position.set(-3, 1, -2.5)\n scene.add(rim)\n const box = new T.Box3().setFromObject(model.root)\n const centre = box.getCenter(new T.Vector3())\n const radius = box.getSize(new T.Vector3()).length() / 2\n const camera = new T.PerspectiveCamera(FIELD_OF_VIEW, 1, radius / 50, radius * 40)\n const fit = (radius * FIT_MARGIN) / Math.sin((FIELD_OF_VIEW * Math.PI) / 360)\n const away = fit * distance\n camera.position.set(centre.x + away * Math.cos(pitch) * Math.sin(yaw), centre.y + away * Math.sin(pitch), centre.z + away * Math.cos(pitch) * Math.cos(yaw))\n camera.lookAt(centre)\n camera.updateMatrixWorld(true)\n return { scene, camera }\n}\n\n/** What `renderItemThumbnail` needs of a renderer (a `WebGLRenderer`, or anything that draws a scene to a canvas). */\nexport interface ThumbnailRenderer {\n setSize(width: number, height: number): void\n setClearColor?(color: number, alpha?: number): void\n render(scene: THREE_NS.Scene, camera: THREE_NS.Camera): void\n domElement: { toDataURL(type?: string): string }\n}\n\n/** Draws the item with the host's renderer and returns the PNG as a data URL (transparent background). */\nexport function renderItemThumbnail(T: typeof THREE_NS, renderer: ThumbnailRenderer, item: DrawableItem, options: ThumbnailRenderOptions = {}): string {\n const { scene, camera } = composeThumbnailScene(T, item, options)\n const size = options.size ?? 128\n renderer.setSize(size, size)\n renderer.setClearColor?.(0x000000, 0)\n renderer.render(scene, camera)\n return renderer.domElement.toDataURL('image/png')\n}\n","import type * as THREE_NS from 'three'\nimport type { AreaPlacement, BenchChange, ModuleArea, ModuleControl, ModuleHost, ModuleLayer, ModuleMetric, ModuleScenario, TestableItem, TestableModule, Vec3 } from '@adatechnology/game-contracts'\nimport { rng } from '@adatechnology/game-interactables'\nimport { canCraft, craft, createFindsProvider, freshness, ITEM_CATEGORIES } from '@adatechnology/game-items'\nimport type { FindStack, FindsProvider, FindsQuery, ItemDef, ItemsCatalog, RecipeDef } from '@adatechnology/game-items'\n\nimport { ITEM_PREFIX, SHELF_HEIGHT, SHOWCASE_PREFIX, shelvesLayout } from './area-layout'\nimport type { ShelfPlan } from './area-layout'\nimport { buildItem } from './build-item'\nimport type { DrawableItem } from './build-item'\nimport { checkBudget, countDrawCalls, countTriangles, ITEM_BUDGETS } from './budgets'\nimport { MODEL_BUDGET_DEVIATIONS } from './models/deviations'\nimport { itemThumbnailSvg } from './thumbnails'\nimport { hasItemModel, itemModelEntry, listItemModels } from './models/registry'\nimport { setWear } from './wear'\nimport type { WearStage } from './wear'\n\nexport interface ItemsTestModuleOptions {\n /** The catalog to lay out (for example `createGoodsItems()` of `game-items-goods`). The module knows no content of its own. */\n catalog: ItemsCatalog\n /** `en` or `pt-BR` (default). */\n locale?: string\n /** Text of a key such as `item.canned_beans`, `place.house`, `category.food`, `container.fridge`, `recipe.stew` (the goods package has them in `goodsText`); without it the module falls back to the id. */\n translate?: (key: string, locale: string) => string | undefined\n /** Seed of the finds roll (default 1). */\n seed?: number\n /** Wear the items start with: `new` (default), `used` or `spoiled`. */\n wear?: string\n /** The finds provider; default the one of `game-items` over `catalog`. A game gives its own (floorplan bindings, pools). */\n provider?: FindsProvider\n}\n\nexport const SHOWCASE_STAND_ID = 'stand_models'\nexport const RULER_ID = 'ruler_155'\nexport const HUMAN_ID = 'human_180'\nexport const FINDS_TABLE_ID = 'finds_table'\nexport const RULER_HEIGHT = 1.55\nexport const HUMAN_HEIGHT = 1.8\n\nconst STAND = { at: [0, 0, 9.5] as Vec3, radius: 2.1, height: 0.8, ring: 1.35 }\nconst RULER_AT: Vec3 = [-6.5, 0, 9]\nconst HUMAN_AT: Vec3 = [-5.4, 0, 9]\nconst TABLE = { at: [7, 0, 9.5] as Vec3, length: 3.2, depth: 1, height: 0.8 }\nconst WEARS = ['new', 'used', 'spoiled'] as const\nconst WEAR_STAGE: Readonly<Record<string, WearStage>> = { new: 0, used: 1, spoiled: 2 }\nconst SPIN = 0.6\nconst MAX_COPIES = 5\nconst CATEGORY_ALL = 'all'\nconst BOX_COLOR = 0x4fc3f7\nconst HIGHLIGHT = 0x6a3a00\n\ninterface Text {\n group: string\n name: string\n shelf: string\n stand: string\n ruler: string\n human: string\n table: string\n control: Record<'category' | 'wear' | 'age_days' | 'storage' | 'powered' | 'place' | 'container' | 'state' | 'day' | 'seed' | 'roll_finds' | 'recipe' | 'craft', string>\n hint: Record<'age_days' | 'powered' | 'day' | 'roll_finds' | 'craft', string>\n all: string\n wears: Record<(typeof WEARS)[number], string>\n states: Record<'normal' | 'fortified' | 'abandoned', string>\n storages: Record<string, string>\n layers: Record<'labels' | 'boxes' | 'simple_shapes', string>\n metrics: Record<'items' | 'draw_calls' | 'triangles' | 'modeled' | 'finds', string>\n rolled: string\n rolledNothing: string\n crafted: string\n craftMissing: string\n craftEffect: string\n scenarios: Record<'real_size' | 'models' | 'budgets' | 'ruler' | 'finds' | 'freshness' | 'craft', string>\n}\n\nconst TEXT: Record<string, Text> = {\n en: {\n group: 'Items',\n name: 'Items area',\n shelf: 'Shelf of {category}',\n stand: 'Showcase stand of the 3D models',\n ruler: 'Ruler 1.55 m',\n human: 'Human figure 1.80 m',\n table: 'Finds table',\n control: {\n category: 'Category',\n wear: 'Wear',\n age_days: 'Age',\n storage: 'Storage',\n powered: 'Storage has power',\n place: 'Place',\n container: 'Container',\n state: 'State of the place',\n day: 'Outbreak day',\n seed: 'Seed',\n roll_finds: 'Roll finds',\n recipe: 'Recipe',\n craft: 'Craft',\n },\n hint: {\n age_days: 'Days the food has been kept: it spoils by its shelf life, faster or slower by the storage',\n powered: 'A fridge or freezer only keeps the food while it has power',\n day: 'Days since the outbreak: 0 is the normal world',\n roll_finds: 'Draws what the container holds and lays the stacks on the finds table',\n craft: 'Makes the recipe with exactly what it asks for and lays the result on the finds table',\n },\n all: 'All',\n wears: { new: 'New', used: 'Used', spoiled: 'Spoiled' },\n states: { normal: 'Normal', fortified: 'Fortified', abandoned: 'Abandoned' },\n storages: {},\n layers: { labels: 'Labels', boxes: 'Size boxes', simple_shapes: 'Highlight simple shapes' },\n metrics: { items: 'Items shown', draw_calls: 'Draw calls', triangles: 'Triangles', modeled: 'With a team model', finds: 'Stacks on the table' },\n rolled: 'Finds in {container} of {place} ({state}, day {day}): {stacks} stacks',\n rolledNothing: '{container} of {place} holds nothing',\n crafted: 'Crafted {recipe}: {output} ({seconds} s)',\n craftMissing: 'Cannot craft {recipe}: missing {missing}',\n craftEffect: 'effect {effect}',\n scenarios: {\n real_size: 'Every item is drawn at its real size',\n models: 'The 24 models of the team are shipped and draw their items',\n budgets: 'Models and shapes stay within the triangle and draw call budgets',\n ruler: 'The ruler is 1.55 m and the human figure 1.80 m',\n finds: 'The finds roll is the same for the same seed',\n freshness: 'Food spoils with age and the fridge slows it down',\n craft: 'A recipe made with what it asks for gives its output',\n },\n },\n 'pt-BR': {\n group: 'Itens',\n name: 'Área de itens',\n shelf: 'Prateleira de {category}',\n stand: 'Pedestal dos modelos 3D',\n ruler: 'Régua de 1,55 m',\n human: 'Silhueta humana de 1,80 m',\n table: 'Mesa de achados',\n control: {\n category: 'Categoria',\n wear: 'Desgaste',\n age_days: 'Idade',\n storage: 'Armazenamento',\n powered: 'Armazenamento com energia',\n place: 'Lugar',\n container: 'Recipiente',\n state: 'Estado do lugar',\n day: 'Dia do surto',\n seed: 'Semente',\n roll_finds: 'Sortear achados',\n recipe: 'Receita',\n craft: 'Fabricar',\n },\n hint: {\n age_days: 'Dias que a comida ficou guardada: estraga pela validade, mais rápido ou mais devagar conforme onde está',\n powered: 'Geladeira e freezer só conservam enquanto têm energia',\n day: 'Dias desde o surto: 0 é o mundo normal',\n roll_finds: 'Sorteia o que o recipiente guarda e põe as pilhas na mesa de achados',\n craft: 'Faz a receita com exatamente o que ela pede e põe o resultado na mesa de achados',\n },\n all: 'Todas',\n wears: { new: 'Novo', used: 'Usado', spoiled: 'Estragado' },\n states: { normal: 'Normal', fortified: 'Fortificado', abandoned: 'Abandonado' },\n storages: {},\n layers: { labels: 'Rótulos', boxes: 'Caixas de tamanho', simple_shapes: 'Destacar formas simples' },\n metrics: { items: 'Itens à mostra', draw_calls: 'Chamadas de desenho', triangles: 'Triângulos', modeled: 'Com modelo do time', finds: 'Pilhas na mesa' },\n rolled: 'Achados em {container} de {place} ({state}, dia {day}): {stacks} pilhas',\n rolledNothing: '{container} de {place} não tem nada',\n crafted: 'Fabricou {recipe}: {output} ({seconds} s)',\n craftMissing: 'Não dá para fabricar {recipe}: falta {missing}',\n craftEffect: 'efeito {effect}',\n scenarios: {\n real_size: 'Todo item é desenhado no tamanho real',\n models: 'Os 24 modelos do time vêm no kit e desenham os seus itens',\n budgets: 'Modelos e formas ficam dentro do orçamento de triângulos e de chamadas de desenho',\n ruler: 'A régua tem 1,55 m e a silhueta humana 1,80 m',\n finds: 'O sorteio de achados é o mesmo para a mesma semente',\n freshness: 'A comida estraga com a idade e a geladeira atrasa isso',\n craft: 'Uma receita feita com o que ela pede dá o que promete',\n },\n },\n}\nconst textOf = (locale: string): Text => TEXT[locale] ?? (TEXT.en as Text)\nconst fill = (template: string, vars: Record<string, string | number>): string => template.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(vars[key] ?? ''))\nconst humanize = (id: string): string => id.replace(/_/g, ' ').replace(/^./, (c) => c.toUpperCase())\n\n/** What the scenarios of the area ask of the module (and what a host or a test may read). */\nexport interface ItemsAreaState {\n readonly category: string\n readonly wear: string\n readonly ageDays: number\n readonly storage: string\n readonly powered: boolean\n readonly place: string\n readonly container: string\n readonly state: string\n readonly day: number\n readonly seed: number\n readonly recipe: string\n}\n\nexport interface ItemsTestModule extends TestableModule {\n /** Everything the module has put in the scene so far, with what was measured when it was drawn. */\n placed(): ReadonlyArray<{ id: string; itemId: string; group: 'shelf' | 'showcase'; kind: 'model' | 'shape'; size: readonly [number, number, number]; root: THREE_NS.Object3D }>\n /** The stacks now on the finds table. */\n finds(): readonly FindStack[]\n /** The shelves of the layout. */\n shelves(): readonly ShelfPlan[]\n readonly state: ItemsAreaState\n /** The bench actions, callable without a host (what the buttons do). */\n rollFinds(): readonly FindStack[]\n craftSelected(): { ok: boolean; missing: readonly string[] }\n selectRecipe(id: string): void\n /** The box of a drawn object, metres [x, y, z] (needs the host's three.js namespace: null before the module is attached or an item built). */\n measure(root: THREE_NS.Object3D): [number, number, number] | null\n}\n\n/** Wear stage of an item from the age the bench sets: a food past its best turns spoiled, a food getting old turns used. */\nconst stageOf = (catalog: ItemsCatalog, item: ItemDef, base: WearStage, ageDays: number, storage: string, powered: boolean): WearStage => {\n if (item.shelfLife === undefined || ageDays <= 0) return base\n const state = freshness(item, { ageDays: 0, since: 0, storage, storedAt: 0 }, ageDays, { powered, rules: catalog.rules })\n const aged: WearStage = state === 'fresh' ? 0 : state === 'stale' ? 1 : 2\n return Math.max(base, aged) as WearStage\n}\n\nconst sizeOfModel = (id: string): [number, number, number] | undefined => {\n const entry = itemModelEntry(id)\n return entry ? [entry.teamBox[0] * entry.scale, entry.teamBox[1] * entry.scale, entry.teamBox[2] * entry.scale] : undefined\n}\n\n/**\n * The items test area as a `TestableModule` of @adatechnology/game-contracts: every item of a catalog on shelves by category at real size (the real model of the team where there is\n * one, the simple shape of its category elsewhere), a stand where the 24 models turn, a ruler and a human figure to judge the scale, and a table where the finds of a container\n * and the result of a recipe are laid. The bench sets wear, age and storage, the place, container, state, outbreak day and seed of the finds, and the recipe.\n */\nexport function createItemsTestModule(options: ItemsTestModuleOptions): ItemsTestModule {\n const { catalog } = options\n const locale = options.locale ?? 'pt-BR'\n const text = textOf(locale)\n const label = (key: string, fallback: string): string => {\n const found = options.translate?.(key, locale)\n return found !== undefined && found !== key ? found : fallback\n }\n const nameOf = (item: ItemDef): string => label(item.name ?? `item.${item.id}`, label(`item.${item.id}`, humanize(item.id)))\n const categoryName = (id: string): string => label(`category.${id}`, humanize(id))\n const provider = options.provider ?? createFindsProvider(catalog)\n\n const items = catalog.list()\n const categories = [...ITEM_CATEGORIES.map((c) => c.id), ...[...catalog.categories.keys()].filter((id) => !ITEM_CATEGORIES.some((c) => c.id === id))].filter((id) => items.some((item) => item.category === id))\n const shelves = shelvesLayout(items, categories)\n const showcase = listItemModels().map((id) => ({ id, size: sizeOfModel(id) as [number, number, number], def: catalog.has(id) ? catalog.get(id) : undefined }))\n\n const state: { -readonly [K in keyof ItemsAreaState]: ItemsAreaState[K] } = {\n category: CATEGORY_ALL,\n wear: WEARS.includes(options.wear as (typeof WEARS)[number]) ? (options.wear as string) : 'new',\n ageDays: 0,\n storage: catalog.rules.storage.ambient ? 'ambient' : (Object.keys(catalog.rules.storage)[0] ?? 'ambient'),\n powered: true,\n place: catalog.places.has('house') ? 'house' : ([...catalog.places.keys()][0] ?? 'house'),\n container: catalog.containers.has('fridge') ? 'fridge' : ([...catalog.containers.keys()][0] ?? 'fridge'),\n state: 'normal',\n day: 0,\n seed: options.seed ?? 1,\n recipe: [...catalog.recipes.keys()][0] ?? '',\n }\n\n interface Entry {\n id: string\n itemId: string\n group: 'shelf' | 'showcase'\n category: string\n def: ItemDef | undefined\n kind: 'model' | 'shape'\n size: readonly [number, number, number]\n root: THREE_NS.Group\n triangles: number\n drawCalls: number\n }\n const entries: Entry[] = []\n let host: ModuleHost | null = null\n let latestTHREE: typeof THREE_NS | null = null\n let stack: FindStack[] = []\n let findsGroup: THREE_NS.Group | null = null\n let boxes: THREE_NS.Object3D[] = []\n const layers = { labels: true, boxes: false, simple_shapes: false }\n\n const baseStage = (): WearStage => WEAR_STAGE[state.wear] ?? 0\n const stageFor = (def: ItemDef | undefined): WearStage => (def ? stageOf(catalog, def, baseStage(), state.ageDays, state.storage, state.powered) : baseStage())\n\n const drawable = (def: ItemDef): DrawableItem => def\n const register = (entry: Omit<Entry, 'triangles' | 'drawCalls'>): void => {\n entries.push({ ...entry, triangles: countTriangles(entry.root), drawCalls: countDrawCalls(entry.root) })\n }\n\n const shelfItem = (plan: ShelfPlan): TestableItem => ({\n id: plan.id,\n name: fill(text.shelf, { category: categoryName(plan.category) }),\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const wood = new T.MeshStandardMaterial({ color: 0x8a6a45, roughness: 0.85 })\n const frame = new T.MeshStandardMaterial({ color: 0x4a4d52, roughness: 0.7, metalness: 0.3 })\n const top = new T.Mesh(new T.BoxGeometry(plan.length, 0.04, plan.depth), wood)\n top.position.y = SHELF_HEIGHT - 0.02\n group.add(top)\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) {\n const leg = new T.Mesh(new T.BoxGeometry(0.05, SHELF_HEIGHT - 0.04, 0.05), frame)\n leg.position.set((sx * (plan.length - 0.1)) / 2, (SHELF_HEIGHT - 0.04) / 2, (sz * (plan.depth - 0.1)) / 2)\n group.add(leg)\n }\n group.userData.category = plan.category\n group.userData.shelf = true\n shelfRoots.push(group)\n return group\n },\n })\n const shelfRoots: THREE_NS.Group[] = []\n\n const itemOf = (def: ItemDef): TestableItem => ({\n id: `${ITEM_PREFIX}${def.id}`,\n name: nameOf(def),\n movable: true,\n thumbnail: itemThumbnailSvg(drawable(def)),\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n latestTHREE = T\n const model = buildItem(T, drawable(def), { wear: stageFor(def) })\n register({ id: `${ITEM_PREFIX}${def.id}`, itemId: def.id, group: 'shelf', category: def.category, def, kind: model.kind, size: def.size, root: model.root })\n return model.root\n },\n })\n\n const showcaseItem = (model: (typeof showcase)[number]): TestableItem => ({\n id: `${SHOWCASE_PREFIX}${model.id}`,\n name: model.def ? nameOf(model.def) : label(`item.${model.id}`, humanize(model.id)),\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const subject: DrawableItem = { id: model.id, category: model.def?.category ?? '', size: model.size, model: model.id }\n const built = buildItem(T, subject, { wear: stageFor(model.def) })\n register({ id: `${SHOWCASE_PREFIX}${model.id}`, itemId: model.id, group: 'showcase', category: model.def?.category ?? '', def: model.def, kind: built.kind, size: model.size, root: built.root })\n return built.root\n },\n })\n\n const standItem = (): TestableItem => ({\n id: SHOWCASE_STAND_ID,\n name: text.stand,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const base = new T.Mesh(new T.CylinderGeometry(STAND.radius, STAND.radius + 0.1, STAND.height - 0.04, 40), new T.MeshStandardMaterial({ color: 0x3a3d44, roughness: 0.8 }))\n base.position.y = (STAND.height - 0.04) / 2\n const top = new T.Mesh(new T.CylinderGeometry(STAND.radius, STAND.radius, 0.04, 40), new T.MeshStandardMaterial({ color: 0xcfcab8, roughness: 0.6 }))\n top.position.y = STAND.height - 0.02\n group.add(base, top)\n return group\n },\n })\n\n const rulerItem = (): TestableItem => ({\n id: RULER_ID,\n name: text.ruler,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const post = new T.Mesh(new T.BoxGeometry(0.06, RULER_HEIGHT, 0.02), new T.MeshStandardMaterial({ color: 0xe8e2c8, roughness: 0.7 }))\n post.position.y = RULER_HEIGHT / 2\n group.add(post)\n const tick = new T.MeshStandardMaterial({ color: 0x1b1b1b })\n for (let cm = 0; cm <= 155; cm += 5) {\n const long = cm % 10 === 0\n const mark = new T.Mesh(new T.BoxGeometry(long ? 0.05 : 0.03, 0.004, 0.024), tick)\n mark.position.set(0.03 + (long ? 0.025 : 0.015), cm / 100, 0)\n group.add(mark)\n }\n const base = new T.Mesh(new T.BoxGeometry(0.3, 0.03, 0.3), new T.MeshStandardMaterial({ color: 0x55585c }))\n base.position.y = 0.015\n group.add(base)\n group.userData.height = RULER_HEIGHT\n return group\n },\n })\n\n const humanItem = (): TestableItem => ({\n id: HUMAN_ID,\n name: text.human,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const skin = new T.MeshStandardMaterial({ color: 0x9aa3ad, roughness: 0.9 })\n const part = (geometry: THREE_NS.BufferGeometry, x: number, y: number): void => {\n const mesh = new T.Mesh(geometry, skin)\n mesh.position.set(x, y, 0)\n group.add(mesh)\n }\n // 1.80 m: legs to 0.88, torso to 1.50, neck and head to 1.80\n for (const x of [-0.09, 0.09]) part(new T.CylinderGeometry(0.075, 0.06, 0.88, 10), x, 0.44)\n part(new T.BoxGeometry(0.4, 0.62, 0.22), 0, 0.88 + 0.31)\n for (const x of [-0.26, 0.26]) part(new T.CylinderGeometry(0.045, 0.04, 0.6, 8), x, 1.2)\n part(new T.CylinderGeometry(0.05, 0.055, 0.07, 8), 0, 1.535)\n part(new T.SphereGeometry(0.115, 14, 10), 0, 1.685)\n group.userData.height = HUMAN_HEIGHT\n return group\n },\n })\n\n const tableItem = (): TestableItem => ({\n id: FINDS_TABLE_ID,\n name: text.table,\n movable: false,\n build: (THREE: unknown) => {\n const T = THREE as typeof THREE_NS\n const group = new T.Group()\n const top = new T.Mesh(new T.BoxGeometry(TABLE.length, 0.05, TABLE.depth), new T.MeshStandardMaterial({ color: 0x7a6a55, roughness: 0.8 }))\n top.position.y = TABLE.height - 0.025\n group.add(top)\n const frame = new T.MeshStandardMaterial({ color: 0x3d3f44 })\n for (const sx of [-1, 1]) for (const sz of [-1, 1]) {\n const leg = new T.Mesh(new T.BoxGeometry(0.06, TABLE.height - 0.05, 0.06), frame)\n leg.position.set((sx * (TABLE.length - 0.12)) / 2, (TABLE.height - 0.05) / 2, (sz * (TABLE.depth - 0.12)) / 2)\n group.add(leg)\n }\n return group\n },\n })\n\n const liveEntries = (): Entry[] => entries.filter((entry) => entry.root.parent !== null)\n const visibleEntries = (): Entry[] => liveEntries().filter((entry) => entry.root.visible)\n\n const applyCategory = (): void => {\n for (const entry of entries) if (entry.group === 'shelf') entry.root.visible = state.category === CATEGORY_ALL || entry.category === state.category\n for (const shelf of shelfRoots) shelf.visible = state.category === CATEGORY_ALL || shelf.userData.category === state.category\n }\n const applyWear = (): void => {\n for (const entry of entries) setWear(entry.root, stageFor(entry.def))\n }\n const applyHighlight = (): void => {\n for (const entry of entries) {\n entry.root.traverse((object) => {\n const mesh = object as THREE_NS.Mesh\n if (!mesh.isMesh) return\n for (const material of Array.isArray(mesh.material) ? mesh.material : [mesh.material]) {\n const standard = material as THREE_NS.MeshStandardMaterial\n if (standard.emissive) standard.emissive.setHex(layers.simple_shapes && entry.kind === 'shape' ? HIGHLIGHT : 0x000000)\n }\n })\n }\n }\n const clearBoxes = (): void => {\n for (const box of boxes) {\n box.parent?.remove(box)\n }\n boxes = []\n }\n const applyBoxes = (): void => {\n clearBoxes()\n if (!layers.boxes || !host || !latestTHREE) return\n const T = latestTHREE\n const scene = host.scene as THREE_NS.Scene\n for (const entry of liveEntries()) {\n if (!entry.root.visible) continue\n const box = new T.Box3().setFromObject(entry.root)\n if (box.isEmpty()) continue\n const helper = new T.Box3Helper(box, BOX_COLOR)\n scene.add(helper)\n boxes.push(helper)\n }\n }\n\n const clearFinds = (): void => {\n if (findsGroup) {\n findsGroup.parent?.remove(findsGroup)\n findsGroup = null\n }\n }\n const labelSprite = (T: typeof THREE_NS, content: string): THREE_NS.Sprite | null => {\n if (typeof document === 'undefined') return null\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')\n if (!context) return null\n canvas.width = 256\n canvas.height = 64\n context.fillStyle = 'rgba(15,17,20,0.78)'\n context.fillRect(0, 0, 256, 64)\n context.fillStyle = '#ffffff'\n context.font = '24px sans-serif'\n context.textAlign = 'center'\n context.textBaseline = 'middle'\n context.fillText(content.length > 22 ? `${content.slice(0, 21)}…` : content, 128, 32)\n const texture = new T.CanvasTexture(canvas)\n const sprite = new T.Sprite(new T.SpriteMaterial({ map: texture, depthTest: false, transparent: true }))\n sprite.scale.set(0.5, 0.125, 1)\n sprite.renderOrder = 10\n return sprite\n }\n /** Draws the stacks on the finds table: each item once per unit (up to five) side by side at real size, with a label of its name and count. */\n const showFinds = (): void => {\n clearFinds()\n if (!host || !latestTHREE) return\n const T = latestTHREE\n const group = new T.Group()\n group.position.set(TABLE.at[0], TABLE.height + 0.005, TABLE.at[2])\n let cursor = -TABLE.length / 2 + 0.1\n const scale = 1\n for (const found of stack) {\n const def = catalog.get(found.itemId)\n const copies = Math.min(found.count, MAX_COPIES)\n const start = cursor\n for (let i = 0; i < copies; i++) {\n const model = buildItem(T, drawable(def), { wear: stageFor(def) })\n model.root.position.set(cursor + (def.size[0] * scale) / 2, 0, 0)\n group.add(model.root)\n cursor += def.size[0] + 0.03\n }\n const sprite = labelSprite(T, `${nameOf(def)} x${found.count}`)\n if (sprite) {\n sprite.position.set((start + cursor) / 2, Math.max(def.size[1], 0.1) + 0.12, 0)\n sprite.visible = layers.labels\n sprite.userData.label = true\n group.add(sprite)\n }\n cursor += 0.1\n }\n ;(host.scene as THREE_NS.Scene).add(group)\n findsGroup = group\n }\n const applyLabels = (): void => {\n findsGroup?.traverse((object) => {\n if (object.userData.label) object.visible = layers.labels\n })\n }\n\n const rollFinds = (): readonly FindStack[] => {\n const query: FindsQuery = { place: state.place, container: state.container, state: state.state, rng: rng(state.seed), day: state.day }\n stack = [...(provider.findsFor(query) ?? [])]\n showFinds()\n const container = label(`container.${state.container}`, humanize(state.container))\n const place = label(`place.${state.place}`, humanize(state.place))\n host?.log(stack.length > 0 ? fill(text.rolled, { container, place, state: text.states[state.state as keyof Text['states']] ?? state.state, day: state.day, stacks: stack.length }) : fill(text.rolledNothing, { container, place }), { place: state.place, container: state.container, seed: state.seed })\n return stack\n }\n\n /** What the character needs to make `recipe`: the items, the stations and the tools it asks for, once. */\n const kitFor = (recipe: RecipeDef): { inventory: Map<string, number>; world: Set<string> } => {\n const inventory = new Map<string, number>()\n const world = new Set<string>()\n const add = (id: string, count: number): void => void inventory.set(id, (inventory.get(id) ?? 0) + count)\n for (const input of recipe.inputs) {\n if (input.world) for (const w of input.world) world.add(w)\n else if (input.item !== undefined) add(input.item, input.qty ?? 1)\n else if (input.any?.[0] !== undefined) add(input.any[0], input.qty ?? 1)\n else if (input.match) {\n const pick = catalog.list().find((item) => (input.match?.category === undefined || item.category === input.match.category) && (input.match?.cookable === undefined || item.cookable === input.match.cookable))\n if (pick) add(pick.id, input.qty ?? 1)\n }\n }\n for (const tool of recipe.tools) {\n if (tool.anyOf[0] !== undefined) add(tool.anyOf[0], 1)\n for (const w of tool.world ?? []) world.add(w)\n }\n return { inventory, world }\n }\n const craftSelected = (): { ok: boolean; missing: readonly string[] } => {\n const recipe = catalog.recipes.get(state.recipe)\n if (!recipe) return { ok: false, missing: [state.recipe] }\n const { inventory, world } = kitFor(recipe)\n const fluids: Record<string, number> = {}\n for (const input of recipe.inputs) if (input.fluid !== undefined) fluids[input.fluid] = (fluids[input.fluid] ?? 0) + (input.liters ?? 1)\n const context = { catalog, inventory, world, fluids }\n const name = label(`recipe.${recipe.id}`, humanize(recipe.id))\n const check = canCraft(recipe, context)\n if (!check.isPossible) {\n host?.log(fill(text.craftMissing, { recipe: name, missing: check.missing.join(', ') }), { recipe: recipe.id })\n return { ok: false, missing: check.missing }\n }\n const result = craft(recipe, context, rng(state.seed))\n if (!result.isCrafted) return { ok: false, missing: result.missing }\n if ('item' in result.output) {\n stack = [{ itemId: result.output.item, count: result.output.count }]\n showFinds()\n }\n const output = 'item' in result.output ? `${nameOf(catalog.get(result.output.item))} x${result.output.count}` : fill(text.craftEffect, { effect: result.output.effect })\n host?.log(fill(text.crafted, { recipe: name, output, seconds: result.seconds }), { recipe: recipe.id })\n return { ok: true, missing: [] }\n }\n\n const areaPlacements = (): AreaPlacement[] => {\n const placements: AreaPlacement[] = []\n for (const shelf of shelves) {\n placements.push({ item: shelf.id, position: shelf.position, surface: { halfSize: [shelf.length / 2, shelf.depth / 2], height: SHELF_HEIGHT } }, ...shelf.items)\n }\n placements.push({ item: SHOWCASE_STAND_ID, position: STAND.at, surface: { halfSize: [STAND.radius, STAND.radius], height: STAND.height } })\n showcase.forEach((model, index) => {\n const angle = (index / showcase.length) * Math.PI * 2\n placements.push({ item: `${SHOWCASE_PREFIX}${model.id}`, position: [STAND.at[0] + Math.cos(angle) * STAND.ring, STAND.height + 0.01, STAND.at[2] + Math.sin(angle) * STAND.ring], asleep: true })\n })\n placements.push({ item: RULER_ID, position: RULER_AT }, { item: HUMAN_ID, position: HUMAN_AT })\n placements.push({ item: FINDS_TABLE_ID, position: TABLE.at, surface: { halfSize: [TABLE.length / 2, TABLE.depth / 2], height: TABLE.height } })\n return placements\n }\n\n const onChange = (change: BenchChange): void => {\n if (change.kind === 'layer') {\n if (change.id === 'labels' || change.id === 'boxes' || change.id === 'simple_shapes') layers[change.id] = change.on\n if (change.id === 'labels') applyLabels()\n else if (change.id === 'boxes') applyBoxes()\n else if (change.id === 'simple_shapes') applyHighlight()\n return\n }\n if (change.kind === 'action') {\n if (change.id === 'roll_finds') rollFinds()\n else if (change.id === 'craft') craftSelected()\n return\n }\n const value = change.value\n switch (change.id) {\n case 'category':\n state.category = String(value)\n applyCategory()\n if (layers.boxes) applyBoxes()\n break\n case 'wear':\n state.wear = String(value)\n applyWear()\n break\n case 'age_days':\n state.ageDays = Number(value)\n applyWear()\n break\n case 'storage':\n state.storage = String(value)\n applyWear()\n break\n case 'powered':\n state.powered = Boolean(value)\n applyWear()\n break\n case 'place':\n state.place = String(value)\n break\n case 'container':\n state.container = String(value)\n break\n case 'state':\n state.state = String(value)\n break\n case 'day':\n state.day = Number(value)\n break\n case 'seed':\n state.seed = Number(value)\n break\n case 'recipe':\n state.recipe = String(value)\n break\n }\n }\n\n const choice = (id: keyof Text['control'], values: ReadonlyArray<{ id: string; name: string }>, def: string): ModuleControl => ({ kind: 'choice', id, name: text.control[id], options: values, default: def })\n\n const module: ItemsTestModule = {\n id: 'items_area',\n name: text.name,\n group: text.group,\n state,\n placed: () => entries.map((entry) => ({ id: entry.id, itemId: entry.itemId, group: entry.group, kind: entry.kind, size: entry.size, root: entry.root })),\n finds: () => stack,\n shelves: () => shelves,\n rollFinds,\n craftSelected,\n selectRecipe: (id) => {\n state.recipe = id\n },\n measure: (root) => {\n if (!latestTHREE) return null\n const size = new latestTHREE.Box3().setFromObject(root).getSize(new latestTHREE.Vector3())\n return [size.x, size.y, size.z]\n },\n items: () => [\n ...items.map(itemOf),\n ...shelves.map(shelfItem),\n standItem(),\n ...showcase.map(showcaseItem),\n rulerItem(),\n humanItem(),\n tableItem(),\n ],\n area: (): ModuleArea => ({ placements: areaPlacements(), view: { eye: [0, 5.5, 16], target: [0, 0.8, 0] } }),\n controls: (): ModuleControl[] => [\n choice('category', [{ id: CATEGORY_ALL, name: text.all }, ...categories.map((id) => ({ id, name: categoryName(id) }))], CATEGORY_ALL),\n choice('wear', WEARS.map((id) => ({ id, name: text.wears[id] })), state.wear),\n { kind: 'number', id: 'age_days', name: text.control.age_days, hint: text.hint.age_days, unit: 'd', min: 0, max: 400, step: 5, default: 0 },\n choice('storage', Object.keys(catalog.rules.storage).map((id) => ({ id, name: label(`storage.${id}`, humanize(id)) })), state.storage),\n { kind: 'boolean', id: 'powered', name: text.control.powered, hint: text.hint.powered, default: true },\n choice('place', [...catalog.places.keys()].map((id) => ({ id, name: label(`place.${id}`, humanize(id)) })), state.place),\n choice('container', [...catalog.containers.keys()].map((id) => ({ id, name: label(`container.${id}`, humanize(id)) })), state.container),\n choice('state', (['normal', 'fortified', 'abandoned'] as const).map((id) => ({ id, name: text.states[id] })), 'normal'),\n { kind: 'number', id: 'day', name: text.control.day, hint: text.hint.day, unit: 'd', min: 0, max: 60, step: 1, default: 0 },\n { kind: 'number', id: 'seed', name: text.control.seed, min: 1, max: 9999, step: 1, default: state.seed },\n { kind: 'action', id: 'roll_finds', name: text.control.roll_finds, hint: text.hint.roll_finds },\n ...(state.recipe ? [choice('recipe', [...catalog.recipes.keys()].map((id) => ({ id, name: label(`recipe.${id}`, humanize(id)) })), state.recipe)] : []),\n ...(state.recipe ? [{ kind: 'action', id: 'craft', name: text.control.craft, hint: text.hint.craft } as ModuleControl] : []),\n ],\n layers: (): ModuleLayer[] => [\n { id: 'labels', name: text.layers.labels },\n { id: 'boxes', name: text.layers.boxes, default: false },\n { id: 'simple_shapes', name: text.layers.simple_shapes, default: false },\n ],\n metrics: (): ModuleMetric[] => [\n { id: 'items', name: text.metrics.items, digits: 0, read: () => visibleEntries().length },\n { id: 'draw_calls', name: text.metrics.draw_calls, digits: 0, read: () => visibleEntries().reduce((sum, entry) => sum + entry.drawCalls, 0) },\n { id: 'triangles', name: text.metrics.triangles, digits: 0, read: () => visibleEntries().reduce((sum, entry) => sum + entry.triangles, 0) },\n {\n id: 'modeled',\n name: text.metrics.modeled,\n read: () => {\n const shown = visibleEntries().filter((entry) => entry.group === 'shelf')\n return `${shown.filter((entry) => entry.kind === 'model').length}/${shown.length}`\n },\n },\n { id: 'finds', name: text.metrics.finds, digits: 0, read: () => stack.length },\n ],\n scenarios: (): Array<ModuleScenario<ScenarioLike>> => scenariosOf(module, catalog, text, provider),\n attach(lent) {\n host = lent\n latestTHREE = lent.THREE as typeof THREE_NS\n const offChange = lent.bench?.onChange(onChange)\n const offFrame = lent.onFrame((dt) => {\n for (const entry of entries) if (entry.group === 'showcase' && entry.root.parent) entry.root.rotation.y += dt * SPIN\n })\n return () => {\n offChange?.()\n offFrame()\n clearBoxes()\n clearFinds()\n host = null\n }\n },\n }\n return module\n}\n\n/** What the scenarios use of the context the test room passes (`ScenarioContext`). */\nexport interface ScenarioLike {\n expect(condition: boolean, label: string, data?: Record<string, unknown>): void\n}\n\n/** A drawing never grows past its item's size, and its longest side is within 8% of it (a bag is a little lower than its box). */\nconst OVER = 0.02\nconst UNDER = 0.08\n\nfunction scenariosOf(module: ItemsTestModule, catalog: ItemsCatalog, text: Text, provider: FindsProvider): Array<ModuleScenario<ScenarioLike>> {\n const names = text.scenarios\n const shelf = (): ReturnType<ItemsTestModule['placed']> => module.placed().filter((entry) => entry.group === 'shelf')\n return [\n {\n id: 'real_size',\n name: names.real_size,\n run: ({ expect }) => {\n const shown = shelf()\n expect(shown.length > 0, 'items are on the shelves', { count: shown.length })\n for (const entry of shown) {\n const measured = module.measure(entry.root)\n if (!measured) continue\n const longest = Math.max(...entry.size)\n const axis = entry.size.indexOf(longest)\n const ok = measured.every((side, a) => side <= (entry.size[a] as number) * (1 + OVER) + 0.002) && Math.abs((measured[axis] as number) - longest) <= longest * UNDER + 0.002\n expect(ok, `${entry.itemId} measures its real size`, { measured, size: entry.size })\n }\n },\n },\n {\n id: 'models',\n name: names.models,\n run: ({ expect }) => {\n const models = listItemModels()\n expect(models.length === 24, '24 models are shipped', { count: models.length })\n const withModel = catalog.list().filter((item) => item.model !== undefined && hasItemModel(item.model))\n expect(withModel.length === 23, '23 items of the catalog name a model', { count: withModel.length })\n const stand = module.placed().filter((entry) => entry.group === 'showcase')\n expect(stand.length === 0 || stand.every((entry) => entry.kind === 'model'), 'every piece of the stand is drawn by the model of the team')\n },\n },\n {\n id: 'budgets',\n name: names.budgets,\n run: ({ expect }) => {\n for (const entry of module.placed()) {\n const report = checkBudget(entry.root, entry.size)\n expect(report.drawCalls <= ITEM_BUDGETS.drawCalls, `${entry.itemId} stays within ${ITEM_BUDGETS.drawCalls} draw calls`, { drawCalls: report.drawCalls })\n const deviation = entry.kind === 'model' ? MODEL_BUDGET_DEVIATIONS[entry.itemId] : undefined\n expect(report.ok || (deviation !== undefined && report.triangles <= deviation), `${entry.itemId} stays within its triangle budget`, { triangles: report.triangles, limit: report.limit })\n }\n },\n },\n {\n id: 'ruler',\n name: names.ruler,\n run: ({ expect }) => {\n expect(RULER_HEIGHT === 1.55 && HUMAN_HEIGHT === 1.8, 'the references have the measures of the page')\n },\n },\n {\n id: 'finds',\n name: names.finds,\n run: ({ expect }) => {\n const query = (seed: number): FindsQuery => ({ place: module.state.place, container: module.state.container, state: 'normal', rng: rng(seed), day: 0 })\n const a = JSON.stringify(provider.findsFor(query(7)))\n const b = JSON.stringify(provider.findsFor(query(7)))\n expect(a === b, 'the same seed gives the same finds')\n expect((provider.findsFor(query(7)) ?? []).every((found) => catalog.has(found.itemId)), 'every find is an item of the catalog')\n },\n },\n {\n id: 'freshness',\n name: names.freshness,\n run: ({ expect }) => {\n const food = catalog.list().find((item) => item.shelfLife !== undefined && item.shelfLife > 0)\n if (!food) return expect(false, 'the catalog has a food that spoils')\n const at = (storage: string, days: number): string => freshness(food, { ageDays: 0, since: 0, storage, storedAt: 0 }, days, { rules: catalog.rules })\n const days = (food.shelfLife as number) * 1.2\n expect(at('ambient', days) !== 'fresh', 'at room temperature it is past its best', { food: food.id })\n if ('fridge' in catalog.rules.storage) expect(at('fridge', days) !== at('ambient', days) || at('fridge', days) === 'fresh', 'in the fridge it keeps better', { food: food.id })\n },\n },\n {\n id: 'craft',\n name: names.craft,\n run: ({ expect }) => {\n const before = module.state.recipe\n for (const id of catalog.recipes.keys()) {\n module.selectRecipe(id)\n const result = module.craftSelected()\n expect(result.ok, `recipe ${id} is made with what it asks for`, { missing: result.missing })\n }\n module.selectRecipe(before)\n },\n },\n ]\n}\n","import type { AreaPlacement, Vec3 } from '@adatechnology/game-contracts'\n\n/** What the layout needs of an item: its id, category and real size [width, height, depth] in metres. */\nexport interface LayoutItem {\n readonly id: string\n readonly category: string\n readonly size: readonly [number, number, number]\n}\n\n/** Height of the top of a shelf, metres. */\nexport const SHELF_HEIGHT = 0.9\n/** Longest row of items on a shelf, metres. */\nexport const ROW_LIMIT = 5\nconst GAP = 0.06\nconst EDGE = 0.12\nconst COLUMNS = 4\nconst COLUMN_PITCH = 6.2\nconst ROW_GAP = 1.5\nconst FIRST_Z = -11\n\n/** One shelf: a category's items laid out in rows at real size, the shelf's footprint and where its items sit on its top. */\nexport interface ShelfPlan {\n category: string\n /** Item id of the shelf in the module (`shelf_<category>`). */\n id: string\n /** Footprint on the floor: length along x, depth along z. */\n length: number\n depth: number\n position: Vec3\n /** Where each item sits, in world coordinates. */\n items: AreaPlacement[]\n}\n\nexport const SHELF_PREFIX = 'shelf_'\nexport const ITEM_PREFIX = 'item_'\nexport const SHOWCASE_PREFIX = 'showcase_'\n\ninterface Row {\n items: LayoutItem[]\n width: number\n depth: number\n}\n\nconst rowsOf = (items: readonly LayoutItem[]): Row[] => {\n const rows: Row[] = []\n for (const item of items) {\n const [w, , d] = item.size\n let row = rows[rows.length - 1]\n if (!row || (row.items.length > 0 && row.width + w + GAP > ROW_LIMIT)) {\n row = { items: [], width: 0, depth: 0 }\n rows.push(row)\n }\n row.items.push(item)\n row.width += w + GAP\n row.depth = Math.max(row.depth, d)\n }\n return rows\n}\n\n/**\n * The shelves of the area: one per category, in the order the categories come, with every item of the category side by side at real size, wrapped in rows of at most\n * `ROW_LIMIT` metres. Shelves stand in a grid of four columns; an item that is longer than the row limit gets a row to itself. Pure: the same items always land in the same spots.\n */\nexport function shelvesLayout(items: readonly LayoutItem[], categories: readonly string[]): ShelfPlan[] {\n const plans = categories.flatMap((category) => {\n const own = items.filter((item) => item.category === category)\n if (own.length === 0) return []\n const rows = rowsOf(own)\n const length = Math.max(...rows.map((row) => row.width - GAP)) + 2 * EDGE\n const depth = rows.reduce((sum, row) => sum + row.depth + GAP, 0) - GAP + 2 * EDGE\n return [{ category, rows, length, depth }]\n })\n const result: ShelfPlan[] = []\n let z = FIRST_Z\n for (let start = 0; start < plans.length; start += COLUMNS) {\n const line = plans.slice(start, start + COLUMNS)\n const lineDepth = Math.max(...line.map((plan) => plan.depth))\n line.forEach((plan, column) => {\n const x = (column - (COLUMNS - 1) / 2) * COLUMN_PITCH\n const centre: Vec3 = [x, 0, z + plan.depth / 2]\n const placed: AreaPlacement[] = []\n let rowZ = -plan.depth / 2 + EDGE\n for (const row of plan.rows) {\n let cursor = -plan.length / 2 + EDGE\n for (const item of row.items) {\n const [w, , d] = item.size\n placed.push({ item: `${ITEM_PREFIX}${item.id}`, position: [centre[0] + cursor + w / 2, SHELF_HEIGHT + 0.01, centre[2] + rowZ + d / 2], asleep: true })\n cursor += w + GAP\n }\n rowZ += row.depth + GAP\n }\n result.push({ category: plan.category, id: `${SHELF_PREFIX}${plan.category}`, length: plan.length, depth: plan.depth, position: centre, items: placed })\n })\n z += lineDepth + ROW_GAP\n }\n return result\n}\n"],"mappings":"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","names":["hex","tube","hex","tube","paper","paper","paper","paper","paper","cloth","paper","cloth","cloth","paper","box","DEFAULT_COLOR","box","key","entries","box","tool","days"]}
|