@adatechnology/game-floorplan 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/MIGRATION.md +355 -0
- package/README.md +123 -2
- package/dist/index.d.ts +670 -0
- package/dist/index.global.js +2137 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +2112 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/geometry.ts","../src/queries.ts","../src/grid.ts","../src/registry.ts","../src/rng.ts","../src/fill.ts","../src/legacy-seeds.ts","../src/context.ts","../src/locale.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"],"sourcesContent":["import { DOOR_CLEARANCE, WALL_THICKNESS } from './constants'\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 STYLES,\n TEMPLATES,\n listStates,\n registerDecorProfile,\n registerGroundOverlay,\n registerItem,\n registerItems,\n registerLibrary,\n registerLibraryAlias,\n registerPass,\n registerPaletteStyle,\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 { 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 // 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 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 },\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 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'\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","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/** Usable parts: inset only on sides with a real wall (sides open to another part of the same room are not inset). */\nexport function usableParts(room: Room, extra?: number): Rect[] {\n return room.parts.map((p) => {\n const isOpen = (k: number) =>\n room.parts.some(\n (q) =>\n q !== p &&\n (k === 0\n ? eq(q[2], p[0]) && Math.min(q[3], p[3]) - Math.max(q[1], p[1]) > 0.3\n : k === 2\n ? eq(q[0], p[2]) && Math.min(q[3], p[3]) - Math.max(q[1], p[1]) > 0.3\n : k === 1\n ? eq(q[3], p[1]) && Math.min(q[2], p[2]) - Math.max(q[0], p[0]) > 0.3\n : eq(q[1], p[3]) && Math.min(q[2], p[2]) - Math.max(q[0], p[0]) > 0.3),\n )\n const m = MARGIN + (extra || 0)\n return [p[0] + (isOpen(0) ? 0 : m), p[1] + (isOpen(1) ? 0 : m), p[2] - (isOpen(2) ? 0 : m), p[3] - (isOpen(3) ? 0 : m)] as Rect\n })\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'\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 { EPS, MARGIN } from './constants'\nimport { eq, inRect } from './geometry'\nimport type { ItemDef, 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 }\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\nexport const blocksWindow = (it: Pick<ItemDef, 'window'> & { h: number }, win: Json): boolean => !it.window || it.h > 1.0 + EPS || it.h > win.y0 - 0.05\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 { entryPoints, inRect, inner, 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/** Coarse walkability grid of a room. `ignored` lists opening ids to leave out of the entries. */\nexport function createGrid(plan: Plan, room: Room, ignored?: Set<string> | null): Grid {\n const gs = room.outdoor ? 0.3 : 0.2\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 = usableParts(room, 0.08)\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])) 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 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 type {\n DecorPass,\n GroundOverlayRule,\n ItemDef,\n ItemInput,\n Json,\n RoomColorDef,\n SlotLibrary,\n StateContext,\n StatePlugin,\n StyleDef,\n TemplateDef,\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, ItemDef> = {}\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): ItemDef {\n const h = def.h\n const item: ItemDef = Object.assign({ front: '+z', window: h <= 0.95, low: h <= 0.5, flat: false, deck: false, rim: 0 }, def) as ItemDef\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","/** 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 { EPS } from './constants'\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 { ItemDef, Json, PlacedItem, Plan, Rect, Room, Slot, Vec2, Weights } from './types'\n\nfunction candidatesOf(cats: Weights): { it: ItemDef; weight: number }[] {\n const out: { it: ItemDef; 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.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: ItemDef, 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\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 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 : 0.12\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: ItemDef, r: Rect, parent: PlacedItem | null) => {\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 (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): 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 for (const shift of shifts) {\n const r = itemRect(s, it, shift)\n if (!insideUnion(r, inners)) 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) && 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 = null\n if (!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 (!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)\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 && u.required)\n for (const m of applicable) {\n if (tryFit(m, 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 } 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 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 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 shuffle(cand, rng2)) {\n if (!insideUnion(r, inners)) continue\n if (zones.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]), 0.16)) 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 { 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 { MARGIN, TOL, WALL_THICKNESS } 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 { clampLotToZone, enforcePermeability } from './zoning'\nimport type { FloorDef, FloorplanOptions, Json, LotConfig, Plan, Rect, Room, StyleDef, TemplateDef, 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 = { w, d, tpl, floorDefs: FLOOR_DEFS, style: styleId, floors: [], rooms: [], zones: [], doors: [], windows: [], walls: [], gates: [], paths: [], lot: null, openPairs: {} }\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 : 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.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 + 0.12\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.steel ? 'steel' : width > 1.1 ? 'double' : 'single',\n hinge: 'start',\n zones: openingZones(u, v, edge.axis, width, openingDepth(width, leaf)),\n })\n })\n plan.doors.push(...floorDoors)\n const windowsOut: Json[] = []\n ;(A.windows(w, d, op) || []).forEach((windowDef) => {\n const a = byId[windowDef.room]\n if (!a) throw new Error('Window references a missing room: ' + windowDef.room)\n const edge = exteriorEdge(a, windowDef.side, w, d, windowDef.at)\n if (!edge) return\n const width = windowDef.width\n const m0 = edge.a0 + width / 2 + 0.3\n const m1 = edge.a1 - width / 2 - 0.3\n if (m1 < m0 - TOL) return\n const centers = windowDef.n ? Array.from({ length: windowDef.n }, (_, i) => edge.a0 + ((edge.a1 - edge.a0) * (i + 1)) / (windowDef.n! + 1)) : [windowDef.at as number]\n for (const c0 of centers) {\n const c = clamp(c0, m0, m1)\n const u = edge.axis === 'u' ? c : edge.pos\n const v = edge.axis === 'u' ? edge.pos : c\n if (floorDoors.some((p) => p.axis === edge.axis && eq(p.pos, edge.pos) && Math.abs(p.at - c) < (p.width + width) / 2 + 0.15)) continue\n if (windowsOut.some((j) => j.axis === edge.axis && eq(j.pos, edge.pos) && Math.abs(j.at - c) < (j.width + width) / 2 + 0.2)) continue\n windowsOut.push({\n id: 'w' + floorIndex + '_' + windowsOut.length,\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 y0: windowDef.y0 || 1.0,\n y1: windowDef.y1 || 2.15,\n room: windowDef.room,\n side: windowDef.side,\n })\n }\n })\n plan.windows.push(...windowsOut)\n plan.walls.push(...buildWalls(list, floorDoors, A.openPairs || [], floorIndex).map((p) => Object.assign(p, { h: p.h || A.ceiling })))\n })\n buildLot(plan, tpl, w, d, op, style, styleId, bc)\n return plan\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 if (backDepth > 0 && cfg.yardZones) {\n for (const q of cfg.yardZones) 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 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 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' ? 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) => !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 { 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 (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"],"mappings":"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","names":["slots","r","cl","m","rimRect","ceiling","current","limit","palette","ZONES","rule"]}
|