@dreamboard-games/sdk 0.2.1-alpha.1 → 0.3.0-alpha.1
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/dist/{HandView-ncJIVLhN.d.ts → HandView-PYDmehVD.d.ts} +1 -1
- package/dist/{ResourceCounter-CTREyF73.d.ts → ResourceCounter-BTXklCEZ.d.ts} +1 -1
- package/dist/{ThemeProvider-BBMVT3KG.d.ts → ThemeProvider-DvMl17Ny.d.ts} +1 -1
- package/dist/{chunk-NKCRKGR2.js → chunk-3RQEICD3.js} +2 -2
- package/dist/{chunk-ZABVH7AO.js → chunk-ADYH6PVT.js} +1336 -1363
- package/dist/chunk-ADYH6PVT.js.map +1 -0
- package/dist/{chunk-PEI3FIL2.js → chunk-P7VMTJ5D.js} +2 -2
- package/dist/{chunk-PEI3FIL2.js.map → chunk-P7VMTJ5D.js.map} +1 -1
- package/dist/{chunk-WG4JQL3S.js → chunk-QZ6X4B5P.js} +1177 -1109
- package/dist/chunk-QZ6X4B5P.js.map +1 -0
- package/dist/{chunk-MZNVHMJ5.js → chunk-TXXLS3OI.js} +405 -309
- package/dist/chunk-TXXLS3OI.js.map +1 -0
- package/dist/{chunk-FDNZTDD6.js → chunk-W6SGFWXH.js} +48 -44
- package/dist/chunk-W6SGFWXH.js.map +1 -0
- package/dist/{chunk-MKXPVOUT.js → chunk-Y2AFYBMB.js} +48 -4
- package/dist/chunk-Y2AFYBMB.js.map +1 -0
- package/dist/{index-BwqPQtBu.d.ts → codegen.d.ts} +57 -565
- package/dist/{infrastructure/workspace-codegen.js → codegen.js} +3 -3
- package/dist/{components-BoiVSYqx.d.ts → components-DaIqi9QM.d.ts} +48 -37
- package/dist/{hex-board-view-1iAyJRFn.d.ts → hex-board-view-UCUjMALd.d.ts} +2 -2
- package/dist/{infrastructure/reducer-bundle-abi.d.ts → index.d-BGqVifr_.d.ts} +289 -10
- package/dist/index.js +1 -1
- package/dist/package-set.d.ts +2 -2
- package/dist/package-set.js +1 -1
- package/dist/primitive-props-BNHDkgd7.d.ts +16 -0
- package/dist/reducer-contract.d.ts +3 -0
- package/dist/{infrastructure/reducer-bundle-abi.js → reducer-contract.js} +4 -4
- package/dist/reducer.d.ts +185 -179
- package/dist/reducer.js +1363 -1372
- package/dist/reducer.js.map +1 -1
- package/dist/runtime/primitives.d.ts +9 -9
- package/dist/runtime/primitives.js +7 -7
- package/dist/runtime/runtime-api.d.ts +2 -0
- package/dist/runtime/runtime-api.js +1 -0
- package/dist/runtime/workspace-contract.d.ts +62 -17
- package/dist/runtime/workspace-contract.js +5 -6
- package/dist/{runtime-api-CPLm_XDG.d.ts → runtime-api-tGL3ArsB.d.ts} +103 -4
- package/dist/runtime.d.ts +11 -57
- package/dist/runtime.js +487 -8
- package/dist/runtime.js.map +1 -1
- package/dist/testing.d.ts +4 -4
- package/dist/testing.js.map +1 -1
- package/dist/types.d.ts +1531 -85
- package/dist/types.js +1 -3
- package/dist/types.js.map +1 -1
- package/dist/ui/components.d.ts +7 -8
- package/dist/ui/components.js +1 -1
- package/dist/ui/defaults.d.ts +1 -1
- package/dist/ui/{types/player-state.d.ts → player-state.d.ts} +2 -2
- package/dist/{ui-contract-rzKBwOLC.d.ts → ui-contract-SctM4ibF.d.ts} +155 -150
- package/dist/ui.d.ts +10 -11
- package/dist/ui.js +2 -2
- package/package.json +30 -75
- package/dist/bundle-CDd5FKeD.d.ts +0 -283
- package/dist/cards-Sl3b40Mv.d.ts +0 -13
- package/dist/chunk-326PGVAA.js +0 -34
- package/dist/chunk-326PGVAA.js.map +0 -1
- package/dist/chunk-FDNZTDD6.js.map +0 -1
- package/dist/chunk-I46YJSOD.js +0 -1
- package/dist/chunk-MKXPVOUT.js.map +0 -1
- package/dist/chunk-MZNVHMJ5.js.map +0 -1
- package/dist/chunk-T52J5RMF.js +0 -1
- package/dist/chunk-WG4JQL3S.js.map +0 -1
- package/dist/chunk-XV6D3ET4.js +0 -485
- package/dist/chunk-XV6D3ET4.js.map +0 -1
- package/dist/chunk-ZABVH7AO.js.map +0 -1
- package/dist/generated/runtime/primitives.d.ts +0 -13
- package/dist/generated/runtime/primitives.js +0 -181
- package/dist/generated/runtime/primitives.js.map +0 -1
- package/dist/generated/runtime-api.d.ts +0 -3
- package/dist/generated/runtime-api.js +0 -2
- package/dist/generated/runtime.d.ts +0 -15
- package/dist/generated/runtime.js +0 -19
- package/dist/generated/runtime.js.map +0 -1
- package/dist/generated/workspace-contract.d.ts +0 -15
- package/dist/generated/workspace-contract.js +0 -15
- package/dist/generated/workspace-contract.js.map +0 -1
- package/dist/infrastructure/reducer-bundle-abi.js.map +0 -1
- package/dist/infrastructure/workspace-codegen.d.ts +0 -53
- package/dist/infrastructure/workspace-codegen.js.map +0 -1
- package/dist/manifest-contract-BNHVGFtU.d.ts +0 -9
- package/dist/primitive-props-DpKs-GCr.d.ts +0 -11
- package/dist/runtime/types/runtime-api.d.ts +0 -1
- package/dist/runtime/types/runtime-api.js +0 -2
- package/dist/runtime/types/runtime-api.js.map +0 -1
- package/dist/runtime-api-3dshj6kK.d.ts +0 -101
- package/dist/slots-1GPGihk8.d.ts +0 -8
- package/src/browser-interaction/attributes.ts +0 -211
- package/src/browser-interaction/canonical.ts +0 -77
- package/src/browser-interaction/constants.ts +0 -77
- package/src/browser-interaction/effects.ts +0 -176
- package/src/browser-interaction/index.ts +0 -111
- package/src/browser-interaction/normalize.ts +0 -997
- package/src/browser-interaction/registry.ts +0 -70
- package/src/browser-interaction/resolve.ts +0 -596
- package/src/browser-interaction/schemas.ts +0 -152
- package/src/browser-interaction/types.ts +0 -304
- package/src/browser-interaction.ts +0 -1
- package/src/generated/reducer-contract/builders.ts +0 -90
- package/src/generated/reducer-contract/version.ts +0 -9
- package/src/generated/reducer-contract/wire.ts +0 -100
- package/src/generated/reducer-contract/zod.ts +0 -103
- package/src/generated/runtime/primitives.ts +0 -2
- package/src/generated/runtime-api.ts +0 -5
- package/src/generated/runtime.ts +0 -35
- package/src/generated/workspace-contract.ts +0 -2
- package/src/index.ts +0 -7
- package/src/infrastructure/reducer-bundle-abi.ts +0 -8
- package/src/infrastructure/reducer-contract/bundle.ts +0 -37
- package/src/infrastructure/workspace-codegen/hex-geometry.ts +0 -69
- package/src/infrastructure/workspace-codegen/index.ts +0 -64
- package/src/infrastructure/workspace-codegen/manifest-contract.ts +0 -6632
- package/src/infrastructure/workspace-codegen/manifest-validation.ts +0 -795
- package/src/infrastructure/workspace-codegen/ownership.ts +0 -131
- package/src/infrastructure/workspace-codegen/preset-card-sets.ts +0 -169
- package/src/infrastructure/workspace-codegen/seeds.ts +0 -1705
- package/src/infrastructure/workspace-codegen.ts +0 -1
- package/src/package-set.ts +0 -19
- package/src/reducer/authoring/contract.ts +0 -157
- package/src/reducer/authoring/effect.ts +0 -224
- package/src/reducer/authoring/game.ts +0 -23
- package/src/reducer/authoring/interaction.ts +0 -98
- package/src/reducer/authoring/phase.ts +0 -300
- package/src/reducer/authoring/types.ts +0 -70
- package/src/reducer/authoring/validation.ts +0 -382
- package/src/reducer/authoring/view-stage.ts +0 -68
- package/src/reducer/authoring.ts +0 -29
- package/src/reducer/bundle/ingress-bundle.ts +0 -491
- package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +0 -254
- package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +0 -73
- package/src/reducer/bundle/trusted/instruction-runner.ts +0 -414
- package/src/reducer/bundle/trusted/interaction-authorization.ts +0 -137
- package/src/reducer/bundle/trusted/interaction-collectors.ts +0 -859
- package/src/reducer/bundle/trusted/interaction-decision.ts +0 -747
- package/src/reducer/bundle/trusted/interaction-resolver.ts +0 -95
- package/src/reducer/bundle/trusted/interaction-types.ts +0 -174
- package/src/reducer/bundle/trusted/lifecycle-runner.ts +0 -427
- package/src/reducer/bundle/trusted/projection-builder.ts +0 -680
- package/src/reducer/bundle/trusted/projection-context.ts +0 -39
- package/src/reducer/bundle/trusted/rng-sampler.ts +0 -150
- package/src/reducer/bundle/trusted/runtime-registry.ts +0 -120
- package/src/reducer/bundle/trusted/runtime-scope.ts +0 -336
- package/src/reducer/bundle/trusted/simultaneous-player.ts +0 -97
- package/src/reducer/bundle/trusted/stage-resolver.ts +0 -87
- package/src/reducer/bundle/trusted/static-projection.ts +0 -116
- package/src/reducer/bundle/trusted/trusted-runtime-args.ts +0 -97
- package/src/reducer/bundle/trusted/trusted-runtime-result.ts +0 -39
- package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +0 -43
- package/src/reducer/bundle/trusted/trusted-state-codec.ts +0 -48
- package/src/reducer/bundle/trusted-bundle.ts +0 -97
- package/src/reducer/bundle/types.ts +0 -171
- package/src/reducer/bundle.ts +0 -2
- package/src/reducer/client-param-schemas.ts +0 -57
- package/src/reducer/compose.ts +0 -34
- package/src/reducer/core/runtime-input.ts +0 -30
- package/src/reducer/core/runtime-instruction.ts +0 -59
- package/src/reducer/core/types.ts +0 -62
- package/src/reducer/definition-index.ts +0 -277
- package/src/reducer/derived.ts +0 -106
- package/src/reducer/effects.ts +0 -92
- package/src/reducer/engine/runtime-instruction-engine.ts +0 -155
- package/src/reducer/ingress/decode-runtime-input.ts +0 -7
- package/src/reducer/ingress/decode-session-state.ts +0 -9
- package/src/reducer/ingress/encode-session-state.ts +0 -6
- package/src/reducer/ingress/input-codec.ts +0 -18
- package/src/reducer/ingress/phase-schemas.ts +0 -62
- package/src/reducer/ingress/raw-types.ts +0 -107
- package/src/reducer/ingress/runtime-codec.ts +0 -14
- package/src/reducer/ingress/runtime-payload.ts +0 -13
- package/src/reducer/ingress/session-codec.ts +0 -392
- package/src/reducer/ingress/types.ts +0 -6
- package/src/reducer/inputs/boardInput.ts +0 -217
- package/src/reducer/inputs/boardTarget.ts +0 -190
- package/src/reducer/inputs/cardInput.ts +0 -86
- package/src/reducer/inputs/cardTarget.ts +0 -101
- package/src/reducer/inputs/choiceTarget.ts +0 -104
- package/src/reducer/inputs/defineInputs.ts +0 -71
- package/src/reducer/inputs/formInput.ts +0 -809
- package/src/reducer/inputs/many.ts +0 -120
- package/src/reducer/inputs/promptInput.ts +0 -87
- package/src/reducer/inputs/rngInput.ts +0 -58
- package/src/reducer/inputs/targetRule.ts +0 -123
- package/src/reducer/inputs.ts +0 -41
- package/src/reducer/model/definition.ts +0 -1072
- package/src/reducer/model/extract.ts +0 -745
- package/src/reducer/model/manifest.ts +0 -570
- package/src/reducer/model/queries.ts +0 -641
- package/src/reducer/model/runtime.ts +0 -264
- package/src/reducer/model/spec.ts +0 -1386
- package/src/reducer/model/table.ts +0 -260
- package/src/reducer/model.ts +0 -7
- package/src/reducer/ops.ts +0 -1034
- package/src/reducer/parse-utils.ts +0 -28
- package/src/reducer/per-player.ts +0 -422
- package/src/reducer/rng.ts +0 -69
- package/src/reducer/schema-helpers.ts +0 -185
- package/src/reducer/setup-bootstrap-helpers.ts +0 -171
- package/src/reducer/setup-bootstrap.ts +0 -481
- package/src/reducer/table-ops.ts +0 -2671
- package/src/reducer/table-queries.ts +0 -372
- package/src/reducer/transaction.ts +0 -120
- package/src/reducer.ts +0 -314
- package/src/runtime/primitives.ts +0 -1
- package/src/runtime/types/runtime-api.ts +0 -1
- package/src/runtime/workspace-contract.ts +0 -32
- package/src/runtime-internal/components/InteractionForm.tsx +0 -1647
- package/src/runtime-internal/components/PluginRuntime.tsx +0 -105
- package/src/runtime-internal/components/board/target-layer.ts +0 -72
- package/src/runtime-internal/context/ClientParamSchemaContext.tsx +0 -44
- package/src/runtime-internal/context/InteractionDraftContext.tsx +0 -279
- package/src/runtime-internal/context/PluginSessionContext.tsx +0 -47
- package/src/runtime-internal/context/PluginStateContext.tsx +0 -303
- package/src/runtime-internal/context/RuntimeContext.tsx +0 -96
- package/src/runtime-internal/defaults/components.tsx +0 -409
- package/src/runtime-internal/defaults/index.ts +0 -11
- package/src/runtime-internal/errors/ValidationError.ts +0 -29
- package/src/runtime-internal/hooks/useActivePlayers.ts +0 -33
- package/src/runtime-internal/hooks/useBoardInteractions.ts +0 -727
- package/src/runtime-internal/hooks/useGameSelector.ts +0 -105
- package/src/runtime-internal/hooks/useGameView.ts +0 -9
- package/src/runtime-internal/hooks/useInteractionByKey.ts +0 -354
- package/src/runtime-internal/hooks/useInteractionHandle.ts +0 -438
- package/src/runtime-internal/hooks/useIsMyTurn.ts +0 -20
- package/src/runtime-internal/hooks/useLobby.ts +0 -76
- package/src/runtime-internal/hooks/useMe.ts +0 -48
- package/src/runtime-internal/hooks/usePlayerInfo.ts +0 -28
- package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +0 -23
- package/src/runtime-internal/hooks/usePluginRuntime.ts +0 -147
- package/src/runtime-internal/hooks/useSeatInbox.ts +0 -61
- package/src/runtime-internal/hooks/useSimultaneousPhase.ts +0 -10
- package/src/runtime-internal/index.ts +0 -42
- package/src/runtime-internal/internal.ts +0 -43
- package/src/runtime-internal/plugin-styles.css +0 -250
- package/src/runtime-internal/primitives/board.tsx +0 -530
- package/src/runtime-internal/primitives/dialog-lifecycle.ts +0 -58
- package/src/runtime-internal/primitives/dice.tsx +0 -79
- package/src/runtime-internal/primitives/game-ui-provider.tsx +0 -35
- package/src/runtime-internal/primitives/game.tsx +0 -387
- package/src/runtime-internal/primitives/hand-intent-adapter.ts +0 -147
- package/src/runtime-internal/primitives/hand-surface.tsx +0 -594
- package/src/runtime-internal/primitives/index.ts +0 -196
- package/src/runtime-internal/primitives/interaction-form-binding.tsx +0 -56
- package/src/runtime-internal/primitives/interaction-submit.ts +0 -90
- package/src/runtime-internal/primitives/interaction.tsx +0 -1146
- package/src/runtime-internal/primitives/phase.tsx +0 -43
- package/src/runtime-internal/primitives/player-roster.tsx +0 -302
- package/src/runtime-internal/primitives/primitive-props.tsx +0 -101
- package/src/runtime-internal/primitives/prompt.tsx +0 -255
- package/src/runtime-internal/primitives/ui.tsx +0 -60
- package/src/runtime-internal/primitives/zone.tsx +0 -791
- package/src/runtime-internal/reducer.ts +0 -30
- package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +0 -605
- package/src/runtime-internal/types/plugin-state.ts +0 -514
- package/src/runtime-internal/types/reducer-state.ts +0 -24
- package/src/runtime-internal/types/runtime-api.ts +0 -114
- package/src/runtime-internal/ui-contract.ts +0 -519
- package/src/runtime-internal/utils/browser-interaction-effects.ts +0 -240
- package/src/runtime-internal/utils/card-intent-adapter.ts +0 -546
- package/src/runtime-internal/utils/interaction-draft-digest.ts +0 -252
- package/src/runtime-internal/utils/interaction-inputs.ts +0 -492
- package/src/runtime-internal/utils/interaction-labels.ts +0 -23
- package/src/runtime-internal/utils/interaction-router.ts +0 -273
- package/src/runtime-internal/utils/interaction-status.ts +0 -74
- package/src/runtime-internal/utils/semantic-projection-digest.ts +0 -407
- package/src/runtime-internal/workspace-contract.ts +0 -1170
- package/src/runtime.ts +0 -34
- package/src/testing/create-expect-api.ts +0 -352
- package/src/testing/create-test-runtime.ts +0 -381
- package/src/testing/definitions.ts +0 -127
- package/src/testing/index.ts +0 -3
- package/src/testing.ts +0 -1
- package/src/type-stubs/manifest-contract.d.ts +0 -42
- package/src/type-stubs/manifest-contract.js +0 -72
- package/src/type-stubs/ui-contract.d.ts +0 -5
- package/src/type-stubs/ui-contract.js +0 -1
- package/src/types/authoring-card-properties.type-test.ts +0 -266
- package/src/types/authoring.ts +0 -1282
- package/src/types/cards.ts +0 -19
- package/src/types/contracts.ts +0 -1550
- package/src/types/generated-helpers.ts +0 -35
- package/src/types/index.ts +0 -147
- package/src/types/slots.ts +0 -11
- package/src/types.ts +0 -1
- package/src/ui/components/ActionButton.tsx +0 -97
- package/src/ui/components/ActionPanel.tsx +0 -315
- package/src/ui/components/Card.tsx +0 -378
- package/src/ui/components/CardDragSurface.tsx +0 -1076
- package/src/ui/components/ChromeSuppressionContext.tsx +0 -70
- package/src/ui/components/CostDisplay.tsx +0 -145
- package/src/ui/components/DiceRoller.tsx +0 -581
- package/src/ui/components/Drawer.tsx +0 -180
- package/src/ui/components/ErrorBoundary.tsx +0 -275
- package/src/ui/components/GameEndDisplay.tsx +0 -398
- package/src/ui/components/GameSkeleton.tsx +0 -260
- package/src/ui/components/Hand.tsx +0 -468
- package/src/ui/components/HandDock.tsx +0 -299
- package/src/ui/components/HandView.tsx +0 -441
- package/src/ui/components/MobileHandTray.tsx +0 -381
- package/src/ui/components/MoreActions.tsx +0 -143
- package/src/ui/components/PhaseIndicator.tsx +0 -341
- package/src/ui/components/PlayArea.tsx +0 -146
- package/src/ui/components/PrimaryActionButton.tsx +0 -336
- package/src/ui/components/PrimaryButton.tsx +0 -45
- package/src/ui/components/ResourceCounter.tsx +0 -270
- package/src/ui/components/StagingZone.tsx +0 -134
- package/src/ui/components/ThemedButton.tsx +0 -113
- package/src/ui/components/Toast.tsx +0 -264
- package/src/ui/components/board/HexGrid.tsx +0 -1297
- package/src/ui/components/board/NetworkGraph.tsx +0 -476
- package/src/ui/components/board/SlotSystem.tsx +0 -388
- package/src/ui/components/board/SquareGrid.tsx +0 -1165
- package/src/ui/components/board/TrackBoard.tsx +0 -496
- package/src/ui/components/board/ZoneMap.tsx +0 -448
- package/src/ui/components/board/hex-board-view.ts +0 -123
- package/src/ui/components/board/index.ts +0 -142
- package/src/ui/components/board/interaction-accessibility.ts +0 -21
- package/src/ui/components/board/target-layer.ts +0 -67
- package/src/ui/components/card-render-content.type-test.ts +0 -27
- package/src/ui/components/hand-layout-math.ts +0 -163
- package/src/ui/components/hand-pointer-engine.ts +0 -413
- package/src/ui/components/index.ts +0 -245
- package/src/ui/components.ts +0 -1
- package/src/ui/defaults/components.tsx +0 -106
- package/src/ui/defaults/index.ts +0 -8
- package/src/ui/defaults.ts +0 -1
- package/src/ui/errors/ValidationError.ts +0 -29
- package/src/ui/helpers/cards.ts +0 -19
- package/src/ui/helpers/track-board.ts +0 -211
- package/src/ui/hooks/useBoardTopology.ts +0 -316
- package/src/ui/hooks/useCards.ts +0 -10
- package/src/ui/hooks/useHandCardPointer.ts +0 -381
- package/src/ui/hooks/useHandLayout.ts +0 -378
- package/src/ui/hooks/useHandPresentation.ts +0 -121
- package/src/ui/hooks/useHexBoard.ts +0 -74
- package/src/ui/hooks/useHexGrid.ts +0 -185
- package/src/ui/hooks/useIsMobile.ts +0 -35
- package/src/ui/hooks/usePanZoom.ts +0 -278
- package/src/ui/hooks/useSquareBoard.ts +0 -124
- package/src/ui/hooks/useSquareGrid.ts +0 -328
- package/src/ui/index.ts +0 -98
- package/src/ui/internal/ui/alert.tsx +0 -51
- package/src/ui/internal/ui/button.tsx +0 -58
- package/src/ui/internal/ui/dialog.tsx +0 -134
- package/src/ui/internal/ui/input.tsx +0 -21
- package/src/ui/internal/ui/label.tsx +0 -21
- package/src/ui/internal/ui/select.tsx +0 -129
- package/src/ui/internal/ui/tooltip.tsx +0 -54
- package/src/ui/internal/ui/utils.ts +0 -5
- package/src/ui/plugin-styles.css +0 -250
- package/src/ui/primitives/dialog-lifecycle.ts +0 -58
- package/src/ui/primitives/dice.tsx +0 -79
- package/src/ui/primitives/primitive-props.tsx +0 -101
- package/src/ui/theme/ThemeProvider.tsx +0 -252
- package/src/ui/theme/board.ts +0 -61
- package/src/ui/theme/css-vars.ts +0 -105
- package/src/ui/theme/derive.ts +0 -240
- package/src/ui/theme/index.ts +0 -61
- package/src/ui/theme/presets/arcade.ts +0 -261
- package/src/ui/theme/presets/studio.ts +0 -261
- package/src/ui/theme/presets/tabletop.ts +0 -266
- package/src/ui/theme/tokens.ts +0 -392
- package/src/ui/types/hex-color.ts +0 -20
- package/src/ui/types/player-state.ts +0 -463
- package/src/ui/types/tiled-board.ts +0 -785
- package/src/ui/types/visual-state.ts +0 -137
- package/src/ui.ts +0 -1
- /package/dist/{chunk-NKCRKGR2.js.map → chunk-3RQEICD3.js.map} +0 -0
- /package/dist/{chunk-I46YJSOD.js.map → codegen.js.map} +0 -0
- /package/dist/{chunk-T52J5RMF.js.map → reducer-contract.js.map} +0 -0
- /package/dist/{generated → runtime}/runtime-api.js.map +0 -0
- /package/dist/ui/{types/player-state.js → player-state.js} +0 -0
- /package/dist/ui/{types/player-state.js.map → player-state.js.map} +0 -0
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { collectReducerDefinitionIndex } from "./definition-index";
|
|
3
|
-
import type {
|
|
4
|
-
InputCollector,
|
|
5
|
-
PhaseMapOf,
|
|
6
|
-
ReducerGameContractLike,
|
|
7
|
-
ReducerGameDefinition,
|
|
8
|
-
ViewMapOf,
|
|
9
|
-
} from "./model";
|
|
10
|
-
|
|
11
|
-
export type ClientParamSchema = {
|
|
12
|
-
safeParse: (value: unknown) =>
|
|
13
|
-
| { success: true; data: Record<string, unknown> }
|
|
14
|
-
| {
|
|
15
|
-
success: false;
|
|
16
|
-
error: { issues: Array<{ path: PropertyKey[]; message: string }> };
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export type ClientParamSchemasByPhase = Readonly<
|
|
21
|
-
Record<string, Readonly<Record<string, ClientParamSchema>>>
|
|
22
|
-
>;
|
|
23
|
-
|
|
24
|
-
function schemaForCollectors(
|
|
25
|
-
collectors: Record<string, InputCollector>,
|
|
26
|
-
): ClientParamSchema {
|
|
27
|
-
const shape: Record<string, z.ZodTypeAny> = {};
|
|
28
|
-
for (const [key, collector] of Object.entries(collectors)) {
|
|
29
|
-
if (collector.kind === "rng") continue;
|
|
30
|
-
const schema = collector.schema as z.ZodTypeAny;
|
|
31
|
-
shape[key] =
|
|
32
|
-
"defaultValue" in collector
|
|
33
|
-
? schema.default(collector.defaultValue)
|
|
34
|
-
: schema;
|
|
35
|
-
}
|
|
36
|
-
return z.object(shape) as unknown as ClientParamSchema;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function createClientParamSchemasByPhase<
|
|
40
|
-
Contract extends ReducerGameContractLike,
|
|
41
|
-
Definitions extends PhaseMapOf<Contract>,
|
|
42
|
-
Views extends ViewMapOf<Contract>,
|
|
43
|
-
>(
|
|
44
|
-
definition: ReducerGameDefinition<Contract, Definitions, Views>,
|
|
45
|
-
): ClientParamSchemasByPhase {
|
|
46
|
-
const index = collectReducerDefinitionIndex(definition);
|
|
47
|
-
const out: Record<string, Record<string, ClientParamSchema>> = {};
|
|
48
|
-
for (const phaseIndex of index.phasesByName.values()) {
|
|
49
|
-
const phaseSchemas: Record<string, ClientParamSchema> = {};
|
|
50
|
-
for (const [id, interaction] of phaseIndex.interactions) {
|
|
51
|
-
phaseSchemas[id] =
|
|
52
|
-
interaction.paramsSchema ?? schemaForCollectors(interaction.inputs);
|
|
53
|
-
}
|
|
54
|
-
out[String(phaseIndex.phaseName)] = phaseSchemas;
|
|
55
|
-
}
|
|
56
|
-
return out;
|
|
57
|
-
}
|
package/src/reducer/compose.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* State composition primitives.
|
|
3
|
-
*
|
|
4
|
-
* `pipe` threads a seed state through a sequence of `State -> State`
|
|
5
|
-
* transformations, left to right. It is the preferred way to compose curried
|
|
6
|
-
* writers (the `ops.*` namespace) in reducers:
|
|
7
|
-
*
|
|
8
|
-
* return accept(
|
|
9
|
-
* pipe(state,
|
|
10
|
-
* ops.spendPlayerResources({ playerId, resources: cost }),
|
|
11
|
-
* ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),
|
|
12
|
-
* ),
|
|
13
|
-
* );
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* A state-preserving transformation.
|
|
17
|
-
*
|
|
18
|
-
* `Op<State>` is polymorphic in the exact input subtype — given a state `S`
|
|
19
|
-
* that extends `State`, it returns the same `S`. This lets curried writers
|
|
20
|
-
* from `ops.*` and author-written helpers thread through phase-scoped `pipe`
|
|
21
|
-
* calls without losing the narrowed phase state type.
|
|
22
|
-
*/
|
|
23
|
-
export type Op<State> = <S extends State>(state: S) => S;
|
|
24
|
-
|
|
25
|
-
export function pipe<State>(
|
|
26
|
-
state: State,
|
|
27
|
-
...ops: ReadonlyArray<Op<NoInfer<State>>>
|
|
28
|
-
): State {
|
|
29
|
-
let result = state;
|
|
30
|
-
for (const op of ops) {
|
|
31
|
-
result = op(result);
|
|
32
|
-
}
|
|
33
|
-
return result;
|
|
34
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { RuntimePayload } from "../model";
|
|
2
|
-
|
|
3
|
-
export type TrustedInteractionInput<PlayerId extends string> = {
|
|
4
|
-
// Canonical single-kind player-originated input. `interactionId` addresses
|
|
5
|
-
// either an ordinary action or an addressed prompt; the trusted bundle
|
|
6
|
-
// disambiguates from the interaction spec.
|
|
7
|
-
kind: "interaction";
|
|
8
|
-
playerId: PlayerId;
|
|
9
|
-
interactionId: string;
|
|
10
|
-
params: RuntimePayload;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export type TrustedContinuationInput = {
|
|
14
|
-
// Engine-internal input produced by resolved runtime instructions
|
|
15
|
-
// (e.g. after fx.rollDie) to route a typed continuation back through reduce.
|
|
16
|
-
// External clients never send this kind.
|
|
17
|
-
kind: "continuation";
|
|
18
|
-
continuationId: string;
|
|
19
|
-
resumeData: RuntimePayload;
|
|
20
|
-
source: "effect";
|
|
21
|
-
effectKind: "rollDie" | "shuffleSharedZone" | "shufflePlayerZone";
|
|
22
|
-
response: RuntimePayload;
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
export type TrustedRuntimeInput<PlayerId extends string> =
|
|
26
|
-
| TrustedInteractionInput<PlayerId>
|
|
27
|
-
| TrustedContinuationInput;
|
|
28
|
-
|
|
29
|
-
export type DecodedReducerInput<PlayerId extends string> =
|
|
30
|
-
TrustedRuntimeInput<PlayerId>;
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
DeckIdOfState,
|
|
3
|
-
PhaseNameOfState,
|
|
4
|
-
PlayerIdOfState,
|
|
5
|
-
PlayerZoneIdOfState,
|
|
6
|
-
} from "../model/extract";
|
|
7
|
-
import type { AnyContinuationToken } from "../model/runtime";
|
|
8
|
-
|
|
9
|
-
export type FlowInstruction<PhaseName extends string> = {
|
|
10
|
-
kind: "flow.transition";
|
|
11
|
-
to: PhaseName;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export type EngineRollDieInstruction = {
|
|
15
|
-
kind: "engine.rollDie";
|
|
16
|
-
dieId: string;
|
|
17
|
-
continuation?: AnyContinuationToken;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export type EngineShuffleSharedZoneInstruction<DeckId extends string> = {
|
|
21
|
-
kind: "engine.shuffleSharedZone";
|
|
22
|
-
zoneId: DeckId;
|
|
23
|
-
continuation?: AnyContinuationToken;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
export type EngineShufflePlayerZoneInstruction<
|
|
27
|
-
PlayerZoneId extends string,
|
|
28
|
-
PlayerId extends string,
|
|
29
|
-
> = {
|
|
30
|
-
kind: "engine.shufflePlayerZone";
|
|
31
|
-
zoneId: PlayerZoneId;
|
|
32
|
-
playerId: PlayerId;
|
|
33
|
-
continuation?: AnyContinuationToken;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
export type EngineInstruction<
|
|
37
|
-
DeckId extends string,
|
|
38
|
-
PlayerZoneId extends string = string,
|
|
39
|
-
PlayerId extends string = string,
|
|
40
|
-
> =
|
|
41
|
-
| EngineRollDieInstruction
|
|
42
|
-
| EngineShuffleSharedZoneInstruction<DeckId>
|
|
43
|
-
| EngineShufflePlayerZoneInstruction<PlayerZoneId, PlayerId>;
|
|
44
|
-
|
|
45
|
-
export type RuntimeInstruction<
|
|
46
|
-
PhaseName extends string,
|
|
47
|
-
DeckId extends string,
|
|
48
|
-
PlayerZoneId extends string = string,
|
|
49
|
-
PlayerId extends string = string,
|
|
50
|
-
> =
|
|
51
|
-
| FlowInstruction<PhaseName>
|
|
52
|
-
| EngineInstruction<DeckId, PlayerZoneId, PlayerId>;
|
|
53
|
-
|
|
54
|
-
export type RuntimeInstructionForState<State> = RuntimeInstruction<
|
|
55
|
-
PhaseNameOfState<State>,
|
|
56
|
-
DeckIdOfState<State>,
|
|
57
|
-
PlayerZoneIdOfState<State>,
|
|
58
|
-
PlayerIdOfState<State>
|
|
59
|
-
>;
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { RuntimeInstructionForState } from "./runtime-instruction";
|
|
2
|
-
import type { TrustedRuntimeInput } from "./runtime-input";
|
|
3
|
-
|
|
4
|
-
export type DispatchTraceEntry<
|
|
5
|
-
State,
|
|
6
|
-
PlayerId extends string = string,
|
|
7
|
-
Input extends TrustedRuntimeInput<PlayerId> = TrustedRuntimeInput<PlayerId>,
|
|
8
|
-
> =
|
|
9
|
-
| {
|
|
10
|
-
type: "acceptedClientInput";
|
|
11
|
-
input: Input;
|
|
12
|
-
}
|
|
13
|
-
| {
|
|
14
|
-
type: "appliedInstruction";
|
|
15
|
-
instruction: RuntimeInstructionForState<State>;
|
|
16
|
-
}
|
|
17
|
-
| {
|
|
18
|
-
type: "rngConsumption";
|
|
19
|
-
operation: string;
|
|
20
|
-
traceEntry: string;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export type TrustedReducerDispatchResult<State, PlayerId extends string> =
|
|
24
|
-
| {
|
|
25
|
-
type: "reject";
|
|
26
|
-
errorCode: string;
|
|
27
|
-
message?: string;
|
|
28
|
-
}
|
|
29
|
-
| {
|
|
30
|
-
type: "accept";
|
|
31
|
-
state: State;
|
|
32
|
-
trace: DispatchTraceEntry<State, PlayerId>[];
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export type TrustedInstructionResolutionResult<
|
|
36
|
-
State,
|
|
37
|
-
PlayerId extends string,
|
|
38
|
-
Input extends TrustedRuntimeInput<PlayerId> = TrustedRuntimeInput<PlayerId>,
|
|
39
|
-
> = {
|
|
40
|
-
state: State;
|
|
41
|
-
queuedInputs: Input[];
|
|
42
|
-
queuedInstructions: RuntimeInstructionForState<State>[];
|
|
43
|
-
trace: DispatchTraceEntry<State, PlayerId, Input>[];
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export type TrustedReducerEngine<State, PlayerId extends string> = {
|
|
47
|
-
dispatch: (
|
|
48
|
-
state: State,
|
|
49
|
-
input: TrustedRuntimeInput<PlayerId>,
|
|
50
|
-
) => TrustedReducerDispatchResult<State, PlayerId>;
|
|
51
|
-
drainInstructions: (
|
|
52
|
-
state: State,
|
|
53
|
-
instructions: RuntimeInstructionForState<State>[],
|
|
54
|
-
) => State;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
export type {
|
|
58
|
-
DecodedReducerInput,
|
|
59
|
-
TrustedContinuationInput,
|
|
60
|
-
TrustedInteractionInput,
|
|
61
|
-
TrustedRuntimeInput,
|
|
62
|
-
} from "./runtime-input";
|
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
import { cardInput } from "./inputs/cardInput";
|
|
2
|
-
import { cardTarget } from "./inputs/cardTarget";
|
|
3
|
-
import type {
|
|
4
|
-
AnyCardActionSpec,
|
|
5
|
-
AnyContinuationCallable,
|
|
6
|
-
AnyInteractionSpec,
|
|
7
|
-
BaseGameStateOfContract,
|
|
8
|
-
EffectMap,
|
|
9
|
-
InputCollector,
|
|
10
|
-
InteractionMap,
|
|
11
|
-
ManifestContractOf,
|
|
12
|
-
PhaseDefinition,
|
|
13
|
-
PhaseMapOf,
|
|
14
|
-
PhaseNamesOfDefinition,
|
|
15
|
-
ReducerGameContractLike,
|
|
16
|
-
ReducerGameDefinition,
|
|
17
|
-
SchemaLike,
|
|
18
|
-
StageMap,
|
|
19
|
-
StageSpec,
|
|
20
|
-
ViewMapOf,
|
|
21
|
-
PhaseZoneList,
|
|
22
|
-
PlayerZoneIdOfManifest,
|
|
23
|
-
} from "./model";
|
|
24
|
-
|
|
25
|
-
export type ReducerIndexedPhase<Contract extends ReducerGameContractLike> =
|
|
26
|
-
PhaseDefinition<
|
|
27
|
-
SchemaLike<object>,
|
|
28
|
-
BaseGameStateOfContract<Contract>,
|
|
29
|
-
ManifestContractOf<Contract>,
|
|
30
|
-
Record<string, InputCollector>,
|
|
31
|
-
EffectMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,
|
|
32
|
-
InteractionMap<
|
|
33
|
-
BaseGameStateOfContract<Contract>,
|
|
34
|
-
ManifestContractOf<Contract>
|
|
35
|
-
>,
|
|
36
|
-
StageMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,
|
|
37
|
-
PhaseZoneList<ManifestContractOf<Contract>>
|
|
38
|
-
>;
|
|
39
|
-
|
|
40
|
-
export type ReducerIndexedInteractionEntry<
|
|
41
|
-
Contract extends ReducerGameContractLike,
|
|
42
|
-
> = readonly [
|
|
43
|
-
string,
|
|
44
|
-
AnyInteractionSpec<
|
|
45
|
-
BaseGameStateOfContract<Contract>,
|
|
46
|
-
ManifestContractOf<Contract>
|
|
47
|
-
>,
|
|
48
|
-
];
|
|
49
|
-
|
|
50
|
-
export type ReducerIndexedStageEntry<Contract extends ReducerGameContractLike> =
|
|
51
|
-
readonly [
|
|
52
|
-
string,
|
|
53
|
-
StageSpec<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,
|
|
54
|
-
];
|
|
55
|
-
|
|
56
|
-
export type ReducerIndexedZoneEntry<Contract extends ReducerGameContractLike> =
|
|
57
|
-
PlayerZoneIdOfManifest<ManifestContractOf<Contract>>;
|
|
58
|
-
|
|
59
|
-
export type ReducerIndexedCardActionEntry<
|
|
60
|
-
Contract extends ReducerGameContractLike,
|
|
61
|
-
> = readonly [
|
|
62
|
-
string,
|
|
63
|
-
AnyCardActionSpec<
|
|
64
|
-
BaseGameStateOfContract<Contract>,
|
|
65
|
-
ManifestContractOf<Contract>
|
|
66
|
-
>,
|
|
67
|
-
];
|
|
68
|
-
|
|
69
|
-
export type ReducerIndexedEffectEntry<
|
|
70
|
-
Contract extends ReducerGameContractLike,
|
|
71
|
-
> = readonly [
|
|
72
|
-
string,
|
|
73
|
-
{
|
|
74
|
-
readonly id: string;
|
|
75
|
-
readonly type: string;
|
|
76
|
-
readonly continuation?: AnyContinuationCallable<
|
|
77
|
-
BaseGameStateOfContract<Contract>
|
|
78
|
-
> & {
|
|
79
|
-
readonly id?: string;
|
|
80
|
-
};
|
|
81
|
-
},
|
|
82
|
-
];
|
|
83
|
-
|
|
84
|
-
export interface ReducerDefinitionPhaseIndex<
|
|
85
|
-
Contract extends ReducerGameContractLike,
|
|
86
|
-
Definitions extends PhaseMapOf<Contract>,
|
|
87
|
-
Views extends ViewMapOf<Contract>,
|
|
88
|
-
> {
|
|
89
|
-
readonly phaseName: PhaseNamesOfDefinition<
|
|
90
|
-
ReducerGameDefinition<Contract, Definitions, Views>
|
|
91
|
-
>;
|
|
92
|
-
readonly phase: ReducerIndexedPhase<Contract>;
|
|
93
|
-
readonly interactions: ReadonlyArray<
|
|
94
|
-
ReducerIndexedInteractionEntry<Contract>
|
|
95
|
-
>;
|
|
96
|
-
readonly stages: ReadonlyArray<ReducerIndexedStageEntry<Contract>>;
|
|
97
|
-
readonly zones: ReadonlyArray<ReducerIndexedZoneEntry<Contract>>;
|
|
98
|
-
readonly cardActions: ReadonlyArray<ReducerIndexedCardActionEntry<Contract>>;
|
|
99
|
-
readonly effects: ReadonlyArray<ReducerIndexedEffectEntry<Contract>>;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export interface ReducerDefinitionIndex<
|
|
103
|
-
Contract extends ReducerGameContractLike,
|
|
104
|
-
Definitions extends PhaseMapOf<Contract>,
|
|
105
|
-
Views extends ViewMapOf<Contract>,
|
|
106
|
-
> {
|
|
107
|
-
readonly phaseEntries: ReadonlyArray<
|
|
108
|
-
readonly [
|
|
109
|
-
PhaseNamesOfDefinition<
|
|
110
|
-
ReducerGameDefinition<Contract, Definitions, Views>
|
|
111
|
-
>,
|
|
112
|
-
ReducerIndexedPhase<Contract>,
|
|
113
|
-
]
|
|
114
|
-
>;
|
|
115
|
-
readonly phasesByName: ReadonlyMap<
|
|
116
|
-
PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,
|
|
117
|
-
ReducerDefinitionPhaseIndex<Contract, Definitions, Views>
|
|
118
|
-
>;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
type RawEffectEntry<Contract extends ReducerGameContractLike> = readonly [
|
|
122
|
-
string,
|
|
123
|
-
{
|
|
124
|
-
id?: string;
|
|
125
|
-
type?: string;
|
|
126
|
-
__continuation?: AnyContinuationCallable<
|
|
127
|
-
BaseGameStateOfContract<Contract>
|
|
128
|
-
> & {
|
|
129
|
-
id?: string;
|
|
130
|
-
};
|
|
131
|
-
},
|
|
132
|
-
];
|
|
133
|
-
|
|
134
|
-
function phaseEntriesOf<
|
|
135
|
-
Contract extends ReducerGameContractLike,
|
|
136
|
-
Definitions extends PhaseMapOf<Contract>,
|
|
137
|
-
Views extends ViewMapOf<Contract>,
|
|
138
|
-
>(
|
|
139
|
-
definition: ReducerGameDefinition<Contract, Definitions, Views>,
|
|
140
|
-
): Array<
|
|
141
|
-
readonly [
|
|
142
|
-
PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,
|
|
143
|
-
ReducerIndexedPhase<Contract>,
|
|
144
|
-
]
|
|
145
|
-
> {
|
|
146
|
-
type PhaseName = PhaseNamesOfDefinition<
|
|
147
|
-
ReducerGameDefinition<Contract, Definitions, Views>
|
|
148
|
-
>;
|
|
149
|
-
return Object.entries(definition.phases) as unknown as Array<
|
|
150
|
-
readonly [PhaseName, ReducerIndexedPhase<Contract>]
|
|
151
|
-
>;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function interactionEntriesOf<Contract extends ReducerGameContractLike>(
|
|
155
|
-
phase: ReducerIndexedPhase<Contract>,
|
|
156
|
-
): Array<ReducerIndexedInteractionEntry<Contract>> {
|
|
157
|
-
return Object.entries(
|
|
158
|
-
(phase as { interactions?: Record<string, unknown> }).interactions ?? {},
|
|
159
|
-
) as Array<ReducerIndexedInteractionEntry<Contract>>;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function simultaneousSubmitEntriesOf<Contract extends ReducerGameContractLike>(
|
|
163
|
-
phase: ReducerIndexedPhase<Contract>,
|
|
164
|
-
): Array<ReducerIndexedInteractionEntry<Contract>> {
|
|
165
|
-
const submit = (phase as { submit?: unknown }).submit;
|
|
166
|
-
if (!submit) return [];
|
|
167
|
-
return [
|
|
168
|
-
["submit", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,
|
|
169
|
-
];
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function cardActionEntriesOf<Contract extends ReducerGameContractLike>(
|
|
173
|
-
phase: ReducerIndexedPhase<Contract>,
|
|
174
|
-
): Array<ReducerIndexedCardActionEntry<Contract>> {
|
|
175
|
-
return Object.entries(
|
|
176
|
-
(phase as { cardActions?: Record<string, unknown> }).cardActions ?? {},
|
|
177
|
-
) as Array<ReducerIndexedCardActionEntry<Contract>>;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function stageEntriesOf<Contract extends ReducerGameContractLike>(
|
|
181
|
-
phase: ReducerIndexedPhase<Contract>,
|
|
182
|
-
): Array<ReducerIndexedStageEntry<Contract>> {
|
|
183
|
-
return Object.entries(
|
|
184
|
-
(phase as { stages?: Record<string, unknown> }).stages ?? {},
|
|
185
|
-
) as Array<ReducerIndexedStageEntry<Contract>>;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function zoneEntriesOf<Contract extends ReducerGameContractLike>(
|
|
189
|
-
phase: ReducerIndexedPhase<Contract>,
|
|
190
|
-
): Array<ReducerIndexedZoneEntry<Contract>> {
|
|
191
|
-
return Array.from(
|
|
192
|
-
(phase as { zones?: readonly unknown[] }).zones ?? [],
|
|
193
|
-
) as Array<ReducerIndexedZoneEntry<Contract>>;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function effectEntriesOf<Contract extends ReducerGameContractLike>(
|
|
197
|
-
phase: ReducerIndexedPhase<Contract>,
|
|
198
|
-
): Array<RawEffectEntry<Contract>> {
|
|
199
|
-
return Object.entries(
|
|
200
|
-
(phase as { effects?: Record<string, unknown> }).effects ?? {},
|
|
201
|
-
) as Array<RawEffectEntry<Contract>>;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export function collectReducerDefinitionIndex<
|
|
205
|
-
Contract extends ReducerGameContractLike,
|
|
206
|
-
Definitions extends PhaseMapOf<Contract>,
|
|
207
|
-
Views extends ViewMapOf<Contract>,
|
|
208
|
-
>(
|
|
209
|
-
definition: ReducerGameDefinition<Contract, Definitions, Views>,
|
|
210
|
-
): ReducerDefinitionIndex<Contract, Definitions, Views> {
|
|
211
|
-
type State = BaseGameStateOfContract<Contract>;
|
|
212
|
-
type Manifest = ManifestContractOf<Contract>;
|
|
213
|
-
type PhaseName = PhaseNamesOfDefinition<
|
|
214
|
-
ReducerGameDefinition<Contract, Definitions, Views>
|
|
215
|
-
>;
|
|
216
|
-
|
|
217
|
-
const phaseEntries = phaseEntriesOf(definition);
|
|
218
|
-
const phasesByName = new Map<
|
|
219
|
-
PhaseName,
|
|
220
|
-
ReducerDefinitionPhaseIndex<Contract, Definitions, Views>
|
|
221
|
-
>();
|
|
222
|
-
|
|
223
|
-
for (const [phaseName, phase] of phaseEntries) {
|
|
224
|
-
const interactionEntries = [
|
|
225
|
-
...interactionEntriesOf(phase),
|
|
226
|
-
...simultaneousSubmitEntriesOf(phase),
|
|
227
|
-
];
|
|
228
|
-
const cardActionEntries: Array<ReducerIndexedInteractionEntry<Contract>> =
|
|
229
|
-
cardActionEntriesOf(phase).map(([cardActionId, cardAction]) => [
|
|
230
|
-
cardActionId,
|
|
231
|
-
{
|
|
232
|
-
...cardAction,
|
|
233
|
-
__steps: cardAction.__steps,
|
|
234
|
-
inputs: {
|
|
235
|
-
cardId: cardInput<State>({
|
|
236
|
-
target: cardTarget
|
|
237
|
-
.zones<State>([cardAction.playFrom])
|
|
238
|
-
.where({
|
|
239
|
-
id: "card-type",
|
|
240
|
-
errorCode: "WRONG_CARD_TYPE",
|
|
241
|
-
message: `Card must be ${cardAction.cardType}.`,
|
|
242
|
-
test: ({ q, targetId }) =>
|
|
243
|
-
q.card.get(targetId).cardType === cardAction.cardType,
|
|
244
|
-
})
|
|
245
|
-
.build(),
|
|
246
|
-
}),
|
|
247
|
-
...(cardAction.inputs ?? {}),
|
|
248
|
-
},
|
|
249
|
-
} satisfies AnyInteractionSpec<State, Manifest>,
|
|
250
|
-
]);
|
|
251
|
-
const effects: Array<ReducerIndexedEffectEntry<Contract>> = effectEntriesOf(
|
|
252
|
-
phase,
|
|
253
|
-
).map(([effectKey, effectValue]) => [
|
|
254
|
-
effectKey,
|
|
255
|
-
{
|
|
256
|
-
id: effectValue.id ?? effectKey,
|
|
257
|
-
type: effectValue.type ?? "rollDie",
|
|
258
|
-
continuation: effectValue.__continuation,
|
|
259
|
-
},
|
|
260
|
-
]);
|
|
261
|
-
|
|
262
|
-
phasesByName.set(phaseName, {
|
|
263
|
-
phaseName,
|
|
264
|
-
phase,
|
|
265
|
-
interactions: [...interactionEntries, ...cardActionEntries],
|
|
266
|
-
stages: stageEntriesOf(phase),
|
|
267
|
-
zones: zoneEntriesOf(phase),
|
|
268
|
-
cardActions: cardActionEntriesOf(phase),
|
|
269
|
-
effects,
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
phaseEntries,
|
|
275
|
-
phasesByName,
|
|
276
|
-
};
|
|
277
|
-
}
|
package/src/reducer/derived.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import type { RuntimeTableRecord } from "./model/table";
|
|
2
|
-
import type { TableQueriesOfState } from "./model/queries";
|
|
3
|
-
import type { BaseGameStateOfContract } from "./model/definition";
|
|
4
|
-
import { createStateQueries } from "./table-queries";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A freestanding, memoized projection of immutable game state.
|
|
8
|
-
*
|
|
9
|
-
* Use `defineDerived` for values that are pure functions of component
|
|
10
|
-
* locations, zone contents, resources, or other state fields - and are
|
|
11
|
-
* consumed from multiple reducer or view call sites, or whose compute cost
|
|
12
|
-
* is non-trivial (graph walks, aggregate reductions).
|
|
13
|
-
*
|
|
14
|
-
* Do NOT cache derived values in `publicState`. State fields should be
|
|
15
|
-
* inputs to derivations, not mirrors of them.
|
|
16
|
-
*/
|
|
17
|
-
export type DerivedDefinition<Contract, Value> = {
|
|
18
|
-
/** Optional label for debugging. Does not affect caching. */
|
|
19
|
-
readonly name?: string;
|
|
20
|
-
readonly compute: (ctx: {
|
|
21
|
-
readonly state: BaseGameStateOfContract<Contract>;
|
|
22
|
-
readonly q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;
|
|
23
|
-
readonly derived: DerivedResolver;
|
|
24
|
-
}) => Value;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Resolves a `DerivedDefinition` to its value. Callers do not need to know
|
|
29
|
-
* about memoization - the resolver handles caching internally.
|
|
30
|
-
*/
|
|
31
|
-
export type DerivedResolver = <Value>(
|
|
32
|
-
def: DerivedDefinition<never, Value>,
|
|
33
|
-
) => Value;
|
|
34
|
-
|
|
35
|
-
type AnyDerivedDefinition = DerivedDefinition<unknown, unknown>;
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Author-facing factory for creating a derived value tied to a game
|
|
39
|
-
* contract. Usage:
|
|
40
|
-
*
|
|
41
|
-
* ```ts
|
|
42
|
-
* export const longestRoad = defineDerived<GameContract>()({
|
|
43
|
-
* name: "longestRoad",
|
|
44
|
-
* compute: ({ q, derived }) => computeLongestRoad(q),
|
|
45
|
-
* });
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
export function defineDerived<Contract>() {
|
|
49
|
-
return <Value>(def: {
|
|
50
|
-
name?: string;
|
|
51
|
-
compute: (ctx: {
|
|
52
|
-
state: BaseGameStateOfContract<Contract>;
|
|
53
|
-
q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;
|
|
54
|
-
derived: DerivedResolver;
|
|
55
|
-
}) => Value;
|
|
56
|
-
}): DerivedDefinition<Contract, Value> => def;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Creates a resolver scoped to a single state snapshot. Each engine tick
|
|
61
|
-
* and each view projection call creates its own resolver; cache lifetime
|
|
62
|
-
* ends with the call. Cache key is the `DerivedDefinition` identity (the
|
|
63
|
-
* object reference).
|
|
64
|
-
*
|
|
65
|
-
* Re-entry on an in-flight definition throws a readable error.
|
|
66
|
-
*/
|
|
67
|
-
export function createDerivedResolver<
|
|
68
|
-
State extends { table: RuntimeTableRecord },
|
|
69
|
-
>(
|
|
70
|
-
state: State,
|
|
71
|
-
options: { q?: TableQueriesOfState<State> } = {},
|
|
72
|
-
): DerivedResolver {
|
|
73
|
-
const cache = new Map<AnyDerivedDefinition, unknown>();
|
|
74
|
-
const inflight = new Set<AnyDerivedDefinition>();
|
|
75
|
-
const q = options.q ?? createStateQueries(state);
|
|
76
|
-
|
|
77
|
-
const resolver: DerivedResolver = <Value>(
|
|
78
|
-
def: DerivedDefinition<never, Value>,
|
|
79
|
-
): Value => {
|
|
80
|
-
const typedDef = def as unknown as AnyDerivedDefinition;
|
|
81
|
-
if (cache.has(typedDef)) {
|
|
82
|
-
return cache.get(typedDef) as Value;
|
|
83
|
-
}
|
|
84
|
-
if (inflight.has(typedDef)) {
|
|
85
|
-
throw new Error(
|
|
86
|
-
`Cyclic derived: '${def.name ?? "<anonymous>"}' depends on itself.`,
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
inflight.add(typedDef);
|
|
90
|
-
try {
|
|
91
|
-
const value = (
|
|
92
|
-
def.compute as unknown as (ctx: {
|
|
93
|
-
state: unknown;
|
|
94
|
-
q: unknown;
|
|
95
|
-
derived: DerivedResolver;
|
|
96
|
-
}) => Value
|
|
97
|
-
)({ state, q, derived: resolver });
|
|
98
|
-
cache.set(typedDef, value);
|
|
99
|
-
return value;
|
|
100
|
-
} finally {
|
|
101
|
-
inflight.delete(typedDef);
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
return resolver;
|
|
106
|
-
}
|