maze-test 0.2.0 → 0.4.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/coordinates.ts","../src/maze.ts","../src/renderer.ts","../src/simulator.ts","../src/trial.ts"],"sourcesContent":["export {\n cell,\n cellKey,\n columnLabel,\n letterNumberCoordinate,\n neighbors,\n rowColumnCoordinate,\n sameCell\n} from \"./coordinates.js\";\nexport {\n analyzeSolidCellMaze,\n decorateSolidCellMaze,\n generateSolidCellMaze,\n isFloor,\n shortestPath,\n terrainAt,\n validateSolidCellMaze\n} from \"./maze.js\";\nexport { renderCharacterMaze } from \"./renderer.js\";\nexport { simulateTrial, stateKey } from \"./simulator.js\";\nexport {\n generateAnswer,\n generateQuestion,\n generateTrial,\n resolveTrialOptions\n} from \"./trial.js\";\nexport type * from \"./types.js\";\n\n/** The npm package name. Retained for compatibility with the initial release. */\nexport const packageName = \"maze-test\";\n","import type { Cell } from \"./types.js\";\n\nexport function cell(row: number, col: number): Cell {\n return { row, col };\n}\n\nexport function cellKey(value: Cell): string {\n return `${value.row},${value.col}`;\n}\n\nexport function sameCell(a: Cell | undefined, b: Cell | undefined): boolean {\n return a?.row === b?.row && a?.col === b?.col;\n}\n\nexport function columnLabel(col: number): string {\n if (!Number.isInteger(col) || col < 1) throw new Error(`Invalid column number: ${col}`);\n let value = col;\n let label = \"\";\n while (value > 0) {\n value -= 1;\n label = String.fromCharCode(65 + (value % 26)) + label;\n value = Math.floor(value / 26);\n }\n return label;\n}\n\nexport function letterNumberCoordinate(value: Cell): string {\n return `${columnLabel(value.col)}${value.row}`;\n}\n\nexport function rowColumnCoordinate(value: Cell): string {\n return `第${value.row}行第${value.col}格`;\n}\n\nexport function neighbors(value: Cell, rows: number, cols: number): Cell[] {\n return [\n cell(value.row - 1, value.col),\n cell(value.row + 1, value.col),\n cell(value.row, value.col - 1),\n cell(value.row, value.col + 1)\n ].filter((item) => item.row >= 1 && item.row <= rows && item.col >= 1 && item.col <= cols);\n}\n","import { cell, cellKey, neighbors, sameCell } from \"./coordinates.js\";\nimport type {\n Cell,\n ChestObject,\n DecorateMazeOptions,\n GenerateMazeOptions,\n KeyObject,\n Maze,\n MazeMetrics,\n MazeObject,\n MazeValidation,\n MedicineObject,\n TrapObject\n} from \"./types.js\";\n\nexport function generateSolidCellMaze(options: GenerateMazeOptions = {}): Maze {\n const rows = oddDimension(options.rows ?? 15, \"rows\");\n const cols = oddDimension(options.cols ?? 15, \"cols\");\n const seed = integerOption(options.seed ?? 1, \"seed\", 0);\n const requestedSeed = integerOption(options.requestedSeed ?? seed, \"requestedSeed\", 0);\n const braid = numberOption(options.braid ?? 0, \"braid\", 0, 1);\n const rng = mulberry32(seed);\n const grid = Array.from({ length: rows }, () => Array<string>(cols).fill(\"#\"));\n const logicalCells: Cell[] = [];\n\n for (let row = 1; row < rows - 1; row += 2) {\n for (let col = 1; col < cols - 1; col += 2) logicalCells.push({ row, col });\n }\n\n const start = logicalCells[randomInt(rng, logicalCells.length)];\n if (!start) throw new Error(\"The maze has no logical cells.\");\n const visited = new Set([cellKey(start)]);\n const stack = [start];\n grid[start.row]![start.col] = \".\";\n\n while (stack.length > 0) {\n const current = stack.at(-1);\n if (!current) break;\n const choices = shuffle(\n rng,\n logicalNeighbors(current, rows, cols).filter((item) => !visited.has(cellKey(item)))\n );\n const next = choices[0];\n if (!next) {\n stack.pop();\n continue;\n }\n grid[(current.row + next.row) / 2]![(current.col + next.col) / 2] = \".\";\n grid[next.row]![next.col] = \".\";\n visited.add(cellKey(next));\n stack.push(next);\n }\n\n braidDeadEnds(grid, braid, rng);\n const terrain = grid.map((row) => row.join(\"\"));\n const first = farthestFloor(cell(2, 2), terrain).cell;\n const second = farthestFloor(first, terrain).cell;\n const maze: Maze = {\n schemaVersion: \"solid-cell-maze-v3@1\",\n id: options.id ?? `solid-maze-${rows}x${cols}-${requestedSeed}`,\n seed,\n requestedSeed,\n rows,\n cols,\n braid,\n coordinateSystem: {\n origin: \"top-left\",\n columns: \"letters-left-to-right\",\n rows: \"numbers-top-to-bottom\"\n },\n terrain,\n entry: first,\n goal: second,\n doors: [],\n objects: [],\n metrics: emptyMetrics(rows, cols)\n };\n maze.metrics = analyzeSolidCellMaze(maze);\n return maze;\n}\n\nexport function decorateSolidCellMaze(maze: Maze, options: DecorateMazeOptions = {}): Maze {\n const result = structuredClone(maze);\n const decorationSeed = integerOption(options.seed ?? maze.seed + 71_311, \"decoration seed\", 0);\n const rng = mulberry32(decorationSeed);\n const mainPath = shortestPath(result, result.entry, result.goal);\n const occupied = new Set([cellKey(result.entry), cellKey(result.goal)]);\n const doorCount = integerOption(\n options.doorCount ?? Math.max(1, Math.floor(result.metrics.floorCells / 120)),\n \"doorCount\",\n 0\n );\n const chestCount = integerOption(options.chestCount ?? 2, \"chestCount\", 0);\n const trapCount = integerOption(options.trapCount ?? 2, \"trapCount\", 0);\n const medicineCount = integerOption(options.medicineCount ?? 2, \"medicineCount\", 0);\n const doorIndices = selectGatingDoorIndices(result, mainPath, doorCount);\n\n result.doors = doorIndices.map((index, doorIndex) => {\n const position = mainPath[index];\n if (!position) throw new Error(`No path cell exists at door index ${index}.`);\n occupied.add(cellKey(position));\n return { id: `door-${doorIndex + 1}`, position, state: \"closed\" as const };\n });\n\n const objects: MazeObject[] = [];\n for (let index = 0; index < result.doors.length; index += 1) {\n const doorIndex = doorIndices[index];\n if (doorIndex === undefined) throw new Error(\"Door index mismatch.\");\n const preferredIndex = Math.max(1, Math.floor(doorIndex * 0.55));\n const position = freePathCellBefore(mainPath, preferredIndex, occupied);\n occupied.add(cellKey(position));\n const key: KeyObject = { id: `key-${index + 1}`, type: \"key\", position };\n objects.push(key);\n }\n\n const degrees = degreeMap(result);\n const deadEnds = shuffle(\n rng,\n floorCells(result).filter(\n (item) => degrees.get(cellKey(item)) === 1 && !occupied.has(cellKey(item))\n )\n );\n\n for (let index = 0; index < chestCount; index += 1) {\n const position = takeFree(deadEnds, result, occupied, rng, \"chest\");\n occupied.add(cellKey(position));\n const chest: ChestObject = {\n id: `chest-${index + 1}`,\n type: \"chest\",\n position,\n treasures: 1 + (index % 3)\n };\n objects.push(chest);\n }\n\n const trapCandidates = shuffle(rng, mainPath.slice(2, -2));\n for (let index = 0; index < trapCount; index += 1) {\n const position = takeFree(trapCandidates, result, occupied, rng, \"trap\");\n occupied.add(cellKey(position));\n const trap: TrapObject = {\n id: `trap-${index + 1}`,\n type: \"trap\",\n position,\n damage: 1\n };\n objects.push(trap);\n }\n\n const medicineCandidates = shuffle(rng, floorCells(result));\n for (let index = 0; index < medicineCount; index += 1) {\n const position = takeFree(medicineCandidates, result, occupied, rng, \"medicine\");\n occupied.add(cellKey(position));\n const medicine: MedicineObject = {\n id: `medicine-${index + 1}`,\n type: \"medicine\",\n position,\n recovery: 1\n };\n objects.push(medicine);\n }\n\n result.objects = objects;\n result.metrics = analyzeSolidCellMaze(result);\n return result;\n}\n\nexport function analyzeSolidCellMaze(maze: Maze): MazeMetrics {\n assertShape(maze);\n const floors = floorCells(maze);\n const graph = adjacency(maze);\n const distances = bfsDistances(maze.entry, graph);\n const degreeValues = [...graph.values()].map((items) => items.length);\n const edgeCount = degreeValues.reduce((sum, value) => sum + value, 0) / 2;\n const mainPath = shortestPath(maze, maze.entry, maze.goal);\n const objectCounts: Partial<Record<MazeObject[\"type\"], number>> = {};\n for (const object of maze.objects ?? []) {\n objectCounts[object.type] = (objectCounts[object.type] ?? 0) + 1;\n }\n return {\n totalCells: maze.rows * maze.cols,\n wallCells: maze.rows * maze.cols - floors.length,\n floorCells: floors.length,\n connectedFloorCells: distances.size,\n connected: distances.size === floors.length,\n floorAdjacencyEdges: edgeCount,\n independentCycles: edgeCount - floors.length + 1,\n deadEnds: degreeValues.filter((value) => value === 1).length,\n junctions: degreeValues.filter((value) => value >= 3).length,\n entryGoalDistance: mainPath.length > 0 ? mainPath.length - 1 : null,\n doorCount: maze.doors.length,\n gatingDoorCount: maze.doors.filter(\n (door) => shortestPath(maze, maze.entry, maze.goal, door.position).length === 0\n ).length,\n objectCounts\n };\n}\n\nexport function validateSolidCellMaze(maze: Maze): MazeValidation {\n const errors: string[] = [];\n try {\n assertShape(maze);\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : String(error)],\n metrics: null\n };\n }\n\n for (let row = 1; row <= maze.rows; row += 1) {\n for (let col = 1; col <= maze.cols; col += 1) {\n const value = terrainAt(maze, cell(row, col));\n if (value !== \"#\" && value !== \".\") errors.push(`Invalid terrain at ${row},${col}: ${value}`);\n if (\n (row === 1 || row === maze.rows || col === 1 || col === maze.cols) &&\n value !== \"#\"\n ) {\n errors.push(`The outer boundary is not a wall at ${row},${col}.`);\n }\n }\n }\n\n if (!isFloor(maze, maze.entry)) errors.push(\"The entry is not on a floor cell.\");\n if (!isFloor(maze, maze.goal)) errors.push(\"The goal is not on a floor cell.\");\n if (sameCell(maze.entry, maze.goal)) errors.push(\"The entry and goal overlap.\");\n const occupied = new Set([cellKey(maze.entry), cellKey(maze.goal)]);\n\n for (const door of maze.doors) {\n if (!isFloor(maze, door.position)) errors.push(`${door.id} is not on a floor cell.`);\n const key = cellKey(door.position);\n if (occupied.has(key)) errors.push(`${door.id} overlaps another feature.`);\n occupied.add(key);\n }\n for (const object of maze.objects) {\n if (!isFloor(maze, object.position)) errors.push(`${object.id} is not on a floor cell.`);\n const key = cellKey(object.position);\n if (occupied.has(key)) errors.push(`${object.id} overlaps another feature.`);\n occupied.add(key);\n }\n\n const metrics = analyzeSolidCellMaze(maze);\n if (!metrics.connected) {\n errors.push(`Floor cells are disconnected: ${metrics.connectedFloorCells}/${metrics.floorCells}.`);\n }\n if (metrics.deadEnds === 0) errors.push(\"The maze has no dead ends.\");\n if (metrics.junctions === 0) errors.push(\"The maze has no junctions.\");\n if (metrics.gatingDoorCount !== metrics.doorCount) {\n errors.push(`${metrics.doorCount - metrics.gatingDoorCount} door(s) can be bypassed.`);\n }\n\n const path = shortestPath(maze, maze.entry, maze.goal);\n const pathIndex = new Map(path.map((item, index) => [cellKey(item), index]));\n for (let index = 0; index < maze.doors.length; index += 1) {\n const door = maze.doors[index];\n if (!door) continue;\n const key = maze.objects.find((item) => item.id === `key-${index + 1}`);\n const doorIndex = pathIndex.get(cellKey(door.position));\n const keyIndex = key ? pathIndex.get(cellKey(key.position)) : undefined;\n if (!key) errors.push(`Missing a key for ${door.id}.`);\n else if (keyIndex === undefined || doorIndex === undefined || keyIndex >= doorIndex) {\n errors.push(`${key.id} is not before ${door.id} on the main path.`);\n }\n }\n return { valid: errors.length === 0, errors, metrics };\n}\n\nexport function shortestPath(\n maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">,\n start: Cell,\n goal: Cell,\n excludedCell: Cell | null = null\n): Cell[] {\n if (excludedCell && (sameCell(start, excludedCell) || sameCell(goal, excludedCell))) return [];\n const graph = adjacency(maze, excludedCell);\n const queue = [start];\n const parent = new Map<string, string | null>([[cellKey(start), null]]);\n const values = new Map([[cellKey(start), start]]);\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const current = queue[queueIndex];\n queueIndex += 1;\n if (!current) break;\n if (sameCell(current, goal)) break;\n for (const next of graph.get(cellKey(current)) ?? []) {\n const key = cellKey(next);\n if (parent.has(key)) continue;\n parent.set(key, cellKey(current));\n values.set(key, next);\n queue.push(next);\n }\n }\n if (!parent.has(cellKey(goal))) return [];\n const path: Cell[] = [];\n let cursor: string | null = cellKey(goal);\n while (cursor !== null) {\n const value = values.get(cursor);\n if (!value) throw new Error(`Could not reconstruct path at ${cursor}.`);\n path.push(value);\n cursor = parent.get(cursor) ?? null;\n }\n return path.reverse();\n}\n\nexport function terrainAt(\n maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">,\n value: Cell\n): string | null {\n if (value.row < 1 || value.row > maze.rows || value.col < 1 || value.col > maze.cols) {\n return null;\n }\n return maze.terrain[value.row - 1]?.[value.col - 1] ?? null;\n}\n\nexport function isFloor(maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">, value: Cell): boolean {\n return terrainAt(maze, value) === \".\";\n}\n\nfunction braidDeadEnds(grid: string[][], braid: number, rng: () => number): void {\n if (braid <= 0) return;\n const rows = grid.length;\n const cols = grid[0]?.length ?? 0;\n const logicalCells: Cell[] = [];\n for (let row = 1; row < rows - 1; row += 2) {\n for (let col = 1; col < cols - 1; col += 2) logicalCells.push({ row, col });\n }\n const deadEnds = shuffle(\n rng,\n logicalCells.filter((value) => openLogicalNeighbors(grid, value).length === 1)\n );\n for (const current of deadEnds) {\n if (rng() > braid) continue;\n const closed = shuffle(\n rng,\n logicalNeighbors(current, rows, cols).filter(\n (next) => grid[(current.row + next.row) / 2]?.[(current.col + next.col) / 2] === \"#\"\n )\n );\n const next = closed[0];\n if (!next) continue;\n grid[(current.row + next.row) / 2]![(current.col + next.col) / 2] = \".\";\n }\n}\n\nfunction openLogicalNeighbors(grid: string[][], current: Cell): Cell[] {\n return logicalNeighbors(current, grid.length, grid[0]?.length ?? 0).filter(\n (next) => grid[(current.row + next.row) / 2]?.[(current.col + next.col) / 2] === \".\"\n );\n}\n\nfunction logicalNeighbors(value: Cell, rows: number, cols: number): Cell[] {\n return [\n { row: value.row - 2, col: value.col },\n { row: value.row + 2, col: value.col },\n { row: value.row, col: value.col - 2 },\n { row: value.row, col: value.col + 2 }\n ].filter((item) => item.row >= 1 && item.row < rows - 1 && item.col >= 1 && item.col < cols - 1);\n}\n\nfunction farthestFloor(start: Cell, terrain: string[]): { cell: Cell; distance: number } {\n const maze = { rows: terrain.length, cols: terrain[0]?.length ?? 0, terrain };\n const graph = adjacency(maze);\n const distances = bfsDistances(start, graph);\n let farthest = start;\n let distance = -1;\n for (const [key, value] of distances) {\n if (value <= distance) continue;\n distance = value;\n farthest = parseCellKey(key);\n }\n return { cell: farthest, distance };\n}\n\nfunction floorCells(maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">): Cell[] {\n const values: Cell[] = [];\n for (let row = 1; row <= maze.rows; row += 1) {\n for (let col = 1; col <= maze.cols; col += 1) {\n if (isFloor(maze, cell(row, col))) values.push(cell(row, col));\n }\n }\n return values;\n}\n\nfunction adjacency(\n maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">,\n excludedCell: Cell | null = null\n): Map<string, Cell[]> {\n const floors = floorCells(maze).filter((item) => !excludedCell || !sameCell(item, excludedCell));\n const floorKeys = new Set(floors.map(cellKey));\n return new Map(\n floors.map((item) => [\n cellKey(item),\n neighbors(item, maze.rows, maze.cols).filter((next) => floorKeys.has(cellKey(next)))\n ])\n );\n}\n\nfunction bfsDistances(start: Cell, graph: Map<string, Cell[]>): Map<string, number> {\n const distances = new Map([[cellKey(start), 0]]);\n const queue = [start];\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const current = queue[queueIndex];\n queueIndex += 1;\n if (!current) break;\n const distance = distances.get(cellKey(current));\n if (distance === undefined) continue;\n for (const next of graph.get(cellKey(current)) ?? []) {\n const key = cellKey(next);\n if (distances.has(key)) continue;\n distances.set(key, distance + 1);\n queue.push(next);\n }\n }\n return distances;\n}\n\nfunction degreeMap(maze: Maze): Map<string, number> {\n return new Map([...adjacency(maze)].map(([key, values]) => [key, values.length]));\n}\n\nfunction selectGatingDoorIndices(maze: Maze, mainPath: Cell[], count: number): number[] {\n if (count === 0) return [];\n const degrees = degreeMap(maze);\n const candidates: number[] = [];\n for (let index = 3; index < mainPath.length - 3; index += 1) {\n const pathCell = mainPath[index];\n if (!pathCell || (degrees.get(cellKey(pathCell)) ?? 0) !== 2) continue;\n if (shortestPath(maze, maze.entry, maze.goal, pathCell).length === 0) candidates.push(index);\n }\n if (candidates.length < count) {\n throw new Error(`Only ${candidates.length} non-bypassable path cells are available for ${count} doors.`);\n }\n const targets = spacedIndices(mainPath.length - 1, count, 0.28, 0.78);\n const selected: number[] = [];\n for (const target of targets) {\n const available = candidates.filter((index) => !selected.includes(index));\n available.sort(\n (left, right) => Math.abs(left - target) - Math.abs(right - target) || left - right\n );\n const candidate = available[0];\n if (candidate === undefined) throw new Error(`Could not place ${count} doors.`);\n selected.push(candidate);\n }\n if (selected.length !== count) throw new Error(`Could not space ${count} doors along the main path.`);\n return selected.sort((left, right) => left - right);\n}\n\nfunction freePathCellBefore(mainPath: Cell[], preferredIndex: number, occupied: Set<string>): Cell {\n for (let distance = 0; distance < mainPath.length; distance += 1) {\n for (const index of [preferredIndex - distance, preferredIndex + distance]) {\n if (index <= 0 || index >= mainPath.length - 1) continue;\n const candidate = mainPath[index];\n if (candidate && !occupied.has(cellKey(candidate))) return candidate;\n }\n }\n throw new Error(\"There is no free path cell on which to place a key.\");\n}\n\nfunction takeFree(\n candidates: Cell[],\n maze: Maze,\n occupied: Set<string>,\n rng: () => number,\n type: string\n): Cell {\n while (candidates.length > 0) {\n const value = candidates.shift();\n if (value && !occupied.has(cellKey(value))) return value;\n }\n const fallback = shuffle(rng, floorCells(maze)).find((item) => !occupied.has(cellKey(item)));\n if (!fallback) throw new Error(`There are not enough free floor cells to place ${type}.`);\n return fallback;\n}\n\nfunction spacedIndices(\n edgeCount: number,\n count: number,\n startRatio: number,\n endRatio: number\n): number[] {\n if (count === 0) return [];\n const values: number[] = [];\n for (let index = 0; index < count; index += 1) {\n const ratio =\n count === 1\n ? (startRatio + endRatio) / 2\n : startRatio + ((endRatio - startRatio) * index) / (count - 1);\n values.push(Math.max(2, Math.min(edgeCount - 2, Math.floor(edgeCount * ratio))));\n }\n return [...new Set(values)];\n}\n\nfunction parseCellKey(key: string): Cell {\n const [row, col] = key.split(\",\").map(Number);\n if (row === undefined || col === undefined) throw new Error(`Invalid cell key: ${key}`);\n return cell(row, col);\n}\n\nfunction assertShape(maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">): void {\n oddDimension(maze.rows, \"rows\");\n oddDimension(maze.cols, \"cols\");\n if (!Array.isArray(maze.terrain) || maze.terrain.length !== maze.rows) {\n throw new Error(\"The terrain row count does not match rows.\");\n }\n if (maze.terrain.some((row) => typeof row !== \"string\" || row.length !== maze.cols)) {\n throw new Error(\"A terrain row does not match cols.\");\n }\n}\n\nfunction oddDimension(value: number, name: string): number {\n integerOption(value, name, 7);\n if (value % 2 === 0) throw new Error(`${name} must be odd.`);\n return value;\n}\n\nfunction integerOption(value: number, name: string, minimum: number): number {\n if (!Number.isInteger(value) || value < minimum) {\n throw new Error(`${name} must be an integer greater than or equal to ${minimum}.`);\n }\n return value;\n}\n\nfunction numberOption(value: number, name: string, minimum: number, maximum: number): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}.`);\n }\n return value;\n}\n\nfunction randomInt(rng: () => number, maximum: number): number {\n return Math.floor(rng() * maximum);\n}\n\nfunction shuffle<T>(rng: () => number, input: readonly T[]): T[] {\n const values = [...input];\n for (let index = values.length - 1; index > 0; index -= 1) {\n const target = randomInt(rng, index + 1);\n const prior = values[index];\n const replacement = values[target];\n if (prior === undefined || replacement === undefined) continue;\n values[index] = replacement;\n values[target] = prior;\n }\n return values;\n}\n\nfunction mulberry32(seed: number): () => number {\n let value = seed >>> 0;\n return () => {\n value += 0x6d2b79f5;\n let mixed = value;\n mixed = Math.imul(mixed ^ (mixed >>> 15), mixed | 1);\n mixed ^= mixed + Math.imul(mixed ^ (mixed >>> 7), mixed | 61);\n return ((mixed ^ (mixed >>> 14)) >>> 0) / 4_294_967_296;\n };\n}\n\nfunction emptyMetrics(rows: number, cols: number): MazeMetrics {\n return {\n totalCells: rows * cols,\n wallCells: rows * cols,\n floorCells: 0,\n connectedFloorCells: 0,\n connected: false,\n floorAdjacencyEdges: 0,\n independentCycles: 0,\n deadEnds: 0,\n junctions: 0,\n entryGoalDistance: null,\n doorCount: 0,\n gatingDoorCount: 0,\n objectCounts: {}\n };\n}\n","import { cell, cellKey, columnLabel, sameCell } from \"./coordinates.js\";\nimport { terrainAt } from \"./maze.js\";\nimport type { Language, Maze } from \"./types.js\";\n\nconst SYMBOLS = { key: \"K\", chest: \"B\", trap: \"T\", medicine: \"H\" } as const;\n\nexport function renderCharacterMaze(maze: Maze, language: Language = \"en\"): string {\n const rowWidth = String(maze.rows).length;\n const prefix = \" \".repeat(rowWidth + 1);\n const objects = new Map(\n maze.objects.map((item) => [cellKey(item.position), SYMBOLS[item.type]])\n );\n const doors = new Set(maze.doors.map((item) => cellKey(item.position)));\n const heading = Array.from({ length: maze.cols }, (_, index) =>\n center(columnLabel(index + 1), 2)\n ).join(\"\");\n const lines = [`${prefix}${heading}`.trimEnd()];\n for (let row = 1; row <= maze.rows; row += 1) {\n let line = `${String(row).padStart(rowWidth, \" \")} `;\n for (let col = 1; col <= maze.cols; col += 1) {\n const position = cell(row, col);\n let symbol = \" \";\n if (terrainAt(maze, position) === \"#\") symbol = \"█\";\n else if (sameCell(position, maze.entry)) symbol = \"S\";\n else if (sameCell(position, maze.goal)) symbol = \"G\";\n else if (doors.has(cellKey(position))) symbol = \"D\";\n else symbol = objects.get(cellKey(position)) ?? \" \";\n line += symbol === \"█\" ? \"██\" : `${symbol} `;\n }\n lines.push(line.trimEnd());\n }\n lines.push(\"\");\n lines.push(\n language === \"zh\"\n ? \"图例:实心方块为墙格;空白为通路格;S入口;G终点;D门;K钥匙;B宝箱;T陷阱;H药品房。左上角为A1。\"\n : \"Legend: solid blocks are walls; blank cells are passages; S entry; G goal; D door; K key; B chest; T trap; H medicine room. The top-left cell is A1.\"\n );\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction center(value: string, width: number): string {\n const left = Math.floor((width - value.length) / 2);\n return `${\" \".repeat(Math.max(0, left))}${value}${\" \".repeat(\n Math.max(0, width - value.length - left)\n )}`;\n}\n","import { cell, cellKey, letterNumberCoordinate, sameCell } from \"./coordinates.js\";\nimport { terrainAt } from \"./maze.js\";\nimport type {\n BlockedReason,\n Direction,\n InitialState,\n Maze,\n SimulationResult,\n TrialEvent,\n TrialState,\n TrialTraceItem\n} from \"./types.js\";\n\nconst DELTAS: Record<Direction, readonly [number, number]> = {\n up: [-1, 0],\n down: [1, 0],\n left: [0, -1],\n right: [0, 1]\n};\n\nexport function simulateTrial(\n maze: Maze,\n actions: readonly Direction[],\n initial: Partial<InitialState> = {}\n): SimulationResult {\n const health = initial.health ?? 5;\n const state: TrialState = {\n position: structuredClone(maze.entry),\n health,\n healthMax: initial.healthMax ?? health,\n keys: initial.keys ?? 0,\n treasures: initial.treasures ?? 0,\n alive: health > 0,\n reachedGoal: false,\n openedDoors: [],\n collectedKeys: [],\n openedChests: [],\n triggeredTraps: [],\n usedMedicines: []\n };\n const trace: TrialTraceItem[] = [];\n for (let index = 0; index < actions.length; index += 1) {\n const direction = actions[index];\n if (!direction) continue;\n trace.push(executeStep(maze, state, direction, index + 1));\n }\n return {\n state: structuredClone(state),\n trace,\n answers: {\n finalPosition: letterNumberCoordinate(state.position),\n keys: state.keys,\n treasures: state.treasures,\n health: state.health,\n alive: state.alive,\n reachedGoal: state.reachedGoal,\n openedDoors: state.openedDoors.length,\n openedChests: state.openedChests.length,\n triggeredTraps: state.triggeredTraps.length,\n usedMedicines: state.usedMedicines.length,\n blockedMoves: trace.filter((item) => !item.moved).length,\n blockedAfterDeath: trace.filter((item) => item.reason === \"dead\").length\n }\n };\n}\n\nfunction executeStep(\n maze: Maze,\n state: TrialState,\n direction: Direction,\n step: number\n): TrialTraceItem {\n const before = structuredClone(state);\n const events: TrialEvent[] = [];\n if (!state.alive) return record(step, direction, before, state, false, \"dead\", events);\n\n const [dr, dc] = DELTAS[direction];\n const target = cell(state.position.row + dr, state.position.col + dc);\n if (terrainAt(maze, target) !== \".\") {\n return record(step, direction, before, state, false, \"wall-or-outside\", events);\n }\n\n const door = maze.doors.find((item) => sameCell(item.position, target));\n if (door && !state.openedDoors.includes(door.id)) {\n if (state.keys <= 0) {\n return record(\n step,\n direction,\n before,\n state,\n false,\n \"closed-door-without-key\",\n events\n );\n }\n state.keys -= 1;\n state.openedDoors.push(door.id);\n events.push({ type: \"open-door\", id: door.id, keyCost: 1 });\n }\n\n state.position = target;\n const object = maze.objects.find((item) => sameCell(item.position, target));\n if (object?.type === \"key\" && !state.collectedKeys.includes(object.id)) {\n state.collectedKeys.push(object.id);\n state.keys += 1;\n events.push({ type: \"collect-key\", id: object.id });\n }\n if (object?.type === \"chest\" && !state.openedChests.includes(object.id)) {\n if (state.keys > 0) {\n state.keys -= 1;\n state.openedChests.push(object.id);\n state.treasures += object.treasures;\n events.push({\n type: \"open-chest\",\n id: object.id,\n keyCost: 1,\n treasures: object.treasures\n });\n } else {\n events.push({ type: \"pass-closed-chest\", id: object.id });\n }\n }\n if (object?.type === \"trap\" && !state.triggeredTraps.includes(object.id)) {\n state.triggeredTraps.push(object.id);\n state.health = Math.max(0, state.health - object.damage);\n events.push({ type: \"trigger-trap\", id: object.id, damage: object.damage });\n }\n if (object?.type === \"medicine\" && !state.usedMedicines.includes(object.id)) {\n state.usedMedicines.push(object.id);\n const prior = state.health;\n state.health = Math.min(state.healthMax, state.health + object.recovery);\n events.push({ type: \"use-medicine\", id: object.id, recovery: state.health - prior });\n }\n if (state.health <= 0 && state.alive) {\n state.alive = false;\n events.push({ type: \"die\" });\n }\n if (sameCell(state.position, maze.goal) && !state.reachedGoal) {\n state.reachedGoal = true;\n events.push({ type: \"reach-goal\" });\n }\n return record(step, direction, before, state, true, null, events);\n}\n\nfunction record(\n step: number,\n direction: Direction,\n before: TrialState,\n state: TrialState,\n moved: boolean,\n reason: BlockedReason | null,\n events: TrialEvent[]\n): TrialTraceItem {\n return {\n step,\n direction,\n before,\n moved,\n reason,\n events,\n after: structuredClone(state)\n };\n}\n\nexport function stateKey(state: TrialState): string {\n return [\n cellKey(state.position),\n state.health,\n state.healthMax,\n state.keys,\n state.treasures,\n state.alive,\n state.reachedGoal,\n [...state.openedDoors].sort().join(\",\"),\n [...state.collectedKeys].sort().join(\",\"),\n [...state.openedChests].sort().join(\",\"),\n [...state.triggeredTraps].sort().join(\",\"),\n [...state.usedMedicines].sort().join(\",\")\n ].join(\"|\");\n}\n","import { cell, columnLabel, letterNumberCoordinate } from \"./coordinates.js\";\nimport {\n decorateSolidCellMaze,\n generateSolidCellMaze,\n shortestPath,\n terrainAt,\n validateSolidCellMaze\n} from \"./maze.js\";\nimport { simulateTrial } from \"./simulator.js\";\nimport type {\n Cell,\n Direction,\n InitialState,\n Language,\n Maze,\n MazeTrial,\n ResolvedTrialOptions,\n ScenarioKind,\n TrialAnswers,\n TrialOptions,\n TrialSections\n} from \"./types.js\";\n\nconst DIRECTIONS: Record<Direction, { en: string; zh: string }> = {\n up: { en: \"up\", zh: \"上\" },\n down: { en: \"down\", zh: \"下\" },\n left: { en: \"left\", zh: \"左\" },\n right: { en: \"right\", zh: \"右\" }\n};\n\nconst ENGLISH_RULES = [\n \"The explorer can move only one cell at a time to an orthogonally adjacent cell. An instruction to move several cells is executed as that many consecutive one-cell moves.\",\n \"If the next cell is a wall or outside the map, the explorer stays in place, and the remaining actions continue.\",\n \"A closed door occupies a whole cell. To enter it, the explorer must spend one key; the door then stays open. Without a key, the explorer stays in place.\",\n \"The first time the explorer enters a cell containing a key, they collect it. A key cannot be collected twice.\",\n \"The first time the explorer enters a cell containing an unopened chest, one key is spent to open it if a key is available. Without a key, the explorer may pass through but does not open the chest.\",\n \"A trap removes one health point the first time it is entered and has no effect afterward.\",\n \"A medicine room restores one health point the first time it is entered, without exceeding maximum health, and has no effect afterward.\",\n \"When health reaches zero, the explorer dies. All remaining moves are still read but cannot change any state.\",\n \"Once the explorer enters the goal cell, reached-goal remains true even if the explorer later leaves it.\"\n];\n\nconst CHINESE_RULES = [\n \"探险者每次只能向上、下、左、右相邻的一格移动;“向某方向移动若干格”依次执行相应次数的单格移动。\",\n \"如果一次移动的目标是墙格或超出地图,探险者停在原地,但后续行动仍然继续。\",\n \"门占据一个完整格子。目标格是关闭的门时,探险者若持有钥匙,就消耗一把钥匙、打开该门并进入门格;没有钥匙则停在原地。已经打开的门可以直接进入。\",\n \"探险者第一次进入某把钥匙所在的格子时取得该钥匙,钥匙数增加一;同一把钥匙不能重复取得。\",\n \"探险者第一次进入尚未打开的宝箱格且持有钥匙时,消耗一把钥匙、打开宝箱并取得其中全部宝物;没有钥匙时可以经过该格,但不能打开宝箱。\",\n \"探险者第一次进入某个陷阱格时减少一点健康值;同一陷阱以后不再生效。\",\n \"仍然存活的探险者第一次进入某个药品房时恢复一点健康值,但不得超过健康上限;同一药品房以后不再生效。\",\n \"健康值降为零时探险者死亡。死亡以后,所有尚未执行的移动都不再改变任何状态。\",\n \"探险者一旦进入终点格,就把“曾经到达终点”记录为真;以后即使离开终点,该记录仍然保持为真。\"\n];\n\nconst ENGLISH_QUESTIONS = [\n \"Which cell is the explorer in after all actions are complete?\",\n \"How many keys does the explorer have at the end?\",\n \"How many treasures has the explorer collected at the end?\",\n \"How many health points does the explorer have at the end?\",\n \"Is the explorer alive at the end?\",\n \"Did the explorer ever reach the goal?\",\n \"How many doors were opened?\",\n \"How many chests were opened?\",\n \"How many traps were triggered?\",\n \"How many medicine rooms were used?\",\n \"How many individual moves did not change the explorer's position?\"\n];\n\nconst CHINESE_QUESTIONS = [\n \"全部行动结束后,探险者位于哪一格?\",\n \"探险者最后持有几把钥匙?\",\n \"探险者最后取得了几件宝物?\",\n \"探险者最后还剩几点健康值?\",\n \"探险者最后是否仍然存活?\",\n \"行动过程中,探险者是否曾经到达终点?\",\n \"行动过程中一共打开了几道门?\",\n \"行动过程中一共打开了几只宝箱?\",\n \"行动过程中一共触发了几个陷阱?\",\n \"行动过程中一共使用了几个药品房?\",\n \"行动过程中共有多少次移动没有改变探险者的位置?\"\n];\n\nexport function generateTrial(options: TrialOptions = {}): MazeTrial {\n const resolved = resolveTrialOptions(options);\n const maze = selectMaze(resolved);\n const plan = buildScenarioPlan(maze, resolved.scenario);\n const result = simulateTrial(maze, plan.actions, plan.initialState);\n verifyScenario(resolved.scenario, result.answers, maze);\n const sections: TrialSections = {\n map: renderMapDescription(maze, plan.initialState, resolved.language, resolved.style),\n rules: renderRules(resolved.language),\n actions: renderActionDescription(plan.actions, resolved.language, resolved.style),\n questions: renderQuestions(resolved.language)\n };\n const question = renderQuestion(resolved, maze, sections);\n const answer = renderAnswer(resolved, maze, result.answers, plan.actions.length);\n return {\n schemaVersion: \"maze-test-trial@1\",\n options: resolved,\n maze,\n initialState: plan.initialState,\n actions: plan.actions,\n sections,\n question,\n answer,\n result\n };\n}\n\nexport function generateQuestion(options: TrialOptions = {}): string {\n return generateTrial(options).question;\n}\n\nexport function generateAnswer(options: TrialOptions = {}): string {\n return generateTrial(options).answer;\n}\n\nexport function resolveTrialOptions(options: TrialOptions = {}): ResolvedTrialOptions {\n const scenario = options.scenario ?? \"success\";\n const language = options.language ?? \"en\";\n if (![\"success\", \"treasure-and-leave\", \"death-and-stop\"].includes(scenario)) {\n throw new Error(`Unknown scenario: ${scenario}`);\n }\n if (language !== \"en\" && language !== \"zh\") throw new Error(`Unknown language: ${language}`);\n const resolved: ResolvedTrialOptions = {\n seed: integer(options.seed ?? 1, \"seed\", 0),\n rows: oddInteger(options.rows ?? 15, \"rows\", 7),\n cols: oddInteger(options.cols ?? 15, \"cols\", 7),\n braid: finiteNumber(options.braid ?? 0, \"braid\", 0, 1),\n doorCount: integer(options.doorCount ?? 1, \"doorCount\", 0),\n chestCount: integer(options.chestCount ?? 2, \"chestCount\", 0),\n trapCount: integer(options.trapCount ?? 2, \"trapCount\", 0),\n medicineCount: integer(options.medicineCount ?? 2, \"medicineCount\", 0),\n scenario,\n language,\n style: integer(options.style ?? 0, \"style\", 0),\n minDistance: integer(options.minDistance ?? 0, \"minDistance\", 0),\n maxAttempts: integer(options.maxAttempts ?? 500, \"maxAttempts\", 1)\n };\n if (scenario === \"treasure-and-leave\" && resolved.chestCount < 1) {\n throw new Error(\"The treasure-and-leave scenario requires at least one chest.\");\n }\n if (scenario === \"treasure-and-leave\" && resolved.medicineCount < 1) {\n throw new Error(\"The treasure-and-leave scenario requires at least one medicine room.\");\n }\n if (scenario === \"death-and-stop\" && resolved.trapCount < 1) {\n throw new Error(\"The death-and-stop scenario requires at least one trap.\");\n }\n return resolved;\n}\n\nfunction selectMaze(options: ResolvedTrialOptions): Maze {\n let lastError: unknown = null;\n for (let offset = 0; offset < options.maxAttempts; offset += 1) {\n const effectiveSeed = options.seed + offset;\n try {\n const base = generateSolidCellMaze({\n rows: options.rows,\n cols: options.cols,\n braid: options.braid,\n seed: effectiveSeed,\n requestedSeed: options.seed,\n id: `maze-test-${options.rows}x${options.cols}-${options.seed}`\n });\n const maze = decorateSolidCellMaze(base, {\n seed: effectiveSeed + 80_000,\n doorCount: options.doorCount,\n chestCount: options.chestCount,\n trapCount: options.trapCount,\n medicineCount: options.medicineCount\n });\n const validation = validateSolidCellMaze(maze);\n if (!validation.valid) throw new Error(validation.errors.join(\" \"));\n if ((validation.metrics?.entryGoalDistance ?? 0) < options.minDistance) {\n throw new Error(`The entry-goal distance is below ${options.minDistance}.`);\n }\n const plan = buildScenarioPlan(maze, options.scenario);\n const result = simulateTrial(maze, plan.actions, plan.initialState);\n verifyScenario(options.scenario, result.answers, maze);\n return maze;\n } catch (error) {\n lastError = error;\n }\n }\n const detail = lastError instanceof Error ? ` Last error: ${lastError.message}` : \"\";\n throw new Error(\n `Could not generate a valid trial in ${options.maxAttempts} deterministic attempts.${detail}`\n );\n}\n\nfunction buildScenarioPlan(\n maze: Maze,\n scenario: ScenarioKind\n): { initialState: InitialState; actions: Direction[] } {\n if (scenario === \"success\") {\n return {\n initialState: { health: 5, healthMax: 5, keys: 0, treasures: 0 },\n actions: pathToActions(shortestPath(maze, maze.entry, maze.goal))\n };\n }\n if (scenario === \"treasure-and-leave\") {\n const medicine = maze.objects.find((item) => item.type === \"medicine\");\n const chest = maze.objects.find((item) => item.type === \"chest\");\n if (!medicine || !chest) throw new Error(\"This scenario requires a medicine room and a chest.\");\n const path1 = shortestPath(maze, maze.entry, medicine.position);\n const path2 = shortestPath(maze, medicine.position, chest.position);\n const path3 = shortestPath(maze, chest.position, maze.goal);\n const leavePath = [...path3].reverse().slice(0, Math.min(10, path3.length));\n let actions = [\n ...pathToActions(path1),\n ...pathToActions(path2),\n ...pathToActions(path3),\n ...pathToActions(leavePath)\n ];\n const initialState = {\n health: 3,\n healthMax: 5,\n keys: maze.doors.length + 2,\n treasures: 0\n };\n const beforeBump = simulateTrial(maze, actions, initialState);\n const bump = wallDirection(maze, beforeBump.state.position);\n if (bump) actions = [...actions, bump, bump];\n return { initialState, actions };\n }\n const trap = maze.objects.find((item) => item.type === \"trap\");\n if (!trap) throw new Error(\"This scenario requires a trap.\");\n const toTrap = shortestPath(maze, maze.entry, trap.position);\n const afterTrap = shortestPath(maze, trap.position, maze.goal).slice(0, 14);\n return {\n initialState: {\n health: 1,\n healthMax: 1,\n keys: maze.doors.length + 1,\n treasures: 0\n },\n actions: [...pathToActions(toTrap), ...pathToActions(afterTrap)]\n };\n}\n\nfunction verifyScenario(scenario: ScenarioKind, answers: TrialAnswers, maze: Maze): void {\n if (\n scenario === \"success\" &&\n (!answers.reachedGoal || !answers.alive || answers.finalPosition !== letterNumberCoordinate(maze.goal))\n ) {\n throw new Error(\"The success scenario did not finish alive at the goal.\");\n }\n if (\n scenario === \"treasure-and-leave\" &&\n (!answers.reachedGoal ||\n answers.finalPosition === letterNumberCoordinate(maze.goal) ||\n answers.openedChests < 1 ||\n answers.usedMedicines < 1 ||\n answers.blockedMoves < 2)\n ) {\n throw new Error(\"The treasure-and-leave scenario did not meet its invariants.\");\n }\n if (scenario === \"death-and-stop\" && (answers.alive || answers.blockedAfterDeath < 5)) {\n throw new Error(\"The death-and-stop scenario did not meet its invariants.\");\n }\n}\n\nfunction renderQuestion(\n options: ResolvedTrialOptions,\n maze: Maze,\n sections: TrialSections\n): string {\n const isZh = options.language === \"zh\";\n const title = isZh ? \"迷宫试题\" : \"Maze Trial\";\n const labels = isZh\n ? [\"地图描述\", \"机制描述\", \"行动描述\", \"问题\"]\n : [\"Map\", \"Rules\", \"Actions\", \"Questions\"];\n const seedLine =\n maze.seed === options.seed\n ? `${isZh ? \"种子\" : \"Seed\"}: ${options.seed}`\n : `${isZh ? \"种子\" : \"Seed\"}: ${options.seed} (${isZh ? \"有效迷宫种子\" : \"effective maze seed\"}: ${maze.seed})`;\n return [\n `# ${title}`,\n \"\",\n seedLine,\n \"\",\n `## 1. ${labels[0]}`,\n \"\",\n sections.map,\n \"\",\n `## 2. ${labels[1]}`,\n \"\",\n sections.rules,\n \"\",\n `## 3. ${labels[2]}`,\n \"\",\n sections.actions,\n \"\",\n `## 4. ${labels[3]}`,\n \"\",\n sections.questions,\n \"\"\n ].join(\"\\n\");\n}\n\nfunction renderAnswer(\n options: ResolvedTrialOptions,\n maze: Maze,\n answers: TrialAnswers,\n actionCount: number\n): string {\n const zh = options.language === \"zh\";\n const rows = zh\n ? [\n [\"最终位置\", answers.finalPosition],\n [\"最终钥匙数\", answers.keys],\n [\"最终宝物数\", answers.treasures],\n [\"最终健康值\", answers.health],\n [\"是否存活\", answers.alive ? \"是\" : \"否\"],\n [\"是否曾到达终点\", answers.reachedGoal ? \"是\" : \"否\"],\n [\"打开的门\", answers.openedDoors],\n [\"打开的宝箱\", answers.openedChests],\n [\"触发的陷阱\", answers.triggeredTraps],\n [\"使用的药品房\", answers.usedMedicines],\n [\"未改变位置的移动\", answers.blockedMoves]\n ]\n : [\n [\"Final position\", answers.finalPosition],\n [\"Keys remaining\", answers.keys],\n [\"Treasures collected\", answers.treasures],\n [\"Health remaining\", answers.health],\n [\"Alive\", answers.alive ? \"Yes\" : \"No\"],\n [\"Ever reached the goal\", answers.reachedGoal ? \"Yes\" : \"No\"],\n [\"Doors opened\", answers.openedDoors],\n [\"Chests opened\", answers.openedChests],\n [\"Traps triggered\", answers.triggeredTraps],\n [\"Medicine rooms used\", answers.usedMedicines],\n [\"Moves that did not change position\", answers.blockedMoves]\n ];\n return [\n `# ${zh ? \"标准答案\" : \"Answer Key\"}`,\n \"\",\n `${zh ? \"种子\" : \"Seed\"}: ${options.seed}`,\n ...(maze.seed === options.seed\n ? []\n : [\n `${zh ? \"有效迷宫种子\" : \"Effective maze seed\"}: ${maze.seed}`\n ]),\n \"\",\n `| ${zh ? \"问题\" : \"Item\"} | ${zh ? \"答案\" : \"Answer\"} |`,\n \"|---|---|\",\n ...rows.map(([label, value]) => `| ${label} | ${String(value)} |`),\n \"\",\n `${zh ? \"原子行动数\" : \"Atomic action count\"}: ${actionCount}`,\n \"\"\n ].join(\"\\n\");\n}\n\nfunction renderMapDescription(\n maze: Maze,\n initial: InitialState,\n language: Language,\n style: number\n): string {\n const terrain = renderTerrainDescription(maze, language, style);\n const objects = renderObjectDescription(maze, language);\n if (language === \"zh\") {\n return [\n `这是一座${maze.rows}行${maze.cols}列的迷宫。左上角为A1,列从左向右依次标为A至${columnLabel(maze.cols)},行从上向下编号为1至${maze.rows}。`,\n `入口位于${letterNumberCoordinate(maze.entry)},终点位于${letterNumberCoordinate(maze.goal)}。`,\n \"\",\n terrain,\n \"\",\n \"迷宫中的门和其他对象分布如下。门本身占据一个完整格子。\",\n objects,\n \"\",\n `迷宫中有一名探险者。他从入口出发,初始健康值为${numberZh(initial.health)}点,健康上限为${numberZh(initial.healthMax)}点;${initialPossessions(initial, language)},尚未到达终点。`\n ].join(\"\\n\");\n }\n return [\n `This maze has ${maze.rows} rows and ${maze.cols} columns. The top-left cell is A1. Columns run left to right from A to ${columnLabel(maze.cols)}, and rows run top to bottom from 1 to ${maze.rows}.`,\n `The entry is at ${letterNumberCoordinate(maze.entry)}, and the goal is at ${letterNumberCoordinate(maze.goal)}.`,\n \"\",\n terrain,\n \"\",\n \"Doors and other objects are distributed as follows. Each door occupies a whole cell.\",\n objects,\n \"\",\n `An explorer starts at the entry with ${initial.health} health point${plural(initial.health)}, a maximum health of ${initial.healthMax}, ${initialPossessions(initial, language)}, and reached-goal set to false.`\n ].join(\"\\n\");\n}\n\nfunction renderTerrainDescription(maze: Maze, language: Language, style: number): string {\n const clauses = Array.from({ length: maze.rows }, (_, index) => index + 1).map((row) => {\n const kinds = Array.from({ length: maze.cols }, (_, index) =>\n terrainAt(maze, cell(row, index + 1)) === \".\" ? \"floor\" : \"wall\"\n );\n const label =\n language === \"zh\"\n ? [`第${row}行`, `${row}、`, `(${row})`][style % 3]\n : `Row ${row}: `;\n return `${label ?? `第${row}行`}${describeTerrainLine(kinds, language)}`;\n });\n return language === \"zh\"\n ? [\"每行内部的格子均从左往右计数。从上往下,各行的格子情况如下:\", `${clauses.join(\";\\n\")}。`].join(\"\\n\")\n : [\"Within each row, cells are counted from left to right:\", `${clauses.join(\";\\n\")}.`].join(\"\\n\");\n}\n\nfunction describeTerrainLine(kinds: string[], language: Language): string {\n const walls: number[] = [];\n const floors: number[] = [];\n for (let index = 0; index < kinds.length; index += 1) {\n (kinds[index] === \"wall\" ? walls : floors).push(index + 1);\n }\n if (language === \"zh\") {\n if (walls.length === 0) return \"都是通路\";\n if (floors.length === 0) return \"都是墙壁\";\n const limit = Math.floor(kinds.length / 3);\n if (walls.length <= limit) return `除了${positionList(walls, language)}是墙壁以外,其余都是通路`;\n if (floors.length <= limit) return `除了${positionList(floors, language)}是通路以外,其余都是墙壁`;\n return `${positionList(walls, language)}是墙壁,${positionList(floors, language)}是通路`;\n }\n if (walls.length === 0) return \"all cells are passages\";\n if (floors.length === 0) return \"all cells are walls\";\n const limit = Math.floor(kinds.length / 3);\n if (walls.length <= limit) return `all cells are passages except ${positionList(walls, language)}, which ${walls.length === 1 ? \"is a wall\" : \"are walls\"}`;\n if (floors.length <= limit) return `all cells are walls except ${positionList(floors, language)}, which ${floors.length === 1 ? \"is a passage\" : \"are passages\"}`;\n return `${positionList(walls, language)} ${walls.length === 1 ? \"is a wall\" : \"are walls\"}; ${positionList(floors, language)} ${floors.length === 1 ? \"is a passage\" : \"are passages\"}`;\n}\n\nfunction positionList(indices: number[], language: Language): string {\n const ranges: Array<[number, number]> = [];\n let start = indices[0];\n let end = indices[0];\n if (start === undefined || end === undefined) return \"\";\n for (const value of indices.slice(1)) {\n if (value === end + 1) {\n end = value;\n continue;\n }\n ranges.push([start, end]);\n start = value;\n end = value;\n }\n ranges.push([start, end]);\n const parts = ranges.map(([from, to]) =>\n language === \"zh\"\n ? from === to\n ? `第${from}格`\n : `第${from}格至第${to}格`\n : from === to\n ? `cell ${from}`\n : `cells ${from}-${to}`\n );\n if (parts.length === 1) return parts[0] ?? \"\";\n const last = parts.at(-1);\n return language === \"zh\"\n ? `${parts.slice(0, -1).join(\"、\")}和${last}`\n : `${parts.slice(0, -1).join(\", \")} and ${last}`;\n}\n\nfunction renderObjectDescription(maze: Maze, language: Language): string {\n const sentences: string[] = [];\n const doorPositions = maze.doors.map((item) => letterNumberCoordinate(item.position));\n const keys = maze.objects.filter((item) => item.type === \"key\");\n const chests = maze.objects.filter((item) => item.type === \"chest\");\n const traps = maze.objects.filter((item) => item.type === \"trap\");\n const medicines = maze.objects.filter((item) => item.type === \"medicine\");\n if (language === \"zh\") {\n if (doorPositions.length > 0) sentences.push(`${coordinateList(doorPositions, language)}${doorPositions.length > 1 ? \"各\" : \"\"}有一道初始关闭的门。`);\n const keyPositions = keys.map((item) => letterNumberCoordinate(item.position));\n if (keyPositions.length > 0) sentences.push(`${coordinateList(keyPositions, language)}${keyPositions.length > 1 ? \"各\" : \"\"}放着一把钥匙。`);\n for (const chest of chests) sentences.push(`${letterNumberCoordinate(chest.position)}放着一只初始关闭的宝箱,箱内有${numberZh(chest.treasures)}件宝物。`);\n const trapPositions = traps.map((item) => letterNumberCoordinate(item.position));\n if (trapPositions.length > 0) sentences.push(`${coordinateList(trapPositions, language)}${trapPositions.length > 1 ? \"各\" : \"\"}设有一个尚未触发的陷阱。`);\n const medicinePositions = medicines.map((item) => letterNumberCoordinate(item.position));\n if (medicinePositions.length > 0) sentences.push(`${coordinateList(medicinePositions, language)}${medicinePositions.length > 1 ? \"各\" : \"\"}有一个尚未使用的药品房。`);\n } else {\n if (doorPositions.length > 0) sentences.push(`${coordinateList(doorPositions, language)} ${doorPositions.length === 1 ? \"contains a closed door\" : \"each contain a closed door\"}.`);\n const keyPositions = keys.map((item) => letterNumberCoordinate(item.position));\n if (keyPositions.length > 0) sentences.push(`${coordinateList(keyPositions, language)} ${keyPositions.length === 1 ? \"contains a key\" : \"each contain a key\"}.`);\n for (const chest of chests) sentences.push(`${letterNumberCoordinate(chest.position)} contains a closed chest with ${chest.treasures} treasure${plural(chest.treasures)}.`);\n const trapPositions = traps.map((item) => letterNumberCoordinate(item.position));\n if (trapPositions.length > 0) sentences.push(`${coordinateList(trapPositions, language)} ${trapPositions.length === 1 ? \"contains an untriggered trap\" : \"each contain an untriggered trap\"}.`);\n const medicinePositions = medicines.map((item) => letterNumberCoordinate(item.position));\n if (medicinePositions.length > 0) sentences.push(`${coordinateList(medicinePositions, language)} ${medicinePositions.length === 1 ? \"contains an unused medicine room\" : \"each contain an unused medicine room\"}.`);\n }\n return sentences.length > 0 ? sentences.join(\"\\n\") : language === \"zh\" ? \"没有门或其他对象。\" : \"There are no doors or other objects.\";\n}\n\nfunction renderRules(language: Language): string {\n return (language === \"zh\" ? CHINESE_RULES : ENGLISH_RULES).join(\"\\n\");\n}\n\nfunction renderQuestions(language: Language): string {\n return (language === \"zh\" ? CHINESE_QUESTIONS : ENGLISH_QUESTIONS).join(\"\\n\");\n}\n\nfunction renderActionDescription(\n actions: Direction[],\n language: Language,\n style: number\n): string {\n const runs = compressActions(actions);\n if (language === \"zh\") {\n const connectors = [\"随后\", \"接着\", \"然后\", \"再\", \"之后\"];\n const clauses = runs.map((run, index) => {\n const connector = index === 0 ? \"探险者先\" : connectors[(style + index) % connectors.length];\n return `${connector ?? \"然后\"}向${DIRECTIONS[run.direction].zh}移动${numberZh(run.count)}格`;\n });\n return paragraphize(clauses, \",\", \"。\");\n }\n const clauses = runs.map((run, index) => {\n const connector =\n index === 0\n ? \"First, the explorer moves\"\n : index % 4 === 0\n ? \"The explorer then moves\"\n : \"then moves\";\n const directionForms: Record<Direction, string[]> = {\n up: [\"up\", \"upward\"],\n down: [\"down\", \"downward\"],\n left: [\"left\", \"to the left\"],\n right: [\"right\", \"to the right\"]\n };\n const forms = directionForms[run.direction];\n const direction = forms[(style + index) % forms.length] ?? DIRECTIONS[run.direction].en;\n return `${connector} ${direction} ${run.count} cell${plural(run.count)}`;\n });\n return paragraphize(clauses, \", \", \".\");\n}\n\nfunction paragraphize(clauses: string[], separator: string, terminator: string): string {\n const sentences: string[] = [];\n for (let index = 0; index < clauses.length; index += 4) {\n sentences.push(`${clauses.slice(index, index + 4).join(separator)}${terminator}`);\n }\n return sentences.join(\"\\n\");\n}\n\nfunction compressActions(actions: Direction[]): Array<{ direction: Direction; count: number }> {\n const runs: Array<{ direction: Direction; count: number }> = [];\n for (const direction of actions) {\n const prior = runs.at(-1);\n if (prior?.direction === direction) prior.count += 1;\n else runs.push({ direction, count: 1 });\n }\n return runs;\n}\n\nfunction pathToActions(path: Cell[]): Direction[] {\n const actions: Direction[] = [];\n for (let index = 1; index < path.length; index += 1) {\n const current = path[index];\n const prior = path[index - 1];\n if (!current || !prior) continue;\n const dr = current.row - prior.row;\n const dc = current.col - prior.col;\n actions.push(dr === -1 ? \"up\" : dr === 1 ? \"down\" : dc === -1 ? \"left\" : \"right\");\n }\n return actions;\n}\n\nfunction wallDirection(maze: Maze, position: Cell): Direction | null {\n const candidates: Array<[Direction, Cell]> = [\n [\"up\", cell(position.row - 1, position.col)],\n [\"down\", cell(position.row + 1, position.col)],\n [\"left\", cell(position.row, position.col - 1)],\n [\"right\", cell(position.row, position.col + 1)]\n ];\n return candidates.find(([, target]) => terrainAt(maze, target) !== \".\")?.[0] ?? null;\n}\n\nfunction coordinateList(values: string[], language: Language): string {\n if (values.length <= 1) return values[0] ?? \"\";\n const last = values.at(-1);\n return language === \"zh\"\n ? `${values.slice(0, -1).join(\"、\")}和${last}`\n : `${values.slice(0, -1).join(\", \")} and ${last}`;\n}\n\nfunction initialPossessions(state: InitialState, language: Language): string {\n if (language === \"zh\") {\n const keys = state.keys > 0 ? `起初持有${numberZh(state.keys)}把钥匙` : \"起初没有钥匙\";\n const treasures = state.treasures > 0 ? `持有${numberZh(state.treasures)}件宝物` : \"没有宝物\";\n return `${keys},${treasures}`;\n }\n const keys = state.keys > 0 ? `${state.keys} key${plural(state.keys)}` : \"no keys\";\n const treasures = state.treasures > 0 ? `${state.treasures} treasure${plural(state.treasures)}` : \"no treasures\";\n return `${keys} and ${treasures}`;\n}\n\nfunction numberZh(value: number): string {\n const forms = [\"零\", \"一\", \"两\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\", \"十\"];\n return forms[value] ?? String(value);\n}\n\nfunction plural(value: number): string {\n return value === 1 ? \"\" : \"s\";\n}\n\nfunction integer(value: number, name: string, minimum: number): number {\n if (!Number.isInteger(value) || value < minimum) {\n throw new Error(`${name} must be an integer greater than or equal to ${minimum}.`);\n }\n return value;\n}\n\nfunction oddInteger(value: number, name: string, minimum: number): number {\n integer(value, name, minimum);\n if (value % 2 === 0) throw new Error(`${name} must be odd.`);\n return value;\n}\n\nfunction finiteNumber(value: number, name: string, minimum: number, maximum: number): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}.`);\n }\n return value;\n}\n"],"mappings":"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","names":["next","limit","clauses","keys","treasures"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/coordinates.ts","../src/mechanisms.ts","../src/maze.ts","../src/renderer.ts","../src/simulator.ts","../src/trial.ts"],"sourcesContent":["export {\n cell,\n cellKey,\n columnLabel,\n letterNumberCoordinate,\n neighbors,\n rowColumnCoordinate,\n sameCell\n} from \"./coordinates.js\";\nexport {\n analyzeSolidCellMaze,\n decorateSolidCellMaze,\n generateSolidCellMaze,\n isFloor,\n shortestPath,\n terrainAt,\n validateSolidCellMaze\n} from \"./maze.js\";\nexport { renderCharacterMaze } from \"./renderer.js\";\nexport {\n defaultObjectCounts,\n emptyMaterialCounts,\n emptyTreasureCounts,\n mechanismPreset,\n resolveMechanisms,\n totalMaterialKeys\n} from \"./mechanisms.js\";\nexport { simulateTrial, stateKey } from \"./simulator.js\";\nexport {\n generateAnswer,\n generateQuestion,\n generateTrial,\n resolveTrialOptions\n} from \"./trial.js\";\nexport type * from \"./types.js\";\n\n/** The npm package name. Retained for compatibility with the initial release. */\nexport const packageName = \"maze-test\";\n","import type { Cell } from \"./types.js\";\n\nexport function cell(row: number, col: number): Cell {\n return { row, col };\n}\n\nexport function cellKey(value: Cell): string {\n return `${value.row},${value.col}`;\n}\n\nexport function sameCell(a: Cell | undefined, b: Cell | undefined): boolean {\n return a?.row === b?.row && a?.col === b?.col;\n}\n\nexport function columnLabel(col: number): string {\n if (!Number.isInteger(col) || col < 1) throw new Error(`Invalid column number: ${col}`);\n let value = col;\n let label = \"\";\n while (value > 0) {\n value -= 1;\n label = String.fromCharCode(65 + (value % 26)) + label;\n value = Math.floor(value / 26);\n }\n return label;\n}\n\nexport function letterNumberCoordinate(value: Cell): string {\n return `${columnLabel(value.col)}${value.row}`;\n}\n\nexport function rowColumnCoordinate(value: Cell): string {\n return `第${value.row}行第${value.col}格`;\n}\n\nexport function neighbors(value: Cell, rows: number, cols: number): Cell[] {\n return [\n cell(value.row - 1, value.col),\n cell(value.row + 1, value.col),\n cell(value.row, value.col - 1),\n cell(value.row, value.col + 1)\n ].filter((item) => item.row >= 1 && item.row <= rows && item.col >= 1 && item.col <= cols);\n}\n","import type {\n KeyMaterial,\n MaterialCounts,\n MechanismComplexity,\n MechanismConfig,\n PotionKind,\n TreasureCounts,\n TreasureType,\n TrialOptions\n} from \"./types.js\";\n\nconst MATERIALS: readonly KeyMaterial[] = [\"copper\", \"silver\", \"gold\"];\nconst TREASURE_TYPES: readonly TreasureType[] = [\"treasure\", \"coin\", \"gem\", \"relic\"];\nconst POTION_KINDS: readonly PotionKind[] = [\"healing\", \"poison\", \"antidote\", \"haste\", \"slow\"];\n\nexport function mechanismPreset(complexity: MechanismComplexity): MechanismConfig {\n if (complexity === \"basic\") {\n return {\n complexity,\n trapDamages: [1],\n potionKinds: [\"healing\"],\n keyMaterials: [],\n treasureTypes: [\"treasure\"],\n poisonDamage: 1,\n poisonDuration: 3,\n speedDuration: 4,\n movementTime: { normal: 1, fast: 1, slow: 1 }\n };\n }\n if (complexity === \"intermediate\") {\n return {\n complexity,\n trapDamages: [1, 2, 3],\n potionKinds: [\"healing\", \"poison\", \"antidote\"],\n keyMaterials: [],\n treasureTypes: [\"coin\", \"gem\", \"relic\"],\n poisonDamage: 1,\n poisonDuration: 3,\n speedDuration: 4,\n movementTime: { normal: 1, fast: 1, slow: 1 }\n };\n }\n return {\n complexity,\n trapDamages: [1, 2, 3],\n potionKinds: [\"healing\", \"poison\", \"antidote\", \"haste\", \"slow\"],\n keyMaterials: [\"copper\", \"silver\", \"gold\"],\n treasureTypes: [\"coin\", \"gem\", \"relic\"],\n poisonDamage: 1,\n poisonDuration: 3,\n speedDuration: 4,\n movementTime: { normal: 2, fast: 1, slow: 3 }\n };\n}\n\nexport function resolveMechanisms(options: TrialOptions): MechanismConfig {\n const complexity = options.complexity ?? \"basic\";\n if (!isComplexity(complexity)) throw new Error(`Unknown complexity: ${String(complexity)}`);\n const preset = mechanismPreset(complexity);\n const trapDamages = options.trapDamages ?? preset.trapDamages;\n const potionKinds = options.potionKinds ?? preset.potionKinds;\n const keyMaterials = options.keyMaterials ?? preset.keyMaterials;\n const treasureTypes = options.treasureTypes ?? preset.treasureTypes;\n validatePositiveList(trapDamages, \"trapDamages\");\n validateEnumList(potionKinds, POTION_KINDS, \"potionKinds\");\n validateEnumList(keyMaterials, MATERIALS, \"keyMaterials\", true);\n validateEnumList(treasureTypes, TREASURE_TYPES, \"treasureTypes\");\n if (complexity !== \"advanced\" && potionKinds.some((kind) => kind === \"haste\" || kind === \"slow\")) {\n throw new Error(\"Haste and slow potions require advanced complexity so their movement-time costs are defined.\");\n }\n if (complexity === \"advanced\" && keyMaterials.length === 0) {\n throw new Error(\"Advanced complexity requires at least one key material.\");\n }\n return {\n ...preset,\n trapDamages: [...trapDamages],\n potionKinds: [...potionKinds],\n keyMaterials: [...keyMaterials],\n treasureTypes: [...treasureTypes],\n poisonDamage: positiveInteger(options.poisonDamage ?? preset.poisonDamage, \"poisonDamage\"),\n poisonDuration: positiveInteger(\n options.poisonDuration ?? preset.poisonDuration,\n \"poisonDuration\"\n ),\n speedDuration: positiveInteger(options.speedDuration ?? preset.speedDuration, \"speedDuration\")\n };\n}\n\nexport function defaultObjectCounts(complexity: MechanismComplexity): {\n doors: number;\n chests: number;\n traps: number;\n potions: number;\n} {\n if (complexity === \"basic\") return { doors: 1, chests: 2, traps: 2, potions: 2 };\n if (complexity === \"intermediate\") return { doors: 2, chests: 3, traps: 3, potions: 3 };\n return { doors: 3, chests: 3, traps: 3, potions: 5 };\n}\n\nexport function emptyMaterialCounts(\n values: Partial<MaterialCounts> = {}\n): MaterialCounts {\n return {\n copper: values.copper ?? 0,\n silver: values.silver ?? 0,\n gold: values.gold ?? 0\n };\n}\n\nexport function emptyTreasureCounts(\n values: Partial<TreasureCounts> = {}\n): TreasureCounts {\n return {\n treasure: values.treasure ?? 0,\n coin: values.coin ?? 0,\n gem: values.gem ?? 0,\n relic: values.relic ?? 0\n };\n}\n\nexport function totalMaterialKeys(counts: MaterialCounts): number {\n return counts.copper + counts.silver + counts.gold;\n}\n\nfunction isComplexity(value: string): value is MechanismComplexity {\n return value === \"basic\" || value === \"intermediate\" || value === \"advanced\";\n}\n\nfunction positiveInteger(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1) throw new Error(`${name} must be a positive integer.`);\n return value;\n}\n\nfunction validatePositiveList(values: readonly number[], name: string): void {\n if (values.length === 0) throw new Error(`${name} must not be empty.`);\n for (const value of values) positiveInteger(value, name);\n}\n\nfunction validateEnumList<T extends string>(\n values: readonly T[],\n allowed: readonly T[],\n name: string,\n allowEmpty = false\n): void {\n if (!allowEmpty && values.length === 0) throw new Error(`${name} must not be empty.`);\n for (const value of values) {\n if (!allowed.includes(value)) throw new Error(`Unknown ${name} value: ${value}`);\n }\n}\n","import { cell, cellKey, neighbors, sameCell } from \"./coordinates.js\";\nimport { mechanismPreset } from \"./mechanisms.js\";\nimport type {\n Cell,\n ChestObject,\n DecorateMazeOptions,\n GenerateMazeOptions,\n KeyObject,\n Maze,\n MazeMetrics,\n MazeObject,\n MazeValidation,\n MedicineObject,\n PotionObject,\n TrapObject\n} from \"./types.js\";\n\nexport function generateSolidCellMaze(options: GenerateMazeOptions = {}): Maze {\n const rows = oddDimension(options.rows ?? 15, \"rows\");\n const cols = oddDimension(options.cols ?? 15, \"cols\");\n const seed = integerOption(options.seed ?? 1, \"seed\", 0);\n const requestedSeed = integerOption(options.requestedSeed ?? seed, \"requestedSeed\", 0);\n const braid = numberOption(options.braid ?? 0, \"braid\", 0, 1);\n const mechanisms = options.mechanisms ?? mechanismPreset(\"basic\");\n const rng = mulberry32(seed);\n const grid = Array.from({ length: rows }, () => Array<string>(cols).fill(\"#\"));\n const logicalCells: Cell[] = [];\n\n for (let row = 1; row < rows - 1; row += 2) {\n for (let col = 1; col < cols - 1; col += 2) logicalCells.push({ row, col });\n }\n\n const start = logicalCells[randomInt(rng, logicalCells.length)];\n if (!start) throw new Error(\"The maze has no logical cells.\");\n const visited = new Set([cellKey(start)]);\n const stack = [start];\n grid[start.row]![start.col] = \".\";\n\n while (stack.length > 0) {\n const current = stack.at(-1);\n if (!current) break;\n const choices = shuffle(\n rng,\n logicalNeighbors(current, rows, cols).filter((item) => !visited.has(cellKey(item)))\n );\n const next = choices[0];\n if (!next) {\n stack.pop();\n continue;\n }\n grid[(current.row + next.row) / 2]![(current.col + next.col) / 2] = \".\";\n grid[next.row]![next.col] = \".\";\n visited.add(cellKey(next));\n stack.push(next);\n }\n\n braidDeadEnds(grid, braid, rng);\n const terrain = grid.map((row) => row.join(\"\"));\n const first = farthestFloor(cell(2, 2), terrain).cell;\n const second = farthestFloor(first, terrain).cell;\n const maze: Maze = {\n schemaVersion: \"solid-cell-maze-v4@1\",\n id: options.id ?? `solid-maze-${rows}x${cols}-${requestedSeed}`,\n seed,\n requestedSeed,\n rows,\n cols,\n braid,\n coordinateSystem: {\n origin: \"top-left\",\n columns: \"letters-left-to-right\",\n rows: \"numbers-top-to-bottom\"\n },\n mechanisms: structuredClone(mechanisms),\n terrain,\n entry: first,\n goal: second,\n doors: [],\n objects: [],\n metrics: emptyMetrics(rows, cols)\n };\n maze.metrics = analyzeSolidCellMaze(maze);\n return maze;\n}\n\nexport function decorateSolidCellMaze(maze: Maze, options: DecorateMazeOptions = {}): Maze {\n const result = structuredClone(maze);\n const mechanisms = options.mechanisms ?? maze.mechanisms ?? mechanismPreset(\"basic\");\n result.mechanisms = structuredClone(mechanisms);\n const decorationSeed = integerOption(options.seed ?? maze.seed + 71_311, \"decoration seed\", 0);\n const rng = mulberry32(decorationSeed);\n const mainPath = shortestPath(result, result.entry, result.goal);\n const occupied = new Set([cellKey(result.entry), cellKey(result.goal)]);\n const doorCount = integerOption(\n options.doorCount ?? Math.max(1, Math.floor(result.metrics.floorCells / 120)),\n \"doorCount\",\n 0\n );\n const chestCount = integerOption(options.chestCount ?? 2, \"chestCount\", 0);\n const trapCount = integerOption(options.trapCount ?? 2, \"trapCount\", 0);\n const potionCount = integerOption(\n options.potionCount ?? options.medicineCount ?? 2,\n \"potionCount\",\n 0\n );\n const doorIndices = selectGatingDoorIndices(result, mainPath, doorCount);\n\n result.doors = doorIndices.map((index, doorIndex) => {\n const position = mainPath[index];\n if (!position) throw new Error(`No path cell exists at door index ${index}.`);\n occupied.add(cellKey(position));\n const material = cyclicValue(mechanisms.keyMaterials, doorIndex + decorationSeed);\n return {\n id: `door-${doorIndex + 1}`,\n position,\n state: \"closed\" as const,\n ...(material ? { material } : {})\n };\n });\n\n const objects: MazeObject[] = [];\n for (let index = 0; index < result.doors.length; index += 1) {\n const doorIndex = doorIndices[index];\n if (doorIndex === undefined) throw new Error(\"Door index mismatch.\");\n const preferredIndex = Math.max(1, Math.floor(doorIndex * 0.55));\n const position = freePathCellBefore(mainPath, preferredIndex, occupied);\n occupied.add(cellKey(position));\n const door = result.doors[index];\n const key: KeyObject = {\n id: `key-${index + 1}`,\n type: \"key\",\n position,\n ...(door?.material ? { material: door.material } : {})\n };\n objects.push(key);\n }\n\n const degrees = degreeMap(result);\n const deadEnds = shuffle(\n rng,\n floorCells(result).filter(\n (item) => degrees.get(cellKey(item)) === 1 && !occupied.has(cellKey(item))\n )\n );\n\n for (let index = 0; index < chestCount; index += 1) {\n const position = takeFree(deadEnds, result, occupied, rng, \"chest\");\n occupied.add(cellKey(position));\n const treasureType = cyclicValue(mechanisms.treasureTypes, index + decorationSeed);\n if (!treasureType) throw new Error(\"At least one treasure type is required.\");\n const count = 1 + (index % 3);\n const lockMaterial = cyclicValue(mechanisms.keyMaterials, index + decorationSeed + 1);\n const chest: ChestObject = {\n id: `chest-${index + 1}`,\n type: \"chest\",\n position,\n treasures: count,\n contents: [{ type: treasureType, count }],\n ...(lockMaterial ? { lockMaterial } : {})\n };\n objects.push(chest);\n }\n\n const trapCandidates = shuffle(rng, mainPath.slice(2, -2));\n for (let index = 0; index < trapCount; index += 1) {\n const position = takeFree(trapCandidates, result, occupied, rng, \"trap\");\n occupied.add(cellKey(position));\n const trap: TrapObject = {\n id: `trap-${index + 1}`,\n type: \"trap\",\n position,\n damage: mechanisms.trapDamages[index % mechanisms.trapDamages.length] ?? 1\n };\n objects.push(trap);\n }\n\n const potionCandidates = shuffle(rng, floorCells(result));\n for (let index = 0; index < potionCount; index += 1) {\n const position = takeFree(potionCandidates, result, occupied, rng, \"potion\");\n occupied.add(cellKey(position));\n if (\n mechanisms.complexity === \"basic\" &&\n mechanisms.potionKinds.length === 1 &&\n mechanisms.potionKinds[0] === \"healing\"\n ) {\n const medicine: MedicineObject = {\n id: `medicine-${index + 1}`,\n type: \"medicine\",\n position,\n recovery: 1\n };\n objects.push(medicine);\n continue;\n }\n const kind = mechanisms.potionKinds[index % mechanisms.potionKinds.length];\n if (!kind) throw new Error(\"At least one potion kind is required.\");\n const potion: PotionObject = {\n id: `potion-${index + 1}`,\n type: \"potion\",\n position,\n kind,\n ...(kind === \"healing\" ? { potency: 1 + (index % 2) } : {}),\n ...(kind === \"poison\"\n ? { potency: mechanisms.poisonDamage, duration: mechanisms.poisonDuration }\n : {}),\n ...(kind === \"haste\" || kind === \"slow\"\n ? { duration: mechanisms.speedDuration }\n : {})\n };\n objects.push(potion);\n }\n\n result.objects = objects;\n result.metrics = analyzeSolidCellMaze(result);\n return result;\n}\n\nexport function analyzeSolidCellMaze(maze: Maze): MazeMetrics {\n assertShape(maze);\n const floors = floorCells(maze);\n const graph = adjacency(maze);\n const distances = bfsDistances(maze.entry, graph);\n const degreeValues = [...graph.values()].map((items) => items.length);\n const edgeCount = degreeValues.reduce((sum, value) => sum + value, 0) / 2;\n const mainPath = shortestPathInGraph(graph, maze.entry, maze.goal);\n const entryGoalSeparators = separatingCellKeys(graph, maze.entry, maze.goal);\n const objectCounts: Partial<Record<MazeObject[\"type\"], number>> = {};\n for (const object of maze.objects ?? []) {\n objectCounts[object.type] = (objectCounts[object.type] ?? 0) + 1;\n }\n return {\n totalCells: maze.rows * maze.cols,\n wallCells: maze.rows * maze.cols - floors.length,\n floorCells: floors.length,\n connectedFloorCells: distances.size,\n connected: distances.size === floors.length,\n floorAdjacencyEdges: edgeCount,\n independentCycles: edgeCount - floors.length + 1,\n deadEnds: degreeValues.filter((value) => value === 1).length,\n junctions: degreeValues.filter((value) => value >= 3).length,\n entryGoalDistance: mainPath.length > 0 ? mainPath.length - 1 : null,\n doorCount: maze.doors.length,\n gatingDoorCount: maze.doors.filter(\n (door) => entryGoalSeparators.has(cellKey(door.position))\n ).length,\n objectCounts\n };\n}\n\nexport function validateSolidCellMaze(maze: Maze): MazeValidation {\n const errors: string[] = [];\n try {\n assertShape(maze);\n } catch (error) {\n return {\n valid: false,\n errors: [error instanceof Error ? error.message : String(error)],\n metrics: null\n };\n }\n\n for (let row = 1; row <= maze.rows; row += 1) {\n for (let col = 1; col <= maze.cols; col += 1) {\n const value = terrainAt(maze, cell(row, col));\n if (value !== \"#\" && value !== \".\") errors.push(`Invalid terrain at ${row},${col}: ${value}`);\n if (\n (row === 1 || row === maze.rows || col === 1 || col === maze.cols) &&\n value !== \"#\"\n ) {\n errors.push(`The outer boundary is not a wall at ${row},${col}.`);\n }\n }\n }\n\n if (!isFloor(maze, maze.entry)) errors.push(\"The entry is not on a floor cell.\");\n if (!isFloor(maze, maze.goal)) errors.push(\"The goal is not on a floor cell.\");\n if (sameCell(maze.entry, maze.goal)) errors.push(\"The entry and goal overlap.\");\n const occupied = new Set([cellKey(maze.entry), cellKey(maze.goal)]);\n\n for (const door of maze.doors) {\n if (!isFloor(maze, door.position)) errors.push(`${door.id} is not on a floor cell.`);\n const key = cellKey(door.position);\n if (occupied.has(key)) errors.push(`${door.id} overlaps another feature.`);\n occupied.add(key);\n }\n for (const object of maze.objects) {\n if (!isFloor(maze, object.position)) errors.push(`${object.id} is not on a floor cell.`);\n const key = cellKey(object.position);\n if (occupied.has(key)) errors.push(`${object.id} overlaps another feature.`);\n occupied.add(key);\n }\n\n const metrics = analyzeSolidCellMaze(maze);\n if (!metrics.connected) {\n errors.push(`Floor cells are disconnected: ${metrics.connectedFloorCells}/${metrics.floorCells}.`);\n }\n if (metrics.deadEnds === 0) errors.push(\"The maze has no dead ends.\");\n if (metrics.junctions === 0) errors.push(\"The maze has no junctions.\");\n if (metrics.gatingDoorCount !== metrics.doorCount) {\n errors.push(`${metrics.doorCount - metrics.gatingDoorCount} door(s) can be bypassed.`);\n }\n\n const path = shortestPath(maze, maze.entry, maze.goal);\n const pathIndex = new Map(path.map((item, index) => [cellKey(item), index]));\n for (let index = 0; index < maze.doors.length; index += 1) {\n const door = maze.doors[index];\n if (!door) continue;\n const key = maze.objects.find((item) => item.id === `key-${index + 1}`);\n const doorIndex = pathIndex.get(cellKey(door.position));\n const keyIndex = key ? pathIndex.get(cellKey(key.position)) : undefined;\n if (!key) errors.push(`Missing a key for ${door.id}.`);\n else if (keyIndex === undefined || doorIndex === undefined || keyIndex >= doorIndex) {\n errors.push(`${key.id} is not before ${door.id} on the main path.`);\n } else if (door.material !== (key.type === \"key\" ? key.material : undefined)) {\n errors.push(`${key.id} does not match the material of ${door.id}.`);\n }\n }\n return { valid: errors.length === 0, errors, metrics };\n}\n\nexport function shortestPath(\n maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">,\n start: Cell,\n goal: Cell,\n excludedCell: Cell | null = null\n): Cell[] {\n if (excludedCell && (sameCell(start, excludedCell) || sameCell(goal, excludedCell))) return [];\n const graph = adjacency(maze, excludedCell);\n return shortestPathInGraph(graph, start, goal);\n}\n\nfunction shortestPathInGraph(graph: Map<string, Cell[]>, start: Cell, goal: Cell): Cell[] {\n const queue = [start];\n const parent = new Map<string, string | null>([[cellKey(start), null]]);\n const values = new Map([[cellKey(start), start]]);\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const current = queue[queueIndex];\n queueIndex += 1;\n if (!current) break;\n if (sameCell(current, goal)) break;\n for (const next of graph.get(cellKey(current)) ?? []) {\n const key = cellKey(next);\n if (parent.has(key)) continue;\n parent.set(key, cellKey(current));\n values.set(key, next);\n queue.push(next);\n }\n }\n if (!parent.has(cellKey(goal))) return [];\n const path: Cell[] = [];\n let cursor: string | null = cellKey(goal);\n while (cursor !== null) {\n const value = values.get(cursor);\n if (!value) throw new Error(`Could not reconstruct path at ${cursor}.`);\n path.push(value);\n cursor = parent.get(cursor) ?? null;\n }\n return path.reverse();\n}\n\nexport function terrainAt(\n maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">,\n value: Cell\n): string | null {\n if (value.row < 1 || value.row > maze.rows || value.col < 1 || value.col > maze.cols) {\n return null;\n }\n return maze.terrain[value.row - 1]?.[value.col - 1] ?? null;\n}\n\nexport function isFloor(maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">, value: Cell): boolean {\n return terrainAt(maze, value) === \".\";\n}\n\nfunction braidDeadEnds(grid: string[][], braid: number, rng: () => number): void {\n if (braid <= 0) return;\n const rows = grid.length;\n const cols = grid[0]?.length ?? 0;\n const logicalCells: Cell[] = [];\n for (let row = 1; row < rows - 1; row += 2) {\n for (let col = 1; col < cols - 1; col += 2) logicalCells.push({ row, col });\n }\n const deadEnds = shuffle(\n rng,\n logicalCells.filter((value) => openLogicalNeighbors(grid, value).length === 1)\n );\n for (const current of deadEnds) {\n if (rng() > braid) continue;\n const closed = shuffle(\n rng,\n logicalNeighbors(current, rows, cols).filter(\n (next) => grid[(current.row + next.row) / 2]?.[(current.col + next.col) / 2] === \"#\"\n )\n );\n const next = closed[0];\n if (!next) continue;\n grid[(current.row + next.row) / 2]![(current.col + next.col) / 2] = \".\";\n }\n}\n\nfunction openLogicalNeighbors(grid: string[][], current: Cell): Cell[] {\n return logicalNeighbors(current, grid.length, grid[0]?.length ?? 0).filter(\n (next) => grid[(current.row + next.row) / 2]?.[(current.col + next.col) / 2] === \".\"\n );\n}\n\nfunction logicalNeighbors(value: Cell, rows: number, cols: number): Cell[] {\n return [\n { row: value.row - 2, col: value.col },\n { row: value.row + 2, col: value.col },\n { row: value.row, col: value.col - 2 },\n { row: value.row, col: value.col + 2 }\n ].filter((item) => item.row >= 1 && item.row < rows - 1 && item.col >= 1 && item.col < cols - 1);\n}\n\nfunction farthestFloor(start: Cell, terrain: string[]): { cell: Cell; distance: number } {\n const maze = { rows: terrain.length, cols: terrain[0]?.length ?? 0, terrain };\n const graph = adjacency(maze);\n const distances = bfsDistances(start, graph);\n let farthest = start;\n let distance = -1;\n for (const [key, value] of distances) {\n if (value <= distance) continue;\n distance = value;\n farthest = parseCellKey(key);\n }\n return { cell: farthest, distance };\n}\n\nfunction floorCells(maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">): Cell[] {\n const values: Cell[] = [];\n for (let row = 1; row <= maze.rows; row += 1) {\n for (let col = 1; col <= maze.cols; col += 1) {\n if (isFloor(maze, cell(row, col))) values.push(cell(row, col));\n }\n }\n return values;\n}\n\nfunction adjacency(\n maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">,\n excludedCell: Cell | null = null\n): Map<string, Cell[]> {\n const floors = floorCells(maze).filter((item) => !excludedCell || !sameCell(item, excludedCell));\n const floorKeys = new Set(floors.map(cellKey));\n return new Map(\n floors.map((item) => [\n cellKey(item),\n neighbors(item, maze.rows, maze.cols).filter((next) => floorKeys.has(cellKey(next)))\n ])\n );\n}\n\nfunction bfsDistances(start: Cell, graph: Map<string, Cell[]>): Map<string, number> {\n const distances = new Map([[cellKey(start), 0]]);\n const queue = [start];\n let queueIndex = 0;\n while (queueIndex < queue.length) {\n const current = queue[queueIndex];\n queueIndex += 1;\n if (!current) break;\n const distance = distances.get(cellKey(current));\n if (distance === undefined) continue;\n for (const next of graph.get(cellKey(current)) ?? []) {\n const key = cellKey(next);\n if (distances.has(key)) continue;\n distances.set(key, distance + 1);\n queue.push(next);\n }\n }\n return distances;\n}\n\nfunction degreeMap(maze: Maze): Map<string, number> {\n return new Map([...adjacency(maze)].map(([key, values]) => [key, values.length]));\n}\n\nfunction selectGatingDoorIndices(maze: Maze, mainPath: Cell[], count: number): number[] {\n if (count === 0) return [];\n const graph = adjacency(maze);\n const separators = separatingCellKeys(graph, maze.entry, maze.goal);\n const candidates: number[] = [];\n for (let index = 3; index < mainPath.length - 3; index += 1) {\n const pathCell = mainPath[index];\n if (!pathCell) continue;\n const key = cellKey(pathCell);\n if ((graph.get(key)?.length ?? 0) === 2 && separators.has(key)) candidates.push(index);\n }\n if (candidates.length < count) {\n throw new Error(`Only ${candidates.length} non-bypassable path cells are available for ${count} doors.`);\n }\n const targets = spacedIndices(mainPath.length - 1, count, 0.28, 0.78);\n const selected: number[] = [];\n for (const target of targets) {\n const available = candidates.filter((index) => !selected.includes(index));\n available.sort(\n (left, right) => Math.abs(left - target) - Math.abs(right - target) || left - right\n );\n const candidate = available[0];\n if (candidate === undefined) throw new Error(`Could not place ${count} doors.`);\n selected.push(candidate);\n }\n if (selected.length !== count) throw new Error(`Could not space ${count} doors along the main path.`);\n return selected.sort((left, right) => left - right);\n}\n\nfunction separatingCellKeys(\n graph: Map<string, Cell[]>,\n start: Cell,\n goal: Cell\n): Set<string> {\n const startKey = cellKey(start);\n const goalKey = cellKey(goal);\n if (!graph.has(startKey) || !graph.has(goalKey)) return new Set();\n\n const discovered = new Map<string, number>();\n const low = new Map<string, number>();\n const parent = new Map<string, string | null>([[startKey, null]]);\n const stack: Array<{ key: string; nextNeighbor: number }> = [\n { key: startKey, nextNeighbor: 0 }\n ];\n let order = 1;\n discovered.set(startKey, order);\n low.set(startKey, order);\n\n while (stack.length > 0) {\n const frame = stack.at(-1);\n if (!frame) break;\n const adjacent = graph.get(frame.key) ?? [];\n const next = adjacent[frame.nextNeighbor];\n if (next) {\n frame.nextNeighbor += 1;\n const nextKey = cellKey(next);\n if (!discovered.has(nextKey)) {\n order += 1;\n discovered.set(nextKey, order);\n low.set(nextKey, order);\n parent.set(nextKey, frame.key);\n stack.push({ key: nextKey, nextNeighbor: 0 });\n continue;\n }\n if (nextKey !== parent.get(frame.key)) {\n low.set(frame.key, Math.min(low.get(frame.key) ?? order, discovered.get(nextKey) ?? order));\n }\n continue;\n }\n\n stack.pop();\n const parentKey = parent.get(frame.key);\n if (parentKey) {\n low.set(parentKey, Math.min(low.get(parentKey) ?? order, low.get(frame.key) ?? order));\n }\n }\n\n if (!discovered.has(goalKey)) return new Set();\n const separators = new Set<string>();\n let childKey = goalKey;\n while (childKey !== startKey) {\n const parentKey = parent.get(childKey);\n if (!parentKey) break;\n if (\n parentKey !== startKey &&\n (low.get(childKey) ?? Number.POSITIVE_INFINITY) >=\n (discovered.get(parentKey) ?? Number.NEGATIVE_INFINITY)\n ) {\n separators.add(parentKey);\n }\n childKey = parentKey;\n }\n return separators;\n}\n\nfunction freePathCellBefore(mainPath: Cell[], preferredIndex: number, occupied: Set<string>): Cell {\n for (let distance = 0; distance < mainPath.length; distance += 1) {\n for (const index of [preferredIndex - distance, preferredIndex + distance]) {\n if (index <= 0 || index >= mainPath.length - 1) continue;\n const candidate = mainPath[index];\n if (candidate && !occupied.has(cellKey(candidate))) return candidate;\n }\n }\n throw new Error(\"There is no free path cell on which to place a key.\");\n}\n\nfunction takeFree(\n candidates: Cell[],\n maze: Maze,\n occupied: Set<string>,\n rng: () => number,\n type: string\n): Cell {\n while (candidates.length > 0) {\n const value = candidates.shift();\n if (value && !occupied.has(cellKey(value))) return value;\n }\n const fallback = shuffle(rng, floorCells(maze)).find((item) => !occupied.has(cellKey(item)));\n if (!fallback) throw new Error(`There are not enough free floor cells to place ${type}.`);\n return fallback;\n}\n\nfunction spacedIndices(\n edgeCount: number,\n count: number,\n startRatio: number,\n endRatio: number\n): number[] {\n if (count === 0) return [];\n const values: number[] = [];\n for (let index = 0; index < count; index += 1) {\n const ratio =\n count === 1\n ? (startRatio + endRatio) / 2\n : startRatio + ((endRatio - startRatio) * index) / (count - 1);\n values.push(Math.max(2, Math.min(edgeCount - 2, Math.floor(edgeCount * ratio))));\n }\n return [...new Set(values)];\n}\n\nfunction parseCellKey(key: string): Cell {\n const [row, col] = key.split(\",\").map(Number);\n if (row === undefined || col === undefined) throw new Error(`Invalid cell key: ${key}`);\n return cell(row, col);\n}\n\nfunction assertShape(maze: Pick<Maze, \"rows\" | \"cols\" | \"terrain\">): void {\n oddDimension(maze.rows, \"rows\");\n oddDimension(maze.cols, \"cols\");\n if (!Array.isArray(maze.terrain) || maze.terrain.length !== maze.rows) {\n throw new Error(\"The terrain row count does not match rows.\");\n }\n if (maze.terrain.some((row) => typeof row !== \"string\" || row.length !== maze.cols)) {\n throw new Error(\"A terrain row does not match cols.\");\n }\n}\n\nfunction oddDimension(value: number, name: string): number {\n integerOption(value, name, 7);\n if (value % 2 === 0) throw new Error(`${name} must be odd.`);\n return value;\n}\n\nfunction integerOption(value: number, name: string, minimum: number): number {\n if (!Number.isInteger(value) || value < minimum) {\n throw new Error(`${name} must be an integer greater than or equal to ${minimum}.`);\n }\n return value;\n}\n\nfunction numberOption(value: number, name: string, minimum: number, maximum: number): number {\n if (!Number.isFinite(value) || value < minimum || value > maximum) {\n throw new Error(`${name} must be between ${minimum} and ${maximum}.`);\n }\n return value;\n}\n\nfunction randomInt(rng: () => number, maximum: number): number {\n return Math.floor(rng() * maximum);\n}\n\nfunction shuffle<T>(rng: () => number, input: readonly T[]): T[] {\n const values = [...input];\n for (let index = values.length - 1; index > 0; index -= 1) {\n const target = randomInt(rng, index + 1);\n const prior = values[index];\n const replacement = values[target];\n if (prior === undefined || replacement === undefined) continue;\n values[index] = replacement;\n values[target] = prior;\n }\n return values;\n}\n\nfunction cyclicValue<T>(values: readonly T[], index: number): T | undefined {\n if (values.length === 0) return undefined;\n return values[((index % values.length) + values.length) % values.length];\n}\n\nfunction mulberry32(seed: number): () => number {\n let value = seed >>> 0;\n return () => {\n value += 0x6d2b79f5;\n let mixed = value;\n mixed = Math.imul(mixed ^ (mixed >>> 15), mixed | 1);\n mixed ^= mixed + Math.imul(mixed ^ (mixed >>> 7), mixed | 61);\n return ((mixed ^ (mixed >>> 14)) >>> 0) / 4_294_967_296;\n };\n}\n\nfunction emptyMetrics(rows: number, cols: number): MazeMetrics {\n return {\n totalCells: rows * cols,\n wallCells: rows * cols,\n floorCells: 0,\n connectedFloorCells: 0,\n connected: false,\n floorAdjacencyEdges: 0,\n independentCycles: 0,\n deadEnds: 0,\n junctions: 0,\n entryGoalDistance: null,\n doorCount: 0,\n gatingDoorCount: 0,\n objectCounts: {}\n };\n}\n","import { cell, cellKey, columnLabel, sameCell } from \"./coordinates.js\";\nimport { terrainAt } from \"./maze.js\";\nimport type { Language, Maze } from \"./types.js\";\n\nconst SYMBOLS = { key: \"K\", chest: \"B\", trap: \"T\", medicine: \"H\", potion: \"P\" } as const;\n\nexport function renderCharacterMaze(maze: Maze, language: Language = \"en\"): string {\n const rowWidth = String(maze.rows).length;\n const prefix = \" \".repeat(rowWidth + 1);\n const objects = new Map(\n maze.objects.map((item) => [cellKey(item.position), SYMBOLS[item.type]])\n );\n const doors = new Set(maze.doors.map((item) => cellKey(item.position)));\n const heading = Array.from({ length: maze.cols }, (_, index) =>\n center(columnLabel(index + 1), 2)\n ).join(\"\");\n const lines = [`${prefix}${heading}`.trimEnd()];\n for (let row = 1; row <= maze.rows; row += 1) {\n let line = `${String(row).padStart(rowWidth, \" \")} `;\n for (let col = 1; col <= maze.cols; col += 1) {\n const position = cell(row, col);\n let symbol = \" \";\n if (terrainAt(maze, position) === \"#\") symbol = \"█\";\n else if (sameCell(position, maze.entry)) symbol = \"S\";\n else if (sameCell(position, maze.goal)) symbol = \"G\";\n else if (doors.has(cellKey(position))) symbol = \"D\";\n else symbol = objects.get(cellKey(position)) ?? \" \";\n line += symbol === \"█\" ? \"██\" : `${symbol} `;\n }\n lines.push(line.trimEnd());\n }\n lines.push(\"\");\n lines.push(\n language === \"zh\"\n ? \"图例:实心方块为墙格;空白为通路格;S入口;G终点;D门;K钥匙;B宝箱;T陷阱;H药品房;P药水。左上角为A1。\"\n : \"Legend: solid blocks are walls; blank cells are passages; S entry; G goal; D door; K key; B chest; T trap; H medicine room; P potion. The top-left cell is A1.\"\n );\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction center(value: string, width: number): string {\n const left = Math.floor((width - value.length) / 2);\n return `${\" \".repeat(Math.max(0, left))}${value}${\" \".repeat(\n Math.max(0, width - value.length - left)\n )}`;\n}\n","import { cell, cellKey, letterNumberCoordinate } from \"./coordinates.js\";\nimport { emptyMaterialCounts, emptyTreasureCounts, mechanismPreset, totalMaterialKeys } from \"./mechanisms.js\";\nimport { terrainAt } from \"./maze.js\";\nimport type {\n Direction,\n InitialState,\n Maze,\n PotionObject,\n SimulationResult,\n SpeedMode,\n TrialEvent,\n TrialState,\n TrialTraceItem\n} from \"./types.js\";\n\nconst DELTAS: Record<Direction, { row: number; col: number }> = {\n up: { row: -1, col: 0 },\n down: { row: 1, col: 0 },\n left: { row: 0, col: -1 },\n right: { row: 0, col: 1 }\n};\n\ninterface StatusContext {\n speedAtStart: SpeedMode;\n speedRemainingAtStart: number;\n poisonDamageAtStart: number;\n poisonRemainingAtStart: number;\n speedReplaced: boolean;\n poisonReplaced: boolean;\n}\n\nexport function simulateTrial(\n maze: Maze,\n actions: readonly Direction[],\n initial: Partial<InitialState> = {}\n): SimulationResult {\n const mechanisms = maze.mechanisms ?? mechanismPreset(\"basic\");\n const health = initial.health ?? 5;\n const state: TrialState = {\n position: structuredClone(maze.entry),\n health,\n healthMax: initial.healthMax ?? health,\n keys: initial.keys ?? 0,\n keysByMaterial: emptyMaterialCounts(initial.keysByMaterial),\n treasures: initial.treasures ?? 0,\n treasuresByType: emptyTreasureCounts(initial.treasuresByType),\n elapsedTime: initial.elapsedTime ?? 0,\n speed: initial.speed ?? \"normal\",\n speedRemaining: initial.speedRemaining ?? 0,\n poisonDamage: initial.poisonDamage ?? 0,\n poisonRemaining: initial.poisonRemaining ?? 0,\n alive: health > 0,\n reachedGoal: false,\n openedDoors: [],\n collectedKeys: [],\n openedChests: [],\n triggeredTraps: [],\n usedMedicines: [],\n usedPotions: []\n };\n const trace: TrialTraceItem[] = [];\n\n for (let index = 0; index < actions.length; index += 1) {\n const direction = actions[index];\n if (!direction) continue;\n const before = cloneState(state);\n const events: TrialEvent[] = [];\n if (!state.alive) {\n trace.push({ step: index + 1, direction, before, moved: false, reason: \"dead\", events, after: cloneState(state) });\n continue;\n }\n\n const context: StatusContext = {\n speedAtStart: state.speed,\n speedRemainingAtStart: state.speedRemaining,\n poisonDamageAtStart: state.poisonDamage,\n poisonRemainingAtStart: state.poisonRemaining,\n speedReplaced: false,\n poisonReplaced: false\n };\n const timeCost = mechanisms.movementTime[context.speedAtStart];\n state.elapsedTime += timeCost;\n const delta = DELTAS[direction];\n const target = cell(state.position.row + delta.row, state.position.col + delta.col);\n let moved = false;\n let reason: TrialTraceItem[\"reason\"] = null;\n\n if (terrainAt(maze, target) !== \".\") {\n reason = \"wall-or-outside\";\n } else {\n const door = maze.doors.find((item) => cellKey(item.position) === cellKey(target));\n if (door && !state.openedDoors.includes(door.id)) {\n if (door.material) {\n if (state.keysByMaterial[door.material] < 1) {\n reason = \"closed-door-without-matching-key\";\n } else {\n state.keysByMaterial[door.material] -= 1;\n state.openedDoors.push(door.id);\n events.push({ type: \"open-door\", id: door.id, material: door.material, keyCost: 1, timeCost });\n }\n } else if (state.keys < 1) {\n reason = \"closed-door-without-key\";\n } else {\n state.keys -= 1;\n state.openedDoors.push(door.id);\n events.push({ type: \"open-door\", id: door.id, keyCost: 1, timeCost });\n }\n }\n if (!reason) {\n state.position = target;\n moved = true;\n applyCellObjects(maze, state, events, context);\n if (cellKey(state.position) === cellKey(maze.goal) && !state.reachedGoal) {\n state.reachedGoal = true;\n events.push({ type: \"reach-goal\" });\n }\n }\n }\n\n finishStatuses(state, events, context);\n trace.push({ step: index + 1, direction, before, moved, reason, events, after: cloneState(state) });\n }\n\n const blockedMoves = trace.filter((item) => !item.moved).length;\n const blockedAfterDeath = trace.filter((item) => item.reason === \"dead\").length;\n return {\n state,\n trace,\n answers: {\n finalPosition: letterNumberCoordinate(state.position),\n keys: state.keys + totalMaterialKeys(state.keysByMaterial),\n keysByMaterial: structuredClone(state.keysByMaterial),\n treasures: state.treasures,\n treasuresByType: structuredClone(state.treasuresByType),\n health: state.health,\n alive: state.alive,\n reachedGoal: state.reachedGoal,\n openedDoors: state.openedDoors.length,\n openedChests: state.openedChests.length,\n triggeredTraps: state.triggeredTraps.length,\n usedMedicines: state.usedMedicines.length,\n usedPotions: state.usedPotions.length,\n elapsedTime: state.elapsedTime,\n finalSpeed: state.speed,\n speedRemaining: state.speedRemaining,\n poisonDamage: state.poisonDamage,\n poisonRemaining: state.poisonRemaining,\n blockedMoves,\n blockedAfterDeath\n }\n };\n}\n\nfunction applyCellObjects(\n maze: Maze,\n state: TrialState,\n events: TrialEvent[],\n context: StatusContext\n): void {\n const object = maze.objects.find((item) => cellKey(item.position) === cellKey(state.position));\n if (!object) return;\n if (object.type === \"key\" && !state.collectedKeys.includes(object.id)) {\n state.collectedKeys.push(object.id);\n if (object.material) state.keysByMaterial[object.material] += 1;\n else state.keys += 1;\n events.push({\n type: \"collect-key\",\n id: object.id,\n ...(object.material ? { material: object.material } : {})\n });\n return;\n }\n if (object.type === \"chest\" && !state.openedChests.includes(object.id)) {\n let canOpen = false;\n if (object.lockMaterial) {\n canOpen = state.keysByMaterial[object.lockMaterial] > 0;\n if (canOpen) state.keysByMaterial[object.lockMaterial] -= 1;\n } else {\n canOpen = state.keys > 0;\n if (canOpen) state.keys -= 1;\n }\n if (!canOpen) {\n events.push({\n type: \"pass-closed-chest\",\n id: object.id,\n ...(object.lockMaterial ? { material: object.lockMaterial } : {})\n });\n return;\n }\n state.openedChests.push(object.id);\n const contents = object.contents?.length > 0\n ? object.contents\n : [{ type: \"treasure\" as const, count: object.treasures }];\n for (const content of contents) {\n state.treasures += content.count;\n state.treasuresByType[content.type] += content.count;\n }\n events.push({\n type: \"open-chest\",\n id: object.id,\n ...(object.lockMaterial ? { material: object.lockMaterial } : {}),\n keyCost: 1,\n treasures: object.treasures,\n contents: structuredClone(contents)\n });\n return;\n }\n if (object.type === \"trap\" && !state.triggeredTraps.includes(object.id)) {\n state.triggeredTraps.push(object.id);\n state.health = Math.max(0, state.health - object.damage);\n events.push({ type: \"trigger-trap\", id: object.id, damage: object.damage });\n return;\n }\n if (object.type === \"medicine\" && !state.usedMedicines.includes(object.id)) {\n state.usedMedicines.push(object.id);\n const before = state.health;\n state.health = Math.min(state.healthMax, state.health + object.recovery);\n events.push({ type: \"use-medicine\", id: object.id, recovery: state.health - before });\n return;\n }\n if (object.type === \"potion\" && !state.usedPotions.includes(object.id)) {\n state.usedPotions.push(object.id);\n applyPotion(state, object, context);\n const recovery = object.kind === \"healing\" ? object.potency ?? 1 : undefined;\n const damage = object.kind === \"poison\" ? object.potency ?? maze.mechanisms.poisonDamage : undefined;\n events.push({\n type: \"drink-potion\",\n id: object.id,\n potionKind: object.kind,\n ...(recovery === undefined ? {} : { recovery }),\n ...(damage === undefined ? {} : { damage }),\n ...(object.duration === undefined ? {} : { duration: object.duration })\n });\n }\n}\n\nfunction applyPotion(state: TrialState, potion: PotionObject, context: StatusContext): void {\n if (potion.kind === \"healing\") {\n state.health = Math.min(state.healthMax, state.health + (potion.potency ?? 1));\n } else if (potion.kind === \"poison\") {\n state.poisonDamage = potion.potency ?? 1;\n state.poisonRemaining = potion.duration ?? 1;\n context.poisonReplaced = true;\n } else if (potion.kind === \"antidote\") {\n state.poisonDamage = 0;\n state.poisonRemaining = 0;\n context.poisonReplaced = true;\n } else if (potion.kind === \"haste\") {\n state.speed = \"fast\";\n state.speedRemaining = potion.duration ?? 1;\n context.speedReplaced = true;\n } else {\n state.speed = \"slow\";\n state.speedRemaining = potion.duration ?? 1;\n context.speedReplaced = true;\n }\n}\n\nfunction finishStatuses(state: TrialState, events: TrialEvent[], context: StatusContext): void {\n if (!context.poisonReplaced && context.poisonRemainingAtStart > 0) {\n state.health = Math.max(0, state.health - context.poisonDamageAtStart);\n state.poisonRemaining = context.poisonRemainingAtStart - 1;\n state.poisonDamage = state.poisonRemaining > 0 ? context.poisonDamageAtStart : 0;\n events.push({ type: \"poison-tick\", damage: context.poisonDamageAtStart });\n }\n if (!context.speedReplaced && context.speedRemainingAtStart > 0) {\n state.speedRemaining = context.speedRemainingAtStart - 1;\n if (state.speedRemaining === 0) {\n state.speed = \"normal\";\n events.push({ type: \"speed-expired\" });\n }\n }\n if (state.health <= 0 && state.alive) {\n state.health = 0;\n state.alive = false;\n events.push({ type: \"die\" });\n }\n}\n\nfunction cloneState(state: TrialState): TrialState {\n return structuredClone(state);\n}\n\nexport function stateKey(state: TrialState): string {\n return JSON.stringify({\n position: state.position,\n health: state.health,\n keys: state.keys,\n keysByMaterial: state.keysByMaterial,\n treasures: state.treasures,\n treasuresByType: state.treasuresByType,\n elapsedTime: state.elapsedTime,\n speed: state.speed,\n speedRemaining: state.speedRemaining,\n poisonDamage: state.poisonDamage,\n poisonRemaining: state.poisonRemaining,\n alive: state.alive,\n reachedGoal: state.reachedGoal,\n openedDoors: state.openedDoors,\n collectedKeys: state.collectedKeys,\n openedChests: state.openedChests,\n triggeredTraps: state.triggeredTraps,\n usedMedicines: state.usedMedicines,\n usedPotions: state.usedPotions\n });\n}\n","import { cell, columnLabel, letterNumberCoordinate } from \"./coordinates.js\";\nimport { defaultObjectCounts, emptyMaterialCounts, resolveMechanisms } from \"./mechanisms.js\";\nimport { decorateSolidCellMaze, generateSolidCellMaze, shortestPath, terrainAt, validateSolidCellMaze } from \"./maze.js\";\nimport { simulateTrial } from \"./simulator.js\";\nimport type { Cell, Direction, InitialState, KeyMaterial, Language, Maze, MazeTrial, PotionKind, ResolvedTrialOptions, ScenarioKind, TrialAnswers, TrialOptions, TrialSections, TreasureType } from \"./types.js\";\n\nconst DIRECTIONS: Record<Direction, { en: string; zh: string }> = {\n up: { en: \"up\", zh: \"上\" }, down: { en: \"down\", zh: \"下\" },\n left: { en: \"left\", zh: \"左\" }, right: { en: \"right\", zh: \"右\" }\n};\nconst MATERIAL_NAMES: Record<KeyMaterial, { en: string; zh: string }> = {\n copper: { en: \"copper\", zh: \"铜\" }, silver: { en: \"silver\", zh: \"银\" }, gold: { en: \"gold\", zh: \"金\" }\n};\nconst TREASURE_NAMES: Record<TreasureType, { en: string; zh: string }> = {\n treasure: { en: \"treasure\", zh: \"宝物\" }, coin: { en: \"coin\", zh: \"钱币\" },\n gem: { en: \"gem\", zh: \"宝石\" }, relic: { en: \"relic\", zh: \"遗物\" }\n};\nconst POTION_NAMES: Record<PotionKind, { en: string; zh: string }> = {\n healing: { en: \"healing potion\", zh: \"治疗药水\" }, poison: { en: \"poison potion\", zh: \"毒药\" },\n antidote: { en: \"antidote potion\", zh: \"解毒药水\" }, haste: { en: \"haste potion\", zh: \"加速药水\" }, slow: { en: \"slow potion\", zh: \"减速药水\" }\n};\nconst SPEED_NAMES = {\n normal: { en: \"normal\", zh: \"正常\" },\n fast: { en: \"fast\", zh: \"加速\" },\n slow: { en: \"slow\", zh: \"减速\" }\n} as const;\n\nexport function generateTrial(options: TrialOptions = {}): MazeTrial {\n const resolved = resolveTrialOptions(options);\n const maze = selectMaze(resolved);\n const plan = buildScenarioPlan(maze, resolved.scenario);\n const result = simulateTrial(maze, plan.actions, plan.initialState);\n verifyScenario(resolved.scenario, result.answers, maze);\n const sections: TrialSections = {\n map: renderMapDescription(maze, plan.initialState, resolved.language, resolved.style),\n rules: renderRules(maze, resolved.language),\n actions: renderActionDescription(plan.actions, resolved.language, resolved.style),\n questions: renderQuestions(maze, resolved.language)\n };\n return {\n schemaVersion: \"maze-test-trial@2\", options: resolved, maze,\n initialState: plan.initialState, actions: plan.actions, sections,\n question: renderQuestion(resolved, maze, sections),\n answer: renderAnswer(resolved, maze, result.answers, plan.actions.length), result\n };\n}\n\nexport function generateQuestion(options: TrialOptions = {}): string { return generateTrial(options).question; }\nexport function generateAnswer(options: TrialOptions = {}): string { return generateTrial(options).answer; }\n\nexport function resolveTrialOptions(options: TrialOptions = {}): ResolvedTrialOptions {\n const scenario = options.scenario ?? \"success\";\n const language = options.language ?? \"en\";\n if (![\"success\", \"treasure-and-leave\", \"death-and-stop\", \"mechanism-tour\"].includes(scenario)) throw new Error(`Unknown scenario: ${scenario}`);\n if (language !== \"en\" && language !== \"zh\") throw new Error(`Unknown language: ${language}`);\n const mechanisms = resolveMechanisms(options);\n const defaults = defaultObjectCounts(mechanisms.complexity);\n const resolved: ResolvedTrialOptions = {\n seed: integer(options.seed ?? 1, \"seed\", 0), rows: oddInteger(options.rows ?? 15, \"rows\", 7),\n cols: oddInteger(options.cols ?? 15, \"cols\", 7), braid: finiteNumber(options.braid ?? 0, \"braid\", 0, 1),\n doorCount: integer(options.doorCount ?? defaults.doors, \"doorCount\", 0),\n chestCount: integer(options.chestCount ?? defaults.chests, \"chestCount\", 0),\n trapCount: integer(options.trapCount ?? defaults.traps, \"trapCount\", 0),\n potionCount: integer(options.potionCount ?? options.medicineCount ?? defaults.potions, \"potionCount\", 0),\n mechanisms, scenario, language, style: integer(options.style ?? 0, \"style\", 0),\n minDistance: integer(options.minDistance ?? 0, \"minDistance\", 0), maxAttempts: integer(options.maxAttempts ?? 500, \"maxAttempts\", 1)\n };\n validateScenarioOptions(resolved);\n return resolved;\n}\n\nfunction validateScenarioOptions(options: ResolvedTrialOptions): void {\n if (options.scenario === \"treasure-and-leave\") {\n if (options.chestCount < 1) throw new Error(\"The treasure-and-leave scenario requires at least one chest.\");\n if (!options.mechanisms.potionKinds.includes(\"healing\")) throw new Error(\"The treasure-and-leave scenario requires healing in potionKinds.\");\n if (options.potionCount < 1) throw new Error(\"The treasure-and-leave scenario requires at least one potion.\");\n }\n if (options.scenario === \"death-and-stop\" && options.trapCount < 1) throw new Error(\"The death-and-stop scenario requires at least one trap.\");\n if (options.scenario === \"mechanism-tour\") {\n if (options.trapCount < options.mechanisms.trapDamages.length) throw new Error(\"The mechanism-tour scenario needs at least one trap for every configured trap damage.\");\n if (options.potionCount < options.mechanisms.potionKinds.length) throw new Error(\"The mechanism-tour scenario needs at least one potion for every configured potion kind.\");\n if (options.chestCount < options.mechanisms.treasureTypes.length) throw new Error(\"The mechanism-tour scenario needs at least one chest for every configured treasure type.\");\n if (options.doorCount < options.mechanisms.keyMaterials.length) throw new Error(\"The mechanism-tour scenario needs at least one door for every configured key material.\");\n }\n}\n\nfunction selectMaze(options: ResolvedTrialOptions): Maze {\n let lastError: unknown = null;\n for (let offset = 0; offset < options.maxAttempts; offset += 1) {\n const effectiveSeed = options.seed + offset;\n try {\n const base = generateSolidCellMaze({ rows: options.rows, cols: options.cols, braid: options.braid, seed: effectiveSeed, requestedSeed: options.seed, mechanisms: options.mechanisms, id: `maze-test-${options.rows}x${options.cols}-${options.seed}` });\n const maze = decorateSolidCellMaze(base, { seed: effectiveSeed + 80_000, doorCount: options.doorCount, chestCount: options.chestCount, trapCount: options.trapCount, potionCount: options.potionCount, mechanisms: options.mechanisms });\n const validation = validateSolidCellMaze(maze);\n if (!validation.valid) throw new Error(validation.errors.join(\" \"));\n if ((validation.metrics?.entryGoalDistance ?? 0) < options.minDistance) throw new Error(`The entry-goal distance is below ${options.minDistance}.`);\n const plan = buildScenarioPlan(maze, options.scenario);\n const result = simulateTrial(maze, plan.actions, plan.initialState);\n verifyScenario(options.scenario, result.answers, maze);\n return maze;\n } catch (error) { lastError = error; }\n }\n const detail = lastError instanceof Error ? ` Last error: ${lastError.message}` : \"\";\n throw new Error(`Could not generate a valid trial in ${options.maxAttempts} deterministic attempts.${detail}`);\n}\n\nfunction buildScenarioPlan(maze: Maze, scenario: ScenarioKind): { initialState: InitialState; actions: Direction[] } {\n const ample = ampleInitialState(maze);\n if (scenario === \"success\") {\n const damage = maze.objects.filter((item) => item.type === \"trap\").reduce((sum, item) => sum + item.damage, 0);\n const poisonBudget = maze.mechanisms.potionKinds.includes(\"poison\") ? maze.mechanisms.poisonDamage * maze.mechanisms.poisonDuration : 0;\n const health = Math.max(5, damage + poisonBudget + 1);\n return { initialState: { health, healthMax: health, keys: 0, treasures: 0 }, actions: pathToActions(shortestPath(maze, maze.entry, maze.goal)) };\n }\n if (scenario === \"treasure-and-leave\") {\n const healing = maze.objects.find((item) => item.type === \"medicine\" || (item.type === \"potion\" && item.kind === \"healing\"));\n const chest = maze.objects.find((item) => item.type === \"chest\");\n if (!healing || !chest) throw new Error(\"This scenario requires a healing object and a chest.\");\n let actions = routeThrough(maze, [maze.entry, healing.position, chest.position, maze.goal]);\n const leavePath = shortestPath(maze, maze.goal, chest.position).slice(0, 10);\n actions.push(...pathToActions(leavePath));\n const initialState = { ...ample, health: 50, healthMax: 100 };\n const bump = wallDirection(maze, simulateTrial(maze, actions, initialState).state.position);\n if (bump) actions.push(bump, bump);\n return { initialState, actions };\n }\n if (scenario === \"death-and-stop\") {\n const trap = maze.objects.find((item) => item.type === \"trap\");\n if (!trap) throw new Error(\"This scenario requires a trap.\");\n const actions = [...pathToActions(shortestPath(maze, maze.entry, trap.position)), ...pathToActions(shortestPath(maze, trap.position, maze.goal).slice(0, 14))];\n for (let health = 1; health <= 200; health += 1) {\n const initialState = { ...ample, health, healthMax: health };\n const result = simulateTrial(maze, actions, initialState);\n if (result.trace.some((item) => item.events.some((event) => event.type === \"trigger-trap\" && event.id === trap.id) && item.events.some((event) => event.type === \"die\"))) return { initialState, actions };\n }\n throw new Error(\"Could not choose health that makes the death-and-stop scenario die on its target trap.\");\n }\n return { initialState: { ...ample, health: 1000, healthMax: 1000 }, actions: routeThrough(maze, [maze.entry, ...maze.objects.map((item) => item.position), maze.goal]) };\n}\n\nfunction ampleInitialState(maze: Maze): InitialState {\n const material = emptyMaterialCounts();\n for (const door of maze.doors) if (door.material) material[door.material] += 1;\n for (const object of maze.objects) if (object.type === \"chest\" && object.lockMaterial) material[object.lockMaterial] += 1;\n return { health: 100, healthMax: 100, keys: maze.doors.filter((door) => !door.material).length + maze.objects.filter((item) => item.type === \"chest\" && !item.lockMaterial).length, keysByMaterial: material, treasures: 0 };\n}\n\nfunction verifyScenario(scenario: ScenarioKind, a: TrialAnswers, maze: Maze): void {\n if (scenario === \"success\" && (!a.reachedGoal || !a.alive || a.finalPosition !== letterNumberCoordinate(maze.goal))) throw new Error(\"The success scenario did not finish alive at the goal.\");\n if (scenario === \"treasure-and-leave\" && (!a.reachedGoal || a.finalPosition === letterNumberCoordinate(maze.goal) || a.openedChests < 1 || a.usedMedicines + a.usedPotions < 1 || a.blockedMoves < 2)) throw new Error(\"The treasure-and-leave scenario did not meet its invariants.\");\n if (scenario === \"death-and-stop\" && (a.alive || a.triggeredTraps < 1 || a.blockedAfterDeath < 5)) throw new Error(\"The death-and-stop scenario did not meet its invariants.\");\n if (scenario === \"mechanism-tour\") {\n const count = (type: \"chest\" | \"trap\" | \"potion\" | \"medicine\") => maze.objects.filter((item) => item.type === type).length;\n if (!a.alive || !a.reachedGoal || a.openedDoors !== maze.doors.length || a.openedChests !== count(\"chest\") || a.triggeredTraps !== count(\"trap\") || a.usedPotions !== count(\"potion\") || a.usedMedicines !== count(\"medicine\")) throw new Error(\"The mechanism-tour scenario did not exercise every generated mechanism object.\");\n }\n}\n\nfunction renderQuestion(options: ResolvedTrialOptions, maze: Maze, sections: TrialSections): string {\n const zh = options.language === \"zh\";\n const labels = zh ? [\"地图描述\", \"机制描述\", \"行动描述\", \"问题\"] : [\"Map\", \"Rules\", \"Actions\", \"Questions\"];\n const seedLine = maze.seed === options.seed ? `${zh ? \"种子\" : \"Seed\"}: ${options.seed}` : `${zh ? \"种子\" : \"Seed\"}: ${options.seed} (${zh ? \"有效迷宫种子\" : \"effective maze seed\"}: ${maze.seed})`;\n return [`# ${zh ? \"迷宫试题\" : \"Maze Trial\"}`, \"\", seedLine, `${zh ? \"机制复杂度\" : \"Mechanism complexity\"}: ${options.mechanisms.complexity}`, \"\", `## 1. ${labels[0]}`, \"\", sections.map, \"\", `## 2. ${labels[1]}`, \"\", sections.rules, \"\", `## 3. ${labels[2]}`, \"\", sections.actions, \"\", `## 4. ${labels[3]}`, \"\", sections.questions, \"\"].join(\"\\n\");\n}\n\nfunction renderAnswer(options: ResolvedTrialOptions, maze: Maze, a: TrialAnswers, actionCount: number): string {\n const zh = options.language === \"zh\";\n const rows: Array<[string, string | number]> = zh\n ? [[\"最终位置\", a.finalPosition], [\"最终钥匙总数\", a.keys], [\"最终宝物总数\", a.treasures], [\"最终健康值\", a.health], [\"是否存活\", a.alive ? \"是\" : \"否\"], [\"是否曾到达终点\", a.reachedGoal ? \"是\" : \"否\"], [\"打开的门\", a.openedDoors], [\"打开的宝箱\", a.openedChests], [\"触发的陷阱\", a.triggeredTraps]]\n : [[\"Final position\", a.finalPosition], [\"Keys remaining in total\", a.keys], [\"Treasures collected in total\", a.treasures], [\"Health remaining\", a.health], [\"Alive\", a.alive ? \"Yes\" : \"No\"], [\"Ever reached the goal\", a.reachedGoal ? \"Yes\" : \"No\"], [\"Doors opened\", a.openedDoors], [\"Chests opened\", a.openedChests], [\"Traps triggered\", a.triggeredTraps]];\n if (maze.objects.some((item) => item.type === \"medicine\")) rows.push([zh ? \"使用的药品房\" : \"Medicine rooms used\", a.usedMedicines]);\n if (maze.objects.some((item) => item.type === \"potion\")) rows.push([zh ? \"饮用的药水\" : \"Potions drunk\", a.usedPotions]);\n rows.push([zh ? \"未改变位置的原子移动指令\" : \"Atomic movement instructions that did not change position\", a.blockedMoves]);\n for (const material of maze.mechanisms.keyMaterials) rows.push([zh ? `剩余${MATERIAL_NAMES[material].zh}钥匙` : `${capitalize(MATERIAL_NAMES[material].en)} keys remaining`, a.keysByMaterial[material]]);\n if (maze.mechanisms.treasureTypes.some((type) => type !== \"treasure\")) for (const type of maze.mechanisms.treasureTypes) rows.push([zh ? `${TREASURE_NAMES[type].zh}数量` : `${capitalize(TREASURE_NAMES[type].en)}s collected`, a.treasuresByType[type]]);\n if (maze.mechanisms.complexity === \"advanced\") rows.push([zh ? \"累计耗时(时间单位)\" : \"Elapsed time (time units)\", a.elapsedTime], [zh ? \"最终速度状态\" : \"Final speed state\", SPEED_NAMES[a.finalSpeed][zh ? \"zh\" : \"en\"]], [zh ? \"速度效果剩余指令数\" : \"Speed-effect instructions remaining\", a.speedRemaining], [zh ? \"中毒剩余指令数\" : \"Poison instructions remaining\", a.poisonRemaining]);\n return [`# ${zh ? \"标准答案\" : \"Answer Key\"}`, \"\", `${zh ? \"种子\" : \"Seed\"}: ${options.seed}`, ...(maze.seed === options.seed ? [] : [`${zh ? \"有效迷宫种子\" : \"Effective maze seed\"}: ${maze.seed}`]), \"\", `| ${zh ? \"问题\" : \"Item\"} | ${zh ? \"答案\" : \"Answer\"} |`, \"|---|---|\", ...rows.map(([label, value]) => `| ${label} | ${String(value)} |`), \"\", `${zh ? \"原子移动指令数\" : \"Atomic movement instruction count\"}: ${actionCount}`, \"\"].join(\"\\n\");\n}\n\nfunction renderMapDescription(maze: Maze, initial: InitialState, language: Language, style: number): string {\n const terrain = renderTerrainDescription(maze, language, style);\n const objects = renderObjectDescription(maze, language);\n if (language === \"zh\") return [`这是一座${maze.rows}行${maze.cols}列的迷宫。左上角为A1,列从左向右依次标为A至${columnLabel(maze.cols)},行从上向下编号为1至${maze.rows}。`, `入口位于${letterNumberCoordinate(maze.entry)},终点位于${letterNumberCoordinate(maze.goal)}。`, \"\", terrain, \"\", \"门和对象的位置如下;门与对象所在格仍是可以进入的通路格。\", objects, \"\", `探险者从入口出发,初始健康值为${initial.health},健康上限为${initial.healthMax};${initialPossessions(initial, language)};初始未中毒、速度为正常;“曾经到达终点”记录为假。`].join(\"\\n\");\n return [`This maze has ${maze.rows} rows and ${maze.cols} columns. The top-left cell is A1. Columns run left to right from A to ${columnLabel(maze.cols)}, and rows run top to bottom from 1 to ${maze.rows}.`, `The entry is at ${letterNumberCoordinate(maze.entry)}, and the goal is at ${letterNumberCoordinate(maze.goal)}.`, \"\", terrain, \"\", \"Door and object locations follow. A cell containing a door or object is still a passage cell that may be entered, subject to the door rule.\", objects, \"\", `The explorer starts at the entry with ${initial.health} health, a maximum health of ${initial.healthMax}, ${initialPossessions(initial, language)}, no poison, normal speed, and reached-goal set to false.`].join(\"\\n\");\n}\n\nfunction renderTerrainDescription(maze: Maze, language: Language, style: number): string {\n const clauses = Array.from({ length: maze.rows }, (_, index) => index + 1).map((row) => {\n const kinds = Array.from({ length: maze.cols }, (_, index) => terrainAt(maze, cell(row, index + 1)) === \".\" ? \"floor\" : \"wall\");\n const label = language === \"zh\" ? [`第${row}行`, `${row}、`, `(${row})`][style % 3] : `Row ${row}: `;\n return `${label ?? `第${row}行`}${describeTerrainLine(kinds, language)}`;\n });\n return language === \"zh\" ? [\"每行内部的格子均从左往右计数。从上往下,各行的格子情况如下:\", `${clauses.join(\";\\n\")}。`].join(\"\\n\") : [\"Within each row, cells are counted from left to right:\", `${clauses.join(\";\\n\")}.`].join(\"\\n\");\n}\n\nfunction describeTerrainLine(kinds: string[], language: Language): string {\n const walls: number[] = []; const floors: number[] = [];\n for (let index = 0; index < kinds.length; index += 1) (kinds[index] === \"wall\" ? walls : floors).push(index + 1);\n if (language === \"zh\") {\n if (walls.length === 0) return \"都是通路\"; if (floors.length === 0) return \"都是墙壁\";\n const limit = Math.floor(kinds.length / 3);\n if (walls.length <= limit) return `除了${positionList(walls, language)}是墙壁以外,其余都是通路`;\n if (floors.length <= limit) return `除了${positionList(floors, language)}是通路以外,其余都是墙壁`;\n return `${positionList(walls, language)}是墙壁,${positionList(floors, language)}是通路`;\n }\n if (walls.length === 0) return \"all cells are passages\"; if (floors.length === 0) return \"all cells are walls\";\n const limit = Math.floor(kinds.length / 3);\n if (walls.length <= limit) return `all cells are passages except ${positionList(walls, language)}, which ${walls.length === 1 ? \"is a wall\" : \"are walls\"}`;\n if (floors.length <= limit) return `all cells are walls except ${positionList(floors, language)}, which ${floors.length === 1 ? \"is a passage\" : \"are passages\"}`;\n return `${positionList(walls, language)} ${walls.length === 1 ? \"is a wall\" : \"are walls\"}; ${positionList(floors, language)} ${floors.length === 1 ? \"is a passage\" : \"are passages\"}`;\n}\n\nfunction positionList(indices: number[], language: Language): string {\n const ranges: Array<[number, number]> = []; let start = indices[0]; let end = indices[0];\n if (start === undefined || end === undefined) return \"\";\n for (const value of indices.slice(1)) { if (value === end + 1) { end = value; continue; } ranges.push([start, end]); start = value; end = value; }\n ranges.push([start, end]);\n const parts = ranges.map(([from, to]) => language === \"zh\" ? (from === to ? `第${from}格` : `第${from}格至第${to}格`) : (from === to ? `cell ${from}` : `cells ${from}-${to}`));\n if (parts.length === 1) return parts[0] ?? \"\";\n return language === \"zh\" ? `${parts.slice(0, -1).join(\"、\")}和${parts.at(-1)}` : `${parts.slice(0, -1).join(\", \")} and ${parts.at(-1)}`;\n}\n\nfunction renderObjectDescription(maze: Maze, language: Language): string {\n const lines: string[] = [];\n for (const door of maze.doors) {\n const at = letterNumberCoordinate(door.position);\n lines.push(language === \"zh\" ? `${at}有一道初始关闭的${door.material ? MATERIAL_NAMES[door.material].zh : \"普通\"}门。` : `${at} contains an initially closed ${door.material ? `${MATERIAL_NAMES[door.material].en} ` : \"ordinary \"}door.`);\n }\n for (const object of maze.objects) {\n const at = letterNumberCoordinate(object.position);\n if (object.type === \"key\") lines.push(language === \"zh\" ? `${at}放着一把${object.material ? MATERIAL_NAMES[object.material].zh : \"普通\"}钥匙。` : `${at} contains one ${object.material ? `${MATERIAL_NAMES[object.material].en} ` : \"ordinary \"}key.`);\n else if (object.type === \"chest\") {\n const contents = (object.contents ?? [{ type: \"treasure\" as const, count: object.treasures }]).map((item) => language === \"zh\" ? `${item.count}${treasureUnit(item.type)}${TREASURE_NAMES[item.type].zh}` : `${item.count} ${TREASURE_NAMES[item.type].en}${plural(item.count)}`).join(language === \"zh\" ? \"、\" : \" and \");\n const lock = object.lockMaterial ? `a ${MATERIAL_NAMES[object.lockMaterial].en} lock` : \"an ordinary lock\";\n lines.push(language === \"zh\" ? `${at}有一只初始关闭的${object.lockMaterial ? MATERIAL_NAMES[object.lockMaterial].zh : \"普通\"}锁宝箱,内有${contents}。` : `${at} contains an initially closed chest with ${lock}, containing ${contents}.`);\n } else if (object.type === \"trap\") lines.push(language === \"zh\" ? `${at}有一个尚未触发的陷阱,伤害为${object.damage}点。` : `${at} contains an untriggered trap that deals ${object.damage} damage.`);\n else if (object.type === \"medicine\") lines.push(language === \"zh\" ? `${at}有一个尚未使用的药品房,可恢复${object.recovery}点健康值。` : `${at} contains an unused medicine room that restores ${object.recovery} health.`);\n else {\n const details = potionDetails(object.kind, object.potency, object.duration, language);\n lines.push(language === \"zh\" ? `${at}有一瓶尚未饮用的${POTION_NAMES[object.kind].zh}${details}。` : `${at} contains an unused ${POTION_NAMES[object.kind].en}${details}.`);\n }\n }\n return lines.length > 0 ? lines.join(\"\\n\") : language === \"zh\" ? \"没有门或其他对象。\" : \"There are no doors or other objects.\";\n}\n\nfunction potionDetails(kind: PotionKind, potency: number | undefined, duration: number | undefined, language: Language): string {\n if (language === \"zh\") {\n if (kind === \"healing\") return `,恢复${potency ?? 1}点健康值,但不超过健康上限`;\n if (kind === \"poison\") return `,使饮用者在之后${duration ?? 1}条原子移动指令各损失${potency ?? 1}点健康值`;\n if (kind === \"haste\" || kind === \"slow\") return `,效果持续之后${duration ?? 1}条原子移动指令`;\n return \",可立即清除中毒状态\";\n }\n if (kind === \"healing\") return ` that restores ${potency ?? 1} health without exceeding maximum health`;\n if (kind === \"poison\") return ` that causes ${potency ?? 1} damage after each of the next ${duration ?? 1} atomic movement instructions`;\n if (kind === \"haste\" || kind === \"slow\") return ` whose effect lasts for the next ${duration ?? 1} atomic movement instructions`;\n return \" that immediately clears poison\";\n}\n\nfunction renderRules(maze: Maze, language: Language): string {\n const m = maze.mechanisms;\n const usesPotionObjects = maze.objects.some((item) => item.type === \"potion\");\n const usesPoison = usesPotionObjects && m.potionKinds.some((kind) => kind === \"poison\" || kind === \"antidote\");\n const usesMaterials = m.keyMaterials.length > 0;\n const doorRuleZh = usesMaterials\n ? \"目标格是关闭的门时,必须消耗一把与门材质相同的钥匙;钥匙不足或材质不符时停在原地。钥匙匹配时,在同一条指令中开门并进入门格。门一经打开便永久保持打开。\"\n : \"目标格是关闭的普通门时,必须消耗一把普通钥匙;没有普通钥匙时停在原地。有钥匙时,在同一条指令中开门并进入门格。门一经打开便永久保持打开。\";\n const doorRuleEn = usesMaterials\n ? \"If the target cell contains a closed door, the explorer must spend one key whose material matches the door. Without a matching key, the explorer stays in place. With a matching key, the door opens and the explorer enters the door cell in the same instruction. Once opened, a door remains open.\"\n : \"If the target cell contains a closed ordinary door, the explorer must spend one ordinary key. Without an ordinary key, the explorer stays in place. With one, the door opens and the explorer enters the door cell in the same instruction. Once opened, a door remains open.\";\n const chestRuleZh = usesMaterials\n ? \"每次进入含有尚未打开宝箱的格子时,若持有与锁材质相同的钥匙,则消耗一把该钥匙、打开宝箱并取得箱中全部物品;否则宝箱保持关闭。宝箱格无论是否打开都可以进入或经过。箱内每一枚钱币、每一颗宝石或每一件遗物都分别计为一件宝物。\"\n : \"每次进入含有尚未打开普通锁宝箱的格子时,若持有普通钥匙,则消耗一把普通钥匙、打开宝箱并取得箱中全部物品;否则宝箱保持关闭。宝箱格无论是否打开都可以进入或经过。箱内每件物品计为一件宝物。\";\n const chestRuleEn = usesMaterials\n ? \"Whenever the explorer enters a cell containing an unopened chest, if a key matching its lock is available, one such key is spent, the chest opens, and all its contents are collected; otherwise, the chest remains closed. A chest cell may be entered or crossed whether or not the chest is open. Each coin, gem, or relic counts as one treasure.\"\n : \"Whenever the explorer enters a cell containing an unopened chest with an ordinary lock, if an ordinary key is available, one ordinary key is spent, the chest opens, and all its contents are collected; otherwise, the chest remains closed. A chest cell may be entered or crossed whether or not the chest is open. Each item inside counts as one treasure.\";\n const orderRuleZh = m.complexity === \"advanced\"\n ? \"一条指令中,依次结算耗时、移动与目标格效果、到达终点记录、该指令开始时已有的中毒与速度状态,最后判断是否死亡。\"\n : usesPoison\n ? \"一条指令中,依次结算移动与目标格效果、到达终点记录、该指令开始时已有的中毒状态,最后判断是否死亡。\"\n : \"一条指令中,依次结算移动与目标格效果、到达终点记录,最后判断是否死亡。\";\n const orderRuleEn = m.complexity === \"advanced\"\n ? \"Within one instruction, resolve time cost first, then movement and target-cell effects, then the reached-goal record, then poison and speed states that were active at the instruction's start, and finally death.\"\n : usesPoison\n ? \"Within one instruction, resolve movement and target-cell effects, then the reached-goal record, then poison that was active at the instruction's start, and finally death.\"\n : \"Within one instruction, resolve movement and target-cell effects, then the reached-goal record, and finally death.\";\n const poisonRuleZh = \"毒药从饮用后的下一条原子移动指令开始生效。每条指令(包括因墙、地图边界或门而未移动的指令)结束时扣除指定健康值并减少一次剩余次数。饮用新的毒药会覆盖原中毒状态;饮用毒药或解毒药水的当前指令都不会触发原有毒素。\";\n const poisonRuleEn = \"Poison starts with the instruction after it is drunk. At the end of each such instruction—including one blocked by a wall, map boundary, or door—it deals the stated damage and consumes one remaining instruction. New poison replaces any previous poison; neither a poison potion nor an antidote potion lets the previous poison tick on the instruction in which it is drunk.\";\n const speedRuleZh = `每条原子移动指令在开始时按当时速度计入时间单位:正常${m.movementTime.normal}、加速${m.movementTime.fast}、减速${m.movementTime.slow}。饮用加速药水会把速度设为加速,饮用减速药水会把速度设为减速;两种效果都从饮用后的下一条指令开始,持续指定数量的指令。撞墙或被门挡住也会消耗一次持续次数。饮用速度药水的当前指令按饮用前的速度计时;新速度药水覆盖旧速度状态,当前指令不消耗旧状态或新状态的持续次数。持续次数耗尽后,速度恢复为正常,剩余指令数为0。`;\n const speedRuleEn = `At the start of each atomic movement instruction, add time units according to the current speed: normal ${m.movementTime.normal}, fast ${m.movementTime.fast}, slow ${m.movementTime.slow}. A haste potion sets speed to fast, and a slow potion sets speed to slow; either effect starts with the instruction after it is drunk and lasts for its stated number of instructions. Blocked instructions also consume one duration. The instruction that drinks a speed potion uses the pre-drink speed for time. A new speed potion replaces the previous speed state, and that instruction consumes neither the old nor the new duration. When the duration is exhausted, speed returns to normal with 0 speed-effect instructions remaining.`;\n const rules = language === \"zh\" ? [\n \"每条原子移动指令只尝试向上、下、左或右相邻的一格移动。行动描述中的“移动N格”表示连续执行N条同方向的原子移动指令。初始位于入口不视为进入该格;只有成功移动进入目标格时,才结算该格的效果。\",\n \"若目标格是墙格或在地图外,探险者停在原地,但该指令仍算作一条已执行的原子移动指令,之后的指令继续执行。\",\n doorRuleZh,\n \"第一次进入钥匙格时取得该钥匙;同一把钥匙不能重复取得。\",\n chestRuleZh,\n \"第一次进入陷阱格时受到该陷阱标明的伤害;同一陷阱以后不再生效。\",\n usesPotionObjects ? \"药水格是指含有治疗药水、毒药、解毒药水、加速药水或减速药水的格子。第一次进入药水格时立即饮用其中的药水并应用其效果;同一瓶药水不能重复饮用。\" : \"第一次进入药品房时恢复其标明的健康值,但不超过健康上限;同一药品房以后不再生效。\",\n orderRuleZh,\n ...(usesPoison ? [poisonRuleZh] : []),\n ...(m.complexity === \"advanced\" ? [speedRuleZh] : []),\n \"健康值降至0或以下时,将健康值记为0,探险者死亡。死亡后尚未执行的指令仍被读取,但不移动、不耗时,也不改变任何状态。\",\n \"一旦进入终点格,“曾经到达终点”永久记为真,即使后来离开或死亡也不撤销。\"\n ] : [\n \"Each atomic movement instruction attempts to move exactly one cell up, down, left, or right. A direction followed by N cells means N consecutive atomic movement instructions in that direction. Starting at the entry does not count as entering its cell; target-cell effects are resolved only after a successful movement into that cell.\",\n \"If the target is a wall or outside the map, the explorer stays in place. The instruction still counts as executed, and later instructions continue.\",\n doorRuleEn,\n \"The first time the explorer enters a key cell, that key is collected. A key cannot be collected twice.\",\n chestRuleEn,\n \"The first time the explorer enters a trap cell, the trap reduces health by its stated amount. That trap has no effect afterward.\",\n usesPotionObjects ? \"A potion cell contains a healing, poison, antidote, haste, or slow potion. The first time the explorer enters a potion cell, its potion is drunk immediately and its effect is applied. A potion cannot be drunk twice.\" : \"The first time the explorer enters a medicine room, it restores the stated health without exceeding maximum health. It has no effect afterward.\",\n orderRuleEn,\n ...(usesPoison ? [poisonRuleEn] : []),\n ...(m.complexity === \"advanced\" ? [speedRuleEn] : []),\n \"If health becomes 0 or less, set it to 0 and the explorer dies. Remaining instructions are still read but cause no movement, consume no time, and change no state.\",\n \"Once the explorer enters the goal, ever-reached-goal remains true even if the explorer later leaves or dies.\"\n ];\n return rules.map((rule, index) => `${index + 1}. ${rule}`).join(\"\\n\");\n}\n\nfunction renderQuestions(maze: Maze, language: Language): string {\n const materialKeys = maze.mechanisms.keyMaterials.length > 0;\n const questions = language === \"zh\" ? [\"全部指令处理完毕后,探险者位于哪一格?\", materialKeys ? \"最后持有的钥匙总数(所有材质合计)是多少?\" : \"最后持有几把普通钥匙?\", \"最后取得的宝物总数(所有类型合计)是多少?\", \"最后剩余多少健康值?\", \"最后是否存活?\", \"是否曾经到达终点?\", \"共打开几道门?\", \"共打开几只宝箱?\", \"共触发几个陷阱?\"] : [\"Which cell contains the explorer after all instructions have been processed?\", materialKeys ? \"How many keys remain in total across all key materials?\" : \"How many ordinary keys remain?\", \"How many treasures were collected in total across all treasure types?\", \"How much health remains?\", \"Is the explorer alive at the end?\", \"Did the explorer ever reach the goal?\", \"How many doors were opened?\", \"How many chests were opened?\", \"How many traps were triggered?\"];\n if (maze.objects.some((item) => item.type === \"medicine\")) questions.push(language === \"zh\" ? \"共使用几个药品房?\" : \"How many medicine rooms were used?\");\n if (maze.objects.some((item) => item.type === \"potion\")) questions.push(language === \"zh\" ? \"共饮用几瓶药水?\" : \"How many potions were drunk?\");\n questions.push(language === \"zh\" ? \"按全部列出的原子移动指令计数(包括死亡后仍被读取的指令),其中多少条没有改变探险者的位置?\" : \"Counting every listed atomic movement instruction, including instructions read after death, how many did not change the explorer's position?\");\n for (const material of maze.mechanisms.keyMaterials) questions.push(language === \"zh\" ? `最后剩余几把${MATERIAL_NAMES[material].zh}钥匙?` : `How many ${MATERIAL_NAMES[material].en} keys remain?`);\n if (maze.mechanisms.treasureTypes.some((type) => type !== \"treasure\")) for (const type of maze.mechanisms.treasureTypes) questions.push(language === \"zh\" ? `共取得多少${treasureUnit(type)}${TREASURE_NAMES[type].zh}?` : `How many ${TREASURE_NAMES[type].en}s were collected?`);\n if (maze.mechanisms.complexity === \"advanced\") questions.push(language === \"zh\" ? \"累计耗时是多少个时间单位?\" : \"What is the total elapsed time in time units?\", language === \"zh\" ? \"最终速度状态(正常、加速或减速)及速度效果剩余指令数分别是什么?\" : \"What are the final speed state (normal, fast, or slow) and the number of speed-effect instructions remaining?\", language === \"zh\" ? \"最终中毒状态还剩几条指令?\" : \"How many poison instructions remain at the end?\");\n return questions.map((item, index) => `${index + 1}. ${item}`).join(\"\\n\");\n}\n\nfunction renderActionDescription(actions: Direction[], language: Language, style: number): string {\n const runs = compressActions(actions);\n if (language === \"zh\") {\n const connectors = [\"随后\", \"接着\", \"然后\", \"再\", \"之后\"];\n return paragraphize(runs.map((run, index) => `${index === 0 ? \"探险者先\" : connectors[(style + index) % connectors.length] ?? \"然后\"}向${DIRECTIONS[run.direction].zh}移动${run.count}格`), \",\", \"。\");\n }\n return paragraphize(runs.map((run, index) => `${index === 0 ? \"First, the explorer moves\" : index % 4 === 0 ? \"The explorer then moves\" : \"then moves\"} ${DIRECTIONS[run.direction].en} ${run.count} cell${plural(run.count)}`), \", \", \".\");\n}\n\nfunction paragraphize(clauses: string[], separator: string, terminator: string): string {\n const sentences: string[] = [];\n for (let index = 0; index < clauses.length; index += 4) sentences.push(`${clauses.slice(index, index + 4).join(separator)}${terminator}`);\n return sentences.join(\"\\n\");\n}\n\nfunction compressActions(actions: Direction[]): Array<{ direction: Direction; count: number }> {\n const runs: Array<{ direction: Direction; count: number }> = [];\n for (const direction of actions) {\n const prior = runs.at(-1);\n if (prior?.direction === direction) prior.count += 1;\n else runs.push({ direction, count: 1 });\n }\n return runs;\n}\n\nfunction routeThrough(maze: Maze, points: Cell[]): Direction[] {\n const actions: Direction[] = [];\n for (let index = 1; index < points.length; index += 1) {\n const from = points[index - 1]; const to = points[index];\n if (!from || !to) continue;\n const path = shortestPath(maze, from, to);\n if (path.length === 0) throw new Error(\"Could not connect scenario waypoints.\");\n actions.push(...pathToActions(path));\n }\n return actions;\n}\n\nfunction pathToActions(path: Cell[]): Direction[] {\n const actions: Direction[] = [];\n for (let index = 1; index < path.length; index += 1) {\n const current = path[index]; const prior = path[index - 1];\n if (!current || !prior) continue;\n const dr = current.row - prior.row; const dc = current.col - prior.col;\n actions.push(dr === -1 ? \"up\" : dr === 1 ? \"down\" : dc === -1 ? \"left\" : \"right\");\n }\n return actions;\n}\n\nfunction wallDirection(maze: Maze, position: Cell): Direction | null {\n const candidates: Array<[Direction, Cell]> = [[\"up\", cell(position.row - 1, position.col)], [\"down\", cell(position.row + 1, position.col)], [\"left\", cell(position.row, position.col - 1)], [\"right\", cell(position.row, position.col + 1)]];\n return candidates.find(([, target]) => terrainAt(maze, target) !== \".\")?.[0] ?? null;\n}\n\nfunction initialPossessions(state: InitialState, language: Language): string {\n const materials = emptyMaterialCounts(state.keysByMaterial);\n const parts = (Object.keys(materials) as KeyMaterial[]).filter((key) => materials[key] > 0).map((key) => language === \"zh\" ? `${materials[key]}把${MATERIAL_NAMES[key].zh}钥匙` : `${materials[key]} ${MATERIAL_NAMES[key].en} key${plural(materials[key])}`);\n if (state.keys > 0) parts.unshift(language === \"zh\" ? `${state.keys}把普通钥匙` : `${state.keys} ordinary key${plural(state.keys)}`);\n const keys = parts.length > 0 ? parts.join(language === \"zh\" ? \"、\" : \", \") : language === \"zh\" ? \"没有钥匙\" : \"no keys\";\n const treasures = state.treasures > 0 ? (language === \"zh\" ? `${state.treasures}件宝物` : `${state.treasures} treasure${plural(state.treasures)}`) : language === \"zh\" ? \"没有宝物\" : \"no treasures\";\n return language === \"zh\" ? `持有${keys},${treasures}` : `${keys} and ${treasures}`;\n}\n\nfunction treasureUnit(type: TreasureType): string {\n return type === \"coin\" ? \"枚\" : type === \"gem\" ? \"颗\" : \"件\";\n}\n\nfunction plural(value: number): string { return value === 1 ? \"\" : \"s\"; }\nfunction capitalize(value: string): string { return `${value[0]?.toUpperCase() ?? \"\"}${value.slice(1)}`; }\nfunction integer(value: number, name: string, minimum: number): number { if (!Number.isInteger(value) || value < minimum) throw new Error(`${name} must be an integer greater than or equal to ${minimum}.`); return value; }\nfunction oddInteger(value: number, name: string, minimum: number): number { integer(value, name, minimum); if (value % 2 === 0) throw new Error(`${name} must be odd.`); return value; }\nfunction finiteNumber(value: number, name: string, minimum: number, maximum: number): number { if (!Number.isFinite(value) || value < minimum || value > maximum) throw new Error(`${name} must be between ${minimum} and ${maximum}.`); return value; }\n"],"mappings":"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","names":["next","limit"]}