@pretty-chitty/core 1.1.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.
Files changed (779) hide show
  1. package/LICENSE.md +51 -0
  2. package/README.md +152 -0
  3. package/dist/0e0a96423fd742218c61.woff2 +0 -0
  4. package/dist/1e28c9f184923aacc181.woff +0 -0
  5. package/dist/37f3b2ddcbe588b2aaa5.jpg +0 -0
  6. package/dist/3f0fb9058a03e14ad2fa.jpg +0 -0
  7. package/dist/4482e08504d544757971.woff2 +0 -0
  8. package/dist/5212361bfd059a27e2da.woff2 +0 -0
  9. package/dist/699b459f21e39ca4b8df.woff2 +0 -0
  10. package/dist/7e339dfbea59fe54f2e3.png +0 -0
  11. package/dist/a3e6d4ebd8f859f0f1dc.woff +0 -0
  12. package/dist/b8b0d3bc0d26444e4a5a.woff2 +0 -0
  13. package/dist/bce9a6fcc5b3da9a086a.woff +0 -0
  14. package/dist/components/ActionLogDisplay.d.ts +4 -0
  15. package/dist/components/ActionLogDisplay.d.ts.map +1 -0
  16. package/dist/components/ActionLogDisplay.js +144 -0
  17. package/dist/components/ActionLogDisplay.js.map +1 -0
  18. package/dist/components/ActionLogHistory.d.ts +6 -0
  19. package/dist/components/ActionLogHistory.d.ts.map +1 -0
  20. package/dist/components/ActionLogHistory.js +81 -0
  21. package/dist/components/ActionLogHistory.js.map +1 -0
  22. package/dist/components/ActionLogHistoryDisplay.d.ts +2 -0
  23. package/dist/components/ActionLogHistoryDisplay.d.ts.map +1 -0
  24. package/dist/components/ActionLogHistoryDisplay.js +17 -0
  25. package/dist/components/ActionLogHistoryDisplay.js.map +1 -0
  26. package/dist/components/ActionLogSidebar.d.ts +2 -0
  27. package/dist/components/ActionLogSidebar.d.ts.map +1 -0
  28. package/dist/components/ActionLogSidebar.js +9 -0
  29. package/dist/components/ActionLogSidebar.js.map +1 -0
  30. package/dist/components/BottomBar.d.ts +2 -0
  31. package/dist/components/BottomBar.d.ts.map +1 -0
  32. package/dist/components/BottomBar.js +33 -0
  33. package/dist/components/BottomBar.js.map +1 -0
  34. package/dist/components/BottomBarBreak.d.ts +2 -0
  35. package/dist/components/BottomBarBreak.d.ts.map +1 -0
  36. package/dist/components/BottomBarBreak.js +8 -0
  37. package/dist/components/BottomBarBreak.js.map +1 -0
  38. package/dist/components/BottomBarButton.d.ts +16 -0
  39. package/dist/components/BottomBarButton.d.ts.map +1 -0
  40. package/dist/components/BottomBarButton.js +123 -0
  41. package/dist/components/BottomBarButton.js.map +1 -0
  42. package/dist/components/CanvasLibraryViewer.d.ts +8 -0
  43. package/dist/components/CanvasLibraryViewer.d.ts.map +1 -0
  44. package/dist/components/CanvasLibraryViewer.js +29 -0
  45. package/dist/components/CanvasLibraryViewer.js.map +1 -0
  46. package/dist/components/ChitLibraryViewer.d.ts +8 -0
  47. package/dist/components/ChitLibraryViewer.d.ts.map +1 -0
  48. package/dist/components/ChitLibraryViewer.js +101 -0
  49. package/dist/components/ChitLibraryViewer.js.map +1 -0
  50. package/dist/components/ClientTrustMatchViewer.d.ts +11 -0
  51. package/dist/components/ClientTrustMatchViewer.d.ts.map +1 -0
  52. package/dist/components/ClientTrustMatchViewer.js +53 -0
  53. package/dist/components/ClientTrustMatchViewer.js.map +1 -0
  54. package/dist/components/ContextGalleryDisplay.d.ts +4 -0
  55. package/dist/components/ContextGalleryDisplay.d.ts.map +1 -0
  56. package/dist/components/ContextGalleryDisplay.js +49 -0
  57. package/dist/components/ContextGalleryDisplay.js.map +1 -0
  58. package/dist/components/GalleryDisplay.d.ts +2 -0
  59. package/dist/components/GalleryDisplay.d.ts.map +1 -0
  60. package/dist/components/GalleryDisplay.js +42 -0
  61. package/dist/components/GalleryDisplay.js.map +1 -0
  62. package/dist/components/GalleryPlayground.d.ts +14 -0
  63. package/dist/components/GalleryPlayground.d.ts.map +1 -0
  64. package/dist/components/GalleryPlayground.js +36 -0
  65. package/dist/components/GalleryPlayground.js.map +1 -0
  66. package/dist/components/GalleryViewer.d.ts +48 -0
  67. package/dist/components/GalleryViewer.d.ts.map +1 -0
  68. package/dist/components/GalleryViewer.js +567 -0
  69. package/dist/components/GalleryViewer.js.map +1 -0
  70. package/dist/components/GameDesigner.d.ts +5 -0
  71. package/dist/components/GameDesigner.d.ts.map +1 -0
  72. package/dist/components/GameDesigner.js +14 -0
  73. package/dist/components/GameDesigner.js.map +1 -0
  74. package/dist/components/GameDialog.d.ts +7 -0
  75. package/dist/components/GameDialog.d.ts.map +1 -0
  76. package/dist/components/GameDialog.js +24 -0
  77. package/dist/components/GameDialog.js.map +1 -0
  78. package/dist/components/GameModalBackdrop.d.ts +10 -0
  79. package/dist/components/GameModalBackdrop.d.ts.map +1 -0
  80. package/dist/components/GameModalBackdrop.js +33 -0
  81. package/dist/components/GameModalBackdrop.js.map +1 -0
  82. package/dist/components/GameModalDialog.d.ts +11 -0
  83. package/dist/components/GameModalDialog.d.ts.map +1 -0
  84. package/dist/components/GameModalDialog.js +42 -0
  85. package/dist/components/GameModalDialog.js.map +1 -0
  86. package/dist/components/LiveButton.d.ts +4 -0
  87. package/dist/components/LiveButton.d.ts.map +1 -0
  88. package/dist/components/LiveButton.js +17 -0
  89. package/dist/components/LiveButton.js.map +1 -0
  90. package/dist/components/MatchEndDisplay.d.ts +2 -0
  91. package/dist/components/MatchEndDisplay.d.ts.map +1 -0
  92. package/dist/components/MatchEndDisplay.js +67 -0
  93. package/dist/components/MatchEndDisplay.js.map +1 -0
  94. package/dist/components/MatchViewer.d.ts +5 -0
  95. package/dist/components/MatchViewer.d.ts.map +1 -0
  96. package/dist/components/MatchViewer.js +59 -0
  97. package/dist/components/MatchViewer.js.map +1 -0
  98. package/dist/components/ObjectWithPropsEditor.d.ts +5 -0
  99. package/dist/components/ObjectWithPropsEditor.d.ts.map +1 -0
  100. package/dist/components/ObjectWithPropsEditor.js +88 -0
  101. package/dist/components/ObjectWithPropsEditor.js.map +1 -0
  102. package/dist/components/Panel/MultiPanel.d.ts +13 -0
  103. package/dist/components/Panel/MultiPanel.d.ts.map +1 -0
  104. package/dist/components/Panel/MultiPanel.js +196 -0
  105. package/dist/components/Panel/MultiPanel.js.map +1 -0
  106. package/dist/components/Panel/PanelContents.d.ts +27 -0
  107. package/dist/components/Panel/PanelContents.d.ts.map +1 -0
  108. package/dist/components/Panel/PanelContents.js +202 -0
  109. package/dist/components/Panel/PanelContents.js.map +1 -0
  110. package/dist/components/Panel/PanelTabStack.d.ts +9 -0
  111. package/dist/components/Panel/PanelTabStack.d.ts.map +1 -0
  112. package/dist/components/Panel/PanelTabStack.js +56 -0
  113. package/dist/components/Panel/PanelTabStack.js.map +1 -0
  114. package/dist/components/Panel/SinglePanel.d.ts +13 -0
  115. package/dist/components/Panel/SinglePanel.d.ts.map +1 -0
  116. package/dist/components/Panel/SinglePanel.js +44 -0
  117. package/dist/components/Panel/SinglePanel.js.map +1 -0
  118. package/dist/components/Panel/ViewerWrapper.d.ts +17 -0
  119. package/dist/components/Panel/ViewerWrapper.d.ts.map +1 -0
  120. package/dist/components/Panel/ViewerWrapper.js +70 -0
  121. package/dist/components/Panel/ViewerWrapper.js.map +1 -0
  122. package/dist/components/Panel/ViewerZoomControls.d.ts +8 -0
  123. package/dist/components/Panel/ViewerZoomControls.d.ts.map +1 -0
  124. package/dist/components/Panel/ViewerZoomControls.js +152 -0
  125. package/dist/components/Panel/ViewerZoomControls.js.map +1 -0
  126. package/dist/components/Panel/util.d.ts +3 -0
  127. package/dist/components/Panel/util.d.ts.map +1 -0
  128. package/dist/components/Panel/util.js +5 -0
  129. package/dist/components/Panel/util.js.map +1 -0
  130. package/dist/components/PanelSpark.d.ts +7 -0
  131. package/dist/components/PanelSpark.d.ts.map +1 -0
  132. package/dist/components/PanelSpark.js +84 -0
  133. package/dist/components/PanelSpark.js.map +1 -0
  134. package/dist/components/PersistentCanvas.d.ts +12 -0
  135. package/dist/components/PersistentCanvas.d.ts.map +1 -0
  136. package/dist/components/PersistentCanvas.js +44 -0
  137. package/dist/components/PersistentCanvas.js.map +1 -0
  138. package/dist/components/PlayerImage.d.ts +9 -0
  139. package/dist/components/PlayerImage.d.ts.map +1 -0
  140. package/dist/components/PlayerImage.js +21 -0
  141. package/dist/components/PlayerImage.js.map +1 -0
  142. package/dist/components/Playground.d.ts +9 -0
  143. package/dist/components/Playground.d.ts.map +1 -0
  144. package/dist/components/Playground.js +129 -0
  145. package/dist/components/Playground.js.map +1 -0
  146. package/dist/components/PromptControls.d.ts +4 -0
  147. package/dist/components/PromptControls.d.ts.map +1 -0
  148. package/dist/components/PromptControls.js +87 -0
  149. package/dist/components/PromptControls.js.map +1 -0
  150. package/dist/components/SelectableItemAndStage.d.ts +8 -0
  151. package/dist/components/SelectableItemAndStage.d.ts.map +1 -0
  152. package/dist/components/SelectableItemAndStage.js +16 -0
  153. package/dist/components/SelectableItemAndStage.js.map +1 -0
  154. package/dist/components/SettingsDisplay.d.ts +2 -0
  155. package/dist/components/SettingsDisplay.d.ts.map +1 -0
  156. package/dist/components/SettingsDisplay.js +62 -0
  157. package/dist/components/SettingsDisplay.js.map +1 -0
  158. package/dist/components/SparkLineChart.d.ts +21 -0
  159. package/dist/components/SparkLineChart.d.ts.map +1 -0
  160. package/dist/components/SparkLineChart.js +143 -0
  161. package/dist/components/SparkLineChart.js.map +1 -0
  162. package/dist/components/StageAndEditor.d.ts +5 -0
  163. package/dist/components/StageAndEditor.d.ts.map +1 -0
  164. package/dist/components/StageAndEditor.js +12 -0
  165. package/dist/components/StageAndEditor.js.map +1 -0
  166. package/dist/components/TimeControlBar.d.ts +5 -0
  167. package/dist/components/TimeControlBar.d.ts.map +1 -0
  168. package/dist/components/TimeControlBar.js +38 -0
  169. package/dist/components/TimeControlBar.js.map +1 -0
  170. package/dist/components/TokenizedMessage.d.ts +13 -0
  171. package/dist/components/TokenizedMessage.d.ts.map +1 -0
  172. package/dist/components/TokenizedMessage.js +102 -0
  173. package/dist/components/TokenizedMessage.js.map +1 -0
  174. package/dist/components/TopBar.d.ts +4 -0
  175. package/dist/components/TopBar.d.ts.map +1 -0
  176. package/dist/components/TopBar.js +47 -0
  177. package/dist/components/TopBar.js.map +1 -0
  178. package/dist/components/TopBarDropdown.d.ts +6 -0
  179. package/dist/components/TopBarDropdown.d.ts.map +1 -0
  180. package/dist/components/TopBarDropdown.js +69 -0
  181. package/dist/components/TopBarDropdown.js.map +1 -0
  182. package/dist/components/TopBarPlayers.d.ts +2 -0
  183. package/dist/components/TopBarPlayers.d.ts.map +1 -0
  184. package/dist/components/TopBarPlayers.js +70 -0
  185. package/dist/components/TopBarPlayers.js.map +1 -0
  186. package/dist/components/UpdatingCanvasImage.d.ts +7 -0
  187. package/dist/components/UpdatingCanvasImage.d.ts.map +1 -0
  188. package/dist/components/UpdatingCanvasImage.js +22 -0
  189. package/dist/components/UpdatingCanvasImage.js.map +1 -0
  190. package/dist/components/UpdatingCanvasViewer.d.ts +7 -0
  191. package/dist/components/UpdatingCanvasViewer.d.ts.map +1 -0
  192. package/dist/components/UpdatingCanvasViewer.js +50 -0
  193. package/dist/components/UpdatingCanvasViewer.js.map +1 -0
  194. package/dist/components/Viewer.d.ts +16 -0
  195. package/dist/components/Viewer.d.ts.map +1 -0
  196. package/dist/components/Viewer.js +289 -0
  197. package/dist/components/Viewer.js.map +1 -0
  198. package/dist/components/index.d.ts +1 -0
  199. package/dist/components/index.d.ts.map +1 -0
  200. package/dist/components/index.js +2 -0
  201. package/dist/components/index.js.map +1 -0
  202. package/dist/e085acb5e467d8e85d21.woff +0 -0
  203. package/dist/e65dff62134b8879e792.woff +0 -0
  204. package/dist/game/Chit.d.ts +64 -0
  205. package/dist/game/Chit.d.ts.map +1 -0
  206. package/dist/game/Chit.js +524 -0
  207. package/dist/game/Chit.js.map +1 -0
  208. package/dist/game/ClientTimeState.d.ts +16 -0
  209. package/dist/game/ClientTimeState.d.ts.map +1 -0
  210. package/dist/game/ClientTimeState.js +38 -0
  211. package/dist/game/ClientTimeState.js.map +1 -0
  212. package/dist/game/ClockDetails.d.ts +9 -0
  213. package/dist/game/ClockDetails.d.ts.map +1 -0
  214. package/dist/game/ClockDetails.js +19 -0
  215. package/dist/game/ClockDetails.js.map +1 -0
  216. package/dist/game/Connection.d.ts +26 -0
  217. package/dist/game/Connection.d.ts.map +1 -0
  218. package/dist/game/Connection.js +99 -0
  219. package/dist/game/Connection.js.map +1 -0
  220. package/dist/game/ConnectionObject.d.ts +7 -0
  221. package/dist/game/ConnectionObject.d.ts.map +1 -0
  222. package/dist/game/ConnectionObject.js +16 -0
  223. package/dist/game/ConnectionObject.js.map +1 -0
  224. package/dist/game/ConnectionTransport.d.ts +17 -0
  225. package/dist/game/ConnectionTransport.d.ts.map +1 -0
  226. package/dist/game/ConnectionTransport.js +39 -0
  227. package/dist/game/ConnectionTransport.js.map +1 -0
  228. package/dist/game/DropdownChit.d.ts +7 -0
  229. package/dist/game/DropdownChit.d.ts.map +1 -0
  230. package/dist/game/DropdownChit.js +29 -0
  231. package/dist/game/DropdownChit.js.map +1 -0
  232. package/dist/game/GalleryItemChitChildrenSource.d.ts +12 -0
  233. package/dist/game/GalleryItemChitChildrenSource.d.ts.map +1 -0
  234. package/dist/game/GalleryItemChitChildrenSource.js +25 -0
  235. package/dist/game/GalleryItemChitChildrenSource.js.map +1 -0
  236. package/dist/game/GalleryItemRawSource.d.ts +9 -0
  237. package/dist/game/GalleryItemRawSource.d.ts.map +1 -0
  238. package/dist/game/GalleryItemRawSource.js +13 -0
  239. package/dist/game/GalleryItemRawSource.js.map +1 -0
  240. package/dist/game/Game.d.ts +51 -0
  241. package/dist/game/Game.d.ts.map +1 -0
  242. package/dist/game/Game.js +2 -0
  243. package/dist/game/Game.js.map +1 -0
  244. package/dist/game/GameBagChit.d.ts +16 -0
  245. package/dist/game/GameBagChit.d.ts.map +1 -0
  246. package/dist/game/GameBagChit.js +51 -0
  247. package/dist/game/GameBagChit.js.map +1 -0
  248. package/dist/game/GameButton.d.ts +30 -0
  249. package/dist/game/GameButton.d.ts.map +1 -0
  250. package/dist/game/GameButton.js +115 -0
  251. package/dist/game/GameButton.js.map +1 -0
  252. package/dist/game/GameDeckChit.d.ts +23 -0
  253. package/dist/game/GameDeckChit.d.ts.map +1 -0
  254. package/dist/game/GameDeckChit.js +79 -0
  255. package/dist/game/GameDeckChit.js.map +1 -0
  256. package/dist/game/GameTheme.d.ts +75 -0
  257. package/dist/game/GameTheme.d.ts.map +1 -0
  258. package/dist/game/GameTheme.js +103 -0
  259. package/dist/game/GameTheme.js.map +1 -0
  260. package/dist/game/Match.d.ts +34 -0
  261. package/dist/game/Match.d.ts.map +1 -0
  262. package/dist/game/Match.js +151 -0
  263. package/dist/game/Match.js.map +1 -0
  264. package/dist/game/MatchConnection.d.ts +8 -0
  265. package/dist/game/MatchConnection.d.ts.map +1 -0
  266. package/dist/game/MatchConnection.js +6 -0
  267. package/dist/game/MatchConnection.js.map +1 -0
  268. package/dist/game/MatchStorage.d.ts +17 -0
  269. package/dist/game/MatchStorage.d.ts.map +1 -0
  270. package/dist/game/MatchStorage.js +32 -0
  271. package/dist/game/MatchStorage.js.map +1 -0
  272. package/dist/game/ModalState.d.ts +9 -0
  273. package/dist/game/ModalState.d.ts.map +1 -0
  274. package/dist/game/ModalState.js +27 -0
  275. package/dist/game/ModalState.js.map +1 -0
  276. package/dist/game/OrderedOutlet.d.ts +50 -0
  277. package/dist/game/OrderedOutlet.d.ts.map +1 -0
  278. package/dist/game/OrderedOutlet.js +164 -0
  279. package/dist/game/OrderedOutlet.js.map +1 -0
  280. package/dist/game/Pick.d.ts +26 -0
  281. package/dist/game/Pick.d.ts.map +1 -0
  282. package/dist/game/Pick.js +239 -0
  283. package/dist/game/Pick.js.map +1 -0
  284. package/dist/game/PlayerChit.d.ts +16 -0
  285. package/dist/game/PlayerChit.d.ts.map +1 -0
  286. package/dist/game/PlayerChit.js +56 -0
  287. package/dist/game/PlayerChit.js.map +1 -0
  288. package/dist/game/PlayerInfo.d.ts +12 -0
  289. package/dist/game/PlayerInfo.d.ts.map +1 -0
  290. package/dist/game/PlayerInfo.js +20 -0
  291. package/dist/game/PlayerInfo.js.map +1 -0
  292. package/dist/game/PlayerPromptStatusChit.d.ts +5 -0
  293. package/dist/game/PlayerPromptStatusChit.d.ts.map +1 -0
  294. package/dist/game/PlayerPromptStatusChit.js +35 -0
  295. package/dist/game/PlayerPromptStatusChit.js.map +1 -0
  296. package/dist/game/Prompt.d.ts +94 -0
  297. package/dist/game/Prompt.d.ts.map +1 -0
  298. package/dist/game/Prompt.js +229 -0
  299. package/dist/game/Prompt.js.map +1 -0
  300. package/dist/game/RootChit.d.ts +15 -0
  301. package/dist/game/RootChit.d.ts.map +1 -0
  302. package/dist/game/RootChit.js +62 -0
  303. package/dist/game/RootChit.js.map +1 -0
  304. package/dist/game/SparkChit.d.ts +27 -0
  305. package/dist/game/SparkChit.d.ts.map +1 -0
  306. package/dist/game/SparkChit.js +97 -0
  307. package/dist/game/SparkChit.js.map +1 -0
  308. package/dist/game/StaticChitTypeRegistry.d.ts +5 -0
  309. package/dist/game/StaticChitTypeRegistry.d.ts.map +1 -0
  310. package/dist/game/StaticChitTypeRegistry.js +3 -0
  311. package/dist/game/StaticChitTypeRegistry.js.map +1 -0
  312. package/dist/game/Turn.d.ts +169 -0
  313. package/dist/game/Turn.d.ts.map +1 -0
  314. package/dist/game/Turn.js +1031 -0
  315. package/dist/game/Turn.js.map +1 -0
  316. package/dist/game/TurnState.d.ts +30 -0
  317. package/dist/game/TurnState.d.ts.map +1 -0
  318. package/dist/game/TurnState.js +170 -0
  319. package/dist/game/TurnState.js.map +1 -0
  320. package/dist/game/clientTransport/ClientPrompts.d.ts +23 -0
  321. package/dist/game/clientTransport/ClientPrompts.d.ts.map +1 -0
  322. package/dist/game/clientTransport/ClientPrompts.js +85 -0
  323. package/dist/game/clientTransport/ClientPrompts.js.map +1 -0
  324. package/dist/game/clientTransport/ClientStatus.d.ts +19 -0
  325. package/dist/game/clientTransport/ClientStatus.d.ts.map +1 -0
  326. package/dist/game/clientTransport/ClientStatus.js +25 -0
  327. package/dist/game/clientTransport/ClientStatus.js.map +1 -0
  328. package/dist/game/clientTransport/ClientTime.d.ts +42 -0
  329. package/dist/game/clientTransport/ClientTime.d.ts.map +1 -0
  330. package/dist/game/clientTransport/ClientTime.js +197 -0
  331. package/dist/game/clientTransport/ClientTime.js.map +1 -0
  332. package/dist/game/index.d.ts +1 -0
  333. package/dist/game/index.d.ts.map +1 -0
  334. package/dist/game/index.js +2 -0
  335. package/dist/game/index.js.map +1 -0
  336. package/dist/game/serverTransport/ServerPrompts.d.ts +17 -0
  337. package/dist/game/serverTransport/ServerPrompts.d.ts.map +1 -0
  338. package/dist/game/serverTransport/ServerPrompts.js +51 -0
  339. package/dist/game/serverTransport/ServerPrompts.js.map +1 -0
  340. package/dist/game/serverTransport/ServerStatus.d.ts +12 -0
  341. package/dist/game/serverTransport/ServerStatus.d.ts.map +1 -0
  342. package/dist/game/serverTransport/ServerStatus.js +16 -0
  343. package/dist/game/serverTransport/ServerStatus.js.map +1 -0
  344. package/dist/game/serverTransport/ServerTime.d.ts +39 -0
  345. package/dist/game/serverTransport/ServerTime.d.ts.map +1 -0
  346. package/dist/game/serverTransport/ServerTime.js +57 -0
  347. package/dist/game/serverTransport/ServerTime.js.map +1 -0
  348. package/dist/hooks/useChits.d.ts +4 -0
  349. package/dist/hooks/useChits.d.ts.map +1 -0
  350. package/dist/hooks/useChits.js +24 -0
  351. package/dist/hooks/useChits.js.map +1 -0
  352. package/dist/hooks/useConnection.d.ts +8 -0
  353. package/dist/hooks/useConnection.d.ts.map +1 -0
  354. package/dist/hooks/useConnection.js +14 -0
  355. package/dist/hooks/useConnection.js.map +1 -0
  356. package/dist/hooks/useEventChannelState.d.ts +4 -0
  357. package/dist/hooks/useEventChannelState.d.ts.map +1 -0
  358. package/dist/hooks/useEventChannelState.js +25 -0
  359. package/dist/hooks/useEventChannelState.js.map +1 -0
  360. package/dist/hooks/useGame.d.ts +8 -0
  361. package/dist/hooks/useGame.d.ts.map +1 -0
  362. package/dist/hooks/useGame.js +14 -0
  363. package/dist/hooks/useGame.js.map +1 -0
  364. package/dist/hooks/useGameTheme.d.ts +8 -0
  365. package/dist/hooks/useGameTheme.d.ts.map +1 -0
  366. package/dist/hooks/useGameTheme.js +11 -0
  367. package/dist/hooks/useGameTheme.js.map +1 -0
  368. package/dist/hooks/useModalState.d.ts +7 -0
  369. package/dist/hooks/useModalState.d.ts.map +1 -0
  370. package/dist/hooks/useModalState.js +12 -0
  371. package/dist/hooks/useModalState.js.map +1 -0
  372. package/dist/hooks/usePanelPositioning.d.ts +22 -0
  373. package/dist/hooks/usePanelPositioning.d.ts.map +1 -0
  374. package/dist/hooks/usePanelPositioning.js +10 -0
  375. package/dist/hooks/usePanelPositioning.js.map +1 -0
  376. package/dist/hooks/usePanelScale.d.ts +7 -0
  377. package/dist/hooks/usePanelScale.d.ts.map +1 -0
  378. package/dist/hooks/usePanelScale.js +22 -0
  379. package/dist/hooks/usePanelScale.js.map +1 -0
  380. package/dist/hooks/usePanelStates.d.ts +9 -0
  381. package/dist/hooks/usePanelStates.d.ts.map +1 -0
  382. package/dist/hooks/usePanelStates.js +19 -0
  383. package/dist/hooks/usePanelStates.js.map +1 -0
  384. package/dist/hooks/usePlayer.d.ts +7 -0
  385. package/dist/hooks/usePlayer.d.ts.map +1 -0
  386. package/dist/hooks/usePlayer.js +14 -0
  387. package/dist/hooks/usePlayer.js.map +1 -0
  388. package/dist/hooks/useSmartDebouncedState.d.ts +27 -0
  389. package/dist/hooks/useSmartDebouncedState.d.ts.map +1 -0
  390. package/dist/hooks/useSmartDebouncedState.js +109 -0
  391. package/dist/hooks/useSmartDebouncedState.js.map +1 -0
  392. package/dist/hooks/useTimeController.d.ts +22 -0
  393. package/dist/hooks/useTimeController.d.ts.map +1 -0
  394. package/dist/hooks/useTimeController.js +89 -0
  395. package/dist/hooks/useTimeController.js.map +1 -0
  396. package/dist/hooks/useTokenMap.d.ts +5 -0
  397. package/dist/hooks/useTokenMap.d.ts.map +1 -0
  398. package/dist/hooks/useTokenMap.js +16 -0
  399. package/dist/hooks/useTokenMap.js.map +1 -0
  400. package/dist/hooks/useWebGlRenderer.d.ts +34 -0
  401. package/dist/hooks/useWebGlRenderer.d.ts.map +1 -0
  402. package/dist/hooks/useWebGlRenderer.js +167 -0
  403. package/dist/hooks/useWebGlRenderer.js.map +1 -0
  404. package/dist/index.d.ts +97 -0
  405. package/dist/index.d.ts.map +1 -0
  406. package/dist/index.html +12 -0
  407. package/dist/index.js +62 -0
  408. package/dist/index.js.map +1 -0
  409. package/dist/pretty-chitty.js +190767 -0
  410. package/dist/pretty-chitty.js.map +1 -0
  411. package/dist/rendering/CameraSpec.d.ts +22 -0
  412. package/dist/rendering/CameraSpec.d.ts.map +1 -0
  413. package/dist/rendering/CameraSpec.js +25 -0
  414. package/dist/rendering/CameraSpec.js.map +1 -0
  415. package/dist/rendering/CameraWrapperPerspective.d.ts +44 -0
  416. package/dist/rendering/CameraWrapperPerspective.d.ts.map +1 -0
  417. package/dist/rendering/CameraWrapperPerspective.js +481 -0
  418. package/dist/rendering/CameraWrapperPerspective.js.map +1 -0
  419. package/dist/rendering/ChitGalleryItemInstance.d.ts +31 -0
  420. package/dist/rendering/ChitGalleryItemInstance.d.ts.map +1 -0
  421. package/dist/rendering/ChitGalleryItemInstance.js +75 -0
  422. package/dist/rendering/ChitGalleryItemInstance.js.map +1 -0
  423. package/dist/rendering/ChitRenderInstance.d.ts +104 -0
  424. package/dist/rendering/ChitRenderInstance.d.ts.map +1 -0
  425. package/dist/rendering/ChitRenderInstance.js +902 -0
  426. package/dist/rendering/ChitRenderInstance.js.map +1 -0
  427. package/dist/rendering/ChitRenderSpec.d.ts +80 -0
  428. package/dist/rendering/ChitRenderSpec.d.ts.map +1 -0
  429. package/dist/rendering/ChitRenderSpec.js +152 -0
  430. package/dist/rendering/ChitRenderSpec.js.map +1 -0
  431. package/dist/rendering/HighlightSpec.d.ts +6 -0
  432. package/dist/rendering/HighlightSpec.d.ts.map +1 -0
  433. package/dist/rendering/HighlightSpec.js +6 -0
  434. package/dist/rendering/HighlightSpec.js.map +1 -0
  435. package/dist/rendering/LightSpec.d.ts +17 -0
  436. package/dist/rendering/LightSpec.d.ts.map +1 -0
  437. package/dist/rendering/LightSpec.js +37 -0
  438. package/dist/rendering/LightSpec.js.map +1 -0
  439. package/dist/rendering/LightWrapper.d.ts +19 -0
  440. package/dist/rendering/LightWrapper.d.ts.map +1 -0
  441. package/dist/rendering/LightWrapper.js +114 -0
  442. package/dist/rendering/LightWrapper.js.map +1 -0
  443. package/dist/rendering/RootChitRenderInstance.d.ts +81 -0
  444. package/dist/rendering/RootChitRenderInstance.d.ts.map +1 -0
  445. package/dist/rendering/RootChitRenderInstance.js +372 -0
  446. package/dist/rendering/RootChitRenderInstance.js.map +1 -0
  447. package/dist/rendering/Splay.d.ts +23 -0
  448. package/dist/rendering/Splay.d.ts.map +1 -0
  449. package/dist/rendering/Splay.js +89 -0
  450. package/dist/rendering/Splay.js.map +1 -0
  451. package/dist/rendering/SplayCounter.d.ts +19 -0
  452. package/dist/rendering/SplayCounter.d.ts.map +1 -0
  453. package/dist/rendering/SplayCounter.js +18 -0
  454. package/dist/rendering/SplayCounter.js.map +1 -0
  455. package/dist/rendering/TextureReferenceCounter.d.ts +12 -0
  456. package/dist/rendering/TextureReferenceCounter.d.ts.map +1 -0
  457. package/dist/rendering/TextureReferenceCounter.js +76 -0
  458. package/dist/rendering/TextureReferenceCounter.js.map +1 -0
  459. package/dist/rendering/index.d.ts +1 -0
  460. package/dist/rendering/index.d.ts.map +1 -0
  461. package/dist/rendering/index.js +2 -0
  462. package/dist/rendering/index.js.map +1 -0
  463. package/dist/rendering/outline/DepthVisualizationPass.d.ts +12 -0
  464. package/dist/rendering/outline/DepthVisualizationPass.d.ts.map +1 -0
  465. package/dist/rendering/outline/DepthVisualizationPass.js +93 -0
  466. package/dist/rendering/outline/DepthVisualizationPass.js.map +1 -0
  467. package/dist/rendering/outline/EffectComposer.d.ts +24 -0
  468. package/dist/rendering/outline/EffectComposer.d.ts.map +1 -0
  469. package/dist/rendering/outline/EffectComposer.js +118 -0
  470. package/dist/rendering/outline/EffectComposer.js.map +1 -0
  471. package/dist/rendering/outline/FullScreenQuad.d.ts +12 -0
  472. package/dist/rendering/outline/FullScreenQuad.d.ts.map +1 -0
  473. package/dist/rendering/outline/FullScreenQuad.js +21 -0
  474. package/dist/rendering/outline/FullScreenQuad.js.map +1 -0
  475. package/dist/rendering/outline/IDBasedOutlinePass.d.ts +49 -0
  476. package/dist/rendering/outline/IDBasedOutlinePass.d.ts.map +1 -0
  477. package/dist/rendering/outline/IDBasedOutlinePass.js +597 -0
  478. package/dist/rendering/outline/IDBasedOutlinePass.js.map +1 -0
  479. package/dist/rendering/outline/OutputPass.d.ts +13 -0
  480. package/dist/rendering/outline/OutputPass.d.ts.map +1 -0
  481. package/dist/rendering/outline/OutputPass.js +57 -0
  482. package/dist/rendering/outline/OutputPass.js.map +1 -0
  483. package/dist/rendering/outline/RenderPass.d.ts +13 -0
  484. package/dist/rendering/outline/RenderPass.d.ts.map +1 -0
  485. package/dist/rendering/outline/RenderPass.js +54 -0
  486. package/dist/rendering/outline/RenderPass.js.map +1 -0
  487. package/dist/rendering/outline/SceneWrapper.d.ts +39 -0
  488. package/dist/rendering/outline/SceneWrapper.d.ts.map +1 -0
  489. package/dist/rendering/outline/SceneWrapper.js +522 -0
  490. package/dist/rendering/outline/SceneWrapper.js.map +1 -0
  491. package/dist/rendering/outline/ShaderPass.d.ts +12 -0
  492. package/dist/rendering/outline/ShaderPass.d.ts.map +1 -0
  493. package/dist/rendering/outline/ShaderPass.js +43 -0
  494. package/dist/rendering/outline/ShaderPass.js.map +1 -0
  495. package/dist/rendering/outline/index.d.ts +8 -0
  496. package/dist/rendering/outline/index.d.ts.map +1 -0
  497. package/dist/rendering/outline/index.js +8 -0
  498. package/dist/rendering/outline/index.js.map +1 -0
  499. package/dist/rendering/outline/passes/DebugIDMappingPass.d.ts +20 -0
  500. package/dist/rendering/outline/passes/DebugIDMappingPass.d.ts.map +1 -0
  501. package/dist/rendering/outline/passes/DebugIDMappingPass.js +131 -0
  502. package/dist/rendering/outline/passes/DebugIDMappingPass.js.map +1 -0
  503. package/dist/rendering/outline/passes/DepthOcclusionPass.d.ts +24 -0
  504. package/dist/rendering/outline/passes/DepthOcclusionPass.d.ts.map +1 -0
  505. package/dist/rendering/outline/passes/DepthOcclusionPass.js +95 -0
  506. package/dist/rendering/outline/passes/DepthOcclusionPass.js.map +1 -0
  507. package/dist/rendering/outline/passes/InterMeshEdgeDetectionPass.d.ts +32 -0
  508. package/dist/rendering/outline/passes/InterMeshEdgeDetectionPass.d.ts.map +1 -0
  509. package/dist/rendering/outline/passes/InterMeshEdgeDetectionPass.js +208 -0
  510. package/dist/rendering/outline/passes/InterMeshEdgeDetectionPass.js.map +1 -0
  511. package/dist/rendering/outline/shaders.d.ts +20 -0
  512. package/dist/rendering/outline/shaders.d.ts.map +1 -0
  513. package/dist/rendering/outline/shaders.js +103 -0
  514. package/dist/rendering/outline/shaders.js.map +1 -0
  515. package/dist/rendering/outline/types.d.ts +14 -0
  516. package/dist/rendering/outline/types.d.ts.map +1 -0
  517. package/dist/rendering/outline/types.js +16 -0
  518. package/dist/rendering/outline/types.js.map +1 -0
  519. package/dist/utilities/Annotations.d.ts +60 -0
  520. package/dist/utilities/Annotations.d.ts.map +1 -0
  521. package/dist/utilities/Annotations.js +171 -0
  522. package/dist/utilities/Annotations.js.map +1 -0
  523. package/dist/utilities/BaseTable.d.ts +8 -0
  524. package/dist/utilities/BaseTable.d.ts.map +1 -0
  525. package/dist/utilities/BaseTable.js +35 -0
  526. package/dist/utilities/BaseTable.js.map +1 -0
  527. package/dist/utilities/BboxUtils.d.ts +3 -0
  528. package/dist/utilities/BboxUtils.d.ts.map +1 -0
  529. package/dist/utilities/BboxUtils.js +19 -0
  530. package/dist/utilities/BboxUtils.js.map +1 -0
  531. package/dist/utilities/CanvasStack/CanvasOperations.d.ts +140 -0
  532. package/dist/utilities/CanvasStack/CanvasOperations.d.ts.map +1 -0
  533. package/dist/utilities/CanvasStack/CanvasOperations.js +403 -0
  534. package/dist/utilities/CanvasStack/CanvasOperations.js.map +1 -0
  535. package/dist/utilities/CanvasStack/CanvasStack.d.ts +42 -0
  536. package/dist/utilities/CanvasStack/CanvasStack.d.ts.map +1 -0
  537. package/dist/utilities/CanvasStack/CanvasStack.js +128 -0
  538. package/dist/utilities/CanvasStack/CanvasStack.js.map +1 -0
  539. package/dist/utilities/CanvasStack/IconCanvas.d.ts +10 -0
  540. package/dist/utilities/CanvasStack/IconCanvas.d.ts.map +1 -0
  541. package/dist/utilities/CanvasStack/IconCanvas.js +15 -0
  542. package/dist/utilities/CanvasStack/IconCanvas.js.map +1 -0
  543. package/dist/utilities/CanvasStack/ImageCache.d.ts +8 -0
  544. package/dist/utilities/CanvasStack/ImageCache.d.ts.map +1 -0
  545. package/dist/utilities/CanvasStack/ImageCache.js +29 -0
  546. package/dist/utilities/CanvasStack/ImageCache.js.map +1 -0
  547. package/dist/utilities/CanvasStack/ImageColorOverlayer.d.ts +2 -0
  548. package/dist/utilities/CanvasStack/ImageColorOverlayer.d.ts.map +1 -0
  549. package/dist/utilities/CanvasStack/ImageColorOverlayer.js +31 -0
  550. package/dist/utilities/CanvasStack/ImageColorOverlayer.js.map +1 -0
  551. package/dist/utilities/CanvasStack/PlayerCanvas.d.ts +10 -0
  552. package/dist/utilities/CanvasStack/PlayerCanvas.d.ts.map +1 -0
  553. package/dist/utilities/CanvasStack/PlayerCanvas.js +15 -0
  554. package/dist/utilities/CanvasStack/PlayerCanvas.js.map +1 -0
  555. package/dist/utilities/CanvasStack/ReactCanvas.d.ts +133 -0
  556. package/dist/utilities/CanvasStack/ReactCanvas.d.ts.map +1 -0
  557. package/dist/utilities/CanvasStack/ReactCanvas.js +161 -0
  558. package/dist/utilities/CanvasStack/ReactCanvas.js.map +1 -0
  559. package/dist/utilities/CanvasStack/RichTextRenderer.d.ts +63 -0
  560. package/dist/utilities/CanvasStack/RichTextRenderer.d.ts.map +1 -0
  561. package/dist/utilities/CanvasStack/RichTextRenderer.js +523 -0
  562. package/dist/utilities/CanvasStack/RichTextRenderer.js.map +1 -0
  563. package/dist/utilities/CardMesh.d.ts +17 -0
  564. package/dist/utilities/CardMesh.d.ts.map +1 -0
  565. package/dist/utilities/CardMesh.js +44 -0
  566. package/dist/utilities/CardMesh.js.map +1 -0
  567. package/dist/utilities/Dice.d.ts +24 -0
  568. package/dist/utilities/Dice.d.ts.map +1 -0
  569. package/dist/utilities/Dice.js +148 -0
  570. package/dist/utilities/Dice.js.map +1 -0
  571. package/dist/utilities/EventChannel.d.ts +13 -0
  572. package/dist/utilities/EventChannel.d.ts.map +1 -0
  573. package/dist/utilities/EventChannel.js +47 -0
  574. package/dist/utilities/EventChannel.js.map +1 -0
  575. package/dist/utilities/GalleryItemConversion.d.ts +4 -0
  576. package/dist/utilities/GalleryItemConversion.d.ts.map +1 -0
  577. package/dist/utilities/GalleryItemConversion.js +28 -0
  578. package/dist/utilities/GalleryItemConversion.js.map +1 -0
  579. package/dist/utilities/IUpdatingCanvas.d.ts +19 -0
  580. package/dist/utilities/IUpdatingCanvas.d.ts.map +1 -0
  581. package/dist/utilities/IUpdatingCanvas.js +2 -0
  582. package/dist/utilities/IUpdatingCanvas.js.map +1 -0
  583. package/dist/utilities/LayoutHelper.d.ts +34 -0
  584. package/dist/utilities/LayoutHelper.d.ts.map +1 -0
  585. package/dist/utilities/LayoutHelper.js +451 -0
  586. package/dist/utilities/LayoutHelper.js.map +1 -0
  587. package/dist/utilities/ObjectWithProps.d.ts +5 -0
  588. package/dist/utilities/ObjectWithProps.d.ts.map +1 -0
  589. package/dist/utilities/ObjectWithProps.js +65 -0
  590. package/dist/utilities/ObjectWithProps.js.map +1 -0
  591. package/dist/utilities/OutlineCanvas.d.ts +12 -0
  592. package/dist/utilities/OutlineCanvas.d.ts.map +1 -0
  593. package/dist/utilities/OutlineCanvas.js +31 -0
  594. package/dist/utilities/OutlineCanvas.js.map +1 -0
  595. package/dist/utilities/OutlineGeometry.d.ts +3 -0
  596. package/dist/utilities/OutlineGeometry.d.ts.map +1 -0
  597. package/dist/utilities/OutlineGeometry.js +57 -0
  598. package/dist/utilities/OutlineGeometry.js.map +1 -0
  599. package/dist/utilities/ParameterizedCanvas.d.ts +13 -0
  600. package/dist/utilities/ParameterizedCanvas.d.ts.map +1 -0
  601. package/dist/utilities/ParameterizedCanvas.js +85 -0
  602. package/dist/utilities/ParameterizedCanvas.js.map +1 -0
  603. package/dist/utilities/RequestSharedAnimationFrame.d.ts +2 -0
  604. package/dist/utilities/RequestSharedAnimationFrame.d.ts.map +1 -0
  605. package/dist/utilities/RequestSharedAnimationFrame.js +16 -0
  606. package/dist/utilities/RequestSharedAnimationFrame.js.map +1 -0
  607. package/dist/utilities/StaticImage.d.ts +19 -0
  608. package/dist/utilities/StaticImage.d.ts.map +1 -0
  609. package/dist/utilities/StaticImage.js +38 -0
  610. package/dist/utilities/StaticImage.js.map +1 -0
  611. package/dist/utilities/SvgExtruder.d.ts +20 -0
  612. package/dist/utilities/SvgExtruder.d.ts.map +1 -0
  613. package/dist/utilities/SvgExtruder.js +238 -0
  614. package/dist/utilities/SvgExtruder.js.map +1 -0
  615. package/dist/utilities/ThreeDisposer.d.ts +11 -0
  616. package/dist/utilities/ThreeDisposer.d.ts.map +1 -0
  617. package/dist/utilities/ThreeDisposer.js +53 -0
  618. package/dist/utilities/ThreeDisposer.js.map +1 -0
  619. package/dist/utilities/zIndex.d.ts +14 -0
  620. package/dist/utilities/zIndex.d.ts.map +1 -0
  621. package/dist/utilities/zIndex.js +14 -0
  622. package/dist/utilities/zIndex.js.map +1 -0
  623. package/package.json +138 -0
  624. package/src/library/assets/checker.svg +4 -0
  625. package/src/library/assets/cutout.svg +22 -0
  626. package/src/library/components/ActionLogDisplay.tsx +183 -0
  627. package/src/library/components/ActionLogHistory.tsx +127 -0
  628. package/src/library/components/ActionLogHistoryDisplay.tsx +21 -0
  629. package/src/library/components/ActionLogSidebar.tsx +17 -0
  630. package/src/library/components/BottomBar.tsx +78 -0
  631. package/src/library/components/BottomBarBreak.tsx +12 -0
  632. package/src/library/components/BottomBarButton.tsx +181 -0
  633. package/src/library/components/CanvasLibraryViewer.tsx +86 -0
  634. package/src/library/components/ChitLibraryViewer.tsx +168 -0
  635. package/src/library/components/ClientTrustMatchViewer.tsx +83 -0
  636. package/src/library/components/ContextGalleryDisplay.tsx +72 -0
  637. package/src/library/components/GalleryDisplay.tsx +57 -0
  638. package/src/library/components/GalleryPlayground.tsx +50 -0
  639. package/src/library/components/GalleryViewer.tsx +773 -0
  640. package/src/library/components/GameDesigner.tsx +39 -0
  641. package/src/library/components/GameDialog.tsx +43 -0
  642. package/src/library/components/GameModalBackdrop.tsx +47 -0
  643. package/src/library/components/GameModalDialog.tsx +77 -0
  644. package/src/library/components/LiveButton.tsx +26 -0
  645. package/src/library/components/MatchEndDisplay.tsx +120 -0
  646. package/src/library/components/MatchViewer.tsx +111 -0
  647. package/src/library/components/ObjectWithPropsEditor.tsx +169 -0
  648. package/src/library/components/Panel/MultiPanel.tsx +276 -0
  649. package/src/library/components/Panel/PanelContents.tsx +359 -0
  650. package/src/library/components/Panel/PanelTabStack.tsx +103 -0
  651. package/src/library/components/Panel/SinglePanel.tsx +75 -0
  652. package/src/library/components/Panel/ViewerWrapper.tsx +131 -0
  653. package/src/library/components/Panel/ViewerZoomControls.tsx +216 -0
  654. package/src/library/components/Panel/util.ts +7 -0
  655. package/src/library/components/PanelSpark.tsx +112 -0
  656. package/src/library/components/PersistentCanvas.tsx +81 -0
  657. package/src/library/components/PlayerImage.tsx +40 -0
  658. package/src/library/components/Playground.tsx +285 -0
  659. package/src/library/components/PromptControls.tsx +132 -0
  660. package/src/library/components/SelectableItemAndStage.tsx +49 -0
  661. package/src/library/components/SettingsDisplay.tsx +142 -0
  662. package/src/library/components/SparkLineChart.tsx +307 -0
  663. package/src/library/components/StageAndEditor.tsx +28 -0
  664. package/src/library/components/TimeControlBar.tsx +71 -0
  665. package/src/library/components/TokenizedMessage.tsx +206 -0
  666. package/src/library/components/TopBar.tsx +90 -0
  667. package/src/library/components/TopBarDropdown.tsx +94 -0
  668. package/src/library/components/TopBarPlayers.tsx +163 -0
  669. package/src/library/components/UpdatingCanvasImage.tsx +25 -0
  670. package/src/library/components/UpdatingCanvasViewer.tsx +62 -0
  671. package/src/library/components/Viewer.tsx +360 -0
  672. package/src/library/components/index.ts +0 -0
  673. package/src/library/game/Chit.test.ts +66 -0
  674. package/src/library/game/Chit.ts +575 -0
  675. package/src/library/game/ClientTimeState.ts +42 -0
  676. package/src/library/game/ClockDetails.ts +24 -0
  677. package/src/library/game/Connection.test.ts +50 -0
  678. package/src/library/game/Connection.ts +122 -0
  679. package/src/library/game/ConnectionObject.ts +13 -0
  680. package/src/library/game/ConnectionTransport.ts +52 -0
  681. package/src/library/game/DropdownChit.tsx +17 -0
  682. package/src/library/game/GalleryItemChitChildrenSource.ts +31 -0
  683. package/src/library/game/GalleryItemRawSource.ts +15 -0
  684. package/src/library/game/Game.ts +55 -0
  685. package/src/library/game/GameBagChit.ts +42 -0
  686. package/src/library/game/GameButton.ts +127 -0
  687. package/src/library/game/GameDeckChit.ts +77 -0
  688. package/src/library/game/GameTheme.ts +122 -0
  689. package/src/library/game/Match.ts +187 -0
  690. package/src/library/game/MatchConnection.ts +5 -0
  691. package/src/library/game/MatchStorage.ts +51 -0
  692. package/src/library/game/ModalState.ts +29 -0
  693. package/src/library/game/OrderedOutlet.ts +198 -0
  694. package/src/library/game/Pick.ts +314 -0
  695. package/src/library/game/PlayerChit.ts +43 -0
  696. package/src/library/game/PlayerInfo.ts +30 -0
  697. package/src/library/game/PlayerPromptStatusChit.ts +20 -0
  698. package/src/library/game/Prompt.ts +292 -0
  699. package/src/library/game/RootChit.ts +54 -0
  700. package/src/library/game/SparkChit.ts +97 -0
  701. package/src/library/game/StaticChitTypeRegistry.ts +3 -0
  702. package/src/library/game/Turn.test.ts +611 -0
  703. package/src/library/game/Turn.ts +1249 -0
  704. package/src/library/game/TurnState.ts +187 -0
  705. package/src/library/game/clientTransport/ClientPrompts.ts +102 -0
  706. package/src/library/game/clientTransport/ClientStatus.ts +36 -0
  707. package/src/library/game/clientTransport/ClientTime.ts +256 -0
  708. package/src/library/game/index.ts +0 -0
  709. package/src/library/game/serverTransport/ServerPrompts.ts +76 -0
  710. package/src/library/game/serverTransport/ServerStatus.ts +31 -0
  711. package/src/library/game/serverTransport/ServerTime.ts +74 -0
  712. package/src/library/hooks/useChits.ts +32 -0
  713. package/src/library/hooks/useConnection.tsx +16 -0
  714. package/src/library/hooks/useEventChannelState.ts +33 -0
  715. package/src/library/hooks/useGame.tsx +16 -0
  716. package/src/library/hooks/useGameTheme.tsx +12 -0
  717. package/src/library/hooks/useModalState.tsx +13 -0
  718. package/src/library/hooks/usePanelPositioning.tsx +31 -0
  719. package/src/library/hooks/usePanelScale.tsx +23 -0
  720. package/src/library/hooks/usePanelStates.ts +30 -0
  721. package/src/library/hooks/usePlayer.tsx +15 -0
  722. package/src/library/hooks/useSmartDebouncedState.ts +161 -0
  723. package/src/library/hooks/useTimeController.tsx +108 -0
  724. package/src/library/hooks/useTokenMap.ts +20 -0
  725. package/src/library/hooks/useWebGlRenderer.tsx +227 -0
  726. package/src/library/index.ts +116 -0
  727. package/src/library/rendering/CameraSpec.ts +25 -0
  728. package/src/library/rendering/CameraWrapperPerspective.ts +612 -0
  729. package/src/library/rendering/ChitGalleryItemInstance.ts +108 -0
  730. package/src/library/rendering/ChitRenderInstance.ts +1141 -0
  731. package/src/library/rendering/ChitRenderSpec.ts +213 -0
  732. package/src/library/rendering/HighlightSpec.ts +5 -0
  733. package/src/library/rendering/LightSpec.ts +41 -0
  734. package/src/library/rendering/LightWrapper.ts +152 -0
  735. package/src/library/rendering/RootChitRenderInstance.ts +460 -0
  736. package/src/library/rendering/Splay.ts +118 -0
  737. package/src/library/rendering/SplayCounter.tsx +37 -0
  738. package/src/library/rendering/TextureReferenceCounter.ts +86 -0
  739. package/src/library/rendering/index.ts +0 -0
  740. package/src/library/rendering/outline/DepthVisualizationPass.ts +117 -0
  741. package/src/library/rendering/outline/EffectComposer.ts +187 -0
  742. package/src/library/rendering/outline/FullScreenQuad.ts +32 -0
  743. package/src/library/rendering/outline/IDBasedOutlinePass.ts +741 -0
  744. package/src/library/rendering/outline/OutputPass.ts +88 -0
  745. package/src/library/rendering/outline/RenderPass.ts +72 -0
  746. package/src/library/rendering/outline/SceneWrapper.ts +617 -0
  747. package/src/library/rendering/outline/ShaderPass.ts +50 -0
  748. package/src/library/rendering/outline/index.ts +8 -0
  749. package/src/library/rendering/outline/passes/DebugIDMappingPass.ts +154 -0
  750. package/src/library/rendering/outline/passes/DepthOcclusionPass.ts +106 -0
  751. package/src/library/rendering/outline/passes/InterMeshEdgeDetectionPass.ts +244 -0
  752. package/src/library/rendering/outline/shaders.ts +110 -0
  753. package/src/library/rendering/outline/types.ts +25 -0
  754. package/src/library/utilities/Annotations.ts +188 -0
  755. package/src/library/utilities/BaseTable.tsx +58 -0
  756. package/src/library/utilities/BboxUtils.ts +23 -0
  757. package/src/library/utilities/CanvasStack/CanvasOperations.tsx +630 -0
  758. package/src/library/utilities/CanvasStack/CanvasStack.ts +191 -0
  759. package/src/library/utilities/CanvasStack/IconCanvas.tsx +17 -0
  760. package/src/library/utilities/CanvasStack/ImageCache.ts +38 -0
  761. package/src/library/utilities/CanvasStack/ImageColorOverlayer.ts +36 -0
  762. package/src/library/utilities/CanvasStack/PlayerCanvas.tsx +17 -0
  763. package/src/library/utilities/CanvasStack/ReactCanvas.tsx +293 -0
  764. package/src/library/utilities/CanvasStack/RichTextRenderer.ts +719 -0
  765. package/src/library/utilities/CardMesh.ts +55 -0
  766. package/src/library/utilities/Dice.tsx +183 -0
  767. package/src/library/utilities/EventChannel.ts +52 -0
  768. package/src/library/utilities/GalleryItemConversion.ts +30 -0
  769. package/src/library/utilities/IUpdatingCanvas.ts +14 -0
  770. package/src/library/utilities/LayoutHelper.ts +586 -0
  771. package/src/library/utilities/ObjectWithProps.ts +52 -0
  772. package/src/library/utilities/OutlineCanvas.tsx +45 -0
  773. package/src/library/utilities/OutlineGeometry.ts +69 -0
  774. package/src/library/utilities/ParameterizedCanvas.ts +78 -0
  775. package/src/library/utilities/RequestSharedAnimationFrame.ts +16 -0
  776. package/src/library/utilities/StaticImage.tsx +58 -0
  777. package/src/library/utilities/SvgExtruder.ts +330 -0
  778. package/src/library/utilities/ThreeDisposer.ts +66 -0
  779. package/src/library/utilities/zIndex.ts +15 -0
@@ -0,0 +1,1031 @@
1
+ import nextTick from "next-tick";
2
+ import { Chit } from "./Chit";
3
+ import { NoValidMovesPrompt, PickPrompt, SelectPrompt } from "./Prompt";
4
+ import { Pick } from "./Pick";
5
+ import { Confirm, GameButton } from "./GameButton";
6
+ /**
7
+ *
8
+ * A `Turn` is the heart of pretty-chitty. It represents multiple actions or sequences of events from a
9
+ * single player (or possibly not player).
10
+ *
11
+ * The core of a `Turn` is the async `fn` provided. This `fn` will run all of this logic for that turn,
12
+ * prompt the user for actions, take random number draws and possibly create one or more sub-turns.
13
+ *
14
+ * The general pattern will look something like this:
15
+ *
16
+ * ```
17
+ * setup.createTurn([rootChit, playerChit], playerChit, async (turn) => {
18
+ *
19
+ * // take a random number
20
+ * const randomDraw = await turn.rng();
21
+ *
22
+ * // ask the turn's player to make a decision.
23
+ * await turn.pick([Chit.pick([chit1,chit2], async chosenChit => {
24
+ * // do something with chosen chit
25
+ * })]);
26
+ * });
27
+ * ```
28
+ *
29
+ * There are a couple of VERY important details here:
30
+ *
31
+ * 1) Your turn implemention should persist no state itself.
32
+ * 2) Your turn is going to "lock" one or more chits. Those chits will only be editable by this turn (until the turn is done or a sub-turn briefly locks those same chits)
33
+ * 3) If a user needs to "undo" something, it will automatically reset all of the locked chits to their original locked state and re-evaluate the turn from its beginning to easily handle a single "step back".
34
+ * 4) As a result, all random numbers need to go through this turn's rng() so they are persisted correctly.
35
+ * 5) All state should be either ephemeral or stored on the chits themselves. Remember that your turn's function may re-evaluate at any point!
36
+ * 6) It will automatically handle prompting a user for confirmation before drawing a random number OR before changing the active player.
37
+ *
38
+ * @group Core Game Elements
39
+ */
40
+ export class Turn {
41
+ /**
42
+ * The root chit instance of the game. All chits in the game have this chit somewhere in its hierarchy
43
+ */
44
+ get rootChit() {
45
+ return this.findChit("root");
46
+ }
47
+ constructor(id,
48
+ /** @internal */
49
+ match,
50
+ /** @internal */
51
+ state,
52
+ /** @internal */
53
+ fn,
54
+ /** @internal */
55
+ chitsToLock, player,
56
+ /** @internal */
57
+ parent) {
58
+ this.id = id;
59
+ this.match = match;
60
+ this.state = state;
61
+ this.fn = fn;
62
+ this.chitsToLock = chitsToLock;
63
+ this.player = player;
64
+ this.parent = parent;
65
+ this.pass = 0;
66
+ this.clockSteps = [];
67
+ this.decisionIndex = 0; // decision points that can be potentially rolled back
68
+ /** @internal */
69
+ this.completed = false;
70
+ /** @internal */
71
+ this.activeSubTurns = [];
72
+ /** @internal */
73
+ this.destroyed = false;
74
+ /** @internal */
75
+ this.paused = Promise.resolve();
76
+ this.newChitCounter = {};
77
+ this.chitLookup = {};
78
+ this.lockedChitStates = {};
79
+ this.lastChitStates = {};
80
+ /**
81
+ * Locates a chit by its ID. If not found, will throw.
82
+ * @param id
83
+ * @returns the found chit
84
+ * @throws If the chit is missing
85
+ * @internal
86
+ */
87
+ this.findChit = (id) => {
88
+ // store as an arrow fn so it can be passed as a fn reference and retain 'this'
89
+ const result = this.chitLookup[id];
90
+ if (!result) {
91
+ if (this.parent) {
92
+ return this.parent.findChit(id);
93
+ }
94
+ throw new Error("Cannot find chit");
95
+ }
96
+ return result;
97
+ };
98
+ this.isProcessingSavedState = false;
99
+ if (chitsToLock.find((chit) => !chit.id)) {
100
+ throw new Error("Cannot lock a chit without an id");
101
+ }
102
+ // store our chit lookup plus the initial states of all of those chits
103
+ // so if we have to reset, we can just restore those states
104
+ Chit.walk(chitsToLock, (c) => {
105
+ if (!c.id) {
106
+ throw new Error("Cannot lock a chit without an id");
107
+ }
108
+ c.lock(this);
109
+ this.chitLookup[c.id] = c;
110
+ });
111
+ // this has to be done after we capture and lock the chits, but we need player ids so we can properly serialize
112
+ // chits
113
+ this._playerIds = this.rootChit.players.map((p) => {
114
+ if (!p.id) {
115
+ throw new Error("Cannot create turns for players without IDs");
116
+ }
117
+ return p.id;
118
+ });
119
+ // now serialize all chits in their "locked" state
120
+ Object.values(this.chitLookup).forEach((c) => {
121
+ if (!c.id) {
122
+ throw new Error("Cannot serialize a chit without an id");
123
+ }
124
+ this.lastChitStates[c.id] = this.lockedChitStates[c.id] = c.serialize(this._playerIds);
125
+ });
126
+ }
127
+ /**
128
+ * Generates a random number from 0 to 1. This number will persisted in state and will be consistent if the
129
+ * turn needs to be re-run. Drawing a random number prevents normal resets.
130
+ *
131
+ * If the player can perform a reset, this will confirm with them first.
132
+ *
133
+ * @returns A number from 0-1
134
+ */
135
+ async rng(message = "confirm draw or roll") {
136
+ await this.possiblyConfirm(message);
137
+ const result = this.state.getOrCreateRng(this.decisionIndex);
138
+ this.decisionIndex++;
139
+ return result;
140
+ }
141
+ /**
142
+ * Generates a series of random numbers from 0 to 1. This is a helper method to help batch up a lot of random draws
143
+ * since each rng() call must be awaited.
144
+ * @param count
145
+ * @returns A parameterless function that will return the next random number in the list. If you try to select too many random numbers, that method will throw.
146
+ */
147
+ async takeRng(count, message = "confirm draw or roll") {
148
+ await this.possiblyConfirm(message);
149
+ const results = [];
150
+ for (let i = 0; i < count; i++) {
151
+ results.push(this.state.getOrCreateRng(this.decisionIndex));
152
+ this.decisionIndex++;
153
+ }
154
+ let counter = 0;
155
+ return () => {
156
+ if (counter >= results.length) {
157
+ throw new Error("RNG take out of bounds");
158
+ }
159
+ return results[counter++];
160
+ };
161
+ }
162
+ /**
163
+ * Add a game log message to the last flush step
164
+ * @param message
165
+ */
166
+ log(message) {
167
+ let step = this.clockSteps[this.clockSteps.length - 1];
168
+ if (!step || !(step instanceof FlushClockStep) || step.log !== undefined) {
169
+ // flushing any changes while there are active subturns makes timelines *VERY* difficult
170
+ if (this.activeSubTurns.length) {
171
+ throw new Error("Cannot flush while subturns are active");
172
+ }
173
+ this.flush(true);
174
+ step = this.clockSteps[this.clockSteps.length - 1];
175
+ }
176
+ const flushStep = step;
177
+ flushStep.log = message;
178
+ }
179
+ /**
180
+ * Append a game log message to the last flush step that has a game log message
181
+ * @param message
182
+ * @returns
183
+ */
184
+ amendLog(message) {
185
+ const lastSubTurnIndex = this.clockSteps.findLastIndex((step) => step instanceof SubTurnsClockStep);
186
+ const lastIndex = this.clockSteps.findLastIndex((step, index) => index > lastSubTurnIndex && step instanceof FlushClockStep && step.log);
187
+ if (lastIndex < 0) {
188
+ if (message instanceof Function) {
189
+ message = message("");
190
+ }
191
+ this.log(message);
192
+ return;
193
+ }
194
+ const step = this.clockSteps[lastIndex];
195
+ if (message instanceof Function) {
196
+ message = message(step.log);
197
+ }
198
+ step.log = message;
199
+ }
200
+ /**
201
+ * Scan all of the chits managed by this turn. If any of them have changed, group them together into a
202
+ * "ClockStep". If any new chits appear, then add them to our lookup. If any chits are deleted (orphaned),
203
+ * then we have to identify those as well.
204
+ */
205
+ flush(force = false) {
206
+ const seenIds = new Set();
207
+ const newStates = {};
208
+ let sawChange = force;
209
+ // first ensure they all are locked and all have ids
210
+ const chitsToAddIdsTo = [];
211
+ Chit.walk(this.chitsToLock, (c) => {
212
+ if (!c.id) {
213
+ chitsToAddIdsTo.push(c);
214
+ }
215
+ });
216
+ chitsToAddIdsTo.sort((a, b) => a.createdOrder - b.createdOrder);
217
+ chitsToAddIdsTo.forEach((c) => {
218
+ const type = c.chitTypeName();
219
+ const counter = (this.newChitCounter[type] || 0) + 1;
220
+ this.newChitCounter[type] = counter;
221
+ c.id = `${this.id}.${type}.${counter}`;
222
+ c.lock(this);
223
+ const existing = this.chitLookup[c.id];
224
+ this.chitLookup[c.id] = c; // it's possible that this is kicking out an "old" version of this chit from a previous pass
225
+ if (existing) {
226
+ existing.removeFromParent(); // do not want to leave stray references to this cloned chit around!
227
+ existing.unlock(this);
228
+ }
229
+ });
230
+ // now (once per chit) we serialize the state if it changed
231
+ Chit.walk(this.chitsToLock, (c) => {
232
+ if (!c.id) {
233
+ throw new Error("Should not be possible unless Chit.walk is misbehaving");
234
+ }
235
+ if (!seenIds.has(c.id)) {
236
+ seenIds.add(c.id);
237
+ const serialized = c.serialize(this._playerIds);
238
+ const lastState = this.lastChitStates[c.id];
239
+ if (serialized !== lastState) {
240
+ this.lastChitStates[c.id] = newStates[c.id] = serialized;
241
+ sawChange = true;
242
+ }
243
+ else {
244
+ newStates[c.id] = serialized;
245
+ }
246
+ }
247
+ else {
248
+ return false; // already saw this - no need to keep digging into children
249
+ }
250
+ });
251
+ // find any chits that we previously serialized that we no longer see
252
+ // these should be marked as deleted now
253
+ const chitsToDelete = Object.keys(this.lastChitStates)
254
+ .filter((id) => !seenIds.has(id) && this.lastChitStates[id] !== Chit.deletedIfSerialized())
255
+ .map((id) => this.findChit(id));
256
+ // make sure any missing items that were previously also missing are still deleted
257
+ Object.keys(this.lastChitStates)
258
+ .filter((id) => !seenIds.has(id) && this.lastChitStates[id] == Chit.deletedIfSerialized())
259
+ .forEach((id) => {
260
+ newStates[id] = Chit.deletedIfSerialized();
261
+ });
262
+ // find all chits without parents - all of their descendants are safe to be purged
263
+ chitsToDelete
264
+ .filter((chit) => !chit.parent)
265
+ .forEach((chit) => {
266
+ if (chit.id) {
267
+ sawChange = true;
268
+ chit.unlock(this);
269
+ newStates[chit.id] = Chit.deletedIfSerialized();
270
+ // do not store this new state in lastChitStates, but rather delete this record from it altogether
271
+ chit.walk((c) => {
272
+ if (c.id) {
273
+ seenIds.add(c.id);
274
+ this.lastChitStates[c.id] = Chit.deletedIfSerialized();
275
+ newStates[c.id] = Chit.deletedIfSerialized();
276
+ chit.unlock(this);
277
+ }
278
+ });
279
+ }
280
+ });
281
+ // any chits remaining that we haven't seen are bad news - they have likely been reparented to some other Turn, which
282
+ // is against the rules. They need to remain under this turns control.
283
+ if (chitsToDelete.find((c) => c.id && !seenIds.has(c.id))) {
284
+ throw new Error("Chit has been reparented to another Turn which will corrupt control");
285
+ }
286
+ if (sawChange) {
287
+ // flushing any changes while there are active subturns makes timelines *VERY* difficult
288
+ if (this.activeSubTurns.length) {
289
+ throw new Error("Cannot flush while subturns are active");
290
+ }
291
+ this.clockSteps.push(new FlushClockStep(this.clock, newStates));
292
+ }
293
+ }
294
+ /**
295
+ * Creates a sub-turn. This is useful for a few reasons:
296
+ * 1) It is the only way to change game control flow from our current player to a different player
297
+ * 2) It creates a new "reset" point for backing out turns
298
+ *
299
+ * It takes an async function which it will execute. For simplicity, the result of that function will be the result of
300
+ * this function.
301
+ *
302
+ * It is okay to have multiple turns going at once, but there are some rules:
303
+ * 1) If there is an ongoing sub turn that hasn't resolved, you cannot prompt or change chits in this turn.
304
+ * 2) There is only one ongoing subturn allowed per player.
305
+ *
306
+ * @param chits The chits to lock. These are the only chits that will be allowed to be modified by this turn. If there are never any concurrent turns, this can safely be the root chit (although there maybe minor performance implications)
307
+ * @param player The player who will be prompted for choices during this turn.
308
+ * @param cb The async function that will be the logic of this turn. The function takes a new turn instance
309
+ * @returns Whatever the final result of cb() is
310
+ */
311
+ async createTurn(chits, player, cb) {
312
+ if (this.unresolvedPrompt) {
313
+ throw new Error("Still awaiting a prompt result");
314
+ }
315
+ if (this.destroyed) {
316
+ throw new DestroyError(); // do not create more turns if we are destroyed!
317
+ }
318
+ await this.checkPause();
319
+ this.flush();
320
+ if (player.playerId && player.playerId !== this.player?.playerId) {
321
+ await this.possiblyConfirm("confirm switching active player");
322
+ this.flush();
323
+ }
324
+ if (player) {
325
+ chits = chits.concat(player);
326
+ }
327
+ if (player && this.activeSubTurns.find((subTurn) => subTurn.player === player)) {
328
+ throw new Error("Only one sub-turn can be active at a time per player");
329
+ }
330
+ const id = `${this.id}.t${this.decisionIndex}`;
331
+ const s = this.state.getOrCreateTurnState(this.decisionIndex);
332
+ s.playerId = player?.playerId;
333
+ s.id = id;
334
+ Chit.walk(chits, (chit) => chit.unlock(this));
335
+ const turn = new Turn(id, this.match, s, cb, chits, player, this);
336
+ this.decisionIndex++;
337
+ if (this.activeSubTurns.length === 0) {
338
+ this.clockSteps.push(new SubTurnsClockStep(this.clock, [turn]));
339
+ }
340
+ else {
341
+ const lastStep = this.clockSteps[this.clockSteps.length - 1];
342
+ if (!(lastStep instanceof SubTurnsClockStep)) {
343
+ throw new Error("Unexpected clocksteps stage");
344
+ }
345
+ lastStep.turns.push(turn);
346
+ }
347
+ this.activeSubTurns.push(turn);
348
+ //make sure flow goes to next tick
349
+ await new Promise((resolve) => nextTick(() => resolve(true)));
350
+ await this.checkPause();
351
+ const result = await turn.execute();
352
+ await this.checkPause();
353
+ this.activeSubTurns = this.activeSubTurns.filter((t) => t !== turn);
354
+ Object.values(turn.chitLookup).forEach((chit) => {
355
+ if (chit.id) {
356
+ chit.lock(this);
357
+ this.chitLookup[chit.id] = chit;
358
+ }
359
+ });
360
+ this.lastChitStates = { ...this.lastChitStates, ...turn.lastChitStates };
361
+ return result;
362
+ }
363
+ async runParallelTurns(players, chits, action) {
364
+ // the whole point of this function is so we can mark all players as having a prompt waiting for them
365
+ players.forEach((player) => (player.promptStatus.latestPromptMessage = "Waiting for turn to complete"));
366
+ const turns = players.map((player) => this.createTurn(chits(player), player, (turn) => action(player, turn)));
367
+ return await Promise.all(turns);
368
+ }
369
+ /**
370
+ * Basic selection prompt. All chits will appear as "selected" on the respective client.
371
+ * Upon clicking one, the prompt will resolve itself.
372
+ *
373
+ * @param chits The list of chits that can be selected from
374
+ * @returns The chit that the player selected
375
+ */
376
+ async select(chits) {
377
+ if (chits.length === 1) {
378
+ return chits[0];
379
+ }
380
+ const prompt = new SelectPrompt();
381
+ prompt.chits = chits;
382
+ this.prepareForPrompt(prompt);
383
+ // make sure all of these chits are locked by us - otherwise someone has made a mistake.
384
+ chits.forEach((chit) => chit.confirmLock(this));
385
+ await this.waitForPromptResolution(prompt);
386
+ if (!prompt.selectedChit) {
387
+ throw new Error("Prompt should have selected chit response");
388
+ }
389
+ return prompt.selectedChit;
390
+ }
391
+ /**
392
+ * If a player has gotten themselves into a corner - i.e. no valid moves - this prompt will
393
+ * simply inform them of that and allow them to undo.
394
+ * @param message
395
+ * @param help
396
+ */
397
+ async noValidMoves(message, help) {
398
+ const prompt = new NoValidMovesPrompt();
399
+ if (message) {
400
+ prompt.message = message;
401
+ }
402
+ if (help) {
403
+ prompt.help = help;
404
+ }
405
+ this.prepareForPrompt(prompt);
406
+ await this.waitForPromptResolution(prompt);
407
+ }
408
+ /**
409
+ * More complex selection prompt. Useful in Typescript when you want to handle a response to multiple
410
+ * types of chits. This will allow a different typed callback per set of chits. This also allows
411
+ * the insertion of "buttons"
412
+ * @param message (optional) The message to show describing the prompt in a few words
413
+ * @param help (optional) A detailed help message to show
414
+ * @param picks An array of "picks" - each of which can have its own typesafe callback
415
+ */
416
+ async pick(message, help, picks) {
417
+ if (typeof message !== "string") {
418
+ picks = message;
419
+ message = undefined;
420
+ help = undefined;
421
+ }
422
+ if (help !== undefined && typeof help !== "string") {
423
+ picks = help;
424
+ help = undefined;
425
+ }
426
+ if (picks === undefined) {
427
+ throw new Error("No PIcks");
428
+ }
429
+ if (!Array.isArray(picks)) {
430
+ picks = [picks];
431
+ }
432
+ const prompt = new PickPrompt();
433
+ prompt.setMessageAndHelp(message, help);
434
+ const flatPicks = [...picks]
435
+ .flat()
436
+ .map((o) => {
437
+ if (!o) {
438
+ return;
439
+ }
440
+ if (o instanceof Pick) {
441
+ return o;
442
+ }
443
+ if (o instanceof GameButton) {
444
+ return GameButton.pick(o);
445
+ }
446
+ throw new Error("Invalid type");
447
+ })
448
+ .filter((a) => a && a.numberOfChoices() > 0);
449
+ prompt.picks = flatPicks;
450
+ if (flatPicks.length === 0) {
451
+ return;
452
+ }
453
+ const autoresolved = await prompt.autoResolve();
454
+ if (!autoresolved) {
455
+ this.prepareForPrompt(prompt);
456
+ // make sure all of these chits are locked by us - otherwise someone has made a mistake.
457
+ flatPicks.forEach((pick) => pick.confirmLock(this));
458
+ await this.waitForPromptResolution(prompt);
459
+ await prompt.finished();
460
+ }
461
+ }
462
+ /** @internal */
463
+ rerun(turn) {
464
+ this.activeSubTurns.forEach((t) => t.rerun(turn));
465
+ if (this.unresolvedPrompt) {
466
+ this.unresolvedPrompt.shouldRerun = turn;
467
+ this.unresolvedPrompt.resolve({});
468
+ }
469
+ }
470
+ /** @internal */
471
+ async possiblyConfirm(action) {
472
+ if (this.state.hasUserMadeChoiceSinceUserContextChangedOrRng(this.decisionIndex - 1)) {
473
+ const c = new Confirm(() => { });
474
+ c.message = action;
475
+ await this.pick([c]);
476
+ }
477
+ }
478
+ /**
479
+ * This is only useful at the 'root' turn level, really.
480
+ * @internal
481
+ */
482
+ async processNewSavedState(state) {
483
+ if (this.isProcessingSavedState) {
484
+ this.nextSavedStateToProcess = state;
485
+ return;
486
+ }
487
+ try {
488
+ this.isProcessingSavedState = true;
489
+ this.pause();
490
+ // defer to next tick on starting
491
+ await new Promise((resolve) => nextTick(() => resolve()));
492
+ const instructions = this.handleNewSavedState(state);
493
+ this.propagateNewState(state);
494
+ for (const instruction of instructions) {
495
+ if (instruction.type === "reset") {
496
+ this.state = state;
497
+ instruction.turn.rerun(instruction.turn);
498
+ }
499
+ else if (instruction.type === "prompt") {
500
+ await new Promise((resolve, reject) => nextTick(() => {
501
+ if (instruction.turn.unresolvedPrompt !== instruction.prompt) {
502
+ reject("waiting on incorrect prompt");
503
+ }
504
+ instruction.prompt.resolve(instruction.response);
505
+ resolve();
506
+ }));
507
+ }
508
+ }
509
+ // always defer to next tick again when resuming
510
+ await new Promise((resolve) => nextTick(() => resolve()));
511
+ }
512
+ finally {
513
+ this.unpause();
514
+ this.isProcessingSavedState = false;
515
+ if (this.nextSavedStateToProcess) {
516
+ const newState = this.nextSavedStateToProcess;
517
+ this.nextSavedStateToProcess = undefined;
518
+ this.processNewSavedState(newState);
519
+ }
520
+ }
521
+ }
522
+ /** @internal */
523
+ propagateNewState(state) {
524
+ this.state = state;
525
+ this.activeSubTurns.forEach((t) => {
526
+ const newState = state.decisions.find((decision) => decision.type === "turn" && decision.id === t.id);
527
+ if (newState) {
528
+ t.propagateNewState(newState);
529
+ }
530
+ });
531
+ }
532
+ /** @internal */
533
+ handleNewSavedState(state) {
534
+ const oldState = this.state;
535
+ // if we have decisions that the state we are loading does NOT have yet
536
+ // then we have to reset and rerun this turn
537
+ if (oldState.decisions.length > state.decisions.length) {
538
+ return [{ turn: this, type: "reset" }];
539
+ }
540
+ // confirm all of the choices are the same
541
+ const result = [];
542
+ for (let i = 0; i < oldState.decisions.length; i++) {
543
+ const oldDecision = oldState.decisions[i];
544
+ const newDecision = state.decisions[i];
545
+ if (oldDecision.type !== newDecision.type) {
546
+ return [{ turn: this, type: "reset" }];
547
+ }
548
+ //
549
+ // This is just wrong. the only time we don't have to do a full reset is if the last step is a turn that isn't
550
+ // resolved yet. that turn can update itself, but leaving turn 2 alone
551
+ //
552
+ if (oldDecision.type === "rng") {
553
+ if (oldDecision.value !== newDecision.value) {
554
+ return [{ turn: this, type: "reset" }];
555
+ }
556
+ }
557
+ else if (oldDecision.type === "prompt") {
558
+ const oldResponse = oldDecision;
559
+ const newResponse = newDecision;
560
+ // special case: if we are looking at a prompt we were waiting on previously
561
+ // we can now resolve it!
562
+ if (i === oldState.decisions.length - 1 &&
563
+ oldResponse.response === undefined &&
564
+ newResponse.response !== undefined) {
565
+ if (!this.unresolvedPrompt) {
566
+ return [{ turn: this, type: "reset" }]; // something has gone wrong if we have a response and are not waiting on a response
567
+ }
568
+ result.push({
569
+ type: "prompt",
570
+ turn: this,
571
+ prompt: this.unresolvedPrompt,
572
+ response: newResponse.response,
573
+ });
574
+ }
575
+ else if (JSON.stringify(oldResponse.response) !== JSON.stringify(newResponse.response)) {
576
+ return [{ turn: this, type: "reset" }];
577
+ }
578
+ }
579
+ else if (oldDecision.type === "turn") {
580
+ const oldTurnState = oldDecision;
581
+ const newTurnState = newDecision;
582
+ // if this turn isn't finished, then let that turn try to resolve the new state
583
+ const foundTurn = this.activeSubTurns.find((t) => t.id === newTurnState.id);
584
+ if (foundTurn) {
585
+ const subTurnChanges = foundTurn.handleNewSavedState(newTurnState);
586
+ subTurnChanges.forEach((r) => result.push(r));
587
+ }
588
+ else if (JSON.stringify(oldTurnState.decisions) !== JSON.stringify(newTurnState.decisions)) {
589
+ return [{ turn: this, type: "reset" }];
590
+ }
591
+ }
592
+ }
593
+ return result;
594
+ }
595
+ findIndexOfLastFlushStepBefore(clock) {
596
+ for (let j = this.clockSteps.length - 1; j >= 0; j--) {
597
+ if (this.clockSteps[j] instanceof FlushClockStep && this.clockSteps[j].startClock < clock) {
598
+ return j;
599
+ }
600
+ }
601
+ return 0;
602
+ }
603
+ findIndexOfLastFlushStepWithLogMessageBefore(clock) {
604
+ for (let j = this.clockSteps.length - 1; j >= 0; j--) {
605
+ if (this.clockSteps[j] instanceof FlushClockStep &&
606
+ this.clockSteps[j].startClock < clock &&
607
+ this.clockSteps[j].log) {
608
+ return j;
609
+ }
610
+ if (this.clockSteps[j].startClock < clock && this.clockSteps[j] instanceof SubTurnsClockStep) {
611
+ // logs cannot be inside subturns
612
+ break;
613
+ }
614
+ }
615
+ return -1;
616
+ }
617
+ /** @internal */
618
+ chitsHistory(playerId, ids) {
619
+ const result = {};
620
+ const appendLog = (id, clock, state) => {
621
+ if (!state) {
622
+ return;
623
+ }
624
+ result[id] = result[id] ?? [];
625
+ if (result[id][result[id].length - 1]?.state !== state) {
626
+ result[id].push({
627
+ clock,
628
+ state,
629
+ });
630
+ }
631
+ };
632
+ this.clockSteps.forEach((step) => {
633
+ if (step instanceof FlushClockStep) {
634
+ ids.forEach((id) => appendLog(id, step.startClock, step.state[id]));
635
+ }
636
+ else if (step instanceof SubTurnsClockStep) {
637
+ for (const turn of step.visibleTurns(playerId)) {
638
+ const turnResponse = turn.chitsHistory(playerId, ids);
639
+ Object.entries(turnResponse).forEach(([id, value]) => {
640
+ value.forEach((v) => {
641
+ appendLog(id, step.startClock + v.clock, v.state);
642
+ });
643
+ });
644
+ }
645
+ }
646
+ });
647
+ return result;
648
+ }
649
+ /** @internal */
650
+ serialize(playerId, clock) {
651
+ clock = Math.max(0, Math.min(clock, this.playerVisibleClockTime(playerId)));
652
+ let chits = {};
653
+ let resultingClock = -1;
654
+ // going forwards
655
+ let index = this.findIndexOfLastFlushStepBefore(clock);
656
+ const lastLogIndex = this.findIndexOfLastFlushStepWithLogMessageBefore(clock);
657
+ // set up logs
658
+ let log;
659
+ if (lastLogIndex >= 0) {
660
+ const messageStep = this.clockSteps[lastLogIndex];
661
+ log = {
662
+ message: messageStep.log,
663
+ clock: messageStep.startClock,
664
+ };
665
+ }
666
+ let subTurns = undefined;
667
+ // eslint-disable-next-line no-constant-condition
668
+ while (true) {
669
+ const clockStep = this.clockSteps[index];
670
+ index++;
671
+ if (!clockStep) {
672
+ break;
673
+ }
674
+ if (clockStep.startClock >= clock) {
675
+ break;
676
+ }
677
+ if (clockStep instanceof FlushClockStep) {
678
+ subTurns = undefined;
679
+ chits = { ...clockStep.state };
680
+ resultingClock = clockStep.endClock();
681
+ }
682
+ else if (clockStep instanceof SubTurnsClockStep) {
683
+ subTurns = {};
684
+ resultingClock = clockStep.startClock;
685
+ let remainingClocksToSpend = clock - clockStep.startClock;
686
+ for (const turn of clockStep.visibleTurns(playerId)) {
687
+ const time = Math.max(remainingClocksToSpend, 0);
688
+ if (time <= 0) {
689
+ break;
690
+ }
691
+ // we are going forward so we never want to have a turn go backwards. ever.
692
+ const serialized = turn.serialize(playerId, time);
693
+ Object.assign(chits, serialized.chits);
694
+ resultingClock += serialized.clockDetails.clock;
695
+ remainingClocksToSpend -= serialized.clockDetails.clock;
696
+ subTurns[turn.id] = serialized.clockDetails;
697
+ if (serialized.log) {
698
+ log = serialized.log;
699
+ log.clock += clockStep.startClock;
700
+ }
701
+ }
702
+ }
703
+ }
704
+ return {
705
+ log,
706
+ chits,
707
+ clockDetails: {
708
+ pass: this.pass,
709
+ clock: resultingClock === -1 ? clock : resultingClock,
710
+ subTurns,
711
+ },
712
+ };
713
+ }
714
+ /** @internal */
715
+ gameLog(playerId) {
716
+ return this.clockSteps
717
+ .map((step) => {
718
+ if (step instanceof FlushClockStep && step.log) {
719
+ return { message: step.log, clock: step.startClock };
720
+ }
721
+ else if (step instanceof SubTurnsClockStep) {
722
+ let offset = step.startClock;
723
+ return step
724
+ .visibleTurns(playerId)
725
+ .map((turn) => {
726
+ const logs = turn.gameLog(playerId).map((l) => {
727
+ l.clock += offset;
728
+ return l;
729
+ });
730
+ offset += turn.clockDetails(playerId).clock;
731
+ return logs;
732
+ })
733
+ .flat();
734
+ }
735
+ })
736
+ .flat()
737
+ .filter((d) => d);
738
+ }
739
+ /*
740
+ * Internal helper function to prep a Prompt for prompting
741
+ */
742
+ prepareForPrompt(prompt) {
743
+ if (this.unresolvedPrompt) {
744
+ throw new Error("Already awaiting a prompt result");
745
+ }
746
+ if (!this.player) {
747
+ throw new Error("No player attached to turn");
748
+ }
749
+ if (this.activeSubTurns.length) {
750
+ throw new Error("Prompts are not allowed while subturns are not resolved");
751
+ }
752
+ prompt.findChit = this.findChit;
753
+ prompt.id = `${this.id} prompt ${this.decisionIndex}`;
754
+ prompt.clock = this.clock;
755
+ prompt.canReset = this.state.hasUserMadeChoiceSinceUserContextChangedOrRng(this.decisionIndex - 1);
756
+ this.player.promptStatus.latestPromptMessage = prompt.message;
757
+ if (!this.player.promptStatus.latestPromptMessage.length) {
758
+ this.player.promptStatus.latestPromptMessage = "No prompt set";
759
+ }
760
+ this.flush();
761
+ return prompt;
762
+ }
763
+ /*
764
+ * Internal helper function to handle safely awaiting a prompt's response
765
+ */
766
+ async waitForPromptResolution(prompt) {
767
+ if (!this.player) {
768
+ throw new Error("Must have player specified");
769
+ }
770
+ await this.checkPause();
771
+ const resolution = this.state.getOrCreatePromptResponse(this.decisionIndex);
772
+ await this.checkPause(); // state could have gotten funky here? if we have a resolution already? maybe not so bad?
773
+ if (resolution.response !== undefined) {
774
+ await new Promise((resolve) => nextTick(() => resolve(true))); // defer to next tick to make sure replay works identically
775
+ prompt.resolve(resolution.response);
776
+ }
777
+ else {
778
+ if (this.player.promptStatus.latestPrompt.value) {
779
+ throw new Error("Player can only have prompt out at a time");
780
+ }
781
+ this.unresolvedPrompt = prompt;
782
+ this.player.promptStatus.latestPrompt.value = prompt;
783
+ // weird anti-pattern which will actually wait for a resolution to the prompt and return flow here.
784
+ let succeeded = false;
785
+ await new Promise((resolve) => prompt.onResolve((success) => {
786
+ succeeded = success;
787
+ resolve(undefined);
788
+ }));
789
+ if (prompt.shouldRerun) {
790
+ throw new RerunError(prompt.shouldRerun);
791
+ }
792
+ if (prompt.shouldReset) {
793
+ throw new RollBackError();
794
+ }
795
+ if (prompt.shouldStepBack) {
796
+ throw new StepBackError();
797
+ }
798
+ if (!succeeded) {
799
+ this.player.promptStatus.latestPrompt.value = undefined;
800
+ this.unresolvedPrompt = undefined;
801
+ // throw new Error("Unknown error");
802
+ return;
803
+ }
804
+ this.player.promptStatus.latestPrompt.value = undefined;
805
+ resolution.response = prompt.response;
806
+ this.unresolvedPrompt = undefined;
807
+ }
808
+ // it is possible our state got reset out from under us and the response we have (which is a pointer)
809
+ // to an object -- MAY be writing to the OLD state
810
+ this.state.setOrCreatePromptResponse(this.decisionIndex, resolution);
811
+ this.player.promptStatus.latestPromptResponseTime = this.absoluteClock(this.player.id);
812
+ this.player.promptStatus.latestPromptMessage = undefined;
813
+ this.decisionIndex++;
814
+ }
815
+ /*
816
+ * The main runtime. Will attempt to run `fn` until it succeeds. Each time it has to loop back,
817
+ * it will reset chit's states to where they should be.
818
+ */
819
+ async execute() {
820
+ // eslint-disable-next-line no-constant-condition
821
+ while (true) {
822
+ try {
823
+ await this.checkPause();
824
+ // actually execute this fn
825
+ const result = await this.fn(this);
826
+ if (this.player && this.player !== this.parent?.player) {
827
+ await this.possiblyConfirm("confirm turn end");
828
+ }
829
+ this.cleanUp();
830
+ return result;
831
+ }
832
+ catch (error) {
833
+ if (error instanceof RerunError) {
834
+ if (error.turn === this) {
835
+ this.restartExecution();
836
+ continue;
837
+ }
838
+ throw error;
839
+ }
840
+ if (error instanceof StepBackError) {
841
+ // bubble it up to parent if we can
842
+ if (this.decisionIndex === 0 && this.parent?.player === this.player) {
843
+ throw error;
844
+ }
845
+ this.state.stepBack(); // once to clear the current prompt
846
+ this.state.stepBack(); // and again to clear what was before
847
+ this.restartExecution();
848
+ continue;
849
+ }
850
+ else if (error instanceof RollBackError) {
851
+ this.state.fullStepBack();
852
+ this.restartExecution();
853
+ continue;
854
+ }
855
+ this.destroy();
856
+ throw error;
857
+ }
858
+ }
859
+ }
860
+ /** @internal */
861
+ pause() {
862
+ if (this._paused) {
863
+ return;
864
+ }
865
+ this.paused = new Promise((resolve) => {
866
+ this._paused = resolve;
867
+ });
868
+ this.activeSubTurns.forEach((turn) => turn.pause());
869
+ }
870
+ /** @internal */
871
+ async unpause() {
872
+ if (this._paused) {
873
+ this._paused();
874
+ this._paused = undefined;
875
+ }
876
+ this.activeSubTurns.forEach((turn) => turn.unpause());
877
+ }
878
+ /** @internal */
879
+ async checkPause() {
880
+ await this.paused;
881
+ if (this.destroyed) {
882
+ throw new DestroyError();
883
+ }
884
+ }
885
+ /** @internal */
886
+ destroy() {
887
+ if (this.destroyed) {
888
+ return;
889
+ }
890
+ this.destroyed = true;
891
+ this.activeSubTurns.forEach((turn) => turn.destroy());
892
+ Object.values(this.chitLookup).forEach((chit) => chit.unlock(this));
893
+ if (this.unresolvedPrompt && this.player) {
894
+ this.player.promptStatus.latestPrompt.value = undefined;
895
+ this.unresolvedPrompt.destroy();
896
+ }
897
+ }
898
+ /** @internal */
899
+ fixPass() {
900
+ this.pass = Date.now();
901
+ }
902
+ cleanUp() {
903
+ if (this.player) {
904
+ this.player.promptStatus.latestPromptMessage = undefined;
905
+ }
906
+ this.completed = true;
907
+ this.flush();
908
+ Object.values(this.chitLookup).forEach((chit) => chit.unlock(this));
909
+ }
910
+ /** @internal */
911
+ get lastClockStep() {
912
+ return this.clockSteps[this.clockSteps.length - 1];
913
+ }
914
+ /** @internal */
915
+ get clock() {
916
+ return this.lastClockStep?.endClock() ?? 0;
917
+ }
918
+ /** @internal */
919
+ playerVisibleClockTime(playerId) {
920
+ return this.lastClockStep?.endClock(playerId) ?? 0;
921
+ }
922
+ /** @internal */
923
+ absoluteClock(playerId) {
924
+ return this.parent?.absoluteClock(playerId) ?? this.clockDetails(playerId).clock;
925
+ }
926
+ /** @internal */
927
+ clockDetails(playerId) {
928
+ const result = {
929
+ clock: this.playerVisibleClockTime(playerId),
930
+ pass: this.pass,
931
+ };
932
+ const visibleActiveTurns = this.lastClockStep instanceof SubTurnsClockStep ? this.lastClockStep.visibleTurns(playerId) : [];
933
+ if (visibleActiveTurns.length > 0) {
934
+ result.subTurns = {};
935
+ for (const turn of visibleActiveTurns) {
936
+ result.subTurns[turn.id] = turn.clockDetails(playerId);
937
+ }
938
+ }
939
+ return result;
940
+ }
941
+ restartExecution() {
942
+ this.activeSubTurns.forEach((t) => t.destroy());
943
+ const chits = Object.values(this.chitLookup).filter((chit) => chit.id);
944
+ chits.forEach((chit) => chit.beginDeserializing());
945
+ chits.forEach((chit) => {
946
+ chit.lock(this);
947
+ const lockedState = this.lockedChitStates[chit.id ?? ""];
948
+ if (lockedState) {
949
+ chit.deserialize(lockedState, this.findChit);
950
+ }
951
+ else {
952
+ chit.removeFromParent(); // effectively "deletes" it. In practice, the `fn` will recreate a new chit which will have the new ID, which replaces this one.
953
+ }
954
+ });
955
+ chits.forEach((chit) => chit.doneDeserializing());
956
+ if (this.player) {
957
+ this.player.promptStatus.latestPrompt.value = undefined;
958
+ }
959
+ this.chitLookup = {};
960
+ Chit.walk(this.chitsToLock, (c) => {
961
+ if (c.id) {
962
+ this.chitLookup[c.id] = c;
963
+ }
964
+ });
965
+ this.lastChitStates = { ...this.lockedChitStates }; // reset our known chit states
966
+ this.clockSteps = [];
967
+ this.decisionIndex = 0;
968
+ this.newChitCounter = {};
969
+ this.unresolvedPrompt = undefined;
970
+ this.activeSubTurns = [];
971
+ this.pass++;
972
+ }
973
+ }
974
+ class ClockStep {
975
+ }
976
+ class SubTurnsClockStep extends ClockStep {
977
+ visibleTurns(playerId) {
978
+ if (this.turns.length === 1 || playerId === undefined) {
979
+ return this.turns;
980
+ }
981
+ const myTurn = this.turns.find((turn) => turn.player?.id === playerId);
982
+ if (myTurn && !myTurn?.completed) {
983
+ return [myTurn];
984
+ }
985
+ if (myTurn?.completed) {
986
+ return [myTurn, ...this.turns.filter((turn) => turn !== myTurn)];
987
+ }
988
+ const completedTurns = this.turns.filter((turn) => turn.completed);
989
+ if (completedTurns.length === this.turns.length) {
990
+ return completedTurns;
991
+ }
992
+ return [];
993
+ }
994
+ endClock(playerId) {
995
+ return (this.startClock +
996
+ this.visibleTurns(playerId).reduce((sum, turn) => sum + turn.playerVisibleClockTime(playerId), 0));
997
+ }
998
+ constructor(startClock, turns) {
999
+ super();
1000
+ this.startClock = startClock;
1001
+ this.turns = turns;
1002
+ }
1003
+ }
1004
+ class FlushClockStep extends ClockStep {
1005
+ endClock() {
1006
+ return this.startClock + 1;
1007
+ }
1008
+ constructor(startClock, state) {
1009
+ super();
1010
+ this.startClock = startClock;
1011
+ this.state = state;
1012
+ }
1013
+ }
1014
+ export class StepBackError extends Error {
1015
+ }
1016
+ export class RollBackError extends Error {
1017
+ }
1018
+ export class DestroyError extends Error {
1019
+ }
1020
+ export class RerunError extends Error {
1021
+ constructor(turn) {
1022
+ super();
1023
+ this.turn = turn;
1024
+ }
1025
+ }
1026
+ export class MismatchError extends Error {
1027
+ constructor() {
1028
+ super("Mismatch");
1029
+ }
1030
+ }
1031
+ //# sourceMappingURL=Turn.js.map