@adatechnology/game-floorplan 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/registry.ts","../src/rng.ts","../src/extensions.ts","../src/geometry.ts","../src/parking.ts","../src/queries.ts","../src/grid.ts","../src/fill.ts","../src/legacy-seeds.ts","../src/context.ts","../src/locale.ts","../src/paths.ts","../src/zoning.ts","../src/plan.ts","../src/palette.ts","../src/slots.ts","../src/generate.ts","../src/ground-items.ts","../src/slot-kit.ts","../src/locales/en.json","../src/locales/pt-BR.json","../src/silhouettes/random.ts","../src/silhouettes/builder.ts","../src/silhouettes/building.ts","../src/silhouettes/houses.ts","../src/index.ts"],"sourcesContent":["/** Structural wall thickness in metres. */\nexport const WALL_THICKNESS = 0.15\n/** Half a wall: the gap between a room rectangle and its usable interior. */\nexport const MARGIN = WALL_THICKNESS / 2\nexport const EPS = 1e-6\nexport const TOL = 1e-3\n/** Clear zone in front of doors and gates, in metres. */\nexport const DOOR_CLEARANCE = 0.9\n/** Radius of the player body: a disc this wide must still pass between doors and rooms once the furniture is placed. */\nexport const PLAYER_RADIUS = 0.24\n/** Clear wall from the edge of a door opening to a corner or a junction (measured from the wall axis). */\nexport const DOOR_EDGE_CLEARANCE = 0.12\n/** Clear wall from a window to a corner, a junction or a door. */\nexport const WINDOW_EDGE_CLEARANCE = 0.3\n/** Top of the wall cabinet (it hangs between 1.55 and 2.15 m). */\nexport const OVERHEAD_TOP = 2.15\n/** Room types that may stay without a window. */\nexport const WINDOWLESS_ROOM_TYPES: ReadonlySet<string> = new Set([\n 'stockroom', 'kitchen', 'laundry', 'bathroom', 'void', 'elevator', 'stairs', 'pantry', 'closet', 'corridor', 'hall', 'balcony', 'terrace', 'garage', 'storage', 'porch', 'tent', 'outhouse',\n])\n/** Default clearances of a parked car, in metres (driver side is the left of whoever looks along the front). */\nexport const CAR_CLEARANCE = { driver: 0.8, side: 0.6, end: 0.6 } as const\n","import type {\n DecorPass,\n FindsProvider,\n ResultExtensionOptions,\n ResultExtensionRun,\n GroundOverlayRule,\n FurnitureDef,\n ItemInput,\n Json,\n RoomColorDef,\n SlotLibrary,\n StateContext,\n StatePlugin,\n StyleDef,\n TemplateDef,\n ViewerLayer,\n} from './types'\nimport type { PaletteStyleDef } from './palette'\n\n/** All content registries of the engine. Content packs fill them through the `register*` functions. */\nexport const CATALOG: Record<string, FurnitureDef> = {}\nexport const LIBRARIES: Record<string, SlotLibrary> = {}\nexport const LIBRARY_ALIAS: Record<string, string> = {}\nexport const TEMPLATES: Record<string, TemplateDef> = {}\nexport const STYLES: Record<string, StyleDef> = {}\nexport const STYLE_ALIAS: Record<string, string> = {}\nexport const PALETTE_STYLES: Record<string, PaletteStyleDef> = {}\nexport const ROOM_COLORS: RoomColorDef[] = []\nexport const PASSES: { name: string; run: DecorPass }[] = []\nexport const DECOR_PROFILES: Record<string, Json> = {}\nexport const GROUND_OVERLAYS: GroundOverlayRule[] = []\nexport const STATE_PLUGINS: Record<string, StatePlugin> = { normal: { apply: () => [] } }\nexport const WALL_TOP_HEIGHTS: Record<string, number> = { none: 0 }\nexport const SEED_KEYS: { rooms: Record<string, string>; items: Record<string, string> } = { rooms: {}, items: {} }\nexport const stateDistribution: { weights: Record<string, number> | null; seedKey: string } = { weights: null, seedKey: 'state' }\n\nexport function registerItem(def: ItemInput): FurnitureDef {\n const h = def.h\n const item: FurnitureDef = Object.assign({ front: '+z', window: h <= 0.95, low: h <= 0.5, flat: false, deck: false, rim: 0 }, def) as FurnitureDef\n CATALOG[def.type] = item\n return item\n}\nexport function registerItems(list: ItemInput[]): void {\n for (const d of list) registerItem(d)\n}\n\nexport function registerLibrary(id: string, library: SlotLibrary): void {\n LIBRARIES[id] = library\n}\nexport function registerLibraryAlias(alias: string, id: string): void {\n LIBRARY_ALIAS[alias] = id\n}\n\nexport function registerTemplate<T extends TemplateDef>(t: T): T {\n TEMPLATES[t.id] = t\n return t\n}\n\nexport function registerStyle(style: StyleDef): void {\n STYLES[style.id] = style\n for (const a of style.aliases || []) STYLE_ALIAS[a] = style.id\n}\nexport function registerPaletteStyle(id: string, def: PaletteStyleDef): void {\n PALETTE_STYLES[id] = def\n}\nexport function registerRoomColors(list: RoomColorDef[]): void {\n for (const d of list) {\n const i = ROOM_COLORS.findIndex((x) => x.type === d.type)\n if (i >= 0) ROOM_COLORS.splice(i, 1)\n ROOM_COLORS.push(d)\n }\n ROOM_COLORS.sort((a, b) => a.order - b.order)\n}\n\nexport function registerDecorProfile(styleId: string, profile: Json): void {\n DECOR_PROFILES[styleId] = profile\n}\nexport function registerPass(name: string, run: DecorPass): void {\n const i = PASSES.findIndex((p) => p.name === name)\n if (i >= 0) PASSES[i] = { name, run }\n else PASSES.push({ name, run })\n}\nexport function registerGroundOverlay(rule: GroundOverlayRule): void {\n GROUND_OVERLAYS.push(rule)\n}\nexport function registerWallTop(id: string, height: number): void {\n WALL_TOP_HEIGHTS[id] = height\n}\n/** Legacy RNG stream names for rooms and items, so seeds recorded before the English ids still reproduce. */\nexport function registerSeedKeys(keys: { rooms?: Record<string, string>; items?: Record<string, string> }): void {\n Object.assign(SEED_KEYS.rooms, keys.rooms)\n Object.assign(SEED_KEYS.items, keys.items)\n}\n\n/** Registers a house state. The engine only ships `normal`. */\nexport function registerState(name: string, plugin: StatePlugin): void {\n STATE_PLUGINS[name] = plugin\n}\n/** Default state draw when `options.state` is absent: `{ state: weight }` on its own seeded stream. */\nexport function setStateDistribution(weights: Record<string, number> | null, seedKey = 'state'): void {\n stateDistribution.weights = weights\n stateDistribution.seedKey = seedKey\n}\nexport const listStates = (): string[] => Object.keys(STATE_PLUGINS)\n\nexport function resolveStyleId(id: string | undefined): string {\n const s = id ?? ''\n return STYLE_ALIAS[s] ?? s\n}\nexport function styleOf(id: string): StyleDef {\n return STYLES[id] || STYLES.budget || Object.values(STYLES)[0]\n}\n\nexport type { StateContext }\n\nexport interface ResultExtension {\n name: string\n run: ResultExtensionRun\n after: string[]\n seedKey: string\n}\nexport const RESULT_EXTENSIONS: ResultExtension[] = []\nexport const FINDS_PROVIDERS: FindsProvider[] = []\n\n/** Adds a named piece to every result, after the state and before the zoning report; its output lands in `result[name]`. */\nexport function registerResultExtension(name: string, run: ResultExtensionRun, options: ResultExtensionOptions = {}): void {\n const entry: ResultExtension = { name, run, after: options.after || [], seedKey: options.seedKey ?? name }\n const i = RESULT_EXTENSIONS.findIndex((x) => x.name === name)\n if (i >= 0) RESULT_EXTENSIONS[i] = entry\n else RESULT_EXTENSIONS.push(entry)\n}\n\n/** Registers who answers what a container holds (the item packs, from phase 3 on). */\nexport function registerFindsProvider(provider: FindsProvider): void {\n FINDS_PROVIDERS.push(provider)\n}\n\nexport const VIEWER_LAYERS: ViewerLayer[] = []\n/** Adds (or replaces, by id) a layer of the 2D viewer; drawn after the items, before the labels. */\nexport function registerViewerLayer(layer: ViewerLayer): void {\n const i = VIEWER_LAYERS.findIndex((x) => x.id === layer.id)\n if (i >= 0) VIEWER_LAYERS[i] = layer\n else VIEWER_LAYERS.push(layer)\n}\n","/** Seeded random helpers. Same seed and key always produce the same stream. */\n\nexport type Rng = () => number\n\nexport function mulberry32(a: number): Rng {\n return function () {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nexport function hashString(input: string | number): number {\n const s = String(input)\n let h = 1779033703 ^ s.length\n for (let i = 0; i < s.length; i++) {\n h = Math.imul(h ^ s.charCodeAt(i), 3432918353)\n h = (h << 13) | (h >>> 19)\n }\n h = Math.imul(h ^ (h >>> 16), 2246822507)\n h = Math.imul(h ^ (h >>> 13), 3266489909)\n return (h ^ (h >>> 16)) >>> 0\n}\n\n/** Independent stream for a `(seed, key)` pair. */\nexport const createRng = (seed: string | number, key: string): Rng => mulberry32(hashString(seed + '|' + key))\n\n/** Picks a key of `{ key: weight }`. */\nexport function pickWeighted(rng: Rng, weights: Record<string, number>): string {\n const keys = Object.keys(weights)\n let total = 0\n for (const k of keys) total += weights[k]\n let x = rng() * total\n for (const k of keys) {\n x -= weights[k]\n if (x < 0) return k\n }\n return keys[keys.length - 1]\n}\n\n/** Weighted draw without replacement. */\nexport function weightedOrder<T extends { weight: number }>(candidates: T[], rng: Rng): T[] {\n const arr = candidates.slice()\n const out: T[] = []\n while (arr.length) {\n let total = 0\n for (const c of arr) total += c.weight\n let x = rng() * total\n let i = 0\n for (; i < arr.length - 1; i++) {\n x -= arr[i].weight\n if (x < 0) break\n }\n out.push(arr.splice(i, 1)[0])\n }\n return out\n}\n\nexport function shuffle<T>(arr: T[], rng: Rng): T[] {\n const a = arr.slice()\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1))\n ;[a[i], a[j]] = [a[j], a[i]]\n }\n return a\n}\n","import { FINDS_PROVIDERS, RESULT_EXTENSIONS } from './registry'\nimport type { ResultExtension } from './registry'\nimport { createRng } from './rng'\nimport type { FindsQuery, FindStack, FloorplanOptions, Json, Plan } from './types'\n\n/** Extensions in the order they run: registration order, with each one after the ones it names. */\nfunction orderOf(extensions: readonly ResultExtension[]): ResultExtension[] {\n const ordered: ResultExtension[] = []\n const visiting = new Set<string>()\n const visit = (extension: ResultExtension) => {\n if (ordered.includes(extension)) return\n if (visiting.has(extension.name)) throw new Error('Result extensions depend on each other: ' + extension.name)\n visiting.add(extension.name)\n for (const name of extension.after) {\n const before = extensions.find((x) => x.name === name)\n if (before) visit(before)\n }\n visiting.delete(extension.name)\n ordered.push(extension)\n }\n extensions.forEach(visit)\n return ordered\n}\n\n/** Runs the registered extensions and stores each output in `result[name]`. */\nexport function runResultExtensions(plan: Plan, result: Json, seed: number | string, options: FloorplanOptions): void {\n for (const extension of orderOf(RESULT_EXTENSIONS)) {\n result[extension.name] = extension.run({ plan, result, seed, rng: createRng(seed, extension.seedKey), options })\n }\n}\n\n/** What a container holds, from the first registered provider that answers (`null` passes to the next); none answering means nothing. */\nexport function findsFor(query: FindsQuery): readonly FindStack[] {\n return answerOf(query) ?? []\n}\n\n/** Like `findsFor`, but `null` when no provider answered, so a pack can fall back to its own default. */\nexport function findsAnswer(query: FindsQuery): readonly FindStack[] | null {\n return answerOf(query)\n}\n\nfunction answerOf(query: FindsQuery): readonly FindStack[] | null {\n for (const provider of FINDS_PROVIDERS) {\n const stacks = provider.findsFor(query)\n if (stacks !== null) return stacks\n }\n return null\n}\n","import { EPS, MARGIN, TOL, WALL_THICKNESS } from './constants'\nimport type { PlacedItem, Rect, Room, RoomDef, Vec2 } from './types'\n\nexport const r2 = (x: number): number => Math.round(x * 100) / 100\nexport const clamp = (x: number, a: number, b: number): number => Math.max(a, Math.min(b, x))\nexport const overlaps = (a: Rect, b: Rect, e = EPS): boolean => a[0] < b[2] - e && a[2] > b[0] + e && a[1] < b[3] - e && a[3] > b[1] + e\nexport const inner = (p: Rect): Rect => [p[0] + MARGIN, p[1] + MARGIN, p[2] - MARGIN, p[3] - MARGIN]\nexport const eq = (a: number, b: number): boolean => Math.abs(a - b) < TOL\nexport const inflate = (r: Rect, e: number): Rect => [r[0] - e, r[1] - e, r[2] + e, r[3] + e]\nexport const areaOf = (r: Rect): number => (r[2] - r[0]) * (r[3] - r[1])\nexport const topOf = (m: PlacedItem): number => (m.y || 0) + m.h\n\n/** Footprint of an item of `size` facing `f` (cardinal). */\nexport const extent = (size: Vec2, f: Vec2): Vec2 => (Math.abs(f[1]) === 1 ? [size[0], size[1]] : [size[1], size[0]])\nexport const cardinal = (dx: number, dz: number): Vec2 => (Math.abs(dx) > Math.abs(dz) ? [Math.sign(dx), 0] : [0, Math.sign(dz) || 1])\n\nexport function clearRect(r: Rect, f: Vec2, clearance: number): Rect {\n return f[1] === 1 ? [r[0], r[3], r[2], r[3] + clearance] : f[1] === -1 ? [r[0], r[1] - clearance, r[2], r[1]] : f[0] === 1 ? [r[2], r[1], r[2] + clearance, r[3]] : [r[0] - clearance, r[1], r[0], r[3]]\n}\n\nexport function insideUnion(r: Rect, inners: Rect[]): boolean {\n const e = 1e-4\n const points: Vec2[] = [\n [r[0] + e, r[1] + e],\n [r[2] - e, r[1] + e],\n [r[0] + e, r[3] - e],\n [r[2] - e, r[3] - e],\n [(r[0] + r[2]) / 2, (r[1] + r[3]) / 2],\n ]\n return points.every((p) => inners.some((q) => p[0] >= q[0] - 1e-6 && p[0] <= q[2] + 1e-6 && p[1] >= q[1] - 1e-6 && p[1] <= q[3] + 1e-6))\n}\n\nexport function cutIntervals(intervals: [number, number][], a: number, b: number): [number, number][] {\n const out: [number, number][] = []\n for (const [x, y] of intervals) {\n if (b <= x || a >= y) {\n out.push([x, y])\n continue\n }\n if (a > x) out.push([x, a])\n if (b < y) out.push([b, y])\n }\n return out\n}\n\nexport interface Edge {\n axis: 'u' | 'v'\n pos: number\n a0: number\n a1: number\n}\n\nexport function exteriorEdge(room: Room, side: string, w: number, d: number, c?: number | null): Edge | null {\n const cand: Edge[] = []\n for (const p of room.parts) {\n if (side === 'front' && eq(p[1], 0)) cand.push({ axis: 'u', pos: 0, a0: p[0], a1: p[2] })\n else if (side === 'back' && eq(p[3], d)) cand.push({ axis: 'u', pos: d, a0: p[0], a1: p[2] })\n else if (side === 'left' && eq(p[0], 0)) cand.push({ axis: 'v', pos: 0, a0: p[1], a1: p[3] })\n else if (side === 'right' && eq(p[2], w)) cand.push({ axis: 'v', pos: w, a0: p[1], a1: p[3] })\n }\n if (!cand.length) return null\n if (c != null) {\n const k = cand.find((x) => c >= x.a0 - TOL && c <= x.a1 + TOL)\n if (k) return k\n }\n return cand.sort((x, y) => y.a1 - y.a0 - (x.a1 - x.a0))[0]\n}\n\nexport function sharedEdge(A: Room, B: Room, c?: number | null): Edge | null {\n const cand: Edge[] = []\n for (const pa of A.parts)\n for (const pb of B.parts) {\n let o: [number, number]\n if (eq(pa[2], pb[0]) || eq(pa[0], pb[2])) {\n o = [Math.max(pa[1], pb[1]), Math.min(pa[3], pb[3])]\n if (o[1] - o[0] > TOL) cand.push({ axis: 'v', pos: eq(pa[2], pb[0]) ? pa[2] : pa[0], a0: o[0], a1: o[1] })\n }\n if (eq(pa[3], pb[1]) || eq(pa[1], pb[3])) {\n o = [Math.max(pa[0], pb[0]), Math.min(pa[2], pb[2])]\n if (o[1] - o[0] > TOL) cand.push({ axis: 'u', pos: eq(pa[3], pb[1]) ? pa[3] : pa[1], a0: o[0], a1: o[1] })\n }\n }\n if (!cand.length) return null\n if (c != null) {\n const k = cand.find((x) => c >= x.a0 - TOL && c <= x.a1 + TOL)\n if (k) return k\n }\n return cand.sort((x, y) => y.a1 - y.a0 - (x.a1 - x.a0))[0]\n}\n\nexport function openingZones(u: number, v: number, axis: 'u' | 'v', width: number, depth: number): Rect[] {\n const h = width / 2\n return axis === 'u' ? [[u - h, v - depth, u + h, v], [u - h, v, u + h, v + depth]] : [[u - depth, v - h, u, v + h], [u, v - h, u + depth, v + h]]\n}\nexport const openingDepth = (width: number, leaf: number): number => Math.max(0.9, leaf) + MARGIN\n\n/** Points 0.55 m on each side of an opening. */\nexport function entryPoints(ab: { axis: 'u' | 'v'; u: number; v: number }): Vec2[] {\n return ab.axis === 'u' ? [[ab.u, ab.v - 0.55], [ab.u, ab.v + 0.55]] : [[ab.u - 0.55, ab.v], [ab.u + 0.55, ab.v]]\n}\n\nexport function normalizeRoom(c: Partial<RoomDef> & { id: string; type: string; rect: number[] }, floorIndex: number): Room {\n const parts = [c.rect as number[]].concat(c.parts || []).map((p) => p.map(r2) as Rect)\n return {\n id: c.id,\n type: c.type,\n label: c.label,\n floor: floorIndex,\n parts,\n library: c.library || null,\n without: c.without || [],\n overrides: c.overrides || {},\n extras: c.extras || [],\n slots: c.slots || null,\n link: c.link || null,\n outdoor: !!c.outdoor,\n ceiling: c.ceiling || null,\n seedKey: c.seedKey,\n }\n}\n\n/**\n * Usable parts: each part inset by half a wall on every side, plus, for each stretch where it touches another part of the same room\n * (more than 0.3 m), a strip that reaches the shared edge. The inset stays at the ends of the stretch, where a real wall or corner stands.\n */\nexport function usableParts(room: Room, extra?: number): Rect[] {\n const m = MARGIN + (extra || 0)\n const out: Rect[] = []\n for (const p of room.parts) {\n out.push([p[0] + m, p[1] + m, p[2] - m, p[3] - m])\n for (let k = 0; k < 4; k++) {\n const spans: [number, number][] = []\n for (const q of room.parts) {\n if (q === p) continue\n if (k === 0 && eq(q[2], p[0])) spans.push([Math.max(q[1], p[1]), Math.min(q[3], p[3])])\n else if (k === 2 && eq(q[0], p[2])) spans.push([Math.max(q[1], p[1]), Math.min(q[3], p[3])])\n else if (k === 1 && eq(q[3], p[1])) spans.push([Math.max(q[0], p[0]), Math.min(q[2], p[2])])\n else if (k === 3 && eq(q[1], p[3])) spans.push([Math.max(q[0], p[0]), Math.min(q[2], p[2])])\n }\n spans.sort((x, y) => x[0] - y[0])\n const merged: [number, number][] = []\n for (const span of spans) {\n const last = merged[merged.length - 1]\n if (last && span[0] <= last[1] + TOL) last[1] = Math.max(last[1], span[1])\n else merged.push([span[0], span[1]])\n }\n for (const [a, b] of merged) {\n if (b - a <= 0.3) continue\n const x0 = a + m\n const x1 = b - m\n if (x1 <= x0) continue\n if (k === 0) out.push([p[0], x0, p[0] + m, x1])\n else if (k === 2) out.push([p[2] - m, x0, p[2], x1])\n else if (k === 1) out.push([x0, p[1], x1, p[1] + m])\n else out.push([x0, p[3] - m, x1, p[3]])\n }\n }\n }\n return out\n}\n\nexport const inRect = (room: Room, u: number, v: number): boolean => room.parts.some((p) => u > p[0] + EPS && u < p[2] - EPS && v > p[1] + EPS && v < p[3] - EPS)\n\nexport interface WallBuildDoor {\n axis: 'u' | 'v'\n pos: number\n at: number\n width: number\n}\n\n/** Walls of one storey, split where rooms meet and cut where doors open. */\nexport function buildWalls(rooms: Room[], doors: WallBuildDoor[], openPairs: [string, string][], floorIndex: number) {\n const groups: Record<string, { axis: 'u' | 'v'; pos: number; es: { a: number; b: number; id: string; side: number }[] }> = {}\n const add = (axis: 'u' | 'v', pos: number, a: number, b: number, id: string, side: number) => {\n const k = axis + '|' + pos.toFixed(2)\n ;(groups[k] = groups[k] || { axis, pos, es: [] }).es.push({ a, b, id, side })\n }\n for (const c of rooms)\n for (const p of c.parts) {\n add('u', p[1], p[0], p[2], c.id, 1)\n add('u', p[3], p[0], p[2], c.id, -1)\n add('v', p[0], p[1], p[3], c.id, 1)\n add('v', p[2], p[1], p[3], c.id, -1)\n }\n const par = (x: string, y: string) => openPairs.some((o) => (o[0] === x && o[1] === y) || (o[0] === y && o[1] === x))\n const typeOf: Record<string, string> = {}\n for (const c of rooms) typeOf[c.id] = c.type\n const out: Record<string, unknown>[] = []\n for (const g of Object.values(groups)) {\n const breaks = [...new Set(g.es.flatMap((e) => [r2(e.a), r2(e.b)]))].sort((x, y) => x - y)\n const segs: { A: string; B: string; p: number; q: number }[] = []\n for (let i = 0; i < breaks.length - 1; i++) {\n const p = breaks[i]\n const q = breaks[i + 1]\n const m = (p + q) / 2\n const after = g.es.find((e) => e.side === 1 && m > e.a && m < e.b)\n const before = g.es.find((e) => e.side === -1 && m > e.a && m < e.b)\n if (!after && !before) continue\n const A = before ? before.id : 'outside'\n const B = after ? after.id : 'outside'\n if (A === B || (A !== 'outside' && B !== 'outside' && par(A, B))) continue\n const last = segs[segs.length - 1]\n if (last && last.A === A && last.B === B && eq(last.q, p)) last.q = q\n else segs.push({ A, B, p, q })\n }\n for (const s of segs) {\n let pieces: [number, number][] = [[s.p, s.q]]\n for (const pt of doors) {\n if (pt.axis !== g.axis || !eq(pt.pos, g.pos)) continue\n const c0 = pt.at - pt.width / 2\n const c1 = pt.at + pt.width / 2\n const n: [number, number][] = []\n for (const [x, y] of pieces) {\n if (c1 <= x + TOL || c0 >= y - TOL) {\n n.push([x, y])\n continue\n }\n if (c0 > x + TOL) n.push([x, c0])\n if (c1 < y - TOL) n.push([c1, y])\n }\n pieces = n\n }\n for (const [x, y] of pieces) {\n const isOpen = (t: string) => t === 'balcony' || t === 'terrace' || t === 'porch'\n const isVoid = typeOf[s.A] === 'void' || typeOf[s.B] === 'void'\n if (isVoid && (s.A === 'outside' || s.B === 'outside')) continue\n const railing = isVoid || (isOpen(typeOf[s.A]) && s.B === 'outside') || (isOpen(typeOf[s.B]) && s.A === 'outside')\n out.push({\n floor: floorIndex,\n axis: g.axis,\n u0: g.axis === 'u' ? x : g.pos,\n v0: g.axis === 'u' ? g.pos : x,\n u1: g.axis === 'u' ? y : g.pos,\n v1: g.axis === 'u' ? g.pos : y,\n thickness: WALL_THICKNESS,\n sides: [s.A, s.B],\n exterior: s.A === 'outside' || s.B === 'outside',\n type: railing ? 'railing' : 'wall',\n h: railing ? 1.1 : 0,\n })\n }\n }\n }\n return out\n}\n","import { extent } from './geometry'\nimport type { CarClearance, FurnitureDef, Rect, Slot, Vec2 } from './types'\n\nconst STEP = 0.05\nconst MAX_CANDIDATES = 80\n\n/**\n * Where a car may stand in a parking slot: `rect` is the car, `clear` the car plus the space it must keep from walls\n * (the driver side, on the left of whoever looks along the front, keeps more than the passenger side). Candidates are sorted by\n * their distance to the slot centre; the car always stays whole inside the zone.\n */\nexport function carCandidates(slot: Slot, item: FurnitureDef, car: CarClearance): { rect: Rect; clear: Rect }[] {\n const front: Vec2 = [slot.frontU, slot.frontV]\n const zone: Rect = slot._cell.R\n const alongV = Math.abs(front[1]) === 1\n const [extentU, extentV] = extent([item.w, item.d], front)\n const across = alongV ? extentU : extentV\n const along = alongV ? extentV : extentU\n const a = alongV ? 0 : 1\n const b = alongV ? 1 : 0\n const driverSign = alongV ? front[1] : -front[0]\n const frontSign = alongV ? front[1] : front[0]\n const lowClear = driverSign < 0 ? car.driver : car.side\n const highClear = driverSign < 0 ? car.side : car.driver\n const lo = zone[a] + lowClear\n const hi = zone[a + 2] - highClear - across\n const alongLo = zone[b] + car.end\n const alongHi = zone[b + 2] - car.end - along\n if (hi < lo - 1e-6 || alongHi < alongLo - 1e-6) return []\n const preferred = (alongV ? slot.x : slot.z) - across / 2\n const alongStart = frontSign < 0 ? alongHi : alongLo\n const positions: number[] = []\n for (let p = lo; p <= hi + 1e-6; p += STEP) positions.push(Math.min(p, hi))\n positions.sort((x, y) => Math.abs(x - preferred) - Math.abs(y - preferred))\n return positions.slice(0, MAX_CANDIDATES).map((p) => {\n const rect: Rect = alongV ? [p, alongStart, p + across, alongStart + along] : [alongStart, p, alongStart + along, p + across]\n const clear: Rect = alongV ? [p - lowClear, alongStart - car.end, p + across + highClear, alongStart + along + car.end] : [alongStart - car.end, p - lowClear, alongStart + along + car.end, p + across + highClear]\n return { rect, clear }\n })\n}\n","import { EPS, MARGIN, OVERHEAD_TOP } from './constants'\nimport { eq, inRect } from './geometry'\nimport type { FurnitureDef, Json, Plan, Rect, Room } from './types'\n\n/** Door and path zones of a storey (storey -1 is the lot). */\nexport function zonesOfFloor(plan: Plan, floorIndex: number): Rect[] {\n const out: Rect[] = []\n if (floorIndex >= 0) {\n for (const p of plan.doors) if (p.floor === floorIndex) out.push(...p.zones)\n } else {\n for (const p of plan.doors) if (p.floor === 0 && p.exterior) out.push(...p.zones)\n for (const g of plan.gates) out.push(...g.zones)\n for (const c of plan.paths) out.push(...c.rects)\n out.push(...plan.reservations)\n }\n return out\n}\n\nexport function openingsOfFloor(plan: Plan, floorIndex: number): Json[] {\n if (floorIndex >= 0) return plan.doors.filter((p) => p.floor === floorIndex)\n return plan.doors.filter((p) => p.floor === 0 && p.exterior).concat(plan.gates)\n}\n\n/** Keep-out zone of a window (inside, or outside for the lot). */\nexport function windowZone(j: Json, outside?: boolean): Rect {\n const h = j.width / 2 + 0.1\n const depth = 0.5\n let n: [number, number]\n if (j.side === 'front') n = [0, 1]\n else if (j.side === 'back') n = [0, -1]\n else if (j.side === 'left') n = [1, 0]\n else n = [-1, 0]\n if (outside) n = [-n[0], -n[1]]\n const u = j.u\n const v = j.v\n if (j.axis === 'u') return n[1] > 0 ? [u - h, v - MARGIN, u + h, v + depth] : [u - h, v - depth, u + h, v + MARGIN]\n return n[0] > 0 ? [u - MARGIN, v - h, u + depth, v + h] : [u - depth, v - h, u + MARGIN, v + h]\n}\n\n/** `overheadOff`: the counter sits under the window without its wall cabinet. */\nexport function blocksWindow(it: Pick<FurnitureDef, 'window' | 'overhead' | 'windowHeight'> & { h: number }, win: Json, overheadOff?: boolean): boolean {\n const height = Math.max(it.h, it.windowHeight || 0, it.overhead && !overheadOff ? OVERHEAD_TOP : 0)\n return !it.window || it.h > 1.0 + EPS || height > win.y0 - 0.05 + EPS\n}\n\nexport function windowsOfRoom(plan: Plan, room: Room): Json[] {\n if (!room.outdoor) return plan.windows.filter((j) => j.room === room.id)\n return plan.windows.filter(\n (j) =>\n j.floor === 0 &&\n room.parts.some((p) => {\n if (j.side === 'front') return eq(p[3], j.pos) && j.u >= p[0] && j.u <= p[2]\n if (j.side === 'back') return eq(p[1], j.pos) && j.u >= p[0] && j.u <= p[2]\n if (j.side === 'left') return eq(p[2], j.pos) && j.v >= p[1] && j.v <= p[3]\n return eq(p[0], j.pos) && j.v >= p[1] && j.v <= p[3]\n }),\n )\n}\n\nexport function roomAt(plan: Plan, u: number, v: number, floorIndex: number): Room | null {\n const list = floorIndex < 0 ? plan.zones : plan.rooms\n return list.find((c) => c.floor === floorIndex && inRect(c, u, v)) || null\n}\n\nexport function isOpenSide(plan: Plan, room: Room, pu: number, pv: number): boolean {\n const o = roomAt(plan, pu, pv, room.floor)\n if (!o) return false\n if (o.id === room.id) return true\n if (room.outdoor) return true\n return (plan.openPairs[room.floor] || []).some((x) => (x[0] === room.id && x[1] === o.id) || (x[1] === room.id && x[0] === o.id))\n}\n","import { MARGIN } from './constants'\nimport { entryPoints, eq, inRect, inner, sharedEdge, usableParts } from './geometry'\nimport { openingsOfFloor } from './queries'\nimport type { Json, Plan, Rect, Room } from './types'\n\nexport interface Grid {\n gs: number\n u0: number\n v0: number\n nx: number\n nz: number\n inside: Uint8Array\n entries: [number, number][]\n center: [number, number]\n}\n\n/** Wall bodies of a storey (the wall line plus half a wall each side); a wall end that stops at a door opening has no extension there. */\nfunction wallBodies(plan: Plan, floor: number): Rect[] {\n const cache = (plan.wallBodies = plan.wallBodies || {})\n if (cache[floor]) return cache[floor]\n const doors = plan.doors.filter((p) => p.floor === floor)\n return (cache[floor] = plan.walls\n .filter((p) => p.floor === floor && (p.type === 'wall' || p.type === 'railing'))\n .map((p) => {\n const a0 = p.axis === 'u' ? p.u0 : p.v0\n const a1 = p.axis === 'u' ? p.u1 : p.v1\n const pos = p.axis === 'u' ? p.v0 : p.u0\n const atDoor = (x: number) => doors.some((q) => q.axis === p.axis && eq(q.pos, pos) && (eq(q.at - q.width / 2, x) || eq(q.at + q.width / 2, x)))\n const e0 = atDoor(a0) ? 0 : MARGIN\n const e1 = atDoor(a1) ? 0 : MARGIN\n return (p.axis === 'u' ? [a0 - e0, pos - MARGIN, a1 + e1, pos + MARGIN] : [pos - MARGIN, a0 - e0, pos + MARGIN, a1 + e1]) as Rect\n }))\n}\n\n/**\n * Walkability grid of a room (10 cm cells inside, 30 cm outside). Indoors a cell is walkable only when a player body of `radius`\n * fits between it and the walls. `ignored` lists opening ids to leave out of the entries.\n */\nexport function createGrid(plan: Plan, room: Room, ignored?: Set<string> | null, radius: number = plan.playerRadius): Grid {\n const gs = room.outdoor ? 0.3 : 0.1\n let u0 = 1e9\n let v0 = 1e9\n let u1 = -1e9\n let v1 = -1e9\n for (const p of room.parts) {\n u0 = Math.min(u0, p[0])\n v0 = Math.min(v0, p[1])\n u1 = Math.max(u1, p[2])\n v1 = Math.max(v1, p[3])\n }\n const nx = Math.ceil((u1 - u0) / gs)\n const nz = Math.ceil((v1 - v0) / gs)\n const insideCells = new Uint8Array(nx * nz)\n const insets = room.outdoor ? usableParts(room, 0.08) : room.parts\n // only the walls within reach of the room's box can be closer than the player's body to one of its cells (a tower floor has hundreds of them)\n const bodies = room.outdoor ? null : wallBodies(plan, room.floor).filter((r) => r[0] - radius <= u1 && r[2] + radius >= u0 && r[1] - radius <= v1 && r[3] + radius >= v0)\n const tooClose = (u: number, v: number) =>\n (bodies as Rect[]).some((r) => {\n const dx = Math.max(r[0] - u, 0, u - r[2])\n const dz = Math.max(r[1] - v, 0, v - r[3])\n return dx * dx + dz * dz < radius * radius - 1e-9\n })\n for (let j = 0; j < nz; j++)\n for (let i = 0; i < nx; i++) {\n const u = u0 + (i + 0.5) * gs\n const v = v0 + (j + 0.5) * gs\n if (insets.some((r) => u >= r[0] && u <= r[2] && v >= r[1] && v <= r[3]) && (room.outdoor || !tooClose(u, v))) insideCells[j * nx + i] = 1\n }\n const entries: [number, number][] = []\n for (const ab of openingsOfFloor(plan, room.floor) as Json[])\n if (!(ignored && ignored.has(ab.id)))\n for (const pt of entryPoints(ab)) {\n if (!inRect(room, pt[0], pt[1])) continue\n const i = Math.floor((pt[0] - u0) / gs)\n const j = Math.floor((pt[1] - v0) / gs)\n if (i >= 0 && j >= 0 && i < nx && j < nz && insideCells[j * nx + i]) entries.push([i, j])\n }\n if (!room.outdoor)\n for (const pair of plan.openPairs[room.floor] || []) {\n const otherId = pair[0] === room.id ? pair[1] : pair[1] === room.id ? pair[0] : null\n const other = otherId && plan.rooms.find((c) => c.id === otherId && c.floor === room.floor)\n if (!other) continue\n const edge = sharedEdge(room, other, null)\n if (!edge || edge.a1 - edge.a0 > 2.0) continue\n const mid = (edge.a0 + edge.a1) / 2\n for (const offset of [-0.4, 0.4]) {\n const pt = edge.axis === 'u' ? [mid, edge.pos + offset] : [edge.pos + offset, mid]\n if (!inRect(room, pt[0], pt[1])) continue\n const i = Math.floor((pt[0] - u0) / gs)\n const j = Math.floor((pt[1] - v0) / gs)\n if (i >= 0 && j >= 0 && i < nx && j < nz && insideCells[j * nx + i]) entries.push([i, j])\n }\n }\n const R = inner(room.parts[0])\n return { gs, u0, v0, nx, nz, inside: insideCells, entries, center: [(R[0] + R[2]) / 2, (R[1] + R[3]) / 2] }\n}\n\n/** True when the room centre and every entry stay connected once `solids` (inflated) are blocked. */\nexport function reachable(g: Grid, solids: Rect[], inflation: number): boolean {\n const { gs, u0, v0, nx, nz, inside } = g\n const blocked = new Uint8Array(nx * nz)\n for (const r of solids) {\n const i0 = Math.max(0, Math.floor((r[0] - inflation - u0) / gs))\n const i1 = Math.min(nx - 1, Math.floor((r[2] + inflation - u0) / gs))\n const j0 = Math.max(0, Math.floor((r[1] - inflation - v0) / gs))\n const j1 = Math.min(nz - 1, Math.floor((r[3] + inflation - v0) / gs))\n for (let j = j0; j <= j1; j++)\n for (let i = i0; i <= i1; i++) {\n const u = u0 + (i + 0.5) * gs\n const v = v0 + (j + 0.5) * gs\n if (u > r[0] - inflation && u < r[2] + inflation && v > r[1] - inflation && v < r[3] + inflation) blocked[j * nx + i] = 1\n }\n }\n let best = -1\n let bestDist = 1e9\n for (let j = 0; j < nz; j++)\n for (let i = 0; i < nx; i++) {\n const k = j * nx + i\n if (!inside[k] || blocked[k]) continue\n const dist = Math.hypot(u0 + (i + 0.5) * gs - g.center[0], v0 + (j + 0.5) * gs - g.center[1])\n if (dist < bestDist) {\n bestDist = dist\n best = k\n }\n }\n if (best < 0) return false\n if (!g.entries.length) return true\n for (const [i, j] of g.entries) if (blocked[j * nx + i]) return false\n const visited = new Uint8Array(nx * nz)\n const queue = new Int32Array(nx * nz)\n let h = 0\n let t = 0\n const s = g.entries[0][1] * nx + g.entries[0][0]\n visited[s] = 1\n queue[t++] = s\n while (h < t) {\n const k = queue[h++]\n const i = k % nx\n const j = (k - i) / nx\n for (const [di, dj] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {\n const a = i + di\n const b = j + dj\n if (a < 0 || b < 0 || a >= nx || b >= nz) continue\n const q = b * nx + a\n if (visited[q] || !inside[q] || blocked[q]) continue\n visited[q] = 1\n queue[t++] = q\n }\n }\n if (!visited[best]) return false\n for (const [i, j] of g.entries) if (!visited[j * nx + i]) return false\n return true\n}\n","import { EPS } from './constants'\nimport { carCandidates } from './parking'\nimport { clearRect, extent, insideUnion, overlaps, r2, usableParts } from './geometry'\nimport { createGrid, reachable } from './grid'\nimport { blocksWindow, windowZone, windowsOfRoom, zonesOfFloor } from './queries'\nimport { CATALOG, SEED_KEYS } from './registry'\nimport { weightedOrder } from './rng'\nimport type { Rng } from './rng'\nimport type { FurnitureDef, Json, PlacedItem, Plan, Rect, Room, Slot, Vec2, Weights } from './types'\n\nfunction candidatesOf(cats: Weights): { it: FurnitureDef; weight: number }[] {\n const out: { it: FurnitureDef; weight: number }[] = []\n for (const [cat, weight] of Object.entries(cats)) {\n const exact = cat[0] === '='\n const its = Object.values(CATALOG).filter((i) => !i.decor && (exact ? i.type === cat.slice(1) : !i.exactOnly && (i.category === cat || i.type === cat)))\n for (const it of its) out.push({ it, weight: weight / its.length })\n }\n return out\n}\n\nfunction itemRect(slot: Slot, it: FurnitureDef, shift: number): Rect {\n const c = slot._cell\n const f: Vec2 = c.f\n const [extentU, extentV] = extent([it.w, it.d], f)\n const R: Rect = c.R\n // centre without rounding\n let u0 = (c.rect ? (c.rect[0] + c.rect[2]) / 2 : slot.x) - extentU / 2\n let v0 = (c.rect ? (c.rect[1] + c.rect[3]) / 2 : slot.z) - extentV / 2\n if (shift) {\n if (slot.side === 'left' || slot.side === 'right') v0 += shift\n else u0 += shift\n }\n for (const s of c.enclosed) {\n if (s === 'left') u0 = R[0]\n else if (s === 'right') u0 = R[2] - extentU\n else if (s === 'front') v0 = R[1]\n else if (s === 'back') v0 = R[3] - extentV\n }\n return [u0, v0, u0 + extentU, v0 + extentV]\n}\n\n/** Radius of the relaxed pass: a required item that did not fit settles for a narrower walkway. */\nconst RELAXED_RADIUS = 0.12\n\nconst MESH_FRONT: Record<string, Vec2> = { '+z': [0, 1], '-z': [0, -1], '+x': [1, 0], '-x': [-1, 0] }\n\n/** Rotation that makes a mesh whose front is `front` face `f`. */\nexport function rotationFor(f: Vec2, front: string): number {\n const meshFront = MESH_FRONT[front] || [0, 1]\n let ry = Math.atan2(f[0], f[1]) - Math.atan2(meshFront[0], meshFront[1])\n if (ry > Math.PI + EPS) ry -= 2 * Math.PI\n if (ry < -Math.PI - EPS) ry += 2 * Math.PI\n return r2(ry)\n}\n\n/** Fills the slots of one room with catalogue items, honouring clearances, doors, windows and reachability. */\nexport function fillRoom(plan: Plan, room: Room, slots: Slot[], rng: Rng): { items: PlacedItem[]; missing: { room: string; slot: string }[] } {\n const items: PlacedItem[] = []\n const missing: { room: string; slot: string }[] = []\n const state: Record<string, PlacedItem> = {}\n const solids: Rect[] = []\n const reserves: Rect[] = []\n const rims: Rect[] = []\n const inners = usableParts(room, 0)\n const grid = createGrid(plan, room)\n const relaxedGrid = room.outdoor ? grid : createGrid(plan, room, null, RELAXED_RADIUS)\n const zones = zonesOfFloor(plan, room.floor)\n const windowZones = windowsOfRoom(plan, room).map((j) => ({ z: windowZone(j, room.outdoor), j }))\n const inflation = room.outdoor ? 0.15 : plan.playerRadius\n interface Unit {\n group: string | null\n members: Slot[]\n required?: boolean\n }\n const units: Unit[] = []\n const seen: Record<string, Unit> = {}\n for (const s of slots) {\n if (s.group) {\n if (seen[s.group]) {\n seen[s.group].members.push(s)\n continue\n }\n const u: Unit = { group: s.group, members: [s] }\n seen[s.group] = u\n units.push(u)\n } else units.push({ group: null, members: [s] })\n }\n for (const u of units) u.required = u.members.some((m) => m.required)\n const queue = units.filter((u) => u.required).concat(units.filter((u) => !u.required))\n const dependencies = (u: Unit) =>\n u.members\n .flatMap((m) => [m.requires, m.on])\n .filter(Boolean)\n .filter((id) => slots.some((s) => s.id === id && !u.members.includes(s)))\n const done = new Set<string>()\n const ready = (u: Unit) => dependencies(u).every((id) => done.has(id as string))\n const make = (s: Slot, it: FurnitureDef, r: Rect, parent: PlacedItem | null, overheadOff?: boolean) => {\n const f: Vec2 = [s.frontU, s.frontV]\n const id = room.id + '.' + s.id\n const m: Json = {\n id,\n type: it.type,\n category: it.category,\n x: r2((r[0] + r[2]) / 2),\n z: r2((r[1] + r[3]) / 2),\n ry: rotationFor(f, it.front),\n w: it.w,\n d: it.d,\n h: it.h,\n y: parent ? r2((parent.y || 0) + parent.h) : 0,\n frontU: f[0],\n frontV: f[1],\n room: room.id,\n floor: room.floor,\n outdoor: !!room.outdoor,\n slot: s.id,\n on: parent ? s.on : null,\n mode: parent ? (s.anchor === 'inside' ? 'inside' : 'on') : null,\n clearance: s.clearance,\n flat: it.flat,\n low: it.low,\n aabb: r.map(r2),\n _r: r,\n _seedId: SEED_KEYS.items[id] ?? id,\n }\n if (it.overhead) m.overhead = !overheadOff\n if (it.category === 'car') {\n m.driver = [f[1], -f[0]]\n m.carClearance = plan.carClearance\n }\n if (parent && s.anchor === 'inside') m.y = r2(parent.y || 0)\n if (room.link) m.link = { from: room.link[0], to: room.link[1] }\n state[s.id] = m\n items.push(m as PlacedItem)\n return m as PlacedItem\n }\n const tryFit = (s: Slot, relax: boolean, overheadOff?: boolean): PlacedItem | null => {\n const cands = weightedOrder(candidatesOf(s.cats), rng)\n if (s.anchor === 'on' || s.anchor === 'inside') {\n const parent = state[s.on as string]\n if (!parent) return null\n for (const { it } of cands) {\n if (it.w > parent.w + EPS || it.d > parent.d + EPS) continue\n const f: Vec2 = [parent.frontU, parent.frontV]\n const r: Rect = parent.aabb\n const [extentU, extentV] = extent([it.w, it.d], f)\n const cu = (r[0] + r[2]) / 2 - f[0] * (parent.d / 2 - it.d / 2)\n const cv = (r[1] + r[3]) / 2 - f[1] * (parent.d / 2 - it.d / 2)\n return make(s, it, [cu - extentU / 2, cv - extentV / 2, cu + extentU / 2, cv + extentV / 2], parent)\n }\n return null\n }\n for (const { it } of cands) {\n if (it.w > s.w + EPS || it.d > s.d + EPS) continue\n const f: Vec2 = [s.frontU, s.frontV]\n const slide = s.anchor === 'wall' ? (s.slide == null ? 2.0 : s.slide) : 0\n const shifts = [0]\n for (let k = 1; k * 0.1 <= slide + 1e-9; k++) shifts.push(k * 0.1, -k * 0.1)\n let found: { rect: Rect; cl?: Rect | null; rimRect?: Rect | null } | null = null\n const car = it.category === 'car' && !relax\n const tries: { rect: Rect; clear?: Rect }[] = car ? carCandidates(s, it, plan.carClearance) : shifts.map((shift) => ({ rect: itemRect(s, it, shift) }))\n for (const attempt of tries) {\n const r = attempt.rect\n if (!insideUnion(r, inners)) continue\n if (car && (!insideUnion(attempt.clear as Rect, inners) || solids.some((o) => overlaps(attempt.clear as Rect, o)))) continue\n if (it.flat) {\n found = { rect: r }\n break\n }\n if (zones.some((z) => overlaps(r, z))) continue\n if (windowZones.some(({ z, j }) => blocksWindow(it, j, overheadOff) && overlaps(r, z))) continue\n if (solids.some((o) => overlaps(r, o))) continue\n if (!it.deck && rims.some((a) => overlaps(r, a))) continue\n let cl: Rect | null = car ? (attempt.clear as Rect) : null\n if (!car && !relax && s.clearance > 0 && !it.low) {\n cl = clearRect(r, f, s.clearance)\n if (!insideUnion(cl, inners)) continue\n if (items.some((m) => !m.low && !m.flat && !m.on && overlaps(cl as Rect, m._r))) continue\n }\n if (!it.low && reserves.some((q) => overlaps(r, q))) continue\n let rimRect: Rect | null = null\n if (it.rim) {\n rimRect = [r[0] - it.rim, r[1] - it.rim, r[2] + it.rim, r[3] + it.rim]\n if (!insideUnion(rimRect, inners) || solids.some((o) => overlaps(rimRect as Rect, o)) || zones.some((z) => overlaps(rimRect as Rect, z))) continue\n }\n if (!(relax ? reachable(relaxedGrid, solids.concat([r]), RELAXED_RADIUS) : reachable(grid, solids.concat([r]), inflation))) continue\n found = { rect: r, cl, rimRect }\n break\n }\n if (!found) continue\n const { rect: r, cl, rimRect } = found\n if (it.flat) return make(s, it, r, null)\n const m = make(s, it, r, null, overheadOff)\n if (cl) reserves.push(cl)\n if (rimRect) rims.push(rimRect)\n solids.push(r)\n return m\n }\n return null\n }\n const process = (u: Unit) => {\n const pr = u.members[0].chance as number\n const x = rng()\n const arr = u.members.slice()\n const members: Slot[] = []\n while (arr.length) members.push(arr.splice(arr.length > 1 ? Math.floor(rng() * arr.length) : 0, 1)[0])\n const applicable = members.filter((m) => m.valid && (!m.requires || state[m.requires]) && (!m.on || state[m.on]))\n if (!u.required && x >= pr) return\n let ok = false\n for (const m of applicable) {\n if (tryFit(m, false)) {\n ok = true\n break\n }\n }\n if (!ok)\n for (const m of applicable) {\n if (tryFit(m, false, true)) {\n ok = true\n break\n }\n }\n if (!ok && u.required)\n for (const m of applicable) {\n if (tryFit(m, true, true)) {\n ok = true\n break\n }\n }\n if (!ok && u.required && (applicable.length || !u.members.some((m) => m.requires))) missing.push({ room: room.id, slot: u.group || u.members[0].id })\n }\n const pending = queue.slice()\n while (pending.length) {\n let i = pending.findIndex(ready)\n if (i < 0) i = 0\n const u = pending.splice(i, 1)[0]\n process(u)\n for (const m of u.members) done.add(m.id)\n }\n return { items, missing }\n}\n","/**\n * Names of the seeded random streams.\n *\n * These strings come from the Portuguese-language SDK this engine replaces. They are kept\n * verbatim on purpose: a stream is `hash(seed + '|' + name)`, so renaming one would change every\n * plan generated from an existing seed. They never appear in the output.\n */\nexport const STREAM = {\n facade: 'fachada',\n lot: 'lote',\n decor: 'decor',\n roomPrefix: 'c:',\n palettePrefix: 'paleta:',\n} as const\n","import { MARGIN, EPS } from './constants'\nimport {\n areaOf,\n clamp,\n clearRect,\n cutIntervals,\n extent,\n inflate,\n inner,\n insideUnion,\n overlaps,\n r2,\n topOf,\n usableParts,\n} from './geometry'\nimport { rotationFor } from './fill'\nimport { createGrid, reachable } from './grid'\nimport { STREAM } from './legacy-seeds'\nimport { blocksWindow, roomAt, windowZone, windowsOfRoom, zonesOfFloor } from './queries'\nimport { CATALOG, DECOR_PROFILES, GROUND_OVERLAYS, PASSES, SEED_KEYS } from './registry'\nimport { createRng, pickWeighted, shuffle } from './rng'\nimport type { Rng } from './rng'\nimport type { Json, PlacedItem, Plan, PlacementContext, PlacementKit, Rect, Room, Vec2 } from './types'\n\n/** Geometry and grid helpers shared with decor passes and state plugins. */\nexport const placementKit: PlacementKit = {\n MARGIN,\n EPS,\n r2,\n clamp,\n overlaps,\n inner,\n inflate,\n areaOf,\n topOf,\n extent,\n insideUnion,\n usableParts,\n zonesOfFloor,\n windowsOfRoom,\n windowZone,\n roomAt,\n reachable: reachable as PlacementKit['reachable'],\n createGrid: createGrid as PlacementKit['createGrid'],\n clearRect,\n pickWeighted,\n createRng,\n roomSeedKey: (room: Room) => room.seedKey ?? SEED_KEYS.rooms[room.id] ?? room.id,\n shuffle,\n facingRotation: (f: Vec2, type: string) => rotationFor(f, CATALOG[type].front),\n cutIntervals,\n blocksWindow,\n}\n\n/** Builds the shared placement context over the items already placed by the slot fill. */\nexport function createPlacementContext(plan: Plan, items: PlacedItem[]): PlacementContext {\n const added: PlacedItem[] = []\n const counters: Record<string, number> = {}\n const make = (room: Room, type: string, r: Rect, f: Vec2, o?: Json): PlacedItem => {\n const it = CATALOG[type]\n const n = (counters[room.id + type] = (counters[room.id + type] || 0) + 1)\n return Object.assign(\n {\n id: room.id + '.dec_' + type + n,\n type,\n category: it.category,\n x: r2((r[0] + r[2]) / 2),\n z: r2((r[1] + r[3]) / 2),\n ry: r2(Math.atan2(f[0], f[1])),\n w: it.w,\n d: it.d,\n h: it.h,\n y: 0,\n frontU: f[0],\n frontV: f[1],\n room: room.id,\n floor: room.floor,\n outdoor: !!room.outdoor,\n slot: 'dec_' + type + n,\n on: null,\n mode: null,\n clearance: 0,\n flat: !!it.flat,\n low: it.low,\n aabb: r.map(r2),\n _r: r,\n decor: true,\n mount: it.mount,\n },\n o || {},\n ) as PlacedItem\n }\n const add = (m: PlacedItem) => {\n added.push(m)\n items.push(m)\n return m\n }\n const itemsOfRoom = (c: Room) => items.filter((m) => m.room === c.id && m.floor === c.floor)\n const extraSolids: Record<string, Rect[]> = {}\n const solidsOfRoom = (c: Room): Rect[] =>\n itemsOfRoom(c)\n .filter((m) => !m.flat && !m.on && (!m.decor || m.mount === 'floor'))\n .map((m) => m._r as Rect)\n .concat(extraSolids[c.id] || [])\n const gridCache: Record<string, ReturnType<typeof createGrid>> = {}\n let ignored: Set<string> | null = null\n const gridOf = (c: Room) => gridCache[c.id] || (gridCache[c.id] = createGrid(plan, c, ignored))\n\n /** Places a floor item at a corner or along a wall; respects doors, windows, clearances and walkability. */\n function placeOnFloor(room: Room, type: string, rng2: Rng, optsIn?: Json): Rect | null {\n const opts = Object.assign({}, optsIn || {})\n const it0 = CATALOG[type]\n if (it0.flat) opts.flat = true\n const it = CATALOG[type]\n const inners = usableParts(room, 0)\n const solidList = solidsOfRoom(room)\n const zones = zonesOfFloor(plan, room.floor)\n const occupied = itemsOfRoom(room)\n const windowZones = windowsOfRoom(plan, room).map((j) => ({ z: windowZone(j, room.outdoor), j }))\n // the 1 m landing in front of a staircase stays free\n const landings: Rect[] = it0.flat\n ? []\n : items\n .filter((m) => m.type === 'stairs' && m.floor === room.floor && m.aabb)\n .map((m) => {\n const r = m.aabb\n return (m.frontV === 1 ? [r[0], r[3], r[2], r[3] + 1] : m.frontV === -1 ? [r[0], r[1] - 1, r[2], r[1]] : m.frontU === 1 ? [r[2], r[1], r[2] + 1, r[3]] : [r[0] - 1, r[1], r[0], r[3]]) as Rect\n })\n const cand: Rect[] = opts.cands ? opts.cands.slice() : []\n if (!opts.cands)\n for (const p of inners) {\n const extentU = opts.dim ? opts.dim[0] : it.w\n const extentV = opts.dim ? opts.dim[1] : it.d\n for (const [x, z] of [[p[0], p[1]], [p[2] - extentU, p[1]], [p[0], p[3] - extentV], [p[2] - extentU, p[3] - extentV]]) cand.push([x, z, x + extentU, z + extentV])\n for (let k = 0; k < 6; k++) {\n const t = rng2()\n const side = Math.floor(rng2() * 4)\n const x = side < 2 ? p[0] + t * Math.max(0, p[2] - p[0] - extentU) : side === 2 ? p[0] : p[2] - extentU\n const z = side >= 2 ? p[1] + t * Math.max(0, p[3] - p[1] - extentV) : side === 0 ? p[1] : p[3] - extentV\n cand.push([x, z, x + extentU, z + extentV])\n }\n }\n for (const r of opts.ordered ? cand : shuffle(cand, rng2)) {\n if (!insideUnion(r, inners)) continue\n if (zones.some((z) => overlaps(r, z)) || landings.some((z) => overlaps(r, z))) continue\n if (windowZones.some(({ z, j }) => blocksWindow(it, j) && overlaps(r, z))) continue\n if (solidList.some((o) => overlaps(r, o))) continue\n if (opts.flat) {\n if (!(opts.without && opts.without(r))) return r\n continue\n }\n if (occupied.some((m) => !m.low && !m.flat && !m.on && !m.decor && m.clearance > 0 && overlaps(r, clearRect(m._r as Rect, [m.frontU, m.frontV], m.clearance)))) continue\n if (opts.without && opts.without(r)) continue\n if (!reachable(opts.railing || gridOf(room), solidList.concat([r]), room.outdoor ? 0.16 : plan.playerRadius)) continue\n return r\n }\n return null\n }\n const roomById = (id: string) => plan.rooms.find((c) => c.id === id) || plan.zones.find((c) => c.id === id)\n return {\n make,\n add,\n placeOnFloor,\n itemsOfRoom,\n solidsOfRoom,\n gridOf,\n extraSolids,\n roomById,\n setIgnored: (s) => {\n ignored = s\n for (const k of Object.keys(gridCache)) delete gridCache[k]\n },\n added,\n }\n}\n\n/** Ground cover per lot zone: one piece per zone part, plus overlays registered by content packs (decks around pools...). */\nfunction groundCover(plan: Plan, items: PlacedItem[], ctx: PlacementContext) {\n if (!plan.lot) return\n const polygonOf = (r: Rect) => [[r[0], r[1]], [r[2], r[1]], [r[2], r[3]], [r[0], r[3]]].map((p) => [r2(p[0]), r2(p[1])])\n const groundPiece = (z: Room, type: string, r: Rect, layer: number, i: number) => {\n const m = ctx.make(z, type, r, [0, 1], {\n id: z.id + '.ground' + (layer ? '_overlay' : '') + i,\n slot: 'ground' + (layer ? '_overlay' : '') + i,\n w: r2(r[2] - r[0]),\n d: r2(r[3] - r[1]),\n h: 0,\n polygon: polygonOf(r),\n layer,\n zone: z.id,\n outdoor: true,\n floor: -1,\n })\n return ctx.add(m)\n }\n for (const z of plan.zones) {\n z.parts.forEach((p, i) => groundPiece(z, z.ground as string, p, 0, i))\n let k = 0\n const clip = (r: Rect): Rect | undefined =>\n z.parts\n .map((p) => [Math.max(r[0], p[0]), Math.max(r[1], p[1]), Math.min(r[2], p[2]), Math.min(r[3], p[3])] as Rect)\n .filter((q) => q[2] - q[0] > 0.3 && q[3] - q[1] > 0.3)\n .sort((a, b) => areaOf(b) - areaOf(a))[0]\n for (const rule of GROUND_OVERLAYS) {\n const triggers = items.filter((m) => m.room === z.id && m.category === rule.category)\n if (rule.merge) {\n if (triggers.length && z.ground !== rule.unlessGround) {\n const u = triggers.reduce((a, m) => [Math.min(a[0], (m._r as Rect)[0]), Math.min(a[1], (m._r as Rect)[1]), Math.max(a[2], (m._r as Rect)[2]), Math.max(a[3], (m._r as Rect)[3])], [1e9, 1e9, -1e9, -1e9])\n const q = clip(inflate(u as Rect, rule.inflate))\n if (q) groundPiece(z, rule.ground, q, 1, k++)\n }\n } else {\n for (const m of triggers) {\n const q = clip(inflate(m._r as Rect, rule.inflate))\n if (q) groundPiece(z, rule.ground, q, 1, k++)\n }\n }\n }\n }\n}\n\n/** Runs the registered decor passes and the ground cover; returns the context for the state step. */\nexport function runPostProcess(plan: Plan, items: PlacedItem[], seed: number | string): PlacementContext {\n const ctx = createPlacementContext(plan, items)\n const rng = createRng(seed, STREAM.decor)\n for (const pass of PASSES) pass.run({ plan, items, seed, rng, ctx, kit: placementKit, catalog: CATALOG, profiles: DECOR_PROFILES })\n groundCover(plan, items, ctx)\n return ctx\n}\n","import type { FloorplanLocale } from './types'\n\ntype Namespace = keyof FloorplanLocale\n\nconst locales: Record<string, FloorplanLocale> = {}\n\n/** Registers (or extends) the strings of a language. Packs call this with their JSON files. */\nexport function registerLocale(code: string, table: FloorplanLocale): void {\n const cur = (locales[code] = locales[code] || {})\n for (const ns of Object.keys(table) as Namespace[]) cur[ns] = Object.assign(cur[ns] || {}, table[ns])\n}\n\nexport const listLocales = (): string[] => Object.keys(locales)\n\n/** Looks a key up in a namespace. Falls back to English, then to the key itself. `{n}`-style variables are replaced. */\nexport function translate(ns: Namespace, key: string, locale = 'en', vars?: Record<string, string | number>): string {\n const raw = locales[locale]?.[ns]?.[key] ?? locales.en?.[ns]?.[key] ?? key\n return vars ? raw.replace(/\\{(\\w+)\\}/g, (m, k) => (k in vars ? String(vars[k]) : m)) : raw\n}\n","import { r2 } from './geometry'\nimport type { Json, Plan, Rect, Room } from './types'\n\nexport interface ExteriorPathContext {\n gates: Json[]\n paths: Json[]\n zones: Room[]\n setback: number\n marginLeft: number\n marginRight: number\n backyard: number\n w: number\n /** Door the entrance path is named after (the template's `doorTarget`). */\n target?: { a: string; side: string }\n}\n\nconst CLOSE = 1e-6\nconst rounded = (r: Rect): Rect => r.map(r2) as Rect\nconst touches = (a: Rect, r: Rect): boolean => a[0] <= r[2] + CLOSE && a[2] >= r[0] - CLOSE && a[1] <= r[3] + CLOSE && a[3] >= r[1] - CLOSE\n\ninterface SideRoute {\n lane: { x: number; width: number; side: string }\n laneWidth: number\n half: number\n vertical: Rect\n horizontal: Rect | null\n frontStub: Rect | null\n cost: number\n rearStrip: number\n rearY: number\n frontY: number\n overlapsParking: boolean\n}\n\n/**\n * Every exterior door of the ground floor gets a paved pedestrian path to the pedestrian gate or to the nearest existing path.\n * Doors on the front go straight out; doors on the back or the sides run along the side yard, to the parking or to the front path.\n */\nexport function addExteriorDoorPaths(plan: Plan, c: ExteriorPathContext): void {\n const { gates, paths, zones, setback, marginLeft, marginRight, backyard, w } = c\n const social = gates.find((g) => g.type === 'pedestrian')\n const socialPath = social ? paths.find((p) => p.from === social.id && p.type === 'pedestrian') : null\n const parkingZone = zones.find((z) => z.id === 'parking')\n const parking: Rect | null = parkingZone ? parkingZone.parts[0] : null\n const midY = setback > 0 ? -setback / 2 : 0\n const joinToSocial = (x: number, width: number, rects: Rect[], points: number[][]) => {\n if (!socialPath) return\n const h = width / 2\n const horizontal = socialPath.rects.find((r: Rect) => midY >= r[1] - CLOSE && midY <= r[3] + CLOSE && r[2] - r[0] > r[3] - r[1]) || socialPath.rects[0]\n const targetX = x < horizontal[0] ? horizontal[0] + h : x > horizontal[2] ? horizontal[2] - h : x\n if (Math.abs(targetX - x) > CLOSE) {\n rects.push([Math.min(x, targetX) - h, midY - h, Math.max(x, targetX) + h, midY + h])\n points.push([targetX, midY])\n }\n }\n for (const door of plan.doors.filter((q) => q.floor === 0 && q.exterior)) {\n if (paths.some((p) => p.to === door.id)) continue\n const half = Math.max(1.0, Math.min(door.width, 2.0)) / 2\n const rects: Rect[] = []\n const points: number[][] = []\n const isTarget = c.target && door.a === c.target.a && door.side === c.target.side\n let fromId: string | null = social ? social.id : null\n let width = 1.0\n const id = isTarget ? 'entrance_path' : 'path_' + door.id\n if (door.side === 'front') {\n if (setback > 0) {\n const stub = Math.min(1.0, setback)\n rects.push([door.u - half, -stub, door.u + half, 0])\n points.push([door.u, 0], [door.u, -stub])\n if (-stub > midY) {\n rects.push([door.u - width / 2, midY - width / 2, door.u + width / 2, -stub])\n points.push([door.u, midY])\n }\n joinToSocial(door.u, width, rects, points)\n } else {\n rects.push([door.u - half, -1.2, door.u + half, 0])\n points.push([door.u, 0], [door.u, -1.2])\n }\n } else {\n const lanes: SideRoute['lane'][] = []\n if (marginLeft > 0.5) lanes.push({ x: -marginLeft / 2, width: marginLeft, side: 'left' })\n if (marginRight > 0.5) lanes.push({ x: w + marginRight / 2, width: marginRight, side: 'right' })\n const targets: Rect[] = paths.flatMap((p) => p.rects as Rect[]).concat(parking ? [parking] : [])\n let best: SideRoute | null = null\n for (const lane of lanes) {\n if ((door.side === 'left' && lane.side !== 'left') || (door.side === 'right' && lane.side !== 'right')) continue\n const laneWidth = Math.min(0.9, lane.width - 0.1)\n const h = laneWidth / 2\n const rearStrip = Math.min(0.8, backyard)\n const rearY = door.v + rearStrip + laneWidth / 2\n const overlapsParking = !!parking && lane.x + h > parking[0] && lane.x - h < parking[2]\n const frontY = overlapsParking || setback <= 0 ? 0 : -0.6\n let frontStub: Rect | null = null\n if (!overlapsParking && setback > 0) {\n const dir = social && social.u < lane.x ? -1 : 1\n const band = [-0.6 - h, -0.6 + h]\n let nearestX = social ? social.u : lane.x\n let nearestGap = Infinity\n for (const r of targets) {\n if (!(r[1] <= band[1] && r[3] >= band[0])) continue\n const edge = dir < 0 ? r[2] : r[0]\n const gap = Math.abs(edge - lane.x)\n if ((dir < 0 ? edge <= lane.x : edge >= lane.x) && gap < nearestGap) {\n nearestGap = gap\n nearestX = edge\n }\n }\n frontStub = [Math.min(lane.x, nearestX) - (dir < 0 ? 0 : h), -0.6 - h, Math.max(lane.x, nearestX) + (dir < 0 ? h : 0), -0.6 + h]\n }\n const vertical: Rect = [lane.x - h, frontY - (frontY < 0 ? h : 0), lane.x + h, (door.side === 'back' ? rearY : door.v) + laneWidth / 2]\n const horizontal: Rect | null = door.side === 'back' ? [Math.min(door.u, lane.x) - half, rearY - laneWidth / 2, Math.max(door.u, lane.x) + h, rearY + laneWidth / 2] : null\n const cost = (horizontal ? horizontal[2] - horizontal[0] : 0) + (frontStub ? frontStub[2] - frontStub[0] : 0)\n if (!best || cost < best.cost) best = { lane, laneWidth, half: h, vertical, horizontal, frontStub, cost, rearStrip, rearY, frontY, overlapsParking }\n }\n if (best) {\n const { lane, laneWidth, half: h, vertical, horizontal, frontStub, rearStrip, rearY, frontY, overlapsParking } = best\n width = laneWidth\n if (overlapsParking) fromId = (gates.find((g) => g.type === 'garage') || social || ({} as Json)).id || null\n if (door.side === 'back') {\n rects.push([door.u - half, door.v, door.u + half, door.v + rearStrip + laneWidth], horizontal as Rect, vertical)\n points.push([door.u, door.v], [door.u, rearY], [lane.x, rearY], [lane.x, frontY])\n } else {\n const x0 = door.side === 'left' ? lane.x - h : w\n const x1 = door.side === 'left' ? 0 : lane.x + h\n rects.push([Math.min(x0, x1), door.v - half, Math.max(x0, x1), door.v + half], vertical)\n points.push([door.u, door.v], [lane.x, door.v], [lane.x, frontY])\n }\n if (frontStub) {\n rects.push(frontStub)\n points.push([frontStub[0] < lane.x ? frontStub[0] : frontStub[2], -0.6])\n }\n } else {\n const stub = 1.0\n if (door.side === 'back') rects.push([door.u - half, door.v, door.u + half, door.v + Math.min(stub, backyard)])\n else rects.push(door.side === 'left' ? [-Math.min(stub, marginLeft), door.v - half, 0, door.v + half] : [w, door.v - half, w + Math.min(stub, marginRight), door.v + half])\n points.push([door.u, door.v])\n }\n }\n const reached = rects.slice()\n const pool: Rect[] = paths.flatMap((p) => p.rects as Rect[]).concat(parking ? [parking] : [])\n let grows = true\n while (grows) {\n grows = false\n for (const r of pool) {\n if (!reached.includes(r) && reached.some((a) => touches(a, r))) {\n reached.push(r)\n grows = true\n }\n }\n }\n const inside = (g: Json) => reached.some((r) => g.u >= r[0] - CLOSE && g.u <= r[2] + CLOSE && g.v >= r[1] - CLOSE && g.v <= r[3] + CLOSE)\n const gate = gates.find((q) => q.type === 'pedestrian' && inside(q)) || gates.find((q) => q.type !== 'cargo' && inside(q))\n if (gate) fromId = gate.id\n paths.push({ id, type: 'pedestrian', from: fromId, to: door.id, width, rects: rects.map(rounded), points: points.map((q) => q.map(r2)) })\n }\n}\n\n","import { r2 } from './geometry'\nimport type { FloorplanOptions, Json, Plan, TemplateDef, ZoneAdjustment, ZoneDef, ZoneViolation } from './types'\n\nconst ZONES: Record<string, ZoneDef> = {}\nconst PERMEABLE_GROUNDS = new Set<string>()\n\n/** Registers an urban zone (zoning rules). Returns the stored definition. */\nexport function defineZone(zone: ZoneDef): ZoneDef {\n if (!zone || !zone.id) throw new Error('defineZone: id is required')\n ZONES[zone.id] = zone\n return zone\n}\nexport const getZone = (id: string): ZoneDef | undefined => ZONES[id]\nexport const listZones = (): ZoneDef[] => Object.values(ZONES)\n\n/** Marks ground types (e.g. `lawn`, `dirt`) that count towards the permeable area of a lot. */\nexport function registerPermeableGround(...types: string[]): void {\n for (const t of types) PERMEABLE_GROUNDS.add(t)\n}\n\nexport function resolveZone(z: string | ZoneDef | undefined): ZoneDef | null {\n if (!z) return null\n if (typeof z === 'string') {\n const found = ZONES[z]\n if (!found) throw new Error('Unknown zone: ' + z)\n return found\n }\n return z\n}\n\nexport const floorsOfTemplate = (tpl: TemplateDef, op: FloorplanOptions): number => (tpl.floorsFn ? tpl.floorsFn(op) : tpl.floors || []).length\n\n/** Declared use of a template; templates without one are treated as `residential_single`. */\nexport const useOf = (tpl: TemplateDef): string => tpl.use || 'residential_single'\n\n/** Totals used by the checks: storeys, height, areas. Works on a generated result or an internal plan. */\nfunction measure(plan: Json) {\n const floors: { index: number; y0: number; ceiling: number }[] = plan.floors\n const top = floors.reduce((m, f) => Math.max(m, f.y0 + f.ceiling), 0)\n const number = plan.floorNumber != null ? plan.floorNumber : floors.length\n const rooms: { floor: number; parts: number[][] }[] = (plan.rooms || []).filter((r: Json) => r.floor >= 0)\n const area = (r: Json) => r.parts.reduce((s: number, p: number[]) => s + (p[2] - p[0]) * (p[3] - p[1]), 0)\n const footprint = plan.w * plan.d\n const built = rooms.reduce((s, r) => s + area(r), 0)\n return { storeys: number, height: r2(top), footprint, built }\n}\n\n/**\n * Checks a generated lot against a zone and returns the violations (empty when compliant).\n * `lot` is `result.lot` (may be null for apartments), `plan` is the result of `generate`.\n */\nexport function checkLot(zoneIn: string | ZoneDef, lot: Json, plan: Json): ZoneViolation[] {\n const zone = resolveZone(zoneIn) as ZoneDef\n const out: ZoneViolation[] = []\n const m = measure(plan)\n const use = plan.use || 'residential_single'\n if (!zone.allowedUses.includes(use)) out.push({ rule: 'use', actual: use, limit: zone.allowedUses.join(',') })\n if (m.storeys > zone.maxFloors) out.push({ rule: 'floors', actual: m.storeys, limit: zone.maxFloors })\n if (m.height > zone.maxHeight + 1e-9) out.push({ rule: 'height', actual: m.height, limit: zone.maxHeight })\n if (!lot) return out\n const [u0, v0, u1, v1] = lot.rect as number[]\n const width = r2(u1 - u0)\n const depth = r2(v1 - v0)\n const area = width * depth\n const party: string[] = plan.partyWalls || []\n const sides = [party.includes('left') ? Infinity : lot.sideYard.left, party.includes('right') ? Infinity : lot.sideYard.right]\n const left = sides[0]\n const right = sides[1]\n if (lot.setback < zone.setbacks.front - 1e-9) out.push({ rule: 'setback_front', actual: lot.setback, limit: zone.setbacks.front })\n if (Math.min(left, right) < zone.setbacks.side - 1e-9) out.push({ rule: 'setback_side', actual: Math.min(left, right), limit: zone.setbacks.side })\n if (lot.backyard < zone.setbacks.back - 1e-9) out.push({ rule: 'setback_back', actual: lot.backyard, limit: zone.setbacks.back })\n if (area < zone.minLot - 1e-9) out.push({ rule: 'min_lot', actual: r2(area), limit: zone.minLot })\n if (width < zone.minFrontage - 1e-9) out.push({ rule: 'min_frontage', actual: width, limit: zone.minFrontage })\n const ground = m.footprint\n const coverage = ground / area\n if (coverage > zone.maxCoverage + 1e-9) out.push({ rule: 'coverage', actual: r2(coverage), limit: zone.maxCoverage })\n const far = m.built / area\n if (far > zone.maxFar + 1e-9) out.push({ rule: 'far', actual: r2(far), limit: zone.maxFar })\n let permeable = 0\n for (const z of lot.zones as Json[]) if (PERMEABLE_GROUNDS.has(z.ground)) for (const p of z.parts as number[][]) permeable += (p[2] - p[0]) * (p[3] - p[1])\n const permeability = permeable / area\n if (permeability < zone.permeableMin - 1e-9) out.push({ rule: 'permeable', actual: r2(permeability), limit: zone.permeableMin })\n return out\n}\n\n/** Clamps adjustable options (`floors`) to the zone before the plan is built. */\nexport function clampOptionsToZone(tpl: TemplateDef, op: FloorplanOptions, zone: ZoneDef, adjustments: ZoneAdjustment[]): FloorplanOptions {\n if (tpl.singleFloor) {\n // an apartment unit: the storey it sits on must exist in a building the zone allows\n const ceiling = (tpl.floors || tpl.floorsFn?.(op) || [])[0]?.ceiling ?? 2.8\n const current = op.floor || 3\n const limit = Math.max(1, Math.min(zone.maxFloors, Math.floor(zone.maxHeight / ceiling + 1e-9)))\n if (current <= limit) return op\n adjustments.push({ field: 'floor', from: current, to: limit, reason: current > zone.maxFloors ? 'max_floors' : 'max_height' })\n return Object.assign({}, op, { floor: limit })\n }\n if (!tpl.floorRange || !tpl.floorsFn) return op\n const current = floorsOfTemplate(tpl, op)\n const floors = tpl.floorsFn(op)\n const ceiling = floors.reduce((m, f) => Math.max(m, f.ceiling), 0) || 2.8\n const byHeight = Math.max(1, Math.floor(zone.maxHeight / ceiling + 1e-9))\n const limit = Math.max(tpl.floorRange[0], Math.min(zone.maxFloors, byHeight, tpl.floorRange[1]))\n if (current <= limit) return op\n adjustments.push({ field: 'floors', from: current, to: limit, reason: current > zone.maxFloors ? 'max_floors' : 'max_height' })\n return Object.assign({}, op, { floors: limit })\n}\n\n/** Raises lot setbacks to the zone minimums. */\nexport function clampLotToZone(cfg: Json, zone: ZoneDef, adjustments: ZoneAdjustment[], partyWalls: string[] = []): void {\n const raise = (field: string, key: string, min: number, reason: string) => {\n if (cfg[key] < min) {\n adjustments.push({ field, from: cfg[key], to: min, reason })\n cfg[key] = min\n }\n }\n raise('frontSetback', 'frontSetback', zone.setbacks.front, 'setback_front')\n if (!partyWalls.includes('left')) raise('marginLeft', 'marginLeft', zone.setbacks.side, 'setback_side')\n if (!partyWalls.includes('right')) raise('marginRight', 'marginRight', zone.setbacks.side, 'setback_side')\n raise('backyardDepth', 'backyardDepth', zone.setbacks.back, 'setback_back')\n}\n\nexport type { Plan }\n\n/** Lot zone types whose ground can be switched to a permeable one to meet the permeability rate. */\nconst ADJUSTABLE_ZONES = new Set(['garden', 'backyard', 'side_yard'])\n\n/**\n * Raises the permeable area of a lot to the zone's `permeableMin` by turning paved garden, yard\n * and side zones (largest first) into the first registered permeable ground. Reports each change.\n */\nexport function enforcePermeability(lot: Json, zones: Json[], zone: ZoneDef, adjustments: ZoneAdjustment[]): void {\n const target = [...PERMEABLE_GROUNDS][0]\n if (!target) return\n const [u0, v0, u1, v1] = lot.rect as number[]\n const area = (u1 - u0) * (v1 - v0)\n const areaOfZone = (z: Json) => (z.parts as number[][]).reduce((s, p) => s + (p[2] - p[0]) * (p[3] - p[1]), 0)\n let permeable = zones.filter((z) => PERMEABLE_GROUNDS.has(z.ground)).reduce((s, z) => s + areaOfZone(z), 0)\n if (permeable / area >= zone.permeableMin) return\n const candidates = zones.filter((z) => ADJUSTABLE_ZONES.has(z.type) && !PERMEABLE_GROUNDS.has(z.ground)).sort((a, b) => areaOfZone(b) - areaOfZone(a))\n for (const z of candidates) {\n if (permeable / area >= zone.permeableMin) break\n adjustments.push({ field: 'ground:' + z.id, from: z.ground, to: target, reason: 'permeable_min' })\n z.ground = target\n permeable += areaOfZone(z)\n }\n}\n","import { CAR_CLEARANCE, DOOR_EDGE_CLEARANCE, MARGIN, PLAYER_RADIUS, TOL, WALL_THICKNESS, WINDOWLESS_ROOM_TYPES, WINDOW_EDGE_CLEARANCE } from './constants'\nimport { buildWalls, clamp, eq, exteriorEdge, inRect, normalizeRoom, openingDepth, openingZones, r2, sharedEdge } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { createRng, pickWeighted } from './rng'\nimport { STYLES, WALL_TOP_HEIGHTS, resolveStyleId, styleOf } from './registry'\nimport { addExteriorDoorPaths } from './paths'\nimport { clampLotToZone, enforcePermeability } from './zoning'\nimport type { FloorDef, FloorplanOptions, Json, LotConfig, Plan, Rect, Room, StyleDef, TemplateDef, WindowDef, ZoneAdjustment, ZoneDef } from './types'\n\nexport const floorsOf = (tpl: TemplateDef, op?: FloorplanOptions): FloorDef[] => (tpl.floorsFn ? tpl.floorsFn(op || {}) : (tpl.floors as FloorDef[]))\n\nexport function clampSize(tpl: TemplateDef, w: number | undefined, d: number | undefined, op?: FloorplanOptions) {\n const L = tpl.limitsFn ? tpl.limitsFn(op || {}) : tpl.limits\n const P0 = tpl.defaultsFn ? tpl.defaultsFn(op || {}) : tpl.defaults\n const ww = w == null ? P0.w : clamp(w, L.w[0], L.w[1])\n const dd = d == null ? P0.d : clamp(d, L.d[0], L.d[1])\n return { w: r2(ww), d: r2(dd) }\n}\n\nexport interface BuildContext {\n zone?: ZoneDef | null\n adjustments?: ZoneAdjustment[]\n}\n\nexport function buildPlan(tpl: TemplateDef, wIn: number | undefined, dIn: number | undefined, opIn?: FloorplanOptions, bc: BuildContext = {}): Plan {\n const op = opIn || {}\n const { w, d } = clampSize(tpl, wIn, dIn, op)\n const styleId = resolveStyleId(op.style || (typeof tpl.style === 'function' ? tpl.style(op) : tpl.style) || 'budget')\n const FLOOR_DEFS = floorsOf(tpl, op)\n const style = styleOf(styleId)\n const plan: Plan = {\n w, d, tpl, floorDefs: FLOOR_DEFS, style: styleId, floors: [], rooms: [], zones: [], doors: [], windows: [], walls: [], gates: [], paths: [], lot: null, openPairs: {}, reservations: [], options: op,\n playerRadius: op.playerRadius ?? PLAYER_RADIUS,\n carClearance: Object.assign({}, CAR_CLEARANCE, op.carClearance),\n }\n FLOOR_DEFS.forEach((A, floorIndex) => {\n const floorNumber = tpl.singleFloor ? op.floor || 3 : floorIndex + 1\n plan.floors.push({\n index: floorIndex,\n name: tpl.singleFloor ? 'floor_n' : A.label,\n number: tpl.singleFloor ? floorNumber : undefined,\n y0: tpl.singleFloor ? (floorNumber - 1) * A.ceiling : tpl.cumulativeCeilings ? FLOOR_DEFS.slice(0, floorIndex).reduce((t, q) => t + q.ceiling, 0) : floorIndex * A.ceiling,\n ceiling: A.ceiling,\n })\n plan.openPairs[floorIndex] = A.openPairs || []\n const list = A.rooms(w, d, op).map((c) => normalizeRoom(c, floorIndex))\n for (const c of list) {\n if (plan.rooms.some((x) => x.id === c.id)) throw new Error('Duplicate room: ' + c.id)\n plan.rooms.push(c)\n }\n const byId: Record<string, Room> = {}\n for (const c of list) byId[c.id] = c\n const floorDoors: Json[] = []\n ;(A.doors(w, d, op) || []).forEach((sp, i) => {\n const a = byId[sp.a]\n if (!a) throw new Error('Door references a missing room: ' + sp.a)\n let edge\n if (sp.edge) edge = sp.edge\n else if (sp.b === 'outside') edge = exteriorEdge(a, sp.side as string, w, d, sp.at)\n else {\n const b = byId[sp.b]\n if (!b) throw new Error('Door references a missing room: ' + sp.b)\n edge = sharedEdge(a, b, sp.at)\n }\n if (!edge) throw new Error('Door without a wall: ' + sp.a + ' / ' + sp.b)\n const width = sp.width\n const margin = width / 2 + (sp.clearance ?? tpl.clearance?.door ?? DOOR_EDGE_CLEARANCE)\n if (edge.a1 - edge.a0 < width + 0.24) throw new Error('Wall too short for the door: ' + sp.a + ' / ' + sp.b)\n const c = clamp(sp.at != null ? sp.at : (edge.a0 + edge.a1) / 2, edge.a0 + margin, edge.a1 - margin)\n const exterior = sp.b === 'outside'\n const leaf = exterior && sp.steel ? 0 : width > 1.1 ? width / 2 : width\n const u = edge.axis === 'u' ? c : edge.pos\n const v = edge.axis === 'u' ? edge.pos : c\n floorDoors.push({\n id: 'd' + floorIndex + '_' + i,\n floor: floorIndex,\n u: r2(u),\n v: r2(v),\n axis: edge.axis,\n pos: edge.pos,\n at: r2(c),\n width,\n a: sp.a,\n b: sp.b,\n opensTo: sp.opensTo || sp.a,\n exterior,\n side: sp.side || null,\n leaves: exterior && sp.steel ? 0 : width > 1.1 ? 2 : 1,\n model: sp.model || (sp.steel ? 'steel' : width > 1.1 ? 'double' : 'single'),\n type: sp.type || 'door',\n steps: sp.steps || 0,\n hinge: 'start',\n zones: openingZones(u, v, edge.axis, width, openingDepth(width, leaf)),\n })\n })\n plan.doors.push(...floorDoors)\n const floorWalls = (tpl.noWalls ? [] : buildWalls(list, floorDoors, A.openPairs || [], floorIndex)).map((p) => Object.assign(p, { h: p.h || A.ceiling }))\n const windowsOut = placeWindows({ list, byId, floorWalls, windowDefs: A.windows(w, d, op) || [], floorIndex, ceiling: A.ceiling, w, d, clearance: tpl.clearance?.window ?? WINDOW_EDGE_CLEARANCE })\n plan.windows.push(...windowsOut)\n plan.walls.push(...floorWalls)\n })\n if (tpl.config) plan.config = tpl.config(op, w, d)\n if (tpl.reservations) tpl.reservations(plan)\n buildLot(plan, tpl, w, d, op, style, styleId, bc)\n return plan\n}\n\ninterface WindowGroup {\n wall: Json\n edge: { axis: 'u' | 'v'; pos: number }\n start: number\n end: number\n def: Json\n entries: { def: Json; centre: number; order: number }[]\n}\ninterface WindowParams {\n list: Room[]\n byId: Record<string, Room>\n floorWalls: Json[]\n windowDefs: WindowDef[]\n floorIndex: number\n ceiling: number\n w: number\n d: number\n clearance: number\n}\n\n/**\n * Each window lands on a stretch of exterior wall (between corners, junctions and doors) and is spread over it: a single window is centred,\n * several get equal gaps, and none comes closer than `clearance` to a corner, a junction or a door. A room that needs light but got no window gets one.\n */\nfunction placeWindows(params: WindowParams): Json[] {\n const { list, byId, floorWalls, windowDefs, floorIndex, ceiling, w, d, clearance } = params\n const stretches = floorWalls.filter((p) => p.exterior && p.type === 'wall')\n const found: Json[] = []\n const groups: WindowGroup[] = []\n let order = 0\n for (const def of windowDefs) {\n const room = byId[def.room]\n if (!room) throw new Error('Window references a missing room: ' + def.room)\n const edge = exteriorEdge(room, def.side, w, d, def.at)\n if (!edge) continue\n const centres = def.n ? Array.from({ length: def.n }, (_, i) => edge.a0 + ((edge.a1 - edge.a0) * (i + 1)) / (def.n! + 1)) : [def.at as number]\n for (const centre of centres) {\n const onEdge = stretches.filter((t) => t.axis === edge.axis && eq(edge.axis === 'u' ? t.v0 : t.u0, edge.pos) && t.sides.includes(def.room))\n const start = (t: Json) => (edge.axis === 'u' ? t.u0 : t.v0)\n const end = (t: Json) => (edge.axis === 'u' ? t.u1 : t.v1)\n const gap = (t: Json) => Math.min(Math.abs(centre - start(t)), Math.abs(centre - end(t)))\n const target = onEdge.find((t) => centre >= start(t) - TOL && centre <= end(t) + TOL) || onEdge.slice().sort((x, y) => gap(x) - gap(y))[0]\n if (!target) continue\n let group = groups.find((x) => x.wall === target && x.def.room === def.room)\n if (!group) groups.push((group = { wall: target, edge, start: start(target), end: end(target), def, entries: [] }))\n group.entries.push({ def, centre, order: order++ })\n }\n }\n for (const g of groups) {\n const room = byId[g.def.room]\n const bath = room.type === 'bathroom'\n const length = g.end - g.start\n const its = g.entries\n .slice()\n .sort((x, y) => x.centre - y.centre)\n .map((x) => ({ def: x.def, order: x.order, width: bath ? Math.min(x.def.width, 0.6) : x.def.width }))\n const fits = (l: typeof its) => l.reduce((t, x) => t + x.width, 0) + (l.length + 1) * clearance <= length + TOL\n while (its.length && !fits(its)) {\n const k = its.reduce((m, x, i, arr) => (x.width > arr[m].width ? i : m), 0)\n if (its[k].width > 0.6 + TOL) its[k] = Object.assign({}, its[k], { width: Math.max(0.6, r2(its[k].width - 0.1)) })\n else its.pop()\n }\n if (!its.length) continue\n const space = (length - its.reduce((t, x) => t + x.width, 0)) / (its.length + 1)\n let pos = g.start + space\n for (const x of its) {\n const c = pos + x.width / 2\n pos += x.width + space\n const u = g.edge.axis === 'u' ? c : g.edge.pos\n const v = g.edge.axis === 'u' ? g.edge.pos : c\n let y0 = x.def.y0 || 1.0\n let y1 = x.def.y1 || 2.15\n if (bath) {\n y0 = Math.max(y0, 2.1)\n y1 = Math.min(Math.max(y1, y0 + 0.4), ceiling - 0.25)\n }\n found.push({ id: '', floor: floorIndex, u: r2(u), v: r2(v), axis: g.edge.axis, pos: g.edge.pos, at: r2(c), width: x.width, y0: r2(y0), y1: r2(y1), room: x.def.room, side: x.def.side, _order: x.order })\n }\n }\n for (const room of list) {\n if (WINDOWLESS_ROOM_TYPES.has(room.type) || found.some((j) => j.room === room.id)) continue\n let best: { length: number; window: Json } | null = null\n for (const t of stretches) {\n if (!t.sides.includes(room.id)) continue\n const i0 = t.axis === 'u' ? t.u0 : t.v0\n const i1 = t.axis === 'u' ? t.u1 : t.v1\n const length = i1 - i0\n const width = Math.min(room.type === 'bathroom' ? 0.6 : 1.2, length - 2 * clearance)\n if (width < 0.6 - TOL || (best && best.length >= length)) continue\n const side = t.axis === 'u' ? (t.sides[0] === 'outside' ? 'front' : 'back') : t.sides[0] === 'outside' ? 'left' : 'right'\n const c = (i0 + i1) / 2\n const pos = t.axis === 'u' ? t.v0 : t.u0\n const bath = room.type === 'bathroom'\n best = { length, window: { id: '', floor: floorIndex, u: r2(t.axis === 'u' ? c : pos), v: r2(t.axis === 'u' ? pos : c), axis: t.axis, pos, at: r2(c), width: r2(width), y0: bath ? 2.1 : 1.0, y1: bath ? Math.min(2.5, ceiling - 0.25) : 2.15, room: room.id, side, _order: 1e6 + found.length } }\n }\n if (best) found.push(best.window)\n }\n found.sort((x, y) => x._order - y._order)\n found.forEach((j, i) => {\n delete j._order\n j.id = 'w' + floorIndex + '_' + i\n })\n return found\n}\n\n/** Facade and lot: zones, gates, paths and perimeter. */\nfunction buildLot(plan: Plan, tpl: TemplateDef, w: number, d: number, op: FloorplanOptions, style: StyleDef, styleId: string, bc: BuildContext) {\n const seed = op.seed == null ? 1 : op.seed\n const rFacade = createRng(seed, STREAM.facade)\n const facadeStyle = style.facade\n const palette = style.swatches\n const color = palette[Math.floor(rFacade() * palette.length)]\n const extra = tpl.facade || {}\n plan.facade = {\n style: styleId,\n color: { name: color[0], hex: color[1] },\n finish: pickWeighted(rFacade, facadeStyle.finish),\n grilles: rFacade() < facadeStyle.grilles,\n roof: pickWeighted(rFacade, facadeStyle.roof),\n balcony: !!extra.balcony,\n veranda: !!extra.veranda,\n steelDoor: !!extra.steelDoor,\n floors: plan.floorDefs.length,\n }\n if (tpl.facadeExtra) tpl.facadeExtra(plan.facade, rFacade, w, d, op)\n if (plan.floorDefs.length > 1 && plan.facade.roof === 'fiber_cement') plan.facade.roof = 'colonial'\n if (!tpl.lot) return\n const cfg: LotConfig = tpl.lot(w, d, style, op)\n if (bc.zone) clampLotToZone(cfg, bc.zone, bc.adjustments || [], tpl.partyWalls)\n const rLot = createRng(seed, STREAM.lot)\n const setback = cfg.frontSetback\n const marginL = cfg.marginLeft\n const marginR = cfg.marginRight\n const backDepth = cfg.backyardDepth\n const lot: Json = {\n rect: [-marginL, -setback, w + marginR, d + backDepth],\n setback,\n sideYard: { left: marginL, right: marginR },\n backyard: backDepth,\n style: styleId,\n zones: [],\n perimeter: [],\n gates: [],\n paths: [],\n pool: !!cfg.pool,\n }\n const ZONES: Room[] = []\n const libs = Object.assign({ garden: 'garden', backyard: 'backyard', parking: 'parking', sideYard: 'side_yard' }, cfg.libraries || {})\n const addZone = (id: string, type: string, label: string, parts: Rect[], library?: string) =>\n ZONES.push(Object.assign(normalizeRoom({ id, type, label, rect: parts[0], parts: parts.slice(1), library, outdoor: true }, -1), { floor: -1, outdoor: true }))\n if (setback > 0) {\n let parts: Rect[] = [[-marginL, -setback, w + marginR, 0]]\n if (cfg.parking) {\n const garageU = (cfg.garage as Json).u\n const vw = cfg.parking.width\n const x0 = Math.max(-marginL, garageU - vw / 2)\n const x1 = Math.min(w + marginR, garageU + vw / 2)\n parts = []\n if (x0 + marginL > 0.8) parts.push([-marginL, -setback, x0, 0])\n if (w + marginR - x1 > 0.8) parts.push([x1, -setback, w + marginR, 0])\n addZone('parking', 'parking', 'parking', [[x0, -setback, x1, 0]], libs.parking)\n if (!parts.length) parts = [[x1, -setback, w + marginR, 0]]\n }\n parts.sort((a, b) => b[2] - b[0] - (a[2] - a[0]))\n addZone('garden', 'garden', 'garden', parts, libs.garden)\n }\n const yard = cfg.yardZones\n if (backDepth > 0 && yard) {\n for (const q of yard) addZone(q.id, q.type, q.label || q.id, [[-marginL, d + q.v0, w + marginR, d + Math.min(backDepth, q.v1)]], q.library)\n } else if (backDepth > 0) addZone('backyard', 'backyard', 'backyard', [[-marginL, d, w + marginR, d + backDepth]], libs.backyard)\n for (const q of cfg.extraZones || []) addZone(q.id, q.type, q.label || q.id, q.parts, q.library)\n if (marginL > 0.5) addZone('side_left', 'side_yard', 'side_left', [[-marginL, 0, 0, d]], libs.sideYard)\n if (marginR > 0.5) addZone('side_right', 'side_yard', 'side_right', [[w, 0, w + marginR, d]], libs.sideYard)\n const gates: Json[] = []\n const addGate = (type: string, model: string, u: number, v: number, width: number, side: string, toTarget?: string | null) => {\n const g: Json = {\n id: 'g' + gates.length,\n type,\n model,\n u: r2(u),\n v: r2(v),\n axis: 'u',\n width,\n height: type === 'pedestrian' ? style.height : Math.min(style.height, 2.2),\n side,\n to: toTarget || null,\n material: 'iron',\n }\n g.zones = openingZones(u, v, 'u', width, openingDepth(width, type === 'pedestrian' ? width : 0))\n gates.push(g)\n return g\n }\n if (cfg.pedestrian && setback > 0) addGate('pedestrian', 'pedestrian', cfg.pedestrian.u, -setback, 1.0, 'front', 'door')\n if (cfg.garage && setback > 0) addGate('garage', pickWeighted(rLot, style.gate.garage), cfg.garage.u, -setback, cfg.garage.width, 'front', cfg.garage.to)\n if (cfg.cargo) addGate('cargo', 'sliding', cfg.cargo.u, d + backDepth, cfg.cargo.width, 'back', 'stockroom')\n plan.gates = gates\n lot.gates = gates\n const paths: Json[] = []\n const target = (a: string, side: string) => plan.doors.find((p) => p.exterior && p.a === a && p.side === side)\n for (const g of gates) {\n if (g.type === 'pedestrian' && cfg.doorTarget) {\n const pt = target(cfg.doorTarget.a, cfg.doorTarget.side)\n if (!pt) continue\n const gateU = g.u\n const dx = pt.u\n const ym = -setback / 2\n const L = 1.0\n const h = L / 2\n const rs: Rect[] = []\n if (Math.abs(gateU - dx) < 0.05) rs.push([dx - h, -setback, dx + h, 0])\n else {\n rs.push([gateU - h, -setback, gateU + h, ym + h])\n rs.push([Math.min(gateU, dx) - h, ym - h, Math.max(gateU, dx) + h, ym + h])\n rs.push([dx - h, ym - h, dx + h, 0])\n }\n paths.push({ id: 'pedestrian_path', type: 'pedestrian', from: g.id, to: pt.id, width: L, rects: rs.map((r) => r.map(r2)), points: [[gateU, -setback], [gateU, ym], [dx, ym], [dx, 0]] })\n } else if (g.type === 'garage' && g.to === 'inner_garage') {\n const pt = plan.doors.find((p) => p.exterior && p.side === 'front' && Math.abs(p.u - g.u) < 0.6 && p.width >= 2.5)\n if (!pt) continue\n const hw = Math.max(g.width, pt.width) / 2\n paths.push({ id: 'garage_path', type: 'vehicle', from: g.id, to: pt.id, width: hw * 2, rects: [[g.u - hw, -setback, g.u + hw, 0].map(r2)], points: [[g.u, -setback], [g.u, 0]] })\n } else if (g.type === 'cargo') {\n const pt = target('stockroom', 'back')\n if (!pt) continue\n const hw = Math.max(g.width, pt.width) / 2\n paths.push({ id: 'cargo_path', type: 'vehicle', from: g.id, to: pt.id, width: hw * 2, rects: [[g.u - hw, d, g.u + hw, d + backDepth].map(r2)], points: [[g.u, d + backDepth], [g.u, d]] })\n }\n }\n if (tpl.paths) paths.push(...tpl.paths(plan, { gates, setback, marginLeft: marginL, marginRight: marginR, backyard: backDepth, w, d }))\n else addExteriorDoorPaths(plan, { gates, paths, zones: ZONES, setback, marginLeft: marginL, marginRight: marginR, backyard: backDepth, w, target: cfg.doorTarget })\n plan.paths = paths\n lot.paths = paths\n const boundary = (rule: { type: Record<string, number>; top: Record<string, number> }) => {\n const type = pickWeighted(rLot, rule.type)\n const top = type === 'railing' ? 'none' : pickWeighted(rLot, rule.top)\n const wallHeight = type === 'railing' ? 1.2 : type === 'fence' ? (style.fenceHeight ?? 2.0) : style.height\n return { type, material: type === 'wall' ? 'block' : type === 'fence' ? 'wire_mesh' : 'iron', height: wallHeight, top, totalHeight: r2(wallHeight + WALL_TOP_HEIGHTS[top]), thickness: WALL_THICKNESS }\n }\n const A: Record<string, Json> = { front: boundary(style.front), left: boundary(style.sideYard), right: boundary(style.sideYard), back: boundary(style.back) }\n const seg = (side: string, u0: number, v0: number, u1: number, v1: number) => {\n if (Math.abs(u1 - u0) + Math.abs(v1 - v0) < 0.05) return\n lot.perimeter.push(Object.assign({ id: 'm' + lot.perimeter.length, side, u0: r2(u0), v0: r2(v0), u1: r2(u1), v1: r2(v1) }, A[side]))\n }\n const cutRun = (side: string, de: number, to: number, vfix: number, gs: Json[]) => {\n let pieces: [number, number][] = [[de, to]]\n for (const g of gs) {\n const g0 = g.u - g.width / 2\n const g1 = g.u + g.width / 2\n const n: [number, number][] = []\n for (const [x, y] of pieces) {\n if (g1 <= x || g0 >= y) {\n n.push([x, y])\n continue\n }\n if (g0 > x) n.push([x, g0])\n if (g1 < y) n.push([g1, y])\n }\n pieces = n\n }\n for (const [x, y] of pieces) seg(side, x, vfix, y, vfix)\n }\n if (setback > 0)\n cutRun('front', -marginL, w + marginR, -setback, gates.filter((g) => g.side === 'front'))\n cutRun('back', -marginL, w + marginR, d + backDepth, gates.filter((g) => g.side === 'back'))\n const vi = setback > 0 ? -setback : 0\n if (marginL > 0.5) seg('left', -marginL, vi, -marginL, d + backDepth)\n else if (backDepth > 0) seg('left', 0, d, 0, d + backDepth)\n if (marginR > 0.5) seg('right', w + marginR, vi, w + marginR, d + backDepth)\n else if (backDepth > 0) seg('right', w, d, w, d + backDepth)\n for (const z of ZONES) z.ground = (cfg.grounds || {})[z.id] || (cfg.grounds || {})[z.type] || pickWeighted(rLot, style.grounds[z.type] || { concrete: 1 })\n if (bc.zone) enforcePermeability(lot, ZONES, bc.zone, bc.adjustments || [])\n plan.zones = ZONES\n lot.zones = ZONES\n plan.lot = lot\n}\n\nexport { inRect, MARGIN, STYLES }\n","import { clamp } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { PALETTE_STYLES, ROOM_COLORS, STATE_PLUGINS, resolveStyleId } from './registry'\nimport { createRng } from './rng'\nimport type { Rng } from './rng'\nimport type { Hsl } from './types'\n\nexport const HIGH_SATURATION = 0.4\nexport const MIN_WALL_FLOOR_CONTRAST = 20\nexport const MIN_FABRIC_FLOOR_CONTRAST = 15\n\nconst SCHEMES = ['analogous', 'complementary', 'split_complementary', 'triad'] as const\nconst HARMONY_OFFSETS: Record<string, [number, number]> = { analogous: [-30, 30], complementary: [180, 165], split_complementary: [150, 210], triad: [120, 240] }\n\n/** Roles the contrast rules rely on. A palette recipe must produce them. */\nexport const ROLE_FABRIC_MAIN = 'fabric_main'\nexport const ROLE_FABRIC_ACCENT = 'fabric_accent'\nexport const ROLE_FLOOR_REFERENCE = 'floor_living'\n\n/** Tools handed to a style recipe. `jit` and `rng` draw from the style's seeded stream: draw order is part of the contract. */\nexport interface PaletteDraw {\n rng: Rng\n base: [string, number, number, number]\n H0: number\n H1: number\n H2: number\n jit(v: number, a: number): number\n hsl(h: number, s: number, l: number): Hsl\n}\nexport interface PaletteEarly {\n /** Accent mode: true saturates walls, false puts accents on objects. */\n wallMode: boolean\n /** Maximum wall saturation. */\n sMax: number\n /** Facade, wall, gate, roof, ceiling... in insertion order. */\n roles: Record<string, Hsl>\n /** General floor `[h, s, l]` for room types that do not define their own. */\n generalFloor: [number, number, number]\n}\nexport interface PaletteStyleDef {\n /** Legacy stream suffix; defaults to the style id. */\n seedKey?: string\n /** Facade colour table `[labelKey, h, s, l]`. */\n facadeColors: [string, number, number, number][]\n /** Draws up to the room colours (before the room loop). */\n early(d: PaletteDraw): PaletteEarly\n /** Draws the object roles (wood, fabrics, metal, ground colours) after the room loop. */\n late(d: PaletteDraw, e: PaletteEarly): Record<string, Hsl>\n}\n\nexport interface PaletteContext extends PaletteDraw {\n style: string\n sMax: number\n wallMode: boolean\n generalFloor: [number, number, number]\n}\n\nexport const hslToInt = (h: number, s: number, l: number): number => {\n h = ((h % 360) + 360) % 360\n s = clamp(s, 0, 1)\n l = clamp(l, 0, 1)\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1))\n }\n return (Math.round(f(0) * 255) << 16) | (Math.round(f(8) * 255) << 8) | Math.round(f(4) * 255)\n}\nexport const intToHsl = (n: number): Hsl => {\n const r = ((n >> 16) & 255) / 255\n const g = ((n >> 8) & 255) / 255\n const b = (n & 255) / 255\n const mx = Math.max(r, g, b)\n const mn = Math.min(r, g, b)\n const l = (mx + mn) / 2\n const d = mx - mn\n let h = 0\n let s = 0\n if (d > 1e-9) {\n s = d / (1 - Math.abs(2 * l - 1))\n h = mx === r ? (g - b) / d + (g < b ? 6 : 0) : mx === g ? (b - r) / d + 2 : (r - g) / d + 4\n h *= 60\n }\n return { h, s, l }\n}\n/** CIE L* lightness of a packed RGB colour. */\nexport const lstar = (n: number): number => {\n const linear = (c: number) => ((c /= 255) <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4))\n const Y = 0.2126 * linear((n >> 16) & 255) + 0.7152 * linear((n >> 8) & 255) + 0.0722 * linear(n & 255)\n return Y > 216 / 24389 ? 116 * Math.cbrt(Y) - 16 : (Y * 24389) / 27\n}\nexport const hexString = (n: number): string => '#' + (n >>> 0).toString(16).padStart(6, '0')\n\nexport interface PaletteOptions {\n seed?: number | string\n style?: string\n state?: string\n}\nexport type Palette = { meta: { seed: number | string; style: string; state: string; scheme: string; base: string; accentMode: 'wall' | 'object' } } & Record<string, number | object>\n\n/** Seeded colour-harmony palette: a facade base colour, a harmony scheme, role colours and contrast rules. */\nexport function palette(o?: PaletteOptions): Palette {\n const opt = o || {}\n let style = resolveStyleId(opt.style || 'budget')\n if (!PALETTE_STYLES[style]) style = PALETTE_STYLES.mid ? 'mid' : Object.keys(PALETTE_STYLES)[0]\n const def = PALETTE_STYLES[style]\n const state = opt.state || 'normal'\n const seed = opt.seed == null ? 1 : opt.seed\n const rng = createRng(seed, STREAM.palettePrefix + (def.seedKey ?? style))\n const table = def.facadeColors\n const base = table[Math.floor(rng() * table.length)]\n const scheme = SCHEMES[Math.floor(rng() * 4)]\n const offsets = HARMONY_OFFSETS[scheme]\n const jit = (v: number, a: number) => v + (rng() - 0.5) * a\n const hsl = (h: number, s: number, l: number): Hsl => ({ h: ((h % 360) + 360) % 360, s: clamp(s, 0, 1), l: clamp(l, 0, 1) })\n const H0 = base[1]\n const H1 = H0 + offsets[0]\n const H2 = H0 + offsets[1]\n const draw: PaletteDraw = { rng, base, H0, H1, H2, jit, hsl }\n const early = def.early(draw)\n const { wallMode, sMax } = early\n const R: Record<string, Hsl> = Object.assign({}, early.roles)\n const ctx: PaletteContext = Object.assign({ style, sMax, wallMode, generalFloor: early.generalFloor }, draw)\n for (const c of ROOM_COLORS) {\n const [wh, wl] = c.wall(ctx)\n R['wall_' + c.type] = hsl(wh, c.neutral ? Math.min(0.16, sMax) : clamp(jit(sMax * 0.75, sMax * 0.5), 0.03, sMax), jit(wl, 0.03))\n const pi = c.floor || early.generalFloor\n R['floor_' + c.type] = hsl(pi[0], Math.min(pi[1], wallMode ? 0.18 : 0.3), jit(pi[2], 0.04))\n }\n Object.assign(R, def.late(draw, early))\n // state hook (e.g. dirt: desaturate and darken)\n STATE_PLUGINS[state]?.adjustPalette?.(R)\n // anti-clash rules: floor never saturated if the wall is; minimum lightness separation\n const adjust = (color: Hsl, ref: Hsl, min: number, preferredDir?: number) => {\n for (let i = 0; i < 60; i++) {\n if (Math.abs(lstar(hslToInt(color.h, color.s, color.l)) - lstar(hslToInt(ref.h, ref.s, ref.l))) >= min) return\n const refL = lstar(hslToInt(ref.h, ref.s, ref.l))\n let dir = preferredDir || (refL > 50 ? -1 : 1)\n if ((dir < 0 && color.l <= 0.06) || (dir > 0 && color.l >= 0.94)) dir = -dir\n color.l = clamp(color.l + dir * 0.015, 0.04, 0.96)\n }\n }\n const types = ROOM_COLORS.map((c) => c.type)\n for (const c of types) {\n const w = R['wall_' + c]\n const p = R['floor_' + c]\n if (w.s > 0.3) p.s = Math.min(p.s, 0.2)\n if (p.s > HIGH_SATURATION) p.s = HIGH_SATURATION - 0.05\n adjust(p, w, MIN_WALL_FLOOR_CONTRAST + 2, lstar(hslToInt(w.h, w.s, w.l)) > 50 ? -1 : 1)\n }\n const floorRef = R[ROLE_FLOOR_REFERENCE] || R['floor_' + types[0]]\n const fabric = R[ROLE_FABRIC_MAIN]\n adjust(fabric, floorRef, MIN_FABRIC_FLOOR_CONTRAST + 3)\n adjust(R[ROLE_FABRIC_ACCENT], floorRef, MIN_FABRIC_FLOOR_CONTRAST + 3)\n for (const c of types) {\n const p = R['floor_' + c]\n if (Math.abs(lstar(hslToInt(fabric.h, fabric.s, fabric.l)) - lstar(hslToInt(p.h, p.s, p.l))) < MIN_FABRIC_FLOOR_CONTRAST)\n adjust(p, fabric, MIN_FABRIC_FLOOR_CONTRAST + 2, lstar(hslToInt(fabric.h, fabric.s, fabric.l)) > 50 ? -1 : 1)\n }\n const out: Record<string, unknown> = { meta: { seed, style, state, scheme, base: base[0], accentMode: wallMode ? 'wall' : 'object' } }\n for (const k of Object.keys(R)) out[k] = hslToInt(R[k].h, R[k].s, R[k].l)\n // final contrast after rounding: fabric against every floor; search lightness for floor (then wall) satisfying both rules\n const num = (k: string) => out[k] as number\n const pairOk = (w: number, p: number) => Math.abs(lstar(w) - lstar(p)) >= MIN_WALL_FLOOR_CONTRAST + 1 && Math.abs(lstar(num(ROLE_FABRIC_MAIN)) - lstar(p)) >= MIN_FABRIC_FLOOR_CONTRAST + 1\n const search = (color: number, ok: (n: number) => boolean) => {\n const h = intToHsl(color)\n let bestValue: number | null = null\n let md = 9\n for (let l = 0.02; l <= 0.98; l += 0.005) {\n const n = hslToInt(h.h, h.s, l)\n if (ok(n) && Math.abs(l - h.l) < md) {\n md = Math.abs(l - h.l)\n bestValue = n\n }\n }\n return bestValue\n }\n for (const c of types) {\n if (pairOk(num('wall_' + c), num('floor_' + c))) continue\n const n = search(num('floor_' + c), (p) => pairOk(num('wall_' + c), p))\n if (n != null) {\n out['floor_' + c] = n\n continue\n }\n // no solution with the floor alone: move the wall\n const w = search(num('wall_' + c), (w2) => pairOk(w2, num('floor_' + c)))\n if (w != null) out['wall_' + c] = w\n }\n return out as Palette\n}\n","import { EPS, MARGIN, TOL } from './constants'\nimport { cardinal, clamp, eq, extent, inner, overlaps, r2 } from './geometry'\nimport { LIBRARIES, LIBRARY_ALIAS } from './registry'\nimport { isOpenSide, openingsOfFloor, windowsOfRoom, zonesOfFloor } from './queries'\nimport type { Json, Plan, Rect, Room, Slot, SlotDef, Vec2 } from './types'\n\nconst SIDE_NORMAL: Record<string, Vec2> = { left: [1, 0], right: [-1, 0], front: [0, 1], back: [0, -1] }\nconst FIXED_FACING: Record<string, Vec2> = { 'u+': [1, 0], 'u-': [-1, 0], 'v+': [0, 1], 'v-': [0, -1] }\nconst SIDE_OPPOSITE: Record<string, string> = { front: 'back', back: 'front', left: 'right', right: 'left' }\nconst WINDOW_SIDE: Record<string, string> = { front: 'front', back: 'back', left: 'left', right: 'right' }\n\n/** Slot definitions of a room after `without`, `overrides`, `extras` and `any`/window expansion. */\nexport function slotDefsOf(plan: Plan, room: Room): SlotDef[] {\n const name = room.library || room.type\n const key = LIBRARY_ALIAS[name] || name\n const library = room.slots ? room.slots : LIBRARIES[key]\n if (!library) return []\n const R = inner(room.parts[0])\n let defs = typeof library === 'function' ? library({ w: R[2] - R[0], d: R[3] - R[1] }) : library.slice()\n defs = defs.map((x) => Object.assign({}, x))\n for (const id of room.without || []) defs = defs.filter((x) => x.id !== id)\n for (const [id, aj] of Object.entries(room.overrides || {})) {\n const i = defs.findIndex((x) => x.id === id)\n if (i < 0) continue\n if (aj === null) defs.splice(i, 1)\n else defs[i] = Object.assign(defs[i], aj)\n }\n defs.push(...(room.extras || []).map((x) => Object.assign({}, x)))\n const out: SlotDef[] = []\n for (const def of defs) {\n def.parent = def.on\n if (def.anchor === 'wall' && def.side === 'any') for (const l of ['left', 'right', 'front', 'back']) out.push(Object.assign({}, def, { id: def.id + '@' + l, side: l as SlotDef['side'], group: def.group || def.id }))\n else if (def.anchor === 'corner' && def.corner === 'any') for (const l of ['front-left', 'front-right', 'back-left', 'back-right']) out.push(Object.assign({}, def, { id: def.id + '@' + l, corner: l, group: def.group || def.id }))\n else if (def.anchor === 'window' && def.n == null) {\n const windowList = windowsOfRoom(plan, room)\n windowList.forEach((_j, i) => out.push(Object.assign({}, def, { id: def.id + '@w' + i, n: i, group: def.group || def.id })))\n } else out.push(def)\n }\n return out\n}\n\nexport function resolveSlots(plan: Plan): Slot[] {\n const all: Slot[] = []\n for (const room of plan.rooms.concat(plan.zones)) {\n const defs = slotDefsOf(plan, room)\n const byId: Record<string, Slot> = {}\n // stairs: a door on any storey applies\n const zones = room.type === 'stairs' ? plan.floors.flatMap((_, floorIndex) => zonesOfFloor(plan, floorIndex)) : zonesOfFloor(plan, room.floor)\n for (const def of defs) {\n const s = resolveSlot(plan, room, def, byId, zones)\n byId[def.id] = s\n all.push(s)\n }\n }\n return all\n}\n\nexport function resolveSlot(plan: Plan, room: Room, def: SlotDef, byId: Record<string, Slot>, zones: Rect[]): Slot {\n const base: Json = {\n id: def.id,\n room: room.id,\n floor: room.floor,\n outdoor: room.outdoor,\n anchor: def.anchor,\n side: def.side || def.corner || null,\n cats: def.cats,\n slide: def.slide,\n required: !!def.required,\n chance: def.required ? 1 : def.chance == null ? 1 : def.chance,\n clearance: def.clearance == null ? 0.5 : def.clearance,\n front: def.facing || 'center',\n group: def.group || null,\n requires: def.requires || null,\n on: def.parent || null,\n target: def.target || null,\n valid: true,\n reason: null,\n }\n const invalid = (m: string): Slot => Object.assign(base, { valid: false, reason: m, x: 0, z: 0, ry: 0, w: 0, d: 0, frontU: 0, frontV: 1, aabb: [0, 0, 0, 0], _cell: null }) as Slot\n if (def.anchor === 'on' || def.anchor === 'inside') {\n const parent = byId[def.parent]\n if (!parent || !parent.valid) return invalid('invalid_parent')\n return Object.assign(base, { x: parent.x, z: parent.z, ry: parent.ry, w: parent.w, d: parent.d, frontU: parent.frontU, frontV: parent.frontV, aabb: parent.aabb, _cell: parent._cell }) as Slot\n }\n const size = def.size as Vec2\n const roomCenter = ((): Vec2 => {\n const R0 = inner(room.parts[0])\n return [(R0[0] + R0[2]) / 2, (R0[1] + R0[3]) / 2]\n })()\n const openings = openingsOfFloor(plan, room.floor)\n let point: Vec2 = [0, 0]\n const targetPoint = (rule: string): Vec2 => {\n if (rule === 'door') {\n let best: Json = null\n let bestDist = 1e9\n for (const ab of openings) {\n const dist = Math.hypot(ab.u - point[0], ab.v - point[1])\n if (dist < bestDist) {\n bestDist = dist\n best = ab\n }\n }\n return best ? [best.u, best.v] : roomCenter\n }\n if (rule === 'target') {\n const t = byId[def.target as string]\n return t && t.valid ? [t.x, t.z] : roomCenter\n }\n return roomCenter\n }\n const free = (rect: Rect) => !!def.floorFree || !zones.some((z) => overlaps(rect, z, room.type === 'stairs' ? -0.011 : EPS))\n const rule: string = def.facing || 'center'\n let R = inner(room.parts[Math.min(def.part || 0, room.parts.length - 1)])\n if (def.anchor === 'wall' || def.anchor === 'window') {\n let side = def.side as string\n let a: number | null = null\n let win: Json = null\n if (def.anchor === 'window') {\n const windowList = windowsOfRoom(plan, room)\n win = windowList[def.n as number]\n if (!win) return invalid('no_window')\n side = room.outdoor ? SIDE_OPPOSITE[win.side] : WINDOW_SIDE[win.side]\n const cand = room.parts\n .map(inner)\n .find(\n (r) =>\n (win.axis === 'u' ? win.u >= r[0] - TOL && win.u <= r[2] + TOL : win.v >= r[1] - TOL && win.v <= r[3] + TOL) &&\n ((side === 'left' && eq(r[0], win.pos + MARGIN)) || (side === 'right' && eq(r[2], win.pos - MARGIN)) || (side === 'front' && eq(r[1], win.pos + MARGIN)) || (side === 'back' && eq(r[3], win.pos - MARGIN))),\n )\n if (!cand) return invalid('window_outside_room')\n R = cand\n a = win.axis === 'u' ? win.u : win.v\n }\n const n = SIDE_NORMAL[side]\n if (!n) return invalid('invalid_side')\n const horizontal = side === 'front' || side === 'back'\n const a0 = horizontal ? R[0] : R[1]\n const a1 = horizontal ? R[2] : R[3]\n const len = a1 - a0\n const depth = size[1]\n if (depth > (horizontal ? R[3] - R[1] : R[2] - R[0]) + EPS) return invalid('larger_than_room')\n const hw = Math.min(size[0], len) / 2\n const cell = (ac: number): Rect =>\n side === 'left' ? [R[0], ac - hw, R[0] + depth, ac + hw] : side === 'right' ? [R[2] - depth, ac - hw, R[2], ac + hw] : side === 'front' ? [ac - hw, R[1], ac + hw, R[1] + depth] : [ac - hw, R[3] - depth, ac + hw, R[3]]\n const nominal = a != null ? a : a0 + hw + (def.pos == null ? 0.5 : def.pos) * Math.max(0, len - 2 * hw) + (def.shift || 0)\n const wp = side === 'left' ? R[0] - MARGIN : side === 'right' ? R[2] + MARGIN : side === 'front' ? R[1] - MARGIN : R[3] + MARGIN\n const pa = clamp(nominal, a0 + hw, a1 - hw)\n let found: number | null = null\n const steps = [0]\n if (def.anchor !== 'window') for (let k = 1; k <= 60; k++) steps.push(k, -k)\n for (const k of steps) {\n const ac = pa + k * 0.05\n if (ac - hw < a0 - EPS || ac + hw > a1 + EPS) continue\n if (free(cell(ac))) {\n found = ac\n break\n }\n }\n if (found == null) return invalid('blocked_by_door')\n const sp: Vec2 = horizontal ? [found, wp - n[1] * 0.1] : [wp - n[0] * 0.1, found]\n if (isOpenSide(plan, room, sp[0], sp[1])) return invalid('open_wall')\n const rect = cell(found)\n return Object.assign(base, { side, x: r2((rect[0] + rect[2]) / 2), z: r2((rect[1] + rect[3]) / 2), frontU: n[0], frontV: n[1], ry: r2(Math.atan2(n[0], n[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f: n, enclosed: [side], R, size } }) as Slot\n }\n if (def.anchor === 'corner') {\n const [cornerV, cornerU] = (def.corner as string).split('-')\n const normalV = SIDE_NORMAL[cornerV]\n const normalU = SIDE_NORMAL[cornerU]\n if (!normalV || !normalU) return invalid('invalid_corner')\n const kx = cornerU === 'left' ? R[0] : R[2]\n const kz = cornerV === 'front' ? R[1] : R[3]\n point = [kx, kz]\n let f: Vec2\n if (FIXED_FACING[rule]) {\n f = FIXED_FACING[rule]\n if (!((f[0] === normalU[0] && f[1] === normalU[1]) || (f[0] === normalV[0] && f[1] === normalV[1]))) f = normalU\n } else {\n const t = targetPoint(rule)\n f = Math.abs(t[0] - kx) >= Math.abs(t[1] - kz) ? normalU : normalV\n }\n const [extentU, extentV] = extent(size, f)\n if (extentU > R[2] - R[0] + EPS || extentV > R[3] - R[1] + EPS) return invalid('larger_than_room')\n const rect: Rect = [cornerU === 'left' ? R[0] : R[2] - extentU, cornerV === 'front' ? R[1] : R[3] - extentV, cornerU === 'left' ? R[0] + extentU : R[2], cornerV === 'front' ? R[1] + extentV : R[3]]\n if (!free(rect)) return invalid('blocked_by_door')\n for (const sp of [[kx - normalU[0] * (MARGIN + 0.1), (rect[1] + rect[3]) / 2], [(rect[0] + rect[2]) / 2, kz - normalV[1] * (MARGIN + 0.1)]]) if (isOpenSide(plan, room, sp[0], sp[1])) return invalid('open_wall')\n return Object.assign(base, { x: r2((rect[0] + rect[2]) / 2), z: r2((rect[1] + rect[3]) / 2), frontU: f[0], frontV: f[1], ry: r2(Math.atan2(f[0], f[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f, enclosed: [cornerU, cornerV], R, size } }) as Slot\n }\n if (def.anchor === 'center') {\n let cx = R[0] + (def.fx == null ? 0.5 : def.fx) * (R[2] - R[0]) + (def.dx || 0)\n let cz = R[1] + (def.fz == null ? 0.5 : def.fz) * (R[3] - R[1]) + (def.dz || 0)\n point = [cx, cz]\n let f: Vec2\n if (FIXED_FACING[rule]) f = FIXED_FACING[rule]\n else {\n const t = targetPoint(rule)\n const dx = t[0] - cx\n const dz = t[1] - cz\n f = Math.hypot(dx, dz) < 0.05 ? [0, 1] : cardinal(dx, dz)\n }\n const [extentU, extentV] = extent(size, f)\n if (extentU > R[2] - R[0] + EPS || extentV > R[3] - R[1] + EPS) return invalid('larger_than_room')\n cx = clamp(cx, R[0] + extentU / 2, R[2] - extentU / 2)\n cz = clamp(cz, R[1] + extentV / 2, R[3] - extentV / 2)\n const rect: Rect = [cx - extentU / 2, cz - extentV / 2, cx + extentU / 2, cz + extentV / 2]\n if (!free(rect)) return invalid('blocked_by_door')\n return Object.assign(base, { x: r2(cx), z: r2(cz), frontU: f[0], frontV: f[1], ry: r2(Math.atan2(f[0], f[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f, enclosed: [], R, size } }) as Slot\n }\n return invalid('unknown_anchor')\n}\n","import { DOOR_CLEARANCE } from './constants'\nimport { createPlacementContext, placementKit, runPostProcess } from './context'\nimport { runResultExtensions } from './extensions'\nimport { fillRoom } from './fill'\nimport { overlaps, openingZones, r2 } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { translate } from './locale'\nimport { buildPlan, floorsOf } from './plan'\nimport { hexString, palette } from './palette'\nimport { CATALOG, DECOR_PROFILES, SEED_KEYS, STATE_PLUGINS, TEMPLATES, WALL_TOP_HEIGHTS, stateDistribution } from './registry'\nimport { createRng, hashString } from './rng'\nimport { resolveSlots } from './slots'\nimport { checkLot, clampOptionsToZone, resolveZone, useOf } from './zoning'\nimport type { FloorplanOptions, ItemColor, Json, PlacedItem, Plan, Slot, TemplateDef, ZoneAdjustment } from './types'\nimport type { StateContext } from './types'\n\nexport function templateOf(t: string | TemplateDef): TemplateDef {\n if (typeof t === 'string') {\n if (!TEMPLATES[t]) throw new Error('Unknown template: ' + t)\n return TEMPLATES[t]\n }\n return t\n}\n\nconst cleanSlot = (s: Slot) => {\n const o: Json = {}\n for (const k of Object.keys(s)) if (k[0] !== '_') o[k] = s[k]\n o.cats = Object.keys(s.cats || {})\n return o\n}\n\n/** Recorded slots (resolved positions) of every storey and of the lot. */\nexport function slots(template: string | TemplateDef, options?: FloorplanOptions): Json[] {\n const tpl = templateOf(template)\n const o = options || {}\n const plan = buildPlan(tpl, o.w, o.d, o)\n const locale = o.locale || 'en'\n return resolveSlots(plan)\n .map(cleanSlot)\n .map((s) => (s.reason ? Object.assign(s, { reason: translate('reasons', s.reason, locale) }) : s))\n}\n\n/** Picks the house state: the requested one, else a seeded draw over the registered distribution, else `normal`. */\nexport function pickState(requested: string | undefined, seed: number | string): string {\n if (requested && STATE_PLUGINS[requested]) return requested\n const dist = stateDistribution.weights\n if (!dist) return 'normal'\n const x = createRng(seed, stateDistribution.seedKey)()\n let acc = 0\n const keys = Object.keys(dist)\n for (const k of keys) {\n acc += dist[k]\n if (x < acc) return k\n }\n return keys[keys.length - 1]\n}\n\nfunction colorOf(m: Json, seed: number | string): number | string {\n const spec: ItemColor = m.colorSpec || CATALOG[m.type]?.color || { role: 'wood' }\n if ('role' in spec) return spec.role\n if ('hex' in spec) return spec.hex\n return spec.pick[hashString(seed + '|' + (m._seedId ?? m.id)) % spec.pick.length]\n}\n\nfunction applyState(plan: Plan, items: PlacedItem[], ctx: ReturnType<typeof createPlacementContext>, seed: number | string, state: string): PlacedItem[] {\n const plugin = STATE_PLUGINS[state]\n if (!plugin || state === 'normal') return []\n const c: StateContext = {\n plan,\n items,\n seed,\n state,\n rng: createRng(seed, plugin.seedKey ?? 'state:' + state),\n ctx,\n kit: placementKit,\n catalog: CATALOG,\n wallTopHeights: WALL_TOP_HEIGHTS,\n }\n return plugin.apply(c)\n}\n\nconst loc = (key: string | undefined, locale: string, ns: 'labels' | 'facadeColors' = 'labels', vars?: Record<string, string | number>) => (key ? translate(ns, key, locale, vars) : key)\n\n/** Generates a plan: building, lot, seeded item fill, decor, house state and palette. */\nexport function generate(template: string | TemplateDef, options?: FloorplanOptions): Json {\n const tpl = templateOf(template)\n const o = options || {}\n const seed = o.seed == null ? 1 : o.seed\n const locale = o.locale || 'en'\n let op: FloorplanOptions = Object.assign({}, o, { seed })\n const zone = resolveZone(o.zone)\n const adjustments: ZoneAdjustment[] = []\n if (zone) op = clampOptionsToZone(tpl, op, zone, adjustments)\n const plan = buildPlan(tpl, op.w, op.d, op, { zone, adjustments })\n const all = resolveSlots(plan)\n const items: PlacedItem[] = []\n const missing: { room: string; slot: string }[] = []\n for (const room of plan.rooms.concat(plan.zones)) {\n const sl = all.filter((s) => s.room === room.id && s.floor === room.floor)\n const r = fillRoom(plan, room, sl, createRng(seed, STREAM.roomPrefix + (room.seedKey ?? SEED_KEYS.rooms[room.id] ?? room.id)))\n items.push(...r.items)\n missing.push(...r.missing)\n }\n const ctx = runPostProcess(plan, items, seed)\n const state = pickState(o.state, seed)\n const stateItemsAll = applyState(plan, items, ctx, seed, state)\n const colors = palette({ seed, style: plan.style, state })\n const strip = (m: Json) => {\n const x: Json = {}\n for (const k of Object.keys(m)) if (k[0] !== '_' && k !== 'colorSpec') x[k] = m[k]\n return x\n }\n const L = plan.lot\n const lot = L\n ? {\n rect: L.rect.map(r2),\n setback: r2(L.setback),\n backyard: r2(L.backyard),\n sideYard: L.sideYard,\n style: L.style,\n pool: L.pool,\n zones: plan.zones.map((z) => ({ id: z.id, type: z.type, label: z.label, name: loc(z.label, locale), parts: z.parts, ground: z.ground })),\n perimeter: L.perimeter.map((s: Json) => Object.assign({ color: 'wall' }, s)),\n gates: plan.gates.map((g) => ({ id: g.id, type: g.type, model: g.model, u: g.u, v: g.v, axis: g.axis, width: g.width, height: g.height, side: g.side, to: g.to, material: g.material, open: !!g.open, color: 'gate' })),\n paths: plan.paths.map((c) => ({ id: c.id, type: c.type, from: c.from, to: c.to, width: c.width, rects: c.rects, points: c.points })),\n }\n : null\n const facade = Object.assign({}, plan.facade, {\n color: { name: loc(colors.meta.base, locale, 'facadeColors'), key: colors.meta.base, hex: hexString(colors.facade as number) },\n roles: { facade: 'facade', detail: 'facade_detail', roof: 'roof', wall: 'wall', gate: 'gate' },\n })\n const itemsOut = items.map((m) => {\n const out = strip(m)\n out.color = colorOf(m, seed)\n return out\n })\n const stateItemsOut = stateItemsAll.map((m) => {\n const out = strip(m)\n if (m.category) out.color = colorOf(m, seed)\n return out\n })\n const result: Json = {\n template: tpl.id,\n name: translate('templates', tpl.id, locale),\n use: useOf(tpl),\n seed,\n style: plan.style,\n state,\n w: plan.w,\n d: plan.d,\n floors: plan.floors.map((f) => ({ index: f.index, label: f.name, name: f.number != null ? translate('labels', 'floor_n', locale, { n: f.number }) : loc(f.name, locale), number: f.number, y0: f.y0, ceiling: f.ceiling })),\n rooms: plan.rooms.map((c) => ({\n id: c.id,\n type: c.type,\n label: c.label,\n name: loc(c.label, locale),\n floor: c.floor,\n u0: c.parts[0][0],\n v0: c.parts[0][1],\n u1: c.parts[0][2],\n v1: c.parts[0][3],\n parts: c.parts,\n link: c.link,\n ceiling: c.ceiling || plan.floors[c.floor].ceiling,\n color: { wall: 'wall_' + c.type, floor: 'floor_' + c.type },\n })),\n walls: plan.walls,\n doors: plan.doors,\n windows: plan.windows,\n openPairs: ([] as Json[]).concat(...Object.values(plan.openPairs)),\n facade,\n lot,\n items: itemsOut,\n stateItems: stateItemsOut,\n colors,\n building: tpl.building ? tpl.building(plan.w, plan.d, op) : null,\n missing,\n }\n if (tpl.singleFloor) result.floorNumber = op.floor || 3\n result.partyWalls = tpl.partyWalls || []\n if (plan.config) result.config = plan.config\n runResultExtensions(plan, result, seed, op)\n if (zone) {\n const report = { zone: zone.id, adjustments, violations: checkLot(zone, lot, Object.assign({}, result, { rooms: plan.rooms })) }\n result.zoning = report\n }\n return result\n}\n\nconst isSolid = (m: Json) => !m.flat && !m.on && (!m.decor || m.mount === 'floor')\n\n/** Validates a result of `generate`; returns a list of messages (empty when valid). */\nexport function validate(result: Json, options?: { locale?: string }): string[] {\n const locale = options?.locale || result.locale || 'en'\n const t = (key: string, vars: Record<string, string | number>) => translate('messages', key, locale, vars)\n const errors: string[] = []\n const solids: Json[] = result.items.filter(isSolid)\n for (let i = 0; i < solids.length; i++)\n for (let j = i + 1; j < solids.length; j++)\n if (solids[i].floor === solids[j].floor && !solids[i].barricade && !solids[j].barricade && overlaps(solids[i].aabb, solids[j].aabb, 0.011)) errors.push(t('overlap', { a: solids[i].id, b: solids[j].id }))\n for (const m of solids) {\n if (m.barricade) continue\n for (const p of result.doors) if (p.floor === (m.outdoor ? 0 : m.floor) && p.zones.some((z: Json) => overlaps(m.aabb, z, 0.011))) errors.push(t('door_blocked', { id: m.id }))\n if (result.lot) for (const g of result.lot.gates) if (m.outdoor && openingZones(g.u, g.v, 'u', g.width, DOOR_CLEARANCE).some((z) => overlaps(m.aabb, z, 0.011))) errors.push(t('gate_blocked', { id: m.id }))\n }\n for (const f of result.missing) errors.push(t('missing_required', { room: f.room, slot: f.slot }))\n if (result.zoning) for (const v of result.zoning.violations) errors.push(t('zone_violation', { zone: result.zoning.zone, rule: v.rule, actual: v.actual, limit: v.limit }))\n return errors\n}\n\n/** Size limits and default size of a template (they can depend on options such as `tier`). */\nexport function limitsOf(template: string | TemplateDef, options?: FloorplanOptions) {\n const tpl = templateOf(template)\n const op = options || {}\n return { limits: tpl.limitsFn ? tpl.limitsFn(op) : tpl.limits, defaults: tpl.defaultsFn ? tpl.defaultsFn(op) : tpl.defaults }\n}\n\nexport function listTemplates(locale = 'en') {\n return Object.values(TEMPLATES).map((t) => {\n const a = floorsOf(t, {})\n return {\n id: t.id,\n name: translate('templates', t.id, locale),\n use: useOf(t),\n style: typeof t.style === 'function' ? t.style({}) : t.style,\n limits: t.limits,\n defaults: t.defaults,\n floors: a.length,\n floorRange: t.floorRange || null,\n lot: !!t.lot,\n options: t.options || {},\n }\n })\n}\n\nexport { DECOR_PROFILES }\n","import { registerItems } from './registry'\n\n/** Ground cover types the lot builder can draw. Colours come from the palette roles of the same purpose. */\nexport function registerGroundItems(): void {\n const flat = { category: 'ground_cover', w: 1, d: 1, h: 0, decor: true, mount: 'ground', flat: true } as const\n registerItems([\n { type: 'lawn', ...flat, color: { role: 'lawn' } },\n { type: 'tile_floor', ...flat, color: { role: 'exterior_floor' } },\n { type: 'concrete', ...flat, color: { role: 'exterior_floor' } },\n { type: 'deck_floor', ...flat, color: { role: 'deck_floor' } },\n { type: 'dirt', ...flat, color: { role: 'dirt' } },\n ])\n}\n","import type { SlotDef, SlotKit } from './types'\n\n/** Builders for the slot definitions of a room library. */\nexport const slotKit: SlotKit = {\n wall: (id, side, pos, size, cats, o) => Object.assign({ id, anchor: 'wall', side, pos, size, cats }, o) as SlotDef,\n corner: (id, corner, size, cats, o) => Object.assign({ id, anchor: 'corner', corner, size, cats }, o) as SlotDef,\n center: (id, fx, fz, size, cats, o) => Object.assign({ id, anchor: 'center', fx, fz, size, cats }, o) as SlotDef,\n windowSlot: (id, size, cats, o) => Object.assign({ id, anchor: 'window', size, cats }, o) as SlotDef,\n on: (id, parent, cats, o) => Object.assign({ id, anchor: 'on', on: parent, cats }, o) as SlotDef,\n inside: (id, parent, cats, o) => Object.assign({ id, anchor: 'inside', on: parent, cats }, o) as SlotDef,\n}\n","{\n \"labels\": {\n \"floor_n\": \"Floor {n}\",\n \"parking\": \"Parking\",\n \"garden\": \"Garden\",\n \"backyard\": \"Backyard\",\n \"side_left\": \"Left side\",\n \"side_right\": \"Right side\"\n },\n \"reasons\": {\n \"invalid_parent\": \"invalid parent\",\n \"invalid_side\": \"invalid side\",\n \"blocked_by_door\": \"blocked by a door\",\n \"open_wall\": \"open wall\",\n \"invalid_corner\": \"invalid corner\",\n \"no_window\": \"no window\",\n \"window_outside_room\": \"window outside the room\",\n \"larger_than_room\": \"slot larger than the room\",\n \"unknown_anchor\": \"unknown anchor\"\n },\n \"messages\": {\n \"overlap\": \"Overlap: {a} and {b}\",\n \"door_blocked\": \"Door blocked by {id}\",\n \"gate_blocked\": \"Gate blocked by {id}\",\n \"missing_required\": \"Required item missing: {room}/{slot}\",\n \"zone_violation\": \"Zone {zone}: {rule} is {actual}, limit {limit}\"\n },\n \"ui\": {\n \"title\": \"Floor plan viewer\",\n \"template\": \"Template\",\n \"seed\": \"Seed\",\n \"random_seed\": \"Random\",\n \"state\": \"State\",\n \"style\": \"Style\",\n \"zone\": \"Zone\",\n \"no_zone\": \"No zone (unrestricted)\",\n \"floor\": \"Floor\",\n \"outside\": \"Whole lot\",\n \"language\": \"Language\",\n \"width\": \"Width (m)\",\n \"depth\": \"Depth (m)\",\n \"auto_size\": \"Template default size\",\n \"options\": \"Options\",\n \"opt_floors\": \"Floors\",\n \"opt_elevator\": \"Elevator\",\n \"opt_tier\": \"Tier\",\n \"yes\": \"Yes\",\n \"no\": \"No\",\n \"default\": \"Default\",\n \"show_labels\": \"Labels\",\n \"show_items\": \"Items\",\n \"show_state\": \"State items\",\n \"show_lot\": \"Lot\",\n \"show_grid\": \"Grid\",\n \"legend\": \"Legend\",\n \"summary\": \"Summary\",\n \"rooms\": \"Rooms\",\n \"items\": \"Items\",\n \"state_items\": \"State items\",\n \"missing\": \"Missing required items\",\n \"none\": \"None\",\n \"validation\": \"Validation\",\n \"valid\": \"Valid plan\",\n \"zoning\": \"Zoning\",\n \"adjustments\": \"Adjustments\",\n \"violations\": \"Violations\",\n \"compliant\": \"Compliant with the zone\",\n \"hover\": \"Hover an item for details\",\n \"meters\": \"m\",\n \"use_label\": \"Use\",\n \"unit_floor\": \"Unit floor\",\n \"legend_wall\": \"Wall\",\n \"legend_door\": \"Door\",\n \"legend_window\": \"Window\",\n \"legend_gate\": \"Gate\",\n \"legend_path\": \"Path\",\n \"legend_item\": \"Furniture\",\n \"legend_state\": \"State item (outlined)\",\n \"rule_use\": \"Use not allowed\",\n \"rule_floors\": \"Too many floors\",\n \"rule_height\": \"Too tall\",\n \"rule_setback_front\": \"Front setback too small\",\n \"rule_setback_side\": \"Side setback too small\",\n \"rule_setback_back\": \"Back setback too small\",\n \"rule_min_lot\": \"Lot too small\",\n \"rule_min_frontage\": \"Frontage too narrow\",\n \"rule_coverage\": \"Coverage too high\",\n \"rule_far\": \"Floor area ratio too high\",\n \"rule_permeable\": \"Permeable area too small\",\n \"reason_max_floors\": \"Zone floor limit\",\n \"reason_max_height\": \"Zone height limit\",\n \"reason_setback_front\": \"Zone front setback\",\n \"reason_setback_side\": \"Zone side setback\",\n \"reason_setback_back\": \"Zone back setback\",\n \"reason_permeable_min\": \"Zone permeable area\"\n }\n}\n","{\n \"labels\": {\n \"floor_n\": \"Andar {n}\",\n \"parking\": \"Vaga\",\n \"garden\": \"Jardim\",\n \"backyard\": \"Quintal\",\n \"side_left\": \"Lateral esquerda\",\n \"side_right\": \"Lateral direita\"\n },\n \"reasons\": {\n \"invalid_parent\": \"pai inválido\",\n \"invalid_side\": \"lado inválido\",\n \"blocked_by_door\": \"bloqueado por porta\",\n \"open_wall\": \"parede aberta\",\n \"invalid_corner\": \"canto inválido\",\n \"no_window\": \"sem janela\",\n \"window_outside_room\": \"janela fora do cômodo\",\n \"larger_than_room\": \"slot maior que o cômodo\",\n \"unknown_anchor\": \"âncora desconhecida\"\n },\n \"messages\": {\n \"overlap\": \"Sobreposição: {a} e {b}\",\n \"door_blocked\": \"Porta bloqueada por {id}\",\n \"gate_blocked\": \"Portão bloqueado por {id}\",\n \"missing_required\": \"Item obrigatório ausente: {room}/{slot}\",\n \"zone_violation\": \"Zona {zone}: {rule} é {actual}, limite {limit}\"\n },\n \"ui\": {\n \"title\": \"Visualizador de plantas\",\n \"template\": \"Modelo\",\n \"seed\": \"Semente\",\n \"random_seed\": \"Aleatória\",\n \"state\": \"Estado\",\n \"style\": \"Estilo\",\n \"zone\": \"Zona\",\n \"no_zone\": \"Sem zona (livre)\",\n \"floor\": \"Andar\",\n \"outside\": \"Lote inteiro\",\n \"language\": \"Idioma\",\n \"width\": \"Largura (m)\",\n \"depth\": \"Profundidade (m)\",\n \"auto_size\": \"Tamanho padrão do modelo\",\n \"options\": \"Opções\",\n \"opt_floors\": \"Andares\",\n \"opt_elevator\": \"Elevador\",\n \"opt_tier\": \"Padrão\",\n \"yes\": \"Sim\",\n \"no\": \"Não\",\n \"default\": \"Padrão\",\n \"show_labels\": \"Rótulos\",\n \"show_items\": \"Móveis\",\n \"show_state\": \"Itens de estado\",\n \"show_lot\": \"Lote\",\n \"show_grid\": \"Grade\",\n \"legend\": \"Legenda\",\n \"summary\": \"Resumo\",\n \"rooms\": \"Cômodos\",\n \"items\": \"Móveis\",\n \"state_items\": \"Itens de estado\",\n \"missing\": \"Itens obrigatórios ausentes\",\n \"none\": \"Nenhum\",\n \"validation\": \"Validação\",\n \"valid\": \"Planta válida\",\n \"zoning\": \"Zoneamento\",\n \"adjustments\": \"Ajustes\",\n \"violations\": \"Violações\",\n \"compliant\": \"Em conformidade com a zona\",\n \"hover\": \"Passe o mouse sobre um item para ver detalhes\",\n \"meters\": \"m\",\n \"use_label\": \"Uso\",\n \"unit_floor\": \"Andar da unidade\",\n \"legend_wall\": \"Parede\",\n \"legend_door\": \"Porta\",\n \"legend_window\": \"Janela\",\n \"legend_gate\": \"Portão\",\n \"legend_path\": \"Caminho\",\n \"legend_item\": \"Móvel\",\n \"legend_state\": \"Item de estado (contorno)\",\n \"rule_use\": \"Uso não permitido\",\n \"rule_floors\": \"Andares demais\",\n \"rule_height\": \"Altura excedida\",\n \"rule_setback_front\": \"Recuo frontal insuficiente\",\n \"rule_setback_side\": \"Recuo lateral insuficiente\",\n \"rule_setback_back\": \"Recuo de fundos insuficiente\",\n \"rule_min_lot\": \"Lote pequeno demais\",\n \"rule_min_frontage\": \"Testada estreita demais\",\n \"rule_coverage\": \"Taxa de ocupação excedida\",\n \"rule_far\": \"Coeficiente de aproveitamento excedido\",\n \"rule_permeable\": \"Área permeável insuficiente\",\n \"reason_max_floors\": \"Limite de andares da zona\",\n \"reason_max_height\": \"Limite de altura da zona\",\n \"reason_setback_front\": \"Recuo frontal da zona\",\n \"reason_setback_side\": \"Recuo lateral da zona\",\n \"reason_setback_back\": \"Recuo de fundos da zona\",\n \"reason_permeable_min\": \"Área permeável da zona\"\n }\n}\n","import type { RandomSource } from './types'\n\n/** The page's own seeded generator (mulberry32), so a silhouette drawn from the same seed has the same windows and colours. */\nexport function createSilhouetteRandom(seed: number): RandomSource {\n let state = seed\n return () => {\n state |= 0\n state = (state + 0x6d2b79f5) | 0\n let t = Math.imul(state ^ (state >>> 15), 1 | state)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import type { RandomSource, Silhouette, SilhouettePart, SilhouetteWindow } from './types'\n\nconst ROOT = -1\nconst MAX_BOX_RADIUS = 0.15\nconst BOX_RADIUS_RATIO = 0.22\nconst PLAIN_BOX_RADIUS = 0.012\n\ntype Options = { parent?: number; ry?: number; rz?: number; emissive?: boolean }\n\n/** Rounded-box radius the team page gives a box; below 1.2 cm it is a plain box. */\nexport function boxRadius(width: number, height: number, depth: number): number {\n const radius = Math.min(Math.min(width, height, depth) * BOX_RADIUS_RATIO, MAX_BOX_RADIUS)\n return radius < PLAIN_BOX_RADIUS ? 0 : radius\n}\n\n/** Collects the parts of one silhouette; the generators call it the way the team page calls its own helpers. */\nexport function createSilhouetteBuilder(random: RandomSource) {\n const parts: SilhouettePart[] = []\n const windows: SilhouetteWindow[] = []\n const pick = <T>(list: readonly T[]): T => list[Math.floor(random() * list.length)] as T\n const group = (x: number, y: number, z: number, ry = 0, parent = ROOT): number => parts.push({ shape: 'group', parent, x, y, z, ry }) - 1\n const box = (x: number, y: number, z: number, width: number, height: number, depth: number, color: number, o: Options = {}): void => {\n parts.push({ shape: 'box', parent: o.parent ?? ROOT, x, y: y + height / 2, z, width, height, depth, color, emissive: o.emissive ?? false, ry: o.ry ?? 0, rz: o.rz ?? 0, radius: boxRadius(width, height, depth) })\n }\n const prism = (x: number, y: number, z: number, width: number, height: number, depth: number, color: number, parent = ROOT): void => {\n parts.push({ shape: 'prism', parent, x, y, z, width, height, depth, color, ry: 0 })\n }\n const cylinder = (x: number, y: number, z: number, radiusTop: number, radiusBottom: number, height: number, color: number, parent = ROOT, segments = 14): void => {\n parts.push({ shape: 'cylinder', parent, x, y: y + height / 2, z, radiusTop, radiusBottom, height, color, segments })\n }\n const line = (points: [number, number, number][], color: number, parent = ROOT): void => {\n parts.push({ shape: 'line', parent, points, color })\n }\n const sign = (text: string, x: number, y: number, z: number, width: number, height: number, ry: number, colors: { background: string; foreground: string }, parent = ROOT): void => {\n parts.push({ shape: 'sign', parent, x, y, z, width, height, ry, text, ...colors })\n }\n const fence = (x0: number, z0: number, x1: number, z1: number, height: number, color: number, parent = ROOT): void => {\n const length = Math.hypot(x1 - x0, z1 - z0)\n const count = Math.ceil(length / 3)\n for (let index = 0; index <= count; index++) {\n const t = index / count\n cylinder(x0 + (x1 - x0) * t, 0, z0 + (z1 - z0) * t, 0.05, 0.05, height, color, parent, 5)\n }\n for (const level of [height * 0.35, height * 0.65, height * 0.98]) line([[x0, level, z0], [x1, level, z1]], 0x8a8c8e, parent)\n }\n const finish = (footprint: Silhouette['footprint']): Silhouette => ({ parts, windows, footprint })\n return { random, pick, group, box, prism, cylinder, line, sign, fence, windows, finish }\n}\n\nexport type SilhouetteBuilder = ReturnType<typeof createSilhouetteBuilder>\n","import { createSilhouetteBuilder } from './builder'\nimport { createSilhouetteRandom } from './random'\nimport type { RandomSource, Silhouette } from './types'\n\nconst STOREY_HEIGHT = 3\nconst SHOP_AWNING_HEIGHT = 4.5\nconst WINDOW_COLUMN_WIDTH = 2.6\nconst SHOP_SIGNS = ['FARMÁCIA', 'MAGAZINE', 'LOTÉRICA', 'PADARIA', 'ÓTICA', 'CALÇADOS', 'BAR'] as const\nconst SIGN_COLORS = ['#ffd27a', '#e8dfcf', '#c4483b'] as const\nconst DEFAULT_LIT_CHANCE = 0.07\n\nexport type CityBuildingParams = {\n x: number\n z: number\n width: number\n depth: number\n height: number\n color: number\n /** Chance of a ground-floor shop on both long faces; omitted means none. */\n shopChance?: number\n /** Chance that a window is lit. */\n litChance?: number\n random?: RandomSource\n seed?: number\n}\n\n/** City building: block, roof slab, maybe a vent, maybe a shop front, and window instances on the four faces. */\nexport function createCityBuilding(p: CityBuildingParams): Silhouette {\n const random = p.random ?? createSilhouetteRandom(p.seed ?? 7)\n const b = createSilhouetteBuilder(random)\n const { x, z, width: w, depth: d, height: h } = p\n b.box(x, 0, z, w, h, d, p.color)\n b.box(x, h, z, w + 0.3, 0.35, d + 0.3, 0x2a2a2c)\n if (random() < 0.4) b.cylinder(x + (random() - 0.5) * (w - 3), h + 0.35, z + (random() - 0.5) * (d - 3), 0.8, 0.8, 1.4, 0x4b4540)\n const hasShop = p.shopChance !== undefined && p.shopChance > 0 && random() < p.shopChance\n if (hasShop) {\n for (const face of [1, -1]) {\n const zFace = z + face * (d / 2)\n b.box(x, SHOP_AWNING_HEIGHT, zFace + face * 0.8, w, 0.2, 1.6, 0x2a2a2c)\n b.box(x, 0, zFace + face * 0.03, w * 0.6, 3.5, 0.05, 0x4a4c4e)\n const text = b.pick(SHOP_SIGNS)\n b.sign(text, x, 5.3, zFace + face * 0.12, Math.min(w * 0.7, 8), 1, face > 0 ? 0 : Math.PI, { background: '#1a1a1c', foreground: b.pick(SIGN_COLORS) })\n }\n }\n addWindows(b, p, hasShop ? SHOP_AWNING_HEIGHT : 0)\n return b.finish({ x, z, width: w, depth: d, height: h + 0.35 })\n}\n\nfunction addWindows(b: ReturnType<typeof createSilhouetteBuilder>, p: CityBuildingParams, base: number): void {\n const { x, z, width: w, depth: d, height: h } = p\n const floors = Math.max(1, Math.floor((h - 1) / STOREY_HEIGHT))\n const faces: [number, number, number, number][] = [[0, d / 2 + 0.03, w, 0], [0, -d / 2 - 0.03, w, Math.PI], [w / 2 + 0.03, 0, d, Math.PI / 2], [-w / 2 - 0.03, 0, d, -Math.PI / 2]]\n for (const [ox, oz, faceWidth, ry] of faces) {\n const columns = Math.max(1, Math.floor(faceWidth / WINDOW_COLUMN_WIDTH))\n for (let floor = 0; floor < floors; floor++) {\n const y = base + 1.8 + floor * STOREY_HEIGHT\n for (let column = 0; column < columns; column++) {\n const u = (column - (columns - 1) / 2) * WINDOW_COLUMN_WIDTH\n b.windows.push({ x: ox ? x + ox : x + u, y, z: ox ? z + u : z + oz, ry, width: 1.2, height: 1.4, isLit: b.random() < (p.litChance || DEFAULT_LIT_CHANCE) })\n }\n }\n }\n}\n","import { createSilhouetteBuilder } from './builder'\nimport { createSilhouetteRandom } from './random'\nimport type { RandomSource, Silhouette } from './types'\n\nconst LIT_WINDOW = 0xffb45e\nconst DARK_WINDOW = 0x10151b\nconst DEFAULT_ROOF = 0x5a3a2a\n\ntype Seeded = { random?: RandomSource; seed?: number }\n\nconst randomOf = (o: Seeded): RandomSource => o.random ?? createSilhouetteRandom(o.seed ?? 7)\n\n/** Window colour: a lit one glows (emissive), a dark one is a plain dark pane. */\nconst pane = (isLit: boolean) => ({ color: isLit ? LIT_WINDOW : DARK_WINDOW, emissive: isLit })\n\nexport type TwoStoreyParams = Seeded & { x: number; z: number; width: number; depth: number; color: number; roofColor?: number; ry?: number }\n\n/** Two-storey house with a balcony slab, pitched roof and four windows. */\nexport function createTwoStoreyHouse(p: TwoStoreyParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w, depth: d } = p\n const g = b.group(p.x, 0, p.z, p.ry)\n b.box(0, 0, 0, w, 6, d, p.color, { parent: g })\n b.prism(0, 6, 0, w + 0.4, 1.4, d + 0.4, p.roofColor ?? DEFAULT_ROOF, g)\n b.box(0, 3.1, d / 2 + 0.5, w * 0.6, 0.15, 1, 0x6a6a66, { parent: g })\n for (const floor of [0, 1]) {\n for (const side of [-1, 1]) {\n const { color, emissive } = pane(b.random() < 0.12)\n b.box(side * w * 0.26, 1.1 + floor * 3, d / 2 + 0.03, 1.1, 1.2, 0.04, color, { parent: g, emissive })\n }\n }\n b.box(0, 0, d / 2 + 0.02, 1, 2.1, 0.05, 0x2a1d14, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: w, depth: d, height: 7.4 })\n}\n\nexport type SlabHouseParams = Seeded & { x: number; z: number; width: number; depth: number; floors: number; color: number }\n\n/** Reinforced-concrete slab house of one to three floors, with water tank, side stair and sometimes rebar starters. */\nexport function createSlabHouse(p: SlabHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w, depth: d, floors } = p\n const g = b.group(p.x, 0, p.z, 0)\n for (let floor = 0; floor < floors; floor++) {\n const isTop = floor === floors - 1\n b.box(0, floor * 2.9, 0, w, 2.9, d, isTop && b.random() < 0.5 ? 0x9a6a50 : p.color, { parent: g })\n const { color, emissive } = pane(b.random() < 0.1)\n b.box(0, floor * 2.9 + 1.1, d / 2 + 0.03, 1, 1, 0.04, color, { parent: g, emissive })\n }\n b.cylinder(w * 0.25, floors * 2.9, -d * 0.2, 0.55, 0.55, 0.9, 0x2a5aa0, g, 10)\n for (let level = 0; level < floors; level++) b.box(w / 2 + 0.4, level * 2.9, 0, 0.8, 0.18, 1.2, 0x7a7a74, { parent: g })\n if (b.random() < 0.6) for (let index = 0; index < 4; index++) b.box(-w * 0.3 + index * 0.4, floors * 2.9, 0, 0.02, 1, 0.02, 0x8a8a8a, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: w, depth: d, height: floors * 2.9 + 1 })\n}\n\nexport type ColonialParams = Seeded & { x: number; z: number; width: number; color: number; hasDoor: boolean }\n\n/** Colonial terrace house: parapet, roof behind it and a row of doors or windows. */\nexport function createColonialHouse(p: ColonialParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w } = p\n const g = b.group(p.x, 0, p.z, 0)\n b.box(0, 0, 0, w, 4.2, 10, p.color, { parent: g })\n b.box(0, 4.2, 4.6, w, 0.8, 0.25, p.color, { parent: g })\n b.prism(0, 4.2, -0.4, w, 1.4, 9.6, 0x7a4a32, g)\n const count = Math.max(1, Math.floor(w / 2.2))\n for (let index = 0; index < count; index++) {\n const u = (index - (count - 1) / 2) * 2.2\n const isDoor = index === 0 && p.hasDoor\n const lit = isDoor ? false : b.random() < 0.15\n const color = isDoor ? 0x3a2416 : lit ? LIT_WINDOW : 0x2a3a4a\n b.box(u, 1.0, 5.02, 0.9, 2.0, 0.05, color, { parent: g, emissive: lit })\n }\n return b.finish({ x: p.x, z: p.z, width: w, depth: 10, height: 6 })\n}\n\nexport type ChaletParams = Seeded & { x: number; z: number; color?: number; ry?: number }\n\n/** Wooden chalet on a stone base with a steep roof and a chimney. */\nexport function createChalet(p: ChaletParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, p.ry)\n b.box(0, 0, 0, 7, 0.8, 9, 0x5a5650, { parent: g })\n b.box(0, 0.8, 0, 7, 4.2, 9, p.color ?? 0x6b4a30, { parent: g })\n b.prism(0, 5, 0, 7.6, 4, 9.6, 0x2c2a28, g)\n b.box(2.2, 5, -1, 0.8, 4.2, 0.8, 0x5a5650, { parent: g })\n const { color, emissive } = pane(b.random() < 0.3)\n b.box(0, 1.6, 4.52, 1.3, 1.3, 0.04, color, { parent: g, emissive })\n b.box(0, 6.2, 4.6, 1, 1, 0.04, DARK_WINDOW, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: 7.6, depth: 9.6, height: 9 })\n}\n\nexport type CompanyHouseParams = Seeded & { x: number; z: number; color?: number }\n\n/** Company-town house with a low front fence. */\nexport function createCompanyHouse(p: CompanyHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, 0)\n b.box(0, 0, 0, 6, 3, 9, p.color ?? 0xd8d0c0, { parent: g })\n b.prism(0, 3, 0, 6.4, 1.6, 9.4, 0x8a4a32, g)\n b.box(0, 0, 4.52, 0.9, 2.1, 0.05, 0x3a2a1c, { parent: g })\n b.box(1.8, 1.1, 4.52, 1, 1, 0.04, DARK_WINDOW, { parent: g })\n b.fence(-3.2, 6.5, 3.2, 6.5, 0.9, 0xe0d8c8, g)\n return b.finish({ x: p.x, z: p.z, width: 6.4, depth: 13, height: 4.6 })\n}\n\nexport type StiltHouseParams = Seeded & { x: number; z: number; color?: number }\n\n/** House on stilts with a ramp-like entry platform. */\nexport function createStiltHouse(p: StiltHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, 0)\n for (const a of [-2, 2]) for (const c of [-3, 3]) b.cylinder(a, -1.5, c, 0.12, 0.12, 3.1, 0x3a2a1c, g, 6)\n b.box(0, 1.5, 0, 5, 0.2, 7, 0x5a4630, { parent: g })\n b.box(0, 1.7, 0, 4.6, 2.6, 6.4, p.color ?? 0x6a5a46, { parent: g })\n b.prism(0, 4.3, 0, 5.2, 1.1, 7, 0x7a7a78, g)\n b.box(0, 1.5, 5, 1.2, 0.15, 4, 0x5a4630, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: 5.2, depth: 9, height: 5.4 })\n}\n\nexport type FarmhouseParams = Seeded & { x: number; z: number }\n\n/** Farm house with a long covered porch on six posts. */\nexport function createFarmhouse(p: FarmhouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, 0)\n b.box(0, 0, 0, 15, 3.2, 11, 0xd8cfb8, { parent: g })\n b.prism(0, 3.2, 0, 17, 2.2, 13, 0x8a4a32, g)\n b.box(0, 0, 6.8, 15, 0.25, 2.6, 0x6a5a46, { parent: g })\n for (let index = 0; index < 6; index++) b.cylinder(-7 + index * 2.8, 0, 7.8, 0.1, 0.1, 3.2, 0x5a4630, g, 6)\n b.box(-3, 1.0, 5.52, 1.2, 1.2, 0.04, LIT_WINDOW, { parent: g, emissive: true })\n return b.finish({ x: p.x, z: p.z, width: 17, depth: 13, height: 5.4 })\n}\n\nexport type DetachedHouseParams = Seeded & { x: number; z: number; width: number; depth: number; color: number; roofColor?: number; ry?: number; isBoarded?: boolean }\n\n/** One-storey detached house; boarded windows get two crossed planks each. */\nexport function createDetachedHouse(p: DetachedHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w, depth: d } = p\n const g = b.group(p.x, 0, p.z, p.ry)\n b.box(0, 0, 0, w, 3, d, p.color, { parent: g })\n b.prism(0, 3, 0, w + 0.5, 1.6, d + 0.5, p.roofColor ?? DEFAULT_ROOF, g)\n b.box(0, 0, d / 2 + 0.02, 1, 2.1, 0.05, 0x2a1d14, { parent: g })\n for (const side of [-1, 1]) {\n const { color, emissive } = pane(b.random() < 0.15)\n b.box(side * w * 0.28, 1.1, d / 2 + 0.03, 1.1, 1.1, 0.04, color, { parent: g, emissive })\n if (p.isBoarded || b.random() < 0.3) for (const k of [-1, 1]) b.box(side * w * 0.28, 1.5 + k * 0.25, d / 2 + 0.08, 1.3, 0.14, 0.04, 0x6b4a2a, { parent: g, rz: k * 0.15 })\n }\n return b.finish({ x: p.x, z: p.z, width: w + 0.5, depth: d + 0.5, height: 4.6 })\n}\n","import { CAR_CLEARANCE, DOOR_CLEARANCE, DOOR_EDGE_CLEARANCE, OVERHEAD_TOP, PLAYER_RADIUS, WALL_THICKNESS, WINDOW_EDGE_CLEARANCE } from './constants'\nimport { findsAnswer, findsFor } from './extensions'\nimport { generate, limitsOf, listTemplates, slots, validate } from './generate'\nimport { registerGroundItems } from './ground-items'\nimport { listLocales, registerLocale, translate } from './locale'\nimport { HIGH_SATURATION, MIN_FABRIC_FLOOR_CONTRAST, MIN_WALL_FLOOR_CONTRAST, hexString, intToHsl, lstar, palette } from './palette'\nimport {\n CATALOG,\n LIBRARIES,\n PALETTE_STYLES,\n STYLES,\n TEMPLATES,\n VIEWER_LAYERS,\n registerViewerLayer,\n listStates,\n registerDecorProfile,\n registerFindsProvider,\n registerGroundOverlay,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerPass,\n registerPaletteStyle,\n registerResultExtension,\n registerRoomColors,\n registerSeedKeys,\n registerState,\n registerStyle,\n registerTemplate,\n registerWallTop,\n setStateDistribution,\n} from './registry'\nimport { createRng, hashString, mulberry32 } from './rng'\nimport { slotKit } from './slot-kit'\nimport { checkLot, defineZone, getZone, listZones, registerPermeableGround } from './zoning'\nimport { overlaps, openingZones } from './geometry'\nimport { blocksWindow, windowZone } from './queries'\n\nimport enLocale from './locales/en.json'\nimport ptBrLocale from './locales/pt-BR.json'\n\nregisterGroundItems()\nregisterPermeableGround('lawn', 'dirt')\nregisterLocale('en', enLocale)\nregisterLocale('pt-BR', ptBrLocale)\n\nexport const version = '0.1.0'\n\n/**\n * The engine as a single object. Content packs take it as an argument (`register(engine)`), so that\n * several bundles (ESM or IIFE) always fill the same registries.\n */\nexport const engine = {\n version,\n generate,\n slots,\n validate,\n palette,\n limitsOf,\n listTemplates,\n listStates,\n // content registration\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerTemplate,\n registerStyle,\n registerPaletteStyle,\n registerRoomColors,\n registerDecorProfile,\n registerPass,\n registerGroundOverlay,\n registerWallTop,\n registerSeedKeys,\n registerState,\n setStateDistribution,\n registerLocale,\n registerResultExtension,\n registerFindsProvider,\n findsFor,\n findsAnswer,\n registerViewerLayer,\n viewerLayers: VIEWER_LAYERS,\n blocksWindow,\n // zoning\n defineZone,\n getZone,\n listZones,\n checkLot,\n registerPermeableGround,\n // kits and data\n slotKit,\n translate,\n listLocales,\n templates: TEMPLATES,\n catalog: CATALOG,\n libraries: LIBRARIES,\n styles: STYLES,\n paletteStyles: PALETTE_STYLES,\n createRng,\n mulberry32,\n hashString,\n overlaps,\n windowZone,\n openingZones,\n color: { lstar, hex: hexString, hsl: intToHsl, HIGH_SATURATION, MIN_WALL_FLOOR_CONTRAST, MIN_FABRIC_FLOOR_CONTRAST },\n constants: { WALL_THICKNESS, DOOR_CLEARANCE, PLAYER_RADIUS, DOOR_EDGE_CLEARANCE, WINDOW_EDGE_CLEARANCE, OVERHEAD_TOP, CAR_CLEARANCE },\n}\nexport type FloorplanEngine = typeof engine\n\nexport {\n generate,\n slots,\n validate,\n palette,\n limitsOf,\n listTemplates,\n listStates,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerTemplate,\n registerStyle,\n registerPaletteStyle,\n registerRoomColors,\n registerDecorProfile,\n registerPass,\n registerGroundOverlay,\n registerWallTop,\n registerSeedKeys,\n registerState,\n setStateDistribution,\n registerLocale,\n registerResultExtension,\n registerFindsProvider,\n findsFor,\n findsAnswer,\n registerViewerLayer,\n blocksWindow,\n translate,\n listLocales,\n defineZone,\n getZone,\n listZones,\n checkLot,\n registerPermeableGround,\n slotKit,\n createRng,\n mulberry32,\n hashString,\n overlaps,\n windowZone,\n openingZones,\n}\nexport type * from './types'\nexport type { PaletteDraw, PaletteEarly, PaletteStyleDef } from './palette'\nexport * from './silhouettes'\n"],"mappings":"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","names":["slots","r","cl","m","rimRect","ceiling","current","limit","palette","ZONES","rule"]}
1
+ {"version":3,"sources":["../src/registry.ts","../src/rng.ts","../src/extensions.ts","../src/constants.ts","../src/geometry.ts","../src/parking.ts","../src/queries.ts","../src/grid.ts","../src/fill.ts","../src/legacy-seeds.ts","../src/context.ts","../src/locale.ts","../src/paths.ts","../src/zoning.ts","../src/plan.ts","../src/palette.ts","../src/slots.ts","../src/generate.ts","../src/instance.ts","../src/ground-items.ts","../src/slot-kit.ts","../src/locales/en.json","../src/locales/pt-BR.json","../src/silhouettes/random.ts","../src/silhouettes/builder.ts","../src/silhouettes/building.ts","../src/silhouettes/houses.ts","../src/index.ts"],"sourcesContent":["import type {\n DecorPass,\n FindsProvider,\n ResultExtensionOptions,\n ResultExtensionRun,\n GroundOverlayRule,\n FurnitureDef,\n ItemInput,\n Json,\n RoomColorDef,\n SlotLibrary,\n StateContext,\n StatePlugin,\n StyleDef,\n TemplateDef,\n ViewerLayer,\n FloorplanLocale,\n ZoneDef,\n} from './types'\nimport type { PaletteStyleDef } from './palette'\n\n/** All content registries of one engine instance. Content packs fill them through the `register*` functions. */\nexport type Registries = {\n CATALOG: Record<string, FurnitureDef>\n LIBRARIES: Record<string, SlotLibrary>\n LIBRARY_ALIAS: Record<string, string>\n TEMPLATES: Record<string, TemplateDef>\n STYLES: Record<string, StyleDef>\n STYLE_ALIAS: Record<string, string>\n PALETTE_STYLES: Record<string, PaletteStyleDef>\n ROOM_COLORS: RoomColorDef[]\n PASSES: { name: string; run: DecorPass }[]\n DECOR_PROFILES: Record<string, Json>\n GROUND_OVERLAYS: GroundOverlayRule[]\n STATE_PLUGINS: Record<string, StatePlugin>\n WALL_TOP_HEIGHTS: Record<string, number>\n SEED_KEYS: { rooms: Record<string, string>; items: Record<string, string> }\n stateDistribution: { weights: Record<string, number> | null; seedKey: string }\n RESULT_EXTENSIONS: ResultExtension[]\n FINDS_PROVIDERS: FindsProvider[]\n VIEWER_LAYERS: ViewerLayer[]\n LOCALES: Record<string, FloorplanLocale>\n ZONES: Record<string, ZoneDef>\n PERMEABLE_GROUNDS: Set<string>\n}\n\nexport const createRegistries = (): Registries => ({\n CATALOG: {},\n LIBRARIES: {},\n LIBRARY_ALIAS: {},\n TEMPLATES: {},\n STYLES: {},\n STYLE_ALIAS: {},\n PALETTE_STYLES: {},\n ROOM_COLORS: [],\n PASSES: [],\n DECOR_PROFILES: {},\n GROUND_OVERLAYS: [],\n STATE_PLUGINS: { normal: { apply: () => [] } },\n WALL_TOP_HEIGHTS: { none: 0 },\n SEED_KEYS: { rooms: {}, items: {} },\n stateDistribution: { weights: null, seedKey: 'state' },\n RESULT_EXTENSIONS: [],\n FINDS_PROVIDERS: [],\n VIEWER_LAYERS: [],\n LOCALES: {},\n ZONES: {},\n PERMEABLE_GROUNDS: new Set(),\n})\n\nlet defaultRegistries: Registries | undefined\nlet activeRegistries: Registries | undefined\n\n/** The registries of the global (deprecated) engine, created on first use. */\nexport const getDefaultRegistries = (): Registries => (defaultRegistries ??= createRegistries())\n\n/** The registries the running call reads: the instance it was made through, or the default. */\nexport const registries = (): Registries => activeRegistries ?? getDefaultRegistries()\n\n/** Runs `run` with `scope` as the registries every module reads. Everything the engine does is synchronous, so the scope cannot leak between instances. */\nexport function withRegistries<TResult>(scope: Registries, run: () => TResult): TResult {\n const previous = activeRegistries\n activeRegistries = scope\n try {\n return run()\n } finally {\n activeRegistries = previous\n }\n}\n\nexport function registerItem(def: ItemInput): FurnitureDef {\n const h = def.h\n const item: FurnitureDef = Object.assign({ front: '+z', window: h <= 0.95, low: h <= 0.5, flat: false, deck: false, rim: 0 }, def) as FurnitureDef\n registries().CATALOG[def.type] = item\n return item\n}\nexport function registerItems(list: ItemInput[]): void {\n for (const d of list) registerItem(d)\n}\n\nexport function registerLibrary(id: string, library: SlotLibrary): void {\n registries().LIBRARIES[id] = library\n}\nexport function registerLibraryAlias(alias: string, id: string): void {\n registries().LIBRARY_ALIAS[alias] = id\n}\n\nexport function registerTemplate<T extends TemplateDef>(t: T): T {\n registries().TEMPLATES[t.id] = t\n return t\n}\n\nexport function registerStyle(style: StyleDef): void {\n registries().STYLES[style.id] = style\n for (const a of style.aliases || []) registries().STYLE_ALIAS[a] = style.id\n}\nexport function registerPaletteStyle(id: string, def: PaletteStyleDef): void {\n registries().PALETTE_STYLES[id] = def\n}\nexport function registerRoomColors(list: RoomColorDef[]): void {\n for (const d of list) {\n const i = registries().ROOM_COLORS.findIndex((x) => x.type === d.type)\n if (i >= 0) registries().ROOM_COLORS.splice(i, 1)\n registries().ROOM_COLORS.push(d)\n }\n registries().ROOM_COLORS.sort((a, b) => a.order - b.order)\n}\n\nexport function registerDecorProfile(styleId: string, profile: Json): void {\n registries().DECOR_PROFILES[styleId] = profile\n}\nexport function registerPass(name: string, run: DecorPass): void {\n const i = registries().PASSES.findIndex((p) => p.name === name)\n if (i >= 0) registries().PASSES[i] = { name, run }\n else registries().PASSES.push({ name, run })\n}\nexport function registerGroundOverlay(rule: GroundOverlayRule): void {\n registries().GROUND_OVERLAYS.push(rule)\n}\nexport function registerWallTop(id: string, height: number): void {\n registries().WALL_TOP_HEIGHTS[id] = height\n}\n/** Legacy RNG stream names for rooms and items, so seeds recorded before the English ids still reproduce. */\nexport function registerSeedKeys(keys: { rooms?: Record<string, string>; items?: Record<string, string> }): void {\n Object.assign(registries().SEED_KEYS.rooms, keys.rooms)\n Object.assign(registries().SEED_KEYS.items, keys.items)\n}\n\n/** Registers a house state. The engine only ships `normal`. */\nexport function registerState(name: string, plugin: StatePlugin): void {\n registries().STATE_PLUGINS[name] = plugin\n}\n/** Default state draw when `options.state` is absent: `{ state: weight }` on its own seeded stream. */\nexport function setStateDistribution(weights: Record<string, number> | null, seedKey = 'state'): void {\n registries().stateDistribution.weights = weights\n registries().stateDistribution.seedKey = seedKey\n}\nexport const listStates = (): string[] => Object.keys(registries().STATE_PLUGINS)\n\nexport function resolveStyleId(id: string | undefined): string {\n const s = id ?? ''\n return registries().STYLE_ALIAS[s] ?? s\n}\nexport function styleOf(id: string): StyleDef {\n return registries().STYLES[id] || registries().STYLES.budget || Object.values(registries().STYLES)[0]\n}\n\nexport type { StateContext }\n\nexport interface ResultExtension {\n name: string\n run: ResultExtensionRun\n after: string[]\n seedKey: string\n}\n\n/** Adds a named piece to every result, after the state and before the zoning report; its output lands in `result[name]`. */\nexport function registerResultExtension(name: string, run: ResultExtensionRun, options: ResultExtensionOptions = {}): void {\n const entry: ResultExtension = { name, run, after: options.after || [], seedKey: options.seedKey ?? name }\n const i = registries().RESULT_EXTENSIONS.findIndex((x) => x.name === name)\n if (i >= 0) registries().RESULT_EXTENSIONS[i] = entry\n else registries().RESULT_EXTENSIONS.push(entry)\n}\n\n/** Registers who answers what a container holds (the item packs, from phase 3 on). */\nexport function registerFindsProvider(provider: FindsProvider): void {\n registries().FINDS_PROVIDERS.push(provider)\n}\n\n/** Adds (or replaces, by id) a layer of the 2D viewer; drawn after the items, before the labels. */\nexport function registerViewerLayer(layer: ViewerLayer): void {\n const i = registries().VIEWER_LAYERS.findIndex((x) => x.id === layer.id)\n if (i >= 0) registries().VIEWER_LAYERS[i] = layer\n else registries().VIEWER_LAYERS.push(layer)\n}\n","/** Seeded random helpers. Same seed and key always produce the same stream. */\n\nexport type Rng = () => number\n\nexport function mulberry32(a: number): Rng {\n return function () {\n a |= 0\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nexport function hashString(input: string | number): number {\n const s = String(input)\n let h = 1779033703 ^ s.length\n for (let i = 0; i < s.length; i++) {\n h = Math.imul(h ^ s.charCodeAt(i), 3432918353)\n h = (h << 13) | (h >>> 19)\n }\n h = Math.imul(h ^ (h >>> 16), 2246822507)\n h = Math.imul(h ^ (h >>> 13), 3266489909)\n return (h ^ (h >>> 16)) >>> 0\n}\n\n/** Independent stream for a `(seed, key)` pair. */\nexport const createRng = (seed: string | number, key: string): Rng => mulberry32(hashString(seed + '|' + key))\n\n/** Picks a key of `{ key: weight }`. */\nexport function pickWeighted(rng: Rng, weights: Record<string, number>): string {\n const keys = Object.keys(weights)\n let total = 0\n for (const k of keys) total += weights[k]\n let x = rng() * total\n for (const k of keys) {\n x -= weights[k]\n if (x < 0) return k\n }\n return keys[keys.length - 1]\n}\n\n/** Weighted draw without replacement. */\nexport function weightedOrder<T extends { weight: number }>(candidates: T[], rng: Rng): T[] {\n const arr = candidates.slice()\n const out: T[] = []\n while (arr.length) {\n let total = 0\n for (const c of arr) total += c.weight\n let x = rng() * total\n let i = 0\n for (; i < arr.length - 1; i++) {\n x -= arr[i].weight\n if (x < 0) break\n }\n out.push(arr.splice(i, 1)[0])\n }\n return out\n}\n\nexport function shuffle<T>(arr: T[], rng: Rng): T[] {\n const a = arr.slice()\n for (let i = a.length - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1))\n ;[a[i], a[j]] = [a[j], a[i]]\n }\n return a\n}\n","import { registries } from './registry'\nimport type { ResultExtension } from './registry'\nimport { createRng } from './rng'\nimport type { FindsQuery, FindStack, FloorplanOptions, Json, Plan } from './types'\n\n/** Extensions in the order they run: registration order, with each one after the ones it names. */\nfunction orderOf(extensions: readonly ResultExtension[]): ResultExtension[] {\n const ordered: ResultExtension[] = []\n const visiting = new Set<string>()\n const visit = (extension: ResultExtension) => {\n if (ordered.includes(extension)) return\n if (visiting.has(extension.name)) throw new Error('Result extensions depend on each other: ' + extension.name)\n visiting.add(extension.name)\n for (const name of extension.after) {\n const before = extensions.find((x) => x.name === name)\n if (before) visit(before)\n }\n visiting.delete(extension.name)\n ordered.push(extension)\n }\n extensions.forEach(visit)\n return ordered\n}\n\n/** Runs the registered extensions and stores each output in `result[name]`. */\nexport function runResultExtensions(plan: Plan, result: Json, seed: number | string, options: FloorplanOptions): void {\n for (const extension of orderOf(registries().RESULT_EXTENSIONS)) {\n result[extension.name] = extension.run({ plan, result, seed, rng: createRng(seed, extension.seedKey), options })\n }\n}\n\n/** What a container holds, from the first registered provider that answers (`null` passes to the next); none answering means nothing. */\nexport function findsFor(query: FindsQuery): readonly FindStack[] {\n return answerOf(query) ?? []\n}\n\n/** Like `findsFor`, but `null` when no provider answered, so a pack can fall back to its own default. */\nexport function findsAnswer(query: FindsQuery): readonly FindStack[] | null {\n return answerOf(query)\n}\n\nfunction answerOf(query: FindsQuery): readonly FindStack[] | null {\n for (const provider of registries().FINDS_PROVIDERS) {\n const stacks = provider.findsFor(query)\n if (stacks !== null) return stacks\n }\n return null\n}\n","/** Structural wall thickness in metres. */\nexport const WALL_THICKNESS = 0.15\n/** Half a wall: the gap between a room rectangle and its usable interior. */\nexport const MARGIN = WALL_THICKNESS / 2\nexport const EPS = 1e-6\nexport const TOL = 1e-3\n/** Clear zone in front of doors and gates, in metres. */\nexport const DOOR_CLEARANCE = 0.9\n/** Radius of the player body: a disc this wide must still pass between doors and rooms once the furniture is placed. */\nexport const PLAYER_RADIUS = 0.24\n/** Clear wall from the edge of a door opening to a corner or a junction (measured from the wall axis). */\nexport const DOOR_EDGE_CLEARANCE = 0.12\n/** Clear wall from a window to a corner, a junction or a door. */\nexport const WINDOW_EDGE_CLEARANCE = 0.3\n/** Top of the wall cabinet (it hangs between 1.55 and 2.15 m). */\nexport const OVERHEAD_TOP = 2.15\n/** Room types that may stay without a window. */\nexport const WINDOWLESS_ROOM_TYPES: ReadonlySet<string> = new Set([\n 'stockroom', 'kitchen', 'laundry', 'bathroom', 'void', 'elevator', 'stairs', 'pantry', 'closet', 'corridor', 'hall', 'balcony', 'terrace', 'garage', 'storage', 'porch', 'tent', 'outhouse',\n])\n/** Default clearances of a parked car, in metres (driver side is the left of whoever looks along the front). */\nexport const CAR_CLEARANCE = { driver: 0.8, side: 0.6, end: 0.6 } as const\n","import { EPS, MARGIN, TOL, WALL_THICKNESS } from './constants'\nimport type { PlacedItem, Rect, Room, RoomDef, Vec2 } from './types'\n\nexport const r2 = (x: number): number => Math.round(x * 100) / 100\nexport const clamp = (x: number, a: number, b: number): number => Math.max(a, Math.min(b, x))\nexport const overlaps = (a: Rect, b: Rect, e = EPS): boolean => a[0] < b[2] - e && a[2] > b[0] + e && a[1] < b[3] - e && a[3] > b[1] + e\nexport const inner = (p: Rect): Rect => [p[0] + MARGIN, p[1] + MARGIN, p[2] - MARGIN, p[3] - MARGIN]\nexport const eq = (a: number, b: number): boolean => Math.abs(a - b) < TOL\nexport const inflate = (r: Rect, e: number): Rect => [r[0] - e, r[1] - e, r[2] + e, r[3] + e]\nexport const areaOf = (r: Rect): number => (r[2] - r[0]) * (r[3] - r[1])\nexport const topOf = (m: PlacedItem): number => (m.y || 0) + m.h\n\n/** Footprint of an item of `size` facing `f` (cardinal). */\nexport const extent = (size: Vec2, f: Vec2): Vec2 => (Math.abs(f[1]) === 1 ? [size[0], size[1]] : [size[1], size[0]])\nexport const cardinal = (dx: number, dz: number): Vec2 => (Math.abs(dx) > Math.abs(dz) ? [Math.sign(dx), 0] : [0, Math.sign(dz) || 1])\n\nexport function clearRect(r: Rect, f: Vec2, clearance: number): Rect {\n return f[1] === 1 ? [r[0], r[3], r[2], r[3] + clearance] : f[1] === -1 ? [r[0], r[1] - clearance, r[2], r[1]] : f[0] === 1 ? [r[2], r[1], r[2] + clearance, r[3]] : [r[0] - clearance, r[1], r[0], r[3]]\n}\n\nexport function insideUnion(r: Rect, inners: Rect[]): boolean {\n const e = 1e-4\n const points: Vec2[] = [\n [r[0] + e, r[1] + e],\n [r[2] - e, r[1] + e],\n [r[0] + e, r[3] - e],\n [r[2] - e, r[3] - e],\n [(r[0] + r[2]) / 2, (r[1] + r[3]) / 2],\n ]\n return points.every((p) => inners.some((q) => p[0] >= q[0] - 1e-6 && p[0] <= q[2] + 1e-6 && p[1] >= q[1] - 1e-6 && p[1] <= q[3] + 1e-6))\n}\n\nexport function cutIntervals(intervals: [number, number][], a: number, b: number): [number, number][] {\n const out: [number, number][] = []\n for (const [x, y] of intervals) {\n if (b <= x || a >= y) {\n out.push([x, y])\n continue\n }\n if (a > x) out.push([x, a])\n if (b < y) out.push([b, y])\n }\n return out\n}\n\nexport interface Edge {\n axis: 'u' | 'v'\n pos: number\n a0: number\n a1: number\n}\n\nexport function exteriorEdge(room: Room, side: string, w: number, d: number, c?: number | null): Edge | null {\n const cand: Edge[] = []\n for (const p of room.parts) {\n if (side === 'front' && eq(p[1], 0)) cand.push({ axis: 'u', pos: 0, a0: p[0], a1: p[2] })\n else if (side === 'back' && eq(p[3], d)) cand.push({ axis: 'u', pos: d, a0: p[0], a1: p[2] })\n else if (side === 'left' && eq(p[0], 0)) cand.push({ axis: 'v', pos: 0, a0: p[1], a1: p[3] })\n else if (side === 'right' && eq(p[2], w)) cand.push({ axis: 'v', pos: w, a0: p[1], a1: p[3] })\n }\n if (!cand.length) return null\n if (c != null) {\n const k = cand.find((x) => c >= x.a0 - TOL && c <= x.a1 + TOL)\n if (k) return k\n }\n return cand.sort((x, y) => y.a1 - y.a0 - (x.a1 - x.a0))[0]\n}\n\nexport function sharedEdge(A: Room, B: Room, c?: number | null): Edge | null {\n const cand: Edge[] = []\n for (const pa of A.parts)\n for (const pb of B.parts) {\n let o: [number, number]\n if (eq(pa[2], pb[0]) || eq(pa[0], pb[2])) {\n o = [Math.max(pa[1], pb[1]), Math.min(pa[3], pb[3])]\n if (o[1] - o[0] > TOL) cand.push({ axis: 'v', pos: eq(pa[2], pb[0]) ? pa[2] : pa[0], a0: o[0], a1: o[1] })\n }\n if (eq(pa[3], pb[1]) || eq(pa[1], pb[3])) {\n o = [Math.max(pa[0], pb[0]), Math.min(pa[2], pb[2])]\n if (o[1] - o[0] > TOL) cand.push({ axis: 'u', pos: eq(pa[3], pb[1]) ? pa[3] : pa[1], a0: o[0], a1: o[1] })\n }\n }\n if (!cand.length) return null\n if (c != null) {\n const k = cand.find((x) => c >= x.a0 - TOL && c <= x.a1 + TOL)\n if (k) return k\n }\n return cand.sort((x, y) => y.a1 - y.a0 - (x.a1 - x.a0))[0]\n}\n\nexport function openingZones(u: number, v: number, axis: 'u' | 'v', width: number, depth: number): Rect[] {\n const h = width / 2\n return axis === 'u' ? [[u - h, v - depth, u + h, v], [u - h, v, u + h, v + depth]] : [[u - depth, v - h, u, v + h], [u, v - h, u + depth, v + h]]\n}\nexport const openingDepth = (width: number, leaf: number): number => Math.max(0.9, leaf) + MARGIN\n\n/** Points 0.55 m on each side of an opening. */\nexport function entryPoints(ab: { axis: 'u' | 'v'; u: number; v: number }): Vec2[] {\n return ab.axis === 'u' ? [[ab.u, ab.v - 0.55], [ab.u, ab.v + 0.55]] : [[ab.u - 0.55, ab.v], [ab.u + 0.55, ab.v]]\n}\n\nexport function normalizeRoom(c: Partial<RoomDef> & { id: string; type: string; rect: number[] }, floorIndex: number): Room {\n const parts = [c.rect as number[]].concat(c.parts || []).map((p) => p.map(r2) as Rect)\n return {\n id: c.id,\n type: c.type,\n label: c.label,\n floor: floorIndex,\n parts,\n library: c.library || null,\n without: c.without || [],\n overrides: c.overrides || {},\n extras: c.extras || [],\n slots: c.slots || null,\n link: c.link || null,\n outdoor: !!c.outdoor,\n ceiling: c.ceiling || null,\n seedKey: c.seedKey,\n }\n}\n\n/**\n * Usable parts: each part inset by half a wall on every side, plus, for each stretch where it touches another part of the same room\n * (more than 0.3 m), a strip that reaches the shared edge. The inset stays at the ends of the stretch, where a real wall or corner stands.\n */\nexport function usableParts(room: Room, extra?: number): Rect[] {\n const m = MARGIN + (extra || 0)\n const out: Rect[] = []\n for (const p of room.parts) {\n out.push([p[0] + m, p[1] + m, p[2] - m, p[3] - m])\n for (let k = 0; k < 4; k++) {\n const spans: [number, number][] = []\n for (const q of room.parts) {\n if (q === p) continue\n if (k === 0 && eq(q[2], p[0])) spans.push([Math.max(q[1], p[1]), Math.min(q[3], p[3])])\n else if (k === 2 && eq(q[0], p[2])) spans.push([Math.max(q[1], p[1]), Math.min(q[3], p[3])])\n else if (k === 1 && eq(q[3], p[1])) spans.push([Math.max(q[0], p[0]), Math.min(q[2], p[2])])\n else if (k === 3 && eq(q[1], p[3])) spans.push([Math.max(q[0], p[0]), Math.min(q[2], p[2])])\n }\n spans.sort((x, y) => x[0] - y[0])\n const merged: [number, number][] = []\n for (const span of spans) {\n const last = merged[merged.length - 1]\n if (last && span[0] <= last[1] + TOL) last[1] = Math.max(last[1], span[1])\n else merged.push([span[0], span[1]])\n }\n for (const [a, b] of merged) {\n if (b - a <= 0.3) continue\n const x0 = a + m\n const x1 = b - m\n if (x1 <= x0) continue\n if (k === 0) out.push([p[0], x0, p[0] + m, x1])\n else if (k === 2) out.push([p[2] - m, x0, p[2], x1])\n else if (k === 1) out.push([x0, p[1], x1, p[1] + m])\n else out.push([x0, p[3] - m, x1, p[3]])\n }\n }\n }\n return out\n}\n\nexport const inRect = (room: Room, u: number, v: number): boolean => room.parts.some((p) => u > p[0] + EPS && u < p[2] - EPS && v > p[1] + EPS && v < p[3] - EPS)\n\nexport interface WallBuildDoor {\n axis: 'u' | 'v'\n pos: number\n at: number\n width: number\n}\n\n/** Walls of one storey, split where rooms meet and cut where doors open. */\nexport function buildWalls(rooms: Room[], doors: WallBuildDoor[], openPairs: [string, string][], floorIndex: number) {\n const groups: Record<string, { axis: 'u' | 'v'; pos: number; es: { a: number; b: number; id: string; side: number }[] }> = {}\n const add = (axis: 'u' | 'v', pos: number, a: number, b: number, id: string, side: number) => {\n const k = axis + '|' + pos.toFixed(2)\n ;(groups[k] = groups[k] || { axis, pos, es: [] }).es.push({ a, b, id, side })\n }\n for (const c of rooms)\n for (const p of c.parts) {\n add('u', p[1], p[0], p[2], c.id, 1)\n add('u', p[3], p[0], p[2], c.id, -1)\n add('v', p[0], p[1], p[3], c.id, 1)\n add('v', p[2], p[1], p[3], c.id, -1)\n }\n const par = (x: string, y: string) => openPairs.some((o) => (o[0] === x && o[1] === y) || (o[0] === y && o[1] === x))\n const typeOf: Record<string, string> = {}\n for (const c of rooms) typeOf[c.id] = c.type\n const out: Record<string, unknown>[] = []\n for (const g of Object.values(groups)) {\n const breaks = [...new Set(g.es.flatMap((e) => [r2(e.a), r2(e.b)]))].sort((x, y) => x - y)\n const segs: { A: string; B: string; p: number; q: number }[] = []\n for (let i = 0; i < breaks.length - 1; i++) {\n const p = breaks[i]\n const q = breaks[i + 1]\n const m = (p + q) / 2\n const after = g.es.find((e) => e.side === 1 && m > e.a && m < e.b)\n const before = g.es.find((e) => e.side === -1 && m > e.a && m < e.b)\n if (!after && !before) continue\n const A = before ? before.id : 'outside'\n const B = after ? after.id : 'outside'\n if (A === B || (A !== 'outside' && B !== 'outside' && par(A, B))) continue\n const last = segs[segs.length - 1]\n if (last && last.A === A && last.B === B && eq(last.q, p)) last.q = q\n else segs.push({ A, B, p, q })\n }\n for (const s of segs) {\n let pieces: [number, number][] = [[s.p, s.q]]\n for (const pt of doors) {\n if (pt.axis !== g.axis || !eq(pt.pos, g.pos)) continue\n const c0 = pt.at - pt.width / 2\n const c1 = pt.at + pt.width / 2\n const n: [number, number][] = []\n for (const [x, y] of pieces) {\n if (c1 <= x + TOL || c0 >= y - TOL) {\n n.push([x, y])\n continue\n }\n if (c0 > x + TOL) n.push([x, c0])\n if (c1 < y - TOL) n.push([c1, y])\n }\n pieces = n\n }\n for (const [x, y] of pieces) {\n const isOpen = (t: string) => t === 'balcony' || t === 'terrace' || t === 'porch'\n const isVoid = typeOf[s.A] === 'void' || typeOf[s.B] === 'void'\n if (isVoid && (s.A === 'outside' || s.B === 'outside')) continue\n const railing = isVoid || (isOpen(typeOf[s.A]) && s.B === 'outside') || (isOpen(typeOf[s.B]) && s.A === 'outside')\n out.push({\n floor: floorIndex,\n axis: g.axis,\n u0: g.axis === 'u' ? x : g.pos,\n v0: g.axis === 'u' ? g.pos : x,\n u1: g.axis === 'u' ? y : g.pos,\n v1: g.axis === 'u' ? g.pos : y,\n thickness: WALL_THICKNESS,\n sides: [s.A, s.B],\n exterior: s.A === 'outside' || s.B === 'outside',\n type: railing ? 'railing' : 'wall',\n h: railing ? 1.1 : 0,\n })\n }\n }\n }\n return out\n}\n","import { extent } from './geometry'\nimport type { CarClearance, FurnitureDef, Rect, Slot, Vec2 } from './types'\n\nconst STEP = 0.05\nconst MAX_CANDIDATES = 80\n\n/**\n * Where a car may stand in a parking slot: `rect` is the car, `clear` the car plus the space it must keep from walls\n * (the driver side, on the left of whoever looks along the front, keeps more than the passenger side). Candidates are sorted by\n * their distance to the slot centre; the car always stays whole inside the zone.\n */\nexport function carCandidates(slot: Slot, item: FurnitureDef, car: CarClearance): { rect: Rect; clear: Rect }[] {\n const front: Vec2 = [slot.frontU, slot.frontV]\n const zone: Rect = slot._cell.R\n const alongV = Math.abs(front[1]) === 1\n const [extentU, extentV] = extent([item.w, item.d], front)\n const across = alongV ? extentU : extentV\n const along = alongV ? extentV : extentU\n const a = alongV ? 0 : 1\n const b = alongV ? 1 : 0\n const driverSign = alongV ? front[1] : -front[0]\n const frontSign = alongV ? front[1] : front[0]\n const lowClear = driverSign < 0 ? car.driver : car.side\n const highClear = driverSign < 0 ? car.side : car.driver\n const lo = zone[a] + lowClear\n const hi = zone[a + 2] - highClear - across\n const alongLo = zone[b] + car.end\n const alongHi = zone[b + 2] - car.end - along\n if (hi < lo - 1e-6 || alongHi < alongLo - 1e-6) return []\n const preferred = (alongV ? slot.x : slot.z) - across / 2\n const alongStart = frontSign < 0 ? alongHi : alongLo\n const positions: number[] = []\n for (let p = lo; p <= hi + 1e-6; p += STEP) positions.push(Math.min(p, hi))\n positions.sort((x, y) => Math.abs(x - preferred) - Math.abs(y - preferred))\n return positions.slice(0, MAX_CANDIDATES).map((p) => {\n const rect: Rect = alongV ? [p, alongStart, p + across, alongStart + along] : [alongStart, p, alongStart + along, p + across]\n const clear: Rect = alongV ? [p - lowClear, alongStart - car.end, p + across + highClear, alongStart + along + car.end] : [alongStart - car.end, p - lowClear, alongStart + along + car.end, p + across + highClear]\n return { rect, clear }\n })\n}\n","import { EPS, MARGIN, OVERHEAD_TOP } from './constants'\nimport { eq, inRect } from './geometry'\nimport type { FurnitureDef, Json, Plan, Rect, Room } from './types'\n\n/** Door and path zones of a storey (storey -1 is the lot). */\nexport function zonesOfFloor(plan: Plan, floorIndex: number): Rect[] {\n const out: Rect[] = []\n if (floorIndex >= 0) {\n for (const p of plan.doors) if (p.floor === floorIndex) out.push(...p.zones)\n } else {\n for (const p of plan.doors) if (p.floor === 0 && p.exterior) out.push(...p.zones)\n for (const g of plan.gates) out.push(...g.zones)\n for (const c of plan.paths) out.push(...c.rects)\n out.push(...plan.reservations)\n }\n return out\n}\n\nexport function openingsOfFloor(plan: Plan, floorIndex: number): Json[] {\n if (floorIndex >= 0) return plan.doors.filter((p) => p.floor === floorIndex)\n return plan.doors.filter((p) => p.floor === 0 && p.exterior).concat(plan.gates)\n}\n\n/** Keep-out zone of a window (inside, or outside for the lot). */\nexport function windowZone(j: Json, outside?: boolean): Rect {\n const h = j.width / 2 + 0.1\n const depth = 0.5\n let n: [number, number]\n if (j.side === 'front') n = [0, 1]\n else if (j.side === 'back') n = [0, -1]\n else if (j.side === 'left') n = [1, 0]\n else n = [-1, 0]\n if (outside) n = [-n[0], -n[1]]\n const u = j.u\n const v = j.v\n if (j.axis === 'u') return n[1] > 0 ? [u - h, v - MARGIN, u + h, v + depth] : [u - h, v - depth, u + h, v + MARGIN]\n return n[0] > 0 ? [u - MARGIN, v - h, u + depth, v + h] : [u - depth, v - h, u + MARGIN, v + h]\n}\n\n/** `overheadOff`: the counter sits under the window without its wall cabinet. */\nexport function blocksWindow(it: Pick<FurnitureDef, 'window' | 'overhead' | 'windowHeight'> & { h: number }, win: Json, overheadOff?: boolean): boolean {\n const height = Math.max(it.h, it.windowHeight || 0, it.overhead && !overheadOff ? OVERHEAD_TOP : 0)\n return !it.window || it.h > 1.0 + EPS || height > win.y0 - 0.05 + EPS\n}\n\nexport function windowsOfRoom(plan: Plan, room: Room): Json[] {\n if (!room.outdoor) return plan.windows.filter((j) => j.room === room.id)\n return plan.windows.filter(\n (j) =>\n j.floor === 0 &&\n room.parts.some((p) => {\n if (j.side === 'front') return eq(p[3], j.pos) && j.u >= p[0] && j.u <= p[2]\n if (j.side === 'back') return eq(p[1], j.pos) && j.u >= p[0] && j.u <= p[2]\n if (j.side === 'left') return eq(p[2], j.pos) && j.v >= p[1] && j.v <= p[3]\n return eq(p[0], j.pos) && j.v >= p[1] && j.v <= p[3]\n }),\n )\n}\n\nexport function roomAt(plan: Plan, u: number, v: number, floorIndex: number): Room | null {\n const list = floorIndex < 0 ? plan.zones : plan.rooms\n return list.find((c) => c.floor === floorIndex && inRect(c, u, v)) || null\n}\n\nexport function isOpenSide(plan: Plan, room: Room, pu: number, pv: number): boolean {\n const o = roomAt(plan, pu, pv, room.floor)\n if (!o) return false\n if (o.id === room.id) return true\n if (room.outdoor) return true\n return (plan.openPairs[room.floor] || []).some((x) => (x[0] === room.id && x[1] === o.id) || (x[1] === room.id && x[0] === o.id))\n}\n","import { MARGIN } from './constants'\nimport { entryPoints, eq, inRect, inner, sharedEdge, usableParts } from './geometry'\nimport { openingsOfFloor } from './queries'\nimport type { Json, Plan, Rect, Room } from './types'\n\nexport interface Grid {\n gs: number\n u0: number\n v0: number\n nx: number\n nz: number\n inside: Uint8Array\n entries: [number, number][]\n center: [number, number]\n}\n\n/** Wall bodies of a storey (the wall line plus half a wall each side); a wall end that stops at a door opening has no extension there. */\nfunction wallBodies(plan: Plan, floor: number): Rect[] {\n const cache = (plan.wallBodies = plan.wallBodies || {})\n if (cache[floor]) return cache[floor]\n const doors = plan.doors.filter((p) => p.floor === floor)\n return (cache[floor] = plan.walls\n .filter((p) => p.floor === floor && (p.type === 'wall' || p.type === 'railing'))\n .map((p) => {\n const a0 = p.axis === 'u' ? p.u0 : p.v0\n const a1 = p.axis === 'u' ? p.u1 : p.v1\n const pos = p.axis === 'u' ? p.v0 : p.u0\n const atDoor = (x: number) => doors.some((q) => q.axis === p.axis && eq(q.pos, pos) && (eq(q.at - q.width / 2, x) || eq(q.at + q.width / 2, x)))\n const e0 = atDoor(a0) ? 0 : MARGIN\n const e1 = atDoor(a1) ? 0 : MARGIN\n return (p.axis === 'u' ? [a0 - e0, pos - MARGIN, a1 + e1, pos + MARGIN] : [pos - MARGIN, a0 - e0, pos + MARGIN, a1 + e1]) as Rect\n }))\n}\n\n/**\n * Walkability grid of a room (10 cm cells inside, 30 cm outside). Indoors a cell is walkable only when a player body of `radius`\n * fits between it and the walls. `ignored` lists opening ids to leave out of the entries.\n */\nexport function createGrid(plan: Plan, room: Room, ignored?: Set<string> | null, radius: number = plan.playerRadius): Grid {\n const gs = room.outdoor ? 0.3 : 0.1\n let u0 = 1e9\n let v0 = 1e9\n let u1 = -1e9\n let v1 = -1e9\n for (const p of room.parts) {\n u0 = Math.min(u0, p[0])\n v0 = Math.min(v0, p[1])\n u1 = Math.max(u1, p[2])\n v1 = Math.max(v1, p[3])\n }\n const nx = Math.ceil((u1 - u0) / gs)\n const nz = Math.ceil((v1 - v0) / gs)\n const insideCells = new Uint8Array(nx * nz)\n const insets = room.outdoor ? usableParts(room, 0.08) : room.parts\n // only the walls within reach of the room's box can be closer than the player's body to one of its cells (a tower floor has hundreds of them)\n const bodies = room.outdoor ? null : wallBodies(plan, room.floor).filter((r) => r[0] - radius <= u1 && r[2] + radius >= u0 && r[1] - radius <= v1 && r[3] + radius >= v0)\n const tooClose = (u: number, v: number) =>\n (bodies as Rect[]).some((r) => {\n const dx = Math.max(r[0] - u, 0, u - r[2])\n const dz = Math.max(r[1] - v, 0, v - r[3])\n return dx * dx + dz * dz < radius * radius - 1e-9\n })\n for (let j = 0; j < nz; j++)\n for (let i = 0; i < nx; i++) {\n const u = u0 + (i + 0.5) * gs\n const v = v0 + (j + 0.5) * gs\n if (insets.some((r) => u >= r[0] && u <= r[2] && v >= r[1] && v <= r[3]) && (room.outdoor || !tooClose(u, v))) insideCells[j * nx + i] = 1\n }\n const entries: [number, number][] = []\n for (const ab of openingsOfFloor(plan, room.floor) as Json[])\n if (!(ignored && ignored.has(ab.id)))\n for (const pt of entryPoints(ab)) {\n if (!inRect(room, pt[0], pt[1])) continue\n const i = Math.floor((pt[0] - u0) / gs)\n const j = Math.floor((pt[1] - v0) / gs)\n if (i >= 0 && j >= 0 && i < nx && j < nz && insideCells[j * nx + i]) entries.push([i, j])\n }\n if (!room.outdoor)\n for (const pair of plan.openPairs[room.floor] || []) {\n const otherId = pair[0] === room.id ? pair[1] : pair[1] === room.id ? pair[0] : null\n const other = otherId && plan.rooms.find((c) => c.id === otherId && c.floor === room.floor)\n if (!other) continue\n const edge = sharedEdge(room, other, null)\n if (!edge || edge.a1 - edge.a0 > 2.0) continue\n const mid = (edge.a0 + edge.a1) / 2\n for (const offset of [-0.4, 0.4]) {\n const pt = edge.axis === 'u' ? [mid, edge.pos + offset] : [edge.pos + offset, mid]\n if (!inRect(room, pt[0], pt[1])) continue\n const i = Math.floor((pt[0] - u0) / gs)\n const j = Math.floor((pt[1] - v0) / gs)\n if (i >= 0 && j >= 0 && i < nx && j < nz && insideCells[j * nx + i]) entries.push([i, j])\n }\n }\n const R = inner(room.parts[0])\n return { gs, u0, v0, nx, nz, inside: insideCells, entries, center: [(R[0] + R[2]) / 2, (R[1] + R[3]) / 2] }\n}\n\n/** True when the room centre and every entry stay connected once `solids` (inflated) are blocked. */\nexport function reachable(g: Grid, solids: Rect[], inflation: number): boolean {\n const { gs, u0, v0, nx, nz, inside } = g\n const blocked = new Uint8Array(nx * nz)\n for (const r of solids) {\n const i0 = Math.max(0, Math.floor((r[0] - inflation - u0) / gs))\n const i1 = Math.min(nx - 1, Math.floor((r[2] + inflation - u0) / gs))\n const j0 = Math.max(0, Math.floor((r[1] - inflation - v0) / gs))\n const j1 = Math.min(nz - 1, Math.floor((r[3] + inflation - v0) / gs))\n for (let j = j0; j <= j1; j++)\n for (let i = i0; i <= i1; i++) {\n const u = u0 + (i + 0.5) * gs\n const v = v0 + (j + 0.5) * gs\n if (u > r[0] - inflation && u < r[2] + inflation && v > r[1] - inflation && v < r[3] + inflation) blocked[j * nx + i] = 1\n }\n }\n let best = -1\n let bestDist = 1e9\n for (let j = 0; j < nz; j++)\n for (let i = 0; i < nx; i++) {\n const k = j * nx + i\n if (!inside[k] || blocked[k]) continue\n const dist = Math.hypot(u0 + (i + 0.5) * gs - g.center[0], v0 + (j + 0.5) * gs - g.center[1])\n if (dist < bestDist) {\n bestDist = dist\n best = k\n }\n }\n if (best < 0) return false\n if (!g.entries.length) return true\n for (const [i, j] of g.entries) if (blocked[j * nx + i]) return false\n const visited = new Uint8Array(nx * nz)\n const queue = new Int32Array(nx * nz)\n let h = 0\n let t = 0\n const s = g.entries[0][1] * nx + g.entries[0][0]\n visited[s] = 1\n queue[t++] = s\n while (h < t) {\n const k = queue[h++]\n const i = k % nx\n const j = (k - i) / nx\n for (const [di, dj] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {\n const a = i + di\n const b = j + dj\n if (a < 0 || b < 0 || a >= nx || b >= nz) continue\n const q = b * nx + a\n if (visited[q] || !inside[q] || blocked[q]) continue\n visited[q] = 1\n queue[t++] = q\n }\n }\n if (!visited[best]) return false\n for (const [i, j] of g.entries) if (!visited[j * nx + i]) return false\n return true\n}\n","import { EPS } from './constants'\nimport { carCandidates } from './parking'\nimport { clearRect, extent, insideUnion, overlaps, r2, usableParts } from './geometry'\nimport { createGrid, reachable } from './grid'\nimport { blocksWindow, windowZone, windowsOfRoom, zonesOfFloor } from './queries'\nimport { registries } from './registry'\nimport { weightedOrder } from './rng'\nimport type { Rng } from './rng'\nimport type { FurnitureDef, Json, PlacedItem, Plan, Rect, Room, Slot, Vec2, Weights } from './types'\n\nfunction candidatesOf(cats: Weights): { it: FurnitureDef; weight: number }[] {\n const out: { it: FurnitureDef; weight: number }[] = []\n for (const [cat, weight] of Object.entries(cats)) {\n const exact = cat[0] === '='\n const its = Object.values(registries().CATALOG).filter((i) => !i.decor && (exact ? i.type === cat.slice(1) : !i.exactOnly && (i.category === cat || i.type === cat)))\n for (const it of its) out.push({ it, weight: weight / its.length })\n }\n return out\n}\n\nfunction itemRect(slot: Slot, it: FurnitureDef, shift: number): Rect {\n const c = slot._cell\n const f: Vec2 = c.f\n const [extentU, extentV] = extent([it.w, it.d], f)\n const R: Rect = c.R\n // centre without rounding\n let u0 = (c.rect ? (c.rect[0] + c.rect[2]) / 2 : slot.x) - extentU / 2\n let v0 = (c.rect ? (c.rect[1] + c.rect[3]) / 2 : slot.z) - extentV / 2\n if (shift) {\n if (slot.side === 'left' || slot.side === 'right') v0 += shift\n else u0 += shift\n }\n for (const s of c.enclosed) {\n if (s === 'left') u0 = R[0]\n else if (s === 'right') u0 = R[2] - extentU\n else if (s === 'front') v0 = R[1]\n else if (s === 'back') v0 = R[3] - extentV\n }\n return [u0, v0, u0 + extentU, v0 + extentV]\n}\n\n/** Radius of the relaxed pass: a required item that did not fit settles for a narrower walkway. */\nconst RELAXED_RADIUS = 0.12\n\nconst MESH_FRONT: Record<string, Vec2> = { '+z': [0, 1], '-z': [0, -1], '+x': [1, 0], '-x': [-1, 0] }\n\n/** Rotation that makes a mesh whose front is `front` face `f`. */\nexport function rotationFor(f: Vec2, front: string): number {\n const meshFront = MESH_FRONT[front] || [0, 1]\n let ry = Math.atan2(f[0], f[1]) - Math.atan2(meshFront[0], meshFront[1])\n if (ry > Math.PI + EPS) ry -= 2 * Math.PI\n if (ry < -Math.PI - EPS) ry += 2 * Math.PI\n return r2(ry)\n}\n\n/** Fills the slots of one room with catalogue items, honouring clearances, doors, windows and reachability. */\nexport function fillRoom(plan: Plan, room: Room, slots: Slot[], rng: Rng): { items: PlacedItem[]; missing: { room: string; slot: string }[] } {\n const items: PlacedItem[] = []\n const missing: { room: string; slot: string }[] = []\n const state: Record<string, PlacedItem> = {}\n const solids: Rect[] = []\n const reserves: Rect[] = []\n const rims: Rect[] = []\n const inners = usableParts(room, 0)\n const grid = createGrid(plan, room)\n const relaxedGrid = room.outdoor ? grid : createGrid(plan, room, null, RELAXED_RADIUS)\n const zones = zonesOfFloor(plan, room.floor)\n const windowZones = windowsOfRoom(plan, room).map((j) => ({ z: windowZone(j, room.outdoor), j }))\n const inflation = room.outdoor ? 0.15 : plan.playerRadius\n interface Unit {\n group: string | null\n members: Slot[]\n required?: boolean\n }\n const units: Unit[] = []\n const seen: Record<string, Unit> = {}\n for (const s of slots) {\n if (s.group) {\n if (seen[s.group]) {\n seen[s.group].members.push(s)\n continue\n }\n const u: Unit = { group: s.group, members: [s] }\n seen[s.group] = u\n units.push(u)\n } else units.push({ group: null, members: [s] })\n }\n for (const u of units) u.required = u.members.some((m) => m.required)\n const queue = units.filter((u) => u.required).concat(units.filter((u) => !u.required))\n const dependencies = (u: Unit) =>\n u.members\n .flatMap((m) => [m.requires, m.on])\n .filter(Boolean)\n .filter((id) => slots.some((s) => s.id === id && !u.members.includes(s)))\n const done = new Set<string>()\n const ready = (u: Unit) => dependencies(u).every((id) => done.has(id as string))\n const make = (s: Slot, it: FurnitureDef, r: Rect, parent: PlacedItem | null, overheadOff?: boolean) => {\n const f: Vec2 = [s.frontU, s.frontV]\n const id = room.id + '.' + s.id\n const m: Json = {\n id,\n type: it.type,\n category: it.category,\n x: r2((r[0] + r[2]) / 2),\n z: r2((r[1] + r[3]) / 2),\n ry: rotationFor(f, it.front),\n w: it.w,\n d: it.d,\n h: it.h,\n y: parent ? r2((parent.y || 0) + parent.h) : 0,\n frontU: f[0],\n frontV: f[1],\n room: room.id,\n floor: room.floor,\n outdoor: !!room.outdoor,\n slot: s.id,\n on: parent ? s.on : null,\n mode: parent ? (s.anchor === 'inside' ? 'inside' : 'on') : null,\n clearance: s.clearance,\n flat: it.flat,\n low: it.low,\n aabb: r.map(r2),\n _r: r,\n _seedId: registries().SEED_KEYS.items[id] ?? id,\n }\n if (it.overhead) m.overhead = !overheadOff\n if (it.category === 'car') {\n m.driver = [f[1], -f[0]]\n m.carClearance = plan.carClearance\n }\n if (parent && s.anchor === 'inside') m.y = r2(parent.y || 0)\n if (room.link) m.link = { from: room.link[0], to: room.link[1] }\n state[s.id] = m\n items.push(m as PlacedItem)\n return m as PlacedItem\n }\n const tryFit = (s: Slot, relax: boolean, overheadOff?: boolean): PlacedItem | null => {\n const cands = weightedOrder(candidatesOf(s.cats), rng)\n if (s.anchor === 'on' || s.anchor === 'inside') {\n const parent = state[s.on as string]\n if (!parent) return null\n for (const { it } of cands) {\n if (it.w > parent.w + EPS || it.d > parent.d + EPS) continue\n const f: Vec2 = [parent.frontU, parent.frontV]\n const r: Rect = parent.aabb\n const [extentU, extentV] = extent([it.w, it.d], f)\n const cu = (r[0] + r[2]) / 2 - f[0] * (parent.d / 2 - it.d / 2)\n const cv = (r[1] + r[3]) / 2 - f[1] * (parent.d / 2 - it.d / 2)\n return make(s, it, [cu - extentU / 2, cv - extentV / 2, cu + extentU / 2, cv + extentV / 2], parent)\n }\n return null\n }\n for (const { it } of cands) {\n if (it.w > s.w + EPS || it.d > s.d + EPS) continue\n const f: Vec2 = [s.frontU, s.frontV]\n const slide = s.anchor === 'wall' ? (s.slide == null ? 2.0 : s.slide) : 0\n const shifts = [0]\n for (let k = 1; k * 0.1 <= slide + 1e-9; k++) shifts.push(k * 0.1, -k * 0.1)\n let found: { rect: Rect; cl?: Rect | null; rimRect?: Rect | null } | null = null\n const car = it.category === 'car' && !relax\n const tries: { rect: Rect; clear?: Rect }[] = car ? carCandidates(s, it, plan.carClearance) : shifts.map((shift) => ({ rect: itemRect(s, it, shift) }))\n for (const attempt of tries) {\n const r = attempt.rect\n if (!insideUnion(r, inners)) continue\n if (car && (!insideUnion(attempt.clear as Rect, inners) || solids.some((o) => overlaps(attempt.clear as Rect, o)))) continue\n if (it.flat) {\n found = { rect: r }\n break\n }\n if (zones.some((z) => overlaps(r, z))) continue\n if (windowZones.some(({ z, j }) => blocksWindow(it, j, overheadOff) && overlaps(r, z))) continue\n if (solids.some((o) => overlaps(r, o))) continue\n if (!it.deck && rims.some((a) => overlaps(r, a))) continue\n let cl: Rect | null = car ? (attempt.clear as Rect) : null\n if (!car && !relax && s.clearance > 0 && !it.low) {\n cl = clearRect(r, f, s.clearance)\n if (!insideUnion(cl, inners)) continue\n if (items.some((m) => !m.low && !m.flat && !m.on && overlaps(cl as Rect, m._r))) continue\n }\n if (!it.low && reserves.some((q) => overlaps(r, q))) continue\n let rimRect: Rect | null = null\n if (it.rim) {\n rimRect = [r[0] - it.rim, r[1] - it.rim, r[2] + it.rim, r[3] + it.rim]\n if (!insideUnion(rimRect, inners) || solids.some((o) => overlaps(rimRect as Rect, o)) || zones.some((z) => overlaps(rimRect as Rect, z))) continue\n }\n if (!(relax ? reachable(relaxedGrid, solids.concat([r]), RELAXED_RADIUS) : reachable(grid, solids.concat([r]), inflation))) continue\n found = { rect: r, cl, rimRect }\n break\n }\n if (!found) continue\n const { rect: r, cl, rimRect } = found\n if (it.flat) return make(s, it, r, null)\n const m = make(s, it, r, null, overheadOff)\n if (cl) reserves.push(cl)\n if (rimRect) rims.push(rimRect)\n solids.push(r)\n return m\n }\n return null\n }\n const process = (u: Unit) => {\n const pr = u.members[0].chance as number\n const x = rng()\n const arr = u.members.slice()\n const members: Slot[] = []\n while (arr.length) members.push(arr.splice(arr.length > 1 ? Math.floor(rng() * arr.length) : 0, 1)[0])\n const applicable = members.filter((m) => m.valid && (!m.requires || state[m.requires]) && (!m.on || state[m.on]))\n if (!u.required && x >= pr) return\n let ok = false\n for (const m of applicable) {\n if (tryFit(m, false)) {\n ok = true\n break\n }\n }\n if (!ok)\n for (const m of applicable) {\n if (tryFit(m, false, true)) {\n ok = true\n break\n }\n }\n if (!ok && u.required)\n for (const m of applicable) {\n if (tryFit(m, true, true)) {\n ok = true\n break\n }\n }\n if (!ok && u.required && (applicable.length || !u.members.some((m) => m.requires))) missing.push({ room: room.id, slot: u.group || u.members[0].id })\n }\n const pending = queue.slice()\n while (pending.length) {\n let i = pending.findIndex(ready)\n if (i < 0) i = 0\n const u = pending.splice(i, 1)[0]\n process(u)\n for (const m of u.members) done.add(m.id)\n }\n return { items, missing }\n}\n","/**\n * Names of the seeded random streams.\n *\n * These strings come from the Portuguese-language SDK this engine replaces. They are kept\n * verbatim on purpose: a stream is `hash(seed + '|' + name)`, so renaming one would change every\n * plan generated from an existing seed. They never appear in the output.\n */\nexport const STREAM = {\n facade: 'fachada',\n lot: 'lote',\n decor: 'decor',\n roomPrefix: 'c:',\n palettePrefix: 'paleta:',\n} as const\n","import { MARGIN, EPS } from './constants'\nimport {\n areaOf,\n clamp,\n clearRect,\n cutIntervals,\n extent,\n inflate,\n inner,\n insideUnion,\n overlaps,\n r2,\n topOf,\n usableParts,\n} from './geometry'\nimport { rotationFor } from './fill'\nimport { createGrid, reachable } from './grid'\nimport { STREAM } from './legacy-seeds'\nimport { blocksWindow, roomAt, windowZone, windowsOfRoom, zonesOfFloor } from './queries'\nimport { registries } from './registry'\nimport { createRng, pickWeighted, shuffle } from './rng'\nimport type { Rng } from './rng'\nimport type { Json, PlacedItem, Plan, PlacementContext, PlacementKit, Rect, Room, Vec2 } from './types'\n\n/** Geometry and grid helpers shared with decor passes and state plugins. */\nexport const placementKit: PlacementKit = {\n MARGIN,\n EPS,\n r2,\n clamp,\n overlaps,\n inner,\n inflate,\n areaOf,\n topOf,\n extent,\n insideUnion,\n usableParts,\n zonesOfFloor,\n windowsOfRoom,\n windowZone,\n roomAt,\n reachable: reachable as PlacementKit['reachable'],\n createGrid: createGrid as PlacementKit['createGrid'],\n clearRect,\n pickWeighted,\n createRng,\n roomSeedKey: (room: Room) => room.seedKey ?? registries().SEED_KEYS.rooms[room.id] ?? room.id,\n shuffle,\n facingRotation: (f: Vec2, type: string) => rotationFor(f, registries().CATALOG[type].front),\n cutIntervals,\n blocksWindow,\n}\n\n/** Builds the shared placement context over the items already placed by the slot fill. */\nexport function createPlacementContext(plan: Plan, items: PlacedItem[]): PlacementContext {\n const added: PlacedItem[] = []\n const counters: Record<string, number> = {}\n const make = (room: Room, type: string, r: Rect, f: Vec2, o?: Json): PlacedItem => {\n const it = registries().CATALOG[type]\n const n = (counters[room.id + type] = (counters[room.id + type] || 0) + 1)\n return Object.assign(\n {\n id: room.id + '.dec_' + type + n,\n type,\n category: it.category,\n x: r2((r[0] + r[2]) / 2),\n z: r2((r[1] + r[3]) / 2),\n ry: r2(Math.atan2(f[0], f[1])),\n w: it.w,\n d: it.d,\n h: it.h,\n y: 0,\n frontU: f[0],\n frontV: f[1],\n room: room.id,\n floor: room.floor,\n outdoor: !!room.outdoor,\n slot: 'dec_' + type + n,\n on: null,\n mode: null,\n clearance: 0,\n flat: !!it.flat,\n low: it.low,\n aabb: r.map(r2),\n _r: r,\n decor: true,\n mount: it.mount,\n },\n o || {},\n ) as PlacedItem\n }\n const add = (m: PlacedItem) => {\n added.push(m)\n items.push(m)\n return m\n }\n const itemsOfRoom = (c: Room) => items.filter((m) => m.room === c.id && m.floor === c.floor)\n const extraSolids: Record<string, Rect[]> = {}\n const solidsOfRoom = (c: Room): Rect[] =>\n itemsOfRoom(c)\n .filter((m) => !m.flat && !m.on && (!m.decor || m.mount === 'floor'))\n .map((m) => m._r as Rect)\n .concat(extraSolids[c.id] || [])\n const gridCache: Record<string, ReturnType<typeof createGrid>> = {}\n let ignored: Set<string> | null = null\n const gridOf = (c: Room) => gridCache[c.id] || (gridCache[c.id] = createGrid(plan, c, ignored))\n\n /** Places a floor item at a corner or along a wall; respects doors, windows, clearances and walkability. */\n function placeOnFloor(room: Room, type: string, rng2: Rng, optsIn?: Json): Rect | null {\n const opts = Object.assign({}, optsIn || {})\n const it0 = registries().CATALOG[type]\n if (it0.flat) opts.flat = true\n const it = registries().CATALOG[type]\n const inners = usableParts(room, 0)\n const solidList = solidsOfRoom(room)\n const zones = zonesOfFloor(plan, room.floor)\n const occupied = itemsOfRoom(room)\n const windowZones = windowsOfRoom(plan, room).map((j) => ({ z: windowZone(j, room.outdoor), j }))\n // the 1 m landing in front of a staircase stays free\n const landings: Rect[] = it0.flat\n ? []\n : items\n .filter((m) => m.type === 'stairs' && m.floor === room.floor && m.aabb)\n .map((m) => {\n const r = m.aabb\n return (m.frontV === 1 ? [r[0], r[3], r[2], r[3] + 1] : m.frontV === -1 ? [r[0], r[1] - 1, r[2], r[1]] : m.frontU === 1 ? [r[2], r[1], r[2] + 1, r[3]] : [r[0] - 1, r[1], r[0], r[3]]) as Rect\n })\n const cand: Rect[] = opts.cands ? opts.cands.slice() : []\n if (!opts.cands)\n for (const p of inners) {\n const extentU = opts.dim ? opts.dim[0] : it.w\n const extentV = opts.dim ? opts.dim[1] : it.d\n for (const [x, z] of [[p[0], p[1]], [p[2] - extentU, p[1]], [p[0], p[3] - extentV], [p[2] - extentU, p[3] - extentV]]) cand.push([x, z, x + extentU, z + extentV])\n for (let k = 0; k < 6; k++) {\n const t = rng2()\n const side = Math.floor(rng2() * 4)\n const x = side < 2 ? p[0] + t * Math.max(0, p[2] - p[0] - extentU) : side === 2 ? p[0] : p[2] - extentU\n const z = side >= 2 ? p[1] + t * Math.max(0, p[3] - p[1] - extentV) : side === 0 ? p[1] : p[3] - extentV\n cand.push([x, z, x + extentU, z + extentV])\n }\n }\n for (const r of opts.ordered ? cand : shuffle(cand, rng2)) {\n if (!insideUnion(r, inners)) continue\n if (zones.some((z) => overlaps(r, z)) || landings.some((z) => overlaps(r, z))) continue\n if (windowZones.some(({ z, j }) => blocksWindow(it, j) && overlaps(r, z))) continue\n if (solidList.some((o) => overlaps(r, o))) continue\n if (opts.flat) {\n if (!(opts.without && opts.without(r))) return r\n continue\n }\n if (occupied.some((m) => !m.low && !m.flat && !m.on && !m.decor && m.clearance > 0 && overlaps(r, clearRect(m._r as Rect, [m.frontU, m.frontV], m.clearance)))) continue\n if (opts.without && opts.without(r)) continue\n if (!reachable(opts.railing || gridOf(room), solidList.concat([r]), room.outdoor ? 0.16 : plan.playerRadius)) continue\n return r\n }\n return null\n }\n const roomById = (id: string) => plan.rooms.find((c) => c.id === id) || plan.zones.find((c) => c.id === id)\n return {\n make,\n add,\n placeOnFloor,\n itemsOfRoom,\n solidsOfRoom,\n gridOf,\n extraSolids,\n roomById,\n setIgnored: (s) => {\n ignored = s\n for (const k of Object.keys(gridCache)) delete gridCache[k]\n },\n added,\n }\n}\n\n/** Ground cover per lot zone: one piece per zone part, plus overlays registered by content packs (decks around pools...). */\nfunction groundCover(plan: Plan, items: PlacedItem[], ctx: PlacementContext) {\n if (!plan.lot) return\n const polygonOf = (r: Rect) => [[r[0], r[1]], [r[2], r[1]], [r[2], r[3]], [r[0], r[3]]].map((p) => [r2(p[0]), r2(p[1])])\n const groundPiece = (z: Room, type: string, r: Rect, layer: number, i: number) => {\n const m = ctx.make(z, type, r, [0, 1], {\n id: z.id + '.ground' + (layer ? '_overlay' : '') + i,\n slot: 'ground' + (layer ? '_overlay' : '') + i,\n w: r2(r[2] - r[0]),\n d: r2(r[3] - r[1]),\n h: 0,\n polygon: polygonOf(r),\n layer,\n zone: z.id,\n outdoor: true,\n floor: -1,\n })\n return ctx.add(m)\n }\n for (const z of plan.zones) {\n z.parts.forEach((p, i) => groundPiece(z, z.ground as string, p, 0, i))\n let k = 0\n const clip = (r: Rect): Rect | undefined =>\n z.parts\n .map((p) => [Math.max(r[0], p[0]), Math.max(r[1], p[1]), Math.min(r[2], p[2]), Math.min(r[3], p[3])] as Rect)\n .filter((q) => q[2] - q[0] > 0.3 && q[3] - q[1] > 0.3)\n .sort((a, b) => areaOf(b) - areaOf(a))[0]\n for (const rule of registries().GROUND_OVERLAYS) {\n const triggers = items.filter((m) => m.room === z.id && m.category === rule.category)\n if (rule.merge) {\n if (triggers.length && z.ground !== rule.unlessGround) {\n const u = triggers.reduce((a, m) => [Math.min(a[0], (m._r as Rect)[0]), Math.min(a[1], (m._r as Rect)[1]), Math.max(a[2], (m._r as Rect)[2]), Math.max(a[3], (m._r as Rect)[3])], [1e9, 1e9, -1e9, -1e9])\n const q = clip(inflate(u as Rect, rule.inflate))\n if (q) groundPiece(z, rule.ground, q, 1, k++)\n }\n } else {\n for (const m of triggers) {\n const q = clip(inflate(m._r as Rect, rule.inflate))\n if (q) groundPiece(z, rule.ground, q, 1, k++)\n }\n }\n }\n }\n}\n\n/** Runs the registered decor passes and the ground cover; returns the context for the state step. */\nexport function runPostProcess(plan: Plan, items: PlacedItem[], seed: number | string): PlacementContext {\n const ctx = createPlacementContext(plan, items)\n const rng = createRng(seed, STREAM.decor)\n for (const pass of registries().PASSES) pass.run({ plan, items, seed, rng, ctx, kit: placementKit, catalog: registries().CATALOG, profiles: registries().DECOR_PROFILES })\n groundCover(plan, items, ctx)\n return ctx\n}\n","import { registries } from './registry'\nimport type { FloorplanLocale } from './types'\n\ntype Namespace = keyof FloorplanLocale\n\n/** Registers (or extends) the strings of a language. Packs call this with their JSON files. */\nexport function registerLocale(code: string, table: FloorplanLocale): void {\n const { LOCALES: locales } = registries()\n const cur = (locales[code] = locales[code] || {})\n for (const ns of Object.keys(table) as Namespace[]) cur[ns] = Object.assign(cur[ns] || {}, table[ns])\n}\n\nexport const listLocales = (): string[] => Object.keys(registries().LOCALES)\n\n/** Looks a key up in a namespace. Falls back to English, then to the key itself. `{n}`-style variables are replaced. */\nexport function translate(ns: Namespace, key: string, locale = 'en', vars?: Record<string, string | number>): string {\n const { LOCALES: locales } = registries()\n const raw = locales[locale]?.[ns]?.[key] ?? locales.en?.[ns]?.[key] ?? key\n return vars ? raw.replace(/\\{(\\w+)\\}/g, (m, k) => (k in vars ? String(vars[k]) : m)) : raw\n}\n","import { r2 } from './geometry'\nimport type { Json, Plan, Rect, Room } from './types'\n\nexport interface ExteriorPathContext {\n gates: Json[]\n paths: Json[]\n zones: Room[]\n setback: number\n marginLeft: number\n marginRight: number\n backyard: number\n w: number\n /** Door the entrance path is named after (the template's `doorTarget`). */\n target?: { a: string; side: string }\n}\n\nconst CLOSE = 1e-6\nconst rounded = (r: Rect): Rect => r.map(r2) as Rect\nconst touches = (a: Rect, r: Rect): boolean => a[0] <= r[2] + CLOSE && a[2] >= r[0] - CLOSE && a[1] <= r[3] + CLOSE && a[3] >= r[1] - CLOSE\n\ninterface SideRoute {\n lane: { x: number; width: number; side: string }\n laneWidth: number\n half: number\n vertical: Rect\n horizontal: Rect | null\n frontStub: Rect | null\n cost: number\n rearStrip: number\n rearY: number\n frontY: number\n overlapsParking: boolean\n}\n\n/**\n * Every exterior door of the ground floor gets a paved pedestrian path to the pedestrian gate or to the nearest existing path.\n * Doors on the front go straight out; doors on the back or the sides run along the side yard, to the parking or to the front path.\n */\nexport function addExteriorDoorPaths(plan: Plan, c: ExteriorPathContext): void {\n const { gates, paths, zones, setback, marginLeft, marginRight, backyard, w } = c\n const social = gates.find((g) => g.type === 'pedestrian')\n const socialPath = social ? paths.find((p) => p.from === social.id && p.type === 'pedestrian') : null\n const parkingZone = zones.find((z) => z.id === 'parking')\n const parking: Rect | null = parkingZone ? parkingZone.parts[0] : null\n const midY = setback > 0 ? -setback / 2 : 0\n const joinToSocial = (x: number, width: number, rects: Rect[], points: number[][]) => {\n if (!socialPath) return\n const h = width / 2\n const horizontal = socialPath.rects.find((r: Rect) => midY >= r[1] - CLOSE && midY <= r[3] + CLOSE && r[2] - r[0] > r[3] - r[1]) || socialPath.rects[0]\n const targetX = x < horizontal[0] ? horizontal[0] + h : x > horizontal[2] ? horizontal[2] - h : x\n if (Math.abs(targetX - x) > CLOSE) {\n rects.push([Math.min(x, targetX) - h, midY - h, Math.max(x, targetX) + h, midY + h])\n points.push([targetX, midY])\n }\n }\n for (const door of plan.doors.filter((q) => q.floor === 0 && q.exterior)) {\n if (paths.some((p) => p.to === door.id)) continue\n const half = Math.max(1.0, Math.min(door.width, 2.0)) / 2\n const rects: Rect[] = []\n const points: number[][] = []\n const isTarget = c.target && door.a === c.target.a && door.side === c.target.side\n let fromId: string | null = social ? social.id : null\n let width = 1.0\n const id = isTarget ? 'entrance_path' : 'path_' + door.id\n if (door.side === 'front') {\n if (setback > 0) {\n const stub = Math.min(1.0, setback)\n rects.push([door.u - half, -stub, door.u + half, 0])\n points.push([door.u, 0], [door.u, -stub])\n if (-stub > midY) {\n rects.push([door.u - width / 2, midY - width / 2, door.u + width / 2, -stub])\n points.push([door.u, midY])\n }\n joinToSocial(door.u, width, rects, points)\n } else {\n rects.push([door.u - half, -1.2, door.u + half, 0])\n points.push([door.u, 0], [door.u, -1.2])\n }\n } else {\n const lanes: SideRoute['lane'][] = []\n if (marginLeft > 0.5) lanes.push({ x: -marginLeft / 2, width: marginLeft, side: 'left' })\n if (marginRight > 0.5) lanes.push({ x: w + marginRight / 2, width: marginRight, side: 'right' })\n const targets: Rect[] = paths.flatMap((p) => p.rects as Rect[]).concat(parking ? [parking] : [])\n let best: SideRoute | null = null\n for (const lane of lanes) {\n if ((door.side === 'left' && lane.side !== 'left') || (door.side === 'right' && lane.side !== 'right')) continue\n const laneWidth = Math.min(0.9, lane.width - 0.1)\n const h = laneWidth / 2\n const rearStrip = Math.min(0.8, backyard)\n const rearY = door.v + rearStrip + laneWidth / 2\n const overlapsParking = !!parking && lane.x + h > parking[0] && lane.x - h < parking[2]\n const frontY = overlapsParking || setback <= 0 ? 0 : -0.6\n let frontStub: Rect | null = null\n if (!overlapsParking && setback > 0) {\n const dir = social && social.u < lane.x ? -1 : 1\n const band = [-0.6 - h, -0.6 + h]\n let nearestX = social ? social.u : lane.x\n let nearestGap = Infinity\n for (const r of targets) {\n if (!(r[1] <= band[1] && r[3] >= band[0])) continue\n const edge = dir < 0 ? r[2] : r[0]\n const gap = Math.abs(edge - lane.x)\n if ((dir < 0 ? edge <= lane.x : edge >= lane.x) && gap < nearestGap) {\n nearestGap = gap\n nearestX = edge\n }\n }\n frontStub = [Math.min(lane.x, nearestX) - (dir < 0 ? 0 : h), -0.6 - h, Math.max(lane.x, nearestX) + (dir < 0 ? h : 0), -0.6 + h]\n }\n const vertical: Rect = [lane.x - h, frontY - (frontY < 0 ? h : 0), lane.x + h, (door.side === 'back' ? rearY : door.v) + laneWidth / 2]\n const horizontal: Rect | null = door.side === 'back' ? [Math.min(door.u, lane.x) - half, rearY - laneWidth / 2, Math.max(door.u, lane.x) + h, rearY + laneWidth / 2] : null\n const cost = (horizontal ? horizontal[2] - horizontal[0] : 0) + (frontStub ? frontStub[2] - frontStub[0] : 0)\n if (!best || cost < best.cost) best = { lane, laneWidth, half: h, vertical, horizontal, frontStub, cost, rearStrip, rearY, frontY, overlapsParking }\n }\n if (best) {\n const { lane, laneWidth, half: h, vertical, horizontal, frontStub, rearStrip, rearY, frontY, overlapsParking } = best\n width = laneWidth\n if (overlapsParking) fromId = (gates.find((g) => g.type === 'garage') || social || ({} as Json)).id || null\n if (door.side === 'back') {\n rects.push([door.u - half, door.v, door.u + half, door.v + rearStrip + laneWidth], horizontal as Rect, vertical)\n points.push([door.u, door.v], [door.u, rearY], [lane.x, rearY], [lane.x, frontY])\n } else {\n const x0 = door.side === 'left' ? lane.x - h : w\n const x1 = door.side === 'left' ? 0 : lane.x + h\n rects.push([Math.min(x0, x1), door.v - half, Math.max(x0, x1), door.v + half], vertical)\n points.push([door.u, door.v], [lane.x, door.v], [lane.x, frontY])\n }\n if (frontStub) {\n rects.push(frontStub)\n points.push([frontStub[0] < lane.x ? frontStub[0] : frontStub[2], -0.6])\n }\n } else {\n const stub = 1.0\n if (door.side === 'back') rects.push([door.u - half, door.v, door.u + half, door.v + Math.min(stub, backyard)])\n else rects.push(door.side === 'left' ? [-Math.min(stub, marginLeft), door.v - half, 0, door.v + half] : [w, door.v - half, w + Math.min(stub, marginRight), door.v + half])\n points.push([door.u, door.v])\n }\n }\n const reached = rects.slice()\n const pool: Rect[] = paths.flatMap((p) => p.rects as Rect[]).concat(parking ? [parking] : [])\n let grows = true\n while (grows) {\n grows = false\n for (const r of pool) {\n if (!reached.includes(r) && reached.some((a) => touches(a, r))) {\n reached.push(r)\n grows = true\n }\n }\n }\n const inside = (g: Json) => reached.some((r) => g.u >= r[0] - CLOSE && g.u <= r[2] + CLOSE && g.v >= r[1] - CLOSE && g.v <= r[3] + CLOSE)\n const gate = gates.find((q) => q.type === 'pedestrian' && inside(q)) || gates.find((q) => q.type !== 'cargo' && inside(q))\n if (gate) fromId = gate.id\n paths.push({ id, type: 'pedestrian', from: fromId, to: door.id, width, rects: rects.map(rounded), points: points.map((q) => q.map(r2)) })\n }\n}\n\n","import { registries } from './registry'\nimport { r2 } from './geometry'\nimport type { FloorplanOptions, Json, Plan, TemplateDef, ZoneAdjustment, ZoneDef, ZoneViolation } from './types'\n\n/** Registers an urban zone (zoning rules). Returns the stored definition. */\nexport function defineZone(zone: ZoneDef): ZoneDef {\n if (!zone || !zone.id) throw new Error('defineZone: id is required')\n registries().ZONES[zone.id] = zone\n return zone\n}\nexport const getZone = (id: string): ZoneDef | undefined => registries().ZONES[id]\nexport const listZones = (): ZoneDef[] => Object.values(registries().ZONES)\n\n/** Marks ground types (e.g. `lawn`, `dirt`) that count towards the permeable area of a lot. */\nexport function registerPermeableGround(...types: string[]): void {\n for (const t of types) registries().PERMEABLE_GROUNDS.add(t)\n}\n\nexport function resolveZone(z: string | ZoneDef | undefined): ZoneDef | null {\n if (!z) return null\n if (typeof z === 'string') {\n const found = registries().ZONES[z]\n if (!found) throw new Error('Unknown zone: ' + z)\n return found\n }\n return z\n}\n\nexport const floorsOfTemplate = (tpl: TemplateDef, op: FloorplanOptions): number => (tpl.floorsFn ? tpl.floorsFn(op) : tpl.floors || []).length\n\n/** Declared use of a template; templates without one are treated as `residential_single`. */\nexport const useOf = (tpl: TemplateDef): string => tpl.use || 'residential_single'\n\n/** Totals used by the checks: storeys, height, areas. Works on a generated result or an internal plan. */\nfunction measure(plan: Json) {\n const floors: { index: number; y0: number; ceiling: number }[] = plan.floors\n const top = floors.reduce((m, f) => Math.max(m, f.y0 + f.ceiling), 0)\n const number = plan.floorNumber != null ? plan.floorNumber : floors.length\n const rooms: { floor: number; parts: number[][] }[] = (plan.rooms || []).filter((r: Json) => r.floor >= 0)\n const area = (r: Json) => r.parts.reduce((s: number, p: number[]) => s + (p[2] - p[0]) * (p[3] - p[1]), 0)\n const footprint = plan.w * plan.d\n const built = rooms.reduce((s, r) => s + area(r), 0)\n return { storeys: number, height: r2(top), footprint, built }\n}\n\n/**\n * Checks a generated lot against a zone and returns the violations (empty when compliant).\n * `lot` is `result.lot` (may be null for apartments), `plan` is the result of `generate`.\n */\nexport function checkLot(zoneIn: string | ZoneDef, lot: Json, plan: Json): ZoneViolation[] {\n const zone = resolveZone(zoneIn) as ZoneDef\n const out: ZoneViolation[] = []\n const m = measure(plan)\n const use = plan.use || 'residential_single'\n if (!zone.allowedUses.includes(use)) out.push({ rule: 'use', actual: use, limit: zone.allowedUses.join(',') })\n if (m.storeys > zone.maxFloors) out.push({ rule: 'floors', actual: m.storeys, limit: zone.maxFloors })\n if (m.height > zone.maxHeight + 1e-9) out.push({ rule: 'height', actual: m.height, limit: zone.maxHeight })\n if (!lot) return out\n const [u0, v0, u1, v1] = lot.rect as number[]\n const width = r2(u1 - u0)\n const depth = r2(v1 - v0)\n const area = width * depth\n const party: string[] = plan.partyWalls || []\n const sides = [party.includes('left') ? Infinity : lot.sideYard.left, party.includes('right') ? Infinity : lot.sideYard.right]\n const left = sides[0]\n const right = sides[1]\n if (lot.setback < zone.setbacks.front - 1e-9) out.push({ rule: 'setback_front', actual: lot.setback, limit: zone.setbacks.front })\n if (Math.min(left, right) < zone.setbacks.side - 1e-9) out.push({ rule: 'setback_side', actual: Math.min(left, right), limit: zone.setbacks.side })\n if (lot.backyard < zone.setbacks.back - 1e-9) out.push({ rule: 'setback_back', actual: lot.backyard, limit: zone.setbacks.back })\n if (area < zone.minLot - 1e-9) out.push({ rule: 'min_lot', actual: r2(area), limit: zone.minLot })\n if (width < zone.minFrontage - 1e-9) out.push({ rule: 'min_frontage', actual: width, limit: zone.minFrontage })\n const ground = m.footprint\n const coverage = ground / area\n if (coverage > zone.maxCoverage + 1e-9) out.push({ rule: 'coverage', actual: r2(coverage), limit: zone.maxCoverage })\n const far = m.built / area\n if (far > zone.maxFar + 1e-9) out.push({ rule: 'far', actual: r2(far), limit: zone.maxFar })\n let permeable = 0\n for (const z of lot.zones as Json[]) if (registries().PERMEABLE_GROUNDS.has(z.ground)) for (const p of z.parts as number[][]) permeable += (p[2] - p[0]) * (p[3] - p[1])\n const permeability = permeable / area\n if (permeability < zone.permeableMin - 1e-9) out.push({ rule: 'permeable', actual: r2(permeability), limit: zone.permeableMin })\n return out\n}\n\n/** Clamps adjustable options (`floors`) to the zone before the plan is built. */\nexport function clampOptionsToZone(tpl: TemplateDef, op: FloorplanOptions, zone: ZoneDef, adjustments: ZoneAdjustment[]): FloorplanOptions {\n if (tpl.singleFloor) {\n // an apartment unit: the storey it sits on must exist in a building the zone allows\n const ceiling = (tpl.floors || tpl.floorsFn?.(op) || [])[0]?.ceiling ?? 2.8\n const current = op.floor || 3\n const limit = Math.max(1, Math.min(zone.maxFloors, Math.floor(zone.maxHeight / ceiling + 1e-9)))\n if (current <= limit) return op\n adjustments.push({ field: 'floor', from: current, to: limit, reason: current > zone.maxFloors ? 'max_floors' : 'max_height' })\n return Object.assign({}, op, { floor: limit })\n }\n if (!tpl.floorRange || !tpl.floorsFn) return op\n const current = floorsOfTemplate(tpl, op)\n const floors = tpl.floorsFn(op)\n const ceiling = floors.reduce((m, f) => Math.max(m, f.ceiling), 0) || 2.8\n const byHeight = Math.max(1, Math.floor(zone.maxHeight / ceiling + 1e-9))\n const limit = Math.max(tpl.floorRange[0], Math.min(zone.maxFloors, byHeight, tpl.floorRange[1]))\n if (current <= limit) return op\n adjustments.push({ field: 'floors', from: current, to: limit, reason: current > zone.maxFloors ? 'max_floors' : 'max_height' })\n return Object.assign({}, op, { floors: limit })\n}\n\n/** Raises lot setbacks to the zone minimums. */\nexport function clampLotToZone(cfg: Json, zone: ZoneDef, adjustments: ZoneAdjustment[], partyWalls: string[] = []): void {\n const raise = (field: string, key: string, min: number, reason: string) => {\n if (cfg[key] < min) {\n adjustments.push({ field, from: cfg[key], to: min, reason })\n cfg[key] = min\n }\n }\n raise('frontSetback', 'frontSetback', zone.setbacks.front, 'setback_front')\n if (!partyWalls.includes('left')) raise('marginLeft', 'marginLeft', zone.setbacks.side, 'setback_side')\n if (!partyWalls.includes('right')) raise('marginRight', 'marginRight', zone.setbacks.side, 'setback_side')\n raise('backyardDepth', 'backyardDepth', zone.setbacks.back, 'setback_back')\n}\n\nexport type { Plan }\n\n/** Lot zone types whose ground can be switched to a permeable one to meet the permeability rate. */\nconst ADJUSTABLE_ZONES = new Set(['garden', 'backyard', 'side_yard'])\n\n/**\n * Raises the permeable area of a lot to the zone's `permeableMin` by turning paved garden, yard\n * and side zones (largest first) into the first registered permeable ground. Reports each change.\n */\nexport function enforcePermeability(lot: Json, zones: Json[], zone: ZoneDef, adjustments: ZoneAdjustment[]): void {\n const target = [...registries().PERMEABLE_GROUNDS][0]\n if (!target) return\n const [u0, v0, u1, v1] = lot.rect as number[]\n const area = (u1 - u0) * (v1 - v0)\n const areaOfZone = (z: Json) => (z.parts as number[][]).reduce((s, p) => s + (p[2] - p[0]) * (p[3] - p[1]), 0)\n let permeable = zones.filter((z) => registries().PERMEABLE_GROUNDS.has(z.ground)).reduce((s, z) => s + areaOfZone(z), 0)\n if (permeable / area >= zone.permeableMin) return\n const candidates = zones.filter((z) => ADJUSTABLE_ZONES.has(z.type) && !registries().PERMEABLE_GROUNDS.has(z.ground)).sort((a, b) => areaOfZone(b) - areaOfZone(a))\n for (const z of candidates) {\n if (permeable / area >= zone.permeableMin) break\n adjustments.push({ field: 'ground:' + z.id, from: z.ground, to: target, reason: 'permeable_min' })\n z.ground = target\n permeable += areaOfZone(z)\n }\n}\n","import { CAR_CLEARANCE, DOOR_EDGE_CLEARANCE, MARGIN, PLAYER_RADIUS, TOL, WALL_THICKNESS, WINDOWLESS_ROOM_TYPES, WINDOW_EDGE_CLEARANCE } from './constants'\nimport { buildWalls, clamp, eq, exteriorEdge, inRect, normalizeRoom, openingDepth, openingZones, r2, sharedEdge } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { createRng, pickWeighted } from './rng'\nimport { registries, resolveStyleId, styleOf } from './registry'\nimport { addExteriorDoorPaths } from './paths'\nimport { clampLotToZone, enforcePermeability } from './zoning'\nimport type { FloorDef, FloorplanOptions, Json, LotConfig, Plan, Rect, Room, StyleDef, TemplateDef, WindowDef, ZoneAdjustment, ZoneDef } from './types'\n\nexport const floorsOf = (tpl: TemplateDef, op?: FloorplanOptions): FloorDef[] => (tpl.floorsFn ? tpl.floorsFn(op || {}) : (tpl.floors as FloorDef[]))\n\nexport function clampSize(tpl: TemplateDef, w: number | undefined, d: number | undefined, op?: FloorplanOptions) {\n const L = tpl.limitsFn ? tpl.limitsFn(op || {}) : tpl.limits\n const P0 = tpl.defaultsFn ? tpl.defaultsFn(op || {}) : tpl.defaults\n const ww = w == null ? P0.w : clamp(w, L.w[0], L.w[1])\n const dd = d == null ? P0.d : clamp(d, L.d[0], L.d[1])\n return { w: r2(ww), d: r2(dd) }\n}\n\nexport interface BuildContext {\n zone?: ZoneDef | null\n adjustments?: ZoneAdjustment[]\n}\n\nexport function buildPlan(tpl: TemplateDef, wIn: number | undefined, dIn: number | undefined, opIn?: FloorplanOptions, bc: BuildContext = {}): Plan {\n const op = opIn || {}\n const { w, d } = clampSize(tpl, wIn, dIn, op)\n const styleId = resolveStyleId(op.style || (typeof tpl.style === 'function' ? tpl.style(op) : tpl.style) || 'budget')\n const FLOOR_DEFS = floorsOf(tpl, op)\n const style = styleOf(styleId)\n const plan: Plan = {\n w, d, tpl, floorDefs: FLOOR_DEFS, style: styleId, floors: [], rooms: [], zones: [], doors: [], windows: [], walls: [], gates: [], paths: [], lot: null, openPairs: {}, reservations: [], options: op,\n playerRadius: op.playerRadius ?? PLAYER_RADIUS,\n carClearance: Object.assign({}, CAR_CLEARANCE, op.carClearance),\n }\n FLOOR_DEFS.forEach((A, floorIndex) => {\n const floorNumber = tpl.singleFloor ? op.floor || 3 : floorIndex + 1\n plan.floors.push({\n index: floorIndex,\n name: tpl.singleFloor ? 'floor_n' : A.label,\n number: tpl.singleFloor ? floorNumber : undefined,\n y0: tpl.singleFloor ? (floorNumber - 1) * A.ceiling : tpl.cumulativeCeilings ? FLOOR_DEFS.slice(0, floorIndex).reduce((t, q) => t + q.ceiling, 0) : floorIndex * A.ceiling,\n ceiling: A.ceiling,\n })\n plan.openPairs[floorIndex] = A.openPairs || []\n const list = A.rooms(w, d, op).map((c) => normalizeRoom(c, floorIndex))\n for (const c of list) {\n if (plan.rooms.some((x) => x.id === c.id)) throw new Error('Duplicate room: ' + c.id)\n plan.rooms.push(c)\n }\n const byId: Record<string, Room> = {}\n for (const c of list) byId[c.id] = c\n const floorDoors: Json[] = []\n ;(A.doors(w, d, op) || []).forEach((sp, i) => {\n const a = byId[sp.a]\n if (!a) throw new Error('Door references a missing room: ' + sp.a)\n let edge\n if (sp.edge) edge = sp.edge\n else if (sp.b === 'outside') edge = exteriorEdge(a, sp.side as string, w, d, sp.at)\n else {\n const b = byId[sp.b]\n if (!b) throw new Error('Door references a missing room: ' + sp.b)\n edge = sharedEdge(a, b, sp.at)\n }\n if (!edge) throw new Error('Door without a wall: ' + sp.a + ' / ' + sp.b)\n const width = sp.width\n const margin = width / 2 + (sp.clearance ?? tpl.clearance?.door ?? DOOR_EDGE_CLEARANCE)\n if (edge.a1 - edge.a0 < width + 0.24) throw new Error('Wall too short for the door: ' + sp.a + ' / ' + sp.b)\n const c = clamp(sp.at != null ? sp.at : (edge.a0 + edge.a1) / 2, edge.a0 + margin, edge.a1 - margin)\n const exterior = sp.b === 'outside'\n const leaf = exterior && sp.steel ? 0 : width > 1.1 ? width / 2 : width\n const u = edge.axis === 'u' ? c : edge.pos\n const v = edge.axis === 'u' ? edge.pos : c\n floorDoors.push({\n id: 'd' + floorIndex + '_' + i,\n floor: floorIndex,\n u: r2(u),\n v: r2(v),\n axis: edge.axis,\n pos: edge.pos,\n at: r2(c),\n width,\n a: sp.a,\n b: sp.b,\n opensTo: sp.opensTo || sp.a,\n exterior,\n side: sp.side || null,\n leaves: exterior && sp.steel ? 0 : width > 1.1 ? 2 : 1,\n model: sp.model || (sp.steel ? 'steel' : width > 1.1 ? 'double' : 'single'),\n type: sp.type || 'door',\n steps: sp.steps || 0,\n hinge: 'start',\n zones: openingZones(u, v, edge.axis, width, openingDepth(width, leaf)),\n })\n })\n plan.doors.push(...floorDoors)\n const floorWalls = (tpl.noWalls ? [] : buildWalls(list, floorDoors, A.openPairs || [], floorIndex)).map((p) => Object.assign(p, { h: p.h || A.ceiling }))\n const windowsOut = placeWindows({ list, byId, floorWalls, windowDefs: A.windows(w, d, op) || [], floorIndex, ceiling: A.ceiling, w, d, clearance: tpl.clearance?.window ?? WINDOW_EDGE_CLEARANCE })\n plan.windows.push(...windowsOut)\n plan.walls.push(...floorWalls)\n })\n if (tpl.config) plan.config = tpl.config(op, w, d)\n if (tpl.reservations) tpl.reservations(plan)\n buildLot(plan, tpl, w, d, op, style, styleId, bc)\n return plan\n}\n\ninterface WindowGroup {\n wall: Json\n edge: { axis: 'u' | 'v'; pos: number }\n start: number\n end: number\n def: Json\n entries: { def: Json; centre: number; order: number }[]\n}\ninterface WindowParams {\n list: Room[]\n byId: Record<string, Room>\n floorWalls: Json[]\n windowDefs: WindowDef[]\n floorIndex: number\n ceiling: number\n w: number\n d: number\n clearance: number\n}\n\n/**\n * Each window lands on a stretch of exterior wall (between corners, junctions and doors) and is spread over it: a single window is centred,\n * several get equal gaps, and none comes closer than `clearance` to a corner, a junction or a door. A room that needs light but got no window gets one.\n */\nfunction placeWindows(params: WindowParams): Json[] {\n const { list, byId, floorWalls, windowDefs, floorIndex, ceiling, w, d, clearance } = params\n const stretches = floorWalls.filter((p) => p.exterior && p.type === 'wall')\n const found: Json[] = []\n const groups: WindowGroup[] = []\n let order = 0\n for (const def of windowDefs) {\n const room = byId[def.room]\n if (!room) throw new Error('Window references a missing room: ' + def.room)\n const edge = exteriorEdge(room, def.side, w, d, def.at)\n if (!edge) continue\n const centres = def.n ? Array.from({ length: def.n }, (_, i) => edge.a0 + ((edge.a1 - edge.a0) * (i + 1)) / (def.n! + 1)) : [def.at as number]\n for (const centre of centres) {\n const onEdge = stretches.filter((t) => t.axis === edge.axis && eq(edge.axis === 'u' ? t.v0 : t.u0, edge.pos) && t.sides.includes(def.room))\n const start = (t: Json) => (edge.axis === 'u' ? t.u0 : t.v0)\n const end = (t: Json) => (edge.axis === 'u' ? t.u1 : t.v1)\n const gap = (t: Json) => Math.min(Math.abs(centre - start(t)), Math.abs(centre - end(t)))\n const target = onEdge.find((t) => centre >= start(t) - TOL && centre <= end(t) + TOL) || onEdge.slice().sort((x, y) => gap(x) - gap(y))[0]\n if (!target) continue\n let group = groups.find((x) => x.wall === target && x.def.room === def.room)\n if (!group) groups.push((group = { wall: target, edge, start: start(target), end: end(target), def, entries: [] }))\n group.entries.push({ def, centre, order: order++ })\n }\n }\n for (const g of groups) {\n const room = byId[g.def.room]\n const bath = room.type === 'bathroom'\n const length = g.end - g.start\n const its = g.entries\n .slice()\n .sort((x, y) => x.centre - y.centre)\n .map((x) => ({ def: x.def, order: x.order, width: bath ? Math.min(x.def.width, 0.6) : x.def.width }))\n const fits = (l: typeof its) => l.reduce((t, x) => t + x.width, 0) + (l.length + 1) * clearance <= length + TOL\n while (its.length && !fits(its)) {\n const k = its.reduce((m, x, i, arr) => (x.width > arr[m].width ? i : m), 0)\n if (its[k].width > 0.6 + TOL) its[k] = Object.assign({}, its[k], { width: Math.max(0.6, r2(its[k].width - 0.1)) })\n else its.pop()\n }\n if (!its.length) continue\n const space = (length - its.reduce((t, x) => t + x.width, 0)) / (its.length + 1)\n let pos = g.start + space\n for (const x of its) {\n const c = pos + x.width / 2\n pos += x.width + space\n const u = g.edge.axis === 'u' ? c : g.edge.pos\n const v = g.edge.axis === 'u' ? g.edge.pos : c\n let y0 = x.def.y0 || 1.0\n let y1 = x.def.y1 || 2.15\n if (bath) {\n y0 = Math.max(y0, 2.1)\n y1 = Math.min(Math.max(y1, y0 + 0.4), ceiling - 0.25)\n }\n found.push({ id: '', floor: floorIndex, u: r2(u), v: r2(v), axis: g.edge.axis, pos: g.edge.pos, at: r2(c), width: x.width, y0: r2(y0), y1: r2(y1), room: x.def.room, side: x.def.side, _order: x.order })\n }\n }\n for (const room of list) {\n if (WINDOWLESS_ROOM_TYPES.has(room.type) || found.some((j) => j.room === room.id)) continue\n let best: { length: number; window: Json } | null = null\n for (const t of stretches) {\n if (!t.sides.includes(room.id)) continue\n const i0 = t.axis === 'u' ? t.u0 : t.v0\n const i1 = t.axis === 'u' ? t.u1 : t.v1\n const length = i1 - i0\n const width = Math.min(room.type === 'bathroom' ? 0.6 : 1.2, length - 2 * clearance)\n if (width < 0.6 - TOL || (best && best.length >= length)) continue\n const side = t.axis === 'u' ? (t.sides[0] === 'outside' ? 'front' : 'back') : t.sides[0] === 'outside' ? 'left' : 'right'\n const c = (i0 + i1) / 2\n const pos = t.axis === 'u' ? t.v0 : t.u0\n const bath = room.type === 'bathroom'\n best = { length, window: { id: '', floor: floorIndex, u: r2(t.axis === 'u' ? c : pos), v: r2(t.axis === 'u' ? pos : c), axis: t.axis, pos, at: r2(c), width: r2(width), y0: bath ? 2.1 : 1.0, y1: bath ? Math.min(2.5, ceiling - 0.25) : 2.15, room: room.id, side, _order: 1e6 + found.length } }\n }\n if (best) found.push(best.window)\n }\n found.sort((x, y) => x._order - y._order)\n found.forEach((j, i) => {\n delete j._order\n j.id = 'w' + floorIndex + '_' + i\n })\n return found\n}\n\n/** Facade and lot: zones, gates, paths and perimeter. */\nfunction buildLot(plan: Plan, tpl: TemplateDef, w: number, d: number, op: FloorplanOptions, style: StyleDef, styleId: string, bc: BuildContext) {\n const seed = op.seed == null ? 1 : op.seed\n const rFacade = createRng(seed, STREAM.facade)\n const facadeStyle = style.facade\n const palette = style.swatches\n const color = palette[Math.floor(rFacade() * palette.length)]\n const extra = tpl.facade || {}\n plan.facade = {\n style: styleId,\n color: { name: color[0], hex: color[1] },\n finish: pickWeighted(rFacade, facadeStyle.finish),\n grilles: rFacade() < facadeStyle.grilles,\n roof: pickWeighted(rFacade, facadeStyle.roof),\n balcony: !!extra.balcony,\n veranda: !!extra.veranda,\n steelDoor: !!extra.steelDoor,\n floors: plan.floorDefs.length,\n }\n if (tpl.facadeExtra) tpl.facadeExtra(plan.facade, rFacade, w, d, op)\n if (plan.floorDefs.length > 1 && plan.facade.roof === 'fiber_cement') plan.facade.roof = 'colonial'\n if (!tpl.lot) return\n const cfg: LotConfig = tpl.lot(w, d, style, op)\n if (bc.zone) clampLotToZone(cfg, bc.zone, bc.adjustments || [], tpl.partyWalls)\n const rLot = createRng(seed, STREAM.lot)\n const setback = cfg.frontSetback\n const marginL = cfg.marginLeft\n const marginR = cfg.marginRight\n const backDepth = cfg.backyardDepth\n const lot: Json = {\n rect: [-marginL, -setback, w + marginR, d + backDepth],\n setback,\n sideYard: { left: marginL, right: marginR },\n backyard: backDepth,\n style: styleId,\n zones: [],\n perimeter: [],\n gates: [],\n paths: [],\n pool: !!cfg.pool,\n }\n const ZONES: Room[] = []\n const libs = Object.assign({ garden: 'garden', backyard: 'backyard', parking: 'parking', sideYard: 'side_yard' }, cfg.libraries || {})\n const addZone = (id: string, type: string, label: string, parts: Rect[], library?: string) =>\n ZONES.push(Object.assign(normalizeRoom({ id, type, label, rect: parts[0], parts: parts.slice(1), library, outdoor: true }, -1), { floor: -1, outdoor: true }))\n if (setback > 0) {\n let parts: Rect[] = [[-marginL, -setback, w + marginR, 0]]\n if (cfg.parking) {\n const garageU = (cfg.garage as Json).u\n const vw = cfg.parking.width\n const x0 = Math.max(-marginL, garageU - vw / 2)\n const x1 = Math.min(w + marginR, garageU + vw / 2)\n parts = []\n if (x0 + marginL > 0.8) parts.push([-marginL, -setback, x0, 0])\n if (w + marginR - x1 > 0.8) parts.push([x1, -setback, w + marginR, 0])\n addZone('parking', 'parking', 'parking', [[x0, -setback, x1, 0]], libs.parking)\n if (!parts.length) parts = [[x1, -setback, w + marginR, 0]]\n }\n parts.sort((a, b) => b[2] - b[0] - (a[2] - a[0]))\n addZone('garden', 'garden', 'garden', parts, libs.garden)\n }\n const yard = cfg.yardZones\n if (backDepth > 0 && yard) {\n for (const q of yard) addZone(q.id, q.type, q.label || q.id, [[-marginL, d + q.v0, w + marginR, d + Math.min(backDepth, q.v1)]], q.library)\n } else if (backDepth > 0) addZone('backyard', 'backyard', 'backyard', [[-marginL, d, w + marginR, d + backDepth]], libs.backyard)\n for (const q of cfg.extraZones || []) addZone(q.id, q.type, q.label || q.id, q.parts, q.library)\n if (marginL > 0.5) addZone('side_left', 'side_yard', 'side_left', [[-marginL, 0, 0, d]], libs.sideYard)\n if (marginR > 0.5) addZone('side_right', 'side_yard', 'side_right', [[w, 0, w + marginR, d]], libs.sideYard)\n const gates: Json[] = []\n const addGate = (type: string, model: string, u: number, v: number, width: number, side: string, toTarget?: string | null) => {\n const g: Json = {\n id: 'g' + gates.length,\n type,\n model,\n u: r2(u),\n v: r2(v),\n axis: 'u',\n width,\n height: type === 'pedestrian' ? style.height : Math.min(style.height, 2.2),\n side,\n to: toTarget || null,\n material: 'iron',\n }\n g.zones = openingZones(u, v, 'u', width, openingDepth(width, type === 'pedestrian' ? width : 0))\n gates.push(g)\n return g\n }\n if (cfg.pedestrian && setback > 0) addGate('pedestrian', 'pedestrian', cfg.pedestrian.u, -setback, 1.0, 'front', 'door')\n if (cfg.garage && setback > 0) addGate('garage', pickWeighted(rLot, style.gate.garage), cfg.garage.u, -setback, cfg.garage.width, 'front', cfg.garage.to)\n if (cfg.cargo) addGate('cargo', 'sliding', cfg.cargo.u, d + backDepth, cfg.cargo.width, 'back', 'stockroom')\n plan.gates = gates\n lot.gates = gates\n const paths: Json[] = []\n const target = (a: string, side: string) => plan.doors.find((p) => p.exterior && p.a === a && p.side === side)\n for (const g of gates) {\n if (g.type === 'pedestrian' && cfg.doorTarget) {\n const pt = target(cfg.doorTarget.a, cfg.doorTarget.side)\n if (!pt) continue\n const gateU = g.u\n const dx = pt.u\n const ym = -setback / 2\n const L = 1.0\n const h = L / 2\n const rs: Rect[] = []\n if (Math.abs(gateU - dx) < 0.05) rs.push([dx - h, -setback, dx + h, 0])\n else {\n rs.push([gateU - h, -setback, gateU + h, ym + h])\n rs.push([Math.min(gateU, dx) - h, ym - h, Math.max(gateU, dx) + h, ym + h])\n rs.push([dx - h, ym - h, dx + h, 0])\n }\n paths.push({ id: 'pedestrian_path', type: 'pedestrian', from: g.id, to: pt.id, width: L, rects: rs.map((r) => r.map(r2)), points: [[gateU, -setback], [gateU, ym], [dx, ym], [dx, 0]] })\n } else if (g.type === 'garage' && g.to === 'inner_garage') {\n const pt = plan.doors.find((p) => p.exterior && p.side === 'front' && Math.abs(p.u - g.u) < 0.6 && p.width >= 2.5)\n if (!pt) continue\n const hw = Math.max(g.width, pt.width) / 2\n paths.push({ id: 'garage_path', type: 'vehicle', from: g.id, to: pt.id, width: hw * 2, rects: [[g.u - hw, -setback, g.u + hw, 0].map(r2)], points: [[g.u, -setback], [g.u, 0]] })\n } else if (g.type === 'cargo') {\n const pt = target('stockroom', 'back')\n if (!pt) continue\n const hw = Math.max(g.width, pt.width) / 2\n paths.push({ id: 'cargo_path', type: 'vehicle', from: g.id, to: pt.id, width: hw * 2, rects: [[g.u - hw, d, g.u + hw, d + backDepth].map(r2)], points: [[g.u, d + backDepth], [g.u, d]] })\n }\n }\n if (tpl.paths) paths.push(...tpl.paths(plan, { gates, setback, marginLeft: marginL, marginRight: marginR, backyard: backDepth, w, d }))\n else addExteriorDoorPaths(plan, { gates, paths, zones: ZONES, setback, marginLeft: marginL, marginRight: marginR, backyard: backDepth, w, target: cfg.doorTarget })\n plan.paths = paths\n lot.paths = paths\n const boundary = (rule: { type: Record<string, number>; top: Record<string, number> }) => {\n const type = pickWeighted(rLot, rule.type)\n const top = type === 'railing' ? 'none' : pickWeighted(rLot, rule.top)\n const wallHeight = type === 'railing' ? 1.2 : type === 'fence' ? (style.fenceHeight ?? 2.0) : style.height\n return { type, material: type === 'wall' ? 'block' : type === 'fence' ? 'wire_mesh' : 'iron', height: wallHeight, top, totalHeight: r2(wallHeight + registries().WALL_TOP_HEIGHTS[top]), thickness: WALL_THICKNESS }\n }\n const A: Record<string, Json> = { front: boundary(style.front), left: boundary(style.sideYard), right: boundary(style.sideYard), back: boundary(style.back) }\n const seg = (side: string, u0: number, v0: number, u1: number, v1: number) => {\n if (Math.abs(u1 - u0) + Math.abs(v1 - v0) < 0.05) return\n lot.perimeter.push(Object.assign({ id: 'm' + lot.perimeter.length, side, u0: r2(u0), v0: r2(v0), u1: r2(u1), v1: r2(v1) }, A[side]))\n }\n const cutRun = (side: string, de: number, to: number, vfix: number, gs: Json[]) => {\n let pieces: [number, number][] = [[de, to]]\n for (const g of gs) {\n const g0 = g.u - g.width / 2\n const g1 = g.u + g.width / 2\n const n: [number, number][] = []\n for (const [x, y] of pieces) {\n if (g1 <= x || g0 >= y) {\n n.push([x, y])\n continue\n }\n if (g0 > x) n.push([x, g0])\n if (g1 < y) n.push([g1, y])\n }\n pieces = n\n }\n for (const [x, y] of pieces) seg(side, x, vfix, y, vfix)\n }\n if (setback > 0)\n cutRun('front', -marginL, w + marginR, -setback, gates.filter((g) => g.side === 'front'))\n cutRun('back', -marginL, w + marginR, d + backDepth, gates.filter((g) => g.side === 'back'))\n const vi = setback > 0 ? -setback : 0\n if (marginL > 0.5) seg('left', -marginL, vi, -marginL, d + backDepth)\n else if (backDepth > 0) seg('left', 0, d, 0, d + backDepth)\n if (marginR > 0.5) seg('right', w + marginR, vi, w + marginR, d + backDepth)\n else if (backDepth > 0) seg('right', w, d, w, d + backDepth)\n for (const z of ZONES) z.ground = (cfg.grounds || {})[z.id] || (cfg.grounds || {})[z.type] || pickWeighted(rLot, style.grounds[z.type] || { concrete: 1 })\n if (bc.zone) enforcePermeability(lot, ZONES, bc.zone, bc.adjustments || [])\n plan.zones = ZONES\n lot.zones = ZONES\n plan.lot = lot\n}\n\nexport { inRect, MARGIN }\n","import { clamp } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { registries, resolveStyleId } from './registry'\nimport { createRng } from './rng'\nimport type { Rng } from './rng'\nimport type { Hsl } from './types'\n\nexport const HIGH_SATURATION = 0.4\nexport const MIN_WALL_FLOOR_CONTRAST = 20\nexport const MIN_FABRIC_FLOOR_CONTRAST = 15\n\nconst SCHEMES = ['analogous', 'complementary', 'split_complementary', 'triad'] as const\nconst HARMONY_OFFSETS: Record<string, [number, number]> = { analogous: [-30, 30], complementary: [180, 165], split_complementary: [150, 210], triad: [120, 240] }\n\n/** Roles the contrast rules rely on. A palette recipe must produce them. */\nexport const ROLE_FABRIC_MAIN = 'fabric_main'\nexport const ROLE_FABRIC_ACCENT = 'fabric_accent'\nexport const ROLE_FLOOR_REFERENCE = 'floor_living'\n\n/** Tools handed to a style recipe. `jit` and `rng` draw from the style's seeded stream: draw order is part of the contract. */\nexport interface PaletteDraw {\n rng: Rng\n base: [string, number, number, number]\n H0: number\n H1: number\n H2: number\n jit(v: number, a: number): number\n hsl(h: number, s: number, l: number): Hsl\n}\nexport interface PaletteEarly {\n /** Accent mode: true saturates walls, false puts accents on objects. */\n wallMode: boolean\n /** Maximum wall saturation. */\n sMax: number\n /** Facade, wall, gate, roof, ceiling... in insertion order. */\n roles: Record<string, Hsl>\n /** General floor `[h, s, l]` for room types that do not define their own. */\n generalFloor: [number, number, number]\n}\nexport interface PaletteStyleDef {\n /** Legacy stream suffix; defaults to the style id. */\n seedKey?: string\n /** Facade colour table `[labelKey, h, s, l]`. */\n facadeColors: [string, number, number, number][]\n /** Draws up to the room colours (before the room loop). */\n early(d: PaletteDraw): PaletteEarly\n /** Draws the object roles (wood, fabrics, metal, ground colours) after the room loop. */\n late(d: PaletteDraw, e: PaletteEarly): Record<string, Hsl>\n}\n\nexport interface PaletteContext extends PaletteDraw {\n style: string\n sMax: number\n wallMode: boolean\n generalFloor: [number, number, number]\n}\n\nexport const hslToInt = (h: number, s: number, l: number): number => {\n h = ((h % 360) + 360) % 360\n s = clamp(s, 0, 1)\n l = clamp(l, 0, 1)\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1))\n }\n return (Math.round(f(0) * 255) << 16) | (Math.round(f(8) * 255) << 8) | Math.round(f(4) * 255)\n}\nexport const intToHsl = (n: number): Hsl => {\n const r = ((n >> 16) & 255) / 255\n const g = ((n >> 8) & 255) / 255\n const b = (n & 255) / 255\n const mx = Math.max(r, g, b)\n const mn = Math.min(r, g, b)\n const l = (mx + mn) / 2\n const d = mx - mn\n let h = 0\n let s = 0\n if (d > 1e-9) {\n s = d / (1 - Math.abs(2 * l - 1))\n h = mx === r ? (g - b) / d + (g < b ? 6 : 0) : mx === g ? (b - r) / d + 2 : (r - g) / d + 4\n h *= 60\n }\n return { h, s, l }\n}\n/** CIE L* lightness of a packed RGB colour. */\nexport const lstar = (n: number): number => {\n const linear = (c: number) => ((c /= 255) <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4))\n const Y = 0.2126 * linear((n >> 16) & 255) + 0.7152 * linear((n >> 8) & 255) + 0.0722 * linear(n & 255)\n return Y > 216 / 24389 ? 116 * Math.cbrt(Y) - 16 : (Y * 24389) / 27\n}\nexport const hexString = (n: number): string => '#' + (n >>> 0).toString(16).padStart(6, '0')\n\nexport interface PaletteOptions {\n seed?: number | string\n style?: string\n state?: string\n}\nexport type Palette = { meta: { seed: number | string; style: string; state: string; scheme: string; base: string; accentMode: 'wall' | 'object' } } & Record<string, number | object>\n\n/** Seeded colour-harmony palette: a facade base colour, a harmony scheme, role colours and contrast rules. */\nexport function palette(o?: PaletteOptions): Palette {\n const opt = o || {}\n let style = resolveStyleId(opt.style || 'budget')\n if (!registries().PALETTE_STYLES[style]) style = registries().PALETTE_STYLES.mid ? 'mid' : Object.keys(registries().PALETTE_STYLES)[0]\n const def = registries().PALETTE_STYLES[style]\n const state = opt.state || 'normal'\n const seed = opt.seed == null ? 1 : opt.seed\n const rng = createRng(seed, STREAM.palettePrefix + (def.seedKey ?? style))\n const table = def.facadeColors\n const base = table[Math.floor(rng() * table.length)]\n const scheme = SCHEMES[Math.floor(rng() * 4)]\n const offsets = HARMONY_OFFSETS[scheme]\n const jit = (v: number, a: number) => v + (rng() - 0.5) * a\n const hsl = (h: number, s: number, l: number): Hsl => ({ h: ((h % 360) + 360) % 360, s: clamp(s, 0, 1), l: clamp(l, 0, 1) })\n const H0 = base[1]\n const H1 = H0 + offsets[0]\n const H2 = H0 + offsets[1]\n const draw: PaletteDraw = { rng, base, H0, H1, H2, jit, hsl }\n const early = def.early(draw)\n const { wallMode, sMax } = early\n const R: Record<string, Hsl> = Object.assign({}, early.roles)\n const ctx: PaletteContext = Object.assign({ style, sMax, wallMode, generalFloor: early.generalFloor }, draw)\n for (const c of registries().ROOM_COLORS) {\n const [wh, wl] = c.wall(ctx)\n R['wall_' + c.type] = hsl(wh, c.neutral ? Math.min(0.16, sMax) : clamp(jit(sMax * 0.75, sMax * 0.5), 0.03, sMax), jit(wl, 0.03))\n const pi = c.floor || early.generalFloor\n R['floor_' + c.type] = hsl(pi[0], Math.min(pi[1], wallMode ? 0.18 : 0.3), jit(pi[2], 0.04))\n }\n Object.assign(R, def.late(draw, early))\n // state hook (e.g. dirt: desaturate and darken)\n registries().STATE_PLUGINS[state]?.adjustPalette?.(R)\n // anti-clash rules: floor never saturated if the wall is; minimum lightness separation\n const adjust = (color: Hsl, ref: Hsl, min: number, preferredDir?: number) => {\n for (let i = 0; i < 60; i++) {\n if (Math.abs(lstar(hslToInt(color.h, color.s, color.l)) - lstar(hslToInt(ref.h, ref.s, ref.l))) >= min) return\n const refL = lstar(hslToInt(ref.h, ref.s, ref.l))\n let dir = preferredDir || (refL > 50 ? -1 : 1)\n if ((dir < 0 && color.l <= 0.06) || (dir > 0 && color.l >= 0.94)) dir = -dir\n color.l = clamp(color.l + dir * 0.015, 0.04, 0.96)\n }\n }\n const types = registries().ROOM_COLORS.map((c) => c.type)\n for (const c of types) {\n const w = R['wall_' + c]\n const p = R['floor_' + c]\n if (w.s > 0.3) p.s = Math.min(p.s, 0.2)\n if (p.s > HIGH_SATURATION) p.s = HIGH_SATURATION - 0.05\n adjust(p, w, MIN_WALL_FLOOR_CONTRAST + 2, lstar(hslToInt(w.h, w.s, w.l)) > 50 ? -1 : 1)\n }\n const floorRef = R[ROLE_FLOOR_REFERENCE] || R['floor_' + types[0]]\n const fabric = R[ROLE_FABRIC_MAIN]\n adjust(fabric, floorRef, MIN_FABRIC_FLOOR_CONTRAST + 3)\n adjust(R[ROLE_FABRIC_ACCENT], floorRef, MIN_FABRIC_FLOOR_CONTRAST + 3)\n for (const c of types) {\n const p = R['floor_' + c]\n if (Math.abs(lstar(hslToInt(fabric.h, fabric.s, fabric.l)) - lstar(hslToInt(p.h, p.s, p.l))) < MIN_FABRIC_FLOOR_CONTRAST)\n adjust(p, fabric, MIN_FABRIC_FLOOR_CONTRAST + 2, lstar(hslToInt(fabric.h, fabric.s, fabric.l)) > 50 ? -1 : 1)\n }\n const out: Record<string, unknown> = { meta: { seed, style, state, scheme, base: base[0], accentMode: wallMode ? 'wall' : 'object' } }\n for (const k of Object.keys(R)) out[k] = hslToInt(R[k].h, R[k].s, R[k].l)\n // final contrast after rounding: fabric against every floor; search lightness for floor (then wall) satisfying both rules\n const num = (k: string) => out[k] as number\n const pairOk = (w: number, p: number) => Math.abs(lstar(w) - lstar(p)) >= MIN_WALL_FLOOR_CONTRAST + 1 && Math.abs(lstar(num(ROLE_FABRIC_MAIN)) - lstar(p)) >= MIN_FABRIC_FLOOR_CONTRAST + 1\n const search = (color: number, ok: (n: number) => boolean) => {\n const h = intToHsl(color)\n let bestValue: number | null = null\n let md = 9\n for (let l = 0.02; l <= 0.98; l += 0.005) {\n const n = hslToInt(h.h, h.s, l)\n if (ok(n) && Math.abs(l - h.l) < md) {\n md = Math.abs(l - h.l)\n bestValue = n\n }\n }\n return bestValue\n }\n for (const c of types) {\n if (pairOk(num('wall_' + c), num('floor_' + c))) continue\n const n = search(num('floor_' + c), (p) => pairOk(num('wall_' + c), p))\n if (n != null) {\n out['floor_' + c] = n\n continue\n }\n // no solution with the floor alone: move the wall\n const w = search(num('wall_' + c), (w2) => pairOk(w2, num('floor_' + c)))\n if (w != null) out['wall_' + c] = w\n }\n return out as Palette\n}\n","import { EPS, MARGIN, TOL } from './constants'\nimport { cardinal, clamp, eq, extent, inner, overlaps, r2 } from './geometry'\nimport { registries } from './registry'\nimport { isOpenSide, openingsOfFloor, windowsOfRoom, zonesOfFloor } from './queries'\nimport type { Json, Plan, Rect, Room, Slot, SlotDef, Vec2 } from './types'\n\nconst SIDE_NORMAL: Record<string, Vec2> = { left: [1, 0], right: [-1, 0], front: [0, 1], back: [0, -1] }\nconst FIXED_FACING: Record<string, Vec2> = { 'u+': [1, 0], 'u-': [-1, 0], 'v+': [0, 1], 'v-': [0, -1] }\nconst SIDE_OPPOSITE: Record<string, string> = { front: 'back', back: 'front', left: 'right', right: 'left' }\nconst WINDOW_SIDE: Record<string, string> = { front: 'front', back: 'back', left: 'left', right: 'right' }\n\n/** Slot definitions of a room after `without`, `overrides`, `extras` and `any`/window expansion. */\nexport function slotDefsOf(plan: Plan, room: Room): SlotDef[] {\n const name = room.library || room.type\n const key = registries().LIBRARY_ALIAS[name] || name\n const library = room.slots ? room.slots : registries().LIBRARIES[key]\n if (!library) return []\n const R = inner(room.parts[0])\n let defs = typeof library === 'function' ? library({ w: R[2] - R[0], d: R[3] - R[1] }) : library.slice()\n defs = defs.map((x) => Object.assign({}, x))\n for (const id of room.without || []) defs = defs.filter((x) => x.id !== id)\n for (const [id, aj] of Object.entries(room.overrides || {})) {\n const i = defs.findIndex((x) => x.id === id)\n if (i < 0) continue\n if (aj === null) defs.splice(i, 1)\n else defs[i] = Object.assign(defs[i], aj)\n }\n defs.push(...(room.extras || []).map((x) => Object.assign({}, x)))\n const out: SlotDef[] = []\n for (const def of defs) {\n def.parent = def.on\n if (def.anchor === 'wall' && def.side === 'any') for (const l of ['left', 'right', 'front', 'back']) out.push(Object.assign({}, def, { id: def.id + '@' + l, side: l as SlotDef['side'], group: def.group || def.id }))\n else if (def.anchor === 'corner' && def.corner === 'any') for (const l of ['front-left', 'front-right', 'back-left', 'back-right']) out.push(Object.assign({}, def, { id: def.id + '@' + l, corner: l, group: def.group || def.id }))\n else if (def.anchor === 'window' && def.n == null) {\n const windowList = windowsOfRoom(plan, room)\n windowList.forEach((_j, i) => out.push(Object.assign({}, def, { id: def.id + '@w' + i, n: i, group: def.group || def.id })))\n } else out.push(def)\n }\n return out\n}\n\nexport function resolveSlots(plan: Plan): Slot[] {\n const all: Slot[] = []\n for (const room of plan.rooms.concat(plan.zones)) {\n const defs = slotDefsOf(plan, room)\n const byId: Record<string, Slot> = {}\n // stairs: a door on any storey applies\n const zones = room.type === 'stairs' ? plan.floors.flatMap((_, floorIndex) => zonesOfFloor(plan, floorIndex)) : zonesOfFloor(plan, room.floor)\n for (const def of defs) {\n const s = resolveSlot(plan, room, def, byId, zones)\n byId[def.id] = s\n all.push(s)\n }\n }\n return all\n}\n\nexport function resolveSlot(plan: Plan, room: Room, def: SlotDef, byId: Record<string, Slot>, zones: Rect[]): Slot {\n const base: Json = {\n id: def.id,\n room: room.id,\n floor: room.floor,\n outdoor: room.outdoor,\n anchor: def.anchor,\n side: def.side || def.corner || null,\n cats: def.cats,\n slide: def.slide,\n required: !!def.required,\n chance: def.required ? 1 : def.chance == null ? 1 : def.chance,\n clearance: def.clearance == null ? 0.5 : def.clearance,\n front: def.facing || 'center',\n group: def.group || null,\n requires: def.requires || null,\n on: def.parent || null,\n target: def.target || null,\n valid: true,\n reason: null,\n }\n const invalid = (m: string): Slot => Object.assign(base, { valid: false, reason: m, x: 0, z: 0, ry: 0, w: 0, d: 0, frontU: 0, frontV: 1, aabb: [0, 0, 0, 0], _cell: null }) as Slot\n if (def.anchor === 'on' || def.anchor === 'inside') {\n const parent = byId[def.parent]\n if (!parent || !parent.valid) return invalid('invalid_parent')\n return Object.assign(base, { x: parent.x, z: parent.z, ry: parent.ry, w: parent.w, d: parent.d, frontU: parent.frontU, frontV: parent.frontV, aabb: parent.aabb, _cell: parent._cell }) as Slot\n }\n const size = def.size as Vec2\n const roomCenter = ((): Vec2 => {\n const R0 = inner(room.parts[0])\n return [(R0[0] + R0[2]) / 2, (R0[1] + R0[3]) / 2]\n })()\n const openings = openingsOfFloor(plan, room.floor)\n let point: Vec2 = [0, 0]\n const targetPoint = (rule: string): Vec2 => {\n if (rule === 'door') {\n let best: Json = null\n let bestDist = 1e9\n for (const ab of openings) {\n const dist = Math.hypot(ab.u - point[0], ab.v - point[1])\n if (dist < bestDist) {\n bestDist = dist\n best = ab\n }\n }\n return best ? [best.u, best.v] : roomCenter\n }\n if (rule === 'target') {\n const t = byId[def.target as string]\n return t && t.valid ? [t.x, t.z] : roomCenter\n }\n return roomCenter\n }\n const free = (rect: Rect) => !!def.floorFree || !zones.some((z) => overlaps(rect, z, room.type === 'stairs' ? -0.011 : EPS))\n const rule: string = def.facing || 'center'\n let R = inner(room.parts[Math.min(def.part || 0, room.parts.length - 1)])\n if (def.anchor === 'wall' || def.anchor === 'window') {\n let side = def.side as string\n let a: number | null = null\n let win: Json = null\n if (def.anchor === 'window') {\n const windowList = windowsOfRoom(plan, room)\n win = windowList[def.n as number]\n if (!win) return invalid('no_window')\n side = room.outdoor ? SIDE_OPPOSITE[win.side] : WINDOW_SIDE[win.side]\n const cand = room.parts\n .map(inner)\n .find(\n (r) =>\n (win.axis === 'u' ? win.u >= r[0] - TOL && win.u <= r[2] + TOL : win.v >= r[1] - TOL && win.v <= r[3] + TOL) &&\n ((side === 'left' && eq(r[0], win.pos + MARGIN)) || (side === 'right' && eq(r[2], win.pos - MARGIN)) || (side === 'front' && eq(r[1], win.pos + MARGIN)) || (side === 'back' && eq(r[3], win.pos - MARGIN))),\n )\n if (!cand) return invalid('window_outside_room')\n R = cand\n a = win.axis === 'u' ? win.u : win.v\n }\n const n = SIDE_NORMAL[side]\n if (!n) return invalid('invalid_side')\n const horizontal = side === 'front' || side === 'back'\n const a0 = horizontal ? R[0] : R[1]\n const a1 = horizontal ? R[2] : R[3]\n const len = a1 - a0\n const depth = size[1]\n if (depth > (horizontal ? R[3] - R[1] : R[2] - R[0]) + EPS) return invalid('larger_than_room')\n const hw = Math.min(size[0], len) / 2\n const cell = (ac: number): Rect =>\n side === 'left' ? [R[0], ac - hw, R[0] + depth, ac + hw] : side === 'right' ? [R[2] - depth, ac - hw, R[2], ac + hw] : side === 'front' ? [ac - hw, R[1], ac + hw, R[1] + depth] : [ac - hw, R[3] - depth, ac + hw, R[3]]\n const nominal = a != null ? a : a0 + hw + (def.pos == null ? 0.5 : def.pos) * Math.max(0, len - 2 * hw) + (def.shift || 0)\n const wp = side === 'left' ? R[0] - MARGIN : side === 'right' ? R[2] + MARGIN : side === 'front' ? R[1] - MARGIN : R[3] + MARGIN\n const pa = clamp(nominal, a0 + hw, a1 - hw)\n let found: number | null = null\n const steps = [0]\n if (def.anchor !== 'window') for (let k = 1; k <= 60; k++) steps.push(k, -k)\n for (const k of steps) {\n const ac = pa + k * 0.05\n if (ac - hw < a0 - EPS || ac + hw > a1 + EPS) continue\n if (free(cell(ac))) {\n found = ac\n break\n }\n }\n if (found == null) return invalid('blocked_by_door')\n const sp: Vec2 = horizontal ? [found, wp - n[1] * 0.1] : [wp - n[0] * 0.1, found]\n if (isOpenSide(plan, room, sp[0], sp[1])) return invalid('open_wall')\n const rect = cell(found)\n return Object.assign(base, { side, x: r2((rect[0] + rect[2]) / 2), z: r2((rect[1] + rect[3]) / 2), frontU: n[0], frontV: n[1], ry: r2(Math.atan2(n[0], n[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f: n, enclosed: [side], R, size } }) as Slot\n }\n if (def.anchor === 'corner') {\n const [cornerV, cornerU] = (def.corner as string).split('-')\n const normalV = SIDE_NORMAL[cornerV]\n const normalU = SIDE_NORMAL[cornerU]\n if (!normalV || !normalU) return invalid('invalid_corner')\n const kx = cornerU === 'left' ? R[0] : R[2]\n const kz = cornerV === 'front' ? R[1] : R[3]\n point = [kx, kz]\n let f: Vec2\n if (FIXED_FACING[rule]) {\n f = FIXED_FACING[rule]\n if (!((f[0] === normalU[0] && f[1] === normalU[1]) || (f[0] === normalV[0] && f[1] === normalV[1]))) f = normalU\n } else {\n const t = targetPoint(rule)\n f = Math.abs(t[0] - kx) >= Math.abs(t[1] - kz) ? normalU : normalV\n }\n const [extentU, extentV] = extent(size, f)\n if (extentU > R[2] - R[0] + EPS || extentV > R[3] - R[1] + EPS) return invalid('larger_than_room')\n const rect: Rect = [cornerU === 'left' ? R[0] : R[2] - extentU, cornerV === 'front' ? R[1] : R[3] - extentV, cornerU === 'left' ? R[0] + extentU : R[2], cornerV === 'front' ? R[1] + extentV : R[3]]\n if (!free(rect)) return invalid('blocked_by_door')\n for (const sp of [[kx - normalU[0] * (MARGIN + 0.1), (rect[1] + rect[3]) / 2], [(rect[0] + rect[2]) / 2, kz - normalV[1] * (MARGIN + 0.1)]]) if (isOpenSide(plan, room, sp[0], sp[1])) return invalid('open_wall')\n return Object.assign(base, { x: r2((rect[0] + rect[2]) / 2), z: r2((rect[1] + rect[3]) / 2), frontU: f[0], frontV: f[1], ry: r2(Math.atan2(f[0], f[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f, enclosed: [cornerU, cornerV], R, size } }) as Slot\n }\n if (def.anchor === 'center') {\n let cx = R[0] + (def.fx == null ? 0.5 : def.fx) * (R[2] - R[0]) + (def.dx || 0)\n let cz = R[1] + (def.fz == null ? 0.5 : def.fz) * (R[3] - R[1]) + (def.dz || 0)\n point = [cx, cz]\n let f: Vec2\n if (FIXED_FACING[rule]) f = FIXED_FACING[rule]\n else {\n const t = targetPoint(rule)\n const dx = t[0] - cx\n const dz = t[1] - cz\n f = Math.hypot(dx, dz) < 0.05 ? [0, 1] : cardinal(dx, dz)\n }\n const [extentU, extentV] = extent(size, f)\n if (extentU > R[2] - R[0] + EPS || extentV > R[3] - R[1] + EPS) return invalid('larger_than_room')\n cx = clamp(cx, R[0] + extentU / 2, R[2] - extentU / 2)\n cz = clamp(cz, R[1] + extentV / 2, R[3] - extentV / 2)\n const rect: Rect = [cx - extentU / 2, cz - extentV / 2, cx + extentU / 2, cz + extentV / 2]\n if (!free(rect)) return invalid('blocked_by_door')\n return Object.assign(base, { x: r2(cx), z: r2(cz), frontU: f[0], frontV: f[1], ry: r2(Math.atan2(f[0], f[1])), w: size[0], d: size[1], aabb: rect.map(r2), _cell: { rect, f, enclosed: [], R, size } }) as Slot\n }\n return invalid('unknown_anchor')\n}\n","import { DOOR_CLEARANCE } from './constants'\nimport { createPlacementContext, placementKit, runPostProcess } from './context'\nimport { runResultExtensions } from './extensions'\nimport { fillRoom } from './fill'\nimport { overlaps, openingZones, r2 } from './geometry'\nimport { STREAM } from './legacy-seeds'\nimport { translate } from './locale'\nimport { buildPlan, floorsOf } from './plan'\nimport { hexString, palette } from './palette'\nimport { registries } from './registry'\nimport { createRng, hashString } from './rng'\nimport { resolveSlots } from './slots'\nimport { checkLot, clampOptionsToZone, resolveZone, useOf } from './zoning'\nimport type { FloorplanOptions, ItemColor, Json, PlacedItem, Plan, Slot, TemplateDef, ZoneAdjustment } from './types'\nimport type { StateContext } from './types'\n\nexport function templateOf(t: string | TemplateDef): TemplateDef {\n if (typeof t === 'string') {\n if (!registries().TEMPLATES[t]) throw new Error('Unknown template: ' + t)\n return registries().TEMPLATES[t]\n }\n return t\n}\n\nconst cleanSlot = (s: Slot) => {\n const o: Json = {}\n for (const k of Object.keys(s)) if (k[0] !== '_') o[k] = s[k]\n o.cats = Object.keys(s.cats || {})\n return o\n}\n\n/** Recorded slots (resolved positions) of every storey and of the lot. */\nexport function slots(template: string | TemplateDef, options?: FloorplanOptions): Json[] {\n const tpl = templateOf(template)\n const o = options || {}\n const plan = buildPlan(tpl, o.w, o.d, o)\n const locale = o.locale || 'en'\n return resolveSlots(plan)\n .map(cleanSlot)\n .map((s) => (s.reason ? Object.assign(s, { reason: translate('reasons', s.reason, locale) }) : s))\n}\n\n/** Picks the house state: the requested one, else a seeded draw over the registered distribution, else `normal`. */\nexport function pickState(requested: string | undefined, seed: number | string): string {\n if (requested && registries().STATE_PLUGINS[requested]) return requested\n const dist = registries().stateDistribution.weights\n if (!dist) return 'normal'\n const x = createRng(seed, registries().stateDistribution.seedKey)()\n let acc = 0\n const keys = Object.keys(dist)\n for (const k of keys) {\n acc += dist[k]\n if (x < acc) return k\n }\n return keys[keys.length - 1]\n}\n\nfunction colorOf(m: Json, seed: number | string): number | string {\n const spec: ItemColor = m.colorSpec || registries().CATALOG[m.type]?.color || { role: 'wood' }\n if ('role' in spec) return spec.role\n if ('hex' in spec) return spec.hex\n return spec.pick[hashString(seed + '|' + (m._seedId ?? m.id)) % spec.pick.length]\n}\n\nfunction applyState(plan: Plan, items: PlacedItem[], ctx: ReturnType<typeof createPlacementContext>, seed: number | string, state: string): PlacedItem[] {\n const plugin = registries().STATE_PLUGINS[state]\n if (!plugin || state === 'normal') return []\n const c: StateContext = {\n plan,\n items,\n seed,\n state,\n rng: createRng(seed, plugin.seedKey ?? 'state:' + state),\n ctx,\n kit: placementKit,\n catalog: registries().CATALOG,\n wallTopHeights: registries().WALL_TOP_HEIGHTS,\n }\n return plugin.apply(c)\n}\n\nconst loc = (key: string | undefined, locale: string, ns: 'labels' | 'facadeColors' = 'labels', vars?: Record<string, string | number>) => (key ? translate(ns, key, locale, vars) : key)\n\n/** Generates a plan: building, lot, seeded item fill, decor, house state and palette. */\nexport function generate(template: string | TemplateDef, options?: FloorplanOptions): Json {\n const tpl = templateOf(template)\n const o = options || {}\n const seed = o.seed == null ? 1 : o.seed\n const locale = o.locale || 'en'\n let op: FloorplanOptions = Object.assign({}, o, { seed })\n const zone = resolveZone(o.zone)\n const adjustments: ZoneAdjustment[] = []\n if (zone) op = clampOptionsToZone(tpl, op, zone, adjustments)\n const plan = buildPlan(tpl, op.w, op.d, op, { zone, adjustments })\n const all = resolveSlots(plan)\n const items: PlacedItem[] = []\n const missing: { room: string; slot: string }[] = []\n for (const room of plan.rooms.concat(plan.zones)) {\n const sl = all.filter((s) => s.room === room.id && s.floor === room.floor)\n const r = fillRoom(plan, room, sl, createRng(seed, STREAM.roomPrefix + (room.seedKey ?? registries().SEED_KEYS.rooms[room.id] ?? room.id)))\n items.push(...r.items)\n missing.push(...r.missing)\n }\n const ctx = runPostProcess(plan, items, seed)\n const state = pickState(o.state, seed)\n const stateItemsAll = applyState(plan, items, ctx, seed, state)\n const colors = palette({ seed, style: plan.style, state })\n const strip = (m: Json) => {\n const x: Json = {}\n for (const k of Object.keys(m)) if (k[0] !== '_' && k !== 'colorSpec') x[k] = m[k]\n return x\n }\n const L = plan.lot\n const lot = L\n ? {\n rect: L.rect.map(r2),\n setback: r2(L.setback),\n backyard: r2(L.backyard),\n sideYard: L.sideYard,\n style: L.style,\n pool: L.pool,\n zones: plan.zones.map((z) => ({ id: z.id, type: z.type, label: z.label, name: loc(z.label, locale), parts: z.parts, ground: z.ground })),\n perimeter: L.perimeter.map((s: Json) => Object.assign({ color: 'wall' }, s)),\n gates: plan.gates.map((g) => ({ id: g.id, type: g.type, model: g.model, u: g.u, v: g.v, axis: g.axis, width: g.width, height: g.height, side: g.side, to: g.to, material: g.material, open: !!g.open, color: 'gate' })),\n paths: plan.paths.map((c) => ({ id: c.id, type: c.type, from: c.from, to: c.to, width: c.width, rects: c.rects, points: c.points })),\n }\n : null\n const facade = Object.assign({}, plan.facade, {\n color: { name: loc(colors.meta.base, locale, 'facadeColors'), key: colors.meta.base, hex: hexString(colors.facade as number) },\n roles: { facade: 'facade', detail: 'facade_detail', roof: 'roof', wall: 'wall', gate: 'gate' },\n })\n const itemsOut = items.map((m) => {\n const out = strip(m)\n out.color = colorOf(m, seed)\n return out\n })\n const stateItemsOut = stateItemsAll.map((m) => {\n const out = strip(m)\n if (m.category) out.color = colorOf(m, seed)\n return out\n })\n const result: Json = {\n template: tpl.id,\n name: translate('templates', tpl.id, locale),\n use: useOf(tpl),\n seed,\n style: plan.style,\n state,\n w: plan.w,\n d: plan.d,\n floors: plan.floors.map((f) => ({ index: f.index, label: f.name, name: f.number != null ? translate('labels', 'floor_n', locale, { n: f.number }) : loc(f.name, locale), number: f.number, y0: f.y0, ceiling: f.ceiling })),\n rooms: plan.rooms.map((c) => ({\n id: c.id,\n type: c.type,\n label: c.label,\n name: loc(c.label, locale),\n floor: c.floor,\n u0: c.parts[0][0],\n v0: c.parts[0][1],\n u1: c.parts[0][2],\n v1: c.parts[0][3],\n parts: c.parts,\n link: c.link,\n ceiling: c.ceiling || plan.floors[c.floor].ceiling,\n color: { wall: 'wall_' + c.type, floor: 'floor_' + c.type },\n })),\n walls: plan.walls,\n doors: plan.doors,\n windows: plan.windows,\n openPairs: ([] as Json[]).concat(...Object.values(plan.openPairs)),\n facade,\n lot,\n items: itemsOut,\n stateItems: stateItemsOut,\n colors,\n building: tpl.building ? tpl.building(plan.w, plan.d, op) : null,\n missing,\n }\n if (tpl.singleFloor) result.floorNumber = op.floor || 3\n result.partyWalls = tpl.partyWalls || []\n if (plan.config) result.config = plan.config\n runResultExtensions(plan, result, seed, op)\n if (zone) {\n const report = { zone: zone.id, adjustments, violations: checkLot(zone, lot, Object.assign({}, result, { rooms: plan.rooms })) }\n result.zoning = report\n }\n return result\n}\n\nconst isSolid = (m: Json) => !m.flat && !m.on && (!m.decor || m.mount === 'floor')\n\n/** Validates a result of `generate`; returns a list of messages (empty when valid). */\nexport function validate(result: Json, options?: { locale?: string }): string[] {\n const locale = options?.locale || result.locale || 'en'\n const t = (key: string, vars: Record<string, string | number>) => translate('messages', key, locale, vars)\n const errors: string[] = []\n const solids: Json[] = result.items.filter(isSolid)\n for (let i = 0; i < solids.length; i++)\n for (let j = i + 1; j < solids.length; j++)\n if (solids[i].floor === solids[j].floor && !solids[i].barricade && !solids[j].barricade && overlaps(solids[i].aabb, solids[j].aabb, 0.011)) errors.push(t('overlap', { a: solids[i].id, b: solids[j].id }))\n for (const m of solids) {\n if (m.barricade) continue\n for (const p of result.doors) if (p.floor === (m.outdoor ? 0 : m.floor) && p.zones.some((z: Json) => overlaps(m.aabb, z, 0.011))) errors.push(t('door_blocked', { id: m.id }))\n if (result.lot) for (const g of result.lot.gates) if (m.outdoor && openingZones(g.u, g.v, 'u', g.width, DOOR_CLEARANCE).some((z) => overlaps(m.aabb, z, 0.011))) errors.push(t('gate_blocked', { id: m.id }))\n }\n for (const f of result.missing) errors.push(t('missing_required', { room: f.room, slot: f.slot }))\n if (result.zoning) for (const v of result.zoning.violations) errors.push(t('zone_violation', { zone: result.zoning.zone, rule: v.rule, actual: v.actual, limit: v.limit }))\n return errors\n}\n\n/** Size limits and default size of a template (they can depend on options such as `tier`). */\nexport function limitsOf(template: string | TemplateDef, options?: FloorplanOptions) {\n const tpl = templateOf(template)\n const op = options || {}\n return { limits: tpl.limitsFn ? tpl.limitsFn(op) : tpl.limits, defaults: tpl.defaultsFn ? tpl.defaultsFn(op) : tpl.defaults }\n}\n\nexport function listTemplates(locale = 'en') {\n return Object.values(registries().TEMPLATES).map((t) => {\n const a = floorsOf(t, {})\n return {\n id: t.id,\n name: translate('templates', t.id, locale),\n use: useOf(t),\n style: typeof t.style === 'function' ? t.style({}) : t.style,\n limits: t.limits,\n defaults: t.defaults,\n floors: a.length,\n floorRange: t.floorRange || null,\n lot: !!t.lot,\n options: t.options || {},\n }\n })\n}\n\n","import { applyPatches, removeIds } from '@adatechnology/game-contracts'\nimport type { DeepPartial } from '@adatechnology/game-contracts'\n\nimport { CAR_CLEARANCE, DOOR_CLEARANCE, DOOR_EDGE_CLEARANCE, OVERHEAD_TOP, PLAYER_RADIUS, WALL_THICKNESS, WINDOW_EDGE_CLEARANCE } from './constants'\nimport { findsAnswer, findsFor } from './extensions'\nimport { generate, limitsOf, listTemplates, slots, validate } from './generate'\nimport { overlaps, openingZones } from './geometry'\nimport { registerGroundItems } from './ground-items'\nimport { listLocales, registerLocale, translate } from './locale'\nimport { HIGH_SATURATION, MIN_FABRIC_FLOOR_CONTRAST, MIN_WALL_FLOOR_CONTRAST, hexString, intToHsl, lstar, palette } from './palette'\nimport { blocksWindow, windowZone } from './queries'\nimport {\n createRegistries,\n getDefaultRegistries,\n listStates,\n registerDecorProfile,\n registerFindsProvider,\n registerGroundOverlay,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerPass,\n registerPaletteStyle,\n registerResultExtension,\n registerRoomColors,\n registerSeedKeys,\n registerState,\n registerStyle,\n registerTemplate,\n registerViewerLayer,\n registerWallTop,\n setStateDistribution,\n withRegistries,\n} from './registry'\nimport type { Registries } from './registry'\nimport { createRng, hashString, mulberry32 } from './rng'\nimport { slotKit } from './slot-kit'\nimport type { FurnitureDef, TemplateDef } from './types'\nimport { checkLot, defineZone, getZone, listZones, registerPermeableGround } from './zoning'\n\nimport enLocale from './locales/en.json'\nimport ptBrLocale from './locales/pt-BR.json'\n\nexport const version = '0.1.0'\n\n/** Registers `packs` and applies `patch` / `remove` over the catalogs, by id. Items are keyed by `type`, templates by `id`. */\nexport type CreateFloorplanOptions = {\n /** Content packs, applied in order: a function `(engine) => void` or an object with `register(engine)`. */\n readonly packs?: readonly FloorplanPack[]\n readonly patch?: { readonly items?: Readonly<Record<string, DeepPartial<FurnitureDef>>>; readonly templates?: Readonly<Record<string, DeepPartial<TemplateDef>>> }\n readonly remove?: { readonly items?: readonly string[]; readonly templates?: readonly string[] }\n}\n\nexport type FloorplanPack = ((engine: FloorplanEngine) => void) | { readonly register: (engine: FloorplanEngine) => void }\n\ntype Keyed = { id: string }\n\nfunction editCatalog<TDef extends object>(catalog: Record<string, TDef>, patch: Readonly<Record<string, DeepPartial<TDef>>> | undefined, remove: readonly string[] | undefined): void {\n if (!patch && !remove) return\n const entries = new Map<string, TDef & Keyed>(Object.entries(catalog).map(([key, definition]) => [key, { ...definition, id: key }]))\n applyPatches(entries, patch as Readonly<Record<string, DeepPartial<TDef & Keyed>>> | undefined)\n removeIds(entries, remove)\n for (const key of Object.keys(catalog)) {\n const edited = entries.get(key)\n if (!edited) delete catalog[key]\n else if (patch && key in patch) {\n const hadId = 'id' in catalog[key]!\n const next: TDef & Partial<Keyed> = { ...edited }\n if (!hadId) delete next.id\n catalog[key] = next\n }\n }\n}\n\nfunction buildEngine(scope: Registries) {\n const scoped = <TFunction extends (...args: never[]) => unknown>(fn: TFunction): TFunction =>\n ((...args: never[]) => withRegistries(scope, () => fn(...args))) as TFunction\n return {\n version,\n generate: scoped(generate),\n slots: scoped(slots),\n validate: scoped(validate),\n palette: scoped(palette),\n limitsOf: scoped(limitsOf),\n listTemplates: scoped(listTemplates),\n listStates: scoped(listStates),\n // content registration\n registerItem: scoped(registerItem),\n registerItems: scoped(registerItems),\n registerLibrary: scoped(registerLibrary),\n registerLibraryAlias: scoped(registerLibraryAlias),\n registerTemplate: scoped(registerTemplate),\n registerStyle: scoped(registerStyle),\n registerPaletteStyle: scoped(registerPaletteStyle),\n registerRoomColors: scoped(registerRoomColors),\n registerDecorProfile: scoped(registerDecorProfile),\n registerPass: scoped(registerPass),\n registerGroundOverlay: scoped(registerGroundOverlay),\n registerWallTop: scoped(registerWallTop),\n registerSeedKeys: scoped(registerSeedKeys),\n registerState: scoped(registerState),\n setStateDistribution: scoped(setStateDistribution),\n registerLocale: scoped(registerLocale),\n registerResultExtension: scoped(registerResultExtension),\n registerFindsProvider: scoped(registerFindsProvider),\n findsFor: scoped(findsFor),\n findsAnswer: scoped(findsAnswer),\n registerViewerLayer: scoped(registerViewerLayer),\n viewerLayers: scope.VIEWER_LAYERS,\n blocksWindow: scoped(blocksWindow),\n // zoning\n defineZone: scoped(defineZone),\n getZone: scoped(getZone),\n listZones: scoped(listZones),\n checkLot: scoped(checkLot),\n registerPermeableGround: scoped(registerPermeableGround),\n // kits and data\n slotKit,\n translate: scoped(translate),\n listLocales: scoped(listLocales),\n templates: scope.TEMPLATES,\n catalog: scope.CATALOG,\n libraries: scope.LIBRARIES,\n styles: scope.STYLES,\n paletteStyles: scope.PALETTE_STYLES,\n createRng,\n mulberry32,\n hashString,\n overlaps,\n windowZone,\n openingZones,\n color: { lstar, hex: hexString, hsl: intToHsl, HIGH_SATURATION, MIN_WALL_FLOOR_CONTRAST, MIN_FABRIC_FLOOR_CONTRAST },\n constants: { WALL_THICKNESS, DOOR_CLEARANCE, PLAYER_RADIUS, DOOR_EDGE_CLEARANCE, WINDOW_EDGE_CLEARANCE, OVERHEAD_TOP, CAR_CLEARANCE },\n }\n}\n\nexport type FloorplanEngine = ReturnType<typeof buildEngine>\n\nfunction seedBase(scope: Registries): void {\n withRegistries(scope, () => {\n registerGroundItems()\n registerPermeableGround('lawn', 'dirt')\n registerLocale('en', enLocale)\n registerLocale('pt-BR', ptBrLocale)\n })\n}\n\n/** An engine of its own: registries, zones and locales are not shared with any other engine on the page. */\nexport function createFloorplan(options: CreateFloorplanOptions = {}): FloorplanEngine {\n const scope = createRegistries()\n seedBase(scope)\n const instance = buildEngine(scope)\n for (const pack of options.packs ?? []) (typeof pack === 'function' ? pack : pack.register)(instance)\n editCatalog(scope.CATALOG, options.patch?.items, options.remove?.items)\n editCatalog(scope.TEMPLATES, options.patch?.templates, options.remove?.templates)\n return instance\n}\n\nlet defaultEngine: FloorplanEngine | undefined\n\n/** The engine the global `engine` stands for, created on first use. Content packs of the old `register(engine)` calls fill this one. */\nexport function defaultFloorplan(): FloorplanEngine {\n if (defaultEngine) return defaultEngine\n seedBase(getDefaultRegistries())\n defaultEngine = buildEngine(getDefaultRegistries())\n return defaultEngine\n}\n","import { registerItems } from './registry'\n\n/** Ground cover types the lot builder can draw. Colours come from the palette roles of the same purpose. */\nexport function registerGroundItems(): void {\n const flat = { category: 'ground_cover', w: 1, d: 1, h: 0, decor: true, mount: 'ground', flat: true } as const\n registerItems([\n { type: 'lawn', ...flat, color: { role: 'lawn' } },\n { type: 'tile_floor', ...flat, color: { role: 'exterior_floor' } },\n { type: 'concrete', ...flat, color: { role: 'exterior_floor' } },\n { type: 'deck_floor', ...flat, color: { role: 'deck_floor' } },\n { type: 'dirt', ...flat, color: { role: 'dirt' } },\n ])\n}\n","import type { SlotDef, SlotKit } from './types'\n\n/** Builders for the slot definitions of a room library. */\nexport const slotKit: SlotKit = {\n wall: (id, side, pos, size, cats, o) => Object.assign({ id, anchor: 'wall', side, pos, size, cats }, o) as SlotDef,\n corner: (id, corner, size, cats, o) => Object.assign({ id, anchor: 'corner', corner, size, cats }, o) as SlotDef,\n center: (id, fx, fz, size, cats, o) => Object.assign({ id, anchor: 'center', fx, fz, size, cats }, o) as SlotDef,\n windowSlot: (id, size, cats, o) => Object.assign({ id, anchor: 'window', size, cats }, o) as SlotDef,\n on: (id, parent, cats, o) => Object.assign({ id, anchor: 'on', on: parent, cats }, o) as SlotDef,\n inside: (id, parent, cats, o) => Object.assign({ id, anchor: 'inside', on: parent, cats }, o) as SlotDef,\n}\n","{\n \"labels\": {\n \"floor_n\": \"Floor {n}\",\n \"parking\": \"Parking\",\n \"garden\": \"Garden\",\n \"backyard\": \"Backyard\",\n \"side_left\": \"Left side\",\n \"side_right\": \"Right side\"\n },\n \"reasons\": {\n \"invalid_parent\": \"invalid parent\",\n \"invalid_side\": \"invalid side\",\n \"blocked_by_door\": \"blocked by a door\",\n \"open_wall\": \"open wall\",\n \"invalid_corner\": \"invalid corner\",\n \"no_window\": \"no window\",\n \"window_outside_room\": \"window outside the room\",\n \"larger_than_room\": \"slot larger than the room\",\n \"unknown_anchor\": \"unknown anchor\"\n },\n \"messages\": {\n \"overlap\": \"Overlap: {a} and {b}\",\n \"door_blocked\": \"Door blocked by {id}\",\n \"gate_blocked\": \"Gate blocked by {id}\",\n \"missing_required\": \"Required item missing: {room}/{slot}\",\n \"zone_violation\": \"Zone {zone}: {rule} is {actual}, limit {limit}\"\n },\n \"ui\": {\n \"title\": \"Floor plan viewer\",\n \"template\": \"Template\",\n \"seed\": \"Seed\",\n \"random_seed\": \"Random\",\n \"state\": \"State\",\n \"style\": \"Style\",\n \"zone\": \"Zone\",\n \"no_zone\": \"No zone (unrestricted)\",\n \"floor\": \"Floor\",\n \"outside\": \"Whole lot\",\n \"language\": \"Language\",\n \"width\": \"Width (m)\",\n \"depth\": \"Depth (m)\",\n \"auto_size\": \"Template default size\",\n \"options\": \"Options\",\n \"opt_floors\": \"Floors\",\n \"opt_elevator\": \"Elevator\",\n \"opt_tier\": \"Tier\",\n \"yes\": \"Yes\",\n \"no\": \"No\",\n \"default\": \"Default\",\n \"show_labels\": \"Labels\",\n \"show_items\": \"Items\",\n \"show_state\": \"State items\",\n \"show_lot\": \"Lot\",\n \"show_grid\": \"Grid\",\n \"legend\": \"Legend\",\n \"summary\": \"Summary\",\n \"rooms\": \"Rooms\",\n \"items\": \"Items\",\n \"state_items\": \"State items\",\n \"missing\": \"Missing required items\",\n \"none\": \"None\",\n \"validation\": \"Validation\",\n \"valid\": \"Valid plan\",\n \"zoning\": \"Zoning\",\n \"adjustments\": \"Adjustments\",\n \"violations\": \"Violations\",\n \"compliant\": \"Compliant with the zone\",\n \"hover\": \"Hover an item for details\",\n \"meters\": \"m\",\n \"use_label\": \"Use\",\n \"unit_floor\": \"Unit floor\",\n \"legend_wall\": \"Wall\",\n \"legend_door\": \"Door\",\n \"legend_window\": \"Window\",\n \"legend_gate\": \"Gate\",\n \"legend_path\": \"Path\",\n \"legend_item\": \"Furniture\",\n \"legend_state\": \"State item (outlined)\",\n \"rule_use\": \"Use not allowed\",\n \"rule_floors\": \"Too many floors\",\n \"rule_height\": \"Too tall\",\n \"rule_setback_front\": \"Front setback too small\",\n \"rule_setback_side\": \"Side setback too small\",\n \"rule_setback_back\": \"Back setback too small\",\n \"rule_min_lot\": \"Lot too small\",\n \"rule_min_frontage\": \"Frontage too narrow\",\n \"rule_coverage\": \"Coverage too high\",\n \"rule_far\": \"Floor area ratio too high\",\n \"rule_permeable\": \"Permeable area too small\",\n \"reason_max_floors\": \"Zone floor limit\",\n \"reason_max_height\": \"Zone height limit\",\n \"reason_setback_front\": \"Zone front setback\",\n \"reason_setback_side\": \"Zone side setback\",\n \"reason_setback_back\": \"Zone back setback\",\n \"reason_permeable_min\": \"Zone permeable area\"\n }\n}\n","{\n \"labels\": {\n \"floor_n\": \"Andar {n}\",\n \"parking\": \"Vaga\",\n \"garden\": \"Jardim\",\n \"backyard\": \"Quintal\",\n \"side_left\": \"Lateral esquerda\",\n \"side_right\": \"Lateral direita\"\n },\n \"reasons\": {\n \"invalid_parent\": \"pai inválido\",\n \"invalid_side\": \"lado inválido\",\n \"blocked_by_door\": \"bloqueado por porta\",\n \"open_wall\": \"parede aberta\",\n \"invalid_corner\": \"canto inválido\",\n \"no_window\": \"sem janela\",\n \"window_outside_room\": \"janela fora do cômodo\",\n \"larger_than_room\": \"slot maior que o cômodo\",\n \"unknown_anchor\": \"âncora desconhecida\"\n },\n \"messages\": {\n \"overlap\": \"Sobreposição: {a} e {b}\",\n \"door_blocked\": \"Porta bloqueada por {id}\",\n \"gate_blocked\": \"Portão bloqueado por {id}\",\n \"missing_required\": \"Item obrigatório ausente: {room}/{slot}\",\n \"zone_violation\": \"Zona {zone}: {rule} é {actual}, limite {limit}\"\n },\n \"ui\": {\n \"title\": \"Visualizador de plantas\",\n \"template\": \"Modelo\",\n \"seed\": \"Semente\",\n \"random_seed\": \"Aleatória\",\n \"state\": \"Estado\",\n \"style\": \"Estilo\",\n \"zone\": \"Zona\",\n \"no_zone\": \"Sem zona (livre)\",\n \"floor\": \"Andar\",\n \"outside\": \"Lote inteiro\",\n \"language\": \"Idioma\",\n \"width\": \"Largura (m)\",\n \"depth\": \"Profundidade (m)\",\n \"auto_size\": \"Tamanho padrão do modelo\",\n \"options\": \"Opções\",\n \"opt_floors\": \"Andares\",\n \"opt_elevator\": \"Elevador\",\n \"opt_tier\": \"Padrão\",\n \"yes\": \"Sim\",\n \"no\": \"Não\",\n \"default\": \"Padrão\",\n \"show_labels\": \"Rótulos\",\n \"show_items\": \"Móveis\",\n \"show_state\": \"Itens de estado\",\n \"show_lot\": \"Lote\",\n \"show_grid\": \"Grade\",\n \"legend\": \"Legenda\",\n \"summary\": \"Resumo\",\n \"rooms\": \"Cômodos\",\n \"items\": \"Móveis\",\n \"state_items\": \"Itens de estado\",\n \"missing\": \"Itens obrigatórios ausentes\",\n \"none\": \"Nenhum\",\n \"validation\": \"Validação\",\n \"valid\": \"Planta válida\",\n \"zoning\": \"Zoneamento\",\n \"adjustments\": \"Ajustes\",\n \"violations\": \"Violações\",\n \"compliant\": \"Em conformidade com a zona\",\n \"hover\": \"Passe o mouse sobre um item para ver detalhes\",\n \"meters\": \"m\",\n \"use_label\": \"Uso\",\n \"unit_floor\": \"Andar da unidade\",\n \"legend_wall\": \"Parede\",\n \"legend_door\": \"Porta\",\n \"legend_window\": \"Janela\",\n \"legend_gate\": \"Portão\",\n \"legend_path\": \"Caminho\",\n \"legend_item\": \"Móvel\",\n \"legend_state\": \"Item de estado (contorno)\",\n \"rule_use\": \"Uso não permitido\",\n \"rule_floors\": \"Andares demais\",\n \"rule_height\": \"Altura excedida\",\n \"rule_setback_front\": \"Recuo frontal insuficiente\",\n \"rule_setback_side\": \"Recuo lateral insuficiente\",\n \"rule_setback_back\": \"Recuo de fundos insuficiente\",\n \"rule_min_lot\": \"Lote pequeno demais\",\n \"rule_min_frontage\": \"Testada estreita demais\",\n \"rule_coverage\": \"Taxa de ocupação excedida\",\n \"rule_far\": \"Coeficiente de aproveitamento excedido\",\n \"rule_permeable\": \"Área permeável insuficiente\",\n \"reason_max_floors\": \"Limite de andares da zona\",\n \"reason_max_height\": \"Limite de altura da zona\",\n \"reason_setback_front\": \"Recuo frontal da zona\",\n \"reason_setback_side\": \"Recuo lateral da zona\",\n \"reason_setback_back\": \"Recuo de fundos da zona\",\n \"reason_permeable_min\": \"Área permeável da zona\"\n }\n}\n","import type { RandomSource } from './types'\n\n/** The page's own seeded generator (mulberry32), so a silhouette drawn from the same seed has the same windows and colours. */\nexport function createSilhouetteRandom(seed: number): RandomSource {\n let state = seed\n return () => {\n state |= 0\n state = (state + 0x6d2b79f5) | 0\n let t = Math.imul(state ^ (state >>> 15), 1 | state)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n","import type { RandomSource, Silhouette, SilhouettePart, SilhouetteWindow } from './types'\n\nconst ROOT = -1\nconst MAX_BOX_RADIUS = 0.15\nconst BOX_RADIUS_RATIO = 0.22\nconst PLAIN_BOX_RADIUS = 0.012\n\ntype Options = { parent?: number; ry?: number; rz?: number; emissive?: boolean }\n\n/** Rounded-box radius the team page gives a box; below 1.2 cm it is a plain box. */\nexport function boxRadius(width: number, height: number, depth: number): number {\n const radius = Math.min(Math.min(width, height, depth) * BOX_RADIUS_RATIO, MAX_BOX_RADIUS)\n return radius < PLAIN_BOX_RADIUS ? 0 : radius\n}\n\n/** Collects the parts of one silhouette; the generators call it the way the team page calls its own helpers. */\nexport function createSilhouetteBuilder(random: RandomSource) {\n const parts: SilhouettePart[] = []\n const windows: SilhouetteWindow[] = []\n const pick = <T>(list: readonly T[]): T => list[Math.floor(random() * list.length)] as T\n const group = (x: number, y: number, z: number, ry = 0, parent = ROOT): number => parts.push({ shape: 'group', parent, x, y, z, ry }) - 1\n const box = (x: number, y: number, z: number, width: number, height: number, depth: number, color: number, o: Options = {}): void => {\n parts.push({ shape: 'box', parent: o.parent ?? ROOT, x, y: y + height / 2, z, width, height, depth, color, emissive: o.emissive ?? false, ry: o.ry ?? 0, rz: o.rz ?? 0, radius: boxRadius(width, height, depth) })\n }\n const prism = (x: number, y: number, z: number, width: number, height: number, depth: number, color: number, parent = ROOT): void => {\n parts.push({ shape: 'prism', parent, x, y, z, width, height, depth, color, ry: 0 })\n }\n const cylinder = (x: number, y: number, z: number, radiusTop: number, radiusBottom: number, height: number, color: number, parent = ROOT, segments = 14): void => {\n parts.push({ shape: 'cylinder', parent, x, y: y + height / 2, z, radiusTop, radiusBottom, height, color, segments })\n }\n const line = (points: [number, number, number][], color: number, parent = ROOT): void => {\n parts.push({ shape: 'line', parent, points, color })\n }\n const sign = (text: string, x: number, y: number, z: number, width: number, height: number, ry: number, colors: { background: string; foreground: string }, parent = ROOT): void => {\n parts.push({ shape: 'sign', parent, x, y, z, width, height, ry, text, ...colors })\n }\n const fence = (x0: number, z0: number, x1: number, z1: number, height: number, color: number, parent = ROOT): void => {\n const length = Math.hypot(x1 - x0, z1 - z0)\n const count = Math.ceil(length / 3)\n for (let index = 0; index <= count; index++) {\n const t = index / count\n cylinder(x0 + (x1 - x0) * t, 0, z0 + (z1 - z0) * t, 0.05, 0.05, height, color, parent, 5)\n }\n for (const level of [height * 0.35, height * 0.65, height * 0.98]) line([[x0, level, z0], [x1, level, z1]], 0x8a8c8e, parent)\n }\n const finish = (footprint: Silhouette['footprint']): Silhouette => ({ parts, windows, footprint })\n return { random, pick, group, box, prism, cylinder, line, sign, fence, windows, finish }\n}\n\nexport type SilhouetteBuilder = ReturnType<typeof createSilhouetteBuilder>\n","import { createSilhouetteBuilder } from './builder'\nimport { createSilhouetteRandom } from './random'\nimport type { RandomSource, Silhouette } from './types'\n\nconst STOREY_HEIGHT = 3\nconst SHOP_AWNING_HEIGHT = 4.5\nconst WINDOW_COLUMN_WIDTH = 2.6\nconst SHOP_SIGNS = ['FARMÁCIA', 'MAGAZINE', 'LOTÉRICA', 'PADARIA', 'ÓTICA', 'CALÇADOS', 'BAR'] as const\nconst SIGN_COLORS = ['#ffd27a', '#e8dfcf', '#c4483b'] as const\nconst DEFAULT_LIT_CHANCE = 0.07\n\nexport type CityBuildingParams = {\n x: number\n z: number\n width: number\n depth: number\n height: number\n color: number\n /** Chance of a ground-floor shop on both long faces; omitted means none. */\n shopChance?: number\n /** Chance that a window is lit. */\n litChance?: number\n random?: RandomSource\n seed?: number\n}\n\n/** City building: block, roof slab, maybe a vent, maybe a shop front, and window instances on the four faces. */\nexport function createCityBuilding(p: CityBuildingParams): Silhouette {\n const random = p.random ?? createSilhouetteRandom(p.seed ?? 7)\n const b = createSilhouetteBuilder(random)\n const { x, z, width: w, depth: d, height: h } = p\n b.box(x, 0, z, w, h, d, p.color)\n b.box(x, h, z, w + 0.3, 0.35, d + 0.3, 0x2a2a2c)\n if (random() < 0.4) b.cylinder(x + (random() - 0.5) * (w - 3), h + 0.35, z + (random() - 0.5) * (d - 3), 0.8, 0.8, 1.4, 0x4b4540)\n const hasShop = p.shopChance !== undefined && p.shopChance > 0 && random() < p.shopChance\n if (hasShop) {\n for (const face of [1, -1]) {\n const zFace = z + face * (d / 2)\n b.box(x, SHOP_AWNING_HEIGHT, zFace + face * 0.8, w, 0.2, 1.6, 0x2a2a2c)\n b.box(x, 0, zFace + face * 0.03, w * 0.6, 3.5, 0.05, 0x4a4c4e)\n const text = b.pick(SHOP_SIGNS)\n b.sign(text, x, 5.3, zFace + face * 0.12, Math.min(w * 0.7, 8), 1, face > 0 ? 0 : Math.PI, { background: '#1a1a1c', foreground: b.pick(SIGN_COLORS) })\n }\n }\n addWindows(b, p, hasShop ? SHOP_AWNING_HEIGHT : 0)\n return b.finish({ x, z, width: w, depth: d, height: h + 0.35 })\n}\n\nfunction addWindows(b: ReturnType<typeof createSilhouetteBuilder>, p: CityBuildingParams, base: number): void {\n const { x, z, width: w, depth: d, height: h } = p\n const floors = Math.max(1, Math.floor((h - 1) / STOREY_HEIGHT))\n const faces: [number, number, number, number][] = [[0, d / 2 + 0.03, w, 0], [0, -d / 2 - 0.03, w, Math.PI], [w / 2 + 0.03, 0, d, Math.PI / 2], [-w / 2 - 0.03, 0, d, -Math.PI / 2]]\n for (const [ox, oz, faceWidth, ry] of faces) {\n const columns = Math.max(1, Math.floor(faceWidth / WINDOW_COLUMN_WIDTH))\n for (let floor = 0; floor < floors; floor++) {\n const y = base + 1.8 + floor * STOREY_HEIGHT\n for (let column = 0; column < columns; column++) {\n const u = (column - (columns - 1) / 2) * WINDOW_COLUMN_WIDTH\n b.windows.push({ x: ox ? x + ox : x + u, y, z: ox ? z + u : z + oz, ry, width: 1.2, height: 1.4, isLit: b.random() < (p.litChance || DEFAULT_LIT_CHANCE) })\n }\n }\n }\n}\n","import { createSilhouetteBuilder } from './builder'\nimport { createSilhouetteRandom } from './random'\nimport type { RandomSource, Silhouette } from './types'\n\nconst LIT_WINDOW = 0xffb45e\nconst DARK_WINDOW = 0x10151b\nconst DEFAULT_ROOF = 0x5a3a2a\n\ntype Seeded = { random?: RandomSource; seed?: number }\n\nconst randomOf = (o: Seeded): RandomSource => o.random ?? createSilhouetteRandom(o.seed ?? 7)\n\n/** Window colour: a lit one glows (emissive), a dark one is a plain dark pane. */\nconst pane = (isLit: boolean) => ({ color: isLit ? LIT_WINDOW : DARK_WINDOW, emissive: isLit })\n\nexport type TwoStoreyParams = Seeded & { x: number; z: number; width: number; depth: number; color: number; roofColor?: number; ry?: number }\n\n/** Two-storey house with a balcony slab, pitched roof and four windows. */\nexport function createTwoStoreyHouse(p: TwoStoreyParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w, depth: d } = p\n const g = b.group(p.x, 0, p.z, p.ry)\n b.box(0, 0, 0, w, 6, d, p.color, { parent: g })\n b.prism(0, 6, 0, w + 0.4, 1.4, d + 0.4, p.roofColor ?? DEFAULT_ROOF, g)\n b.box(0, 3.1, d / 2 + 0.5, w * 0.6, 0.15, 1, 0x6a6a66, { parent: g })\n for (const floor of [0, 1]) {\n for (const side of [-1, 1]) {\n const { color, emissive } = pane(b.random() < 0.12)\n b.box(side * w * 0.26, 1.1 + floor * 3, d / 2 + 0.03, 1.1, 1.2, 0.04, color, { parent: g, emissive })\n }\n }\n b.box(0, 0, d / 2 + 0.02, 1, 2.1, 0.05, 0x2a1d14, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: w, depth: d, height: 7.4 })\n}\n\nexport type SlabHouseParams = Seeded & { x: number; z: number; width: number; depth: number; floors: number; color: number }\n\n/** Reinforced-concrete slab house of one to three floors, with water tank, side stair and sometimes rebar starters. */\nexport function createSlabHouse(p: SlabHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w, depth: d, floors } = p\n const g = b.group(p.x, 0, p.z, 0)\n for (let floor = 0; floor < floors; floor++) {\n const isTop = floor === floors - 1\n b.box(0, floor * 2.9, 0, w, 2.9, d, isTop && b.random() < 0.5 ? 0x9a6a50 : p.color, { parent: g })\n const { color, emissive } = pane(b.random() < 0.1)\n b.box(0, floor * 2.9 + 1.1, d / 2 + 0.03, 1, 1, 0.04, color, { parent: g, emissive })\n }\n b.cylinder(w * 0.25, floors * 2.9, -d * 0.2, 0.55, 0.55, 0.9, 0x2a5aa0, g, 10)\n for (let level = 0; level < floors; level++) b.box(w / 2 + 0.4, level * 2.9, 0, 0.8, 0.18, 1.2, 0x7a7a74, { parent: g })\n if (b.random() < 0.6) for (let index = 0; index < 4; index++) b.box(-w * 0.3 + index * 0.4, floors * 2.9, 0, 0.02, 1, 0.02, 0x8a8a8a, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: w, depth: d, height: floors * 2.9 + 1 })\n}\n\nexport type ColonialParams = Seeded & { x: number; z: number; width: number; color: number; hasDoor: boolean }\n\n/** Colonial terrace house: parapet, roof behind it and a row of doors or windows. */\nexport function createColonialHouse(p: ColonialParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w } = p\n const g = b.group(p.x, 0, p.z, 0)\n b.box(0, 0, 0, w, 4.2, 10, p.color, { parent: g })\n b.box(0, 4.2, 4.6, w, 0.8, 0.25, p.color, { parent: g })\n b.prism(0, 4.2, -0.4, w, 1.4, 9.6, 0x7a4a32, g)\n const count = Math.max(1, Math.floor(w / 2.2))\n for (let index = 0; index < count; index++) {\n const u = (index - (count - 1) / 2) * 2.2\n const isDoor = index === 0 && p.hasDoor\n const lit = isDoor ? false : b.random() < 0.15\n const color = isDoor ? 0x3a2416 : lit ? LIT_WINDOW : 0x2a3a4a\n b.box(u, 1.0, 5.02, 0.9, 2.0, 0.05, color, { parent: g, emissive: lit })\n }\n return b.finish({ x: p.x, z: p.z, width: w, depth: 10, height: 6 })\n}\n\nexport type ChaletParams = Seeded & { x: number; z: number; color?: number; ry?: number }\n\n/** Wooden chalet on a stone base with a steep roof and a chimney. */\nexport function createChalet(p: ChaletParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, p.ry)\n b.box(0, 0, 0, 7, 0.8, 9, 0x5a5650, { parent: g })\n b.box(0, 0.8, 0, 7, 4.2, 9, p.color ?? 0x6b4a30, { parent: g })\n b.prism(0, 5, 0, 7.6, 4, 9.6, 0x2c2a28, g)\n b.box(2.2, 5, -1, 0.8, 4.2, 0.8, 0x5a5650, { parent: g })\n const { color, emissive } = pane(b.random() < 0.3)\n b.box(0, 1.6, 4.52, 1.3, 1.3, 0.04, color, { parent: g, emissive })\n b.box(0, 6.2, 4.6, 1, 1, 0.04, DARK_WINDOW, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: 7.6, depth: 9.6, height: 9 })\n}\n\nexport type CompanyHouseParams = Seeded & { x: number; z: number; color?: number }\n\n/** Company-town house with a low front fence. */\nexport function createCompanyHouse(p: CompanyHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, 0)\n b.box(0, 0, 0, 6, 3, 9, p.color ?? 0xd8d0c0, { parent: g })\n b.prism(0, 3, 0, 6.4, 1.6, 9.4, 0x8a4a32, g)\n b.box(0, 0, 4.52, 0.9, 2.1, 0.05, 0x3a2a1c, { parent: g })\n b.box(1.8, 1.1, 4.52, 1, 1, 0.04, DARK_WINDOW, { parent: g })\n b.fence(-3.2, 6.5, 3.2, 6.5, 0.9, 0xe0d8c8, g)\n return b.finish({ x: p.x, z: p.z, width: 6.4, depth: 13, height: 4.6 })\n}\n\nexport type StiltHouseParams = Seeded & { x: number; z: number; color?: number }\n\n/** House on stilts with a ramp-like entry platform. */\nexport function createStiltHouse(p: StiltHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, 0)\n for (const a of [-2, 2]) for (const c of [-3, 3]) b.cylinder(a, -1.5, c, 0.12, 0.12, 3.1, 0x3a2a1c, g, 6)\n b.box(0, 1.5, 0, 5, 0.2, 7, 0x5a4630, { parent: g })\n b.box(0, 1.7, 0, 4.6, 2.6, 6.4, p.color ?? 0x6a5a46, { parent: g })\n b.prism(0, 4.3, 0, 5.2, 1.1, 7, 0x7a7a78, g)\n b.box(0, 1.5, 5, 1.2, 0.15, 4, 0x5a4630, { parent: g })\n return b.finish({ x: p.x, z: p.z, width: 5.2, depth: 9, height: 5.4 })\n}\n\nexport type FarmhouseParams = Seeded & { x: number; z: number }\n\n/** Farm house with a long covered porch on six posts. */\nexport function createFarmhouse(p: FarmhouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const g = b.group(p.x, 0, p.z, 0)\n b.box(0, 0, 0, 15, 3.2, 11, 0xd8cfb8, { parent: g })\n b.prism(0, 3.2, 0, 17, 2.2, 13, 0x8a4a32, g)\n b.box(0, 0, 6.8, 15, 0.25, 2.6, 0x6a5a46, { parent: g })\n for (let index = 0; index < 6; index++) b.cylinder(-7 + index * 2.8, 0, 7.8, 0.1, 0.1, 3.2, 0x5a4630, g, 6)\n b.box(-3, 1.0, 5.52, 1.2, 1.2, 0.04, LIT_WINDOW, { parent: g, emissive: true })\n return b.finish({ x: p.x, z: p.z, width: 17, depth: 13, height: 5.4 })\n}\n\nexport type DetachedHouseParams = Seeded & { x: number; z: number; width: number; depth: number; color: number; roofColor?: number; ry?: number; isBoarded?: boolean }\n\n/** One-storey detached house; boarded windows get two crossed planks each. */\nexport function createDetachedHouse(p: DetachedHouseParams): Silhouette {\n const b = createSilhouetteBuilder(randomOf(p))\n const { width: w, depth: d } = p\n const g = b.group(p.x, 0, p.z, p.ry)\n b.box(0, 0, 0, w, 3, d, p.color, { parent: g })\n b.prism(0, 3, 0, w + 0.5, 1.6, d + 0.5, p.roofColor ?? DEFAULT_ROOF, g)\n b.box(0, 0, d / 2 + 0.02, 1, 2.1, 0.05, 0x2a1d14, { parent: g })\n for (const side of [-1, 1]) {\n const { color, emissive } = pane(b.random() < 0.15)\n b.box(side * w * 0.28, 1.1, d / 2 + 0.03, 1.1, 1.1, 0.04, color, { parent: g, emissive })\n if (p.isBoarded || b.random() < 0.3) for (const k of [-1, 1]) b.box(side * w * 0.28, 1.5 + k * 0.25, d / 2 + 0.08, 1.3, 0.14, 0.04, 0x6b4a2a, { parent: g, rz: k * 0.15 })\n }\n return b.finish({ x: p.x, z: p.z, width: w + 0.5, depth: d + 0.5, height: 4.6 })\n}\n","import { findsAnswer, findsFor } from './extensions'\nimport { generate, limitsOf, listTemplates, slots, validate } from './generate'\nimport { createFloorplan, defaultFloorplan, version } from './instance'\nimport type { CreateFloorplanOptions, FloorplanEngine, FloorplanPack } from './instance'\nimport { listLocales, registerLocale, translate } from './locale'\nimport { palette } from './palette'\nimport {\n registerViewerLayer,\n listStates,\n registerDecorProfile,\n registerFindsProvider,\n registerGroundOverlay,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerPass,\n registerPaletteStyle,\n registerResultExtension,\n registerRoomColors,\n registerSeedKeys,\n registerState,\n registerStyle,\n registerTemplate,\n registerWallTop,\n setStateDistribution,\n} from './registry'\nimport { createRng, hashString, mulberry32 } from './rng'\nimport { slotKit } from './slot-kit'\nimport { checkLot, defineZone, getZone, listZones, registerPermeableGround } from './zoning'\nimport { overlaps, openingZones } from './geometry'\nimport { blocksWindow, windowZone } from './queries'\n\nexport { version, createFloorplan, defaultFloorplan }\nexport type { CreateFloorplanOptions, FloorplanEngine, FloorplanPack }\n\n/**\n * The global engine. Content packs take it as an argument (`register(engine)`), so that several bundles (ESM or IIFE) fill the same registries.\n * @deprecated use `createFloorplan({ packs, patch, remove })`, an engine of its own, or `defaultFloorplan()` for the shared one.\n */\nexport const engine: FloorplanEngine = defaultFloorplan()\n\nexport {\n generate,\n slots,\n validate,\n palette,\n limitsOf,\n listTemplates,\n listStates,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerTemplate,\n registerStyle,\n registerPaletteStyle,\n registerRoomColors,\n registerDecorProfile,\n registerPass,\n registerGroundOverlay,\n registerWallTop,\n registerSeedKeys,\n registerState,\n setStateDistribution,\n registerLocale,\n registerResultExtension,\n registerFindsProvider,\n findsFor,\n findsAnswer,\n registerViewerLayer,\n blocksWindow,\n translate,\n listLocales,\n defineZone,\n getZone,\n listZones,\n checkLot,\n registerPermeableGround,\n slotKit,\n createRng,\n mulberry32,\n hashString,\n overlaps,\n windowZone,\n openingZones,\n}\nexport type * from './types'\nexport type { PaletteDraw, PaletteEarly, PaletteStyleDef } from './palette'\nexport * from './silhouettes'\n"],"mappings":"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","names":["slots","r","cl","m","rimRect","ceiling","current","limit","palette","rule"]}