@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.
Files changed (369) hide show
  1. package/LICENSE.md +96 -0
  2. package/README.md +12 -0
  3. package/dist/HandView-ncJIVLhN.d.ts +193 -0
  4. package/dist/ResourceCounter-CTREyF73.d.ts +102 -0
  5. package/dist/ThemeProvider-fy0_QzgO.d.ts +99 -0
  6. package/dist/bundle-TIZcw8LB.d.ts +281 -0
  7. package/dist/cards-Sl3b40Mv.d.ts +13 -0
  8. package/dist/chunk-7YAHLYBR.js +481 -0
  9. package/dist/chunk-7YAHLYBR.js.map +1 -0
  10. package/dist/chunk-FDNZTDD6.js +8085 -0
  11. package/dist/chunk-FDNZTDD6.js.map +1 -0
  12. package/dist/chunk-GKKBPPSW.js +598 -0
  13. package/dist/chunk-GKKBPPSW.js.map +1 -0
  14. package/dist/chunk-I46YJSOD.js +1 -0
  15. package/dist/chunk-I46YJSOD.js.map +1 -0
  16. package/dist/chunk-KAELH4KC.js +104 -0
  17. package/dist/chunk-KAELH4KC.js.map +1 -0
  18. package/dist/chunk-PZ5AY32C.js +10 -0
  19. package/dist/chunk-PZ5AY32C.js.map +1 -0
  20. package/dist/chunk-T3ZKNUZ7.js +1 -0
  21. package/dist/chunk-T3ZKNUZ7.js.map +1 -0
  22. package/dist/chunk-T52J5RMF.js +1 -0
  23. package/dist/chunk-T52J5RMF.js.map +1 -0
  24. package/dist/chunk-TDSWKVZ4.js +5401 -0
  25. package/dist/chunk-TDSWKVZ4.js.map +1 -0
  26. package/dist/chunk-U5C6BONG.js +34 -0
  27. package/dist/chunk-U5C6BONG.js.map +1 -0
  28. package/dist/chunk-VDXOF4FW.js +69 -0
  29. package/dist/chunk-VDXOF4FW.js.map +1 -0
  30. package/dist/chunk-VFTAA4WO.js +115 -0
  31. package/dist/chunk-VFTAA4WO.js.map +1 -0
  32. package/dist/chunk-WN74KVNY.js +17 -0
  33. package/dist/chunk-WN74KVNY.js.map +1 -0
  34. package/dist/chunk-WYPQ3GG5.js +10990 -0
  35. package/dist/chunk-WYPQ3GG5.js.map +1 -0
  36. package/dist/components-D5ZRE2Hl.d.ts +1451 -0
  37. package/dist/generated/runtime/primitives.d.ts +12 -0
  38. package/dist/generated/runtime/primitives.js +180 -0
  39. package/dist/generated/runtime/primitives.js.map +1 -0
  40. package/dist/generated/runtime-api.d.ts +3 -0
  41. package/dist/generated/runtime-api.js +2 -0
  42. package/dist/generated/runtime-api.js.map +1 -0
  43. package/dist/generated/runtime.d.ts +14 -0
  44. package/dist/generated/runtime.js +18 -0
  45. package/dist/generated/runtime.js.map +1 -0
  46. package/dist/generated/workspace-contract.d.ts +14 -0
  47. package/dist/generated/workspace-contract.js +14 -0
  48. package/dist/generated/workspace-contract.js.map +1 -0
  49. package/dist/hex-board-view-D_07hO6O.d.ts +933 -0
  50. package/dist/hex-color-MhOyuY-o.d.ts +8 -0
  51. package/dist/index-BwqPQtBu.d.ts +1433 -0
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.js +12 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/infrastructure/reducer-bundle-abi.d.ts +1083 -0
  56. package/dist/infrastructure/reducer-bundle-abi.js +14 -0
  57. package/dist/infrastructure/reducer-bundle-abi.js.map +1 -0
  58. package/dist/infrastructure/workspace-codegen.d.ts +53 -0
  59. package/dist/infrastructure/workspace-codegen.js +44 -0
  60. package/dist/infrastructure/workspace-codegen.js.map +1 -0
  61. package/dist/manifest-contract-BNHVGFtU.d.ts +9 -0
  62. package/dist/package-set.d.ts +13 -0
  63. package/dist/package-set.js +12 -0
  64. package/dist/package-set.js.map +1 -0
  65. package/dist/primitive-props-DpKs-GCr.d.ts +11 -0
  66. package/dist/reducer.d.ts +3786 -0
  67. package/dist/reducer.js +8131 -0
  68. package/dist/reducer.js.map +1 -0
  69. package/dist/runtime/primitives.d.ts +226 -0
  70. package/dist/runtime/primitives.js +180 -0
  71. package/dist/runtime/primitives.js.map +1 -0
  72. package/dist/runtime/types/runtime-api.d.ts +1 -0
  73. package/dist/runtime/types/runtime-api.js +2 -0
  74. package/dist/runtime/types/runtime-api.js.map +1 -0
  75. package/dist/runtime/workspace-contract.d.ts +172 -0
  76. package/dist/runtime/workspace-contract.js +14 -0
  77. package/dist/runtime/workspace-contract.js.map +1 -0
  78. package/dist/runtime-api-3dshj6kK.d.ts +101 -0
  79. package/dist/runtime-api-DWxvTr-O.d.ts +379 -0
  80. package/dist/runtime.d.ts +58 -0
  81. package/dist/runtime.js +13 -0
  82. package/dist/runtime.js.map +1 -0
  83. package/dist/slots-1GPGihk8.d.ts +8 -0
  84. package/dist/testing.d.ts +149 -0
  85. package/dist/testing.js +513 -0
  86. package/dist/testing.js.map +1 -0
  87. package/dist/types.d.ts +496 -0
  88. package/dist/types.js +28 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui/components.d.ts +16 -0
  91. package/dist/ui/components.js +192 -0
  92. package/dist/ui/components.js.map +1 -0
  93. package/dist/ui/defaults.d.ts +19 -0
  94. package/dist/ui/defaults.js +104 -0
  95. package/dist/ui/defaults.js.map +1 -0
  96. package/dist/ui/plugin-styles.css +250 -0
  97. package/dist/ui/types/player-state.d.ts +365 -0
  98. package/dist/ui/types/player-state.js +1 -0
  99. package/dist/ui/types/player-state.js.map +1 -0
  100. package/dist/ui-contract-iQfTtUSL.d.ts +1161 -0
  101. package/dist/ui.d.ts +320 -0
  102. package/dist/ui.js +253 -0
  103. package/dist/ui.js.map +1 -0
  104. package/package.json +199 -0
  105. package/src/generated/reducer-contract/builders.ts +90 -0
  106. package/src/generated/reducer-contract/version.ts +9 -0
  107. package/src/generated/reducer-contract/wire.ts +100 -0
  108. package/src/generated/reducer-contract/zod.ts +101 -0
  109. package/src/generated/runtime/primitives.ts +2 -0
  110. package/src/generated/runtime-api.ts +5 -0
  111. package/src/generated/runtime.ts +35 -0
  112. package/src/generated/workspace-contract.ts +2 -0
  113. package/src/index.ts +7 -0
  114. package/src/infrastructure/reducer-bundle-abi.ts +8 -0
  115. package/src/infrastructure/reducer-contract/bundle.ts +37 -0
  116. package/src/infrastructure/workspace-codegen/hex-geometry.ts +69 -0
  117. package/src/infrastructure/workspace-codegen/index.ts +64 -0
  118. package/src/infrastructure/workspace-codegen/manifest-contract.ts +6632 -0
  119. package/src/infrastructure/workspace-codegen/manifest-validation.ts +795 -0
  120. package/src/infrastructure/workspace-codegen/ownership.ts +131 -0
  121. package/src/infrastructure/workspace-codegen/preset-card-sets.ts +169 -0
  122. package/src/infrastructure/workspace-codegen/seeds.ts +1705 -0
  123. package/src/infrastructure/workspace-codegen.ts +1 -0
  124. package/src/package-set.ts +19 -0
  125. package/src/reducer/authoring/contract.ts +157 -0
  126. package/src/reducer/authoring/effect.ts +224 -0
  127. package/src/reducer/authoring/game.ts +23 -0
  128. package/src/reducer/authoring/interaction.ts +98 -0
  129. package/src/reducer/authoring/phase.ts +300 -0
  130. package/src/reducer/authoring/types.ts +70 -0
  131. package/src/reducer/authoring/validation.ts +382 -0
  132. package/src/reducer/authoring/view-stage.ts +68 -0
  133. package/src/reducer/authoring.ts +29 -0
  134. package/src/reducer/bundle/ingress-bundle.ts +491 -0
  135. package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +254 -0
  136. package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +73 -0
  137. package/src/reducer/bundle/trusted/instruction-runner.ts +414 -0
  138. package/src/reducer/bundle/trusted/interaction-authorization.ts +137 -0
  139. package/src/reducer/bundle/trusted/interaction-collectors.ts +859 -0
  140. package/src/reducer/bundle/trusted/interaction-decision.ts +747 -0
  141. package/src/reducer/bundle/trusted/interaction-resolver.ts +95 -0
  142. package/src/reducer/bundle/trusted/interaction-types.ts +171 -0
  143. package/src/reducer/bundle/trusted/lifecycle-runner.ts +427 -0
  144. package/src/reducer/bundle/trusted/projection-builder.ts +356 -0
  145. package/src/reducer/bundle/trusted/projection-context.ts +39 -0
  146. package/src/reducer/bundle/trusted/rng-sampler.ts +150 -0
  147. package/src/reducer/bundle/trusted/runtime-registry.ts +120 -0
  148. package/src/reducer/bundle/trusted/runtime-scope.ts +336 -0
  149. package/src/reducer/bundle/trusted/simultaneous-player.ts +97 -0
  150. package/src/reducer/bundle/trusted/stage-resolver.ts +87 -0
  151. package/src/reducer/bundle/trusted/static-projection.ts +116 -0
  152. package/src/reducer/bundle/trusted/trusted-runtime-args.ts +97 -0
  153. package/src/reducer/bundle/trusted/trusted-runtime-result.ts +39 -0
  154. package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +43 -0
  155. package/src/reducer/bundle/trusted/trusted-state-codec.ts +48 -0
  156. package/src/reducer/bundle/trusted-bundle.ts +97 -0
  157. package/src/reducer/bundle/types.ts +171 -0
  158. package/src/reducer/bundle.ts +2 -0
  159. package/src/reducer/client-param-schemas.ts +57 -0
  160. package/src/reducer/compose.ts +34 -0
  161. package/src/reducer/core/runtime-input.ts +30 -0
  162. package/src/reducer/core/runtime-instruction.ts +59 -0
  163. package/src/reducer/core/types.ts +62 -0
  164. package/src/reducer/definition-index.ts +277 -0
  165. package/src/reducer/derived.ts +106 -0
  166. package/src/reducer/effects.ts +92 -0
  167. package/src/reducer/engine/runtime-instruction-engine.ts +155 -0
  168. package/src/reducer/ingress/decode-runtime-input.ts +7 -0
  169. package/src/reducer/ingress/decode-session-state.ts +9 -0
  170. package/src/reducer/ingress/encode-session-state.ts +6 -0
  171. package/src/reducer/ingress/input-codec.ts +18 -0
  172. package/src/reducer/ingress/phase-schemas.ts +62 -0
  173. package/src/reducer/ingress/raw-types.ts +107 -0
  174. package/src/reducer/ingress/runtime-codec.ts +14 -0
  175. package/src/reducer/ingress/runtime-payload.ts +13 -0
  176. package/src/reducer/ingress/session-codec.ts +392 -0
  177. package/src/reducer/ingress/types.ts +6 -0
  178. package/src/reducer/inputs/boardInput.ts +217 -0
  179. package/src/reducer/inputs/boardTarget.ts +190 -0
  180. package/src/reducer/inputs/cardInput.ts +86 -0
  181. package/src/reducer/inputs/cardTarget.ts +101 -0
  182. package/src/reducer/inputs/choiceTarget.ts +104 -0
  183. package/src/reducer/inputs/defineInputs.ts +71 -0
  184. package/src/reducer/inputs/formInput.ts +809 -0
  185. package/src/reducer/inputs/many.ts +120 -0
  186. package/src/reducer/inputs/promptInput.ts +87 -0
  187. package/src/reducer/inputs/rngInput.ts +58 -0
  188. package/src/reducer/inputs/targetRule.ts +123 -0
  189. package/src/reducer/inputs.ts +41 -0
  190. package/src/reducer/model/definition.ts +1072 -0
  191. package/src/reducer/model/extract.ts +745 -0
  192. package/src/reducer/model/manifest.ts +570 -0
  193. package/src/reducer/model/queries.ts +641 -0
  194. package/src/reducer/model/runtime.ts +264 -0
  195. package/src/reducer/model/spec.ts +1386 -0
  196. package/src/reducer/model/table.ts +260 -0
  197. package/src/reducer/model.ts +7 -0
  198. package/src/reducer/ops.ts +1034 -0
  199. package/src/reducer/parse-utils.ts +28 -0
  200. package/src/reducer/per-player.ts +422 -0
  201. package/src/reducer/rng.ts +69 -0
  202. package/src/reducer/schema-helpers.ts +185 -0
  203. package/src/reducer/setup-bootstrap-helpers.ts +171 -0
  204. package/src/reducer/setup-bootstrap.ts +481 -0
  205. package/src/reducer/table-ops.ts +2671 -0
  206. package/src/reducer/table-queries.ts +372 -0
  207. package/src/reducer/transaction.ts +120 -0
  208. package/src/reducer.ts +314 -0
  209. package/src/runtime/primitives.ts +1 -0
  210. package/src/runtime/types/runtime-api.ts +1 -0
  211. package/src/runtime/workspace-contract.ts +32 -0
  212. package/src/runtime-internal/components/InteractionForm.tsx +1309 -0
  213. package/src/runtime-internal/components/PluginRuntime.tsx +103 -0
  214. package/src/runtime-internal/components/board/target-layer.ts +70 -0
  215. package/src/runtime-internal/context/ClientParamSchemaContext.tsx +44 -0
  216. package/src/runtime-internal/context/InteractionDraftContext.tsx +279 -0
  217. package/src/runtime-internal/context/PluginSessionContext.tsx +47 -0
  218. package/src/runtime-internal/context/PluginStateContext.tsx +262 -0
  219. package/src/runtime-internal/context/RuntimeContext.tsx +96 -0
  220. package/src/runtime-internal/defaults/components.tsx +409 -0
  221. package/src/runtime-internal/defaults/index.ts +11 -0
  222. package/src/runtime-internal/errors/ValidationError.ts +29 -0
  223. package/src/runtime-internal/hooks/useActivePlayers.ts +33 -0
  224. package/src/runtime-internal/hooks/useBoardInteractions.ts +665 -0
  225. package/src/runtime-internal/hooks/useGameSelector.ts +105 -0
  226. package/src/runtime-internal/hooks/useGameView.ts +9 -0
  227. package/src/runtime-internal/hooks/useInteractionByKey.ts +354 -0
  228. package/src/runtime-internal/hooks/useInteractionHandle.ts +438 -0
  229. package/src/runtime-internal/hooks/useIsMyTurn.ts +20 -0
  230. package/src/runtime-internal/hooks/useLobby.ts +76 -0
  231. package/src/runtime-internal/hooks/useMe.ts +48 -0
  232. package/src/runtime-internal/hooks/usePlayerInfo.ts +28 -0
  233. package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +23 -0
  234. package/src/runtime-internal/hooks/usePluginRuntime.ts +147 -0
  235. package/src/runtime-internal/hooks/useSeatInbox.ts +61 -0
  236. package/src/runtime-internal/hooks/useSimultaneousPhase.ts +10 -0
  237. package/src/runtime-internal/index.ts +42 -0
  238. package/src/runtime-internal/internal.ts +43 -0
  239. package/src/runtime-internal/plugin-styles.css +250 -0
  240. package/src/runtime-internal/primitives/board.tsx +459 -0
  241. package/src/runtime-internal/primitives/dialog-lifecycle.ts +58 -0
  242. package/src/runtime-internal/primitives/dice.tsx +79 -0
  243. package/src/runtime-internal/primitives/game-ui-provider.tsx +35 -0
  244. package/src/runtime-internal/primitives/game.tsx +387 -0
  245. package/src/runtime-internal/primitives/hand-intent-adapter.ts +147 -0
  246. package/src/runtime-internal/primitives/hand-surface.tsx +594 -0
  247. package/src/runtime-internal/primitives/index.ts +196 -0
  248. package/src/runtime-internal/primitives/interaction-form-binding.tsx +56 -0
  249. package/src/runtime-internal/primitives/interaction-submit.ts +90 -0
  250. package/src/runtime-internal/primitives/interaction.tsx +987 -0
  251. package/src/runtime-internal/primitives/phase.tsx +43 -0
  252. package/src/runtime-internal/primitives/player-roster.tsx +302 -0
  253. package/src/runtime-internal/primitives/primitive-props.tsx +101 -0
  254. package/src/runtime-internal/primitives/prompt.tsx +255 -0
  255. package/src/runtime-internal/primitives/ui.tsx +60 -0
  256. package/src/runtime-internal/primitives/zone.tsx +791 -0
  257. package/src/runtime-internal/reducer.ts +30 -0
  258. package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +605 -0
  259. package/src/runtime-internal/types/plugin-state.ts +508 -0
  260. package/src/runtime-internal/types/reducer-state.ts +24 -0
  261. package/src/runtime-internal/types/runtime-api.ts +114 -0
  262. package/src/runtime-internal/ui-contract.ts +519 -0
  263. package/src/runtime-internal/utils/card-intent-adapter.ts +546 -0
  264. package/src/runtime-internal/utils/interaction-inputs.ts +492 -0
  265. package/src/runtime-internal/utils/interaction-labels.ts +23 -0
  266. package/src/runtime-internal/utils/interaction-router.ts +273 -0
  267. package/src/runtime-internal/utils/interaction-status.ts +74 -0
  268. package/src/runtime-internal/workspace-contract.ts +1170 -0
  269. package/src/runtime.ts +34 -0
  270. package/src/testing/create-expect-api.ts +352 -0
  271. package/src/testing/create-test-runtime.ts +381 -0
  272. package/src/testing/definitions.ts +127 -0
  273. package/src/testing/index.ts +3 -0
  274. package/src/testing.ts +1 -0
  275. package/src/type-stubs/manifest-contract.d.ts +42 -0
  276. package/src/type-stubs/manifest-contract.js +72 -0
  277. package/src/type-stubs/ui-contract.d.ts +5 -0
  278. package/src/type-stubs/ui-contract.js +1 -0
  279. package/src/types/authoring-card-properties.type-test.ts +266 -0
  280. package/src/types/authoring.ts +1282 -0
  281. package/src/types/cards.ts +19 -0
  282. package/src/types/contracts.ts +1550 -0
  283. package/src/types/generated-helpers.ts +35 -0
  284. package/src/types/index.ts +147 -0
  285. package/src/types/slots.ts +11 -0
  286. package/src/types.ts +1 -0
  287. package/src/ui/components/ActionButton.tsx +97 -0
  288. package/src/ui/components/ActionPanel.tsx +315 -0
  289. package/src/ui/components/Card.tsx +378 -0
  290. package/src/ui/components/CardDragSurface.tsx +1076 -0
  291. package/src/ui/components/ChromeSuppressionContext.tsx +70 -0
  292. package/src/ui/components/CostDisplay.tsx +145 -0
  293. package/src/ui/components/DiceRoller.tsx +581 -0
  294. package/src/ui/components/Drawer.tsx +180 -0
  295. package/src/ui/components/ErrorBoundary.tsx +275 -0
  296. package/src/ui/components/GameEndDisplay.tsx +398 -0
  297. package/src/ui/components/GameSkeleton.tsx +260 -0
  298. package/src/ui/components/Hand.tsx +468 -0
  299. package/src/ui/components/HandDock.tsx +299 -0
  300. package/src/ui/components/HandView.tsx +441 -0
  301. package/src/ui/components/MobileHandTray.tsx +381 -0
  302. package/src/ui/components/MoreActions.tsx +143 -0
  303. package/src/ui/components/PhaseIndicator.tsx +341 -0
  304. package/src/ui/components/PlayArea.tsx +146 -0
  305. package/src/ui/components/PrimaryActionButton.tsx +336 -0
  306. package/src/ui/components/PrimaryButton.tsx +45 -0
  307. package/src/ui/components/ResourceCounter.tsx +270 -0
  308. package/src/ui/components/StagingZone.tsx +134 -0
  309. package/src/ui/components/ThemedButton.tsx +113 -0
  310. package/src/ui/components/Toast.tsx +264 -0
  311. package/src/ui/components/board/HexGrid.tsx +1294 -0
  312. package/src/ui/components/board/NetworkGraph.tsx +476 -0
  313. package/src/ui/components/board/SlotSystem.tsx +388 -0
  314. package/src/ui/components/board/SquareGrid.tsx +1165 -0
  315. package/src/ui/components/board/TrackBoard.tsx +496 -0
  316. package/src/ui/components/board/ZoneMap.tsx +448 -0
  317. package/src/ui/components/board/hex-board-view.ts +123 -0
  318. package/src/ui/components/board/index.ts +142 -0
  319. package/src/ui/components/board/interaction-accessibility.ts +21 -0
  320. package/src/ui/components/board/target-layer.ts +66 -0
  321. package/src/ui/components/card-render-content.type-test.ts +27 -0
  322. package/src/ui/components/hand-layout-math.ts +163 -0
  323. package/src/ui/components/hand-pointer-engine.ts +413 -0
  324. package/src/ui/components/index.ts +245 -0
  325. package/src/ui/components.ts +1 -0
  326. package/src/ui/defaults/components.tsx +106 -0
  327. package/src/ui/defaults/index.ts +8 -0
  328. package/src/ui/defaults.ts +1 -0
  329. package/src/ui/errors/ValidationError.ts +29 -0
  330. package/src/ui/helpers/cards.ts +19 -0
  331. package/src/ui/helpers/track-board.ts +211 -0
  332. package/src/ui/hooks/useBoardTopology.ts +316 -0
  333. package/src/ui/hooks/useCards.ts +10 -0
  334. package/src/ui/hooks/useHandCardPointer.ts +381 -0
  335. package/src/ui/hooks/useHandLayout.ts +378 -0
  336. package/src/ui/hooks/useHandPresentation.ts +121 -0
  337. package/src/ui/hooks/useHexBoard.ts +74 -0
  338. package/src/ui/hooks/useHexGrid.ts +185 -0
  339. package/src/ui/hooks/useIsMobile.ts +35 -0
  340. package/src/ui/hooks/usePanZoom.ts +278 -0
  341. package/src/ui/hooks/useSquareBoard.ts +124 -0
  342. package/src/ui/hooks/useSquareGrid.ts +328 -0
  343. package/src/ui/index.ts +98 -0
  344. package/src/ui/internal/ui/alert.tsx +51 -0
  345. package/src/ui/internal/ui/button.tsx +58 -0
  346. package/src/ui/internal/ui/dialog.tsx +134 -0
  347. package/src/ui/internal/ui/input.tsx +21 -0
  348. package/src/ui/internal/ui/label.tsx +21 -0
  349. package/src/ui/internal/ui/select.tsx +129 -0
  350. package/src/ui/internal/ui/tooltip.tsx +54 -0
  351. package/src/ui/internal/ui/utils.ts +5 -0
  352. package/src/ui/plugin-styles.css +250 -0
  353. package/src/ui/primitives/dialog-lifecycle.ts +58 -0
  354. package/src/ui/primitives/dice.tsx +79 -0
  355. package/src/ui/primitives/primitive-props.tsx +101 -0
  356. package/src/ui/theme/ThemeProvider.tsx +252 -0
  357. package/src/ui/theme/board.ts +61 -0
  358. package/src/ui/theme/css-vars.ts +105 -0
  359. package/src/ui/theme/derive.ts +240 -0
  360. package/src/ui/theme/index.ts +61 -0
  361. package/src/ui/theme/presets/arcade.ts +261 -0
  362. package/src/ui/theme/presets/studio.ts +261 -0
  363. package/src/ui/theme/presets/tabletop.ts +266 -0
  364. package/src/ui/theme/tokens.ts +392 -0
  365. package/src/ui/types/hex-color.ts +20 -0
  366. package/src/ui/types/player-state.ts +463 -0
  367. package/src/ui/types/tiled-board.ts +785 -0
  368. package/src/ui/types/visual-state.ts +137 -0
  369. package/src/ui.ts +1 -0
@@ -0,0 +1,641 @@
1
+ import type {
2
+ CardCollection,
3
+ ViewCard,
4
+ ViewSlotOccupant,
5
+ } from "../../types/index.js";
6
+ import type {
7
+ BoardContainerIdOfTable,
8
+ BoardIdOfTable,
9
+ BoardTypeIdOfTable,
10
+ CardIdOfTable,
11
+ ComponentIdOfTable,
12
+ DeckCardsOfTable,
13
+ DeckIdOfTable,
14
+ HandCardsOfTable,
15
+ HandIdOfTable,
16
+ HexBoardIdOfTable,
17
+ HexSpaceIdOfTable,
18
+ PlayerIdOfTable,
19
+ ResourceAmountsOfTable,
20
+ ResourceBalancesOfTable,
21
+ ResourceIdOfTable,
22
+ SquareBoardIdOfTable,
23
+ SquareSpaceIdOfTable,
24
+ SpaceIdOfTable,
25
+ RelationTypeIdOfTable,
26
+ SpaceTypeIdOfTable,
27
+ TableOfState,
28
+ TiledBoardIdOfTable,
29
+ TiledEdgeIdOfTable,
30
+ TiledEdgeStateOfTable,
31
+ TiledEdgeTypeIdOfTable,
32
+ TiledVertexIdOfTable,
33
+ TiledVertexStateOfTable,
34
+ TiledVertexTypeIdOfTable,
35
+ } from "./extract";
36
+ import type {
37
+ RuntimeComponentLocation,
38
+ RuntimeSlotHostRef,
39
+ RuntimeTableRecord,
40
+ } from "./table";
41
+
42
+ type BoardRecord<
43
+ Table extends RuntimeTableRecord,
44
+ BoardId extends BoardIdOfTable<Table>,
45
+ > = Table["boards"]["byId"][BoardId];
46
+
47
+ type TiledBoardRecord<
48
+ Table extends RuntimeTableRecord,
49
+ BoardId extends TiledBoardIdOfTable<Table>,
50
+ > = Extract<BoardRecord<Table, BoardId>, { layout: "hex" | "square" }>;
51
+
52
+ type ViewCardOfTable<
53
+ Table extends RuntimeTableRecord,
54
+ CardId extends CardIdOfTable<Table>,
55
+ > =
56
+ CardId extends CardIdOfTable<Table>
57
+ ? ViewCard<
58
+ CardId & string,
59
+ Table["cards"][CardId]["cardType"] & string,
60
+ Extract<Table["cards"][CardId]["properties"], Record<string, unknown>>
61
+ >
62
+ : never;
63
+
64
+ type CardsByIdOfTable<
65
+ Table extends RuntimeTableRecord,
66
+ CardIds extends readonly CardIdOfTable<Table>[],
67
+ > = Readonly<{
68
+ [Id in CardIds[number]]: ViewCardOfTable<Table, Id> | undefined;
69
+ }>;
70
+
71
+ type DeckCardsForZone<
72
+ Table extends RuntimeTableRecord,
73
+ ZoneId extends DeckIdOfTable<Table>,
74
+ > = ZoneId extends infer Each extends DeckIdOfTable<Table>
75
+ ? DeckCardsOfTable<Table, Each>
76
+ : never;
77
+
78
+ type HandCardsForZone<
79
+ Table extends RuntimeTableRecord,
80
+ ZoneId extends HandIdOfTable<Table>,
81
+ > = ZoneId extends infer Each extends HandIdOfTable<Table>
82
+ ? HandCardsOfTable<Table, Each>
83
+ : never;
84
+
85
+ type CardCollectionOfTable<Table extends RuntimeTableRecord> = CardCollection<
86
+ CardIdOfTable<Table> & string,
87
+ ViewCardOfTable<Table, CardIdOfTable<Table>>
88
+ >;
89
+
90
+ type SlotOccupantOfTable<Table extends RuntimeTableRecord> = ViewSlotOccupant<
91
+ ComponentIdOfTable<Table> & string,
92
+ PlayerIdOfTable<Table> & string,
93
+ string,
94
+ Record<string, unknown>
95
+ >;
96
+
97
+ type SlotOccupantsOfTable<Table extends RuntimeTableRecord> = ReadonlyArray<
98
+ SlotOccupantOfTable<Table>
99
+ >;
100
+
101
+ type SlotOccupantsBySlotIdOfTable<Table extends RuntimeTableRecord> = Readonly<
102
+ Record<string, SlotOccupantsOfTable<Table>>
103
+ >;
104
+
105
+ export type ComponentLocationOfTable<
106
+ Table,
107
+ ComponentId extends ComponentIdOfTable<Table>,
108
+ > = Table extends {
109
+ componentLocations: infer ComponentLocations extends Record<string, unknown>;
110
+ }
111
+ ? ComponentLocations[ComponentId]
112
+ : never;
113
+
114
+ export type ComponentDataOfTable<
115
+ Table,
116
+ ComponentId extends ComponentIdOfTable<Table>,
117
+ > = Table extends {
118
+ cards: infer Cards extends Record<string, unknown>;
119
+ pieces: infer Pieces extends Record<string, unknown>;
120
+ dice: infer Dice extends Record<string, unknown>;
121
+ }
122
+ ? ComponentId extends keyof Cards
123
+ ? Cards[ComponentId]
124
+ : ComponentId extends keyof Pieces
125
+ ? Pieces[ComponentId]
126
+ : ComponentId extends keyof Dice
127
+ ? Dice[ComponentId]
128
+ : never
129
+ : never;
130
+
131
+ export type ComponentLocationByTypeOfTable<
132
+ Table,
133
+ ComponentId extends ComponentIdOfTable<Table>,
134
+ Type extends RuntimeComponentLocation["type"],
135
+ > = Extract<ComponentLocationOfTable<Table, ComponentId>, { type: Type }>;
136
+
137
+ export type ResolvedDeckLocation<
138
+ Table extends RuntimeTableRecord,
139
+ ComponentId extends ComponentIdOfTable<Table>,
140
+ > = {
141
+ [DeckId in DeckIdOfTable<Table>]: {
142
+ componentId: ComponentId;
143
+ deckId: DeckId;
144
+ cards: DeckCardsOfTable<Table, DeckId>;
145
+ location: ComponentLocationByTypeOfTable<Table, ComponentId, "InDeck"> & {
146
+ deckId: DeckId;
147
+ };
148
+ };
149
+ }[DeckIdOfTable<Table>];
150
+
151
+ export type ResolvedHandLocation<
152
+ Table extends RuntimeTableRecord,
153
+ ComponentId extends ComponentIdOfTable<Table>,
154
+ > = {
155
+ [HandId in HandIdOfTable<Table>]: {
156
+ [PlayerId in PlayerIdOfTable<Table>]: {
157
+ componentId: ComponentId;
158
+ handId: HandId;
159
+ playerId: PlayerId;
160
+ cards: HandCardsOfTable<Table, HandId>;
161
+ location: ComponentLocationByTypeOfTable<Table, ComponentId, "InHand"> & {
162
+ handId: HandId;
163
+ playerId: PlayerId;
164
+ };
165
+ };
166
+ }[PlayerIdOfTable<Table>];
167
+ }[HandIdOfTable<Table>];
168
+
169
+ export type ResolvedZoneLocation<
170
+ Table extends RuntimeTableRecord,
171
+ ComponentId extends ComponentIdOfTable<Table>,
172
+ > =
173
+ ComponentLocationByTypeOfTable<
174
+ Table,
175
+ ComponentId,
176
+ "InZone"
177
+ > extends infer Location
178
+ ? Location extends {
179
+ type: "InZone";
180
+ zoneId: infer ZoneId extends string;
181
+ }
182
+ ? {
183
+ componentId: ComponentId;
184
+ zoneId: ZoneId;
185
+ location: Location;
186
+ }
187
+ : never
188
+ : never;
189
+
190
+ export type ResolvedSpaceLocation<
191
+ Table extends RuntimeTableRecord,
192
+ ComponentId extends ComponentIdOfTable<Table>,
193
+ > = {
194
+ [BoardId in BoardIdOfTable<Table>]: {
195
+ [SpaceId in SpaceIdOfTable<Table, BoardId>]: {
196
+ componentId: ComponentId;
197
+ boardId: BoardId;
198
+ board: BoardRecord<Table, BoardId>;
199
+ spaceId: SpaceId;
200
+ space: Table["boards"]["byId"][BoardId]["spaces"][SpaceId];
201
+ location: ComponentLocationByTypeOfTable<
202
+ Table,
203
+ ComponentId,
204
+ "OnSpace"
205
+ > & {
206
+ boardId: BoardId;
207
+ spaceId: SpaceId;
208
+ };
209
+ };
210
+ }[SpaceIdOfTable<Table, BoardId>];
211
+ }[BoardIdOfTable<Table>];
212
+
213
+ export type ResolvedContainerLocation<
214
+ Table extends RuntimeTableRecord,
215
+ ComponentId extends ComponentIdOfTable<Table>,
216
+ > = {
217
+ [BoardId in BoardIdOfTable<Table>]: {
218
+ [ContainerId in BoardContainerIdOfTable<Table, BoardId>]: {
219
+ componentId: ComponentId;
220
+ boardId: BoardId;
221
+ board: BoardRecord<Table, BoardId>;
222
+ containerId: ContainerId;
223
+ container: Table["boards"]["byId"][BoardId]["containers"][ContainerId];
224
+ location: ComponentLocationByTypeOfTable<
225
+ Table,
226
+ ComponentId,
227
+ "InContainer"
228
+ > & {
229
+ boardId: BoardId;
230
+ containerId: ContainerId;
231
+ };
232
+ };
233
+ }[BoardContainerIdOfTable<Table, BoardId>];
234
+ }[BoardIdOfTable<Table>];
235
+
236
+ export type ResolvedEdgeLocation<
237
+ Table extends RuntimeTableRecord,
238
+ ComponentId extends ComponentIdOfTable<Table>,
239
+ > = {
240
+ [BoardId in TiledBoardIdOfTable<Table>]: {
241
+ [EdgeId in TiledEdgeIdOfTable<Table, BoardId>]: {
242
+ componentId: ComponentId;
243
+ boardId: BoardId;
244
+ board: TiledBoardRecord<Table, BoardId>;
245
+ edgeId: EdgeId;
246
+ edge: Extract<
247
+ Table["boards"]["byId"][BoardId],
248
+ { layout: "hex" | "square" }
249
+ >["edges"][number];
250
+ location: ComponentLocationByTypeOfTable<Table, ComponentId, "OnEdge"> & {
251
+ boardId: BoardId;
252
+ edgeId: EdgeId;
253
+ };
254
+ };
255
+ }[TiledEdgeIdOfTable<Table, BoardId>];
256
+ }[TiledBoardIdOfTable<Table>];
257
+
258
+ export type ResolvedVertexLocation<
259
+ Table extends RuntimeTableRecord,
260
+ ComponentId extends ComponentIdOfTable<Table>,
261
+ > = {
262
+ [BoardId in TiledBoardIdOfTable<Table>]: {
263
+ [VertexId in TiledVertexIdOfTable<Table, BoardId>]: {
264
+ componentId: ComponentId;
265
+ boardId: BoardId;
266
+ board: TiledBoardRecord<Table, BoardId>;
267
+ vertexId: VertexId;
268
+ vertex: Extract<
269
+ Table["boards"]["byId"][BoardId],
270
+ { layout: "hex" | "square" }
271
+ >["vertices"][number];
272
+ location: ComponentLocationByTypeOfTable<
273
+ Table,
274
+ ComponentId,
275
+ "OnVertex"
276
+ > & {
277
+ boardId: BoardId;
278
+ vertexId: VertexId;
279
+ };
280
+ };
281
+ }[TiledVertexIdOfTable<Table, BoardId>];
282
+ }[TiledBoardIdOfTable<Table>];
283
+
284
+ export type ResolvedSlotLocation<
285
+ Table extends RuntimeTableRecord,
286
+ ComponentId extends ComponentIdOfTable<Table>,
287
+ > =
288
+ ComponentLocationByTypeOfTable<
289
+ Table,
290
+ ComponentId,
291
+ "InSlot"
292
+ > extends infer Location
293
+ ? Location extends {
294
+ type: "InSlot";
295
+ host: infer Host extends RuntimeSlotHostRef;
296
+ slotId: infer SlotId extends string;
297
+ }
298
+ ? {
299
+ componentId: ComponentId;
300
+ host: Host;
301
+ slotId: SlotId;
302
+ location: Location;
303
+ }
304
+ : never
305
+ : never;
306
+
307
+ export type TableQueries<Table extends RuntimeTableRecord> = {
308
+ board: {
309
+ get: <BoardId extends BoardIdOfTable<Table>>(
310
+ boardId: BoardId,
311
+ ) => BoardRecord<Table, BoardId>;
312
+ hex: <BoardId extends HexBoardIdOfTable<Table>>(
313
+ boardId: BoardId,
314
+ ) => Extract<BoardRecord<Table, BoardId>, { layout: "hex" }>;
315
+ square: <BoardId extends SquareBoardIdOfTable<Table>>(
316
+ boardId: BoardId,
317
+ ) => Extract<BoardRecord<Table, BoardId>, { layout: "square" }>;
318
+ tiled: <BoardId extends TiledBoardIdOfTable<Table>>(
319
+ boardId: BoardId,
320
+ ) => TiledBoardRecord<Table, BoardId>;
321
+ space: <
322
+ BoardId extends BoardIdOfTable<Table>,
323
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
324
+ >(
325
+ boardId: BoardId,
326
+ spaceId: SpaceId,
327
+ ) => Table["boards"]["byId"][BoardId]["spaces"][SpaceId];
328
+ hexSpace: <
329
+ BoardId extends HexBoardIdOfTable<Table>,
330
+ SpaceId extends HexSpaceIdOfTable<Table, BoardId>,
331
+ >(
332
+ boardId: BoardId,
333
+ spaceId: SpaceId,
334
+ ) => Extract<
335
+ Table["boards"]["byId"][BoardId],
336
+ { layout: "hex" }
337
+ >["spaces"][SpaceId];
338
+ squareSpace: <
339
+ BoardId extends SquareBoardIdOfTable<Table>,
340
+ SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,
341
+ >(
342
+ boardId: BoardId,
343
+ spaceId: SpaceId,
344
+ ) => Extract<
345
+ Table["boards"]["byId"][BoardId],
346
+ { layout: "square" }
347
+ >["spaces"][SpaceId];
348
+ container: <
349
+ BoardId extends BoardIdOfTable<Table>,
350
+ ContainerId extends BoardContainerIdOfTable<Table, BoardId>,
351
+ >(
352
+ boardId: BoardId,
353
+ containerId: ContainerId,
354
+ ) => Table["boards"]["byId"][BoardId]["containers"][ContainerId];
355
+ edge: <
356
+ BoardId extends TiledBoardIdOfTable<Table>,
357
+ EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,
358
+ >(
359
+ boardId: BoardId,
360
+ edgeId: EdgeId,
361
+ ) => TiledEdgeStateOfTable<Table, BoardId, EdgeId>;
362
+ vertex: <
363
+ BoardId extends TiledBoardIdOfTable<Table>,
364
+ VertexId extends TiledVertexIdOfTable<Table, BoardId>,
365
+ >(
366
+ boardId: BoardId,
367
+ vertexId: VertexId,
368
+ ) => TiledVertexStateOfTable<Table, BoardId, VertexId>;
369
+ byType: <TypeId extends BoardTypeIdOfTable<Table>>(
370
+ typeId: TypeId,
371
+ ) => BoardIdOfTable<Table>[];
372
+ spacesByType: <
373
+ BoardId extends BoardIdOfTable<Table>,
374
+ TypeId extends SpaceTypeIdOfTable<Table, BoardId>,
375
+ >(
376
+ boardId: BoardId,
377
+ typeId: TypeId,
378
+ ) => SpaceIdOfTable<Table, BoardId>[];
379
+ edgesByType: <
380
+ BoardId extends TiledBoardIdOfTable<Table>,
381
+ TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,
382
+ >(
383
+ boardId: BoardId,
384
+ typeId: TypeId,
385
+ ) => TiledEdgeIdOfTable<Table, BoardId>[];
386
+ verticesByType: <
387
+ BoardId extends TiledBoardIdOfTable<Table>,
388
+ TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,
389
+ >(
390
+ boardId: BoardId,
391
+ typeId: TypeId,
392
+ ) => TiledVertexIdOfTable<Table, BoardId>[];
393
+ adjacentSpaces: <
394
+ BoardId extends BoardIdOfTable<Table>,
395
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
396
+ >(
397
+ boardId: BoardId,
398
+ spaceId: SpaceId,
399
+ ) => SpaceIdOfTable<Table, BoardId>[];
400
+ relatedSpaces: <
401
+ BoardId extends BoardIdOfTable<Table>,
402
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
403
+ TypeId extends RelationTypeIdOfTable<Table, BoardId>,
404
+ >(
405
+ boardId: BoardId,
406
+ spaceId: SpaceId,
407
+ relationTypeId: TypeId,
408
+ ) => SpaceIdOfTable<Table, BoardId>[];
409
+ incidentEdges: <
410
+ BoardId extends TiledBoardIdOfTable<Table>,
411
+ VertexId extends TiledVertexIdOfTable<Table, BoardId>,
412
+ >(
413
+ boardId: BoardId,
414
+ vertexId: VertexId,
415
+ ) => TiledEdgeIdOfTable<Table, BoardId>[];
416
+ incidentVertices: <
417
+ BoardId extends TiledBoardIdOfTable<Table>,
418
+ EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,
419
+ >(
420
+ boardId: BoardId,
421
+ edgeId: EdgeId,
422
+ ) => TiledVertexIdOfTable<Table, BoardId>[];
423
+ spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(
424
+ boardId: BoardId,
425
+ spaceId: SpaceIdOfTable<Table, BoardId>,
426
+ ) => TiledEdgeIdOfTable<Table, BoardId>[];
427
+ spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(
428
+ boardId: BoardId,
429
+ spaceId: SpaceIdOfTable<Table, BoardId>,
430
+ ) => TiledVertexIdOfTable<Table, BoardId>[];
431
+ spaceDistance: <
432
+ BoardId extends BoardIdOfTable<Table>,
433
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
434
+ >(
435
+ boardId: BoardId,
436
+ fromSpaceId: SpaceId,
437
+ toSpaceId: SpaceId,
438
+ ) => number;
439
+ hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(
440
+ boardId: BoardId,
441
+ q: number,
442
+ r: number,
443
+ ) =>
444
+ | Extract<
445
+ Table["boards"]["byId"][BoardId],
446
+ { layout: "hex" }
447
+ >["spaces"][HexSpaceIdOfTable<Table, BoardId>]
448
+ | undefined;
449
+ squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(
450
+ boardId: BoardId,
451
+ row: number,
452
+ col: number,
453
+ ) =>
454
+ | Extract<
455
+ Table["boards"]["byId"][BoardId],
456
+ { layout: "square" }
457
+ >["spaces"][SquareSpaceIdOfTable<Table, BoardId>]
458
+ | undefined;
459
+ squareNeighbors: <
460
+ BoardId extends SquareBoardIdOfTable<Table>,
461
+ SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,
462
+ >(
463
+ boardId: BoardId,
464
+ spaceId: SpaceId,
465
+ options?: { mode?: "orthogonal" | "diagonal" | "all" },
466
+ ) => SquareSpaceIdOfTable<Table, BoardId>[];
467
+ squareDistance: <
468
+ BoardId extends SquareBoardIdOfTable<Table>,
469
+ SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,
470
+ >(
471
+ boardId: BoardId,
472
+ fromSpaceId: SpaceId,
473
+ toSpaceId: SpaceId,
474
+ options?: { metric?: "manhattan" | "chebyshev" },
475
+ ) => number;
476
+ spaceOccupants: <
477
+ BoardId extends BoardIdOfTable<Table>,
478
+ SpaceId extends SpaceIdOfTable<Table, BoardId>,
479
+ >(
480
+ boardId: BoardId,
481
+ spaceId: SpaceId,
482
+ ) => ComponentIdOfTable<Table>[];
483
+ containerOccupants: <
484
+ BoardId extends BoardIdOfTable<Table>,
485
+ ContainerId extends BoardContainerIdOfTable<Table, BoardId>,
486
+ >(
487
+ boardId: BoardId,
488
+ containerId: ContainerId,
489
+ ) => ComponentIdOfTable<Table>[];
490
+ edgeOccupants: <
491
+ BoardId extends TiledBoardIdOfTable<Table>,
492
+ EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,
493
+ >(
494
+ boardId: BoardId,
495
+ edgeId: EdgeId,
496
+ ) => ComponentIdOfTable<Table>[];
497
+ vertexOccupants: <
498
+ BoardId extends TiledBoardIdOfTable<Table>,
499
+ VertexId extends TiledVertexIdOfTable<Table, BoardId>,
500
+ >(
501
+ boardId: BoardId,
502
+ vertexId: VertexId,
503
+ ) => ComponentIdOfTable<Table>[];
504
+ };
505
+ zone: {
506
+ sharedCards: <ZoneId extends DeckIdOfTable<Table>>(
507
+ zoneId: ZoneId,
508
+ ) => DeckCardsForZone<Table, ZoneId>;
509
+ sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(
510
+ zoneId: ZoneId,
511
+ ) => CardCollectionOfTable<Table>;
512
+ allSharedCards: () => {
513
+ readonly [Z in DeckIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;
514
+ };
515
+ playerCards: <
516
+ PlayerId extends PlayerIdOfTable<Table>,
517
+ ZoneId extends HandIdOfTable<Table>,
518
+ >(
519
+ playerId: PlayerId,
520
+ zoneId: ZoneId,
521
+ ) => HandCardsForZone<Table, ZoneId>;
522
+ playerCardCollection: <
523
+ PlayerId extends PlayerIdOfTable<Table>,
524
+ ZoneId extends HandIdOfTable<Table>,
525
+ >(
526
+ playerId: PlayerId,
527
+ zoneId: ZoneId,
528
+ ) => CardCollectionOfTable<Table>;
529
+ allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(
530
+ zoneId: ZoneId,
531
+ ) => {
532
+ readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;
533
+ };
534
+ };
535
+ card: {
536
+ get: <CardId extends CardIdOfTable<Table>>(
537
+ cardId: CardId,
538
+ ) => ViewCardOfTable<Table, CardId>;
539
+ byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(
540
+ cardIds: CardIds,
541
+ ) => CardsByIdOfTable<Table, CardIds>;
542
+ owner: <CardId extends CardIdOfTable<Table>>(
543
+ cardId: CardId,
544
+ ) => Table["ownerOfCard"][CardId];
545
+ visibility: <CardId extends CardIdOfTable<Table>>(
546
+ cardId: CardId,
547
+ ) => Table["visibility"][CardId];
548
+ };
549
+ slot: {
550
+ occupants: (
551
+ host: RuntimeSlotHostRef,
552
+ slotId: string,
553
+ ) => SlotOccupantsOfTable<Table>;
554
+ occupantsByHost: (
555
+ host: RuntimeSlotHostRef,
556
+ ) => SlotOccupantsBySlotIdOfTable<Table>;
557
+ pieceOccupants: (
558
+ hostId: string,
559
+ slotId: string,
560
+ ) => SlotOccupantsOfTable<Table>;
561
+ pieceOccupantsByHost: (
562
+ hostId: string,
563
+ ) => SlotOccupantsBySlotIdOfTable<Table>;
564
+ dieOccupants: (
565
+ hostId: string,
566
+ slotId: string,
567
+ ) => SlotOccupantsOfTable<Table>;
568
+ dieOccupantsByHost: (hostId: string) => SlotOccupantsBySlotIdOfTable<Table>;
569
+ };
570
+ player: {
571
+ /** Seating order from the manifest / setup profile. */
572
+ order: () => Table["playerOrder"];
573
+ /**
574
+ * Next player id in seating order after `playerId`, wrapping around to
575
+ * the first seat. Returns `null` when `playerId` is unknown or the
576
+ * order is empty. Convenient for "whose turn is next" logic.
577
+ */
578
+ nextInOrder: (
579
+ playerId: PlayerIdOfTable<Table>,
580
+ ) => PlayerIdOfTable<Table> | null;
581
+ /** All resource balances for a player, as the manifest-typed record. */
582
+ resources: <PlayerId extends PlayerIdOfTable<Table>>(
583
+ playerId: PlayerId,
584
+ ) => ResourceBalancesOfTable<Table>;
585
+ /** Balance of a single resource; returns `0` when unset. */
586
+ resource: (
587
+ playerId: PlayerIdOfTable<Table>,
588
+ resourceId: ResourceIdOfTable<Table>,
589
+ ) => number;
590
+ /**
591
+ * Sum of every resource amount held by a player (e.g. "total cards in
592
+ * hand" checks). Returns `0` for unknown players or empty balances.
593
+ */
594
+ resourceTotal: (playerId: PlayerIdOfTable<Table>) => number;
595
+ /** `true` when the player can pay every non-zero amount in `amounts`. */
596
+ canAfford: (
597
+ playerId: PlayerIdOfTable<Table>,
598
+ amounts: ResourceAmountsOfTable<Table>,
599
+ ) => boolean;
600
+ /** Shortfall per resource when the player cannot afford `amounts`. */
601
+ missingResources: (
602
+ playerId: PlayerIdOfTable<Table>,
603
+ amounts: ResourceAmountsOfTable<Table>,
604
+ ) => Partial<Record<ResourceIdOfTable<Table>, number>>;
605
+ };
606
+ component: {
607
+ data: <ComponentId extends ComponentIdOfTable<Table>>(
608
+ componentId: ComponentId,
609
+ ) => ComponentDataOfTable<Table, ComponentId> | undefined;
610
+ location: <ComponentId extends ComponentIdOfTable<Table>>(
611
+ componentId: ComponentId,
612
+ ) => ComponentLocationOfTable<Table, ComponentId> | undefined;
613
+ deck: <ComponentId extends ComponentIdOfTable<Table>>(
614
+ componentId: ComponentId,
615
+ ) => ResolvedDeckLocation<Table, ComponentId> | null;
616
+ hand: <ComponentId extends ComponentIdOfTable<Table>>(
617
+ componentId: ComponentId,
618
+ ) => ResolvedHandLocation<Table, ComponentId> | null;
619
+ zone: <ComponentId extends ComponentIdOfTable<Table>>(
620
+ componentId: ComponentId,
621
+ ) => ResolvedZoneLocation<Table, ComponentId> | null;
622
+ space: <ComponentId extends ComponentIdOfTable<Table>>(
623
+ componentId: ComponentId,
624
+ ) => ResolvedSpaceLocation<Table, ComponentId> | null;
625
+ container: <ComponentId extends ComponentIdOfTable<Table>>(
626
+ componentId: ComponentId,
627
+ ) => ResolvedContainerLocation<Table, ComponentId> | null;
628
+ edge: <ComponentId extends ComponentIdOfTable<Table>>(
629
+ componentId: ComponentId,
630
+ ) => ResolvedEdgeLocation<Table, ComponentId> | null;
631
+ vertex: <ComponentId extends ComponentIdOfTable<Table>>(
632
+ componentId: ComponentId,
633
+ ) => ResolvedVertexLocation<Table, ComponentId> | null;
634
+ slot: <ComponentId extends ComponentIdOfTable<Table>>(
635
+ componentId: ComponentId,
636
+ ) => ResolvedSlotLocation<Table, ComponentId> | null;
637
+ };
638
+ };
639
+
640
+ export type TableQueriesOfState<State extends { table: RuntimeTableRecord }> =
641
+ TableQueries<TableOfState<State>>;