@dreamboard-games/sdk 0.4.0-alpha.0 → 0.4.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/REFERENCE.md +1849 -379
- package/dist/{ResourceCounter-BTXklCEZ.d.ts → ResourceCounter-BuiNstXs.d.ts} +5 -1
- package/dist/{ThemeProvider-DvMl17Ny.d.ts → ThemeProvider-B1sIoBlX.d.ts} +1 -1
- package/dist/attributes-DbvyMbXw.d.ts +68 -0
- package/dist/authoring/index.d.ts +66 -0
- package/dist/authoring/index.js +560 -0
- package/dist/authoring/index.js.map +1 -0
- package/dist/browser-interaction.d.ts +246 -44
- package/dist/browser-interaction.js +14 -1
- package/dist/{chunk-Q5O7GPVY.js → chunk-45FI6XII.js} +630 -375
- package/dist/chunk-45FI6XII.js.map +1 -0
- package/dist/{chunk-4G7552LO.js → chunk-6JQFGSLD.js} +216 -47
- package/dist/chunk-6JQFGSLD.js.map +1 -0
- package/dist/{chunk-NBAEEHAU.js → chunk-CP35NPPY.js} +5926 -5266
- package/dist/chunk-CP35NPPY.js.map +1 -0
- package/dist/{chunk-2LDZ5C3T.js → chunk-FWVV2X74.js} +2 -2
- package/dist/{chunk-MNKDSGIA.js → chunk-HWJS3VOJ.js} +6 -2
- package/dist/chunk-HWJS3VOJ.js.map +1 -0
- package/dist/chunk-K5ZRJTZZ.js +328 -0
- package/dist/chunk-K5ZRJTZZ.js.map +1 -0
- package/dist/{chunk-U5KBV2BA.js → chunk-N6ZDIMRB.js} +444 -223
- package/dist/chunk-N6ZDIMRB.js.map +1 -0
- package/dist/chunk-O6M6PN4E.js +1225 -0
- package/dist/chunk-O6M6PN4E.js.map +1 -0
- package/dist/chunk-PF7L4BMG.js +117 -0
- package/dist/chunk-PF7L4BMG.js.map +1 -0
- package/dist/{chunk-P7F4L2FF.js → chunk-WOWFONLZ.js} +609 -1287
- package/dist/chunk-WOWFONLZ.js.map +1 -0
- package/dist/{chunk-QLG6VEMW.js → chunk-WUIVY2KE.js} +318 -21
- package/dist/chunk-WUIVY2KE.js.map +1 -0
- package/dist/chunk-ZAS2SENW.js +12 -0
- package/dist/chunk-ZAS2SENW.js.map +1 -0
- package/dist/codegen.d.ts +11 -1
- package/dist/codegen.js +1 -1
- package/dist/{components-DaIqi9QM.d.ts → components-BbWPnZCF.d.ts} +37 -70
- package/dist/{hex-board-view-UCUjMALd.d.ts → hex-board-view-Kz9Q_zsv.d.ts} +1 -1
- package/dist/index.js +2 -1
- package/dist/package-set.d.ts +2 -2
- package/dist/package-set.js +2 -1
- package/dist/player-state-Cqpyeql0.d.ts +371 -0
- package/dist/protocol-BP193lva.d.ts +267 -0
- package/dist/reducer/advanced.d.ts +2 -2
- package/dist/reducer/advanced.js +1 -1
- package/dist/reducer-contract.js +1 -1
- package/dist/reducer.d.ts +7 -7
- package/dist/reducer.js +190 -183
- package/dist/reducer.js.map +1 -1
- package/dist/runtime/primitives.d.ts +10 -9
- package/dist/runtime/primitives.js +9 -6
- package/dist/runtime/runtime-api.d.ts +2 -2
- package/dist/runtime/workspace-contract.d.ts +28 -76
- package/dist/runtime/workspace-contract.js +7 -5
- package/dist/runtime-api-BJharVaj.d.ts +198 -0
- package/dist/runtime-api-C6aWo9c0.d.ts +95 -0
- package/dist/runtime-json-CQ9QbLZ5.d.ts +5 -0
- package/dist/runtime.d.ts +80 -11
- package/dist/runtime.js +89 -445
- package/dist/runtime.js.map +1 -1
- package/dist/testing.d.ts +643 -22
- package/dist/testing.js +1371 -76
- package/dist/testing.js.map +1 -1
- package/dist/types-CYeN0wLK.d.ts +29 -0
- package/dist/{attributes-BeRyboMS.d.ts → types-DJj5MJkl.d.ts} +32 -55
- package/dist/types.d.ts +14 -7
- package/dist/ui/components.d.ts +4 -5
- package/dist/ui/components.js +19 -1
- package/dist/ui/player-state.d.ts +2 -365
- package/dist/ui/plugin-styles.css +1 -1
- package/dist/{ui-contract-BUC6iS3s.d.ts → ui-contract-CY7cxsCC.d.ts} +17 -26
- package/dist/ui.d.ts +8 -13
- package/dist/ui.js +20 -2
- package/dist/{views-B0hlW6IT.d.ts → views-fn2RuXOx.d.ts} +59 -44
- package/package.json +28 -4
- package/dist/chunk-4G7552LO.js.map +0 -1
- package/dist/chunk-MNKDSGIA.js.map +0 -1
- package/dist/chunk-NBAEEHAU.js.map +0 -1
- package/dist/chunk-P7F4L2FF.js.map +0 -1
- package/dist/chunk-Q5O7GPVY.js.map +0 -1
- package/dist/chunk-QLG6VEMW.js.map +0 -1
- package/dist/chunk-U5KBV2BA.js.map +0 -1
- package/dist/hex-color-MhOyuY-o.d.ts +0 -8
- package/dist/runtime-api-BXd70c2e.d.ts +0 -490
- /package/dist/{chunk-2LDZ5C3T.js.map → chunk-FWVV2X74.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reducer/model/manifest.ts","../src/reducer/model/error-codes.ts","../src/reducer/per-player.ts","../src/reducer/inputs/targetRule.ts","../src/reducer/inputs/cardTarget.ts","../src/reducer/inputs/cardInput.ts","../src/reducer/table/internal.ts","../src/reducer/table/board-queries.ts","../src/reducer/table/card-validation.ts","../src/reducer/table/phase-state.ts","../src/reducer/table/clone.ts","../src/reducer/table/component-locations.ts","../src/reducer/table/zone-queries.ts","../src/reducer/table/resource-ops.ts","../src/reducer/table/component-mutations.ts","../src/reducer/table/card-mutations.ts","../src/reducer/rng.ts","../src/reducer/setup-bootstrap.ts","../src/reducer/definition-index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n AnySchema,\n RuntimeHandVisibilityMode,\n RuntimeTableRecord,\n SchemaLike,\n} from \"./table\";\nimport type {\n BoardBaseIdOfManifest,\n BoardContainerIdOfManifest,\n CardIdOfManifest,\n CardIdOfTable,\n DeckIdOfTable,\n DieIdOfManifest,\n HandIdOfTable,\n PieceIdOfManifest,\n PlayerIdOfManifest,\n PlayerIdOfTable,\n SetupSelectionInputOfManifest,\n PlayerZoneIdOfManifest,\n SetupSelectionOfManifest,\n SharedZoneIdOfManifest,\n SpaceIdOfManifest,\n} from \"./extract\";\nimport type { TableQueriesOfState } from \"./queries\";\n\ndeclare const manifestIdSchemaBrand: unique symbol;\n\nexport type ManifestIdSchema<Output = unknown> = z.ZodType<Output> & {\n readonly [manifestIdSchemaBrand]: true;\n};\n\nexport type ManifestLiterals<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerIds: readonly PlayerId[];\n phaseNames: readonly PhaseName[];\n boardLayouts: readonly (\"generic\" | \"hex\" | \"square\")[];\n setupOptionIds: readonly string[];\n setupProfileIds: readonly string[];\n cardSetIds: readonly string[];\n cardTypes: readonly string[];\n deckIds: readonly DeckId[];\n handIds: readonly HandId[];\n sharedZoneIds: readonly DeckId[];\n playerZoneIds: readonly HandId[];\n zoneIds: readonly (DeckId | HandId)[];\n cardIds: readonly CardId[];\n resourceIds: readonly string[];\n resourcePresentationById?: Record<\n string,\n { label: string; icon?: string | null }\n >;\n pieceTypeIds: readonly string[];\n pieceIds: readonly string[];\n dieTypeIds: readonly string[];\n dieIds: readonly string[];\n boardTemplateIds: readonly string[];\n boardTypeIds: readonly string[];\n boardBaseIds: readonly string[];\n boardIds: readonly string[];\n boardContainerIds: readonly string[];\n relationTypeIds: readonly string[];\n edgeIds: readonly string[];\n edgeTypeIds: readonly string[];\n vertexIds: readonly string[];\n vertexTypeIds: readonly string[];\n spaceIds: readonly string[];\n spaceTypeIds: readonly string[];\n handVisibilityById: Record<HandId, RuntimeHandVisibilityMode>;\n zoneVisibilityById: Record<DeckId | HandId, RuntimeHandVisibilityMode>;\n setupChoiceIdsByOptionId: Record<string, readonly string[]>;\n cardSetIdByCardId: Record<CardId, string>;\n cardTypeByCardId: Record<CardId, string>;\n cardSetIdsBySharedZoneId: Record<DeckId, readonly string[]>;\n cardSetIdsByPlayerZoneId: Record<HandId, readonly string[]>;\n};\n\nexport type ManifestIds<\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n PhaseName extends string = string,\n> = {\n playerId: z.ZodType<PlayerId>;\n phaseName: z.ZodType<PhaseName>;\n boardLayout: AnySchema;\n setupOptionId: AnySchema;\n setupProfileId: AnySchema;\n cardSetId: AnySchema;\n cardType: AnySchema;\n cardId: z.ZodType<CardId>;\n deckId: z.ZodType<DeckId>;\n handId: z.ZodType<HandId>;\n sharedZoneId: AnySchema;\n playerZoneId: AnySchema;\n zoneId: AnySchema;\n resourceId: AnySchema;\n pieceTypeId: AnySchema;\n pieceId: AnySchema;\n dieId: AnySchema;\n dieTypeId: AnySchema;\n boardTypeId: AnySchema;\n boardId: AnySchema;\n boardBaseId: AnySchema;\n boardContainerId: AnySchema;\n relationTypeId: AnySchema;\n edgeId: AnySchema;\n edgeTypeId: AnySchema;\n vertexId: AnySchema;\n vertexTypeId: AnySchema;\n spaceId: AnySchema;\n spaceTypeId: AnySchema;\n};\n\nexport type ManifestDefaults<Table extends RuntimeTableRecord> = {\n zones: (playerIds?: readonly string[]) => Table[\"zones\"];\n decks: (playerIds?: readonly string[]) => Table[\"decks\"];\n hands: (playerIds?: readonly string[]) => Table[\"hands\"];\n handVisibility: (playerIds?: readonly string[]) => Table[\"handVisibility\"];\n ownerOfCard: (playerIds?: readonly string[]) => Table[\"ownerOfCard\"];\n visibility: (playerIds?: readonly string[]) => Table[\"visibility\"];\n resources: (playerIds?: readonly string[]) => Table[\"resources\"];\n};\n\nexport type StaticBoards<Table extends RuntimeTableRecord> = Pick<\n Table[\"boards\"],\n \"byId\" | \"hex\" | \"square\"\n>;\n\nexport type StaticBoardsJsonEnvelope<\n Table extends RuntimeTableRecord = RuntimeTableRecord,\n> = {\n formatVersion: 1;\n generatedBy: \"@dreamboard-games/sdk/codegen\";\n boards: StaticBoards<Table>;\n initialTable: Table;\n};\n\nexport type SetupOptionChoiceMetadata = {\n id: string;\n label: string;\n description?: string | null;\n};\n\nexport type SetupOptionMetadata = {\n id: string;\n name: string;\n description?: string | null;\n choices: readonly SetupOptionChoiceMetadata[];\n};\n\nexport type SetupProfileMetadata = {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n};\n\nexport type ReducerManifestContract<\n Table extends RuntimeTableRecord,\n PhaseName extends string,\n PlayerId extends string,\n DeckId extends string,\n HandId extends string,\n CardId extends string,\n> = {\n literals: ManifestLiterals<PlayerId, DeckId, HandId, CardId, PhaseName>;\n ids: ManifestIds<PlayerId, DeckId, HandId, CardId, PhaseName>;\n defaults: ManifestDefaults<Table>;\n staticBoards?: StaticBoards<Table>;\n setupOptionsById: Record<string, SetupOptionMetadata>;\n setupChoiceIdsByOptionId: Record<string, readonly string[]>;\n setupProfilesById: Record<string, SetupProfileMetadata>;\n tableSchema: z.ZodType<Table>;\n runtimeSchema: AnySchema;\n createGameStateSchema: (config: {\n phaseNameSchema: AnySchema;\n publicSchema: AnySchema;\n privateSchema: AnySchema;\n hiddenSchema: AnySchema;\n phasesSchema: AnySchema;\n }) => AnySchema;\n};\n\nexport type GeneratedManifestContractLike<\n Table extends RuntimeTableRecord = RuntimeTableRecord,\n PhaseName extends string = string,\n PlayerId extends string = string,\n DeckId extends string = string,\n HandId extends string = string,\n CardId extends string = string,\n> = ReducerManifestContract<Table, PhaseName, PlayerId, DeckId, HandId, CardId>;\n\nexport type ManifestContract<Table extends RuntimeTableRecord> =\n ReducerManifestContract<\n Table,\n string,\n PlayerIdOfTable<Table>,\n DeckIdOfTable<Table>,\n HandIdOfTable<Table>,\n CardIdOfTable<Table>\n >;\n\nfunction toNonEmptyStringTuple<Values extends readonly string[]>(\n values: Values,\n): [Values[number], ...Array<Values[number]>] {\n const [first, ...rest] = Array.from(values);\n if (typeof first === \"undefined\") {\n throw new Error(\"Expected a non-empty literal tuple\");\n }\n return [first as Values[number], ...(rest as Array<Values[number]>)];\n}\n\n/**\n * Registry of Zod schemas produced by `createManifestStringLiteralSchema`.\n *\n * The schemas returned from this helper are the canonical manifest-scoped\n * branded schemas (e.g. `manifest.ids.playerId`). When a manifest has zero\n * members for a given id family the underlying schema falls back to plain\n * `z.string()`, which is indistinguishable from an author-written\n * `z.string()` at runtime. This WeakSet lets `defineGameContract` recognise\n * the manifest-supplied case and not flag it as a raw string.\n */\nconst manifestScopedSchemas = new WeakSet<object>();\n\nexport function markManifestScopedSchema<Schema extends z.ZodTypeAny>(\n schema: Schema,\n): Schema & ManifestIdSchema<z.infer<Schema>> {\n manifestScopedSchemas.add(schema as unknown as object);\n return schema as Schema & ManifestIdSchema<z.infer<Schema>>;\n}\n\nexport function isManifestScopedSchema(schema: unknown): boolean {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n manifestScopedSchemas.has(schema as object)\n );\n}\n\nexport function createManifestStringLiteralSchema<\n Values extends readonly string[],\n>(\n values: Values,\n): ManifestIdSchema<Values[number] extends never ? string : Values[number]> {\n const schema =\n values.length === 0\n ? (z.string() as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >)\n : (z.enum(toNonEmptyStringTuple(values)) as z.ZodType<\n Values[number] extends never ? string : Values[number]\n >);\n return markManifestScopedSchema(schema);\n}\n\nexport function assumeManifestSchema<Output>(\n schema: z.ZodTypeAny,\n): z.ZodType<Output> {\n return schema as z.ZodType<Output>;\n}\n\nexport function cloneManifestDefault<Value>(value: Value): Value {\n if (typeof globalThis.structuredClone === \"function\") {\n return globalThis.structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nexport function resolveManifestPlayerIds<PlayerId extends string>(\n manifestPlayerIds: readonly PlayerId[],\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n if (!playerIds || playerIds.length === 0) {\n return manifestPlayerIds;\n }\n\n const knownPlayerIds = new Set<string>(manifestPlayerIds);\n return playerIds.filter((playerId): playerId is PlayerId =>\n knownPlayerIds.has(playerId),\n );\n}\n\nexport function createManifestRuntimeSchema<\n PhaseNameSchema extends z.ZodTypeAny,\n PlayerId extends string,\n SetupProfileId extends string,\n>({\n phaseNameSchema,\n playerIdSchema,\n setupProfileIdSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n playerIdSchema: z.ZodType<PlayerId>;\n setupProfileIdSchema: z.ZodType<SetupProfileId>;\n}) {\n return z.object({\n prompts: z\n .array(\n z.object({\n id: z.string(),\n promptId: z.string(),\n to: playerIdSchema,\n title: z.string().optional(),\n payload: z.unknown().optional(),\n options: z\n .array(z.object({ id: z.string(), label: z.string() }))\n .optional(),\n resume: z.object({ id: z.string(), data: z.unknown() }),\n }),\n )\n .default([]),\n rng: z\n .object({\n seed: z.number().nullable().optional(),\n cursor: z.number().int().default(0),\n trace: z.array(z.string()).default([]),\n })\n .default({\n seed: null,\n cursor: 0,\n trace: [],\n }),\n setup: z\n .object({\n profileId: setupProfileIdSchema,\n optionValues: z.record(z.string(), z.string().nullable()).default({}),\n })\n .nullable()\n .default(null),\n simultaneous: z\n .object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: z.unknown(),\n }),\n ),\n })\n .nullable(),\n })\n .default({ current: null }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable()\n .default(null),\n nextInstanceId: z.number().int().default(1),\n });\n}\n\nexport function createManifestGameStateSchema<\n Table extends RuntimeTableRecord,\n PhaseNameSchema extends z.ZodTypeAny,\n PublicSchema extends z.ZodTypeAny,\n PrivateSchema extends z.ZodTypeAny,\n HiddenSchema extends z.ZodTypeAny,\n PhasesSchema extends z.ZodTypeAny,\n PlayerId extends string,\n SetupProfileId extends string,\n>({\n tableSchema,\n playerIdSchema,\n setupProfileIdSchema,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n tableSchema: z.ZodType<Table>;\n playerIdSchema: z.ZodType<PlayerId>;\n setupProfileIdSchema: z.ZodType<SetupProfileId>;\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return z.object({\n table: tableSchema,\n public: publicSchema,\n private: z.record(z.string(), privateSchema),\n hidden: hiddenSchema,\n flow: z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n }),\n phase: phasesSchema,\n runtime: createManifestRuntimeSchema({\n phaseNameSchema,\n playerIdSchema,\n setupProfileIdSchema,\n }),\n });\n}\n\n// --- State Definition ---\n\nexport type StateDefinition<\n PublicSchema extends SchemaLike<object>,\n PrivateSchema extends SchemaLike<object>,\n HiddenSchema extends SchemaLike<object>,\n> = {\n public: PublicSchema;\n private: PrivateSchema;\n hidden: HiddenSchema;\n};\n\nexport type InitContext<\n Table extends RuntimeTableRecord,\n Manifest extends ReducerManifestContract<\n Table,\n string,\n string,\n string,\n string,\n string\n > = ManifestContract<Table>,\n> = {\n manifest: Manifest;\n table: Table;\n playerIds: PlayerIdOfTable<Table>[];\n rngSeed?: number | null;\n setup: SetupSelectionOfManifest<Manifest> | null;\n q: TableQueriesOfState<{ table: Table }>;\n};\n\nexport type InitSetupSelectionInput<\n Manifest extends ReducerManifestContract<\n RuntimeTableRecord,\n string,\n string,\n string,\n string,\n string\n > = GeneratedManifestContractLike,\n> = SetupSelectionInputOfManifest<Manifest>;\n\n// --- Setup Bootstrap Types ---\n\nexport type SetupBootstrapSharedZoneRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedZone\";\n zoneId: SharedZoneIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerZoneRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerZone\";\n zoneId: PlayerZoneIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapSharedBoardContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerBoardContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapSharedBoardSpaceRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"sharedBoardSpace\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n spaceId: SpaceIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapPerPlayerBoardSpaceRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n type: \"playerBoardSpace\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n playerId: PlayerIdOfManifest<Manifest>;\n spaceId: SpaceIdOfManifest<Manifest>;\n};\n\nexport type SetupBootstrapContainerRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | SetupBootstrapSharedZoneRef<Manifest>\n | SetupBootstrapPerPlayerZoneRef<Manifest>\n | SetupBootstrapSharedBoardContainerRef<Manifest>\n | SetupBootstrapPerPlayerBoardContainerRef<Manifest>;\n\nexport type SetupBootstrapDestinationRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | SetupBootstrapContainerRef<Manifest>\n | SetupBootstrapSharedBoardSpaceRef<Manifest>\n | SetupBootstrapPerPlayerBoardSpaceRef<Manifest>;\n\nexport type SetupBootstrapPerPlayerContainerTemplateRef<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | {\n type: \"playerZone\";\n zoneId: PlayerZoneIdOfManifest<Manifest>;\n }\n | {\n type: \"playerBoardContainer\";\n boardId: BoardBaseIdOfManifest<Manifest>;\n containerId: BoardContainerIdOfManifest<Manifest>;\n };\n\nexport type SetupBootstrapStep<\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> =\n | {\n type: \"shuffle\";\n container: SetupBootstrapContainerRef<Manifest>;\n }\n | {\n type: \"move\";\n from: SetupBootstrapContainerRef<Manifest>;\n to: SetupBootstrapDestinationRef<Manifest>;\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<Manifest>\n | PieceIdOfManifest<Manifest>\n | DieIdOfManifest<Manifest>\n )[];\n }\n | {\n type: \"deal\";\n from:\n | SetupBootstrapSharedZoneRef<Manifest>\n | SetupBootstrapSharedBoardContainerRef<Manifest>;\n to: SetupBootstrapPerPlayerContainerTemplateRef<Manifest>;\n count: number;\n playerIds?: readonly PlayerIdOfManifest<Manifest>[];\n };\n\nexport type SetupProfileDefinition<\n PhaseName extends string = string,\n Manifest extends GeneratedManifestContractLike =\n GeneratedManifestContractLike,\n> = {\n initialPhase?: PhaseName;\n bootstrap?: readonly SetupBootstrapStep<Manifest>[];\n};\n","export const FrameworkErrorCodes = {\n NOT_YOUR_TURN: \"NOT_YOUR_TURN\",\n WRONG_PHASE: \"WRONG_PHASE\",\n WRONG_STEP: \"WRONG_STEP\",\n INVALID_PARAMS: \"INVALID_PARAMS\",\n UNKNOWN_INTERACTION: \"UNKNOWN_INTERACTION\",\n INTERNAL_ERROR: \"INTERNAL_ERROR\",\n} as const;\n\nexport type FrameworkErrorCode =\n (typeof FrameworkErrorCodes)[keyof typeof FrameworkErrorCodes];\n","import { z } from \"zod\";\nimport type { Brand } from \"./model/table\";\n\n/**\n * Opaque brand applied to a runtime player identifier.\n *\n * Generators produce a workspace-specific `PlayerId` alias (e.g.\n * `Brand<string, \"PlayerId\">` in `shared/manifest-contract.ts`). Authors\n * obtain `PlayerId` values only through:\n * - `q.player.order()` / `q.player.current()` (reducer queries),\n * - engine-injected callback arguments (actions, phases, prompts),\n * - `perPlayerKeys(...)` / entries iteration,\n * - `asPlayerId(raw)` as an explicit escape hatch (e.g. ingress parsing).\n *\n * The brand is a phantom type: at runtime a `PlayerId` is just a string.\n * Do not JSON-serialize the brand marker; it exists purely at the type\n * level to block accidental literal comparisons such as\n * `playerId === \"player-1\"`.\n */\nexport type PlayerId = Brand<string, \"PlayerId\">;\n\n/**\n * Explicit conversion from a raw string to a branded `PlayerId`.\n *\n * Use at trust boundaries only (wire ingress, tests, fixtures). Inside\n * reducer logic, obtain `PlayerId` values from the engine instead of\n * constructing them yourself.\n */\nexport function asPlayerId(raw: string): PlayerId {\n return raw as PlayerId;\n}\n\n/**\n * Type guard that narrows `unknown` to `PlayerId` when the value is a\n * non-empty string. Does not validate against a specific player roster;\n * use `perPlayerSchema`/ingress parsing for that.\n */\nexport function isPlayerId(value: unknown): value is PlayerId {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * A runtime-accurate per-player map.\n *\n * `PerPlayer<Value>` is an opaque, ordered container whose entries are\n * exactly the players that exist at runtime (the seats passed to\n * `initialize`).\n *\n * The `__perPlayer` discriminator keeps the structural type nominal-ish\n * without depending on a symbol (symbols do not round-trip through JSON,\n * which this shape must).\n *\n * Construct with `perPlayer(ids, init)` and read with the accessors in\n * this module; do not reach into `entries` directly unless you need\n * ordered iteration.\n */\nexport interface PerPlayer<Value, Id extends PlayerId = PlayerId> {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [Id, Value]>;\n}\n\n/**\n * Construct a `PerPlayer<Value>` with one entry per `id` in `ids`.\n *\n * `ids` is treated as the authoritative runtime seat list: the returned\n * `PerPlayer` contains exactly `ids.length` entries, in the same order.\n * Duplicate ids throw.\n */\nexport function perPlayer<Value, Id extends PlayerId = PlayerId>(\n ids: readonly Id[],\n init: (id: Id, index: number) => Value,\n): PerPlayer<Value, Id> {\n const seen = new Set<string>();\n const entries: Array<readonly [Id, Value]> = [];\n for (const [index, id] of ids.entries()) {\n if (seen.has(id)) {\n throw new Error(`perPlayer: duplicate player id '${id}'`);\n }\n seen.add(id);\n entries.push([id, init(id, index)] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/** Ordered list of seat ids present in the `PerPlayer`. */\nexport function perPlayerKeys<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n): Id[] {\n return value.entries.map((entry) => entry[0]);\n}\n\n/** Ordered list of values present in the `PerPlayer`. */\nexport function perPlayerValues<Value>(\n value: PerPlayer<Value, PlayerId>,\n): Value[] {\n return value.entries.map((entry) => entry[1]);\n}\n\n/**\n * Ordered `[id, value]` pairs. Returns the backing array as-is; callers\n * must not mutate it.\n */\nexport function perPlayerEntries<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n): ReadonlyArray<readonly [Id, Value]> {\n return value.entries;\n}\n\n/** Number of seats in the `PerPlayer`. */\nexport function perPlayerSize(value: PerPlayer<unknown, PlayerId>): number {\n return value.entries.length;\n}\n\n/** Whether `id` has a value. */\nexport function perPlayerHas<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n id: Id,\n): boolean {\n for (const [candidate] of value.entries) {\n if (candidate === id) {\n return true;\n }\n }\n return false;\n}\n\n/** Lookup with no fallback; returns `undefined` for missing seats. */\nexport function perPlayerGet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value | undefined {\n for (const [candidate, v] of value.entries) {\n if (candidate === id) {\n return v;\n }\n }\n return undefined;\n}\n\n/**\n * Lookup that throws if `id` is not present.\n *\n * Use when the caller has already established (via `q.player.order()`,\n * an action context, etc.) that `id` is an active runtime seat.\n */\nexport function perPlayerRequire<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value {\n const found = perPlayerGet(value, id);\n if (found === undefined && !perPlayerHas(value, id)) {\n throw new Error(`perPlayerRequire: missing entry for player id '${id}'`);\n }\n return found as Value;\n}\n\n/**\n * Return a new `PerPlayer` with `id`'s value replaced (or added if the\n * id is not present). Preserves entry order; new entries are appended.\n */\nexport function perPlayerSet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n next: Value,\n): PerPlayer<Value, Id> {\n const entries = value.entries.slice();\n const index = entries.findIndex((entry) => entry[0] === id);\n if (index >= 0) {\n entries[index] = [id, next] as const;\n } else {\n entries.push([id, next] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/**\n * Return a new `PerPlayer` where each value is replaced by `f(value, id)`.\n * Seat order is preserved.\n */\nexport function perPlayerMap<Value, Next, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n f: (v: Value, id: Id, index: number) => Next,\n): PerPlayer<Next, Id> {\n return {\n __perPlayer: true,\n entries: value.entries.map(\n ([id, v], index) => [id, f(v, id, index)] as const,\n ),\n };\n}\n\n/**\n * Structural check for a `PerPlayer` without a Zod schema. Useful in\n * debug paths and as a fast pre-filter before schema validation.\n */\nexport function isPerPlayer(value: unknown): value is PerPlayer<unknown> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const candidate = value as { __perPlayer?: unknown; entries?: unknown };\n if (candidate.__perPlayer !== true) {\n return false;\n }\n if (!Array.isArray(candidate.entries)) {\n return false;\n }\n return candidate.entries.every(\n (entry) =>\n Array.isArray(entry) &&\n entry.length === 2 &&\n typeof entry[0] === \"string\",\n );\n}\n\n/**\n * Options accepted by `perPlayerSchema`.\n *\n * Setting `players` locks the schema to an exact seat list: parse fails\n * if the input is missing any seat or has an unknown id. Leaving\n * `players` unset yields a schema that accepts any non-empty string as\n * a key, which is the right default for generic SDK types.\n *\n * `playerIdSchema` lets callers feed a manifest-scoped Zod id schema in\n * so parse errors carry the same message as other branded ids.\n */\nexport type PerPlayerSchemaOptions<Id extends PlayerId> = {\n readonly playerIdSchema?: z.ZodType<Id>;\n readonly players?: readonly Id[];\n};\n\n/**\n * Build a Zod schema that validates a wire-shaped `PerPlayer<Value>`.\n *\n * When `options.players` is supplied the schema enforces that entries\n * match that exact set (same cardinality, same ids, any order). This is\n * the mechanism that catches the class of bug where a 3-player session\n * produced a view shape the old `Record<PlayerId, T>` type claimed had\n * a `player-4` key.\n */\nexport function perPlayerSchema<Value, Id extends PlayerId = PlayerId>(\n valueSchema: z.ZodType<Value>,\n options: PerPlayerSchemaOptions<Id> = {},\n): z.ZodType<PerPlayer<Value, Id>> {\n const keySchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n\n const base = z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([keySchema, valueSchema])),\n })\n .transform(\n (value): PerPlayer<Value, Id> => ({\n __perPlayer: true as const,\n entries: value.entries as ReadonlyArray<readonly [Id, Value]>,\n }),\n );\n\n if (!options.players) {\n return base as unknown as z.ZodType<PerPlayer<Value, Id>>;\n }\n\n const expected = options.players;\n return base.superRefine((value, ctx) => {\n const seen = new Set<string>();\n for (const [id] of value.entries) {\n if (seen.has(id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate player id '${id}'`,\n });\n }\n seen.add(id);\n }\n for (const expectedId of expected) {\n if (!seen.has(expectedId)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Missing entry for player id '${expectedId}'`,\n });\n }\n }\n for (const id of seen) {\n if (!expected.some((expectedId) => expectedId === id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Unexpected player id '${id}' (allowed: ${expected.join(\", \")})`,\n });\n }\n }\n }) as unknown as z.ZodType<PerPlayer<Value, Id>>;\n}\n\n// ---------------------------------------------------------------------------\n// BoardRef: replacement for flat `\"board:player-N\"` literal unions.\n// ---------------------------------------------------------------------------\n\n/**\n * Reference to a board by its authored `baseId`, plus an optional seat\n * for per-player boards.\n *\n * Replaces the old generated `\"ring:player-1\" | \"ring:player-2\" | ...`\n * flat unions whose keys pretended to be static but were actually\n * derived from `maxPlayers` and therefore misaligned with the runtime\n * seat list.\n *\n * The discriminant is the *presence* of `seat`, not a `scope` field, so\n * authors can destructure and pass the ref directly without needing a\n * discriminator check for shared boards.\n */\nexport type BoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> = SharedBoardRef<BaseId> | PerPlayerBoardRef<BaseId, Id>;\n\nexport interface SharedBoardRef<BaseId extends string = string> {\n readonly baseId: BaseId;\n readonly seat?: undefined;\n}\n\nexport interface PerPlayerBoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> {\n readonly baseId: BaseId;\n readonly seat: Id;\n}\n\n/** Construct a shared board ref. */\nexport function sharedBoardRef<BaseId extends string>(\n baseId: BaseId,\n): SharedBoardRef<BaseId> {\n return { baseId };\n}\n\n/** Construct a per-player board ref. */\nexport function perPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat: Id,\n): PerPlayerBoardRef<BaseId, Id> {\n return { baseId, seat };\n}\n\n/**\n * Construct a `BoardRef` without knowing the scope ahead of time. Pass\n * `seat` for per-player boards; omit for shared boards.\n */\nexport function boardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat?: Id,\n): BoardRef<BaseId, Id> {\n if (seat === undefined) {\n return { baseId };\n }\n return { baseId, seat };\n}\n\n/** Stable string key for Maps/Records keyed by a `BoardRef`. */\nexport function boardRefKey(ref: BoardRef): string {\n return ref.seat === undefined ? ref.baseId : `${ref.baseId}:${ref.seat}`;\n}\n\n/**\n * Inverse of `boardRefKey`. Parses `\"base\"` as a shared ref and\n * `\"base:player-N\"` as a per-player ref. Returns `null` for malformed\n * input.\n */\nexport function parseBoardRefKey(key: string): BoardRef | null {\n if (!key.length) {\n return null;\n }\n const colon = key.indexOf(\":\");\n if (colon < 0) {\n return { baseId: key };\n }\n const baseId = key.slice(0, colon);\n const seat = key.slice(colon + 1);\n if (!baseId.length || !seat.length) {\n return null;\n }\n return { baseId, seat: seat as PlayerId };\n}\n\n/**\n * Zod schema for a `BoardRef` with free-form base and seat ids.\n *\n * Feed a manifest-scoped `baseIdSchema` and `playerIdSchema` to bind\n * the ref to a specific workspace.\n */\nexport function boardRefSchema<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n>(\n options: {\n readonly baseIdSchema?: z.ZodType<BaseId>;\n readonly playerIdSchema?: z.ZodType<Id>;\n } = {},\n): z.ZodType<BoardRef<BaseId, Id>> {\n const baseSchema =\n options.baseIdSchema ?? (z.string().min(1) as unknown as z.ZodType<BaseId>);\n const playerSchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n const shared = z.strictObject({ baseId: baseSchema });\n const perPlayer = z.strictObject({ baseId: baseSchema, seat: playerSchema });\n return z.union([perPlayer, shared]) as unknown as z.ZodType<\n BoardRef<BaseId, Id>\n >;\n}\n\n/** True when `ref` targets a shared board (no seat). */\nexport function isSharedBoardRef<BaseId extends string>(\n ref: BoardRef<BaseId, PlayerId>,\n): ref is SharedBoardRef<BaseId> {\n return ref.seat === undefined;\n}\n\n/** True when `ref` targets a per-player board (has a seat). */\nexport function isPerPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n ref: BoardRef<BaseId, Id>,\n): ref is PerPlayerBoardRef<BaseId, Id> {\n return ref.seat !== undefined;\n}\n","import type { CollectorState, ValidationIssue } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\n\nexport type TargetContext<State extends CollectorState> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n values?: Readonly<Record<string, unknown>>;\n};\n\nexport type TargetPredicateArgs<\n State extends CollectorState,\n Target,\n> = TargetContext<State> & {\n targetId: Target;\n target: Target;\n};\n\nexport type TargetPredicate<State extends CollectorState, Target> = {\n id: string;\n errorCode: string;\n message?: string;\n test: (args: TargetPredicateArgs<State, Target>) => boolean;\n};\n\nexport type BoundTargetRule<Target> = {\n readonly eligible: () => readonly Target[];\n readonly validate: (target: Target) => ValidationIssue | null;\n readonly isEligible: (target: Target) => boolean;\n};\n\nexport type TargetRule<State extends CollectorState, Target> = {\n readonly eligible: (ctx: TargetContext<State>) => readonly Target[];\n readonly validate: (\n ctx: TargetContext<State>,\n target: Target,\n ) => ValidationIssue | null;\n readonly isEligible: (ctx: TargetContext<State>, target: Target) => boolean;\n readonly bind: (ctx: TargetContext<State>) => BoundTargetRule<Target>;\n};\n\nexport type TargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n> = {\n readonly where: (\n predicate: TargetPredicate<State, Target>,\n ) => TargetRuleBuilder<State, Target, Rule>;\n readonly build: () => Rule;\n};\n\nexport type TargetCandidateResolver<State extends CollectorState, Target> = (\n ctx: TargetContext<State>,\n) => readonly Target[];\n\nexport type TargetRuleOptions = {\n missingCandidateIssue?: ValidationIssue;\n equals?: (left: unknown, right: unknown) => boolean;\n};\n\nconst DEFAULT_MISSING_CANDIDATE_ISSUE: ValidationIssue = {\n errorCode: \"TARGET_NOT_ELIGIBLE\",\n message: \"Target is not eligible.\",\n};\n\nexport function createTargetRule<State extends CollectorState, Target>(\n candidates: TargetCandidateResolver<State, Target>,\n predicates: readonly TargetPredicate<State, Target>[],\n options: TargetRuleOptions = {},\n): TargetRule<State, Target> {\n const missingCandidateIssue =\n options.missingCandidateIssue ?? DEFAULT_MISSING_CANDIDATE_ISSUE;\n const equals = options.equals ?? Object.is;\n\n const validate = (\n ctx: TargetContext<State>,\n target: Target,\n ): ValidationIssue | null => {\n if (!candidates(ctx).some((candidate) => equals(candidate, target))) {\n return missingCandidateIssue;\n }\n for (const predicate of predicates) {\n if (!predicate.test({ ...ctx, targetId: target, target })) {\n return {\n errorCode: predicate.errorCode,\n message: predicate.message,\n };\n }\n }\n return null;\n };\n\n const rule: TargetRule<State, Target> = {\n eligible: (ctx) =>\n candidates(ctx).filter((targetId) => validate(ctx, targetId) == null),\n validate,\n isEligible: (ctx, target) => validate(ctx, target) == null,\n bind: (ctx) => ({\n eligible: () => rule.eligible(ctx),\n validate: (id) => rule.validate(ctx, id),\n isEligible: (id) => rule.isEligible(ctx, id),\n }),\n };\n\n return rule;\n}\n\nexport function createTargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n>(\n buildRule: (predicates: readonly TargetPredicate<State, Target>[]) => Rule,\n predicates: readonly TargetPredicate<State, Target>[] = [],\n): TargetRuleBuilder<State, Target, Rule> {\n return {\n where: (predicate) =>\n createTargetRuleBuilder(buildRule, [...predicates, predicate]),\n build: () => buildRule(predicates),\n };\n}\n","import type { CollectorState } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type CardTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type CardTargetRule<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRule<State, Id> & {\n readonly zoneIds: ZoneIds;\n readonly zoneId: ZoneIds[number];\n readonly targetKind: \"card\";\n};\n\nexport type CardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[] = readonly string[],\n> = TargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>;\n\nfunction cardIdsForZone<State extends CollectorState, Id extends string>(\n state: State,\n playerId: string,\n q: {\n zone: {\n sharedCards: (zoneId: never) => readonly unknown[];\n playerCards: (playerId: never, zoneId: never) => readonly unknown[];\n };\n },\n zoneId: string,\n): readonly Id[] {\n const table = state.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n if (\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {})\n ) {\n return q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly Id[];\n }\n if (zoneId in (table.decks ?? {}) || zoneId in (table.zones?.shared ?? {})) {\n return q.zone.sharedCards(zoneId as never) as readonly Id[];\n }\n return [];\n}\n\nfunction createCardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n ZoneIds extends readonly string[],\n>(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createTargetRuleBuilder<State, Id, CardTargetRule<State, Id, ZoneIds>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, playerId, q }) =>\n zoneIds.flatMap((zoneId) =>\n cardIdsForZone<State, Id>(state, playerId, q, zoneId),\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CARD_TARGET_NOT_ELIGIBLE\",\n message: \"Card target is not eligible.\",\n },\n },\n ),\n zoneIds,\n zoneId: zoneIds[0] as ZoneIds[number],\n targetKind: \"card\",\n }),\n );\n}\n\nexport const cardTarget = {\n zones<\n State extends CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n >(zoneIds: ZoneIds): CardTargetBuilder<State, Id, ZoneIds> {\n return createCardTargetBuilder<State, Id, ZoneIds>(zoneIds);\n },\n};\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport type { CardTargetRule } from \"./cardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `cardInput` produces a collector backed by one built `cardTarget` rule.\n * The submitted value is a manifest-branded card id.\n *\n * The target rule feeds server-authoritative eligible-card projection, submit\n * validation, and tests through its `bind({ state, playerId, q })` helper.\n */\nexport function cardInput<\n State extends CollectorState = CollectorState,\n Id extends string = CardIdOfState<State>,\n const ZoneIds extends readonly string[] = readonly string[],\n>(options: {\n target: CardTargetRule<State, Id, ZoneIds>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<z.ZodType<Id>, State, \"card\"> & {\n readonly meta: {\n readonly zoneId: ZoneIds[number];\n readonly zoneIds: ZoneIds;\n readonly targetKind: \"card\";\n };\n} {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"card\",\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<CardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: (state, playerId, q, _derived, values) => ({\n type: \"cardTarget\" as const,\n projection: \"resolved\" as const,\n targetKind: target.targetKind,\n zoneIds: target.zoneIds,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n }),\n meta: {\n zoneId: target.zoneId,\n zoneIds: target.zoneIds,\n targetKind: target.targetKind,\n },\n };\n}\n","import type {\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeComponentLocation,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n} from \"../model\";\nimport type { PerPlayer, PlayerId } from \"../per-player\";\nimport { perPlayerGet, perPlayerSet } from \"../per-player\";\n\n// Thin wrappers that preserve the existing \"look up by player id\" idiom used\n// throughout this file. `hands`, `zones.perPlayer`, and `resources` are\n// `PerPlayer<T>`-shaped at runtime (the ingress codec rejects anything else),\n// so these helpers assume the wrapper is always present.\nexport function ppRead<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n): Value | undefined {\n if (value === undefined) return undefined;\n return perPlayerGet(value, playerId as PlayerId);\n}\n\nexport function ppWrite<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n next: Value,\n): PerPlayer<Value> {\n const base: PerPlayer<Value> = value ?? { __perPlayer: true, entries: [] };\n return perPlayerSet(base, playerId as PlayerId, next);\n}\n\nexport function ensureArray<T>(value: readonly T[] | T[] | undefined): T[] {\n return Array.isArray(value) ? [...value] : [];\n}\n\nfunction locationPosition(location: RuntimeComponentLocation): number {\n return \"position\" in location && typeof location.position === \"number\"\n ? location.position\n : Number.MAX_SAFE_INTEGER;\n}\n\nexport function orderedComponentIdsForLocation(\n table: RuntimeTableRecord,\n predicate: (location: RuntimeComponentLocation) => boolean,\n): string[] {\n return Object.entries(table.componentLocations)\n .filter(([, location]) => predicate(location))\n .sort(\n (left, right) => locationPosition(left[1]) - locationPosition(right[1]),\n )\n .map(([componentId]) => componentId);\n}\n\nfunction hasOwnKey(record: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction isSharedZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.decks, zoneId) || hasOwnKey(table.zones.shared, zoneId)\n );\n}\n\nfunction isPlayerZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.hands, zoneId) ||\n hasOwnKey(table.zones.perPlayer, zoneId) ||\n hasOwnKey(table.handVisibility, zoneId)\n );\n}\n\nfunction zoneScopeForId(\n table: RuntimeTableRecord,\n zoneId: string,\n): \"shared\" | \"perPlayer\" | null {\n if (isPlayerZoneId(table, zoneId)) {\n return \"perPlayer\";\n }\n if (isSharedZoneId(table, zoneId)) {\n return \"shared\";\n }\n return null;\n}\n\nexport function assertZoneScope(\n table: RuntimeTableRecord,\n zoneId: string,\n expectedScope: \"shared\" | \"perPlayer\",\n operation: string,\n argumentName: string,\n): void {\n const actualScope = zoneScopeForId(table, zoneId);\n if (actualScope === expectedScope) {\n return;\n }\n\n if (actualScope === null) {\n throw new Error(\n `Unknown zone '${zoneId}' passed as ${argumentName} to ${operation}.`,\n );\n }\n\n throw new Error(\n `Zone '${zoneId}' has scope '${actualScope}', but ${operation} requires ${argumentName} to be a ${expectedScope === \"shared\" ? \"shared\" : \"perPlayer\"} zone.`,\n );\n}\n\nexport function syncSharedZoneWithDeck<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId, nextCards: readonly string[]): void {\n table.decks[zoneId] = [...nextCards] as Table[\"decks\"][ZoneId];\n table.zones.shared[zoneId] = [\n ...nextCards,\n ] as Table[\"zones\"][\"shared\"][ZoneId];\n}\n\nexport function syncPlayerZoneWithHand<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n playerId: PlayerId,\n nextCards: readonly string[],\n): void {\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId as string, [\n ...nextCards,\n ]) as Table[\"hands\"][ZoneId];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId as string,\n [...nextCards],\n ) as Table[\"zones\"][\"perPlayer\"][ZoneId];\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n ComponentIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeStateOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexStateOfTable,\n TiledVertexTypeIdOfTable,\n} from \"../model\";\nimport { orderedComponentIdsForLocation } from \"./internal\";\n\nexport function getBoard<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n>(table: Table, boardId: BoardId): Table[\"boards\"][\"byId\"][BoardId] {\n return table.boards.byId[boardId] as Table[\"boards\"][\"byId\"][BoardId];\n}\n\nexport function getHexBoard<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >;\n}\n\nexport function getTiledBoard<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" | \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" | \"square\" }\n >;\n}\n\nexport function getSquareBoard<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >;\n}\n\nexport function getSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId] {\n return getBoard(table, boardId).spaces[\n spaceId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId];\n}\n\nexport function getHexSpace<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends HexSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n>[\"spaces\"][SpaceId] {\n return getHexBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getSquareSpace<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n>[\"spaces\"][SpaceId] {\n return getSquareBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId] {\n return getBoard(table, boardId).containers[\n containerId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId];\n}\n\nexport function getEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledEdgeStateOfTable<Table, BoardId, EdgeId> {\n const edge = getTiledBoard(table, boardId).edges.find(\n (candidate) => candidate.id === edgeId,\n );\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n return edge as TiledEdgeStateOfTable<Table, BoardId, EdgeId>;\n}\n\nexport function getVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledVertexStateOfTable<Table, BoardId, VertexId> {\n const vertex = getTiledBoard(table, boardId).vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n return vertex as TiledVertexStateOfTable<Table, BoardId, VertexId>;\n}\n\nexport function getHexSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n q: number,\n r: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getHexBoard(table, boardId).spaces).find(\n (space) => space.q === q && space.r === r,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSquareSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n row: number,\n col: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getSquareBoard(table, boardId).spaces).find(\n (space) => space.row === row && space.col === col,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSpaceEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.spaceIds.includes(spaceId))\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getSpaceVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.spaceIds.includes(spaceId))\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const vertex = tiledBoard.vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n const vertexSpaceIds = new Set(vertex.spaceIds);\n return tiledBoard.edges\n .filter((edge) =>\n edge.spaceIds.every((spaceId) => vertexSpaceIds.has(spaceId)),\n )\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const edge = tiledBoard.edges.find((candidate) => candidate.id === edgeId);\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n const edgeSpaceIds = new Set(edge.spaceIds);\n return tiledBoard.vertices\n .filter((vertex) =>\n Array.from(edgeSpaceIds).every((spaceId) =>\n vertex.spaceIds.includes(spaceId),\n ),\n )\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getRelatedSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n TypeId extends RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n): SpaceId[] {\n const board = getBoard(table, boardId);\n const related = new Set<SpaceId>();\n\n for (const relation of board.relations) {\n if (relation.typeId !== relationTypeId) {\n continue;\n }\n if (relation.fromSpaceId === spaceId) {\n related.add(relation.toSpaceId as SpaceId);\n continue;\n }\n if (!relation.directed && relation.toSpaceId === spaceId) {\n related.add(relation.fromSpaceId as SpaceId);\n }\n }\n\n return [...related];\n}\n\nexport function getAdjacentSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): SpaceId[] {\n return getRelatedSpaces(\n table,\n boardId,\n spaceId,\n \"adjacent\" as RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n );\n}\n\nexport function getSpaceDistance<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n): number {\n if (fromSpaceId === toSpaceId) {\n return 0;\n }\n\n const visited = new Set<string>([fromSpaceId]);\n let frontier: string[] = [fromSpaceId];\n let distance = 0;\n\n while (frontier.length > 0) {\n distance += 1;\n const nextFrontier: string[] = [];\n\n for (const currentSpaceId of frontier) {\n for (const neighborId of getAdjacentSpaces(\n table,\n boardId,\n currentSpaceId as SpaceId,\n )) {\n if (neighborId === toSpaceId) {\n return distance;\n }\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n nextFrontier.push(neighborId);\n }\n }\n }\n\n frontier = nextFrontier;\n }\n\n return Number.POSITIVE_INFINITY;\n}\n\nexport function getSquareNeighbors<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n options: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" } = {},\n): SquareSpaceIdOfTable<Table, BoardId>[] {\n const board = getSquareBoard(table, boardId);\n const space = getSquareSpace(table, boardId, spaceId);\n const offsets: ReadonlyArray<readonly [number, number]> =\n options.mode === \"diagonal\"\n ? [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : options.mode === \"all\"\n ? [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n ];\n\n return offsets\n .map(([rowOffset, colOffset]) =>\n Object.values(board.spaces).find(\n (candidate) =>\n candidate.row === space.row + rowOffset &&\n candidate.col === space.col + colOffset,\n ),\n )\n .filter((candidate): candidate is typeof space => candidate !== undefined)\n .map((candidate) => candidate.id as SquareSpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getSquareDistance<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options: { metric?: \"manhattan\" | \"chebyshev\" } = {},\n): number {\n const from = getSquareSpace(table, boardId, fromSpaceId);\n const to = getSquareSpace(table, boardId, toSpaceId);\n const rowDistance = Math.abs(from.row - to.row);\n const colDistance = Math.abs(from.col - to.col);\n\n return options.metric === \"chebyshev\"\n ? Math.max(rowDistance, colDistance)\n : rowDistance + colDistance;\n}\n\nexport function getBoardsByTypeId<\n Table extends RuntimeTableRecord,\n TypeId extends BoardTypeIdOfTable<NoInfer<Table>>,\n>(table: Table, typeId: TypeId): BoardIdOfTable<Table>[] {\n return Object.entries(table.boards.byId)\n .filter(([, board]) => board.typeId === typeId)\n .map(([boardId]) => boardId as BoardIdOfTable<Table>);\n}\n\nexport function getSpacesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n TypeId extends SpaceTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): SpaceIdOfTable<Table, BoardId>[] {\n return Object.entries(getBoard(table, boardId).spaces)\n .filter(([, space]) => space.typeId === typeId)\n .map(([spaceId]) => spaceId as SpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getEdgesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledEdgeTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.typeId === typeId)\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getVerticesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledVertexTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.typeId === typeId)\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getComponentsOnSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getSpace(table, boardId, spaceId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"OnSpace\" &&\n location.boardId === boardId &&\n location.spaceId === spaceId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getContainer(table, boardId, containerId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"InContainer\" &&\n location.boardId === boardId &&\n location.containerId === containerId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ) as ComponentIdOfTable<Table>[];\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n RuntimeTableRecord,\n} from \"../model\";\nimport { getContainer } from \"./board-queries\";\n\nfunction allowedCardSetIdsForZone(\n table: RuntimeTableRecord,\n zoneId: string,\n): readonly string[] {\n return table.zones.cardSetIdsByZoneId?.[zoneId] ?? [];\n}\n\nexport function assertCardAllowedInZone<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds = allowedCardSetIdsForZone(table, zoneId);\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter zone '${zoneId}'.`,\n );\n }\n}\n\nexport function assertCardAllowedInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds =\n getContainer(table, boardId, containerId).allowedCardSetIds ?? [];\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter container '${containerId}' on board '${boardId}'.`,\n );\n }\n}\n","import type { PlayerIdOfState } from \"../model\";\n\nexport function setActivePlayers<\n State extends { flow: { activePlayers: PlayerIdOfState<State>[] } },\n>(state: State, activePlayers: PlayerIdOfState<State>[]): State {\n return {\n ...state,\n flow: {\n ...state.flow,\n activePlayers,\n },\n };\n}\n\nexport function setPhaseState<State extends { phase: object }, PhaseState>(\n state: State,\n phaseState: PhaseState,\n): State {\n return {\n ...state,\n phase: phaseState,\n };\n}\n","import type {\n RuntimeBoardState,\n RuntimeRecord,\n RuntimeTableRecord,\n} from \"../model\";\nimport type { PerPlayer } from \"../per-player\";\nimport { perPlayerMap } from \"../per-player\";\n\nlet cloneRuntimeTableCallCount = 0;\n\nexport function resetCloneRuntimeTableCallCount(): void {\n cloneRuntimeTableCallCount = 0;\n}\n\nexport function getCloneRuntimeTableCallCount(): number {\n return cloneRuntimeTableCallCount;\n}\n\nfunction cloneRuntimeBoardState(board: RuntimeBoardState): RuntimeBoardState {\n if (board.layout !== \"generic\") {\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n edges: board.edges.map((edge) => ({\n ...edge,\n spaceIds: [...edge.spaceIds],\n fields: { ...edge.fields },\n })),\n vertices: board.vertices.map((vertex) => ({\n ...vertex,\n spaceIds: [...vertex.spaceIds],\n fields: { ...vertex.fields },\n })),\n };\n }\n\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n };\n}\n\nexport function cloneRuntimeTable<Table extends RuntimeTableRecord>(\n table: Table,\n): Table {\n cloneRuntimeTableCallCount += 1;\n return {\n ...table,\n zones: {\n shared: Object.fromEntries(\n Object.entries(table.zones.shared).map(([zoneId, componentIds]) => [\n zoneId,\n [...componentIds],\n ]),\n ) as Table[\"zones\"][\"shared\"],\n perPlayer: Object.fromEntries(\n Object.entries(table.zones.perPlayer).map(([zoneId, players]) => [\n zoneId,\n perPlayerMap(players as PerPlayer<string[]>, (componentIds) => [\n ...componentIds,\n ]),\n ]),\n ) as Table[\"zones\"][\"perPlayer\"],\n visibility: { ...table.zones.visibility },\n cardSetIdsByZoneId: table.zones.cardSetIdsByZoneId\n ? Object.fromEntries(\n Object.entries(table.zones.cardSetIdsByZoneId).map(\n ([zoneId, cardSetIds]) => [zoneId, [...cardSetIds]],\n ),\n )\n : table.zones.cardSetIdsByZoneId,\n } as Table[\"zones\"],\n decks: Object.fromEntries(\n Object.entries(table.decks).map(([deckId, cards]) => [\n deckId,\n [...cards],\n ]),\n ) as Table[\"decks\"],\n hands: Object.fromEntries(\n Object.entries(table.hands).map(([handId, players]) => [\n handId,\n perPlayerMap(players as PerPlayer<string[]>, (cards) => [...cards]),\n ]),\n ) as Table[\"hands\"],\n handVisibility: { ...table.handVisibility },\n pieces: Object.fromEntries(\n Object.entries(table.pieces).map(([pieceId, piece]) => [\n pieceId,\n { ...piece },\n ]),\n ) as Table[\"pieces\"],\n componentLocations: { ...table.componentLocations },\n ownerOfCard: { ...table.ownerOfCard },\n visibility: { ...table.visibility },\n resources: perPlayerMap(\n table.resources as PerPlayer<RuntimeRecord>,\n (resources) => ({ ...resources }),\n ) as Table[\"resources\"],\n boards: {\n ...table.boards,\n byId: Object.fromEntries(\n Object.entries(table.boards.byId).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n hex: Object.fromEntries(\n Object.entries(table.boards.hex ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n square: Object.fromEntries(\n Object.entries(table.boards.square ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n } as Table[\"boards\"],\n dice: Object.fromEntries(\n Object.entries(table.dice).map(([dieId, die]) => [dieId, { ...die }]),\n ) as Table[\"dice\"],\n };\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n ComponentLocationOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n ResolvedContainerLocation,\n ResolvedDeckLocation,\n ResolvedEdgeLocation,\n ResolvedHandLocation,\n ResolvedSlotLocation,\n ResolvedSpaceLocation,\n ResolvedVertexLocation,\n ResolvedZoneLocation,\n RuntimeTableRecord,\n SpaceIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"../model\";\nimport {\n getBoard,\n getContainer,\n getEdge,\n getSpace,\n getTiledBoard,\n getVertex,\n} from \"./board-queries\";\nimport { ppRead } from \"./internal\";\n\nexport function getComponentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ComponentLocationOfTable<Table, ComponentId> | undefined {\n return table.componentLocations[componentId] as\n | ComponentLocationOfTable<Table, ComponentId>\n | undefined;\n}\n\nexport function getComponentDeckLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedDeckLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InDeck\") {\n return null;\n }\n\n return {\n componentId,\n deckId: location.deckId as DeckIdOfTable<Table>,\n cards: table.decks[location.deckId as DeckIdOfTable<Table>],\n location,\n } as ResolvedDeckLocation<Table, ComponentId>;\n}\n\nexport function getComponentHandLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedHandLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InHand\") {\n return null;\n }\n\n return {\n componentId,\n handId: location.handId as HandIdOfTable<Table>,\n playerId: location.playerId as PlayerIdOfTable<Table>,\n cards: ppRead(\n table.hands[location.handId as HandIdOfTable<Table>],\n location.playerId as string,\n ),\n location,\n } as unknown as ResolvedHandLocation<Table, ComponentId>;\n}\n\nexport function getComponentZoneLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedZoneLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InZone\") {\n return null;\n }\n\n return {\n componentId,\n zoneId: location.zoneId,\n location,\n } as ResolvedZoneLocation<Table, ComponentId>;\n}\n\nexport function getComponentSpaceLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSpaceLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnSpace\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const spaceId = location.spaceId as SpaceIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n spaceId,\n space: getSpace(table, boardId, spaceId),\n location,\n } as ResolvedSpaceLocation<Table, ComponentId>;\n}\n\nexport function getComponentContainerLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedContainerLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InContainer\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const containerId = location.containerId as BoardContainerIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n containerId,\n container: getContainer(table, boardId, containerId),\n location,\n } as ResolvedContainerLocation<Table, ComponentId>;\n}\n\nexport function getComponentEdgeLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedEdgeLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnEdge\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const edgeId = location.edgeId as TiledEdgeIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n edgeId,\n edge: getEdge(table, boardId, edgeId),\n location,\n } as ResolvedEdgeLocation<Table, ComponentId>;\n}\n\nexport function getComponentVertexLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedVertexLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnVertex\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const vertexId = location.vertexId as TiledVertexIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n vertexId,\n vertex: getVertex(table, boardId, vertexId),\n location,\n } as ResolvedVertexLocation<Table, ComponentId>;\n}\n\nexport function getComponentSlotLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSlotLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InSlot\") {\n return null;\n }\n\n return {\n componentId,\n host: location.host,\n slotId: location.slotId,\n location,\n } as ResolvedSlotLocation<Table, ComponentId>;\n}\n","import type {\n CardCollection,\n ViewCard,\n ViewSlotOccupant,\n} from \"@dreamboard-games/sdk-types\";\nimport type {\n CardIdOfTable,\n ComponentIdOfTable,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandCardsOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeComponentLocation,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n} from \"../model\";\nimport {\n assertZoneScope,\n ensureArray,\n orderedComponentIdsForLocation,\n ppRead,\n} from \"./internal\";\n\ntype ViewCardForTable<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<Table>,\n> =\n CardId extends CardIdOfTable<Table>\n ? ViewCard<\n CardId & string,\n Table[\"cards\"][CardId][\"cardType\"] & string,\n Extract<Table[\"cards\"][CardId][\"properties\"], Record<string, unknown>>\n >\n : never;\n\ntype ViewSlotOccupantForTable<Table extends RuntimeTableRecord> =\n ViewSlotOccupant<\n ComponentIdOfTable<Table> & string,\n PlayerIdOfTable<Table> & string,\n string,\n Record<string, unknown>\n >;\n\nfunction matchesSlotHost(\n location: RuntimeComponentLocation,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId?: string,\n): location is Extract<RuntimeComponentLocation, { type: \"InSlot\" }> {\n return (\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n (slotId === undefined || location.slotId === slotId)\n );\n}\n\nfunction componentPlayerId<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): (PlayerIdOfTable<Table> & string) | null {\n const piece = table.pieces[componentId];\n if (piece) {\n return (piece.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return (die.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const owner = table.ownerOfCard[componentId];\n if (owner !== undefined) {\n return (owner ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n return null;\n}\n\nfunction componentData<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): Record<string, unknown> | undefined {\n const piece = table.pieces[componentId];\n if (piece) {\n return piece.properties as Record<string, unknown>;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return die.properties as Record<string, unknown>;\n }\n\n const card = table.cards[componentId];\n if (card) {\n return card.properties as Record<string, unknown>;\n }\n\n return undefined;\n}\n\ntype DeckCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends DeckIdOfTable<Table>,\n> = ZoneId extends infer Each extends DeckIdOfTable<Table>\n ? DeckCardsOfTable<Table, Each>\n : never;\n\ntype HandCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends HandIdOfTable<Table>,\n> = ZoneId extends infer Each extends HandIdOfTable<Table>\n ? HandCardsOfTable<Table, Each>\n : never;\n\nexport function getSharedZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId): DeckCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"shared\",\n \"getSharedZoneCards\",\n \"zoneId\",\n );\n return [\n ...ensureArray(table.zones.shared[zoneId] ?? table.decks[zoneId]),\n ] as DeckCardsForZone<Table, ZoneId>;\n}\n\nexport function getPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): HandCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"perPlayer\",\n \"getPlayerZoneCards\",\n \"zoneId\",\n );\n const cards =\n ppRead(table.zones.perPlayer[zoneId], playerId as string) ??\n ppRead(table.hands[zoneId], playerId as string);\n return [\n ...ensureArray(cards as readonly string[] | undefined),\n ] as unknown as HandCardsForZone<Table, ZoneId>;\n}\n\nfunction collectZoneIds(\n ...sources: ReadonlyArray<Record<string, unknown> | undefined>\n): string[] {\n const seen = new Set<string>();\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n seen.add(key);\n }\n }\n return [...seen];\n}\n\nexport function getAllSharedZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n): {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n} {\n const zoneIds = collectZoneIds(\n table.zones.shared as Record<string, unknown> | undefined,\n table.decks as Record<string, unknown> | undefined,\n );\n const result: Record<string, readonly unknown[]> = {};\n for (const zoneId of zoneIds) {\n result[zoneId] = getSharedZoneCards(\n table,\n zoneId as SharedZoneIdOfTable<Table>,\n );\n }\n return result as {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n };\n}\n\nexport function getAllPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n} {\n const result: Record<string, readonly unknown[]> = {};\n for (const playerId of table.playerOrder) {\n result[playerId] = getPlayerZoneCards(\n table,\n playerId as PlayerIdOfTable<Table>,\n zoneId,\n );\n }\n return result as {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n };\n}\n\nexport function getCard<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): ViewCardForTable<Table, CardId> {\n const card = table.cards[cardId] as Table[\"cards\"][CardId];\n\n return {\n id: card.id,\n cardType: card.cardType,\n name: card.name,\n text: card.text,\n properties: card.properties,\n } as ViewCardForTable<Table, CardId>;\n}\n\nexport function getCardsById<\n Table extends RuntimeTableRecord,\n const CardIds extends readonly CardIdOfTable<NoInfer<Table>>[],\n>(\n table: Table,\n cardIds: CardIds,\n): Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n}> {\n return Object.fromEntries(\n cardIds.map((cardId) => [\n cardId,\n table.cards[cardId] ? getCard(table, cardId) : undefined,\n ]),\n ) as Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n }>;\n}\n\nexport function getSharedZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getSharedZoneCards(table, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getPlayerZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getPlayerZoneCards(table, playerId, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): ViewSlotOccupantForTable<Table>[] {\n return orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host, slotId),\n ).map((componentId) => ({\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n }));\n}\n\nexport function getSlotOccupantsByHost<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n): Readonly<Record<string, ViewSlotOccupantForTable<Table>[]>> {\n const occupantsBySlot: Record<string, ViewSlotOccupantForTable<Table>[]> = {};\n\n orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host),\n ).forEach((componentId) => {\n const location = table.componentLocations[componentId];\n if (!location || !matchesSlotHost(location, host)) {\n return;\n }\n\n const slotOccupant: ViewSlotOccupantForTable<Table> = {\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId: location.slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n };\n\n (occupantsBySlot[location.slotId] ??= []).push(slotOccupant);\n });\n\n return occupantsBySlot;\n}\n\nexport function getCardOwner<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"ownerOfCard\"][CardId] {\n return table.ownerOfCard[cardId] as Table[\"ownerOfCard\"][CardId];\n}\n\nexport function getCardVisibility<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"visibility\"][CardId] {\n return table.visibility[cardId] as Table[\"visibility\"][CardId];\n}\n","import type {\n PlayerIdOfTable,\n ResourceBalancesOfTable,\n RuntimeRecord,\n RuntimeTableRecord,\n} from \"../model\";\nimport type { PerPlayer, PlayerId } from \"../per-player\";\nimport { perPlayerGet, perPlayerSet } from \"../per-player\";\n\nexport function getPlayerOrder<Table extends RuntimeTableRecord>(\n table: Table,\n): Table[\"playerOrder\"] {\n return table.playerOrder;\n}\n\nexport function getPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: PlayerIdOfTable<NoInfer<Table>>,\n): ResourceBalancesOfTable<Table> {\n return perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as unknown as PlayerId,\n ) as ResourceBalancesOfTable<Table>;\n}\n\n/**\n * Read the amount a player holds of a single resource. Returns `0` when the\n * player has never accumulated that resource.\n */\nexport function getPlayerResourceAmount<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n const value = (playerResources as Record<string, unknown>)[resourceId];\n return typeof value === \"number\" ? value : 0;\n}\n\n/**\n * Sum of every resource amount for a player (e.g. \"total cards in hand\"\n * games). Skips `undefined` and non-number values.\n */\nexport function getPlayerResourceTotal<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n let total = 0;\n for (const key of Object.keys(playerResources)) {\n const value = (playerResources as Record<string, unknown>)[key];\n if (typeof value === \"number\") total += value;\n }\n return total;\n}\n\n/**\n * Next player in seating order after `playerId`, wrapping around to the\n * first seat. Returns `null` when `playerId` is not in the player order or\n * the order is empty.\n */\nexport function getNextPlayerInOrder<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): PlayerIdOfTable<Table> | null {\n const order = table.playerOrder as unknown as ReadonlyArray<\n PlayerIdOfTable<Table>\n >;\n if (order.length === 0) return null;\n const idx = order.indexOf(playerId as PlayerIdOfTable<Table>);\n if (idx < 0) return null;\n return order[(idx + 1) % order.length] ?? null;\n}\n\n/**\n * Iterate a resource-amounts record, skipping undefined / non-positive entries.\n * Shared by the resource mutation helpers below.\n */\nfunction forEachResourceEntry(\n amounts: Readonly<Record<string, number | undefined>>,\n visit: (resourceId: string, amount: number) => void,\n): void {\n for (const resourceId of Object.keys(amounts)) {\n const amount = amounts[resourceId];\n if (typeof amount !== \"number\" || amount === 0) continue;\n visit(resourceId, amount);\n }\n}\n\n/**\n * Return `true` when `playerId` has at least the requested `amounts` of each\n * resource. Unknown resource ids are treated as zero-balance (i.e. requesting\n * one of them returns `false` unless the requested amount is also zero).\n */\nexport function canAffordResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): boolean {\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n if (getPlayerResourceAmount(table, playerId, resourceId) < required) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Return the subset of `amounts` that the player cannot afford. The returned\n * record maps resource id → shortfall. Empty when the player can afford the\n * full cost.\n */\nexport function getMissingResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Record<string, number> {\n const missing: Record<string, number> = {};\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n const have = getPlayerResourceAmount(table, playerId, resourceId);\n if (have < required) missing[resourceId] = required - have;\n }\n return missing;\n}\n\nfunction writePlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n nextForPlayer: Record<string, number>,\n): void {\n table.resources = perPlayerSet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n nextForPlayer as RuntimeRecord,\n ) as Table[\"resources\"];\n}\n\n/**\n * Increment each resource in `amounts` for `playerId`. Negative entries are\n * rejected — prefer {@link spendPlayerResources} for deductions so that\n * affordability is checked explicitly.\n */\nexport function addPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const nextTable = { ...table };\n addPlayerResourcesInPlace(nextTable, playerId, amounts);\n return nextTable;\n}\n\nexport function addPlayerResourcesInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `addPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Use spendPlayerResources or transferPlayerResources instead.`,\n );\n }\n next[resourceId] = (next[resourceId] ?? 0) + amount;\n });\n writePlayerResources(table, playerId, next);\n}\n\n/**\n * Deduct each resource in `amounts` from `playerId`. Throws when the player\n * cannot afford the full cost — callers must check `canAfford` in their\n * `validate` phase before invoking this op.\n */\nexport function spendPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const nextTable = { ...table };\n spendPlayerResourcesInPlace(nextTable, playerId, amounts);\n return nextTable;\n}\n\nexport function spendPlayerResourcesInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n if (!canAffordResources(table, playerId, amounts)) {\n const missing = getMissingResources(table, playerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${playerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `spendPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Pass positive amounts — the op deducts them from the player.`,\n );\n }\n next[resourceId] = Math.max(0, (next[resourceId] ?? 0) - amount);\n });\n writePlayerResources(table, playerId, next);\n}\n\n/**\n * Transfer the specified `amounts` from one player to another. Fails when the\n * source player cannot afford the full cost; on success the destination\n * gains exactly what the source loses.\n */\nexport function transferPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const nextTable = { ...table };\n transferPlayerResourcesInPlace(nextTable, fromPlayerId, toPlayerId, amounts);\n return nextTable;\n}\n\nexport function transferPlayerResourcesInPlace<\n Table extends RuntimeTableRecord,\n>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): void {\n spendPlayerResourcesInPlace(table, fromPlayerId, amounts);\n addPlayerResourcesInPlace(table, toPlayerId, amounts);\n}\n\n/**\n * Overwrite a single resource balance for a player. Prefer the additive or\n * subtractive helpers — use this only when the new balance is an absolute\n * (e.g. \"set coins to 10\" for a scripted setup).\n */\nexport function setPlayerResource<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): Table {\n const nextTable = { ...table };\n setPlayerResourceInPlace(nextTable, playerId, resourceId, amount);\n return nextTable;\n}\n\nexport function setPlayerResourceInPlace<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): void {\n if (!Number.isFinite(amount) || amount < 0) {\n throw new Error(\n `setPlayerResource: amount must be a non-negative finite number, got ${amount}.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n writePlayerResources(table, playerId, {\n ...prev,\n [resourceId]: amount,\n });\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n ComponentIdOfTable,\n HexBoardIdOfTable,\n HexEdgeIdOfTable,\n HexVertexIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeComponentLocation,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"../model\";\nimport {\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getEdge,\n getVertex,\n} from \"./board-queries\";\nimport { assertCardAllowedInContainer } from \"./card-validation\";\nimport { cloneRuntimeTable } from \"./clone\";\nimport {\n ensureArray,\n orderedComponentIdsForLocation,\n ppRead,\n syncPlayerZoneWithHand,\n syncSharedZoneWithDeck,\n} from \"./internal\";\n\nfunction reindexSpaceOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): void {\n getComponentsOnSpace(table, boardId, spaceId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnSpace\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexContainerOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, containerId: ContainerId): void {\n getComponentsInContainer(table, boardId, containerId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InContainer\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexEdgeOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n EdgeId extends HexEdgeIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnEdge\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexVertexOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n VertexId extends HexVertexIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, vertexId: VertexId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnVertex\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n location.slotId === slotId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InSlot\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction removeComponentFromCurrentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n const currentLocation = table.componentLocations[componentId];\n if (!currentLocation) {\n return;\n }\n\n if (currentLocation.type === \"InDeck\") {\n const nextCards = ensureArray(table.decks[currentLocation.deckId]).filter(\n (candidate) => candidate !== componentId,\n );\n syncSharedZoneWithDeck(\n table,\n currentLocation.deckId as SharedZoneIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InDeck\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"InHand\") {\n const nextCards = ensureArray(\n ppRead(table.hands[currentLocation.handId], currentLocation.playerId),\n ).filter((candidate) => candidate !== componentId);\n syncPlayerZoneWithHand(\n table,\n currentLocation.handId as PlayerZoneIdOfTable<Table>,\n currentLocation.playerId as PlayerIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InHand\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"OnSpace\") {\n delete table.componentLocations[componentId];\n reindexSpaceOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.spaceId as SpaceIdOfTable<Table, BoardIdOfTable<Table>>,\n );\n return;\n }\n\n if (currentLocation.type === \"InZone\") {\n if (currentLocation.zoneId in table.zones.shared) {\n const nextComponents = ensureArray(\n table.zones.shared[currentLocation.zoneId],\n ).filter((candidate) => candidate !== componentId);\n syncSharedZoneWithDeck(\n table,\n currentLocation.zoneId as SharedZoneIdOfTable<Table>,\n nextComponents,\n );\n nextComponents.forEach((currentComponentId, index) => {\n const location = table.componentLocations[currentComponentId];\n if (location?.type === \"InZone\") {\n table.componentLocations[currentComponentId] = {\n ...location,\n position: index,\n };\n }\n });\n }\n delete table.componentLocations[componentId];\n return;\n }\n\n if (currentLocation.type === \"InContainer\") {\n delete table.componentLocations[componentId];\n reindexContainerOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.containerId as BoardContainerIdOfTable<\n Table,\n BoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnEdge\") {\n delete table.componentLocations[componentId];\n reindexEdgeOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.edgeId as HexEdgeIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnVertex\") {\n delete table.componentLocations[componentId];\n reindexVertexOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.vertexId as HexVertexIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"InSlot\") {\n delete table.componentLocations[componentId];\n reindexSlotOccupants(table, currentLocation.host, currentLocation.slotId);\n return;\n }\n\n delete table.componentLocations[componentId];\n}\n\nexport function moveComponentToSpace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n moveComponentToSpaceInPlace(nextTable, componentId, boardId, spaceId);\n return nextTable;\n}\n\nexport function moveComponentToSpaceInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n spaceId: SpaceId,\n): void {\n const position = getComponentsOnSpace(table, boardId, spaceId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId,\n position,\n };\n}\n\nexport function moveComponentToContainer<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n containerId: ContainerId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n moveComponentToContainerInPlace(nextTable, componentId, boardId, containerId);\n return nextTable;\n}\n\nexport function moveComponentToContainerInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n containerId: ContainerId,\n): void {\n assertCardAllowedInContainer(table, boardId, containerId, componentId);\n const position = getComponentsInContainer(table, boardId, containerId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId,\n position,\n };\n}\n\nexport function moveComponentToDetached<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): Table {\n const nextTable = cloneRuntimeTable(table);\n moveComponentToDetachedInPlace(nextTable, componentId);\n return nextTable;\n}\n\nexport function moveComponentToDetachedInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = { type: \"Detached\" };\n}\n\nexport function moveComponentToEdge<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n edgeId: EdgeId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n moveComponentToEdgeInPlace(nextTable, componentId, boardId, edgeId);\n return nextTable;\n}\n\nexport function moveComponentToEdgeInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n edgeId: EdgeId,\n): void {\n getEdge(table, boardId, edgeId);\n const position = getComponentsOnEdge(table, boardId, edgeId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position,\n };\n}\n\nexport function moveComponentToVertex<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n vertexId: VertexId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n moveComponentToVertexInPlace(nextTable, componentId, boardId, vertexId);\n return nextTable;\n}\n\nexport function moveComponentToVertexInPlace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n vertexId: VertexId,\n): void {\n getVertex(table, boardId, vertexId);\n const position = getComponentsOnVertex(table, boardId, vertexId).length;\n removeComponentFromCurrentLocation(table, componentId);\n table.componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position,\n };\n}\n","import type {\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n} from \"../model\";\nimport { assertCardAllowedInZone } from \"./card-validation\";\nimport { cloneRuntimeTable } from \"./clone\";\nimport {\n assertZoneScope,\n ensureArray,\n ppRead,\n ppWrite,\n syncPlayerZoneWithHand,\n syncSharedZoneWithDeck,\n} from \"./internal\";\n\n/**\n * Read or write a per-player zone's card list by mutating `table` in place.\n * Called with no `nextCards` to read; called with `nextCards` to write the\n * new ordering. Returns the list at the read site as a plain array.\n *\n * Used by engine-side per-player shuffle resolution; authors should reach for\n * the named ops in this file.\n */\nexport function shufflePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n nextCards?: readonly string[],\n): string[] {\n if (nextCards === undefined) {\n const fromZone = ppRead(\n table.zones.perPlayer[zoneId] ?? table.hands[zoneId],\n playerId,\n ) as readonly string[] | undefined;\n return [...ensureArray(fromZone)];\n }\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId, [\n ...nextCards,\n ]) as (typeof table.hands)[string];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId,\n [...nextCards],\n ) as (typeof table.zones.perPlayer)[string];\n return [...nextCards];\n}\n\nfunction appendToDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n const nextTable = cloneRuntimeTable(table);\n appendToDeckInPlace(nextTable, deckId, cardId, playedBy, position);\n return nextTable;\n}\n\nexport function appendToDeckInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): void {\n assertZoneScope(\n table,\n deckId as string,\n \"shared\",\n \"addCardToSharedZone\",\n \"zoneId\",\n );\n const deckCards = [...ensureArray(table.decks[deckId])] as DeckCardsOfTable<\n Table,\n DeckId\n >;\n assertCardAllowedInZone(table, deckId, cardId);\n if (position === \"top\") {\n deckCards.unshift(cardId);\n } else {\n deckCards.push(cardId);\n }\n syncSharedZoneWithDeck(table, deckId, deckCards);\n for (const [index, currentCardId] of deckCards.entries()) {\n if (currentCardId === cardId) {\n table.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy,\n position: index,\n };\n continue;\n }\n const existing = table.componentLocations[currentCardId];\n table.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy: existing?.type === \"InDeck\" ? existing.playedBy : null,\n position: index,\n };\n }\n table.ownerOfCard[cardId] = playedBy;\n table.visibility[cardId] = {\n faceUp: true,\n };\n}\n\nfunction removeFromDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n const nextTable = cloneRuntimeTable(table);\n removeFromDeckInPlace(nextTable, deckId, cardId);\n return nextTable;\n}\n\nexport function removeFromDeckInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): void {\n assertZoneScope(\n table,\n deckId as string,\n \"shared\",\n \"removeCardFromSharedZone\",\n \"zoneId\",\n );\n const remaining = ensureArray(table.decks[deckId]).filter(\n (candidate) => candidate !== cardId,\n );\n syncSharedZoneWithDeck(table, deckId, remaining);\n for (const [index, currentCardId] of remaining.entries()) {\n const currentLocation = table.componentLocations[currentCardId];\n if (currentLocation?.type === \"InDeck\") {\n table.componentLocations[currentCardId] = {\n ...currentLocation,\n position: index,\n };\n }\n }\n}\n\nfunction computeVisibilityForPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction moveFromHandToDeck<\n Table extends RuntimeTableRecord,\n HandId extends HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends DeckIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n handId: HandId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n deckId: DeckId;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n moveFromHandToDeckInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nfunction moveFromHandToDeckInPlace<\n Table extends RuntimeTableRecord,\n HandId extends HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends DeckIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n handId: HandId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n deckId: DeckId;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.handId as string,\n \"perPlayer\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.deckId as string,\n \"shared\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"toZoneId\",\n );\n const currentHand = ensureArray(\n ppRead(options.table.hands[options.handId], options.playerId as string) as\n | readonly string[]\n | undefined,\n ).filter((candidate) => candidate !== options.cardId);\n syncPlayerZoneWithHand(\n options.table,\n options.handId,\n options.playerId,\n currentHand,\n );\n for (const [index, currentCardId] of currentHand.entries()) {\n options.table.componentLocations[currentCardId as string] = {\n type: \"InHand\",\n handId: options.handId,\n playerId: options.playerId,\n position: index,\n };\n }\n options.table.ownerOfCard[options.cardId] =\n options.playedBy ?? options.playerId;\n options.table.visibility[options.cardId] = {\n faceUp: true,\n };\n appendToDeckInPlace(\n options.table,\n options.deckId,\n options.cardId,\n options.playedBy ?? options.playerId,\n options.position ?? \"bottom\",\n );\n}\n\nexport function moveCardFromPlayerZoneToSharedZone<\n Table extends RuntimeTableRecord,\n HandId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: HandId;\n toZoneId: DeckId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n return moveFromHandToDeck({\n table: options.table,\n playerId: options.playerId,\n handId: options.fromZoneId,\n cardId: options.cardId,\n deckId: options.toZoneId,\n playedBy: options.playedBy,\n position: options.position,\n });\n}\n\nexport function moveCardFromPlayerZoneToSharedZoneInPlace<\n Table extends RuntimeTableRecord,\n HandId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: HandId;\n toZoneId: DeckId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): void {\n moveFromHandToDeckInPlace({\n table: options.table,\n playerId: options.playerId,\n handId: options.fromZoneId,\n cardId: options.cardId,\n deckId: options.toZoneId,\n playedBy: options.playedBy,\n position: options.position,\n });\n}\n\n/**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer zone\n * (e.g. discard, hand, in-play). Use this for the \"gain\" verb — distinct from\n * `dealCardsToPlayerZone`, which draws an unspecified count of top cards from\n * a deck. Owner flips to the receiving player; visibility is recomputed from\n * the destination zone's `handVisibility` mode.\n */\n/**\n * Move the top `count` cards from one perPlayer zone to another for the same\n * player. Companion to {@link dealCardsFromDeckToHand} for the perPlayer →\n * perPlayer case (most importantly, \"draw N from your deck to your hand\"\n * in deck-builders). Visibility is recomputed for the destination; owner is\n * preserved.\n */\nexport function dealCardsBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n dealCardsBetweenPlayerZonesInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nexport function dealCardsBetweenPlayerZonesInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n}): void {\n let nextTable = options.table;\n for (let i = 0; i < options.count; i += 1) {\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const topCardId = sourceCards[0];\n if (topCardId === undefined) {\n break;\n }\n moveCardBetweenPlayerZonesInPlace({\n table: nextTable,\n playerId: options.playerId,\n fromZoneId: options.fromZoneId,\n toZoneId: options.toZoneId,\n cardId: topCardId as CompatibleCardIdForTwoPlayerZones<\n Table,\n FromZoneId,\n ToZoneId\n >,\n });\n }\n}\n\nexport function moveCardFromSharedZoneToPlayerZone<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<Table, ToZoneId, FromZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n moveCardFromSharedZoneToPlayerZoneInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nexport function moveCardFromSharedZoneToPlayerZoneInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<Table, ToZoneId, FromZoneId>;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.fromZoneId as string,\n \"shared\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n options.table.zones.shared[options.fromZoneId] ??\n options.table.decks[options.fromZoneId],\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in shared zone '${String(\n options.fromZoneId,\n )}'.`,\n );\n }\n assertCardAllowedInZone(\n options.table,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncSharedZoneWithDeck(options.table, options.fromZoneId, remainingSource);\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = options.table.componentLocations[currentCardId];\n if (existing?.type === \"InDeck\") {\n options.table.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n options.table.zones.perPlayer[options.toZoneId] ??\n options.table.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n options.table,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n options.table.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n options.table.ownerOfCard[options.cardId as string] =\n options.playerId as string;\n options.table.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n}\n\n/**\n * Move a card between two perPlayer zones owned by the same player. Use this\n * for hand → in-play, in-play → discard, and similar same-player transitions\n * that do not change ownership. Owner is preserved; visibility is recomputed\n * from the destination zone's `handVisibility` mode.\n */\nexport function moveCardBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<Table, FromZoneId, ToZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n moveCardBetweenPlayerZonesInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nexport function moveCardBetweenPlayerZonesInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<Table, FromZoneId, ToZoneId>;\n position?: \"top\" | \"bottom\";\n}): void {\n assertZoneScope(\n options.table,\n options.fromZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n options.table,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n ppRead(\n options.table.zones.perPlayer[options.fromZoneId] ??\n options.table.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in zone '${String(\n options.fromZoneId,\n )}' for player '${String(options.playerId)}'.`,\n );\n }\n assertCardAllowedInZone(\n options.table,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncPlayerZoneWithHand(\n options.table,\n options.fromZoneId,\n options.playerId,\n remainingSource,\n );\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = options.table.componentLocations[currentCardId];\n if (existing?.type === \"InHand\") {\n options.table.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n options.table.zones.perPlayer[options.toZoneId] ??\n options.table.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n options.table,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n options.table.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n options.table.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n options.table,\n options.toZoneId as string,\n options.playerId as string,\n );\n}\n\nexport function moveCardBetweenSharedZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<Table, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n moveCardBetweenSharedZonesInPlace({\n ...options,\n table: nextTable,\n });\n return nextTable;\n}\n\nexport function moveCardBetweenSharedZonesInPlace<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<Table, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): void {\n removeFromDeckInPlace(options.table, options.fromZoneId, options.cardId);\n appendToDeckInPlace(\n options.table,\n options.toZoneId,\n options.cardId as DeckCardsOfTable<Table, ToZoneId>[number],\n options.playedBy ?? null,\n options.position ?? \"bottom\",\n );\n}\n\nexport function removeCardFromSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n return removeFromDeck(table, deckId, cardId);\n}\n\nexport function removeCardFromSharedZoneInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): void {\n removeFromDeckInPlace(table, deckId, cardId);\n}\n\nexport function addCardToSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n return appendToDeck(table, deckId, cardId, playedBy, position);\n}\n\nexport function addCardToSharedZoneInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): void {\n appendToDeckInPlace(table, deckId, cardId, playedBy, position);\n}\n\n/**\n * Deterministically draw the top `count` cards from a shared deck and deal\n * them into a player's hand zone. No RNG is consumed — call\n * {@link shuffleSharedZone} (via `fx.shuffleSharedZone`) first if the deck\n * needs randomising.\n */\nexport function dealCardsFromDeckToHand<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n HandId extends HandIdOfTable<Table>,\n>(\n table: Table,\n fromZoneId: DeckId,\n playerId: PlayerId,\n toZoneId: HandId,\n count: number,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n dealCardsFromDeckToHandInPlace(\n nextTable,\n fromZoneId,\n playerId,\n toZoneId,\n count,\n );\n return nextTable;\n}\n\nexport function dealCardsFromDeckToHandInPlace<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n HandId extends HandIdOfTable<Table>,\n>(\n table: Table,\n fromZoneId: DeckId,\n playerId: PlayerId,\n toZoneId: HandId,\n count: number,\n): void {\n const publicHands = new Set(\n Object.entries(table.handVisibility)\n .filter(([, mode]) => mode === \"all\" || mode === \"public\")\n .map(([handId]) => handId),\n );\n\n for (let index = 0; index < count; index += 1) {\n const nextCard = ensureArray(table.decks[fromZoneId])[0];\n if (!nextCard) {\n break;\n }\n table.decks[fromZoneId] = ensureArray(table.decks[fromZoneId]).slice(\n 1,\n ) as (typeof table.decks)[DeckId];\n table.zones.shared[fromZoneId] = [\n ...ensureArray(table.decks[fromZoneId]),\n ] as (typeof table.zones.shared)[DeckId];\n const prevHand = ppRead(table.hands[toZoneId], playerId as string) as\n | readonly string[]\n | undefined;\n const nextHand = [...ensureArray(prevHand), nextCard];\n assertCardAllowedInZone(table, toZoneId, nextCard);\n table.hands[toZoneId] = ppWrite(\n table.hands[toZoneId],\n playerId as string,\n nextHand,\n ) as (typeof table.hands)[HandId];\n table.zones.perPlayer[toZoneId] = ppWrite(\n table.zones.perPlayer[toZoneId],\n playerId as string,\n [...nextHand],\n ) as (typeof table.zones.perPlayer)[HandId];\n table.componentLocations[nextCard] = {\n type: \"InHand\",\n handId: toZoneId,\n playerId,\n position: nextHand.length - 1,\n };\n table.ownerOfCard[nextCard] = playerId;\n table.visibility[nextCard] = publicHands.has(toZoneId as string)\n ? {\n faceUp: true,\n }\n : {\n faceUp: false,\n visibleTo: [playerId],\n };\n }\n}\n","import type { RuntimeRngState } from \"./model\";\n\n/**\n * Deterministic pseudo-random integer generator for reducer-native games.\n *\n * The public contract is `(rng.seed, rng.cursor) -> value`, with the cursor\n * advanced by one per call. Same `(seed, cursor)` tuple always produces the\n * same output, which is what makes session replay deterministic without\n * having to persist anything beyond the seed and cursor.\n *\n * Internally we hash `(seed, cursor)` through a Murmur3-style 32-bit\n * finalizer rather than computing a linear combination of the cursor. The\n * older `(seed * A + C + cursor) & 0x7fffffff` form was linear in `cursor`,\n * so consecutive samples differed by a fixed step — for a d6 that meant\n * every roll produced a simple `+1` counter through the faces. Mixing\n * `(seed, cursor)` with an avalanche finalizer is still pure and still\n * cheap, but now nearby cursors yield well-distributed outputs.\n *\n * Distribution note: the `% bound` step is biased when `bound` is not a\n * power of two. For gameplay-level bounds (≤ 64) the bias is negligible\n * and we leave it in to keep replay fixtures stable against future bound\n * changes. If a caller ever needs strict uniformity we can add an\n * explicit `nextUniformInt` without touching the existing consumers.\n */\nexport function nextRandomInt(\n bound: number,\n rng: RuntimeRngState,\n): [number, RuntimeRngState] {\n if (bound <= 0) {\n throw new Error(\"Random bound must be positive.\");\n }\n const seed = rng.seed ?? 1;\n const raw = hashSeedCursor(seed, rng.cursor);\n const value = raw % bound;\n return [\n value,\n {\n ...rng,\n cursor: rng.cursor + 1,\n trace: [\n ...rng.trace,\n `cursor=${rng.cursor};bound=${bound};value=${value}`,\n ],\n },\n ];\n}\n\n/**\n * Mix `(seed, cursor)` into a uniformly-distributed uint32 using a\n * Murmur3-style finalizer. The seed is split into its low and high 32-bit\n * halves so large 53-bit JS-integer seeds (including the negative seeds\n * the backend derives from its own 64-bit generator) don't collapse onto\n * the same bucket after a `| 0` truncation.\n */\nfunction hashSeedCursor(seed: number, cursor: number): number {\n const seedLo = seed | 0;\n // `Math.floor(seed / 2^32) | 0` keeps the upper bits of large seeds.\n // For small seeds this is 0 (or -1 for negatives), so the stir below is\n // still dominated by `seedLo` + `cursor` as you'd expect.\n const seedHi = Math.floor(seed / 0x1_0000_0000) | 0;\n let x = Math.imul(seedLo, 0x9e3779b1);\n x = (x + Math.imul(seedHi, 0x85ebca77)) | 0;\n x = (x + Math.imul(cursor | 0, 0xc2b2ae3d)) | 0;\n // Murmur3 32-bit finalizer.\n x = Math.imul(x ^ (x >>> 16), 0x85ebca6b);\n x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);\n x = x ^ (x >>> 16);\n return x >>> 0;\n}\n","import {\n assertCardAllowedInContainer,\n assertCardAllowedInZone,\n cloneRuntimeTable,\n ensureArray,\n getComponentsInContainer,\n getComponentsOnSpace,\n} from \"./table\";\nimport { nextRandomInt } from \"./rng\";\nimport type {\n RuntimeComponentLocation,\n RuntimeRngState,\n RuntimeTableRecord,\n SetupBootstrapContainerRef,\n SetupBootstrapDestinationRef,\n SetupBootstrapPerPlayerContainerTemplateRef,\n SetupBootstrapStep,\n} from \"./model\";\nimport type { PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerSet } from \"./per-player\";\n\ntype StatefulBootstrapContext = {\n table: RuntimeTableRecord;\n runtime: {\n rng: RuntimeRngState;\n };\n};\n\ntype ResolvedSharedZoneRef = {\n kind: \"sharedZone\";\n zoneId: string;\n};\n\ntype ResolvedPlayerZoneRef = {\n kind: \"playerZone\";\n zoneId: string;\n playerId: string;\n};\n\ntype ResolvedBoardZoneRef = {\n kind: \"container\";\n boardId: string;\n containerId: string;\n zoneId: string;\n};\n\ntype ResolvedBoardSpaceRef = {\n kind: \"space\";\n boardId: string;\n spaceId: string;\n};\n\ntype ResolvedContainerRef =\n | ResolvedSharedZoneRef\n | ResolvedPlayerZoneRef\n | ResolvedBoardZoneRef\n | ResolvedBoardSpaceRef;\n\nfunction isCardComponent(\n table: RuntimeTableRecord,\n componentId: string,\n): boolean {\n return componentId in table.cards;\n}\n\nfunction resolveRuntimeBoardId(\n table: RuntimeTableRecord,\n boardId: string,\n playerId?: string,\n): string {\n if (playerId) {\n const perPlayerBoardId = `${boardId}:${playerId}`;\n if (table.boards.byId[perPlayerBoardId]) {\n return perPlayerBoardId;\n }\n }\n if (table.boards.byId[boardId]) {\n return boardId;\n }\n throw new Error(`Unknown board '${boardId}'.`);\n}\n\nfunction resolveContainerRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapContainerRef | SetupBootstrapDestinationRef,\n): ResolvedContainerRef {\n if (ref.type === \"sharedZone\") {\n return {\n kind: \"sharedZone\",\n zoneId: ref.zoneId,\n };\n }\n\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId: ref.playerId,\n };\n }\n\n if (ref.type === \"sharedBoardContainer\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"playerBoardContainer\") {\n const board =\n table.boards.byId[\n resolveRuntimeBoardId(table, ref.boardId, ref.playerId)\n ];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"sharedBoardSpace\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n if (!board) {\n throw new Error(`Unknown board '${ref.boardId}'.`);\n }\n const space = board?.spaces[ref.spaceId];\n if (!space) {\n throw new Error(\n `Unknown board space '${ref.spaceId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, ref.playerId)];\n if (!board) {\n throw new Error(\n `Unknown board '${ref.boardId}' for player '${ref.playerId}'.`,\n );\n }\n const space = board?.spaces[ref.spaceId];\n if (!space) {\n throw new Error(\n `Unknown board space '${ref.spaceId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n };\n}\n\nfunction readContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n): string[] {\n if (ref.kind === \"sharedZone\") {\n return [\n ...ensureArray(table.zones.shared[ref.zoneId] ?? table.decks[ref.zoneId]),\n ];\n }\n\n if (ref.kind === \"playerZone\") {\n const zoneValue = table.zones.perPlayer[ref.zoneId];\n const handValue = table.hands[ref.zoneId];\n const seat = ref.playerId as PlayerId;\n return [\n ...ensureArray(\n (zoneValue !== undefined ? perPlayerGet(zoneValue, seat) : undefined) ??\n (handValue !== undefined ? perPlayerGet(handValue, seat) : undefined),\n ),\n ];\n }\n\n if (ref.kind === \"space\") {\n return getComponentsOnSpace(table, ref.boardId, ref.spaceId);\n }\n\n return getComponentsInContainer(table, ref.boardId, ref.containerId);\n}\n\nfunction sharedZoneLocationFor(\n table: RuntimeTableRecord,\n componentId: string,\n zoneId: string,\n position: number,\n): RuntimeComponentLocation {\n if (isCardComponent(table, componentId)) {\n return {\n type: \"InDeck\",\n deckId: zoneId,\n playedBy: null,\n position,\n };\n }\n\n return {\n type: \"InZone\",\n zoneId,\n playedBy: null,\n position,\n };\n}\n\nfunction updateCardVisibilityForZone(\n table: RuntimeTableRecord,\n componentId: string,\n ref: ResolvedContainerRef,\n): void {\n if (!isCardComponent(table, componentId)) {\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n table.ownerOfCard[componentId] = ref.playerId;\n table.visibility[componentId] =\n visibility === \"all\" || visibility === \"public\"\n ? { faceUp: true }\n : { faceUp: false, visibleTo: [ref.playerId] };\n return;\n }\n\n if (ref.kind === \"sharedZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n if (visibility === \"hidden\" || visibility === \"ownerOnly\") {\n table.visibility[componentId] = { faceUp: false };\n return;\n }\n table.visibility[componentId] = { faceUp: true };\n }\n}\n\nfunction writeContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n componentIds: readonly string[],\n): void {\n if (ref.kind === \"sharedZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n table.decks[ref.zoneId] = [...componentIds];\n table.zones.shared[ref.zoneId] = [...componentIds];\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = sharedZoneLocationFor(\n table,\n componentId,\n ref.zoneId,\n index,\n );\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n const seat = ref.playerId as PlayerId;\n const prevHand = table.hands[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.hands[ref.zoneId] = perPlayerSet(prevHand, seat, [...componentIds]);\n\n const prevZone = table.zones.perPlayer[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.zones.perPlayer[ref.zoneId] = perPlayerSet(prevZone, seat, [\n ...componentIds,\n ]);\n\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InHand\",\n handId: ref.zoneId,\n playerId: ref.playerId,\n position: index,\n };\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"space\") {\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId: ref.boardId,\n spaceId: ref.spaceId,\n position: index,\n };\n });\n return;\n }\n\n componentIds.forEach((componentId) => {\n assertCardAllowedInContainer(\n table,\n ref.boardId,\n ref.containerId,\n componentId,\n );\n });\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId: ref.boardId,\n containerId: ref.containerId,\n position: index,\n };\n });\n}\n\nfunction selectMovedComponents(\n current: readonly string[],\n step: Extract<SetupBootstrapStep, { type: \"move\" }>,\n): string[] {\n if (step.componentIds && typeof step.count === \"number\") {\n throw new Error(\n \"Setup bootstrap move step cannot specify both count and componentIds.\",\n );\n }\n\n if (step.componentIds) {\n const missing = step.componentIds.filter(\n (componentId) => !current.includes(componentId),\n );\n if (missing.length > 0) {\n throw new Error(\n `Setup bootstrap move step references missing components: ${missing.join(\", \")}`,\n );\n }\n return [...step.componentIds];\n }\n\n if (typeof step.count === \"number\") {\n return current.slice(0, step.count);\n }\n\n return [...current];\n}\n\nfunction resolveDealTargetRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapPerPlayerContainerTemplateRef,\n playerId: string,\n): ResolvedContainerRef {\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, playerId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n}\n\nexport function applySetupBootstrap<State extends StatefulBootstrapContext>(\n state: State,\n steps: readonly SetupBootstrapStep[],\n): State {\n if (steps.length === 0) {\n return state;\n }\n\n const nextTable = cloneRuntimeTable(state.table);\n let nextRng = state.runtime.rng;\n\n for (const step of steps) {\n if (step.type === \"shuffle\") {\n const container = resolveContainerRef(nextTable, step.container);\n const shuffled = readContainerComponents(nextTable, container);\n for (let lastIndex = shuffled.length - 1; lastIndex > 0; lastIndex -= 1) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n nextRng = updatedRng;\n const current = shuffled[lastIndex];\n const swap = shuffled[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `setup shuffle: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${shuffled.length})`,\n );\n }\n shuffled[lastIndex] = swap;\n shuffled[swapIndex] = current;\n }\n writeContainerComponents(nextTable, container, shuffled);\n continue;\n }\n\n if (step.type === \"move\") {\n const from = resolveContainerRef(nextTable, step.from);\n const to = resolveContainerRef(nextTable, step.to);\n const currentFrom = readContainerComponents(nextTable, from);\n const moved = selectMovedComponents(currentFrom, step);\n const remaining = currentFrom.filter(\n (componentId) => !moved.includes(componentId),\n );\n const currentTo = readContainerComponents(nextTable, to);\n\n writeContainerComponents(nextTable, from, remaining);\n writeContainerComponents(nextTable, to, [...currentTo, ...moved]);\n continue;\n }\n\n const from = resolveContainerRef(nextTable, step.from);\n if (from.kind === \"playerZone\") {\n throw new Error(\n \"Setup bootstrap deal steps require a shared source container.\",\n );\n }\n const playerIds = step.playerIds\n ? [...step.playerIds]\n : [...nextTable.playerOrder];\n let sourceComponents = readContainerComponents(nextTable, from);\n\n for (const playerId of playerIds) {\n if (sourceComponents.length === 0) {\n break;\n }\n const dealt = sourceComponents.slice(0, step.count);\n if (dealt.length === 0) {\n break;\n }\n sourceComponents = sourceComponents.slice(dealt.length);\n const target = resolveDealTargetRef(nextTable, step.to, playerId);\n const currentTo = readContainerComponents(nextTable, target);\n writeContainerComponents(nextTable, target, [...currentTo, ...dealt]);\n }\n\n writeContainerComponents(nextTable, from, sourceComponents);\n }\n\n return {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: nextRng,\n },\n };\n}\n","import { cardInput } from \"./inputs/cardInput\";\nimport { cardTarget } from \"./inputs/cardTarget\";\nimport type {\n AnyCardActionSpec,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameStateOfContract,\n EffectMap,\n InputCollector,\n InteractionMap,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n StageMap,\n StageSpec,\n ViewMapOf,\n PhaseZoneList,\n PlayerZoneIdOfManifest,\n} from \"./model\";\n\nexport type ReducerIndexedPhase<Contract extends ReducerGameContractLike> =\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n EffectMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n StageMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n PhaseZoneList<ManifestContractOf<Contract>>\n >;\n\nexport type ReducerIndexedInteractionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyInteractionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedStageEntry<Contract extends ReducerGameContractLike> =\n readonly [\n string,\n StageSpec<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n ];\n\nexport type ReducerIndexedZoneEntry<Contract extends ReducerGameContractLike> =\n PlayerZoneIdOfManifest<ManifestContractOf<Contract>>;\n\nexport type ReducerIndexedCardActionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyCardActionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedEffectEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n {\n readonly id: string;\n readonly type: string;\n readonly continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n readonly id?: string;\n };\n },\n];\n\nexport interface ReducerDefinitionPhaseIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseName: PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n readonly phase: ReducerIndexedPhase<Contract>;\n readonly interactions: ReadonlyArray<\n ReducerIndexedInteractionEntry<Contract>\n >;\n readonly stages: ReadonlyArray<ReducerIndexedStageEntry<Contract>>;\n readonly zones: ReadonlyArray<ReducerIndexedZoneEntry<Contract>>;\n readonly cardActions: ReadonlyArray<ReducerIndexedCardActionEntry<Contract>>;\n readonly effects: ReadonlyArray<ReducerIndexedEffectEntry<Contract>>;\n}\n\nexport interface ReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n ReducerIndexedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >;\n}\n\ntype RawEffectEntry<Contract extends ReducerGameContractLike> = readonly [\n string,\n {\n id?: string;\n type?: string;\n __continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n id?: string;\n };\n },\n];\n\nfunction phaseEntriesOf<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): Array<\n readonly [\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerIndexedPhase<Contract>,\n ]\n> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n return Object.entries(definition.phases) as unknown as Array<\n readonly [PhaseName, ReducerIndexedPhase<Contract>]\n >;\n}\n\nfunction interactionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n return Object.entries(\n (phase as { interactions?: Record<string, unknown> }).interactions ?? {},\n ) as Array<ReducerIndexedInteractionEntry<Contract>>;\n}\n\nfunction simultaneousSubmitEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n const submit = (phase as { submit?: unknown }).submit;\n if (!submit) return [];\n return [\n [\"submit\", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,\n ];\n}\n\nfunction cardActionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedCardActionEntry<Contract>> {\n return Object.entries(\n (phase as { cardActions?: Record<string, unknown> }).cardActions ?? {},\n ) as Array<ReducerIndexedCardActionEntry<Contract>>;\n}\n\nfunction stageEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedStageEntry<Contract>> {\n return Object.entries(\n (phase as { stages?: Record<string, unknown> }).stages ?? {},\n ) as Array<ReducerIndexedStageEntry<Contract>>;\n}\n\nfunction zoneEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedZoneEntry<Contract>> {\n return Array.from(\n (phase as { zones?: readonly unknown[] }).zones ?? [],\n ) as Array<ReducerIndexedZoneEntry<Contract>>;\n}\n\nfunction effectEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<RawEffectEntry<Contract>> {\n return Object.entries(\n (phase as { effects?: Record<string, unknown> }).effects ?? {},\n ) as Array<RawEffectEntry<Contract>>;\n}\n\nexport function collectReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerDefinitionIndex<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const phaseEntries = phaseEntriesOf(definition);\n const phasesByName = new Map<\n PhaseName,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >();\n\n for (const [phaseName, phase] of phaseEntries) {\n const interactionEntries = [\n ...interactionEntriesOf(phase),\n ...simultaneousSubmitEntriesOf(phase),\n ];\n const cardActionEntries: Array<ReducerIndexedInteractionEntry<Contract>> =\n cardActionEntriesOf(phase).map(([cardActionId, cardAction]) => [\n cardActionId,\n {\n ...cardAction,\n __steps: cardAction.__steps,\n inputs: {\n cardId: cardInput<State>({\n target: cardTarget\n .zones<State>([cardAction.playFrom])\n .where({\n id: \"card-type\",\n errorCode: \"WRONG_CARD_TYPE\",\n message: `Card must be ${cardAction.cardType}.`,\n test: ({ q, targetId }) =>\n q.card.get(targetId).cardType === cardAction.cardType,\n })\n .build(),\n }),\n ...(cardAction.inputs ?? {}),\n },\n } satisfies AnyInteractionSpec<State, Manifest>,\n ]);\n const effects: Array<ReducerIndexedEffectEntry<Contract>> = effectEntriesOf(\n phase,\n ).map(([effectKey, effectValue]) => [\n effectKey,\n {\n id: effectValue.id ?? effectKey,\n type: effectValue.type ?? \"rollDie\",\n continuation: effectValue.__continuation,\n },\n ]);\n\n phasesByName.set(phaseName, {\n phaseName,\n phase,\n interactions: [...interactionEntries, ...cardActionEntries],\n stages: stageEntriesOf(phase),\n zones: zoneEntriesOf(phase),\n cardActions: cardActionEntriesOf(phase),\n effects,\n });\n }\n\n return {\n phaseEntries,\n phasesByName,\n };\n}\n"],"mappings":"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","names":["z","perPlayer","z","board","space","from"]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
type HexColor = string & {
|
|
2
|
-
readonly __brand: "HexColor";
|
|
3
|
-
};
|
|
4
|
-
declare function isHexColor(value: unknown): value is HexColor;
|
|
5
|
-
declare function parseHexColor(value: unknown): HexColor | undefined;
|
|
6
|
-
declare function hexColor(value: string): HexColor;
|
|
7
|
-
|
|
8
|
-
export { type HexColor as H, hexColor as h, isHexColor as i, parseHexColor as p };
|