@dreamboard-games/sdk 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +96 -0
- package/README.md +12 -0
- package/dist/HandView-ncJIVLhN.d.ts +193 -0
- package/dist/ResourceCounter-CTREyF73.d.ts +102 -0
- package/dist/ThemeProvider-fy0_QzgO.d.ts +99 -0
- package/dist/bundle-TIZcw8LB.d.ts +281 -0
- package/dist/cards-Sl3b40Mv.d.ts +13 -0
- package/dist/chunk-7YAHLYBR.js +481 -0
- package/dist/chunk-7YAHLYBR.js.map +1 -0
- package/dist/chunk-FDNZTDD6.js +8085 -0
- package/dist/chunk-FDNZTDD6.js.map +1 -0
- package/dist/chunk-GKKBPPSW.js +598 -0
- package/dist/chunk-GKKBPPSW.js.map +1 -0
- package/dist/chunk-I46YJSOD.js +1 -0
- package/dist/chunk-I46YJSOD.js.map +1 -0
- package/dist/chunk-KAELH4KC.js +104 -0
- package/dist/chunk-KAELH4KC.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-T3ZKNUZ7.js +1 -0
- package/dist/chunk-T3ZKNUZ7.js.map +1 -0
- package/dist/chunk-T52J5RMF.js +1 -0
- package/dist/chunk-T52J5RMF.js.map +1 -0
- package/dist/chunk-TDSWKVZ4.js +5401 -0
- package/dist/chunk-TDSWKVZ4.js.map +1 -0
- package/dist/chunk-U5C6BONG.js +34 -0
- package/dist/chunk-U5C6BONG.js.map +1 -0
- package/dist/chunk-VDXOF4FW.js +69 -0
- package/dist/chunk-VDXOF4FW.js.map +1 -0
- package/dist/chunk-VFTAA4WO.js +115 -0
- package/dist/chunk-VFTAA4WO.js.map +1 -0
- package/dist/chunk-WN74KVNY.js +17 -0
- package/dist/chunk-WN74KVNY.js.map +1 -0
- package/dist/chunk-WYPQ3GG5.js +10990 -0
- package/dist/chunk-WYPQ3GG5.js.map +1 -0
- package/dist/components-D5ZRE2Hl.d.ts +1451 -0
- package/dist/generated/runtime/primitives.d.ts +12 -0
- package/dist/generated/runtime/primitives.js +180 -0
- package/dist/generated/runtime/primitives.js.map +1 -0
- package/dist/generated/runtime-api.d.ts +3 -0
- package/dist/generated/runtime-api.js +2 -0
- package/dist/generated/runtime-api.js.map +1 -0
- package/dist/generated/runtime.d.ts +14 -0
- package/dist/generated/runtime.js +18 -0
- package/dist/generated/runtime.js.map +1 -0
- package/dist/generated/workspace-contract.d.ts +14 -0
- package/dist/generated/workspace-contract.js +14 -0
- package/dist/generated/workspace-contract.js.map +1 -0
- package/dist/hex-board-view-D_07hO6O.d.ts +933 -0
- package/dist/hex-color-MhOyuY-o.d.ts +8 -0
- package/dist/index-BwqPQtBu.d.ts +1433 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/reducer-bundle-abi.d.ts +1083 -0
- package/dist/infrastructure/reducer-bundle-abi.js +14 -0
- package/dist/infrastructure/reducer-bundle-abi.js.map +1 -0
- package/dist/infrastructure/workspace-codegen.d.ts +53 -0
- package/dist/infrastructure/workspace-codegen.js +44 -0
- package/dist/infrastructure/workspace-codegen.js.map +1 -0
- package/dist/manifest-contract-BNHVGFtU.d.ts +9 -0
- package/dist/package-set.d.ts +13 -0
- package/dist/package-set.js +12 -0
- package/dist/package-set.js.map +1 -0
- package/dist/primitive-props-DpKs-GCr.d.ts +11 -0
- package/dist/reducer.d.ts +3786 -0
- package/dist/reducer.js +8131 -0
- package/dist/reducer.js.map +1 -0
- package/dist/runtime/primitives.d.ts +226 -0
- package/dist/runtime/primitives.js +180 -0
- package/dist/runtime/primitives.js.map +1 -0
- package/dist/runtime/types/runtime-api.d.ts +1 -0
- package/dist/runtime/types/runtime-api.js +2 -0
- package/dist/runtime/types/runtime-api.js.map +1 -0
- package/dist/runtime/workspace-contract.d.ts +172 -0
- package/dist/runtime/workspace-contract.js +14 -0
- package/dist/runtime/workspace-contract.js.map +1 -0
- package/dist/runtime-api-3dshj6kK.d.ts +101 -0
- package/dist/runtime-api-DWxvTr-O.d.ts +379 -0
- package/dist/runtime.d.ts +58 -0
- package/dist/runtime.js +13 -0
- package/dist/runtime.js.map +1 -0
- package/dist/slots-1GPGihk8.d.ts +8 -0
- package/dist/testing.d.ts +149 -0
- package/dist/testing.js +513 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +496 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/components.d.ts +16 -0
- package/dist/ui/components.js +192 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/defaults.d.ts +19 -0
- package/dist/ui/defaults.js +104 -0
- package/dist/ui/defaults.js.map +1 -0
- package/dist/ui/plugin-styles.css +250 -0
- package/dist/ui/types/player-state.d.ts +365 -0
- package/dist/ui/types/player-state.js +1 -0
- package/dist/ui/types/player-state.js.map +1 -0
- package/dist/ui-contract-iQfTtUSL.d.ts +1161 -0
- package/dist/ui.d.ts +320 -0
- package/dist/ui.js +253 -0
- package/dist/ui.js.map +1 -0
- package/package.json +199 -0
- package/src/generated/reducer-contract/builders.ts +90 -0
- package/src/generated/reducer-contract/version.ts +9 -0
- package/src/generated/reducer-contract/wire.ts +100 -0
- package/src/generated/reducer-contract/zod.ts +101 -0
- package/src/generated/runtime/primitives.ts +2 -0
- package/src/generated/runtime-api.ts +5 -0
- package/src/generated/runtime.ts +35 -0
- package/src/generated/workspace-contract.ts +2 -0
- package/src/index.ts +7 -0
- package/src/infrastructure/reducer-bundle-abi.ts +8 -0
- package/src/infrastructure/reducer-contract/bundle.ts +37 -0
- package/src/infrastructure/workspace-codegen/hex-geometry.ts +69 -0
- package/src/infrastructure/workspace-codegen/index.ts +64 -0
- package/src/infrastructure/workspace-codegen/manifest-contract.ts +6632 -0
- package/src/infrastructure/workspace-codegen/manifest-validation.ts +795 -0
- package/src/infrastructure/workspace-codegen/ownership.ts +131 -0
- package/src/infrastructure/workspace-codegen/preset-card-sets.ts +169 -0
- package/src/infrastructure/workspace-codegen/seeds.ts +1705 -0
- package/src/infrastructure/workspace-codegen.ts +1 -0
- package/src/package-set.ts +19 -0
- package/src/reducer/authoring/contract.ts +157 -0
- package/src/reducer/authoring/effect.ts +224 -0
- package/src/reducer/authoring/game.ts +23 -0
- package/src/reducer/authoring/interaction.ts +98 -0
- package/src/reducer/authoring/phase.ts +300 -0
- package/src/reducer/authoring/types.ts +70 -0
- package/src/reducer/authoring/validation.ts +382 -0
- package/src/reducer/authoring/view-stage.ts +68 -0
- package/src/reducer/authoring.ts +29 -0
- package/src/reducer/bundle/ingress-bundle.ts +491 -0
- package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +254 -0
- package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +73 -0
- package/src/reducer/bundle/trusted/instruction-runner.ts +414 -0
- package/src/reducer/bundle/trusted/interaction-authorization.ts +137 -0
- package/src/reducer/bundle/trusted/interaction-collectors.ts +859 -0
- package/src/reducer/bundle/trusted/interaction-decision.ts +747 -0
- package/src/reducer/bundle/trusted/interaction-resolver.ts +95 -0
- package/src/reducer/bundle/trusted/interaction-types.ts +171 -0
- package/src/reducer/bundle/trusted/lifecycle-runner.ts +427 -0
- package/src/reducer/bundle/trusted/projection-builder.ts +356 -0
- package/src/reducer/bundle/trusted/projection-context.ts +39 -0
- package/src/reducer/bundle/trusted/rng-sampler.ts +150 -0
- package/src/reducer/bundle/trusted/runtime-registry.ts +120 -0
- package/src/reducer/bundle/trusted/runtime-scope.ts +336 -0
- package/src/reducer/bundle/trusted/simultaneous-player.ts +97 -0
- package/src/reducer/bundle/trusted/stage-resolver.ts +87 -0
- package/src/reducer/bundle/trusted/static-projection.ts +116 -0
- package/src/reducer/bundle/trusted/trusted-runtime-args.ts +97 -0
- package/src/reducer/bundle/trusted/trusted-runtime-result.ts +39 -0
- package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +43 -0
- package/src/reducer/bundle/trusted/trusted-state-codec.ts +48 -0
- package/src/reducer/bundle/trusted-bundle.ts +97 -0
- package/src/reducer/bundle/types.ts +171 -0
- package/src/reducer/bundle.ts +2 -0
- package/src/reducer/client-param-schemas.ts +57 -0
- package/src/reducer/compose.ts +34 -0
- package/src/reducer/core/runtime-input.ts +30 -0
- package/src/reducer/core/runtime-instruction.ts +59 -0
- package/src/reducer/core/types.ts +62 -0
- package/src/reducer/definition-index.ts +277 -0
- package/src/reducer/derived.ts +106 -0
- package/src/reducer/effects.ts +92 -0
- package/src/reducer/engine/runtime-instruction-engine.ts +155 -0
- package/src/reducer/ingress/decode-runtime-input.ts +7 -0
- package/src/reducer/ingress/decode-session-state.ts +9 -0
- package/src/reducer/ingress/encode-session-state.ts +6 -0
- package/src/reducer/ingress/input-codec.ts +18 -0
- package/src/reducer/ingress/phase-schemas.ts +62 -0
- package/src/reducer/ingress/raw-types.ts +107 -0
- package/src/reducer/ingress/runtime-codec.ts +14 -0
- package/src/reducer/ingress/runtime-payload.ts +13 -0
- package/src/reducer/ingress/session-codec.ts +392 -0
- package/src/reducer/ingress/types.ts +6 -0
- package/src/reducer/inputs/boardInput.ts +217 -0
- package/src/reducer/inputs/boardTarget.ts +190 -0
- package/src/reducer/inputs/cardInput.ts +86 -0
- package/src/reducer/inputs/cardTarget.ts +101 -0
- package/src/reducer/inputs/choiceTarget.ts +104 -0
- package/src/reducer/inputs/defineInputs.ts +71 -0
- package/src/reducer/inputs/formInput.ts +809 -0
- package/src/reducer/inputs/many.ts +120 -0
- package/src/reducer/inputs/promptInput.ts +87 -0
- package/src/reducer/inputs/rngInput.ts +58 -0
- package/src/reducer/inputs/targetRule.ts +123 -0
- package/src/reducer/inputs.ts +41 -0
- package/src/reducer/model/definition.ts +1072 -0
- package/src/reducer/model/extract.ts +745 -0
- package/src/reducer/model/manifest.ts +570 -0
- package/src/reducer/model/queries.ts +641 -0
- package/src/reducer/model/runtime.ts +264 -0
- package/src/reducer/model/spec.ts +1386 -0
- package/src/reducer/model/table.ts +260 -0
- package/src/reducer/model.ts +7 -0
- package/src/reducer/ops.ts +1034 -0
- package/src/reducer/parse-utils.ts +28 -0
- package/src/reducer/per-player.ts +422 -0
- package/src/reducer/rng.ts +69 -0
- package/src/reducer/schema-helpers.ts +185 -0
- package/src/reducer/setup-bootstrap-helpers.ts +171 -0
- package/src/reducer/setup-bootstrap.ts +481 -0
- package/src/reducer/table-ops.ts +2671 -0
- package/src/reducer/table-queries.ts +372 -0
- package/src/reducer/transaction.ts +120 -0
- package/src/reducer.ts +314 -0
- package/src/runtime/primitives.ts +1 -0
- package/src/runtime/types/runtime-api.ts +1 -0
- package/src/runtime/workspace-contract.ts +32 -0
- package/src/runtime-internal/components/InteractionForm.tsx +1309 -0
- package/src/runtime-internal/components/PluginRuntime.tsx +103 -0
- package/src/runtime-internal/components/board/target-layer.ts +70 -0
- package/src/runtime-internal/context/ClientParamSchemaContext.tsx +44 -0
- package/src/runtime-internal/context/InteractionDraftContext.tsx +279 -0
- package/src/runtime-internal/context/PluginSessionContext.tsx +47 -0
- package/src/runtime-internal/context/PluginStateContext.tsx +262 -0
- package/src/runtime-internal/context/RuntimeContext.tsx +96 -0
- package/src/runtime-internal/defaults/components.tsx +409 -0
- package/src/runtime-internal/defaults/index.ts +11 -0
- package/src/runtime-internal/errors/ValidationError.ts +29 -0
- package/src/runtime-internal/hooks/useActivePlayers.ts +33 -0
- package/src/runtime-internal/hooks/useBoardInteractions.ts +665 -0
- package/src/runtime-internal/hooks/useGameSelector.ts +105 -0
- package/src/runtime-internal/hooks/useGameView.ts +9 -0
- package/src/runtime-internal/hooks/useInteractionByKey.ts +354 -0
- package/src/runtime-internal/hooks/useInteractionHandle.ts +438 -0
- package/src/runtime-internal/hooks/useIsMyTurn.ts +20 -0
- package/src/runtime-internal/hooks/useLobby.ts +76 -0
- package/src/runtime-internal/hooks/useMe.ts +48 -0
- package/src/runtime-internal/hooks/usePlayerInfo.ts +28 -0
- package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +23 -0
- package/src/runtime-internal/hooks/usePluginRuntime.ts +147 -0
- package/src/runtime-internal/hooks/useSeatInbox.ts +61 -0
- package/src/runtime-internal/hooks/useSimultaneousPhase.ts +10 -0
- package/src/runtime-internal/index.ts +42 -0
- package/src/runtime-internal/internal.ts +43 -0
- package/src/runtime-internal/plugin-styles.css +250 -0
- package/src/runtime-internal/primitives/board.tsx +459 -0
- package/src/runtime-internal/primitives/dialog-lifecycle.ts +58 -0
- package/src/runtime-internal/primitives/dice.tsx +79 -0
- package/src/runtime-internal/primitives/game-ui-provider.tsx +35 -0
- package/src/runtime-internal/primitives/game.tsx +387 -0
- package/src/runtime-internal/primitives/hand-intent-adapter.ts +147 -0
- package/src/runtime-internal/primitives/hand-surface.tsx +594 -0
- package/src/runtime-internal/primitives/index.ts +196 -0
- package/src/runtime-internal/primitives/interaction-form-binding.tsx +56 -0
- package/src/runtime-internal/primitives/interaction-submit.ts +90 -0
- package/src/runtime-internal/primitives/interaction.tsx +987 -0
- package/src/runtime-internal/primitives/phase.tsx +43 -0
- package/src/runtime-internal/primitives/player-roster.tsx +302 -0
- package/src/runtime-internal/primitives/primitive-props.tsx +101 -0
- package/src/runtime-internal/primitives/prompt.tsx +255 -0
- package/src/runtime-internal/primitives/ui.tsx +60 -0
- package/src/runtime-internal/primitives/zone.tsx +791 -0
- package/src/runtime-internal/reducer.ts +30 -0
- package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +605 -0
- package/src/runtime-internal/types/plugin-state.ts +508 -0
- package/src/runtime-internal/types/reducer-state.ts +24 -0
- package/src/runtime-internal/types/runtime-api.ts +114 -0
- package/src/runtime-internal/ui-contract.ts +519 -0
- package/src/runtime-internal/utils/card-intent-adapter.ts +546 -0
- package/src/runtime-internal/utils/interaction-inputs.ts +492 -0
- package/src/runtime-internal/utils/interaction-labels.ts +23 -0
- package/src/runtime-internal/utils/interaction-router.ts +273 -0
- package/src/runtime-internal/utils/interaction-status.ts +74 -0
- package/src/runtime-internal/workspace-contract.ts +1170 -0
- package/src/runtime.ts +34 -0
- package/src/testing/create-expect-api.ts +352 -0
- package/src/testing/create-test-runtime.ts +381 -0
- package/src/testing/definitions.ts +127 -0
- package/src/testing/index.ts +3 -0
- package/src/testing.ts +1 -0
- package/src/type-stubs/manifest-contract.d.ts +42 -0
- package/src/type-stubs/manifest-contract.js +72 -0
- package/src/type-stubs/ui-contract.d.ts +5 -0
- package/src/type-stubs/ui-contract.js +1 -0
- package/src/types/authoring-card-properties.type-test.ts +266 -0
- package/src/types/authoring.ts +1282 -0
- package/src/types/cards.ts +19 -0
- package/src/types/contracts.ts +1550 -0
- package/src/types/generated-helpers.ts +35 -0
- package/src/types/index.ts +147 -0
- package/src/types/slots.ts +11 -0
- package/src/types.ts +1 -0
- package/src/ui/components/ActionButton.tsx +97 -0
- package/src/ui/components/ActionPanel.tsx +315 -0
- package/src/ui/components/Card.tsx +378 -0
- package/src/ui/components/CardDragSurface.tsx +1076 -0
- package/src/ui/components/ChromeSuppressionContext.tsx +70 -0
- package/src/ui/components/CostDisplay.tsx +145 -0
- package/src/ui/components/DiceRoller.tsx +581 -0
- package/src/ui/components/Drawer.tsx +180 -0
- package/src/ui/components/ErrorBoundary.tsx +275 -0
- package/src/ui/components/GameEndDisplay.tsx +398 -0
- package/src/ui/components/GameSkeleton.tsx +260 -0
- package/src/ui/components/Hand.tsx +468 -0
- package/src/ui/components/HandDock.tsx +299 -0
- package/src/ui/components/HandView.tsx +441 -0
- package/src/ui/components/MobileHandTray.tsx +381 -0
- package/src/ui/components/MoreActions.tsx +143 -0
- package/src/ui/components/PhaseIndicator.tsx +341 -0
- package/src/ui/components/PlayArea.tsx +146 -0
- package/src/ui/components/PrimaryActionButton.tsx +336 -0
- package/src/ui/components/PrimaryButton.tsx +45 -0
- package/src/ui/components/ResourceCounter.tsx +270 -0
- package/src/ui/components/StagingZone.tsx +134 -0
- package/src/ui/components/ThemedButton.tsx +113 -0
- package/src/ui/components/Toast.tsx +264 -0
- package/src/ui/components/board/HexGrid.tsx +1294 -0
- package/src/ui/components/board/NetworkGraph.tsx +476 -0
- package/src/ui/components/board/SlotSystem.tsx +388 -0
- package/src/ui/components/board/SquareGrid.tsx +1165 -0
- package/src/ui/components/board/TrackBoard.tsx +496 -0
- package/src/ui/components/board/ZoneMap.tsx +448 -0
- package/src/ui/components/board/hex-board-view.ts +123 -0
- package/src/ui/components/board/index.ts +142 -0
- package/src/ui/components/board/interaction-accessibility.ts +21 -0
- package/src/ui/components/board/target-layer.ts +66 -0
- package/src/ui/components/card-render-content.type-test.ts +27 -0
- package/src/ui/components/hand-layout-math.ts +163 -0
- package/src/ui/components/hand-pointer-engine.ts +413 -0
- package/src/ui/components/index.ts +245 -0
- package/src/ui/components.ts +1 -0
- package/src/ui/defaults/components.tsx +106 -0
- package/src/ui/defaults/index.ts +8 -0
- package/src/ui/defaults.ts +1 -0
- package/src/ui/errors/ValidationError.ts +29 -0
- package/src/ui/helpers/cards.ts +19 -0
- package/src/ui/helpers/track-board.ts +211 -0
- package/src/ui/hooks/useBoardTopology.ts +316 -0
- package/src/ui/hooks/useCards.ts +10 -0
- package/src/ui/hooks/useHandCardPointer.ts +381 -0
- package/src/ui/hooks/useHandLayout.ts +378 -0
- package/src/ui/hooks/useHandPresentation.ts +121 -0
- package/src/ui/hooks/useHexBoard.ts +74 -0
- package/src/ui/hooks/useHexGrid.ts +185 -0
- package/src/ui/hooks/useIsMobile.ts +35 -0
- package/src/ui/hooks/usePanZoom.ts +278 -0
- package/src/ui/hooks/useSquareBoard.ts +124 -0
- package/src/ui/hooks/useSquareGrid.ts +328 -0
- package/src/ui/index.ts +98 -0
- package/src/ui/internal/ui/alert.tsx +51 -0
- package/src/ui/internal/ui/button.tsx +58 -0
- package/src/ui/internal/ui/dialog.tsx +134 -0
- package/src/ui/internal/ui/input.tsx +21 -0
- package/src/ui/internal/ui/label.tsx +21 -0
- package/src/ui/internal/ui/select.tsx +129 -0
- package/src/ui/internal/ui/tooltip.tsx +54 -0
- package/src/ui/internal/ui/utils.ts +5 -0
- package/src/ui/plugin-styles.css +250 -0
- package/src/ui/primitives/dialog-lifecycle.ts +58 -0
- package/src/ui/primitives/dice.tsx +79 -0
- package/src/ui/primitives/primitive-props.tsx +101 -0
- package/src/ui/theme/ThemeProvider.tsx +252 -0
- package/src/ui/theme/board.ts +61 -0
- package/src/ui/theme/css-vars.ts +105 -0
- package/src/ui/theme/derive.ts +240 -0
- package/src/ui/theme/index.ts +61 -0
- package/src/ui/theme/presets/arcade.ts +261 -0
- package/src/ui/theme/presets/studio.ts +261 -0
- package/src/ui/theme/presets/tabletop.ts +266 -0
- package/src/ui/theme/tokens.ts +392 -0
- package/src/ui/types/hex-color.ts +20 -0
- package/src/ui/types/player-state.ts +463 -0
- package/src/ui/types/tiled-board.ts +785 -0
- package/src/ui/types/visual-state.ts +137 -0
- package/src/ui.ts +1 -0
|
@@ -0,0 +1,1550 @@
|
|
|
1
|
+
// Public SDK contract DTOs extracted from Dreamboard's public API schema.
|
|
2
|
+
// This package owns these types for SDK consumers; backend API clients are published separately.
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Supported player-count metadata for the game
|
|
6
|
+
*/
|
|
7
|
+
export type PlayersDefinition = {
|
|
8
|
+
minPlayers: number;
|
|
9
|
+
maxPlayers: number;
|
|
10
|
+
optimalPlayers?: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type PresetCardSetDefinition = {
|
|
14
|
+
/**
|
|
15
|
+
* Unique local identifier for the authored card set
|
|
16
|
+
*/
|
|
17
|
+
id: string;
|
|
18
|
+
/**
|
|
19
|
+
* Built-in preset card-set selector
|
|
20
|
+
*/
|
|
21
|
+
presetId: string;
|
|
22
|
+
/**
|
|
23
|
+
* Display name of the card set
|
|
24
|
+
*/
|
|
25
|
+
name: string;
|
|
26
|
+
/**
|
|
27
|
+
* Type of card set source
|
|
28
|
+
*/
|
|
29
|
+
type: 'preset';
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Arbitrary authored JSON value.
|
|
34
|
+
*/
|
|
35
|
+
export type JsonValue = string | number | boolean | null | Array<JsonValue> | {
|
|
36
|
+
[key: string]: JsonValue;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type PropertySchema = {
|
|
40
|
+
/**
|
|
41
|
+
* The data type of the property.
|
|
42
|
+
*/
|
|
43
|
+
type: 'string' | 'integer' | 'number' | 'boolean' | 'zoneId' | 'cardId' | 'playerId' | 'boardId' | 'edgeId' | 'vertexId' | 'spaceId' | 'pieceId' | 'dieId' | 'resourceId' | 'array' | 'object' | 'record' | 'enum';
|
|
44
|
+
/**
|
|
45
|
+
* Optional description of the property's purpose and usage.
|
|
46
|
+
*/
|
|
47
|
+
description?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Whether an object property may be omitted.
|
|
50
|
+
*/
|
|
51
|
+
optional?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Whether the value may be null.
|
|
54
|
+
*/
|
|
55
|
+
nullable?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Optional authored default value for this property. When present, omitted
|
|
58
|
+
* seed values materialize to the default and generated TypeScript treats
|
|
59
|
+
* the property as present even if `optional: true` is also set.
|
|
60
|
+
*
|
|
61
|
+
*/
|
|
62
|
+
default?: JsonValue;
|
|
63
|
+
/**
|
|
64
|
+
* For array types, the schema of the array items. Required if type is 'array'.
|
|
65
|
+
*/
|
|
66
|
+
items?: PropertySchema;
|
|
67
|
+
/**
|
|
68
|
+
* For object types, the schema of the object's properties. Required if type is 'object'.
|
|
69
|
+
*/
|
|
70
|
+
properties?: {
|
|
71
|
+
[key: string]: PropertySchema;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* For enum types, the list of allowed string values. Required if type is 'enum'.
|
|
75
|
+
*/
|
|
76
|
+
enums?: Array<string>;
|
|
77
|
+
/**
|
|
78
|
+
* For record types, the schema of the record's values. Required if type is 'record'.
|
|
79
|
+
*/
|
|
80
|
+
values?: PropertySchema;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export type ObjectSchema = {
|
|
84
|
+
/**
|
|
85
|
+
* Map of property names to their schemas. Type is always 'object' and all properties are required.
|
|
86
|
+
*/
|
|
87
|
+
properties: {
|
|
88
|
+
[key: string]: PropertySchema;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export type CardPropertySchemaVariants = {
|
|
93
|
+
/**
|
|
94
|
+
* Property schemas present on every card-type variant.
|
|
95
|
+
*/
|
|
96
|
+
shared?: {
|
|
97
|
+
[key: string]: PropertySchema;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Property schema for each card type in this manual card set.
|
|
101
|
+
*/
|
|
102
|
+
variants: {
|
|
103
|
+
[key: string]: ObjectSchema;
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export type CardPropertySchema = ObjectSchema | CardPropertySchemaVariants;
|
|
108
|
+
|
|
109
|
+
export type DetachedHomeSpec = {
|
|
110
|
+
type: 'detached';
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export type ZoneHomeSpec = {
|
|
114
|
+
type: 'zone';
|
|
115
|
+
zoneId: string;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export type SpaceHomeSpec = {
|
|
119
|
+
type: 'space';
|
|
120
|
+
boardId: string;
|
|
121
|
+
spaceId: string;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export type ContainerHomeSpec = {
|
|
125
|
+
type: 'container';
|
|
126
|
+
boardId: string;
|
|
127
|
+
containerId: string;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Tiled board edge identified by the spaces that border it
|
|
132
|
+
*/
|
|
133
|
+
export type BoardEdgeRef = {
|
|
134
|
+
spaces: Array<string>;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export type EdgeHomeSpec = {
|
|
138
|
+
type: 'edge';
|
|
139
|
+
boardId: string;
|
|
140
|
+
ref: BoardEdgeRef;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Tiled board vertex identified by the spaces that touch it
|
|
145
|
+
*/
|
|
146
|
+
export type BoardVertexRef = {
|
|
147
|
+
spaces: Array<string>;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
export type VertexHomeSpec = {
|
|
151
|
+
type: 'vertex';
|
|
152
|
+
boardId: string;
|
|
153
|
+
ref: BoardVertexRef;
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
export type PieceSlotHostRef = {
|
|
157
|
+
kind: 'piece';
|
|
158
|
+
id: string;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export type DieSlotHostRef = {
|
|
162
|
+
kind: 'die';
|
|
163
|
+
id: string;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
export type SlotHostRef = ({
|
|
167
|
+
kind: 'piece';
|
|
168
|
+
} & PieceSlotHostRef) | ({
|
|
169
|
+
kind: 'die';
|
|
170
|
+
} & DieSlotHostRef);
|
|
171
|
+
|
|
172
|
+
export type SlotHomeSpec = {
|
|
173
|
+
type: 'slot';
|
|
174
|
+
host: SlotHostRef;
|
|
175
|
+
slotId: string;
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
export type ComponentHomeSpec = ({
|
|
179
|
+
type: 'detached';
|
|
180
|
+
} & DetachedHomeSpec) | ({
|
|
181
|
+
type: 'zone';
|
|
182
|
+
} & ZoneHomeSpec) | ({
|
|
183
|
+
type: 'space';
|
|
184
|
+
} & SpaceHomeSpec) | ({
|
|
185
|
+
type: 'container';
|
|
186
|
+
} & ContainerHomeSpec) | ({
|
|
187
|
+
type: 'edge';
|
|
188
|
+
} & EdgeHomeSpec) | ({
|
|
189
|
+
type: 'vertex';
|
|
190
|
+
} & VertexHomeSpec) | ({
|
|
191
|
+
type: 'slot';
|
|
192
|
+
} & SlotHomeSpec);
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Default authored visibility for a component instance
|
|
196
|
+
*/
|
|
197
|
+
export type ComponentVisibilitySpec = {
|
|
198
|
+
faceUp?: boolean;
|
|
199
|
+
/**
|
|
200
|
+
* When omitted, visible to all players
|
|
201
|
+
*/
|
|
202
|
+
visibleTo?: Array<string>;
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export type BoardCard = {
|
|
206
|
+
/**
|
|
207
|
+
* Card type identifier used to generate runtime CardIds. When count > 1, runtime IDs are generated as '{type}-1', '{type}-2', etc.
|
|
208
|
+
*/
|
|
209
|
+
type: string;
|
|
210
|
+
/**
|
|
211
|
+
* Display name of the card
|
|
212
|
+
*/
|
|
213
|
+
name: string;
|
|
214
|
+
/**
|
|
215
|
+
* URL to the card's image
|
|
216
|
+
*/
|
|
217
|
+
imageUrl?: string;
|
|
218
|
+
/**
|
|
219
|
+
* Text content on the card
|
|
220
|
+
*/
|
|
221
|
+
text?: string;
|
|
222
|
+
/**
|
|
223
|
+
* Number of copies of this card
|
|
224
|
+
*/
|
|
225
|
+
count: number;
|
|
226
|
+
/**
|
|
227
|
+
* Optional authored card category or subtype identifier
|
|
228
|
+
*/
|
|
229
|
+
cardType?: string;
|
|
230
|
+
/**
|
|
231
|
+
* Optional authored home for this card inventory. When omitted, cards start detached until reducer setup places them.
|
|
232
|
+
*/
|
|
233
|
+
home?: ComponentHomeSpec;
|
|
234
|
+
/**
|
|
235
|
+
* Default authored visibility for the card inventory
|
|
236
|
+
*/
|
|
237
|
+
visibility?: ComponentVisibilitySpec;
|
|
238
|
+
/**
|
|
239
|
+
* Actual property values for this specific card instance. Keys must match the properties defined in the referenced cardSchema.
|
|
240
|
+
*/
|
|
241
|
+
properties: {
|
|
242
|
+
[key: string]: JsonValue;
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
export type ManualCardSetDefinition = {
|
|
247
|
+
/**
|
|
248
|
+
* Unique identifier for the card set
|
|
249
|
+
*/
|
|
250
|
+
id: string;
|
|
251
|
+
/**
|
|
252
|
+
* Display name of the card set
|
|
253
|
+
*/
|
|
254
|
+
name: string;
|
|
255
|
+
/**
|
|
256
|
+
* Type of card set source
|
|
257
|
+
*/
|
|
258
|
+
type: 'manual';
|
|
259
|
+
/**
|
|
260
|
+
* Schema definition for authored card properties in this card set
|
|
261
|
+
*/
|
|
262
|
+
cardSchema: CardPropertySchema;
|
|
263
|
+
/**
|
|
264
|
+
* List of authored cards in this card set
|
|
265
|
+
*/
|
|
266
|
+
cards: Array<BoardCard>;
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
export type CardSetDefinition = ({
|
|
270
|
+
type: 'preset';
|
|
271
|
+
} & PresetCardSetDefinition) | ({
|
|
272
|
+
type: 'manual';
|
|
273
|
+
} & ManualCardSetDefinition);
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Whether authored topology exists once for the table or once per player
|
|
277
|
+
*/
|
|
278
|
+
export type TopologyScope = 'shared' | 'perPlayer';
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Default topology visibility for a zone or slot
|
|
282
|
+
*/
|
|
283
|
+
export type ZoneVisibility = 'ownerOnly' | 'public' | 'hidden';
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Generic authored container that can hold cards, pieces, or dice
|
|
287
|
+
*/
|
|
288
|
+
export type ZoneSpec = {
|
|
289
|
+
/**
|
|
290
|
+
* Stable zone identifier
|
|
291
|
+
*/
|
|
292
|
+
id: string;
|
|
293
|
+
/**
|
|
294
|
+
* Display name for the zone
|
|
295
|
+
*/
|
|
296
|
+
name: string;
|
|
297
|
+
scope: TopologyScope;
|
|
298
|
+
/**
|
|
299
|
+
* Optional card-set restriction for this zone
|
|
300
|
+
*/
|
|
301
|
+
allowedCardSetIds?: Array<string>;
|
|
302
|
+
visibility?: ZoneVisibility;
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* Stable authored board space or slot anchor
|
|
307
|
+
*/
|
|
308
|
+
export type BoardSpaceSpec = {
|
|
309
|
+
/**
|
|
310
|
+
* Stable space identifier local to the board
|
|
311
|
+
*/
|
|
312
|
+
id: string;
|
|
313
|
+
/**
|
|
314
|
+
* Human-readable space name
|
|
315
|
+
*/
|
|
316
|
+
name?: string;
|
|
317
|
+
/**
|
|
318
|
+
* Optional authored space type identifier
|
|
319
|
+
*/
|
|
320
|
+
typeId?: string;
|
|
321
|
+
/**
|
|
322
|
+
* Typed authored fields validated against the board's spaceFieldsSchema
|
|
323
|
+
*/
|
|
324
|
+
fields?: {
|
|
325
|
+
[key: string]: JsonValue;
|
|
326
|
+
};
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Named relation between two authored spaces
|
|
331
|
+
*/
|
|
332
|
+
export type BoardRelationSpec = {
|
|
333
|
+
/**
|
|
334
|
+
* Optional stable relation identifier
|
|
335
|
+
*/
|
|
336
|
+
id?: string;
|
|
337
|
+
/**
|
|
338
|
+
* Relation type identifier such as adjacent, covers, blocks, or linked
|
|
339
|
+
*/
|
|
340
|
+
typeId: string;
|
|
341
|
+
fromSpaceId: string;
|
|
342
|
+
toSpaceId: string;
|
|
343
|
+
directed?: boolean;
|
|
344
|
+
/**
|
|
345
|
+
* Typed authored relation fields validated against relationFieldsSchema
|
|
346
|
+
*/
|
|
347
|
+
fields?: {
|
|
348
|
+
[key: string]: JsonValue;
|
|
349
|
+
};
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
export type BoardHostSpec = {
|
|
353
|
+
type: 'board';
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
export type SpaceHostSpec = {
|
|
357
|
+
type: 'space';
|
|
358
|
+
spaceId: string;
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
export type BoardContainerHostSpec = ({
|
|
362
|
+
type: 'board';
|
|
363
|
+
} & BoardHostSpec) | ({
|
|
364
|
+
type: 'space';
|
|
365
|
+
} & SpaceHostSpec);
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Authored board-attached or space-attached container/slot
|
|
369
|
+
*/
|
|
370
|
+
export type BoardContainerSpec = {
|
|
371
|
+
/**
|
|
372
|
+
* Stable container identifier local to the board
|
|
373
|
+
*/
|
|
374
|
+
id: string;
|
|
375
|
+
/**
|
|
376
|
+
* Display name for the container
|
|
377
|
+
*/
|
|
378
|
+
name: string;
|
|
379
|
+
host: BoardContainerHostSpec;
|
|
380
|
+
allowedCardSetIds?: Array<string>;
|
|
381
|
+
/**
|
|
382
|
+
* Typed authored container fields validated against containerFieldsSchema
|
|
383
|
+
*/
|
|
384
|
+
fields?: {
|
|
385
|
+
[key: string]: JsonValue;
|
|
386
|
+
};
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Reusable authored board topology template
|
|
391
|
+
*/
|
|
392
|
+
export type GenericBoardTemplateSpec = {
|
|
393
|
+
/**
|
|
394
|
+
* Stable template identifier
|
|
395
|
+
*/
|
|
396
|
+
id: string;
|
|
397
|
+
name: string;
|
|
398
|
+
layout: 'generic';
|
|
399
|
+
/**
|
|
400
|
+
* Optional authored board type identifier such as track, map, tableau, or grid
|
|
401
|
+
*/
|
|
402
|
+
typeId?: string;
|
|
403
|
+
boardFieldsSchema?: ObjectSchema;
|
|
404
|
+
spaceFieldsSchema?: ObjectSchema;
|
|
405
|
+
relationFieldsSchema?: ObjectSchema;
|
|
406
|
+
containerFieldsSchema?: ObjectSchema;
|
|
407
|
+
spaces?: Array<BoardSpaceSpec>;
|
|
408
|
+
relations?: Array<BoardRelationSpec>;
|
|
409
|
+
containers?: Array<BoardContainerSpec>;
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Visual orientation for authored hex coordinates
|
|
414
|
+
*/
|
|
415
|
+
export type HexOrientation = 'pointy-top' | 'flat-top';
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* One authored hex space in axial coordinates
|
|
419
|
+
*/
|
|
420
|
+
export type HexSpaceSpec = {
|
|
421
|
+
/**
|
|
422
|
+
* Stable space identifier local to the board
|
|
423
|
+
*/
|
|
424
|
+
id: string;
|
|
425
|
+
/**
|
|
426
|
+
* Axial q coordinate
|
|
427
|
+
*/
|
|
428
|
+
q: number;
|
|
429
|
+
/**
|
|
430
|
+
* Axial r coordinate
|
|
431
|
+
*/
|
|
432
|
+
r: number;
|
|
433
|
+
/**
|
|
434
|
+
* Optional authored space type identifier
|
|
435
|
+
*/
|
|
436
|
+
typeId?: string;
|
|
437
|
+
/**
|
|
438
|
+
* Optional hex-space label for setup or rendering
|
|
439
|
+
*/
|
|
440
|
+
label?: string;
|
|
441
|
+
/**
|
|
442
|
+
* Typed authored fields validated against the board's spaceFieldsSchema
|
|
443
|
+
*/
|
|
444
|
+
fields?: {
|
|
445
|
+
[key: string]: JsonValue;
|
|
446
|
+
};
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Hex edge identified by two adjacent hex spaces
|
|
451
|
+
*/
|
|
452
|
+
export type HexEdgeRef = {
|
|
453
|
+
spaces: [
|
|
454
|
+
string,
|
|
455
|
+
string
|
|
456
|
+
];
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Authored metadata attached to one derived hex edge
|
|
461
|
+
*/
|
|
462
|
+
export type HexEdgeSpec = {
|
|
463
|
+
ref: HexEdgeRef;
|
|
464
|
+
/**
|
|
465
|
+
* Optional authored edge type identifier
|
|
466
|
+
*/
|
|
467
|
+
typeId?: string;
|
|
468
|
+
/**
|
|
469
|
+
* Optional edge label for setup or rendering
|
|
470
|
+
*/
|
|
471
|
+
label?: string;
|
|
472
|
+
tags?: Array<string>;
|
|
473
|
+
/**
|
|
474
|
+
* Typed authored edge fields validated against edgeFieldsSchema
|
|
475
|
+
*/
|
|
476
|
+
fields?: {
|
|
477
|
+
[key: string]: JsonValue;
|
|
478
|
+
};
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Hex vertex identified by three touching hex spaces
|
|
483
|
+
*/
|
|
484
|
+
export type HexVertexRef = {
|
|
485
|
+
spaces: [
|
|
486
|
+
string,
|
|
487
|
+
string,
|
|
488
|
+
string
|
|
489
|
+
];
|
|
490
|
+
};
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Authored metadata attached to one derived hex vertex
|
|
494
|
+
*/
|
|
495
|
+
export type HexVertexSpec = {
|
|
496
|
+
ref: HexVertexRef;
|
|
497
|
+
/**
|
|
498
|
+
* Optional authored vertex type identifier
|
|
499
|
+
*/
|
|
500
|
+
typeId?: string;
|
|
501
|
+
/**
|
|
502
|
+
* Optional vertex label for setup or rendering
|
|
503
|
+
*/
|
|
504
|
+
label?: string;
|
|
505
|
+
tags?: Array<string>;
|
|
506
|
+
/**
|
|
507
|
+
* Typed authored vertex fields validated against vertexFieldsSchema
|
|
508
|
+
*/
|
|
509
|
+
fields?: {
|
|
510
|
+
[key: string]: JsonValue;
|
|
511
|
+
};
|
|
512
|
+
};
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Reusable authored hex board topology template
|
|
516
|
+
*/
|
|
517
|
+
export type HexBoardTemplateSpec = {
|
|
518
|
+
/**
|
|
519
|
+
* Stable template identifier
|
|
520
|
+
*/
|
|
521
|
+
id: string;
|
|
522
|
+
name: string;
|
|
523
|
+
layout: 'hex';
|
|
524
|
+
/**
|
|
525
|
+
* Optional authored board type identifier
|
|
526
|
+
*/
|
|
527
|
+
typeId?: string;
|
|
528
|
+
orientation?: HexOrientation;
|
|
529
|
+
boardFieldsSchema?: ObjectSchema;
|
|
530
|
+
spaceFieldsSchema?: ObjectSchema;
|
|
531
|
+
edgeFieldsSchema?: ObjectSchema;
|
|
532
|
+
vertexFieldsSchema?: ObjectSchema;
|
|
533
|
+
spaces?: Array<HexSpaceSpec>;
|
|
534
|
+
edges?: Array<HexEdgeSpec>;
|
|
535
|
+
vertices?: Array<HexVertexSpec>;
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* One authored square space in row/column coordinates
|
|
540
|
+
*/
|
|
541
|
+
export type SquareSpaceSpec = {
|
|
542
|
+
/**
|
|
543
|
+
* Stable space identifier local to the board
|
|
544
|
+
*/
|
|
545
|
+
id: string;
|
|
546
|
+
/**
|
|
547
|
+
* Zero-based row coordinate
|
|
548
|
+
*/
|
|
549
|
+
row: number;
|
|
550
|
+
/**
|
|
551
|
+
* Zero-based column coordinate
|
|
552
|
+
*/
|
|
553
|
+
col: number;
|
|
554
|
+
/**
|
|
555
|
+
* Optional authored space type identifier
|
|
556
|
+
*/
|
|
557
|
+
typeId?: string;
|
|
558
|
+
/**
|
|
559
|
+
* Optional square-space label for setup or rendering
|
|
560
|
+
*/
|
|
561
|
+
label?: string;
|
|
562
|
+
/**
|
|
563
|
+
* Typed authored fields validated against the board's spaceFieldsSchema
|
|
564
|
+
*/
|
|
565
|
+
fields?: {
|
|
566
|
+
[key: string]: JsonValue;
|
|
567
|
+
};
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Authored metadata attached to one derived square edge
|
|
572
|
+
*/
|
|
573
|
+
export type SquareEdgeSpec = {
|
|
574
|
+
ref: BoardEdgeRef;
|
|
575
|
+
/**
|
|
576
|
+
* Optional authored edge type identifier
|
|
577
|
+
*/
|
|
578
|
+
typeId?: string;
|
|
579
|
+
/**
|
|
580
|
+
* Optional edge label for setup or rendering
|
|
581
|
+
*/
|
|
582
|
+
label?: string;
|
|
583
|
+
tags?: Array<string>;
|
|
584
|
+
/**
|
|
585
|
+
* Typed authored edge fields validated against edgeFieldsSchema
|
|
586
|
+
*/
|
|
587
|
+
fields?: {
|
|
588
|
+
[key: string]: JsonValue;
|
|
589
|
+
};
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Authored metadata attached to one derived square vertex
|
|
594
|
+
*/
|
|
595
|
+
export type SquareVertexSpec = {
|
|
596
|
+
ref: BoardVertexRef;
|
|
597
|
+
/**
|
|
598
|
+
* Optional authored vertex type identifier
|
|
599
|
+
*/
|
|
600
|
+
typeId?: string;
|
|
601
|
+
/**
|
|
602
|
+
* Optional vertex label for setup or rendering
|
|
603
|
+
*/
|
|
604
|
+
label?: string;
|
|
605
|
+
tags?: Array<string>;
|
|
606
|
+
/**
|
|
607
|
+
* Typed authored vertex fields validated against vertexFieldsSchema
|
|
608
|
+
*/
|
|
609
|
+
fields?: {
|
|
610
|
+
[key: string]: JsonValue;
|
|
611
|
+
};
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Reusable authored square board topology template
|
|
616
|
+
*/
|
|
617
|
+
export type SquareBoardTemplateSpec = {
|
|
618
|
+
/**
|
|
619
|
+
* Stable template identifier
|
|
620
|
+
*/
|
|
621
|
+
id: string;
|
|
622
|
+
name: string;
|
|
623
|
+
layout: 'square';
|
|
624
|
+
/**
|
|
625
|
+
* Optional authored board type identifier
|
|
626
|
+
*/
|
|
627
|
+
typeId?: string;
|
|
628
|
+
boardFieldsSchema?: ObjectSchema;
|
|
629
|
+
spaceFieldsSchema?: ObjectSchema;
|
|
630
|
+
relationFieldsSchema?: ObjectSchema;
|
|
631
|
+
containerFieldsSchema?: ObjectSchema;
|
|
632
|
+
edgeFieldsSchema?: ObjectSchema;
|
|
633
|
+
vertexFieldsSchema?: ObjectSchema;
|
|
634
|
+
spaces?: Array<SquareSpaceSpec>;
|
|
635
|
+
relations?: Array<BoardRelationSpec>;
|
|
636
|
+
containers?: Array<BoardContainerSpec>;
|
|
637
|
+
edges?: Array<SquareEdgeSpec>;
|
|
638
|
+
vertices?: Array<SquareVertexSpec>;
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
export type BoardTemplateSpec = ({
|
|
642
|
+
layout: 'generic';
|
|
643
|
+
} & GenericBoardTemplateSpec) | ({
|
|
644
|
+
layout: 'hex';
|
|
645
|
+
} & HexBoardTemplateSpec) | ({
|
|
646
|
+
layout: 'square';
|
|
647
|
+
} & SquareBoardTemplateSpec);
|
|
648
|
+
|
|
649
|
+
/**
|
|
650
|
+
* Shared or per-player authored board instance shell
|
|
651
|
+
*/
|
|
652
|
+
export type GenericBoardSpec = {
|
|
653
|
+
/**
|
|
654
|
+
* Stable board identifier
|
|
655
|
+
*/
|
|
656
|
+
id: string;
|
|
657
|
+
name: string;
|
|
658
|
+
layout: 'generic';
|
|
659
|
+
/**
|
|
660
|
+
* Optional authored board type identifier such as track, map, tableau, or grid
|
|
661
|
+
*/
|
|
662
|
+
typeId?: string;
|
|
663
|
+
scope: TopologyScope;
|
|
664
|
+
/**
|
|
665
|
+
* Optional board template to clone before applying inline authored additions
|
|
666
|
+
*/
|
|
667
|
+
templateId?: string;
|
|
668
|
+
boardFieldsSchema?: ObjectSchema;
|
|
669
|
+
spaceFieldsSchema?: ObjectSchema;
|
|
670
|
+
relationFieldsSchema?: ObjectSchema;
|
|
671
|
+
containerFieldsSchema?: ObjectSchema;
|
|
672
|
+
/**
|
|
673
|
+
* Typed authored board fields validated against boardFieldsSchema
|
|
674
|
+
*/
|
|
675
|
+
fields?: {
|
|
676
|
+
[key: string]: JsonValue;
|
|
677
|
+
};
|
|
678
|
+
spaces?: Array<BoardSpaceSpec>;
|
|
679
|
+
relations?: Array<BoardRelationSpec>;
|
|
680
|
+
containers?: Array<BoardContainerSpec>;
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* Shared or per-player authored hex board instance shell
|
|
685
|
+
*/
|
|
686
|
+
export type HexBoardSpec = {
|
|
687
|
+
/**
|
|
688
|
+
* Stable board identifier
|
|
689
|
+
*/
|
|
690
|
+
id: string;
|
|
691
|
+
name: string;
|
|
692
|
+
layout: 'hex';
|
|
693
|
+
/**
|
|
694
|
+
* Optional authored board type identifier
|
|
695
|
+
*/
|
|
696
|
+
typeId?: string;
|
|
697
|
+
scope: TopologyScope;
|
|
698
|
+
/**
|
|
699
|
+
* Optional hex board template to clone before applying inline authored additions
|
|
700
|
+
*/
|
|
701
|
+
templateId?: string;
|
|
702
|
+
orientation?: HexOrientation;
|
|
703
|
+
boardFieldsSchema?: ObjectSchema;
|
|
704
|
+
spaceFieldsSchema?: ObjectSchema;
|
|
705
|
+
edgeFieldsSchema?: ObjectSchema;
|
|
706
|
+
vertexFieldsSchema?: ObjectSchema;
|
|
707
|
+
/**
|
|
708
|
+
* Typed authored board fields validated against boardFieldsSchema
|
|
709
|
+
*/
|
|
710
|
+
fields?: {
|
|
711
|
+
[key: string]: JsonValue;
|
|
712
|
+
};
|
|
713
|
+
spaces?: Array<HexSpaceSpec>;
|
|
714
|
+
edges?: Array<HexEdgeSpec>;
|
|
715
|
+
vertices?: Array<HexVertexSpec>;
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
/**
|
|
719
|
+
* Shared or per-player authored square board instance shell
|
|
720
|
+
*/
|
|
721
|
+
export type SquareBoardSpec = {
|
|
722
|
+
/**
|
|
723
|
+
* Stable board identifier
|
|
724
|
+
*/
|
|
725
|
+
id: string;
|
|
726
|
+
name: string;
|
|
727
|
+
layout: 'square';
|
|
728
|
+
/**
|
|
729
|
+
* Optional authored board type identifier
|
|
730
|
+
*/
|
|
731
|
+
typeId?: string;
|
|
732
|
+
scope: TopologyScope;
|
|
733
|
+
/**
|
|
734
|
+
* Optional square board template to clone before applying inline authored additions
|
|
735
|
+
*/
|
|
736
|
+
templateId?: string;
|
|
737
|
+
boardFieldsSchema?: ObjectSchema;
|
|
738
|
+
spaceFieldsSchema?: ObjectSchema;
|
|
739
|
+
relationFieldsSchema?: ObjectSchema;
|
|
740
|
+
containerFieldsSchema?: ObjectSchema;
|
|
741
|
+
edgeFieldsSchema?: ObjectSchema;
|
|
742
|
+
vertexFieldsSchema?: ObjectSchema;
|
|
743
|
+
/**
|
|
744
|
+
* Typed authored board fields validated against boardFieldsSchema
|
|
745
|
+
*/
|
|
746
|
+
fields?: {
|
|
747
|
+
[key: string]: JsonValue;
|
|
748
|
+
};
|
|
749
|
+
spaces?: Array<SquareSpaceSpec>;
|
|
750
|
+
relations?: Array<BoardRelationSpec>;
|
|
751
|
+
containers?: Array<BoardContainerSpec>;
|
|
752
|
+
edges?: Array<SquareEdgeSpec>;
|
|
753
|
+
vertices?: Array<SquareVertexSpec>;
|
|
754
|
+
};
|
|
755
|
+
|
|
756
|
+
export type BoardSpec = ({
|
|
757
|
+
layout: 'generic';
|
|
758
|
+
} & GenericBoardSpec) | ({
|
|
759
|
+
layout: 'hex';
|
|
760
|
+
} & HexBoardSpec) | ({
|
|
761
|
+
layout: 'square';
|
|
762
|
+
} & SquareBoardSpec);
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* Named authored slot exposed by a piece or die type
|
|
766
|
+
*/
|
|
767
|
+
export type ComponentSlotSpec = {
|
|
768
|
+
id: string;
|
|
769
|
+
name?: string;
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
/**
|
|
773
|
+
* Reusable authored piece type
|
|
774
|
+
*/
|
|
775
|
+
export type PieceTypeSpec = {
|
|
776
|
+
id: string;
|
|
777
|
+
name: string;
|
|
778
|
+
fieldsSchema?: ObjectSchema;
|
|
779
|
+
slots?: Array<ComponentSlotSpec>;
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
/**
|
|
783
|
+
* Authored seeded piece inventory or supply definition
|
|
784
|
+
*/
|
|
785
|
+
export type PieceSeedSpec = {
|
|
786
|
+
/**
|
|
787
|
+
* Stable piece id seed. When count > 1, runtime ids are generated as '{id}-1', '{id}-2', etc.
|
|
788
|
+
*/
|
|
789
|
+
id?: string;
|
|
790
|
+
name?: string;
|
|
791
|
+
typeId: string;
|
|
792
|
+
count?: number;
|
|
793
|
+
ownerId?: string;
|
|
794
|
+
home?: ComponentHomeSpec;
|
|
795
|
+
visibility?: ComponentVisibilitySpec;
|
|
796
|
+
/**
|
|
797
|
+
* Typed authored piece fields validated against the piece type schema
|
|
798
|
+
*/
|
|
799
|
+
fields?: {
|
|
800
|
+
[key: string]: JsonValue;
|
|
801
|
+
};
|
|
802
|
+
};
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* Reusable authored die type
|
|
806
|
+
*/
|
|
807
|
+
export type DieTypeSpec = {
|
|
808
|
+
id: string;
|
|
809
|
+
name: string;
|
|
810
|
+
sides?: number;
|
|
811
|
+
fieldsSchema?: ObjectSchema;
|
|
812
|
+
slots?: Array<ComponentSlotSpec>;
|
|
813
|
+
};
|
|
814
|
+
|
|
815
|
+
/**
|
|
816
|
+
* Authored seeded die inventory or supply definition
|
|
817
|
+
*/
|
|
818
|
+
export type DieSeedSpec = {
|
|
819
|
+
/**
|
|
820
|
+
* Stable die id seed. When count > 1, runtime ids are generated as '{id}-1', '{id}-2', etc.
|
|
821
|
+
*/
|
|
822
|
+
id?: string;
|
|
823
|
+
name?: string;
|
|
824
|
+
typeId: string;
|
|
825
|
+
count?: number;
|
|
826
|
+
ownerId?: string;
|
|
827
|
+
home?: ComponentHomeSpec;
|
|
828
|
+
visibility?: ComponentVisibilitySpec;
|
|
829
|
+
/**
|
|
830
|
+
* Typed authored die fields validated against the die type schema
|
|
831
|
+
*/
|
|
832
|
+
fields?: {
|
|
833
|
+
[key: string]: JsonValue;
|
|
834
|
+
};
|
|
835
|
+
};
|
|
836
|
+
|
|
837
|
+
/**
|
|
838
|
+
* Definition of a game resource type
|
|
839
|
+
*/
|
|
840
|
+
export type ResourceDefinition = {
|
|
841
|
+
/**
|
|
842
|
+
* Unique identifier for the resource. Used as a typed ResourceId.
|
|
843
|
+
*/
|
|
844
|
+
id: string;
|
|
845
|
+
/**
|
|
846
|
+
* Human-readable display name for the resource
|
|
847
|
+
*/
|
|
848
|
+
name: string;
|
|
849
|
+
/**
|
|
850
|
+
* Optional compact icon or emoji rendered by generic UI resource controls.
|
|
851
|
+
*/
|
|
852
|
+
icon?: string;
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
/**
|
|
856
|
+
* One authored setup option choice
|
|
857
|
+
*/
|
|
858
|
+
export type SetupOptionChoiceSpec = {
|
|
859
|
+
id: string;
|
|
860
|
+
label: string;
|
|
861
|
+
description?: string;
|
|
862
|
+
};
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* Authored setup module/variant axis metadata
|
|
866
|
+
*/
|
|
867
|
+
export type SetupOptionSpec = {
|
|
868
|
+
id: string;
|
|
869
|
+
name: string;
|
|
870
|
+
description?: string;
|
|
871
|
+
choices?: Array<SetupOptionChoiceSpec>;
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* Reducer-consumed authored setup profile, recipe, or loadout metadata
|
|
876
|
+
*/
|
|
877
|
+
export type SetupProfileSpec = {
|
|
878
|
+
id: string;
|
|
879
|
+
name: string;
|
|
880
|
+
description?: string;
|
|
881
|
+
/**
|
|
882
|
+
* Selected setup-option values for this profile
|
|
883
|
+
*/
|
|
884
|
+
optionValues?: {
|
|
885
|
+
[key: string]: string;
|
|
886
|
+
};
|
|
887
|
+
};
|
|
888
|
+
|
|
889
|
+
/**
|
|
890
|
+
* Authoritative topology manifest for reducer-native games
|
|
891
|
+
*/
|
|
892
|
+
export type GameTopologyManifest = {
|
|
893
|
+
players: PlayersDefinition;
|
|
894
|
+
/**
|
|
895
|
+
* Authored card catalogs and schemas
|
|
896
|
+
*/
|
|
897
|
+
cardSets: Array<CardSetDefinition>;
|
|
898
|
+
/**
|
|
899
|
+
* Shared and per-player authored containers
|
|
900
|
+
*/
|
|
901
|
+
zones?: Array<ZoneSpec>;
|
|
902
|
+
/**
|
|
903
|
+
* Reusable board topology templates
|
|
904
|
+
*/
|
|
905
|
+
boardTemplates?: Array<BoardTemplateSpec>;
|
|
906
|
+
/**
|
|
907
|
+
* Shared and per-player authored board shells
|
|
908
|
+
*/
|
|
909
|
+
boards?: Array<BoardSpec>;
|
|
910
|
+
pieceTypes?: Array<PieceTypeSpec>;
|
|
911
|
+
pieceSeeds?: Array<PieceSeedSpec>;
|
|
912
|
+
dieTypes?: Array<DieTypeSpec>;
|
|
913
|
+
dieSeeds?: Array<DieSeedSpec>;
|
|
914
|
+
resources?: Array<ResourceDefinition>;
|
|
915
|
+
/**
|
|
916
|
+
* Authored setup-option metadata consumed by reducer-owned setup flows
|
|
917
|
+
*/
|
|
918
|
+
setupOptions?: Array<SetupOptionSpec>;
|
|
919
|
+
/**
|
|
920
|
+
* Authored setup recipes, loadouts, or module profiles consumed by reducer setup code
|
|
921
|
+
*/
|
|
922
|
+
setupProfiles?: Array<SetupProfileSpec>;
|
|
923
|
+
};
|
|
924
|
+
|
|
925
|
+
/**
|
|
926
|
+
* Authenticated user acting in a session.
|
|
927
|
+
*/
|
|
928
|
+
export type SessionActorAuthUser = {
|
|
929
|
+
kind: 'AUTH_USER';
|
|
930
|
+
/**
|
|
931
|
+
* Internal user id
|
|
932
|
+
*/
|
|
933
|
+
id: string;
|
|
934
|
+
};
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* Anonymous demo principal for one demo_sessions row (shared across tabs).
|
|
938
|
+
*/
|
|
939
|
+
export type SessionActorDemoGuest = {
|
|
940
|
+
kind: 'DEMO_GUEST';
|
|
941
|
+
/**
|
|
942
|
+
* demo_sessions.id
|
|
943
|
+
*/
|
|
944
|
+
demoActorSessionId: string;
|
|
945
|
+
};
|
|
946
|
+
|
|
947
|
+
export type SessionActor = ({
|
|
948
|
+
kind: 'AUTH_USER';
|
|
949
|
+
} & SessionActorAuthUser) | ({
|
|
950
|
+
kind: 'DEMO_GUEST';
|
|
951
|
+
} & SessionActorDemoGuest);
|
|
952
|
+
|
|
953
|
+
export type SessionGameSourceUserCompiled = {
|
|
954
|
+
kind: 'USER_COMPILED';
|
|
955
|
+
ownerUserId: string;
|
|
956
|
+
gameId: string;
|
|
957
|
+
compiledResultId: string;
|
|
958
|
+
};
|
|
959
|
+
|
|
960
|
+
export type SessionGameSourceDemoRevision = {
|
|
961
|
+
kind: 'DEMO_REVISION';
|
|
962
|
+
slug: string;
|
|
963
|
+
revisionId: string;
|
|
964
|
+
};
|
|
965
|
+
|
|
966
|
+
export type SessionGameSource = ({
|
|
967
|
+
kind: 'USER_COMPILED';
|
|
968
|
+
} & SessionGameSourceUserCompiled) | ({
|
|
969
|
+
kind: 'DEMO_REVISION';
|
|
970
|
+
} & SessionGameSourceDemoRevision);
|
|
971
|
+
|
|
972
|
+
export type SessionSnapshotPhase = 'lobby' | 'gameplay' | 'ended';
|
|
973
|
+
|
|
974
|
+
export type HostSessionStatus = 'active' | 'ended';
|
|
975
|
+
|
|
976
|
+
/**
|
|
977
|
+
* Summary of a game state history entry.
|
|
978
|
+
*/
|
|
979
|
+
export type HistoryEntrySummary = {
|
|
980
|
+
id: string;
|
|
981
|
+
generation: number;
|
|
982
|
+
version: number;
|
|
983
|
+
timestamp: string;
|
|
984
|
+
description: string;
|
|
985
|
+
playerId?: string;
|
|
986
|
+
actionType?: string;
|
|
987
|
+
isCurrent: boolean;
|
|
988
|
+
};
|
|
989
|
+
|
|
990
|
+
export type SessionSnapshotHistory = {
|
|
991
|
+
entries: Array<HistoryEntrySummary>;
|
|
992
|
+
currentIndex: number;
|
|
993
|
+
canGoBack: boolean;
|
|
994
|
+
canGoForward: boolean;
|
|
995
|
+
};
|
|
996
|
+
|
|
997
|
+
export type HostSessionContext = {
|
|
998
|
+
/**
|
|
999
|
+
* Unique identifier for the session.
|
|
1000
|
+
*/
|
|
1001
|
+
sessionId: string;
|
|
1002
|
+
/**
|
|
1003
|
+
* Memorable short code for sharing.
|
|
1004
|
+
*/
|
|
1005
|
+
shortCode: string;
|
|
1006
|
+
phase: SessionSnapshotPhase;
|
|
1007
|
+
status: HostSessionStatus;
|
|
1008
|
+
hostActor: SessionActor;
|
|
1009
|
+
gameSource: SessionGameSource;
|
|
1010
|
+
/**
|
|
1011
|
+
* Selected authored setup profile for this session.
|
|
1012
|
+
*/
|
|
1013
|
+
setupProfileId?: string;
|
|
1014
|
+
/**
|
|
1015
|
+
* Player IDs the authenticated session actor may select.
|
|
1016
|
+
*/
|
|
1017
|
+
switchablePlayerIds: Array<string>;
|
|
1018
|
+
history?: SessionSnapshotHistory;
|
|
1019
|
+
};
|
|
1020
|
+
|
|
1021
|
+
export type SeatAssignment = {
|
|
1022
|
+
/**
|
|
1023
|
+
* Player identifier (e.g., 'player-1')
|
|
1024
|
+
*/
|
|
1025
|
+
playerId: string;
|
|
1026
|
+
/**
|
|
1027
|
+
* Session actor controlling this seat (null if empty)
|
|
1028
|
+
*/
|
|
1029
|
+
controllerActor?: SessionActor;
|
|
1030
|
+
/**
|
|
1031
|
+
* Display name for this seat/player
|
|
1032
|
+
*/
|
|
1033
|
+
displayName: string;
|
|
1034
|
+
/**
|
|
1035
|
+
* Hex color code for the player (e.g., '#FF5733')
|
|
1036
|
+
*/
|
|
1037
|
+
playerColor?: string;
|
|
1038
|
+
/**
|
|
1039
|
+
* Whether this seat is the host
|
|
1040
|
+
*/
|
|
1041
|
+
isHost?: boolean;
|
|
1042
|
+
};
|
|
1043
|
+
|
|
1044
|
+
export type HostLobbyView = {
|
|
1045
|
+
/**
|
|
1046
|
+
* Current public seat assignments for the session.
|
|
1047
|
+
*/
|
|
1048
|
+
seats: Array<SeatAssignment>;
|
|
1049
|
+
/**
|
|
1050
|
+
* Whether the lobby can currently be started.
|
|
1051
|
+
*/
|
|
1052
|
+
canStart: boolean;
|
|
1053
|
+
/**
|
|
1054
|
+
* Session actor that hosts this session.
|
|
1055
|
+
*/
|
|
1056
|
+
hostActor: SessionActor;
|
|
1057
|
+
/**
|
|
1058
|
+
* Selected authored setup profile for this session.
|
|
1059
|
+
*/
|
|
1060
|
+
setupProfileId?: string;
|
|
1061
|
+
};
|
|
1062
|
+
|
|
1063
|
+
export type HostLobbySessionSnapshot = {
|
|
1064
|
+
type: 'lobby';
|
|
1065
|
+
context: HostSessionContext;
|
|
1066
|
+
lobby: HostLobbyView;
|
|
1067
|
+
};
|
|
1068
|
+
|
|
1069
|
+
export type SimultaneousPhaseSnapshot = {
|
|
1070
|
+
phaseName: string;
|
|
1071
|
+
interactionId: string;
|
|
1072
|
+
actorIds: Array<string>;
|
|
1073
|
+
sealedPlayerIds: Array<string>;
|
|
1074
|
+
pendingPlayerIds: Array<string>;
|
|
1075
|
+
};
|
|
1076
|
+
|
|
1077
|
+
export type HostGameplaySharedView = {
|
|
1078
|
+
/**
|
|
1079
|
+
* Player IDs currently active in the game state.
|
|
1080
|
+
*/
|
|
1081
|
+
activePlayers: Array<string>;
|
|
1082
|
+
/**
|
|
1083
|
+
* Current reducer-native gameplay phase.
|
|
1084
|
+
*/
|
|
1085
|
+
currentPhase: string;
|
|
1086
|
+
/**
|
|
1087
|
+
* Current stage within the phase. Null when the phase has no active stage.
|
|
1088
|
+
*/
|
|
1089
|
+
currentStage: string | null;
|
|
1090
|
+
/**
|
|
1091
|
+
* Player IDs this stage currently admits.
|
|
1092
|
+
*/
|
|
1093
|
+
stageSeats: Array<string>;
|
|
1094
|
+
/**
|
|
1095
|
+
* Visibility-safe progress metadata for an active simultaneous-player phase.
|
|
1096
|
+
*/
|
|
1097
|
+
simultaneousPhase?: SimultaneousPhaseSnapshot | null;
|
|
1098
|
+
/**
|
|
1099
|
+
* JSON-serialized session-scoped static view. Populated on gameplay bootstrap payloads only.
|
|
1100
|
+
*/
|
|
1101
|
+
boardStatic?: string | null;
|
|
1102
|
+
/**
|
|
1103
|
+
* Content hash of the session-scoped static view held on the host.
|
|
1104
|
+
*/
|
|
1105
|
+
boardStaticHash?: string | null;
|
|
1106
|
+
};
|
|
1107
|
+
|
|
1108
|
+
/**
|
|
1109
|
+
* Draft commit policy consumed by default UI surfaces.
|
|
1110
|
+
*/
|
|
1111
|
+
export type InteractionCommitPolicy = {
|
|
1112
|
+
mode: 'manual' | 'autoWhenReady';
|
|
1113
|
+
};
|
|
1114
|
+
|
|
1115
|
+
/**
|
|
1116
|
+
* Single-value input selection.
|
|
1117
|
+
*/
|
|
1118
|
+
export type SingleInputSelection = {
|
|
1119
|
+
mode: 'single';
|
|
1120
|
+
};
|
|
1121
|
+
|
|
1122
|
+
/**
|
|
1123
|
+
* Multi-value input selection.
|
|
1124
|
+
*/
|
|
1125
|
+
export type ManyInputSelection = {
|
|
1126
|
+
mode: 'many';
|
|
1127
|
+
min: number;
|
|
1128
|
+
max?: number;
|
|
1129
|
+
distinct?: boolean;
|
|
1130
|
+
};
|
|
1131
|
+
|
|
1132
|
+
export type InputSelection = ({
|
|
1133
|
+
mode: 'single';
|
|
1134
|
+
} & SingleInputSelection) | ({
|
|
1135
|
+
mode: 'many';
|
|
1136
|
+
} & ManyInputSelection);
|
|
1137
|
+
|
|
1138
|
+
export type InputDomain = ({
|
|
1139
|
+
type: 'cardTarget';
|
|
1140
|
+
} & CardTargetDomain) | ({
|
|
1141
|
+
type: 'boardTarget';
|
|
1142
|
+
} & BoardTargetDomain) | ({
|
|
1143
|
+
type: 'resourceMap';
|
|
1144
|
+
} & ResourceMapDomain) | ({
|
|
1145
|
+
type: 'boundedNumber';
|
|
1146
|
+
} & BoundedNumberDomain) | ({
|
|
1147
|
+
type: 'choice';
|
|
1148
|
+
} & ChoiceDomain) | ({
|
|
1149
|
+
type: 'choiceList';
|
|
1150
|
+
} & ChoiceListDomain);
|
|
1151
|
+
|
|
1152
|
+
export type InputDomainDependencyCase = {
|
|
1153
|
+
when: {
|
|
1154
|
+
[key: string]: string;
|
|
1155
|
+
};
|
|
1156
|
+
domain: InputDomain;
|
|
1157
|
+
};
|
|
1158
|
+
|
|
1159
|
+
export type EagerInputDomainDependencies = {
|
|
1160
|
+
mode: 'eager';
|
|
1161
|
+
dependentCases: Array<InputDomainDependencyCase>;
|
|
1162
|
+
};
|
|
1163
|
+
|
|
1164
|
+
export type ResolvedCardTargetDomain = {
|
|
1165
|
+
type: 'cardTarget';
|
|
1166
|
+
projection: 'resolved';
|
|
1167
|
+
targetKind: 'card';
|
|
1168
|
+
zoneIds: Array<string>;
|
|
1169
|
+
eligibleTargets: Array<string>;
|
|
1170
|
+
selection?: InputSelection;
|
|
1171
|
+
dependencies?: EagerInputDomainDependencies;
|
|
1172
|
+
};
|
|
1173
|
+
|
|
1174
|
+
export type InputDomainResolver = {
|
|
1175
|
+
interactionKey?: string;
|
|
1176
|
+
inputKey: string;
|
|
1177
|
+
};
|
|
1178
|
+
|
|
1179
|
+
export type LazyInputDomainDependencies = {
|
|
1180
|
+
mode: 'lazy';
|
|
1181
|
+
dependsOn: Array<string>;
|
|
1182
|
+
resolver: InputDomainResolver;
|
|
1183
|
+
};
|
|
1184
|
+
|
|
1185
|
+
export type LazyCardTargetDomain = {
|
|
1186
|
+
type: 'cardTarget';
|
|
1187
|
+
projection: 'lazy';
|
|
1188
|
+
targetKind: 'card';
|
|
1189
|
+
zoneIds: Array<string>;
|
|
1190
|
+
selection?: InputSelection;
|
|
1191
|
+
dependencies: LazyInputDomainDependencies;
|
|
1192
|
+
};
|
|
1193
|
+
|
|
1194
|
+
export type CardTargetDomain = ({
|
|
1195
|
+
projection: 'resolved';
|
|
1196
|
+
} & ResolvedCardTargetDomain) | ({
|
|
1197
|
+
projection: 'lazy';
|
|
1198
|
+
} & LazyCardTargetDomain);
|
|
1199
|
+
|
|
1200
|
+
export type ResolvedBoardTargetDomain = {
|
|
1201
|
+
type: 'boardTarget';
|
|
1202
|
+
projection: 'resolved';
|
|
1203
|
+
targetKind: 'edge' | 'vertex' | 'space' | 'tile';
|
|
1204
|
+
boardId: string;
|
|
1205
|
+
valueKind?: 'board-id' | 'player-board-space';
|
|
1206
|
+
eligibleTargets: Array<string>;
|
|
1207
|
+
selection?: InputSelection;
|
|
1208
|
+
dependencies?: EagerInputDomainDependencies;
|
|
1209
|
+
};
|
|
1210
|
+
|
|
1211
|
+
export type LazyBoardTargetDomain = {
|
|
1212
|
+
type: 'boardTarget';
|
|
1213
|
+
projection: 'lazy';
|
|
1214
|
+
targetKind: 'edge' | 'vertex' | 'space' | 'tile';
|
|
1215
|
+
boardId: string;
|
|
1216
|
+
valueKind?: 'board-id' | 'player-board-space';
|
|
1217
|
+
selection?: InputSelection;
|
|
1218
|
+
dependencies: LazyInputDomainDependencies;
|
|
1219
|
+
};
|
|
1220
|
+
|
|
1221
|
+
export type BoardTargetDomain = ({
|
|
1222
|
+
projection: 'resolved';
|
|
1223
|
+
} & ResolvedBoardTargetDomain) | ({
|
|
1224
|
+
projection: 'lazy';
|
|
1225
|
+
} & LazyBoardTargetDomain);
|
|
1226
|
+
|
|
1227
|
+
export type ResourceMapDomainEntry = {
|
|
1228
|
+
resourceId: string;
|
|
1229
|
+
label?: string;
|
|
1230
|
+
icon?: string;
|
|
1231
|
+
min: number;
|
|
1232
|
+
max: number;
|
|
1233
|
+
};
|
|
1234
|
+
|
|
1235
|
+
export type ResourceMapDomain = {
|
|
1236
|
+
type: 'resourceMap';
|
|
1237
|
+
resources: Array<ResourceMapDomainEntry>;
|
|
1238
|
+
selection?: InputSelection;
|
|
1239
|
+
};
|
|
1240
|
+
|
|
1241
|
+
export type BoundedNumberDomain = {
|
|
1242
|
+
type: 'boundedNumber';
|
|
1243
|
+
min: number;
|
|
1244
|
+
max: number;
|
|
1245
|
+
step?: number;
|
|
1246
|
+
selection?: InputSelection;
|
|
1247
|
+
};
|
|
1248
|
+
|
|
1249
|
+
export type ChoiceDomainOption = {
|
|
1250
|
+
value: string | null;
|
|
1251
|
+
label: string;
|
|
1252
|
+
icon?: string;
|
|
1253
|
+
badge?: string;
|
|
1254
|
+
description?: string;
|
|
1255
|
+
disabled?: boolean;
|
|
1256
|
+
disabledReason?: string;
|
|
1257
|
+
};
|
|
1258
|
+
|
|
1259
|
+
export type ChoiceDomain = {
|
|
1260
|
+
type: 'choice';
|
|
1261
|
+
choices: Array<ChoiceDomainOption>;
|
|
1262
|
+
selection?: InputSelection;
|
|
1263
|
+
dependencies?: EagerInputDomainDependencies;
|
|
1264
|
+
};
|
|
1265
|
+
|
|
1266
|
+
export type ChoiceListDomain = {
|
|
1267
|
+
type: 'choiceList';
|
|
1268
|
+
choices: Array<ChoiceDomainOption>;
|
|
1269
|
+
min?: number;
|
|
1270
|
+
max?: number;
|
|
1271
|
+
selection?: InputSelection;
|
|
1272
|
+
dependencies?: EagerInputDomainDependencies;
|
|
1273
|
+
};
|
|
1274
|
+
|
|
1275
|
+
/**
|
|
1276
|
+
* Canonical descriptor for one interaction input collector.
|
|
1277
|
+
*/
|
|
1278
|
+
export type InteractionInputDescriptor = {
|
|
1279
|
+
key: string;
|
|
1280
|
+
kind: string;
|
|
1281
|
+
domain: InputDomain;
|
|
1282
|
+
/**
|
|
1283
|
+
* Optional default value applied to this input when the player has not
|
|
1284
|
+
* yet drafted a value. Mirrors the input collector's `defaultValue`
|
|
1285
|
+
* from the authored interaction, so plugins can render a sensible
|
|
1286
|
+
* starting state (e.g. a pre-selected resource for a bank trade).
|
|
1287
|
+
*
|
|
1288
|
+
*/
|
|
1289
|
+
defaultValue?: JsonValue;
|
|
1290
|
+
};
|
|
1291
|
+
|
|
1292
|
+
export type AvailableInteractionAvailability = {
|
|
1293
|
+
status: 'available';
|
|
1294
|
+
};
|
|
1295
|
+
|
|
1296
|
+
export type NotYourTurnInteractionAvailability = {
|
|
1297
|
+
status: 'notYourTurn';
|
|
1298
|
+
reason: string;
|
|
1299
|
+
};
|
|
1300
|
+
|
|
1301
|
+
export type InsufficientResourcesInteractionAvailability = {
|
|
1302
|
+
status: 'insufficientResources';
|
|
1303
|
+
reason: string;
|
|
1304
|
+
/**
|
|
1305
|
+
* Resource shortfall by resource id when a costed interaction is not currently affordable.
|
|
1306
|
+
*/
|
|
1307
|
+
missingResources: {
|
|
1308
|
+
[key: string]: number;
|
|
1309
|
+
};
|
|
1310
|
+
};
|
|
1311
|
+
|
|
1312
|
+
export type BlockedInteractionAvailability = {
|
|
1313
|
+
status: 'blocked';
|
|
1314
|
+
reason: string;
|
|
1315
|
+
code?: string;
|
|
1316
|
+
};
|
|
1317
|
+
|
|
1318
|
+
export type InteractionAvailability = ({
|
|
1319
|
+
status: 'available';
|
|
1320
|
+
} & AvailableInteractionAvailability) | ({
|
|
1321
|
+
status: 'notYourTurn';
|
|
1322
|
+
} & NotYourTurnInteractionAvailability) | ({
|
|
1323
|
+
status: 'insufficientResources';
|
|
1324
|
+
} & InsufficientResourcesInteractionAvailability) | ({
|
|
1325
|
+
status: 'blocked';
|
|
1326
|
+
} & BlockedInteractionAvailability);
|
|
1327
|
+
|
|
1328
|
+
/**
|
|
1329
|
+
* Authoritative interaction descriptor resolved by the trusted bundle.
|
|
1330
|
+
*/
|
|
1331
|
+
export type InteractionDescriptorBase = {
|
|
1332
|
+
phaseName: string;
|
|
1333
|
+
interactionKey: string;
|
|
1334
|
+
interactionId: string;
|
|
1335
|
+
zoneId?: string;
|
|
1336
|
+
/**
|
|
1337
|
+
* Draft commit policy materialized by the trusted reducer bundle. Omitted authoring specs default to manual before this descriptor crosses the runtime boundary.
|
|
1338
|
+
*/
|
|
1339
|
+
commit: InteractionCommitPolicy;
|
|
1340
|
+
/**
|
|
1341
|
+
* Ordered input descriptors. Each entry is the canonical source for its collector key, collector kind, and valid-value domain.
|
|
1342
|
+
*/
|
|
1343
|
+
inputs: Array<InteractionInputDescriptor>;
|
|
1344
|
+
cost?: {
|
|
1345
|
+
[key: string]: JsonValue;
|
|
1346
|
+
};
|
|
1347
|
+
currentResources?: {
|
|
1348
|
+
[key: string]: JsonValue;
|
|
1349
|
+
};
|
|
1350
|
+
availability: InteractionAvailability;
|
|
1351
|
+
};
|
|
1352
|
+
|
|
1353
|
+
export type ActionInteractionDescriptor = InteractionDescriptorBase & {
|
|
1354
|
+
kind: 'action';
|
|
1355
|
+
};
|
|
1356
|
+
|
|
1357
|
+
export type InteractionContextOption = {
|
|
1358
|
+
id: string;
|
|
1359
|
+
label: string;
|
|
1360
|
+
};
|
|
1361
|
+
|
|
1362
|
+
export type InteractionContext = {
|
|
1363
|
+
to: string;
|
|
1364
|
+
title?: string;
|
|
1365
|
+
payload?: {
|
|
1366
|
+
[key: string]: JsonValue;
|
|
1367
|
+
};
|
|
1368
|
+
options?: Array<InteractionContextOption>;
|
|
1369
|
+
};
|
|
1370
|
+
|
|
1371
|
+
export type PromptInteractionDescriptor = InteractionDescriptorBase & {
|
|
1372
|
+
kind: 'prompt';
|
|
1373
|
+
context: InteractionContext;
|
|
1374
|
+
};
|
|
1375
|
+
|
|
1376
|
+
export type InteractionDescriptor = ({
|
|
1377
|
+
kind: 'action';
|
|
1378
|
+
} & ActionInteractionDescriptor) | ({
|
|
1379
|
+
kind: 'prompt';
|
|
1380
|
+
} & PromptInteractionDescriptor);
|
|
1381
|
+
|
|
1382
|
+
export type ZoneHandles = {
|
|
1383
|
+
cardIds: Array<string>;
|
|
1384
|
+
cardViewsById: {
|
|
1385
|
+
[key: string]: string;
|
|
1386
|
+
};
|
|
1387
|
+
playableByCardId: {
|
|
1388
|
+
[key: string]: Array<string>;
|
|
1389
|
+
};
|
|
1390
|
+
};
|
|
1391
|
+
|
|
1392
|
+
export type HostGameplaySeatView = {
|
|
1393
|
+
/**
|
|
1394
|
+
* Opaque revision token for this seat's available descriptors and input domains.
|
|
1395
|
+
*/
|
|
1396
|
+
actionSetVersion: string;
|
|
1397
|
+
/**
|
|
1398
|
+
* JSON-serialized reducer-projected UI view for this player.
|
|
1399
|
+
*/
|
|
1400
|
+
view: string | null;
|
|
1401
|
+
/**
|
|
1402
|
+
* Descriptor refs for interactions available to this player.
|
|
1403
|
+
*/
|
|
1404
|
+
availableInteractionRefs: Array<string>;
|
|
1405
|
+
/**
|
|
1406
|
+
* Zone handles for this player, keyed by zone id.
|
|
1407
|
+
*/
|
|
1408
|
+
zones: {
|
|
1409
|
+
[key: string]: ZoneHandles;
|
|
1410
|
+
};
|
|
1411
|
+
};
|
|
1412
|
+
|
|
1413
|
+
export type HostPlayerGameplayView = {
|
|
1414
|
+
/**
|
|
1415
|
+
* Monotonic gameplay version for stale-client detection.
|
|
1416
|
+
*/
|
|
1417
|
+
version: number;
|
|
1418
|
+
/**
|
|
1419
|
+
* Opaque revision token for the returned descriptors and input domains.
|
|
1420
|
+
*/
|
|
1421
|
+
actionSetVersion: string;
|
|
1422
|
+
/**
|
|
1423
|
+
* Player ID currently selected for rendering and input.
|
|
1424
|
+
*/
|
|
1425
|
+
perspectivePlayerId: string;
|
|
1426
|
+
/**
|
|
1427
|
+
* Player IDs included in this normalized projection envelope.
|
|
1428
|
+
*/
|
|
1429
|
+
controllablePlayerIds: Array<string>;
|
|
1430
|
+
shared: HostGameplaySharedView;
|
|
1431
|
+
/**
|
|
1432
|
+
* Deduplicated interaction descriptor registry keyed by stable descriptor ref.
|
|
1433
|
+
*/
|
|
1434
|
+
interactionsByRef: {
|
|
1435
|
+
[key: string]: InteractionDescriptor;
|
|
1436
|
+
};
|
|
1437
|
+
/**
|
|
1438
|
+
* Player-scoped projections keyed by authorized player id.
|
|
1439
|
+
*/
|
|
1440
|
+
seats: {
|
|
1441
|
+
[key: string]: HostGameplaySeatView;
|
|
1442
|
+
};
|
|
1443
|
+
};
|
|
1444
|
+
|
|
1445
|
+
export type HostGameplaySessionSnapshot = {
|
|
1446
|
+
type: 'gameplay';
|
|
1447
|
+
context: HostSessionContext;
|
|
1448
|
+
lobby: HostLobbyView;
|
|
1449
|
+
gameplay: HostPlayerGameplayView;
|
|
1450
|
+
};
|
|
1451
|
+
|
|
1452
|
+
export type HostEndedSessionSnapshot = {
|
|
1453
|
+
type: 'ended';
|
|
1454
|
+
context: HostSessionContext;
|
|
1455
|
+
lobby: HostLobbyView;
|
|
1456
|
+
};
|
|
1457
|
+
|
|
1458
|
+
export type HostSessionSnapshot = ({
|
|
1459
|
+
type: 'lobby';
|
|
1460
|
+
} & HostLobbySessionSnapshot) | ({
|
|
1461
|
+
type: 'gameplay';
|
|
1462
|
+
} & HostGameplaySessionSnapshot) | ({
|
|
1463
|
+
type: 'ended';
|
|
1464
|
+
} & HostEndedSessionSnapshot);
|
|
1465
|
+
|
|
1466
|
+
export type HostSessionEventCausation = {
|
|
1467
|
+
clientActionId?: string;
|
|
1468
|
+
};
|
|
1469
|
+
|
|
1470
|
+
export type HostSessionGameplayUpdatedEvent = {
|
|
1471
|
+
type: 'session.gameplayUpdated';
|
|
1472
|
+
context: HostSessionContext;
|
|
1473
|
+
gameplay: HostPlayerGameplayView;
|
|
1474
|
+
causation?: HostSessionEventCausation;
|
|
1475
|
+
};
|
|
1476
|
+
|
|
1477
|
+
export type HostActionSubmitResponse = {
|
|
1478
|
+
success: boolean;
|
|
1479
|
+
version: number;
|
|
1480
|
+
actionSetVersion: string;
|
|
1481
|
+
accepted?: boolean;
|
|
1482
|
+
durabilityStatus?: 'COMMITTED';
|
|
1483
|
+
errorCode?: string;
|
|
1484
|
+
message?: string;
|
|
1485
|
+
clientActionId?: string;
|
|
1486
|
+
update?: HostSessionGameplayUpdatedEvent;
|
|
1487
|
+
};
|
|
1488
|
+
|
|
1489
|
+
/**
|
|
1490
|
+
* Type of parameter accepted by a runtime action
|
|
1491
|
+
*/
|
|
1492
|
+
export type ParameterType = 'cardId' | 'cardType' | 'playerId' | 'string' | 'number' | 'boolean' | 'zoneId' | 'pieceId' | 'dieId' | 'boardId' | 'edgeId' | 'vertexId' | 'spaceId' | 'resourceId';
|
|
1493
|
+
|
|
1494
|
+
/**
|
|
1495
|
+
* Defines a parameter for an action
|
|
1496
|
+
*/
|
|
1497
|
+
export type ActionParameterDefinition = {
|
|
1498
|
+
name: string;
|
|
1499
|
+
type: ParameterType;
|
|
1500
|
+
required?: boolean;
|
|
1501
|
+
array?: boolean;
|
|
1502
|
+
minLength?: number;
|
|
1503
|
+
maxLength?: number;
|
|
1504
|
+
/**
|
|
1505
|
+
* Optional card set ID to specify which card set a CARD_ID parameter refers to
|
|
1506
|
+
*/
|
|
1507
|
+
cardSetId?: string;
|
|
1508
|
+
description?: string;
|
|
1509
|
+
};
|
|
1510
|
+
|
|
1511
|
+
/**
|
|
1512
|
+
* Defines an available player action with metadata and parameter definitions
|
|
1513
|
+
*/
|
|
1514
|
+
export type ActionDefinition = {
|
|
1515
|
+
/**
|
|
1516
|
+
* Unique action identifier
|
|
1517
|
+
*/
|
|
1518
|
+
actionType: string;
|
|
1519
|
+
/**
|
|
1520
|
+
* UI display name for this action
|
|
1521
|
+
*/
|
|
1522
|
+
displayName: string;
|
|
1523
|
+
/**
|
|
1524
|
+
* Optional help text describing the action
|
|
1525
|
+
*/
|
|
1526
|
+
description?: string;
|
|
1527
|
+
/**
|
|
1528
|
+
* List of parameters this action accepts
|
|
1529
|
+
*/
|
|
1530
|
+
parameters: Array<ActionParameterDefinition>;
|
|
1531
|
+
/**
|
|
1532
|
+
* List of possible validation error codes
|
|
1533
|
+
*/
|
|
1534
|
+
errorCodes?: Array<string>;
|
|
1535
|
+
};
|
|
1536
|
+
|
|
1537
|
+
/**
|
|
1538
|
+
* Type of source for the card set
|
|
1539
|
+
*/
|
|
1540
|
+
export type CardSetSourceType = 'preset' | 'csv' | 'manual';
|
|
1541
|
+
|
|
1542
|
+
/**
|
|
1543
|
+
* Engine-level structural board layout discriminator
|
|
1544
|
+
*/
|
|
1545
|
+
export type BoardLayout = 'generic' | 'hex' | 'square';
|
|
1546
|
+
|
|
1547
|
+
/**
|
|
1548
|
+
* Unique identifier for the player (e.g., 'player-1')
|
|
1549
|
+
*/
|
|
1550
|
+
export type PlayerId = string;
|