rn-gamekit 0.1.0 → 0.2.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 (601) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +97 -16
  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 +100 -10
  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
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Swept collision queries (T11.3, repaired in T11-F2, allocation-disciplined
5
+ * in T11-FF7).
6
+ *
7
+ * `time` is normalized to `[0, 1]` along the displacement. A starting
8
+ * overlap returns `time: 0` with the static manifold normal; zero
9
+ * displacement returns `undefined` (never NaN). At equal times the
10
+ * candidate evaluated FIRST wins — the X face before the Y face, faces
11
+ * before corners, corners in index order (T11-TF1). Circle-sweep misses
12
+ * allocate nothing; AABB-AABB sweep misses still allocate the expanded
13
+ * box, segment endpoints, and axis array (GS-COLLISION-03: the old blanket
14
+ * claim overstated this path, which stays scalar-simple by design).
15
+ *
16
+ * Circle-AABB sweeps raycast against the exact Minkowski geometry: the
17
+ * target expanded by the radius with ROUNDED corners. Face candidates come
18
+ * from the four expanded faces (valid only within the face's extent), and
19
+ * corner candidates come from radius circles around each target corner
20
+ * (valid only in the corner's exterior quadrant). AABB-AABB sweeps use the
21
+ * asymmetric expansion for the moving AABB's top-left reference point —
22
+ * the Minkowski sum of two AABBs is an AABB, so the slab method is exact.
23
+ *
24
+ * T11-FF7 allocation discipline: the four corner descriptors are derived
25
+ * arithmetically from the corner index (no per-call arrays or predicate
26
+ * closures), the two quadratic roots are evaluated as scalars, and the best
27
+ * candidate is tracked in scalars; only the final public `SweepHit2D` is
28
+ * allocated.
29
+ */
30
+
31
+ import { assertValidAabb2D, assertValidCircle2D, assertValidVector2D } from "../geometry/validation.js";
32
+ import { collideAabbAabb2D, collideCircleAabb2D } from "./manifolds.js";
33
+ import { intersectsCircleAabb2D } from "./intersections.js";
34
+ import { intersectSegmentAabb2D } from "./segments.js";
35
+
36
+ /** Earliest impact of a swept circle against an AABB. */
37
+
38
+ /** Earliest impact of a swept AABB against an AABB. */
39
+
40
+ /** Earliest impact of a swept shape against a target. */
41
+
42
+ /**
43
+ * Corner descriptors for index 0..3, derived arithmetically: bit 0 selects
44
+ * the max-x face (else min-x) and bit 1 selects the max-y face (else
45
+ * min-y). The quadrant validity of a hit point is the same bit test.
46
+ */
47
+ function cornerFaceX(index, minX, maxX) {
48
+ return index & 1 ? maxX : minX;
49
+ }
50
+ function cornerFaceY(index, minY, maxY) {
51
+ return index & 2 ? maxY : minY;
52
+ }
53
+ function beyondFaceX(index, pointX, minX, maxX) {
54
+ return index & 1 ? pointX >= maxX : pointX <= minX;
55
+ }
56
+ function beyondFaceY(index, pointY, minY, maxY) {
57
+ return index & 2 ? pointY >= maxY : pointY <= minY;
58
+ }
59
+
60
+ /** Swept circle-AABB against the exact rounded-rectangle Minkowski shape. */
61
+ export function sweepCircleAabb2D(options) {
62
+ const {
63
+ circle,
64
+ displacement,
65
+ target
66
+ } = options;
67
+ assertValidCircle2D(circle);
68
+ assertValidVector2D(displacement, 'displacement');
69
+ assertValidAabb2D(target, 'target');
70
+
71
+ // The starting-overlap check uses the allocation-free predicate; the
72
+ // manifold (and its contact object) runs only after contact is confirmed
73
+ // (T11-SF3).
74
+ if (intersectsCircleAabb2D(circle, target)) {
75
+ const overlap = collideCircleAabb2D(circle, target);
76
+ if (overlap !== undefined) {
77
+ return hitFromManifold(0, overlap);
78
+ }
79
+ }
80
+ if (displacement.x === 0 && displacement.y === 0) {
81
+ return undefined;
82
+ }
83
+ const radius = circle.radius;
84
+ const minX = target.x;
85
+ const maxX = target.x + target.width;
86
+ const minY = target.y;
87
+ const maxY = target.y + target.height;
88
+ const x0 = circle.x;
89
+ const y0 = circle.y;
90
+ const dx = displacement.x;
91
+ const dy = displacement.y;
92
+
93
+ // Scalar best-candidate tracking: nothing is allocated until a hit.
94
+ let hasBest = false;
95
+ let bestTime = 0;
96
+ let bestNX = 0;
97
+ let bestNY = 0;
98
+ let bestPX = 0;
99
+ let bestPY = 0;
100
+
101
+ // Face candidates: the four expanded faces, valid within the face extent.
102
+ // The accept logic is inlined as scalar updates (no local closure). A
103
+ // candidate REPLACES only when strictly earlier; at equal times the
104
+ // candidate evaluated first retains the result (T11-TF1).
105
+ if (dx !== 0) {
106
+ const faceX = dx > 0 ? minX - radius : maxX + radius;
107
+ const time = (faceX - x0) / dx;
108
+ const yAt = y0 + dy * time;
109
+ if (yAt >= minY && yAt <= maxY && time >= 0 && time <= 1 && (!hasBest || bestTime > time)) {
110
+ // The contact point is the closest point on the ORIGINAL target to
111
+ // the impact position (both coordinates clamped).
112
+ hasBest = true;
113
+ bestTime = time;
114
+ bestNX = dx > 0 ? -1 : 1;
115
+ bestNY = 0;
116
+ bestPX = clamp(faceX, minX, maxX);
117
+ bestPY = clamp(yAt, minY, maxY);
118
+ }
119
+ }
120
+ if (dy !== 0) {
121
+ const faceY = dy > 0 ? minY - radius : maxY + radius;
122
+ const time = (faceY - y0) / dy;
123
+ const xAt = x0 + dx * time;
124
+ if (xAt >= minX && xAt <= maxX && time >= 0 && time <= 1 && (!hasBest || bestTime > time)) {
125
+ hasBest = true;
126
+ bestTime = time;
127
+ bestNX = 0;
128
+ bestNY = dy > 0 ? -1 : 1;
129
+ bestPX = clamp(xAt, minX, maxX);
130
+ bestPY = clamp(faceY, minY, maxY);
131
+ }
132
+ }
133
+
134
+ // Corner candidates: radius circles around each corner, valid in the
135
+ // corner's exterior quadrant. The four descriptors are derived from the
136
+ // corner index arithmetically; both quadratic roots are scalars.
137
+ const a = dx * dx + dy * dy;
138
+ for (let corner = 0; corner < 4; corner += 1) {
139
+ const cornerX = cornerFaceX(corner, minX, maxX);
140
+ const cornerY = cornerFaceY(corner, minY, maxY);
141
+ const fx = x0 - cornerX;
142
+ const fy = y0 - cornerY;
143
+ const b = 2 * (fx * dx + fy * dy);
144
+ const c = fx * fx + fy * fy - radius * radius;
145
+ const discriminant = b * b - 4 * a * c;
146
+ if (discriminant < 0) {
147
+ continue;
148
+ }
149
+ const root = Math.sqrt(discriminant);
150
+ const firstRoot = (-b - root) / (2 * a);
151
+ const secondRoot = (-b + root) / (2 * a);
152
+ for (let pass = 0; pass < 2; pass += 1) {
153
+ const time = pass === 0 ? firstRoot : secondRoot;
154
+ if (time < 0 || time > 1 || hasBest && bestTime < time) {
155
+ continue;
156
+ }
157
+ const hitX = x0 + dx * time;
158
+ const hitY = y0 + dy * time;
159
+ if (!beyondFaceX(corner, hitX, minX, maxX) || !beyondFaceY(corner, hitY, minY, maxY)) {
160
+ continue;
161
+ }
162
+ const outX = hitX - cornerX;
163
+ const outY = hitY - cornerY;
164
+ const outDistance = Math.hypot(outX, outY);
165
+ const nx = outDistance === 0 ? 0 : outX / outDistance;
166
+ const ny = outDistance === 0 ? 1 : outY / outDistance;
167
+ if (!hasBest || time < bestTime) {
168
+ hasBest = true;
169
+ bestTime = time;
170
+ bestNX = nx;
171
+ bestNY = ny;
172
+ bestPX = cornerX;
173
+ bestPY = cornerY;
174
+ }
175
+ }
176
+ }
177
+ if (!hasBest) {
178
+ return undefined;
179
+ }
180
+ return Object.freeze({
181
+ time: bestTime,
182
+ normal: Object.freeze({
183
+ x: bestNX,
184
+ y: bestNY
185
+ }),
186
+ point: Object.freeze({
187
+ x: bestPX,
188
+ y: bestPY
189
+ })
190
+ });
191
+ }
192
+
193
+ /** Swept AABB-AABB with the exact asymmetric reference expansion. */
194
+ export function sweepAabbAabb2D(options) {
195
+ const {
196
+ aabb,
197
+ displacement,
198
+ target
199
+ } = options;
200
+ assertValidAabb2D(aabb, 'aabb');
201
+ assertValidVector2D(displacement, 'displacement');
202
+ assertValidAabb2D(target, 'target');
203
+ const startingOverlap = collideAabbAabb2D(aabb, target);
204
+ if (startingOverlap !== undefined) {
205
+ return hitFromManifold(0, startingOverlap);
206
+ }
207
+ if (displacement.x === 0 && displacement.y === 0) {
208
+ return undefined;
209
+ }
210
+
211
+ // Top-left reference: the valid x interval is [target.min - w, target.max]
212
+ // and the valid y interval is [target.min - h, target.max] (asymmetric).
213
+ const expanded = {
214
+ x: target.x - aabb.width,
215
+ y: target.y - aabb.height,
216
+ width: target.width + aabb.width,
217
+ height: target.height + aabb.height
218
+ };
219
+ const segmentHit = intersectSegmentAabb2D({
220
+ start: {
221
+ x: aabb.x,
222
+ y: aabb.y
223
+ },
224
+ end: {
225
+ x: aabb.x + displacement.x,
226
+ y: aabb.y + displacement.y
227
+ }
228
+ }, expanded);
229
+ if (segmentHit === undefined) {
230
+ return undefined;
231
+ }
232
+ const originAtImpact = {
233
+ x: aabb.x + displacement.x * segmentHit.time,
234
+ y: aabb.y + displacement.y * segmentHit.time
235
+ };
236
+ return Object.freeze({
237
+ time: segmentHit.time,
238
+ normal: segmentHit.normal,
239
+ point: Object.freeze({
240
+ x: clamp(originAtImpact.x, target.x, target.x + target.width),
241
+ y: clamp(originAtImpact.y, target.y, target.y + target.height)
242
+ })
243
+ });
244
+ }
245
+ function hitFromManifold(time, hit) {
246
+ return Object.freeze({
247
+ time,
248
+ normal: hit.normal,
249
+ point: hit.point
250
+ });
251
+ }
252
+ function clamp(value, min, max) {
253
+ return value < min ? min : value > max ? max : value;
254
+ }
255
+ //# sourceMappingURL=sweeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["assertValidAabb2D","assertValidCircle2D","assertValidVector2D","collideAabbAabb2D","collideCircleAabb2D","intersectsCircleAabb2D","intersectSegmentAabb2D","cornerFaceX","index","minX","maxX","cornerFaceY","minY","maxY","beyondFaceX","pointX","beyondFaceY","pointY","sweepCircleAabb2D","options","circle","displacement","target","overlap","undefined","hitFromManifold","x","y","radius","width","height","x0","y0","dx","dy","hasBest","bestTime","bestNX","bestNY","bestPX","bestPY","faceX","time","yAt","clamp","faceY","xAt","a","corner","cornerX","cornerY","fx","fy","b","c","discriminant","root","Math","sqrt","firstRoot","secondRoot","pass","hitX","hitY","outX","outY","outDistance","hypot","nx","ny","Object","freeze","normal","point","sweepAabbAabb2D","aabb","startingOverlap","expanded","segmentHit","start","end","originAtImpact","hit","value","min","max"],"sourceRoot":"../../../src","sources":["collision2d/sweeps.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Subpath entry for `rn-gamekit/collision2d`.
5
+ *
6
+ * Headless collision predicates — no React, Skia, or physics backends.
7
+ */
8
+ export * from "./collision2d/index.js";
9
+ //# sourceMappingURL=collision2d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["collision2d.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA,cAAc,wBAAqB","ignoreList":[]}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Multitouch button-pad controller (headless).
5
+ *
6
+ * Maps every active pointer to the button zone it covers and turns touch
7
+ * transitions into press/release diffs for a session input buffer. Pure and
8
+ * React-free: the React surface (`GameButtonPad`) only registers zone rects,
9
+ * feeds touch lists in, and applies the returned diffs to
10
+ * `session.input`.
11
+ *
12
+ * Semantics:
13
+ * - A zone is a rectangle; an optional global hit slop expands it.
14
+ * - Each pointer maps to AT MOST one action (first registered zone wins).
15
+ * - An action is pressed while ANY pointer covers its zone (refcounted);
16
+ * it releases when the last pointer leaves or lifts. Edges fire only on
17
+ * 0-to-1 (press) and 1-to-0 (release) owner transitions — a second owner
18
+ * never re-presses and an unbalanced release never emits.
19
+ * - Sliding between zones reassigns the pointer: release + press diff.
20
+ * - Moves acquire: a pointer that begins in empty space and slides into a
21
+ * zone presses it; leaving a zone releases. Every touch in a move list
22
+ * is hit-tested, mapped or not.
23
+ * - Zone rects are cloned at registration: later caller mutation of the
24
+ * passed object cannot alter hit areas invisibly.
25
+ */
26
+
27
+ /** A rectangular hit area, in the pad's local coordinate space. */
28
+
29
+ /** One active pointer sample. */
30
+
31
+ /** Press/release transitions derived from one touch event. */
32
+
33
+ const EMPTY_DIFF = {
34
+ pressed: [],
35
+ released: []
36
+ };
37
+ function contains(rect, hitSlop, x, y) {
38
+ return x >= rect.x - hitSlop && x <= rect.x + rect.width + hitSlop && y >= rect.y - hitSlop && y <= rect.y + rect.height + hitSlop;
39
+ }
40
+
41
+ /** Create a controller bound to no particular session (diffs are applied by the caller). */
42
+ export function createButtonPadController(options) {
43
+ const hitSlop = options?.hitSlop ?? 0;
44
+ const zones = new Map();
45
+ const pointerAction = new Map();
46
+ const holdCounts = new Map();
47
+ // GS-INPUT-04: pointers that were active across an invalidation (pause,
48
+ // session replacement) must produce a fresh down before their moves can
49
+ // acquire again. A fresh down rehabilitates; lift clears the mark.
50
+ const stalePointerIds = new Set();
51
+ const apply = (action, direction) => {
52
+ // GS-INPUT-02: edges fire only on ownership transitions. A second owner
53
+ // (0 stays > 0) never re-presses; an unbalanced release from zero
54
+ // count never emits.
55
+ const previous = holdCounts.get(action) ?? 0;
56
+ const next = previous + direction;
57
+ if (next <= 0) {
58
+ holdCounts.delete(action);
59
+ return previous > 0 && direction === -1 ? 'released' : undefined;
60
+ }
61
+ holdCounts.set(action, next);
62
+ return previous === 0 && direction === 1 ? 'pressed' : undefined;
63
+ };
64
+ const hitTest = (x, y) => {
65
+ for (const [action, rect] of zones) {
66
+ if (contains(rect, hitSlop, x, y)) {
67
+ return action;
68
+ }
69
+ }
70
+ return undefined;
71
+ };
72
+ const retarget = (touchId, action) => {
73
+ const previous = pointerAction.get(touchId);
74
+ if (previous === action) {
75
+ return EMPTY_DIFF;
76
+ }
77
+ const pressed = [];
78
+ const released = [];
79
+ if (previous !== undefined) {
80
+ pointerAction.delete(touchId);
81
+ const result = apply(previous, -1);
82
+ if (result === 'released') {
83
+ released.push(previous);
84
+ }
85
+ }
86
+ if (action !== undefined) {
87
+ pointerAction.set(touchId, action);
88
+ const result = apply(action, 1);
89
+ if (result === 'pressed') {
90
+ pressed.push(action);
91
+ }
92
+ }
93
+ return {
94
+ pressed,
95
+ released
96
+ };
97
+ };
98
+ const dropPointers = changed => {
99
+ const released = [];
100
+ for (const touch of changed) {
101
+ stalePointerIds.delete(touch.id);
102
+ const previous = pointerAction.get(touch.id);
103
+ if (previous === undefined) {
104
+ continue;
105
+ }
106
+ pointerAction.delete(touch.id);
107
+ if (apply(previous, -1) === 'released') {
108
+ released.push(previous);
109
+ }
110
+ }
111
+ return {
112
+ pressed: [],
113
+ released
114
+ };
115
+ };
116
+ return {
117
+ setZone(action, rect) {
118
+ // GS-INPUT-02: clone the rect so later caller mutation of the passed
119
+ // object cannot alter hit areas invisibly.
120
+ zones.set(action, {
121
+ x: rect.x,
122
+ y: rect.y,
123
+ width: rect.width,
124
+ height: rect.height
125
+ });
126
+ },
127
+ removeZone(action) {
128
+ zones.delete(action);
129
+ // GS-INPUT-02: drop every pointer mapped to the removed zone, then
130
+ // release and delete the ENTIRE action count — a single decrement
131
+ // would strand a phantom hold. Pointers stay physically tracked only
132
+ // through future touch events, which re-acquire via hit test.
133
+ for (const [pointerId, mapped] of [...pointerAction]) {
134
+ if (mapped === action) {
135
+ pointerAction.delete(pointerId);
136
+ }
137
+ }
138
+ if ((holdCounts.get(action) ?? 0) > 0) {
139
+ holdCounts.delete(action);
140
+ return [action];
141
+ }
142
+ return [];
143
+ },
144
+ touchesDown(touches) {
145
+ const merged = {
146
+ pressed: [],
147
+ released: []
148
+ };
149
+ for (const touch of touches) {
150
+ stalePointerIds.delete(touch.id);
151
+ const diff = retarget(touch.id, hitTest(touch.x, touch.y));
152
+ merged.pressed.push(...diff.pressed);
153
+ merged.released.push(...diff.released);
154
+ }
155
+ return merged;
156
+ },
157
+ touchesMove(touches) {
158
+ // GS-INPUT-02: every touch in the move list is hit-tested, mapped or
159
+ // not — a pointer that left its zone releases, and one that entered
160
+ // a zone (including from empty space) presses it.
161
+ // GS-INPUT-04: pointers marked stale by an invalidation wait for a
162
+ // fresh down first.
163
+ const merged = {
164
+ pressed: [],
165
+ released: []
166
+ };
167
+ for (const touch of touches) {
168
+ if (stalePointerIds.has(touch.id)) {
169
+ continue;
170
+ }
171
+ const diff = retarget(touch.id, hitTest(touch.x, touch.y));
172
+ merged.pressed.push(...diff.pressed);
173
+ merged.released.push(...diff.released);
174
+ }
175
+ return merged;
176
+ },
177
+ touchesUp(changed) {
178
+ return dropPointers(changed);
179
+ },
180
+ touchesCancel(changed) {
181
+ return dropPointers(changed);
182
+ },
183
+ releaseAll() {
184
+ const released = new Set();
185
+ for (const action of pointerAction.values()) {
186
+ released.add(action);
187
+ }
188
+ pointerAction.clear();
189
+ for (const action of holdCounts.keys()) {
190
+ released.add(action);
191
+ }
192
+ holdCounts.clear();
193
+ stalePointerIds.clear();
194
+ return [...released];
195
+ },
196
+ /**
197
+ * GS-INPUT-04: invalidate ownership without touching zones — pause,
198
+ * session replacement, or layout teardown snapshot the active pointers
199
+ * as stale and drop all holds. Stale pointers must produce a fresh down
200
+ * before their moves can acquire again; a fresh down rehabilitates.
201
+ */
202
+ invalidateOwnership() {
203
+ for (const pointerId of pointerAction.keys()) {
204
+ stalePointerIds.add(pointerId);
205
+ }
206
+ pointerAction.clear();
207
+ holdCounts.clear();
208
+ },
209
+ held() {
210
+ return [...holdCounts.keys()];
211
+ }
212
+ };
213
+ }
214
+ //# sourceMappingURL=buttonPad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EMPTY_DIFF","pressed","released","contains","rect","hitSlop","x","y","width","height","createButtonPadController","options","zones","Map","pointerAction","holdCounts","stalePointerIds","Set","apply","action","direction","previous","get","next","delete","undefined","set","hitTest","retarget","touchId","result","push","dropPointers","changed","touch","id","setZone","removeZone","pointerId","mapped","touchesDown","touches","merged","diff","touchesMove","has","touchesUp","touchesCancel","releaseAll","values","add","clear","keys","invalidateOwnership","held"],"sourceRoot":"../../../../src","sources":["core/input/buttonPad.ts"],"mappings":"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","ignoreList":[]}