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,103 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Shared sprite frame selection (GS-ANIMATION-01).
5
+ *
6
+ * The single headless selection contract behind `Sprite`'s rect modifier
7
+ * and `GameSprite`'s frame-name derivation: an explicit frame wins,
8
+ * otherwise clip + elapsed time resolve through the pure sampler. Absent
9
+ * selection (nothing chosen yet) presents nothing without throwing;
10
+ * invalid clips and frames fail clearly instead of masking bad data.
11
+ *
12
+ * Headless-safe: only type imports plus the pure sampler, so the same
13
+ * functions execute identically in tests and on the UI runtime. Every
14
+ * function carries the worklet directive for UI execution; the reachable
15
+ * call graph is plain arithmetic plus plain `Error` construction
16
+ * (GS-ANIMATION-02).
17
+ */
18
+
19
+ import { spriteFrameNameForClip } from "../../sprites/sampleSpriteClip.js";
20
+
21
+ /** A static value or a UI-runtime shared value carrying it. Shared-value
22
+ * payloads list both the exact and the undefined-extended shapes because
23
+ * shared values are invariant in their payload. */
24
+
25
+ /** Selection props as the Sprite/GameSprite call sites declare them. */
26
+
27
+ /** The discrete selection inputs for one sprite (all optional). */
28
+
29
+ /**
30
+ * Resolve the source rectangle for a selection.
31
+ *
32
+ * Returns `undefined` for absent selection (present nothing); throws for
33
+ * unknown clips and frames.
34
+ */
35
+ export function selectSpriteFrameRect(source, selection) {
36
+ 'worklet';
37
+
38
+ if (source.descriptor.kind === 'image') {
39
+ const image = source;
40
+ return {
41
+ x: 0,
42
+ y: 0,
43
+ width: image.width,
44
+ height: image.height
45
+ };
46
+ }
47
+ const sheet = source;
48
+ let name = selection.frame;
49
+ if (name === undefined) {
50
+ if (selection.clip === undefined) {
51
+ return undefined;
52
+ }
53
+ name = spriteFrameNameForClip(sheet.descriptor.animations, selection.clip, selection.elapsedMs ?? 0);
54
+ }
55
+ const rect = sheet.frames[name];
56
+ if (rect === undefined) {
57
+ throw new Error(`frame ${JSON.stringify(name)} does not belong to this sprite sheet (loaded frames: ${Object.keys(sheet.frames).join(', ')})`);
58
+ }
59
+ return rect;
60
+ }
61
+
62
+ /**
63
+ * Materialize mixed static/shared selection props into one plain selection
64
+ * (GS-SPRITE-03): every worklet that resolves frames — rect, transform, and
65
+ * Group correction — starts from this single helper, so clip-driven frame
66
+ * changes reach every consumer coherently.
67
+ */
68
+ export function materializeSpriteSelection(frame, clip, elapsedMs) {
69
+ 'worklet';
70
+
71
+ const selection = {};
72
+ const frameValue = typeof frame === 'string' ? frame : frame?.value;
73
+ if (frameValue !== undefined) {
74
+ selection.frame = frameValue;
75
+ }
76
+ const clipValue = typeof clip === 'string' ? clip : clip?.value;
77
+ if (clipValue !== undefined) {
78
+ selection.clip = clipValue;
79
+ }
80
+ const elapsedValue = typeof elapsedMs === 'number' ? elapsedMs : elapsedMs?.value;
81
+ if (elapsedValue !== undefined) {
82
+ selection.elapsedMs = elapsedValue;
83
+ }
84
+ return selection;
85
+ }
86
+
87
+ /** A Skia rect-buffer entry (structural: only `setXYWH` is used). */
88
+
89
+ /**
90
+ * Apply a selection to a rect-buffer entry: the component callback logic
91
+ * behind `Sprite`'s modifier, executed here so tests observe it directly.
92
+ */
93
+ export function applySpriteFrameSelection(rect, source, selection) {
94
+ 'worklet';
95
+
96
+ const resolved = selectSpriteFrameRect(source, selection);
97
+ if (resolved === undefined) {
98
+ rect.setXYWH(0, 0, 0, 0);
99
+ return;
100
+ }
101
+ rect.setXYWH(resolved.x, resolved.y, resolved.width, resolved.height);
102
+ }
103
+ //# sourceMappingURL=spriteSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["spriteFrameNameForClip","selectSpriteFrameRect","source","selection","descriptor","kind","image","x","y","width","height","sheet","name","frame","undefined","clip","animations","elapsedMs","rect","frames","Error","JSON","stringify","Object","keys","join","materializeSpriteSelection","frameValue","value","clipValue","elapsedValue","applySpriteFrameSelection","resolved","setXYWH"],"sourceRoot":"../../../../src","sources":["react/sprites/spriteSelection.ts"],"mappings":"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","ignoreList":[]}
@@ -47,19 +47,26 @@ export function resolveSpriteFrameRect(source, frame) {
47
47
  * `[0, 0, frameWidth, frameHeight]` in local space and the documented pivot
48
48
  * order is:
49
49
  *
50
- * M = T(x, y) · R(rotation) · T(anchor) · S(scaleX, scaleY) · T(-anchor)
50
+ * M = T(x, y) · R(rotation) · S(scaleX, scaleY) · T(-anchor)
51
51
  *
52
- * i.e. scale and explicit flips happen around the anchor, then the frame
53
- * rotates around the anchor at the world position. The RSXform carries the
54
- * rotation + position (its 2x2 cannot express flips or non-uniform scale);
55
- * the wrapping Group applies the scale/flip part around the anchor.
52
+ * i.e. uniform scale and explicit flips happen around the anchor in the
53
+ * local frame, then the frame rotates around the anchor at the world
54
+ * position. The invariant: the anchor maps to `(x, y)` under every scale,
55
+ * rotation, and flip (GS-SPRITE-01).
56
+ *
57
+ * Split across Skia's retained primitives (the Atlas RSXform is innermost,
58
+ * the wrapping Group is outermost): the RSXform carries `T·R·S` with the
59
+ * pivot pre-compensated, so no-flip sprites need no Group transform at
60
+ * all; reflection — which an RSXform cannot express — is isolated in the
61
+ * Group as a mirror that fixes the world anchor
62
+ * (`T(x,y)·R·F·R⁻¹·T(−x,−y)`).
56
63
  */
57
64
 
58
65
  /** A sprite's presentation input; numbers or UI-runtime animated values. */
59
66
 
60
67
  /** The computed RSXform (rotation + position, pivot-compensated). */
61
68
 
62
- /** A Skia-compatible 3x3 transform element list. */
69
+ /** A Skia-compatible 3x3 transform element list (rotation in radians). */
63
70
 
64
71
  function readNumber(value) {
65
72
  'worklet';
@@ -73,9 +80,10 @@ function readBoolean(value) {
73
80
  }
74
81
 
75
82
  /**
76
- * The RSXform for the atlas path: rotation + position with the pivot
77
- * compensated (`tx = x - pivotX·cos + pivotY·sin`). Scale and flips are
78
- * applied by the wrapping Group (`spriteGroupCorrection`).
83
+ * The RSXform for the atlas path: `T(x,y)·R·S` with the pivot
84
+ * pre-compensated (`t = p − s·R·pivot`), so the anchor lands exactly on
85
+ * `(x, y)` (GS-SPRITE-01/02). Uniform scale is encoded in the
86
+ * coefficients; the batch path shares this helper and needs no Group.
79
87
  */
80
88
  export function computeSpriteRsxform(input) {
81
89
  'worklet';
@@ -83,43 +91,56 @@ export function computeSpriteRsxform(input) {
83
91
  const x = readNumber(input.x);
84
92
  const y = readNumber(input.y);
85
93
  const rotation = readNumber(input.rotation);
94
+ const scale = readNumber(input.scale);
86
95
  const pivotX = input.anchorX * input.frameWidth;
87
96
  const pivotY = input.anchorY * input.frameHeight;
88
97
  const cos = Math.cos(rotation);
89
98
  const sin = Math.sin(rotation);
90
99
  return {
91
- scos: cos,
92
- ssin: sin,
93
- tx: x - pivotX * cos + pivotY * sin,
94
- ty: y - pivotX * sin - pivotY * cos
100
+ scos: scale * cos,
101
+ ssin: scale * sin,
102
+ tx: x - scale * (pivotX * cos - pivotY * sin),
103
+ ty: y - scale * (pivotX * sin + pivotY * cos)
95
104
  };
96
105
  }
97
106
 
98
107
  /**
99
- * The scale/flip part around the anchor as a Skia transform element list:
100
- * `T(anchor) · S(scaleX, scaleY) · T(-anchor)` (the first element is the
101
- * outermost).
108
+ * The reflection part as a Skia transform element list, outermost first.
109
+ *
110
+ * Without flips the RSXform alone carries the transform, so the correction
111
+ * is empty (identity). With flips it is the anchor-fixing mirror
112
+ * `T(x,y)·R·F·R⁻¹·T(−x,−y)`: mirroring about the rotated anchor axes while
113
+ * the world anchor stays fixed. Depends on position and rotation (not just
114
+ * the pivot), so callers must derive it on the UI runtime from live values
115
+ * — never memoize it from stale React-render reads (GS-SPRITE-01).
102
116
  */
103
117
  export function spriteGroupCorrection(input) {
104
118
  'worklet';
105
119
 
106
- const scale = readNumber(input.scale);
107
120
  const flipX = readBoolean(input.flipX);
108
121
  const flipY = readBoolean(input.flipY);
109
- const pivotX = input.anchorX * input.frameWidth;
110
- const pivotY = input.anchorY * input.frameHeight;
122
+ if (!flipX && !flipY) {
123
+ return [];
124
+ }
125
+ const x = readNumber(input.x);
126
+ const y = readNumber(input.y);
127
+ const rotation = readNumber(input.rotation);
111
128
  return [{
112
- translateX: pivotX
129
+ translateX: x
130
+ }, {
131
+ translateY: y
132
+ }, {
133
+ rotate: rotation
113
134
  }, {
114
- translateY: pivotY
135
+ scaleX: flipX ? -1 : 1
115
136
  }, {
116
- scaleX: flipX ? -scale : scale
137
+ scaleY: flipY ? -1 : 1
117
138
  }, {
118
- scaleY: flipY ? -scale : scale
139
+ rotate: -rotation
119
140
  }, {
120
- translateX: -pivotX
141
+ translateX: -x
121
142
  }, {
122
- translateY: -pivotY
143
+ translateY: -y
123
144
  }];
124
145
  }
125
146
 
@@ -1 +1 @@
1
- {"version":3,"names":["resolveSpriteFrameRect","source","frame","descriptor","kind","image","x","y","width","height","sheet","undefined","firstAnimationName","Object","keys","animations","firstAnimation","firstFrameName","frames","baseline","rect","Error","JSON","stringify","join","readNumber","value","readBoolean","computeSpriteRsxform","input","rotation","pivotX","anchorX","frameWidth","pivotY","anchorY","frameHeight","cos","Math","sin","scos","ssin","tx","ty","spriteGroupCorrection","scale","flipX","flipY","translateX","translateY","scaleX","scaleY","spriteAnchorWorld"],"sourceRoot":"../../../../src","sources":["react/sprites/spriteTransform.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["resolveSpriteFrameRect","source","frame","descriptor","kind","image","x","y","width","height","sheet","undefined","firstAnimationName","Object","keys","animations","firstAnimation","firstFrameName","frames","baseline","rect","Error","JSON","stringify","join","readNumber","value","readBoolean","computeSpriteRsxform","input","rotation","scale","pivotX","anchorX","frameWidth","pivotY","anchorY","frameHeight","cos","Math","sin","scos","ssin","tx","ty","spriteGroupCorrection","flipX","flipY","translateX","translateY","rotate","scaleX","scaleY","spriteAnchorWorld"],"sourceRoot":"../../../../src","sources":["react/sprites/spriteTransform.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+
3
+ import { useContext, useMemo, useCallback } from 'react';
4
+ import { Atlas, Group, useRectBuffer, useRSXformBuffer } from '@shopify/react-native-skia';
5
+ import { useDerivedValue, useSharedValue } from 'react-native-reanimated';
6
+ import { scheduleOnRN } from 'react-native-worklets';
7
+ import { GameWorldContext, layerParallaxTransform2D } from "../sprites/GameWorld2D.js";
8
+ import { buildFrameTable, buildTileWindowSnapshot, bindingGeneration, updateTileLayerUI, EMPTY_TILE_WINDOW } from "./tilePresentation.js";
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ /**
11
+ * Stable-topology Atlas tile layer (T16.4, reworked per T16-F3/F4/RF1/RF2).
12
+ *
13
+ * One React node per layer. The slot buffer is sized from the passed
14
+ * surface bounds + minZoom + overscan + cell size — NOT from map
15
+ * dimensions. The worklet never touches the map value, `layer.data`, or a
16
+ * JS `Map`:
17
+ *
18
+ * - Frame rectangles are pre-resolved into a flat numeric table at bind
19
+ * time (validated: missing frames and cell/frame size mismatches throw
20
+ * structured bind errors).
21
+ * - A bounded window snapshot (ids sized by slot capacity) is built on JS
22
+ * and transferred via a shared value ONLY when the visible cell span
23
+ * outgrows the current window; requests cross to React through
24
+ * `scheduleOnRN` (Reanimated 4 / react-native-worklets), and camera
25
+ * interpolation inside the window is allocation-free scalar math.
26
+ * - Culling bounds derive from the presented camera (center/zoom/rotation)
27
+ * with the SAME parallax factor applied to the visual transform and the
28
+ * bounds; without a presented camera the viewport-only world path applies.
29
+ * - Culling here can never affect simulation: collision queries read full
30
+ * layer data through the private chunk index regardless of visibility.
31
+ */
32
+ export function TileMapLayer2D({
33
+ map,
34
+ layer,
35
+ source,
36
+ width,
37
+ height,
38
+ overscan = 1,
39
+ parallax,
40
+ minZoom = 1
41
+ }) {
42
+ const world = useContext(GameWorldContext);
43
+ const camera = world?.camera ?? null;
44
+ const viewportSV = world?.viewport ?? null;
45
+ const layerData = map.layerById[layer];
46
+ if (layerData === undefined) {
47
+ throw new Error(`[rn-gamekit/tilemap] layer "${layer}" does not exist on this map`);
48
+ }
49
+ if (!(minZoom > 0) || !Number.isFinite(minZoom)) {
50
+ throw new Error(`[rn-gamekit/tilemap] minZoom must be a finite number > 0; got ${String(minZoom)}`);
51
+ }
52
+ if (!Number.isFinite(width) || width <= 0) {
53
+ throw new Error(`[rn-gamekit/tilemap] width must be a finite number > 0; got ${String(width)}`);
54
+ }
55
+ if (!Number.isFinite(height) || height <= 0) {
56
+ throw new Error(`[rn-gamekit/tilemap] height must be a finite number > 0; got ${String(height)}`);
57
+ }
58
+ if (!Number.isFinite(overscan) || overscan < 0 || !Number.isInteger(overscan)) {
59
+ throw new Error(`[rn-gamekit/tilemap] overscan must be a finite integer >= 0; got ${String(overscan)}`);
60
+ }
61
+ const px = parallax?.x ?? 1;
62
+ const py = parallax?.y ?? 1;
63
+ if (!Number.isFinite(px)) {
64
+ throw new Error(`[rn-gamekit/tilemap] parallax.x must be a finite number; got ${String(px)}`);
65
+ }
66
+ if (!Number.isFinite(py)) {
67
+ throw new Error(`[rn-gamekit/tilemap] parallax.y must be a finite number; got ${String(py)}`);
68
+ }
69
+ const cw = map.cellSize.width;
70
+ const ch = map.cellSize.height;
71
+ const originX = map.origin.x;
72
+ const originY = map.origin.y;
73
+ // Pad world is scalar based on the larger cell dimension (T16-SF2
74
+ // overscan contract). Capacity and bounds must share this exact scalar
75
+ // so they cannot drift for non-square cells.
76
+ const padWorld = overscan * Math.max(cw, ch);
77
+ // px/py already validated above
78
+
79
+ // Resolve frames ONCE at bind time (structured errors for missing
80
+ // frames and frame/cell size mismatches — T16-F3).
81
+ const frameTable = useMemo(() => buildFrameTable(map.tileset, source.frames, cw, ch), [map, source, cw, ch]);
82
+
83
+ // Slot capacity covers the worst rotated AABB at minZoom (T16-SF2):
84
+ // conservative extents approach the viewport diagonal at 45 degrees.
85
+ // Must use the same padWorld as writeLayerVisibleBounds so non-square
86
+ // cells (e.g. 8x64) do not under-size one axis.
87
+ const diagonal = Math.hypot(width, height);
88
+ const slotsX = Math.ceil((diagonal / minZoom + 2 * padWorld) / cw) + 1;
89
+ const slotsY = Math.ceil((diagonal / minZoom + 2 * padWorld) / ch) + 1;
90
+ const capacity = slotsX * slotsY;
91
+ const rects = useRectBuffer(capacity, rect => {
92
+ 'worklet';
93
+
94
+ rect.setXYWH(0, 0, 0, 0);
95
+ });
96
+ const xforms = useRSXformBuffer(capacity, xform => {
97
+ 'worklet';
98
+
99
+ xform.set(1, 0, 0, 0);
100
+ });
101
+
102
+ // Bounded transferred window + guards (T16-F4, T16-SF1). The scratch
103
+ // bounds object is written by the worklet every frame — one stable
104
+ // allocation, never per-frame objects (T16-RF2).
105
+ const windowSV = useSharedValue(EMPTY_TILE_WINDOW);
106
+ // GS-TILE-01: one pending request per BINDING (not per component): the
107
+ // stored generation lets a new binding request even when an old binding
108
+ // left its mark behind.
109
+ const pendingGenSV = useSharedValue(-1);
110
+ const warnedCapacitySV = useSharedValue(false);
111
+ const capacityWarnPendingSV = useSharedValue(false);
112
+
113
+ // GS-TILE-01: binding identity from everything that defines what a
114
+ // window shows — map, layer, frame source, cell size, and
115
+ // capacity-affecting configuration. A fresh identity mints a fresh
116
+ // generation; windows and requests stamped with older generations are
117
+ // ignored, never displayed.
118
+ // Binding-affecting inputs enumerated deliberately: equivalent values
119
+ // must not remint the identity (no reload churn), and any omitted input
120
+ // would reuse a stale window.
121
+ const bindingKey = useMemo(() => ({}), [map, layer, source.frames, cw, ch, overscan, capacity, px, py]);
122
+ const generation = bindingGeneration(bindingKey);
123
+
124
+ // JS handler (React-owned): builds the next bounded snapshot for the
125
+ // requested range. Delivered via scheduleOnRN from the worklet (RF1).
126
+ // GS-TILE-01: the scheduled generation is checked before publishing, and
127
+ // the published window is stamped — the update refuses windows whose
128
+ // stamp differs from the live binding, so late deliveries converge by
129
+ // re-requesting instead of displaying stale tiles.
130
+ const requestWindow = useCallback((gen, x0, y0, x1, y1) => {
131
+ if (gen !== generation) {
132
+ return;
133
+ }
134
+ // Pad by the overscan so small camera motions don't re-request.
135
+ const snapshot = buildTileWindowSnapshot(map, layerData.id, x0 - overscan, y0 - overscan, x1 + overscan, y1 + overscan, frameTable);
136
+ windowSV.value = Object.freeze({
137
+ ...snapshot,
138
+ gen
139
+ });
140
+ if (pendingGenSV.value === gen) {
141
+ pendingGenSV.value = -1;
142
+ }
143
+ }, [map, layerData.id, overscan, frameTable, generation, windowSV, pendingGenSV]);
144
+
145
+ // One-shot RN-side diagnostic when a presented camera zooms beyond the
146
+ // declared capacity (T16-RF2): the layer hides instead of under-filling.
147
+ // Uses its own pending guard so the warning never blocks window requests
148
+ // (T16-SF1).
149
+ const onBeyondCapacity = useCallback(() => {
150
+ capacityWarnPendingSV.value = false;
151
+ if (!warnedCapacitySV.value) {
152
+ warnedCapacitySV.value = true;
153
+ console.warn('[rn-gamekit/tilemap] presented camera zoom is below minZoom; tile layer hides until the camera returns inside the declared capacity');
154
+ }
155
+ }, [warnedCapacitySV, capacityWarnPendingSV]);
156
+
157
+ // originX/Y and padWorld already defined above for capacity sizing
158
+
159
+ // GS-TILE-01: the update body lives in `updateTileLayerUI` with an
160
+ // explicit scalar-only parameter list — the worklet closure provably
161
+ // carries no map, layer, or frame-table objects (only layer dims and the
162
+ // binding generation). requestWindow's closure stays on the JS side.
163
+ useDerivedValue(() => {
164
+ 'worklet';
165
+
166
+ return updateTileLayerUI({
167
+ camera: camera,
168
+ viewport: viewportSV,
169
+ window: windowSV,
170
+ pendingGen: pendingGenSV,
171
+ warnedCapacity: warnedCapacitySV,
172
+ capacityWarnPending: capacityWarnPendingSV,
173
+ rects,
174
+ xforms,
175
+ requestWindow,
176
+ scheduleOnRN: fn => scheduleOnRN(fn),
177
+ onBeyondCapacity,
178
+ generation,
179
+ capacity,
180
+ originX,
181
+ originY,
182
+ cw,
183
+ ch,
184
+ layerWidth: layerData.width,
185
+ layerHeight: layerData.height,
186
+ padWorld,
187
+ px,
188
+ py,
189
+ minZoom
190
+ });
191
+ });
192
+
193
+ // Coherent parallax: the visual correction uses the SAME factor as the
194
+ // culling bounds above, so callers never wrap this component in an outer
195
+ // GameLayer2D (T16-RF2). At factor 1 no transform applies.
196
+ const visualTransform = useDerivedValue(() => {
197
+ 'worklet';
198
+
199
+ if (px === 1 && py === 1) {
200
+ return [];
201
+ }
202
+ return layerParallaxTransform2D(camera?.value, viewportSV?.value, px, py);
203
+ });
204
+ const atlas = /*#__PURE__*/_jsx(Atlas, {
205
+ image: source.image,
206
+ sprites: rects,
207
+ transforms: xforms
208
+ });
209
+ if (px === 1 && py === 1) {
210
+ return atlas;
211
+ }
212
+ return /*#__PURE__*/_jsx(Group, {
213
+ transform: visualTransform,
214
+ children: atlas
215
+ });
216
+ }
217
+ //# sourceMappingURL=TileMapLayer2D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","useMemo","useCallback","Atlas","Group","useRectBuffer","useRSXformBuffer","useDerivedValue","useSharedValue","scheduleOnRN","GameWorldContext","layerParallaxTransform2D","buildFrameTable","buildTileWindowSnapshot","bindingGeneration","updateTileLayerUI","EMPTY_TILE_WINDOW","jsx","_jsx","TileMapLayer2D","map","layer","source","width","height","overscan","parallax","minZoom","world","camera","viewportSV","viewport","layerData","layerById","undefined","Error","Number","isFinite","String","isInteger","px","x","py","y","cw","cellSize","ch","originX","origin","originY","padWorld","Math","max","frameTable","tileset","frames","diagonal","hypot","slotsX","ceil","slotsY","capacity","rects","rect","setXYWH","xforms","xform","set","windowSV","pendingGenSV","warnedCapacitySV","capacityWarnPendingSV","bindingKey","generation","requestWindow","gen","x0","y0","x1","y1","snapshot","id","value","Object","freeze","onBeyondCapacity","console","warn","window","pendingGen","warnedCapacity","capacityWarnPending","fn","layerWidth","layerHeight","visualTransform","atlas","image","sprites","transforms","transform","children"],"sourceRoot":"../../../../src","sources":["react/tilemap/TileMapLayer2D.tsx"],"mappings":"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","ignoreList":[]}