rn-gamekit 0.1.0 → 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 (601) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +95 -14
  3. package/lib/module/assets/defineAssets.js +28 -3
  4. package/lib/module/assets/defineAssets.js.map +1 -1
  5. package/lib/module/assets.js +11 -0
  6. package/lib/module/assets.js.map +1 -0
  7. package/lib/module/audio/createGameAudio.js +784 -0
  8. package/lib/module/audio/createGameAudio.js.map +1 -0
  9. package/lib/module/audio/errors.js +12 -0
  10. package/lib/module/audio/errors.js.map +1 -0
  11. package/lib/module/audio/index.js +5 -0
  12. package/lib/module/audio/index.js.map +1 -0
  13. package/lib/module/audio/resolver.js +37 -0
  14. package/lib/module/audio/resolver.js.map +1 -0
  15. package/lib/module/audio/types.js +4 -0
  16. package/lib/module/audio/types.js.map +1 -0
  17. package/lib/module/audio.js +9 -0
  18. package/lib/module/audio.js.map +1 -0
  19. package/lib/module/camera2d/bounds.js +59 -0
  20. package/lib/module/camera2d/bounds.js.map +1 -0
  21. package/lib/module/camera2d/extents.js +25 -0
  22. package/lib/module/camera2d/extents.js.map +1 -0
  23. package/lib/module/camera2d/follow.js +138 -0
  24. package/lib/module/camera2d/follow.js.map +1 -0
  25. package/lib/module/camera2d/index.js +20 -0
  26. package/lib/module/camera2d/index.js.map +1 -0
  27. package/lib/module/camera2d/interpolation.js +98 -0
  28. package/lib/module/camera2d/interpolation.js.map +1 -0
  29. package/lib/module/camera2d/shake.js +85 -0
  30. package/lib/module/camera2d/shake.js.map +1 -0
  31. package/lib/module/camera2d/transform.js +151 -0
  32. package/lib/module/camera2d/transform.js.map +1 -0
  33. package/lib/module/camera2d/types.js +4 -0
  34. package/lib/module/camera2d/types.js.map +1 -0
  35. package/lib/module/camera2d/validation.js +98 -0
  36. package/lib/module/camera2d/validation.js.map +1 -0
  37. package/lib/module/camera2d/visibility.js +138 -0
  38. package/lib/module/camera2d/visibility.js.map +1 -0
  39. package/lib/module/camera2d.js +9 -0
  40. package/lib/module/camera2d.js.map +1 -0
  41. package/lib/module/collision2d/colliders.js +266 -0
  42. package/lib/module/collision2d/colliders.js.map +1 -0
  43. package/lib/module/collision2d/debug.js +105 -0
  44. package/lib/module/collision2d/debug.js.map +1 -0
  45. package/lib/module/collision2d/filters.js +40 -0
  46. package/lib/module/collision2d/filters.js.map +1 -0
  47. package/lib/module/collision2d/index.js +12 -0
  48. package/lib/module/collision2d/index.js.map +1 -0
  49. package/lib/module/collision2d/intersections.js +67 -0
  50. package/lib/module/collision2d/intersections.js.map +1 -0
  51. package/lib/module/collision2d/manifolds.js +218 -0
  52. package/lib/module/collision2d/manifolds.js.map +1 -0
  53. package/lib/module/collision2d/segments.js +187 -0
  54. package/lib/module/collision2d/segments.js.map +1 -0
  55. package/lib/module/collision2d/spatialHash.js +167 -0
  56. package/lib/module/collision2d/spatialHash.js.map +1 -0
  57. package/lib/module/collision2d/sweeps.js +255 -0
  58. package/lib/module/collision2d/sweeps.js.map +1 -0
  59. package/lib/module/collision2d.js +9 -0
  60. package/lib/module/collision2d.js.map +1 -0
  61. package/lib/module/core/input/buttonPad.js +214 -0
  62. package/lib/module/core/input/buttonPad.js.map +1 -0
  63. package/lib/module/core/input/createInputBuffer.js +66 -14
  64. package/lib/module/core/input/createInputBuffer.js.map +1 -1
  65. package/lib/module/core/session/createGameSession.js +454 -50
  66. package/lib/module/core/session/createGameSession.js.map +1 -1
  67. package/lib/module/core/session/deepFreeze.js +92 -2
  68. package/lib/module/core/session/deepFreeze.js.map +1 -1
  69. package/lib/module/core/session/types.js +12 -0
  70. package/lib/module/core/session/types.js.map +1 -1
  71. package/lib/module/definition/defineGame.js +23 -0
  72. package/lib/module/definition/defineGame.js.map +1 -1
  73. package/lib/module/events/defineGameEvents.js +46 -0
  74. package/lib/module/events/defineGameEvents.js.map +1 -0
  75. package/lib/module/events/errors.js +16 -0
  76. package/lib/module/events/errors.js.map +1 -0
  77. package/lib/module/events/index.js +7 -0
  78. package/lib/module/events/index.js.map +1 -0
  79. package/lib/module/events/payload.js +219 -0
  80. package/lib/module/events/payload.js.map +1 -0
  81. package/lib/module/events/seed.js +33 -0
  82. package/lib/module/events/seed.js.map +1 -0
  83. package/lib/module/events/types.js +4 -0
  84. package/lib/module/events/types.js.map +1 -0
  85. package/lib/module/events.js +13 -0
  86. package/lib/module/events.js.map +1 -0
  87. package/lib/module/geometry/helpers.js +140 -0
  88. package/lib/module/geometry/helpers.js.map +1 -0
  89. package/lib/module/geometry/index.js +5 -0
  90. package/lib/module/geometry/index.js.map +1 -0
  91. package/lib/module/geometry/validation.js +104 -0
  92. package/lib/module/geometry/validation.js.map +1 -0
  93. package/lib/module/geometry.js +9 -0
  94. package/lib/module/geometry.js.map +1 -0
  95. package/lib/module/haptics/createGameHaptics.js +214 -0
  96. package/lib/module/haptics/createGameHaptics.js.map +1 -0
  97. package/lib/module/haptics/errors.js +12 -0
  98. package/lib/module/haptics/errors.js.map +1 -0
  99. package/lib/module/haptics/index.js +5 -0
  100. package/lib/module/haptics/index.js.map +1 -0
  101. package/lib/module/haptics/resolver.js +37 -0
  102. package/lib/module/haptics/resolver.js.map +1 -0
  103. package/lib/module/haptics/types.js +4 -0
  104. package/lib/module/haptics/types.js.map +1 -0
  105. package/lib/module/haptics.js +9 -0
  106. package/lib/module/haptics.js.map +1 -0
  107. package/lib/module/index.js +8 -1
  108. package/lib/module/index.js.map +1 -1
  109. package/lib/module/particles/createParticleSystem.js +481 -0
  110. package/lib/module/particles/createParticleSystem.js.map +1 -0
  111. package/lib/module/particles/defineParticleEffect.js +178 -0
  112. package/lib/module/particles/defineParticleEffect.js.map +1 -0
  113. package/lib/module/particles/errors.js +9 -0
  114. package/lib/module/particles/errors.js.map +1 -0
  115. package/lib/module/particles/index.js +8 -0
  116. package/lib/module/particles/index.js.map +1 -0
  117. package/lib/module/particles/sampling.js +121 -0
  118. package/lib/module/particles/sampling.js.map +1 -0
  119. package/lib/module/particles/types.js +4 -0
  120. package/lib/module/particles/types.js.map +1 -0
  121. package/lib/module/particles.js +4 -0
  122. package/lib/module/particles.js.map +1 -0
  123. package/lib/module/react/GameButtonPad.js +344 -0
  124. package/lib/module/react/GameButtonPad.js.map +1 -0
  125. package/lib/module/react/GamePointerInput.js +74 -16
  126. package/lib/module/react/GamePointerInput.js.map +1 -1
  127. package/lib/module/react/GameView.js +139 -60
  128. package/lib/module/react/GameView.js.map +1 -1
  129. package/lib/module/react/assets/createGameAssetStore.js +145 -95
  130. package/lib/module/react/assets/createGameAssetStore.js.map +1 -1
  131. package/lib/module/react/assets/useGameAssets.js +60 -35
  132. package/lib/module/react/assets/useGameAssets.js.map +1 -1
  133. package/lib/module/react/bindAppLifecycle.js +46 -17
  134. package/lib/module/react/bindAppLifecycle.js.map +1 -1
  135. package/lib/module/react/bindGameSession.js +13 -2
  136. package/lib/module/react/bindGameSession.js.map +1 -1
  137. package/lib/module/react/camera2d/GameLayer2D.js +50 -0
  138. package/lib/module/react/camera2d/GameLayer2D.js.map +1 -0
  139. package/lib/module/react/camera2d/defineGameCamera2D.js +30 -0
  140. package/lib/module/react/camera2d/defineGameCamera2D.js.map +1 -0
  141. package/lib/module/react/camera2d/usePresentedCameraBinding.js +177 -0
  142. package/lib/module/react/camera2d/usePresentedCameraBinding.js.map +1 -0
  143. package/lib/module/react/cleanupList.js +38 -0
  144. package/lib/module/react/cleanupList.js.map +1 -0
  145. package/lib/module/react/lifecycleSource.js +49 -0
  146. package/lib/module/react/lifecycleSource.js.map +1 -0
  147. package/lib/module/react/particles/ParticleView.js +308 -0
  148. package/lib/module/react/particles/ParticleView.js.map +1 -0
  149. package/lib/module/react/particles/culling.js +115 -0
  150. package/lib/module/react/particles/culling.js.map +1 -0
  151. package/lib/module/react/particles/index.js +7 -0
  152. package/lib/module/react/particles/index.js.map +1 -0
  153. package/lib/module/react/particles/spriteXForm.js +45 -0
  154. package/lib/module/react/particles/spriteXForm.js.map +1 -0
  155. package/lib/module/react/particles/useParticlePresentation.js +204 -0
  156. package/lib/module/react/particles/useParticlePresentation.js.map +1 -0
  157. package/lib/module/react/pointerBinding.js +55 -17
  158. package/lib/module/react/pointerBinding.js.map +1 -1
  159. package/lib/module/react/pointerCamera.js +28 -0
  160. package/lib/module/react/pointerCamera.js.map +1 -0
  161. package/lib/module/react/pointerCoalescer.js +16 -9
  162. package/lib/module/react/pointerCoalescer.js.map +1 -1
  163. package/lib/module/react/sprites/GameSprite.js +5 -17
  164. package/lib/module/react/sprites/GameSprite.js.map +1 -1
  165. package/lib/module/react/sprites/GameWorld2D.js +112 -9
  166. package/lib/module/react/sprites/GameWorld2D.js.map +1 -1
  167. package/lib/module/react/sprites/Sprite.js +48 -63
  168. package/lib/module/react/sprites/Sprite.js.map +1 -1
  169. package/lib/module/react/sprites/SpriteBatch.js +53 -28
  170. package/lib/module/react/sprites/SpriteBatch.js.map +1 -1
  171. package/lib/module/react/sprites/batchVisibility.js +58 -0
  172. package/lib/module/react/sprites/batchVisibility.js.map +1 -0
  173. package/lib/module/react/sprites/spriteSelection.js +103 -0
  174. package/lib/module/react/sprites/spriteSelection.js.map +1 -0
  175. package/lib/module/react/sprites/spriteTransform.js +46 -25
  176. package/lib/module/react/sprites/spriteTransform.js.map +1 -1
  177. package/lib/module/react/tilemap/TileMapLayer2D.js +217 -0
  178. package/lib/module/react/tilemap/TileMapLayer2D.js.map +1 -0
  179. package/lib/module/react/tilemap/tilePresentation.js +374 -0
  180. package/lib/module/react/tilemap/tilePresentation.js.map +1 -0
  181. package/lib/module/react/useGameSession.js +70 -0
  182. package/lib/module/react/useGameSession.js.map +1 -0
  183. package/lib/module/react/useGameSessionStatus.js +46 -0
  184. package/lib/module/react/useGameSessionStatus.js.map +1 -0
  185. package/lib/module/react/viewportBinding.js +5 -1
  186. package/lib/module/react/viewportBinding.js.map +1 -1
  187. package/lib/module/react.js +12 -1
  188. package/lib/module/react.js.map +1 -1
  189. package/lib/module/scene/defineScene.js +17 -0
  190. package/lib/module/scene/defineScene.js.map +1 -1
  191. package/lib/module/sprites/sampleSpriteClip.js +66 -6
  192. package/lib/module/sprites/sampleSpriteClip.js.map +1 -1
  193. package/lib/module/sprites/spriteAnimationState.js +10 -20
  194. package/lib/module/sprites/spriteAnimationState.js.map +1 -1
  195. package/lib/module/sprites.js +11 -0
  196. package/lib/module/sprites.js.map +1 -0
  197. package/lib/module/storage/adapters/asyncStorage.js +57 -0
  198. package/lib/module/storage/adapters/asyncStorage.js.map +1 -0
  199. package/lib/module/storage/adapters/memory.js +50 -0
  200. package/lib/module/storage/adapters/memory.js.map +1 -0
  201. package/lib/module/storage/errors.js +34 -0
  202. package/lib/module/storage/errors.js.map +1 -0
  203. package/lib/module/storage/index.js +11 -0
  204. package/lib/module/storage/index.js.map +1 -0
  205. package/lib/module/storage/schema.js +151 -0
  206. package/lib/module/storage/schema.js.map +1 -0
  207. package/lib/module/storage/serialization.js +249 -0
  208. package/lib/module/storage/serialization.js.map +1 -0
  209. package/lib/module/storage/store.js +387 -0
  210. package/lib/module/storage/store.js.map +1 -0
  211. package/lib/module/storage/types.js +16 -0
  212. package/lib/module/storage/types.js.map +1 -0
  213. package/lib/module/storage/validation.js +111 -0
  214. package/lib/module/storage/validation.js.map +1 -0
  215. package/lib/module/storage.js +4 -0
  216. package/lib/module/storage.js.map +1 -0
  217. package/lib/module/testing.js +4 -0
  218. package/lib/module/testing.js.map +1 -1
  219. package/lib/module/tilemap/chunkStats.js +27 -0
  220. package/lib/module/tilemap/chunkStats.js.map +1 -0
  221. package/lib/module/tilemap/definitions.js +308 -0
  222. package/lib/module/tilemap/definitions.js.map +1 -0
  223. package/lib/module/tilemap/errors.js +13 -0
  224. package/lib/module/tilemap/errors.js.map +1 -0
  225. package/lib/module/tilemap/index.js +10 -0
  226. package/lib/module/tilemap/index.js.map +1 -0
  227. package/lib/module/tilemap/movement.js +379 -0
  228. package/lib/module/tilemap/movement.js.map +1 -0
  229. package/lib/module/tilemap/queries.js +114 -0
  230. package/lib/module/tilemap/queries.js.map +1 -0
  231. package/lib/module/tilemap/tiledAdapter.js +141 -0
  232. package/lib/module/tilemap/tiledAdapter.js.map +1 -0
  233. package/lib/module/tilemap/types.js +4 -0
  234. package/lib/module/tilemap/types.js.map +1 -0
  235. package/lib/module/tilemap.js +4 -0
  236. package/lib/module/tilemap.js.map +1 -0
  237. package/lib/typescript/src/assets/defineAssets.d.ts +1 -1
  238. package/lib/typescript/src/assets/defineAssets.d.ts.map +1 -1
  239. package/lib/typescript/src/assets.d.ts +11 -0
  240. package/lib/typescript/src/assets.d.ts.map +1 -0
  241. package/lib/typescript/src/audio/createGameAudio.d.ts +5 -0
  242. package/lib/typescript/src/audio/createGameAudio.d.ts.map +1 -0
  243. package/lib/typescript/src/audio/errors.d.ts +6 -0
  244. package/lib/typescript/src/audio/errors.d.ts.map +1 -0
  245. package/lib/typescript/src/audio/index.d.ts +4 -0
  246. package/lib/typescript/src/audio/index.d.ts.map +1 -0
  247. package/lib/typescript/src/audio/resolver.d.ts +44 -0
  248. package/lib/typescript/src/audio/resolver.d.ts.map +1 -0
  249. package/lib/typescript/src/audio/types.d.ts +42 -0
  250. package/lib/typescript/src/audio/types.d.ts.map +1 -0
  251. package/lib/typescript/src/audio.d.ts +8 -0
  252. package/lib/typescript/src/audio.d.ts.map +1 -0
  253. package/lib/typescript/src/camera2d/bounds.d.ts +25 -0
  254. package/lib/typescript/src/camera2d/bounds.d.ts.map +1 -0
  255. package/lib/typescript/src/camera2d/extents.d.ts +17 -0
  256. package/lib/typescript/src/camera2d/extents.d.ts.map +1 -0
  257. package/lib/typescript/src/camera2d/follow.d.ts +24 -0
  258. package/lib/typescript/src/camera2d/follow.d.ts.map +1 -0
  259. package/lib/typescript/src/camera2d/index.d.ts +19 -0
  260. package/lib/typescript/src/camera2d/index.d.ts.map +1 -0
  261. package/lib/typescript/src/camera2d/interpolation.d.ts +17 -0
  262. package/lib/typescript/src/camera2d/interpolation.d.ts.map +1 -0
  263. package/lib/typescript/src/camera2d/shake.d.ts +20 -0
  264. package/lib/typescript/src/camera2d/shake.d.ts.map +1 -0
  265. package/lib/typescript/src/camera2d/transform.d.ts +44 -0
  266. package/lib/typescript/src/camera2d/transform.d.ts.map +1 -0
  267. package/lib/typescript/src/camera2d/types.d.ts +74 -0
  268. package/lib/typescript/src/camera2d/types.d.ts.map +1 -0
  269. package/lib/typescript/src/camera2d/validation.d.ts +30 -0
  270. package/lib/typescript/src/camera2d/validation.d.ts.map +1 -0
  271. package/lib/typescript/src/camera2d/visibility.d.ts +47 -0
  272. package/lib/typescript/src/camera2d/visibility.d.ts.map +1 -0
  273. package/lib/typescript/src/camera2d.d.ts +7 -0
  274. package/lib/typescript/src/camera2d.d.ts.map +1 -0
  275. package/lib/typescript/src/collision2d/colliders.d.ts +120 -0
  276. package/lib/typescript/src/collision2d/colliders.d.ts.map +1 -0
  277. package/lib/typescript/src/collision2d/debug.d.ts +67 -0
  278. package/lib/typescript/src/collision2d/debug.d.ts.map +1 -0
  279. package/lib/typescript/src/collision2d/filters.d.ts +28 -0
  280. package/lib/typescript/src/collision2d/filters.d.ts.map +1 -0
  281. package/lib/typescript/src/collision2d/index.d.ts +17 -0
  282. package/lib/typescript/src/collision2d/index.d.ts.map +1 -0
  283. package/lib/typescript/src/collision2d/intersections.d.ts +24 -0
  284. package/lib/typescript/src/collision2d/intersections.d.ts.map +1 -0
  285. package/lib/typescript/src/collision2d/manifolds.d.ts +39 -0
  286. package/lib/typescript/src/collision2d/manifolds.d.ts.map +1 -0
  287. package/lib/typescript/src/collision2d/segments.d.ts +24 -0
  288. package/lib/typescript/src/collision2d/segments.d.ts.map +1 -0
  289. package/lib/typescript/src/collision2d/spatialHash.d.ts +50 -0
  290. package/lib/typescript/src/collision2d/spatialHash.d.ts.map +1 -0
  291. package/lib/typescript/src/collision2d/sweeps.d.ts +60 -0
  292. package/lib/typescript/src/collision2d/sweeps.d.ts.map +1 -0
  293. package/lib/typescript/src/collision2d.d.ts +7 -0
  294. package/lib/typescript/src/collision2d.d.ts.map +1 -0
  295. package/lib/typescript/src/core/input/buttonPad.d.ts +59 -0
  296. package/lib/typescript/src/core/input/buttonPad.d.ts.map +1 -0
  297. package/lib/typescript/src/core/input/createInputBuffer.d.ts +1 -1
  298. package/lib/typescript/src/core/input/createInputBuffer.d.ts.map +1 -1
  299. package/lib/typescript/src/core/input/types.d.ts +7 -0
  300. package/lib/typescript/src/core/input/types.d.ts.map +1 -1
  301. package/lib/typescript/src/core/session/createGameSession.d.ts +4 -2
  302. package/lib/typescript/src/core/session/createGameSession.d.ts.map +1 -1
  303. package/lib/typescript/src/core/session/deepFreeze.d.ts +21 -1
  304. package/lib/typescript/src/core/session/deepFreeze.d.ts.map +1 -1
  305. package/lib/typescript/src/core/session/diagnostics.d.ts +2 -0
  306. package/lib/typescript/src/core/session/diagnostics.d.ts.map +1 -1
  307. package/lib/typescript/src/core/session/types.d.ts +69 -4
  308. package/lib/typescript/src/core/session/types.d.ts.map +1 -1
  309. package/lib/typescript/src/definition/defineGame.d.ts +12 -1
  310. package/lib/typescript/src/definition/defineGame.d.ts.map +1 -1
  311. package/lib/typescript/src/definition/types.d.ts +10 -1
  312. package/lib/typescript/src/definition/types.d.ts.map +1 -1
  313. package/lib/typescript/src/events/defineGameEvents.d.ts +26 -0
  314. package/lib/typescript/src/events/defineGameEvents.d.ts.map +1 -0
  315. package/lib/typescript/src/events/errors.d.ts +12 -0
  316. package/lib/typescript/src/events/errors.d.ts.map +1 -0
  317. package/lib/typescript/src/events/index.d.ts +6 -0
  318. package/lib/typescript/src/events/index.d.ts.map +1 -0
  319. package/lib/typescript/src/events/payload.d.ts +21 -0
  320. package/lib/typescript/src/events/payload.d.ts.map +1 -0
  321. package/lib/typescript/src/events/seed.d.ts +3 -0
  322. package/lib/typescript/src/events/seed.d.ts.map +1 -0
  323. package/lib/typescript/src/events/types.d.ts +42 -0
  324. package/lib/typescript/src/events/types.d.ts.map +1 -0
  325. package/lib/typescript/src/events.d.ts +12 -0
  326. package/lib/typescript/src/events.d.ts.map +1 -0
  327. package/lib/typescript/src/geometry/helpers.d.ts +35 -0
  328. package/lib/typescript/src/geometry/helpers.d.ts.map +1 -0
  329. package/lib/typescript/src/geometry/index.d.ts +4 -0
  330. package/lib/typescript/src/geometry/index.d.ts.map +1 -0
  331. package/lib/typescript/src/geometry/types.d.ts +49 -0
  332. package/lib/typescript/src/geometry/types.d.ts.map +1 -1
  333. package/lib/typescript/src/geometry/validation.d.ts +44 -0
  334. package/lib/typescript/src/geometry/validation.d.ts.map +1 -0
  335. package/lib/typescript/src/geometry.d.ts +7 -0
  336. package/lib/typescript/src/geometry.d.ts.map +1 -0
  337. package/lib/typescript/src/haptics/createGameHaptics.d.ts +3 -0
  338. package/lib/typescript/src/haptics/createGameHaptics.d.ts.map +1 -0
  339. package/lib/typescript/src/haptics/errors.d.ts +6 -0
  340. package/lib/typescript/src/haptics/errors.d.ts.map +1 -0
  341. package/lib/typescript/src/haptics/index.d.ts +4 -0
  342. package/lib/typescript/src/haptics/index.d.ts.map +1 -0
  343. package/lib/typescript/src/haptics/resolver.d.ts +22 -0
  344. package/lib/typescript/src/haptics/resolver.d.ts.map +1 -0
  345. package/lib/typescript/src/haptics/types.d.ts +37 -0
  346. package/lib/typescript/src/haptics/types.d.ts.map +1 -0
  347. package/lib/typescript/src/haptics.d.ts +8 -0
  348. package/lib/typescript/src/haptics.d.ts.map +1 -0
  349. package/lib/typescript/src/index.d.ts +10 -2
  350. package/lib/typescript/src/index.d.ts.map +1 -1
  351. package/lib/typescript/src/particles/createParticleSystem.d.ts +5 -0
  352. package/lib/typescript/src/particles/createParticleSystem.d.ts.map +1 -0
  353. package/lib/typescript/src/particles/defineParticleEffect.d.ts +3 -0
  354. package/lib/typescript/src/particles/defineParticleEffect.d.ts.map +1 -0
  355. package/lib/typescript/src/particles/errors.d.ts +5 -0
  356. package/lib/typescript/src/particles/errors.d.ts.map +1 -0
  357. package/lib/typescript/src/particles/index.d.ts +6 -0
  358. package/lib/typescript/src/particles/index.d.ts.map +1 -0
  359. package/lib/typescript/src/particles/sampling.d.ts +54 -0
  360. package/lib/typescript/src/particles/sampling.d.ts.map +1 -0
  361. package/lib/typescript/src/particles/types.d.ts +292 -0
  362. package/lib/typescript/src/particles/types.d.ts.map +1 -0
  363. package/lib/typescript/src/particles.d.ts +2 -0
  364. package/lib/typescript/src/particles.d.ts.map +1 -0
  365. package/lib/typescript/src/react/GameButtonPad.d.ts +84 -0
  366. package/lib/typescript/src/react/GameButtonPad.d.ts.map +1 -0
  367. package/lib/typescript/src/react/GamePointerInput.d.ts.map +1 -1
  368. package/lib/typescript/src/react/GameView.d.ts +27 -1
  369. package/lib/typescript/src/react/GameView.d.ts.map +1 -1
  370. package/lib/typescript/src/react/assets/createGameAssetStore.d.ts.map +1 -1
  371. package/lib/typescript/src/react/assets/useGameAssets.d.ts.map +1 -1
  372. package/lib/typescript/src/react/bindAppLifecycle.d.ts +7 -1
  373. package/lib/typescript/src/react/bindAppLifecycle.d.ts.map +1 -1
  374. package/lib/typescript/src/react/bindGameSession.d.ts.map +1 -1
  375. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts +24 -0
  376. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts.map +1 -0
  377. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts +44 -0
  378. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts.map +1 -0
  379. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts +22 -0
  380. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts.map +1 -0
  381. package/lib/typescript/src/react/cleanupList.d.ts +21 -0
  382. package/lib/typescript/src/react/cleanupList.d.ts.map +1 -0
  383. package/lib/typescript/src/react/instrumentation.d.ts +33 -3
  384. package/lib/typescript/src/react/instrumentation.d.ts.map +1 -1
  385. package/lib/typescript/src/react/lifecycleSource.d.ts +21 -0
  386. package/lib/typescript/src/react/lifecycleSource.d.ts.map +1 -0
  387. package/lib/typescript/src/react/particles/ParticleView.d.ts +65 -0
  388. package/lib/typescript/src/react/particles/ParticleView.d.ts.map +1 -0
  389. package/lib/typescript/src/react/particles/culling.d.ts +70 -0
  390. package/lib/typescript/src/react/particles/culling.d.ts.map +1 -0
  391. package/lib/typescript/src/react/particles/index.d.ts +7 -0
  392. package/lib/typescript/src/react/particles/index.d.ts.map +1 -0
  393. package/lib/typescript/src/react/particles/spriteXForm.d.ts +28 -0
  394. package/lib/typescript/src/react/particles/spriteXForm.d.ts.map +1 -0
  395. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts +48 -0
  396. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts.map +1 -0
  397. package/lib/typescript/src/react/pointerBinding.d.ts +38 -8
  398. package/lib/typescript/src/react/pointerBinding.d.ts.map +1 -1
  399. package/lib/typescript/src/react/pointerCamera.d.ts +20 -0
  400. package/lib/typescript/src/react/pointerCamera.d.ts.map +1 -0
  401. package/lib/typescript/src/react/pointerCoalescer.d.ts +17 -1
  402. package/lib/typescript/src/react/pointerCoalescer.d.ts.map +1 -1
  403. package/lib/typescript/src/react/sprites/GameSprite.d.ts +3 -10
  404. package/lib/typescript/src/react/sprites/GameSprite.d.ts.map +1 -1
  405. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts +51 -6
  406. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts.map +1 -1
  407. package/lib/typescript/src/react/sprites/Sprite.d.ts.map +1 -1
  408. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts +22 -1
  409. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts.map +1 -1
  410. package/lib/typescript/src/react/sprites/batchVisibility.d.ts +28 -0
  411. package/lib/typescript/src/react/sprites/batchVisibility.d.ts.map +1 -0
  412. package/lib/typescript/src/react/sprites/spriteSelection.d.ts +58 -0
  413. package/lib/typescript/src/react/sprites/spriteSelection.d.ts.map +1 -0
  414. package/lib/typescript/src/react/sprites/spriteTransform.d.ts +27 -12
  415. package/lib/typescript/src/react/sprites/spriteTransform.d.ts.map +1 -1
  416. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts +69 -0
  417. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts.map +1 -0
  418. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts +217 -0
  419. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts.map +1 -0
  420. package/lib/typescript/src/react/useGameSession.d.ts +48 -0
  421. package/lib/typescript/src/react/useGameSession.d.ts.map +1 -0
  422. package/lib/typescript/src/react/useGameSessionStatus.d.ts +23 -0
  423. package/lib/typescript/src/react/useGameSessionStatus.d.ts.map +1 -0
  424. package/lib/typescript/src/react/viewportBinding.d.ts +5 -1
  425. package/lib/typescript/src/react/viewportBinding.d.ts.map +1 -1
  426. package/lib/typescript/src/react.d.ts +18 -1
  427. package/lib/typescript/src/react.d.ts.map +1 -1
  428. package/lib/typescript/src/scene/defineScene.d.ts +22 -2
  429. package/lib/typescript/src/scene/defineScene.d.ts.map +1 -1
  430. package/lib/typescript/src/scene/types.d.ts +24 -4
  431. package/lib/typescript/src/scene/types.d.ts.map +1 -1
  432. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts +26 -2
  433. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts.map +1 -1
  434. package/lib/typescript/src/sprites/spriteAnimationState.d.ts +6 -7
  435. package/lib/typescript/src/sprites/spriteAnimationState.d.ts.map +1 -1
  436. package/lib/typescript/src/sprites.d.ts +10 -0
  437. package/lib/typescript/src/sprites.d.ts.map +1 -0
  438. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts +18 -0
  439. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts.map +1 -0
  440. package/lib/typescript/src/storage/adapters/memory.d.ts +16 -0
  441. package/lib/typescript/src/storage/adapters/memory.d.ts.map +1 -0
  442. package/lib/typescript/src/storage/errors.d.ts +37 -0
  443. package/lib/typescript/src/storage/errors.d.ts.map +1 -0
  444. package/lib/typescript/src/storage/index.d.ts +11 -0
  445. package/lib/typescript/src/storage/index.d.ts.map +1 -0
  446. package/lib/typescript/src/storage/schema.d.ts +22 -0
  447. package/lib/typescript/src/storage/schema.d.ts.map +1 -0
  448. package/lib/typescript/src/storage/serialization.d.ts +23 -0
  449. package/lib/typescript/src/storage/serialization.d.ts.map +1 -0
  450. package/lib/typescript/src/storage/store.d.ts +3 -0
  451. package/lib/typescript/src/storage/store.d.ts.map +1 -0
  452. package/lib/typescript/src/storage/types.d.ts +69 -0
  453. package/lib/typescript/src/storage/types.d.ts.map +1 -0
  454. package/lib/typescript/src/storage/validation.d.ts +24 -0
  455. package/lib/typescript/src/storage/validation.d.ts.map +1 -0
  456. package/lib/typescript/src/storage.d.ts +2 -0
  457. package/lib/typescript/src/storage.d.ts.map +1 -0
  458. package/lib/typescript/src/testing.d.ts +1 -0
  459. package/lib/typescript/src/testing.d.ts.map +1 -1
  460. package/lib/typescript/src/tilemap/chunkStats.d.ts +14 -0
  461. package/lib/typescript/src/tilemap/chunkStats.d.ts.map +1 -0
  462. package/lib/typescript/src/tilemap/definitions.d.ts +38 -0
  463. package/lib/typescript/src/tilemap/definitions.d.ts.map +1 -0
  464. package/lib/typescript/src/tilemap/errors.d.ts +7 -0
  465. package/lib/typescript/src/tilemap/errors.d.ts.map +1 -0
  466. package/lib/typescript/src/tilemap/index.d.ts +8 -0
  467. package/lib/typescript/src/tilemap/index.d.ts.map +1 -0
  468. package/lib/typescript/src/tilemap/movement.d.ts +52 -0
  469. package/lib/typescript/src/tilemap/movement.d.ts.map +1 -0
  470. package/lib/typescript/src/tilemap/queries.d.ts +21 -0
  471. package/lib/typescript/src/tilemap/queries.d.ts.map +1 -0
  472. package/lib/typescript/src/tilemap/tiledAdapter.d.ts +32 -0
  473. package/lib/typescript/src/tilemap/tiledAdapter.d.ts.map +1 -0
  474. package/lib/typescript/src/tilemap/types.d.ts +127 -0
  475. package/lib/typescript/src/tilemap/types.d.ts.map +1 -0
  476. package/lib/typescript/src/tilemap.d.ts +2 -0
  477. package/lib/typescript/src/tilemap.d.ts.map +1 -0
  478. package/package.json +94 -4
  479. package/src/assets/defineAssets.ts +31 -5
  480. package/src/assets.ts +27 -0
  481. package/src/audio/createGameAudio.ts +749 -0
  482. package/src/audio/errors.ts +12 -0
  483. package/src/audio/index.ts +9 -0
  484. package/src/audio/resolver.ts +74 -0
  485. package/src/audio/types.ts +47 -0
  486. package/src/audio.ts +13 -0
  487. package/src/camera2d/bounds.ts +69 -0
  488. package/src/camera2d/extents.ts +25 -0
  489. package/src/camera2d/follow.ts +165 -0
  490. package/src/camera2d/index.ts +29 -0
  491. package/src/camera2d/interpolation.ts +113 -0
  492. package/src/camera2d/shake.ts +90 -0
  493. package/src/camera2d/transform.ts +148 -0
  494. package/src/camera2d/types.ts +73 -0
  495. package/src/camera2d/validation.ts +126 -0
  496. package/src/camera2d/visibility.ts +181 -0
  497. package/src/camera2d.ts +6 -0
  498. package/src/collision2d/colliders.ts +292 -0
  499. package/src/collision2d/debug.ts +133 -0
  500. package/src/collision2d/filters.ts +48 -0
  501. package/src/collision2d/index.ts +74 -0
  502. package/src/collision2d/intersections.ts +82 -0
  503. package/src/collision2d/manifolds.ts +191 -0
  504. package/src/collision2d/segments.ts +176 -0
  505. package/src/collision2d/spatialHash.ts +211 -0
  506. package/src/collision2d/sweeps.ts +269 -0
  507. package/src/collision2d.ts +6 -0
  508. package/src/core/input/buttonPad.ts +235 -0
  509. package/src/core/input/createInputBuffer.ts +95 -14
  510. package/src/core/input/types.ts +7 -0
  511. package/src/core/session/createGameSession.ts +480 -53
  512. package/src/core/session/deepFreeze.ts +104 -3
  513. package/src/core/session/diagnostics.ts +2 -0
  514. package/src/core/session/types.ts +77 -4
  515. package/src/definition/defineGame.ts +61 -3
  516. package/src/definition/types.ts +10 -0
  517. package/src/events/defineGameEvents.ts +46 -0
  518. package/src/events/errors.ts +14 -0
  519. package/src/events/index.ts +14 -0
  520. package/src/events/payload.ts +234 -0
  521. package/src/events/seed.ts +33 -0
  522. package/src/events/types.ts +53 -0
  523. package/src/events.ts +20 -0
  524. package/src/geometry/helpers.ts +136 -0
  525. package/src/geometry/index.ts +14 -0
  526. package/src/geometry/types.ts +54 -0
  527. package/src/geometry/validation.ts +131 -0
  528. package/src/geometry.ts +6 -0
  529. package/src/haptics/createGameHaptics.ts +214 -0
  530. package/src/haptics/errors.ts +12 -0
  531. package/src/haptics/index.ts +3 -0
  532. package/src/haptics/resolver.ts +58 -0
  533. package/src/haptics/types.ts +48 -0
  534. package/src/haptics.ts +7 -0
  535. package/src/index.ts +37 -1
  536. package/src/particles/createParticleSystem.ts +505 -0
  537. package/src/particles/defineParticleEffect.ts +164 -0
  538. package/src/particles/errors.ts +6 -0
  539. package/src/particles/index.ts +5 -0
  540. package/src/particles/sampling.ts +141 -0
  541. package/src/particles/types.ts +327 -0
  542. package/src/particles.ts +1 -0
  543. package/src/react/GameButtonPad.tsx +436 -0
  544. package/src/react/GamePointerInput.tsx +73 -8
  545. package/src/react/GameView.tsx +160 -61
  546. package/src/react/assets/createGameAssetStore.ts +140 -107
  547. package/src/react/assets/useGameAssets.ts +63 -31
  548. package/src/react/bindAppLifecycle.ts +55 -19
  549. package/src/react/bindGameSession.ts +12 -2
  550. package/src/react/camera2d/GameLayer2D.tsx +43 -0
  551. package/src/react/camera2d/defineGameCamera2D.ts +59 -0
  552. package/src/react/camera2d/usePresentedCameraBinding.ts +185 -0
  553. package/src/react/cleanupList.ts +48 -0
  554. package/src/react/instrumentation.ts +31 -3
  555. package/src/react/lifecycleSource.ts +58 -0
  556. package/src/react/particles/ParticleView.tsx +358 -0
  557. package/src/react/particles/culling.ts +145 -0
  558. package/src/react/particles/index.ts +6 -0
  559. package/src/react/particles/spriteXForm.ts +72 -0
  560. package/src/react/particles/useParticlePresentation.ts +261 -0
  561. package/src/react/pointerBinding.ts +74 -16
  562. package/src/react/pointerCamera.ts +33 -0
  563. package/src/react/pointerCoalescer.ts +36 -10
  564. package/src/react/sprites/GameSprite.tsx +4 -33
  565. package/src/react/sprites/GameWorld2D.tsx +113 -7
  566. package/src/react/sprites/Sprite.tsx +51 -72
  567. package/src/react/sprites/SpriteBatch.tsx +74 -22
  568. package/src/react/sprites/batchVisibility.ts +76 -0
  569. package/src/react/sprites/spriteSelection.ts +133 -0
  570. package/src/react/sprites/spriteTransform.ts +46 -26
  571. package/src/react/tilemap/TileMapLayer2D.tsx +274 -0
  572. package/src/react/tilemap/tilePresentation.ts +491 -0
  573. package/src/react/useGameSession.ts +90 -0
  574. package/src/react/useGameSessionStatus.ts +53 -0
  575. package/src/react/viewportBinding.ts +5 -1
  576. package/src/react.ts +18 -1
  577. package/src/scene/defineScene.ts +47 -5
  578. package/src/scene/types.ts +37 -3
  579. package/src/sprites/sampleSpriteClip.ts +82 -14
  580. package/src/sprites/spriteAnimationState.ts +29 -25
  581. package/src/sprites.ts +22 -0
  582. package/src/storage/adapters/asyncStorage.ts +77 -0
  583. package/src/storage/adapters/memory.ts +58 -0
  584. package/src/storage/errors.ts +88 -0
  585. package/src/storage/index.ts +18 -0
  586. package/src/storage/schema.ts +147 -0
  587. package/src/storage/serialization.ts +248 -0
  588. package/src/storage/store.ts +380 -0
  589. package/src/storage/types.ts +76 -0
  590. package/src/storage/validation.ts +102 -0
  591. package/src/storage.ts +1 -0
  592. package/src/testing.ts +4 -0
  593. package/src/tilemap/chunkStats.ts +24 -0
  594. package/src/tilemap/definitions.ts +327 -0
  595. package/src/tilemap/errors.ts +11 -0
  596. package/src/tilemap/index.ts +10 -0
  597. package/src/tilemap/movement.ts +368 -0
  598. package/src/tilemap/queries.ts +136 -0
  599. package/src/tilemap/tiledAdapter.ts +165 -0
  600. package/src/tilemap/types.ts +119 -0
  601. package/src/tilemap.ts +1 -0
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ import { createCleanupList } from "./cleanupList.js";
4
+
3
5
  /** Minimal AppState-like source used to keep this seam platform-neutral. */
4
6
 
5
7
  /** Session operations the lifecycle binding may drive. */
@@ -17,7 +19,12 @@
17
19
  * cannot restart an unmounted game.
18
20
  */
19
21
  export function bindAppLifecycle(source, session) {
22
+ // GS-REACT-02: setup is transactional — every stage registers its release
23
+ // as it completes, so a later failure unwinds everything acquired so far.
24
+ const cleanups = createCleanupList();
20
25
  let pausedByLifecycle = false;
26
+ let currentState = source.currentState ?? 'active';
27
+ const isInactive = state => state === 'inactive' || state === 'background';
21
28
  const pauseForBackground = () => {
22
29
  if (session.getStatus() === 'running') {
23
30
  session.pause();
@@ -25,33 +32,55 @@ export function bindAppLifecycle(source, session) {
25
32
  }
26
33
  };
27
34
 
28
- // Synchronize the initial app state before any change event arrives.
29
- if (source.currentState === 'inactive' || source.currentState === 'background') {
30
- pauseForBackground();
31
- }
32
- const subscription = source.addEventListener('change', next => {
33
- if (next === 'active') {
34
- if (pausedByLifecycle) {
35
- pausedByLifecycle = false;
36
- // Resume only if the session is still paused; a different actor may
37
- // have resumed or disposed it while the app was backgrounded.
38
- if (session.getStatus() === 'paused') {
39
- session.resume();
35
+ // T10.6: an external start() while the host is inactive is deterministically
36
+ // returned to paused. The binder observes status transitions and re-pauses
37
+ // any running transition that happens while the app is not active, so a
38
+ // frame loop cannot escape into the background.
39
+ let statusSubscription;
40
+ try {
41
+ if (session.addStatusListener !== undefined) {
42
+ statusSubscription = session.addStatusListener(status => {
43
+ if (status === 'running' && isInactive(currentState)) {
44
+ session.pause();
45
+ pausedByLifecycle = true;
40
46
  }
41
- }
42
- return;
47
+ });
48
+ cleanups.add(() => statusSubscription?.remove());
43
49
  }
44
- if (next === 'inactive' || next === 'background') {
50
+
51
+ // Synchronize the initial app state before any change event arrives.
52
+ if (isInactive(source.currentState)) {
45
53
  pauseForBackground();
46
54
  }
47
- });
55
+ const subscription = source.addEventListener('change', next => {
56
+ currentState = next;
57
+ if (next === 'active') {
58
+ if (pausedByLifecycle) {
59
+ pausedByLifecycle = false;
60
+ // Resume only if the session is still paused; a different actor may
61
+ // have resumed or disposed it while the app was backgrounded.
62
+ if (session.getStatus() === 'paused') {
63
+ session.resume();
64
+ }
65
+ }
66
+ return;
67
+ }
68
+ if (isInactive(next)) {
69
+ pauseForBackground();
70
+ }
71
+ });
72
+ cleanups.add(() => subscription.remove());
73
+ } catch (error) {
74
+ cleanups.releaseAll();
75
+ throw error;
76
+ }
48
77
  let cleanedUp = false;
49
78
  return () => {
50
79
  if (cleanedUp) {
51
80
  return;
52
81
  }
53
82
  cleanedUp = true;
54
- subscription.remove();
83
+ cleanups.releaseAll();
55
84
  pausedByLifecycle = false;
56
85
  };
57
86
  }
@@ -1 +1 @@
1
- {"version":3,"names":["bindAppLifecycle","source","session","pausedByLifecycle","pauseForBackground","getStatus","pause","currentState","subscription","addEventListener","next","resume","cleanedUp","remove"],"sourceRoot":"../../../src","sources":["react/bindAppLifecycle.ts"],"mappings":";;AAEA;;AAUA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,gBAAgBA,CAC9BC,MAA0B,EAC1BC,OAA4B,EAChB;EACZ,IAAIC,iBAAiB,GAAG,KAAK;EAE7B,MAAMC,kBAAkB,GAAGA,CAAA,KAAM;IAC/B,IAAIF,OAAO,CAACG,SAAS,CAAC,CAAC,KAAK,SAAS,EAAE;MACrCH,OAAO,CAACI,KAAK,CAAC,CAAC;MACfH,iBAAiB,GAAG,IAAI;IAC1B;EACF,CAAC;;EAED;EACA,IAAIF,MAAM,CAACM,YAAY,KAAK,UAAU,IAAIN,MAAM,CAACM,YAAY,KAAK,YAAY,EAAE;IAC9EH,kBAAkB,CAAC,CAAC;EACtB;EAEA,MAAMI,YAAY,GAAGP,MAAM,CAACQ,gBAAgB,CAAC,QAAQ,EAAGC,IAAI,IAAK;IAC/D,IAAIA,IAAI,KAAK,QAAQ,EAAE;MACrB,IAAIP,iBAAiB,EAAE;QACrBA,iBAAiB,GAAG,KAAK;QACzB;QACA;QACA,IAAID,OAAO,CAACG,SAAS,CAAC,CAAC,KAAK,QAAQ,EAAE;UACpCH,OAAO,CAACS,MAAM,CAAC,CAAC;QAClB;MACF;MACA;IACF;IACA,IAAID,IAAI,KAAK,UAAU,IAAIA,IAAI,KAAK,YAAY,EAAE;MAChDN,kBAAkB,CAAC,CAAC;IACtB;EACF,CAAC,CAAC;EAEF,IAAIQ,SAAS,GAAG,KAAK;EACrB,OAAO,MAAM;IACX,IAAIA,SAAS,EAAE;MACb;IACF;IACAA,SAAS,GAAG,IAAI;IAChBJ,YAAY,CAACK,MAAM,CAAC,CAAC;IACrBV,iBAAiB,GAAG,KAAK;EAC3B,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["createCleanupList","bindAppLifecycle","source","session","cleanups","pausedByLifecycle","currentState","isInactive","state","pauseForBackground","getStatus","pause","statusSubscription","addStatusListener","undefined","status","add","remove","subscription","addEventListener","next","resume","error","releaseAll","cleanedUp"],"sourceRoot":"../../../src","sources":["react/bindAppLifecycle.ts"],"mappings":";;AACA,SAASA,iBAAiB,QAAQ,kBAAe;;AAEjD;;AAUA;;AAgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,MAA0B,EAC1BC,OAA4B,EAChB;EACZ;EACA;EACA,MAAMC,QAAQ,GAAGJ,iBAAiB,CAAC,CAAC;EACpC,IAAIK,iBAAiB,GAAG,KAAK;EAC7B,IAAIC,YAAY,GAAGJ,MAAM,CAACI,YAAY,IAAI,QAAQ;EAElD,MAAMC,UAAU,GAAIC,KAAgC,IAClDA,KAAK,KAAK,UAAU,IAAIA,KAAK,KAAK,YAAY;EAEhD,MAAMC,kBAAkB,GAAGA,CAAA,KAAM;IAC/B,IAAIN,OAAO,CAACO,SAAS,CAAC,CAAC,KAAK,SAAS,EAAE;MACrCP,OAAO,CAACQ,KAAK,CAAC,CAAC;MACfN,iBAAiB,GAAG,IAAI;IAC1B;EACF,CAAC;;EAED;EACA;EACA;EACA;EACA,IAAIO,kBAAgD;EACpD,IAAI;IACF,IAAIT,OAAO,CAACU,iBAAiB,KAAKC,SAAS,EAAE;MAC3CF,kBAAkB,GAAGT,OAAO,CAACU,iBAAiB,CAAEE,MAAM,IAAK;QACzD,IAAIA,MAAM,KAAK,SAAS,IAAIR,UAAU,CAACD,YAAY,CAAC,EAAE;UACpDH,OAAO,CAACQ,KAAK,CAAC,CAAC;UACfN,iBAAiB,GAAG,IAAI;QAC1B;MACF,CAAC,CAAC;MACFD,QAAQ,CAACY,GAAG,CAAC,MAAMJ,kBAAkB,EAAEK,MAAM,CAAC,CAAC,CAAC;IAClD;;IAEA;IACA,IAAIV,UAAU,CAACL,MAAM,CAACI,YAAY,CAAC,EAAE;MACnCG,kBAAkB,CAAC,CAAC;IACtB;IAEA,MAAMS,YAAY,GAAGhB,MAAM,CAACiB,gBAAgB,CAAC,QAAQ,EAAGC,IAAI,IAAK;MAC/Dd,YAAY,GAAGc,IAAI;MACnB,IAAIA,IAAI,KAAK,QAAQ,EAAE;QACrB,IAAIf,iBAAiB,EAAE;UACrBA,iBAAiB,GAAG,KAAK;UACzB;UACA;UACA,IAAIF,OAAO,CAACO,SAAS,CAAC,CAAC,KAAK,QAAQ,EAAE;YACpCP,OAAO,CAACkB,MAAM,CAAC,CAAC;UAClB;QACF;QACA;MACF;MACA,IAAId,UAAU,CAACa,IAAI,CAAC,EAAE;QACpBX,kBAAkB,CAAC,CAAC;MACtB;IACF,CAAC,CAAC;IACFL,QAAQ,CAACY,GAAG,CAAC,MAAME,YAAY,CAACD,MAAM,CAAC,CAAC,CAAC;EAC3C,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdlB,QAAQ,CAACmB,UAAU,CAAC,CAAC;IACrB,MAAMD,KAAK;EACb;EAEA,IAAIE,SAAS,GAAG,KAAK;EACrB,OAAO,MAAM;IACX,IAAIA,SAAS,EAAE;MACb;IACF;IACAA,SAAS,GAAG,IAAI;IAChBpB,QAAQ,CAACmB,UAAU,CAAC,CAAC;IACrBlB,iBAAiB,GAAG,KAAK;EAC3B,CAAC;AACH","ignoreList":[]}
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ import { createCleanupList } from "./cleanupList.js";
4
+
3
5
  /**
4
6
  * Bind a live session to an imperative presentation sink.
5
7
  *
@@ -11,6 +13,9 @@
11
13
  * through the same guard.
12
14
  */
13
15
  export function bindGameSession(game, present) {
16
+ // GS-REACT-02: setup is transactional — the commit listener registered
17
+ // below is released when the subsequent start() throws.
18
+ const cleanups = createCleanupList();
14
19
  let lastRevision = -1;
15
20
  const presentIfNewer = frame => {
16
21
  if (frame.revision <= lastRevision) {
@@ -21,14 +26,20 @@ export function bindGameSession(game, present) {
21
26
  };
22
27
  presentIfNewer(game.getRenderFrame());
23
28
  const subscription = game.addCommitListener(presentIfNewer);
24
- game.start();
29
+ cleanups.add(() => subscription.remove());
30
+ try {
31
+ game.start();
32
+ } catch (error) {
33
+ cleanups.releaseAll();
34
+ throw error;
35
+ }
25
36
  let cleanedUp = false;
26
37
  return () => {
27
38
  if (cleanedUp) {
28
39
  return;
29
40
  }
30
41
  cleanedUp = true;
31
- subscription.remove();
42
+ cleanups.releaseAll();
32
43
  if (game.status !== 'disposed') {
33
44
  game.pause();
34
45
  }
@@ -1 +1 @@
1
- {"version":3,"names":["bindGameSession","game","present","lastRevision","presentIfNewer","frame","revision","getRenderFrame","subscription","addCommitListener","start","cleanedUp","remove","status","pause"],"sourceRoot":"../../../src","sources":["react/bindGameSession.ts"],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,eAAeA,CAC7BC,IAAkC,EAClCC,OAA8C,EAClC;EACZ,IAAIC,YAAY,GAAG,CAAC,CAAC;EACrB,MAAMC,cAAc,GAAIC,KAA2B,IAAK;IACtD,IAAIA,KAAK,CAACC,QAAQ,IAAIH,YAAY,EAAE;MAClC;IACF;IACAA,YAAY,GAAGE,KAAK,CAACC,QAAQ;IAC7BJ,OAAO,CAACG,KAAK,CAAC;EAChB,CAAC;EACDD,cAAc,CAACH,IAAI,CAACM,cAAc,CAAC,CAAC,CAAC;EACrC,MAAMC,YAAY,GAAGP,IAAI,CAACQ,iBAAiB,CAACL,cAAc,CAAC;EAC3DH,IAAI,CAACS,KAAK,CAAC,CAAC;EACZ,IAAIC,SAAS,GAAG,KAAK;EAErB,OAAO,MAAM;IACX,IAAIA,SAAS,EAAE;MACb;IACF;IACAA,SAAS,GAAG,IAAI;IAChBH,YAAY,CAACI,MAAM,CAAC,CAAC;IACrB,IAAIX,IAAI,CAACY,MAAM,KAAK,UAAU,EAAE;MAC9BZ,IAAI,CAACa,KAAK,CAAC,CAAC;IACd;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["createCleanupList","bindGameSession","game","present","cleanups","lastRevision","presentIfNewer","frame","revision","getRenderFrame","subscription","addCommitListener","add","remove","start","error","releaseAll","cleanedUp","status","pause"],"sourceRoot":"../../../src","sources":["react/bindGameSession.ts"],"mappings":";;AAEA,SAASA,iBAAiB,QAAQ,kBAAe;;AAEjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,eAAeA,CAC7BC,IAAkC,EAClCC,OAA8C,EAClC;EACZ;EACA;EACA,MAAMC,QAAQ,GAAGJ,iBAAiB,CAAC,CAAC;EACpC,IAAIK,YAAY,GAAG,CAAC,CAAC;EACrB,MAAMC,cAAc,GAAIC,KAA2B,IAAK;IACtD,IAAIA,KAAK,CAACC,QAAQ,IAAIH,YAAY,EAAE;MAClC;IACF;IACAA,YAAY,GAAGE,KAAK,CAACC,QAAQ;IAC7BL,OAAO,CAACI,KAAK,CAAC;EAChB,CAAC;EACDD,cAAc,CAACJ,IAAI,CAACO,cAAc,CAAC,CAAC,CAAC;EACrC,MAAMC,YAAY,GAAGR,IAAI,CAACS,iBAAiB,CAACL,cAAc,CAAC;EAC3DF,QAAQ,CAACQ,GAAG,CAAC,MAAMF,YAAY,CAACG,MAAM,CAAC,CAAC,CAAC;EACzC,IAAI;IACFX,IAAI,CAACY,KAAK,CAAC,CAAC;EACd,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdX,QAAQ,CAACY,UAAU,CAAC,CAAC;IACrB,MAAMD,KAAK;EACb;EACA,IAAIE,SAAS,GAAG,KAAK;EAErB,OAAO,MAAM;IACX,IAAIA,SAAS,EAAE;MACb;IACF;IACAA,SAAS,GAAG,IAAI;IAChBb,QAAQ,CAACY,UAAU,CAAC,CAAC;IACrB,IAAId,IAAI,CAACgB,MAAM,KAAK,UAAU,EAAE;MAC9BhB,IAAI,CAACiB,KAAK,CAAC,CAAC;IACd;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * `GameLayer2D` — an ordered parallax layer (T12.5).
5
+ *
6
+ * A small rendering primitive, not a scene graph: the layer draws its
7
+ * children with the presented camera whose center contribution is scaled
8
+ * per axis by the parallax factor. JSX order is render order; no z-index
9
+ * scheduler exists.
10
+ *
11
+ * Frozen policy: parallax scales only the camera center contribution. Zoom
12
+ * and rotation apply fully at every factor; factor 1 is the primary layer,
13
+ * factor 0 is camera-fixed on that axis. The correction is a pure
14
+ * translation relative to the parent camera, so layers never double-apply
15
+ * zoom or rotation.
16
+ */
17
+
18
+ import { Group } from '@shopify/react-native-skia';
19
+ import { useDerivedValue } from 'react-native-reanimated';
20
+ import { layerParallaxTransform2D, useGameWorldContext } from "../sprites/GameWorld2D.js";
21
+ import { jsx as _jsx } from "react/jsx-runtime";
22
+ function assertFiniteParallax(value, axis) {
23
+ if (!Number.isFinite(value)) {
24
+ throw new RangeError(`GameLayer2D parallax.${axis} must be finite, got ${String(value)}`);
25
+ }
26
+ }
27
+ export function GameLayer2D({
28
+ parallax = {
29
+ x: 1,
30
+ y: 1
31
+ },
32
+ children
33
+ }) {
34
+ assertFiniteParallax(parallax.x, 'x');
35
+ assertFiniteParallax(parallax.y, 'y');
36
+ const {
37
+ viewport,
38
+ camera
39
+ } = useGameWorldContext();
40
+ const transform = useDerivedValue(() => {
41
+ 'worklet';
42
+
43
+ return layerParallaxTransform2D(camera?.value, viewport.value, parallax.x, parallax.y);
44
+ });
45
+ return /*#__PURE__*/_jsx(Group, {
46
+ transform: transform,
47
+ children: children
48
+ });
49
+ }
50
+ //# sourceMappingURL=GameLayer2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Group","useDerivedValue","layerParallaxTransform2D","useGameWorldContext","jsx","_jsx","assertFiniteParallax","value","axis","Number","isFinite","RangeError","String","GameLayer2D","parallax","x","y","children","viewport","camera","transform"],"sourceRoot":"../../../../src","sources":["react/camera2d/GameLayer2D.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,QAAQ,4BAA4B;AAClD,SAASC,eAAe,QAAQ,yBAAyB;AAEzD,SAASC,wBAAwB,EAAEC,mBAAmB,QAAQ,2BAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEvF,SAASC,oBAAoBA,CAACC,KAAa,EAAEC,IAAe,EAAQ;EAClE,IAAI,CAACC,MAAM,CAACC,QAAQ,CAACH,KAAK,CAAC,EAAE;IAC3B,MAAM,IAAII,UAAU,CAAC,wBAAwBH,IAAI,wBAAwBI,MAAM,CAACL,KAAK,CAAC,EAAE,CAAC;EAC3F;AACF;AAEA,OAAO,SAASM,WAAWA,CAAC;EAC1BC,QAAQ,GAAG;IAAEC,CAAC,EAAE,CAAC;IAAEC,CAAC,EAAE;EAAE,CAAC;EACzBC;AAKF,CAAC,EAAE;EACDX,oBAAoB,CAACQ,QAAQ,CAACC,CAAC,EAAE,GAAG,CAAC;EACrCT,oBAAoB,CAACQ,QAAQ,CAACE,CAAC,EAAE,GAAG,CAAC;EACrC,MAAM;IAAEE,QAAQ;IAAEC;EAAO,CAAC,GAAGhB,mBAAmB,CAAC,CAAC;EAClD,MAAMiB,SAAS,GAAGnB,eAAe,CAAC,MAAM;IACtC,SAAS;;IACT,OAAOC,wBAAwB,CAACiB,MAAM,EAAEZ,KAAK,EAAEW,QAAQ,CAACX,KAAK,EAAEO,QAAQ,CAACC,CAAC,EAAED,QAAQ,CAACE,CAAC,CAAC;EACxF,CAAC,CAAC;EACF,oBAAOX,IAAA,CAACL,KAAK;IAACoB,SAAS,EAAEA,SAAmB;IAAAH,QAAA,EAAEA;EAAQ,CAAQ,CAAC;AACjE","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Camera2D definition (T12.3).
5
+ *
6
+ * A static, declarative camera binding: `select` reads the authored camera
7
+ * from committed frames, and the optional `cut` predicate signals an
8
+ * explicit cut (teleports, respawns) where interpolation must snap. The
9
+ * binding is owned by `GameView` and never by the renderer or the pointer
10
+ * adapter, so both consume the same presented generation.
11
+ */
12
+
13
+ /** Failure context for a camera selector/cut/validation failure (GS-CAMERA-02). */
14
+
15
+ /** The static camera definition supplied to `GameView`. */
16
+
17
+ /** Validate and return a camera definition. */
18
+ export function defineGameCamera2D(definition) {
19
+ if (typeof definition.select !== 'function') {
20
+ throw new Error('defineGameCamera2D requires a select function');
21
+ }
22
+ if (definition.cut !== undefined && typeof definition.cut !== 'function') {
23
+ throw new Error('defineGameCamera2D requires cut to be a function when provided');
24
+ }
25
+ if (definition.onError !== undefined && typeof definition.onError !== 'function') {
26
+ throw new Error('defineGameCamera2D requires onError to be a function when provided');
27
+ }
28
+ return definition;
29
+ }
30
+ //# sourceMappingURL=defineGameCamera2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["defineGameCamera2D","definition","select","Error","cut","undefined","onError"],"sourceRoot":"../../../../src","sources":["react/camera2d/defineGameCamera2D.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAUA;;AAuBA;AACA,OAAO,SAASA,kBAAkBA,CAChCC,UAA0C,EACV;EAChC,IAAI,OAAOA,UAAU,CAACC,MAAM,KAAK,UAAU,EAAE;IAC3C,MAAM,IAAIC,KAAK,CAAC,+CAA+C,CAAC;EAClE;EACA,IAAIF,UAAU,CAACG,GAAG,KAAKC,SAAS,IAAI,OAAOJ,UAAU,CAACG,GAAG,KAAK,UAAU,EAAE;IACxE,MAAM,IAAID,KAAK,CAAC,gEAAgE,CAAC;EACnF;EACA,IAAIF,UAAU,CAACK,OAAO,KAAKD,SAAS,IAAI,OAAOJ,UAAU,CAACK,OAAO,KAAK,UAAU,EAAE;IAChF,MAAM,IAAIH,KAAK,CAAC,oEAAoE,CAAC;EACvF;EACA,OAAOF,UAAU;AACnB","ignoreList":[]}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Presented camera binding (T12.3, T12-F2, T12-F3).
5
+ *
6
+ * Joins authored camera data to the UI presentation pipeline: `commit`
7
+ * runs per simulation commit on the JS runtime and evaluates the
8
+ * definition's selector AND cut predicate as ONE exception-safe
9
+ * transaction, validating the selected camera before any shared value is
10
+ * published. `present` runs on the UI runtime per display frame and
11
+ * delegates to the trusted scalar projector (a complete worklet call
12
+ * graph), writing the read-only `CameraCut2D` into the GameView-owned
13
+ * shared value that renderer and pointer adapter both consume.
14
+ *
15
+ * Cut semantics (snap instead of interpolate): scene transitions
16
+ * (`hardCut` or a scene-name change), explicit `cut` predicate hits,
17
+ * session replacement, and definition replacement — which is modeled as
18
+ * ONE pending cut owned by the replacement and consumed on its first
19
+ * successful commit, so later commits interpolate normally (T12-F3).
20
+ * A throwing selector or cut predicate retains the last valid presented
21
+ * value and leaves no half-updated state; the next valid commit recovers.
22
+ */
23
+ import { useEffect, useMemo, useRef } from 'react';
24
+ import { useSharedValue } from 'react-native-reanimated';
25
+ import { interpolateCameraScalar2D } from "../../camera2d.js";
26
+ import { cloneValidCamera2D } from "../../camera2d/validation.js";
27
+
28
+ /** A UI-side camera binding for one session presentation. */
29
+
30
+ function sameSceneName(first, second) {
31
+ return first === second;
32
+ }
33
+
34
+ /**
35
+ * Create the camera binding for one presentation.
36
+ *
37
+ * The `presented` shared value is owned by `GameView` so the pointer
38
+ * adapter (a sibling of the renderer) reads the same generation.
39
+ */
40
+ export function usePresentedCameraBinding(definition, presented) {
41
+ const authoredPrevious = useSharedValue(undefined);
42
+ const authoredCurrent = useSharedValue(undefined);
43
+ const cutId = useSharedValue(0);
44
+ const sceneNameRef = useRef(undefined);
45
+ // T12-F3: definition replacement is ONE pending cut, consumed by the
46
+ // first successful commit of the replacement binding — never a
47
+ // render-time boolean that stays true for the binding lifetime.
48
+ const pendingCutRef = useRef(false);
49
+ const definitionRef = useRef(definition);
50
+ useEffect(() => {
51
+ if (definitionRef.current === definition) {
52
+ return;
53
+ }
54
+ definitionRef.current = definition;
55
+ pendingCutRef.current = true;
56
+ authoredPrevious.value = undefined;
57
+ authoredCurrent.value = undefined;
58
+ sceneNameRef.current = undefined;
59
+ cutId.value += 1;
60
+ presented.value = undefined;
61
+ }, [authoredCurrent, authoredPrevious, cutId, definition, presented]);
62
+ const binding = useMemo(() => {
63
+ // GS-CAMERA-02: one report per failure episode (phase + message),
64
+ // reset by the next successful commit so a later distinct failure
65
+ // stays visible.
66
+ let lastReportedFailureKey = null;
67
+ const reportCameraError = (activeDefinition, phase, error, frame) => {
68
+ const onError = activeDefinition.onError;
69
+ if (onError === undefined) {
70
+ return;
71
+ }
72
+ const message = error instanceof Error ? error.message : String(error);
73
+ const key = `${phase}:${message}`;
74
+ if (key === lastReportedFailureKey) {
75
+ return;
76
+ }
77
+ lastReportedFailureKey = key;
78
+ try {
79
+ onError({
80
+ phase,
81
+ error,
82
+ scene: String(frame.scene)
83
+ });
84
+ } catch {
85
+ // A throwing reporter must not break the last-valid fallback.
86
+ }
87
+ };
88
+ const markRecovered = () => {
89
+ lastReportedFailureKey = null;
90
+ };
91
+ return {
92
+ commit: frame => {
93
+ // GS-CAMERA-01: the binding identity is stable across definition
94
+ // replacements (the inner effect owns the pending cut), so a
95
+ // definition change never tears down presentation or restarts the
96
+ // session. Always read the current definition here.
97
+ const activeDefinition = definitionRef.current;
98
+ if (activeDefinition === undefined) {
99
+ return;
100
+ }
101
+ // One exception-safe transaction: select + cut + validation. A
102
+ // failure retains the last valid presented value and leaves no
103
+ // half-updated scene/cut state.
104
+ let camera;
105
+ let explicitCut = false;
106
+ let phase = 'select';
107
+ try {
108
+ // T12-RF4 + T12-SF3: the selector output is validated AND copied
109
+ // at the JS commit boundary with the STRICT full-camera clone — a
110
+ // mutable selector result can never alias the authored values,
111
+ // and a partial camera is rejected, never completed with
112
+ // defaults.
113
+ const selected = activeDefinition.select(frame);
114
+ phase = 'cut';
115
+ explicitCut = activeDefinition.cut?.(frame) === true;
116
+ phase = 'validate';
117
+ camera = cloneValidCamera2D(selected);
118
+ } catch (error) {
119
+ reportCameraError(activeDefinition, phase, error, frame);
120
+ return;
121
+ }
122
+ markRecovered();
123
+ const pendingCut = pendingCutRef.current;
124
+ pendingCutRef.current = false;
125
+ const sceneChanged = !sameSceneName(sceneNameRef.current, String(frame.scene));
126
+ sceneNameRef.current = String(frame.scene);
127
+ const current = {
128
+ camera,
129
+ cutId: cutId.value
130
+ };
131
+ if (pendingCut || explicitCut || sceneChanged || frame.hardCut) {
132
+ authoredPrevious.value = undefined;
133
+ cutId.value += 1;
134
+ authoredCurrent.value = {
135
+ camera,
136
+ cutId: cutId.value
137
+ };
138
+ // GS-CAMERA-01: a valid hard cut installs the presented camera
139
+ // immediately — paused time presents coherently without waiting
140
+ // for the next present(alpha). Ordinary commits leave
141
+ // presentation to the frame clock so pause freezes interpolation.
142
+ presented.value = {
143
+ camera,
144
+ cutId: cutId.value
145
+ };
146
+ } else {
147
+ authoredPrevious.value = authoredCurrent.value;
148
+ authoredCurrent.value = current;
149
+ }
150
+ },
151
+ present: alpha => {
152
+ 'worklet';
153
+
154
+ const current = authoredCurrent.value;
155
+ if (current === undefined) {
156
+ return;
157
+ }
158
+ presented.value = {
159
+ camera: interpolateCameraScalar2D(authoredPrevious.value, current, alpha),
160
+ cutId: current.cutId
161
+ };
162
+ },
163
+ dispose: () => {
164
+ authoredPrevious.value = undefined;
165
+ authoredCurrent.value = undefined;
166
+ presented.value = undefined;
167
+ }
168
+ };
169
+ },
170
+ // GS-CAMERA-01: stable identity across definition replacements — the
171
+ // inner effect owns the pending cut, so definition changes never tear
172
+ // down presentation or restart the session. `presented` is GameView-owned
173
+ // and stable per mount.
174
+ [presented]);
175
+ return binding;
176
+ }
177
+ //# sourceMappingURL=usePresentedCameraBinding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useMemo","useRef","useSharedValue","interpolateCameraScalar2D","cloneValidCamera2D","sameSceneName","first","second","usePresentedCameraBinding","definition","presented","authoredPrevious","undefined","authoredCurrent","cutId","sceneNameRef","pendingCutRef","definitionRef","current","value","binding","lastReportedFailureKey","reportCameraError","activeDefinition","phase","error","frame","onError","message","Error","String","key","scene","markRecovered","commit","camera","explicitCut","selected","select","cut","pendingCut","sceneChanged","hardCut","present","alpha","dispose"],"sourceRoot":"../../../../src","sources":["react/camera2d/usePresentedCameraBinding.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Ordered, transactional release list for multi-stage setup (GS-REACT-02).
5
+ *
6
+ * Platform-neutral: no React import, so the headless binders and the React
7
+ * adapter share it. Stages register their release as they complete; a setup
8
+ * failure releases everything acquired so far, and the final cleanup runs
9
+ * every release in reverse registration order, composing failures
10
+ * losslessly instead of stopping at the first one.
11
+ */
12
+
13
+ export function createCleanupList() {
14
+ const releases = [];
15
+ return {
16
+ add(release) {
17
+ releases.push(release);
18
+ },
19
+ releaseAll() {
20
+ const failures = [];
21
+ for (let index = releases.length - 1; index >= 0; index -= 1) {
22
+ try {
23
+ releases[index]?.();
24
+ } catch (error) {
25
+ failures.push(error);
26
+ }
27
+ }
28
+ releases.length = 0;
29
+ if (failures.length === 1) {
30
+ throw failures[0];
31
+ }
32
+ if (failures.length > 1) {
33
+ throw new AggregateError(failures, 'Cleanup failed with multiple errors');
34
+ }
35
+ }
36
+ };
37
+ }
38
+ //# sourceMappingURL=cleanupList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createCleanupList","releases","add","release","push","releaseAll","failures","index","length","error","AggregateError"],"sourceRoot":"../../../src","sources":["react/cleanupList.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,OAAO,SAASA,iBAAiBA,CAAA,EAAgB;EAC/C,MAAMC,QAA2B,GAAG,EAAE;EACtC,OAAO;IACLC,GAAGA,CAACC,OAAmB,EAAQ;MAC7BF,QAAQ,CAACG,IAAI,CAACD,OAAO,CAAC;IACxB,CAAC;IACDE,UAAUA,CAAA,EAAS;MACjB,MAAMC,QAAmB,GAAG,EAAE;MAC9B,KAAK,IAAIC,KAAK,GAAGN,QAAQ,CAACO,MAAM,GAAG,CAAC,EAAED,KAAK,IAAI,CAAC,EAAEA,KAAK,IAAI,CAAC,EAAE;QAC5D,IAAI;UACFN,QAAQ,CAACM,KAAK,CAAC,GAAG,CAAC;QACrB,CAAC,CAAC,OAAOE,KAAK,EAAE;UACdH,QAAQ,CAACF,IAAI,CAACK,KAAK,CAAC;QACtB;MACF;MACAR,QAAQ,CAACO,MAAM,GAAG,CAAC;MACnB,IAAIF,QAAQ,CAACE,MAAM,KAAK,CAAC,EAAE;QACzB,MAAMF,QAAQ,CAAC,CAAC,CAAC;MACnB;MACA,IAAIA,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;QACvB,MAAM,IAAIE,cAAc,CACtBJ,QAAQ,EACR,qCACF,CAAC;MACH;IACF;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * T20.3: GameView owns one lifecycle source per session and supplies it to
5
+ * its renderer subtree through context. Presentation consumers (particle
6
+ * presentation, haptics binders) read the source instead of casting to
7
+ * private session methods or reaching for module-global coordinators.
8
+ *
9
+ * The source itself is a frozen plain value created by
10
+ * `createGameLifecycleSource`; replacing the session replaces the source, so
11
+ * a consumer bound to the old generation can never observe the new one.
12
+ */
13
+ import { createContext, useContext } from 'react';
14
+ const NOOP_DETACH = () => {};
15
+
16
+ /**
17
+ * Create the read-only lifecycle source for one session. The returned value
18
+ * is a frozen plain value with exactly `getStatus` and `subscribe`.
19
+ */
20
+ export function createGameLifecycleSource(session) {
21
+ return Object.freeze({
22
+ getStatus: () => session.status,
23
+ subscribe(listener) {
24
+ // Disposed-error policy (mirrors useGameSessionStatus): the terminal
25
+ // notification was already delivered; never throw from a subscription.
26
+ if (session.status === 'disposed') return NOOP_DETACH;
27
+ const subscription = session.addStatusListener(listener);
28
+ return () => subscription.remove();
29
+ }
30
+ });
31
+ }
32
+ const GameLifecycleContext = /*#__PURE__*/createContext(undefined);
33
+
34
+ /** Supply the owning session's lifecycle source to a renderer subtree. */
35
+ export const GameLifecycleProvider = GameLifecycleContext.Provider;
36
+
37
+ /**
38
+ * Read the lifecycle source provided by the surrounding `GameView`.
39
+ *
40
+ * `undefined` means the consumer is mounted outside a `GameView` — a
41
+ * legitimate state for screens that drive presentation without a session
42
+ * (they pass no lifecycle to `useParticlePresentation` and keep manual pause
43
+ * independent). Inside a `GameView` the value is always present and is
44
+ * replaced together with the session.
45
+ */
46
+ export function useGameLifecycleSource() {
47
+ return useContext(GameLifecycleContext);
48
+ }
49
+ //# sourceMappingURL=lifecycleSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useContext","NOOP_DETACH","createGameLifecycleSource","session","Object","freeze","getStatus","status","subscribe","listener","subscription","addStatusListener","remove","GameLifecycleContext","undefined","GameLifecycleProvider","Provider","useGameLifecycleSource"],"sourceRoot":"../../../src","sources":["react/lifecycleSource.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAUjD,MAAMC,WAAW,GAAGA,CAAA,KAAY,CAAC,CAAC;;AAElC;AACA;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CACvCC,OAAqC,EAChB;EACrB,OAAOC,MAAM,CAACC,MAAM,CAAC;IACnBC,SAAS,EAAEA,CAAA,KAAMH,OAAO,CAACI,MAAM;IAC/BC,SAASA,CAACC,QAA6C,EAAc;MACnE;MACA;MACA,IAAIN,OAAO,CAACI,MAAM,KAAK,UAAU,EAAE,OAAON,WAAW;MACrD,MAAMS,YAAY,GAAGP,OAAO,CAACQ,iBAAiB,CAACF,QAAQ,CAAC;MACxD,OAAO,MAAMC,YAAY,CAACE,MAAM,CAAC,CAAC;IACpC;EACF,CAAC,CAAC;AACJ;AAEA,MAAMC,oBAAoB,gBAAGd,aAAa,CAAkCe,SAAS,CAAC;;AAEtF;AACA,OAAO,MAAMC,qBAAqB,GAAGF,oBAAoB,CAACG,QAAQ;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAA,EAAoC;EACxE,OAAOjB,UAAU,CAACa,oBAAoB,CAAC;AACzC","ignoreList":[]}