@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 @@
|
|
|
1
|
+
export * from "./workspace-codegen/index.js";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export const DREAMBOARD_SDK_VERSION = "0.2.0";
|
|
2
|
+
|
|
3
|
+
export const DREAMBOARD_SDK_PACKAGES = {
|
|
4
|
+
"@dreamboard-games/sdk": DREAMBOARD_SDK_VERSION,
|
|
5
|
+
} as const;
|
|
6
|
+
|
|
7
|
+
export type DreamboardSdkPackageName = keyof typeof DREAMBOARD_SDK_PACKAGES;
|
|
8
|
+
|
|
9
|
+
export type DreamboardSdkPackageSet = {
|
|
10
|
+
version: 1;
|
|
11
|
+
sdkVersion: string;
|
|
12
|
+
packages: Record<DreamboardSdkPackageName, string>;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const DREAMBOARD_SDK_PACKAGE_SET: DreamboardSdkPackageSet = {
|
|
16
|
+
version: 1,
|
|
17
|
+
sdkVersion: DREAMBOARD_SDK_VERSION,
|
|
18
|
+
packages: DREAMBOARD_SDK_PACKAGES,
|
|
19
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createManifestStringLiteralSchema } from "../model/manifest";
|
|
3
|
+
import type {
|
|
4
|
+
ReducerGameContract,
|
|
5
|
+
ReducerManifestContract,
|
|
6
|
+
RuntimeTableRecord,
|
|
7
|
+
SchemaLike,
|
|
8
|
+
StateDefinition,
|
|
9
|
+
} from "../model";
|
|
10
|
+
import {
|
|
11
|
+
type ManifestIdSchemasOf,
|
|
12
|
+
validateStateSchemaIdBranding,
|
|
13
|
+
} from "./validation";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Narrows a manifest's `literals.phaseNames` and `ids.phaseName` to the
|
|
17
|
+
* author-supplied phase-name tuple. Lets `defineGameContract` override the
|
|
18
|
+
* codegen-emitted `phaseNames: readonly string[]` / `phaseName: z.string()`
|
|
19
|
+
* placeholders so `PhaseNameOfContract<Contract>` resolves to a literal
|
|
20
|
+
* union and flows through `fx.transition`, `PhaseMapOf`, and the flow
|
|
21
|
+
* state's `currentPhase`.
|
|
22
|
+
*/
|
|
23
|
+
type NarrowManifestPhaseNames<
|
|
24
|
+
Manifest,
|
|
25
|
+
PhaseNames extends readonly string[],
|
|
26
|
+
> = Omit<Manifest, "literals" | "ids"> & {
|
|
27
|
+
literals: Manifest extends { literals: infer L }
|
|
28
|
+
? Omit<L, "phaseNames"> & { phaseNames: PhaseNames }
|
|
29
|
+
: { phaseNames: PhaseNames };
|
|
30
|
+
ids: Manifest extends { ids: infer I }
|
|
31
|
+
? Omit<I, "phaseName"> & { phaseName: z.ZodType<PhaseNames[number]> }
|
|
32
|
+
: { phaseName: z.ZodType<PhaseNames[number]> };
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type ReducerGameContractInput<
|
|
36
|
+
Table extends RuntimeTableRecord,
|
|
37
|
+
Manifest extends ReducerManifestContract<
|
|
38
|
+
Table,
|
|
39
|
+
string,
|
|
40
|
+
string,
|
|
41
|
+
string,
|
|
42
|
+
string,
|
|
43
|
+
string
|
|
44
|
+
>,
|
|
45
|
+
PublicSchema extends SchemaLike<object>,
|
|
46
|
+
PrivateSchema extends SchemaLike<object>,
|
|
47
|
+
HiddenSchema extends SchemaLike<object>,
|
|
48
|
+
Phases extends Record<string, SchemaLike<object>>,
|
|
49
|
+
> = {
|
|
50
|
+
manifest: Manifest;
|
|
51
|
+
state: StateDefinition<PublicSchema, PrivateSchema, HiddenSchema>;
|
|
52
|
+
phases: Phases;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export function defineGameContract<
|
|
56
|
+
Table extends RuntimeTableRecord,
|
|
57
|
+
const Manifest extends ReducerManifestContract<
|
|
58
|
+
Table,
|
|
59
|
+
string,
|
|
60
|
+
string,
|
|
61
|
+
string,
|
|
62
|
+
string,
|
|
63
|
+
string
|
|
64
|
+
>,
|
|
65
|
+
PublicSchema extends SchemaLike<object>,
|
|
66
|
+
PrivateSchema extends SchemaLike<object>,
|
|
67
|
+
HiddenSchema extends SchemaLike<object>,
|
|
68
|
+
const Phases extends Record<string, SchemaLike<object>>,
|
|
69
|
+
>(
|
|
70
|
+
definition: ReducerGameContractInput<
|
|
71
|
+
Table,
|
|
72
|
+
Manifest,
|
|
73
|
+
PublicSchema,
|
|
74
|
+
PrivateSchema,
|
|
75
|
+
HiddenSchema,
|
|
76
|
+
Phases
|
|
77
|
+
>,
|
|
78
|
+
): ReducerGameContract<
|
|
79
|
+
Table,
|
|
80
|
+
NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,
|
|
81
|
+
PublicSchema,
|
|
82
|
+
PrivateSchema,
|
|
83
|
+
HiddenSchema,
|
|
84
|
+
Phases
|
|
85
|
+
> & {
|
|
86
|
+
readonly phases: Phases;
|
|
87
|
+
readonly phaseNames: readonly (keyof Phases & string)[];
|
|
88
|
+
/**
|
|
89
|
+
* Ergonomic shortcut to the manifest-backed Zod id schemas. Equivalent to
|
|
90
|
+
* `definition.manifest.ids`. Prefer `gameContract.schemas.playerId` etc.
|
|
91
|
+
* over re-importing the generated `ids` namespace so that every authored
|
|
92
|
+
* schema is anchored to the same SDK-guided source.
|
|
93
|
+
*/
|
|
94
|
+
readonly schemas: ManifestIdSchemasOf<
|
|
95
|
+
NarrowManifestPhaseNames<
|
|
96
|
+
Manifest,
|
|
97
|
+
readonly (keyof Phases & string)[]
|
|
98
|
+
>["ids"]
|
|
99
|
+
>;
|
|
100
|
+
} {
|
|
101
|
+
validateStateSchemaIdBranding(definition.state.public, "public");
|
|
102
|
+
validateStateSchemaIdBranding(definition.state.private, "private");
|
|
103
|
+
validateStateSchemaIdBranding(definition.state.hidden, "hidden");
|
|
104
|
+
const phaseNames = Object.keys(definition.phases) as (keyof Phases &
|
|
105
|
+
string)[];
|
|
106
|
+
if (phaseNames.length === 0) {
|
|
107
|
+
throw new Error(
|
|
108
|
+
"defineGameContract: phases must be a non-empty record of phase schemas.",
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
for (const name of phaseNames) {
|
|
112
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
113
|
+
throw new Error(
|
|
114
|
+
"defineGameContract: phase names must be non-empty strings.",
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const phaseNameSchema = createManifestStringLiteralSchema(phaseNames);
|
|
119
|
+
const narrowedManifest = {
|
|
120
|
+
...definition.manifest,
|
|
121
|
+
literals: {
|
|
122
|
+
...definition.manifest.literals,
|
|
123
|
+
phaseNames,
|
|
124
|
+
},
|
|
125
|
+
ids: {
|
|
126
|
+
...definition.manifest.ids,
|
|
127
|
+
phaseName: phaseNameSchema,
|
|
128
|
+
},
|
|
129
|
+
} as unknown as NarrowManifestPhaseNames<
|
|
130
|
+
Manifest,
|
|
131
|
+
readonly (keyof Phases & string)[]
|
|
132
|
+
>;
|
|
133
|
+
const contract = {
|
|
134
|
+
manifest: narrowedManifest,
|
|
135
|
+
state: definition.state,
|
|
136
|
+
phases: definition.phases,
|
|
137
|
+
phaseNames,
|
|
138
|
+
schemas: narrowedManifest.ids,
|
|
139
|
+
} as ReducerGameContract<
|
|
140
|
+
Table,
|
|
141
|
+
NarrowManifestPhaseNames<Manifest, readonly (keyof Phases & string)[]>,
|
|
142
|
+
PublicSchema,
|
|
143
|
+
PrivateSchema,
|
|
144
|
+
HiddenSchema,
|
|
145
|
+
Phases
|
|
146
|
+
> & {
|
|
147
|
+
readonly phases: Phases;
|
|
148
|
+
readonly phaseNames: readonly (keyof Phases & string)[];
|
|
149
|
+
readonly schemas: ManifestIdSchemasOf<
|
|
150
|
+
NarrowManifestPhaseNames<
|
|
151
|
+
Manifest,
|
|
152
|
+
readonly (keyof Phases & string)[]
|
|
153
|
+
>["ids"]
|
|
154
|
+
>;
|
|
155
|
+
};
|
|
156
|
+
return contract;
|
|
157
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type {
|
|
3
|
+
AnySchema,
|
|
4
|
+
ContinuationCallable,
|
|
5
|
+
EffectRollDieDefinition,
|
|
6
|
+
EffectShuffleDefinition,
|
|
7
|
+
EffectShufflePlayerZoneDefinition,
|
|
8
|
+
ResumableEffectKind,
|
|
9
|
+
} from "../model";
|
|
10
|
+
import type {
|
|
11
|
+
AnyReducerGameContract,
|
|
12
|
+
ContractManifest,
|
|
13
|
+
ContractState,
|
|
14
|
+
} from "./types";
|
|
15
|
+
|
|
16
|
+
function createContinuationCallable<
|
|
17
|
+
DataSchema extends AnySchema,
|
|
18
|
+
ResponseSchema extends AnySchema,
|
|
19
|
+
State extends {
|
|
20
|
+
table: import("../model").RuntimeTableRecord;
|
|
21
|
+
flow: { currentPhase: string };
|
|
22
|
+
},
|
|
23
|
+
Manifest extends import("../model").ManifestContract<
|
|
24
|
+
import("../model").TableOfState<State>
|
|
25
|
+
>,
|
|
26
|
+
EffectType extends ResumableEffectKind = ResumableEffectKind,
|
|
27
|
+
>(definition: {
|
|
28
|
+
id: string;
|
|
29
|
+
data: DataSchema;
|
|
30
|
+
response: ResponseSchema;
|
|
31
|
+
effectKind?: EffectType;
|
|
32
|
+
reduce: ContinuationCallable<
|
|
33
|
+
DataSchema,
|
|
34
|
+
State,
|
|
35
|
+
Manifest,
|
|
36
|
+
string,
|
|
37
|
+
EffectType
|
|
38
|
+
>["reduce"];
|
|
39
|
+
}): ContinuationCallable<DataSchema, State, Manifest, string, EffectType> {
|
|
40
|
+
const continuation = ((data: z.infer<DataSchema>) => {
|
|
41
|
+
return {
|
|
42
|
+
id: continuation.id,
|
|
43
|
+
data,
|
|
44
|
+
};
|
|
45
|
+
}) as ContinuationCallable<DataSchema, State, Manifest, string, EffectType>;
|
|
46
|
+
continuation.id = definition.id;
|
|
47
|
+
continuation.source = "effect";
|
|
48
|
+
continuation.dataSchema = definition.data;
|
|
49
|
+
continuation.responseSchema = definition.response;
|
|
50
|
+
continuation.reduce = definition.reduce;
|
|
51
|
+
if (definition.effectKind !== undefined) {
|
|
52
|
+
continuation.effectKind = definition.effectKind;
|
|
53
|
+
}
|
|
54
|
+
return continuation;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// --- `defineEffect` ---
|
|
58
|
+
//
|
|
59
|
+
// Authoring factory for engine-side resumable effects (cues). An effect
|
|
60
|
+
// is the registered bundle of continuation callable + optional reduce,
|
|
61
|
+
// discriminated by `type` which aligns directly with `ResumableEffectKind`:
|
|
62
|
+
//
|
|
63
|
+
// defineEffect<GameContract>()({ type: "rollDie", id, context?, reduce? })
|
|
64
|
+
// defineEffect<GameContract>()({ type: "shuffleSharedZone", id, context?, reduce? })
|
|
65
|
+
//
|
|
66
|
+
// Authored effects are registered under `phase.effects` and invoked from
|
|
67
|
+
// a reducer via `fx.effect(effect, options)`. The wire protocol already
|
|
68
|
+
// isolates the continuation payload into the ingress bundle's
|
|
69
|
+
// `continuations` map keyed by `effectId`, so `fx.effect` never attaches
|
|
70
|
+
// `resume: undefined` to the wire effect.
|
|
71
|
+
//
|
|
72
|
+
// Addressed player requests are *not* effects. Author them as
|
|
73
|
+
// prompt-kind interactions via `defineInteraction({ kind: "prompt",
|
|
74
|
+
// to, options, ... })`.
|
|
75
|
+
|
|
76
|
+
type EffectRollDieInput<
|
|
77
|
+
Contract extends AnyReducerGameContract,
|
|
78
|
+
Id extends string,
|
|
79
|
+
ContextSchema extends AnySchema,
|
|
80
|
+
> = {
|
|
81
|
+
type: "rollDie";
|
|
82
|
+
id: Id;
|
|
83
|
+
context?: ContextSchema;
|
|
84
|
+
reduce?: ContinuationCallable<
|
|
85
|
+
ContextSchema,
|
|
86
|
+
ContractState<Contract>,
|
|
87
|
+
ContractManifest<Contract>,
|
|
88
|
+
Id,
|
|
89
|
+
"rollDie"
|
|
90
|
+
>["reduce"];
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
type EffectShuffleInput<
|
|
94
|
+
Contract extends AnyReducerGameContract,
|
|
95
|
+
Id extends string,
|
|
96
|
+
ContextSchema extends AnySchema,
|
|
97
|
+
> = {
|
|
98
|
+
type: "shuffleSharedZone";
|
|
99
|
+
id: Id;
|
|
100
|
+
context?: ContextSchema;
|
|
101
|
+
reduce?: ContinuationCallable<
|
|
102
|
+
ContextSchema,
|
|
103
|
+
ContractState<Contract>,
|
|
104
|
+
ContractManifest<Contract>,
|
|
105
|
+
Id,
|
|
106
|
+
"shuffleSharedZone"
|
|
107
|
+
>["reduce"];
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
type EffectShufflePlayerZoneInput<
|
|
111
|
+
Contract extends AnyReducerGameContract,
|
|
112
|
+
Id extends string,
|
|
113
|
+
ContextSchema extends AnySchema,
|
|
114
|
+
> = {
|
|
115
|
+
type: "shufflePlayerZone";
|
|
116
|
+
id: Id;
|
|
117
|
+
context?: ContextSchema;
|
|
118
|
+
reduce?: ContinuationCallable<
|
|
119
|
+
ContextSchema,
|
|
120
|
+
ContractState<Contract>,
|
|
121
|
+
ContractManifest<Contract>,
|
|
122
|
+
Id,
|
|
123
|
+
"shufflePlayerZone"
|
|
124
|
+
>["reduce"];
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export function defineEffect<Contract extends AnyReducerGameContract>() {
|
|
128
|
+
type EffectInput =
|
|
129
|
+
| EffectRollDieInput<Contract, string, AnySchema>
|
|
130
|
+
| EffectShuffleInput<Contract, string, AnySchema>
|
|
131
|
+
| EffectShufflePlayerZoneInput<Contract, string, AnySchema>;
|
|
132
|
+
type EffectOutput =
|
|
133
|
+
| EffectRollDieDefinition<
|
|
134
|
+
string,
|
|
135
|
+
AnySchema,
|
|
136
|
+
ContractState<Contract>,
|
|
137
|
+
ContractManifest<Contract>
|
|
138
|
+
>
|
|
139
|
+
| EffectShuffleDefinition<
|
|
140
|
+
string,
|
|
141
|
+
AnySchema,
|
|
142
|
+
ContractState<Contract>,
|
|
143
|
+
ContractManifest<Contract>
|
|
144
|
+
>
|
|
145
|
+
| EffectShufflePlayerZoneDefinition<
|
|
146
|
+
string,
|
|
147
|
+
AnySchema,
|
|
148
|
+
ContractState<Contract>,
|
|
149
|
+
ContractManifest<Contract>
|
|
150
|
+
>;
|
|
151
|
+
function effect<
|
|
152
|
+
Id extends string,
|
|
153
|
+
ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,
|
|
154
|
+
>(
|
|
155
|
+
definition: EffectRollDieInput<Contract, Id, ContextSchema>,
|
|
156
|
+
): EffectRollDieDefinition<
|
|
157
|
+
Id,
|
|
158
|
+
ContextSchema,
|
|
159
|
+
ContractState<Contract>,
|
|
160
|
+
ContractManifest<Contract>
|
|
161
|
+
>;
|
|
162
|
+
function effect<
|
|
163
|
+
Id extends string,
|
|
164
|
+
ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,
|
|
165
|
+
>(
|
|
166
|
+
definition: EffectShuffleInput<Contract, Id, ContextSchema>,
|
|
167
|
+
): EffectShuffleDefinition<
|
|
168
|
+
Id,
|
|
169
|
+
ContextSchema,
|
|
170
|
+
ContractState<Contract>,
|
|
171
|
+
ContractManifest<Contract>
|
|
172
|
+
>;
|
|
173
|
+
function effect<
|
|
174
|
+
Id extends string,
|
|
175
|
+
ContextSchema extends AnySchema = z.ZodObject<Record<string, never>>,
|
|
176
|
+
>(
|
|
177
|
+
definition: EffectShufflePlayerZoneInput<Contract, Id, ContextSchema>,
|
|
178
|
+
): EffectShufflePlayerZoneDefinition<
|
|
179
|
+
Id,
|
|
180
|
+
ContextSchema,
|
|
181
|
+
ContractState<Contract>,
|
|
182
|
+
ContractManifest<Contract>
|
|
183
|
+
>;
|
|
184
|
+
function effect(definition: EffectInput): EffectOutput {
|
|
185
|
+
if (
|
|
186
|
+
definition.type === "rollDie" ||
|
|
187
|
+
definition.type === "shuffleSharedZone" ||
|
|
188
|
+
definition.type === "shufflePlayerZone"
|
|
189
|
+
) {
|
|
190
|
+
const effectKind: ResumableEffectKind = definition.type;
|
|
191
|
+
if (!definition.reduce) {
|
|
192
|
+
return {
|
|
193
|
+
type: definition.type,
|
|
194
|
+
id: definition.id,
|
|
195
|
+
contextSchema: definition.context,
|
|
196
|
+
} as EffectOutput;
|
|
197
|
+
}
|
|
198
|
+
const contextSchema = (definition.context ?? z.object({})) as AnySchema;
|
|
199
|
+
const continuation = createContinuationCallable<
|
|
200
|
+
AnySchema,
|
|
201
|
+
AnySchema,
|
|
202
|
+
ContractState<Contract>,
|
|
203
|
+
ContractManifest<Contract>,
|
|
204
|
+
ResumableEffectKind
|
|
205
|
+
>({
|
|
206
|
+
id: definition.id,
|
|
207
|
+
data: contextSchema,
|
|
208
|
+
response: z.unknown() as AnySchema,
|
|
209
|
+
effectKind,
|
|
210
|
+
reduce: definition.reduce,
|
|
211
|
+
});
|
|
212
|
+
return {
|
|
213
|
+
type: definition.type,
|
|
214
|
+
id: definition.id,
|
|
215
|
+
contextSchema,
|
|
216
|
+
__continuation: continuation,
|
|
217
|
+
} as EffectOutput;
|
|
218
|
+
}
|
|
219
|
+
throw new Error(
|
|
220
|
+
`defineEffect: unknown effect definition. Expected type 'rollDie' | 'shuffleSharedZone' | 'shufflePlayerZone'. Addressed prompts are authored as prompt-kind interactions via defineInteraction({ kind: "prompt" }).`,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
return effect;
|
|
224
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { PhaseMapOf, ReducerGameDefinition, ViewMapOf } from "../model";
|
|
2
|
+
import type { AnyReducerGameContract } from "./types";
|
|
3
|
+
import {
|
|
4
|
+
validateDefineGamePhaseNames,
|
|
5
|
+
validateDefineGameSimultaneousPhases,
|
|
6
|
+
validateDefineGameZoneWiring,
|
|
7
|
+
} from "./validation";
|
|
8
|
+
|
|
9
|
+
export function defineGame<
|
|
10
|
+
const Contract extends AnyReducerGameContract,
|
|
11
|
+
Definitions extends PhaseMapOf<Contract>,
|
|
12
|
+
Views extends ViewMapOf<Contract> = Record<string, never>,
|
|
13
|
+
>(
|
|
14
|
+
definition: { contract: Contract } & Omit<
|
|
15
|
+
ReducerGameDefinition<NoInfer<Contract>, Definitions, Views>,
|
|
16
|
+
"contract"
|
|
17
|
+
>,
|
|
18
|
+
): ReducerGameDefinition<Contract, Definitions, Views> {
|
|
19
|
+
validateDefineGamePhaseNames(definition);
|
|
20
|
+
validateDefineGameSimultaneousPhases(definition);
|
|
21
|
+
validateDefineGameZoneWiring(definition);
|
|
22
|
+
return definition;
|
|
23
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CardActionSpec,
|
|
3
|
+
InputCollector,
|
|
4
|
+
InteractionRule,
|
|
5
|
+
InteractionSpec,
|
|
6
|
+
PlayerZoneIdOfManifest,
|
|
7
|
+
ScopedPhaseState,
|
|
8
|
+
} from "../model";
|
|
9
|
+
import type {
|
|
10
|
+
AnyReducerGameContract,
|
|
11
|
+
ContractManifest,
|
|
12
|
+
ContractState,
|
|
13
|
+
InferPhaseState,
|
|
14
|
+
PhaseStateInput,
|
|
15
|
+
} from "./types";
|
|
16
|
+
import { validateInteractionLikeDefinition } from "./validation";
|
|
17
|
+
|
|
18
|
+
export function defineInteraction<
|
|
19
|
+
Contract extends AnyReducerGameContract,
|
|
20
|
+
PhaseState extends PhaseStateInput = import("../model").SchemaLike<object>,
|
|
21
|
+
>() {
|
|
22
|
+
return <Collectors extends Record<string, InputCollector>>(
|
|
23
|
+
definition: InteractionSpec<
|
|
24
|
+
Collectors,
|
|
25
|
+
ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,
|
|
26
|
+
ContractManifest<Contract>
|
|
27
|
+
>,
|
|
28
|
+
): InteractionSpec<
|
|
29
|
+
Collectors,
|
|
30
|
+
ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,
|
|
31
|
+
ContractManifest<Contract>
|
|
32
|
+
> => {
|
|
33
|
+
validateInteractionLikeDefinition(
|
|
34
|
+
definition as {
|
|
35
|
+
inputs?: Record<string, InputCollector>;
|
|
36
|
+
commit?: { mode: string };
|
|
37
|
+
paramsSchema?: unknown;
|
|
38
|
+
},
|
|
39
|
+
"defineInteraction",
|
|
40
|
+
);
|
|
41
|
+
return definition;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function defineInteractionRule<
|
|
46
|
+
Contract extends AnyReducerGameContract,
|
|
47
|
+
PhaseState extends PhaseStateInput = import("../model").SchemaLike<object>,
|
|
48
|
+
>() {
|
|
49
|
+
return <
|
|
50
|
+
Collectors extends Record<string, InputCollector> = Record<
|
|
51
|
+
string,
|
|
52
|
+
InputCollector
|
|
53
|
+
>,
|
|
54
|
+
>(
|
|
55
|
+
definition: InteractionRule<
|
|
56
|
+
Collectors,
|
|
57
|
+
ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,
|
|
58
|
+
ContractManifest<Contract>
|
|
59
|
+
>,
|
|
60
|
+
): InteractionRule<
|
|
61
|
+
Collectors,
|
|
62
|
+
ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,
|
|
63
|
+
ContractManifest<Contract>
|
|
64
|
+
> => definition;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function defineCardAction<
|
|
68
|
+
Contract extends AnyReducerGameContract,
|
|
69
|
+
PhaseState extends PhaseStateInput,
|
|
70
|
+
>() {
|
|
71
|
+
return <
|
|
72
|
+
Collectors extends Record<string, InputCollector> = Record<string, never>,
|
|
73
|
+
const PlayFrom extends PlayerZoneIdOfManifest<ContractManifest<Contract>> =
|
|
74
|
+
PlayerZoneIdOfManifest<ContractManifest<Contract>>,
|
|
75
|
+
>(
|
|
76
|
+
definition: CardActionSpec<
|
|
77
|
+
Collectors,
|
|
78
|
+
ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,
|
|
79
|
+
ContractManifest<Contract>,
|
|
80
|
+
PlayFrom
|
|
81
|
+
>,
|
|
82
|
+
): CardActionSpec<
|
|
83
|
+
Collectors,
|
|
84
|
+
ScopedPhaseState<ContractState<Contract>, InferPhaseState<PhaseState>>,
|
|
85
|
+
ContractManifest<Contract>,
|
|
86
|
+
PlayFrom
|
|
87
|
+
> => {
|
|
88
|
+
validateInteractionLikeDefinition(
|
|
89
|
+
definition as {
|
|
90
|
+
inputs?: Record<string, InputCollector>;
|
|
91
|
+
commit?: { mode: string };
|
|
92
|
+
paramsSchema?: unknown;
|
|
93
|
+
},
|
|
94
|
+
"defineCardAction",
|
|
95
|
+
);
|
|
96
|
+
return definition;
|
|
97
|
+
};
|
|
98
|
+
}
|