1681-engine 0.0.0-stage → 0.5.8

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 (1014) hide show
  1. package/CHANGELOG.md +304 -0
  2. package/LICENSE +21 -0
  3. package/README.md +164 -2
  4. package/dist/1681-engine.js +417 -0
  5. package/dist/1681-engine.js.map +1 -0
  6. package/dist/ambient/ColorGrade.js +41 -0
  7. package/dist/ambient/ColorGrade.js.map +1 -0
  8. package/dist/ambient/DayClock.js +57 -0
  9. package/dist/ambient/DayClock.js.map +1 -0
  10. package/dist/ambient/WeatherLayer.js +91 -0
  11. package/dist/ambient/WeatherLayer.js.map +1 -0
  12. package/dist/ambient/grade.js +13 -0
  13. package/dist/ambient/grade.js.map +1 -0
  14. package/dist/ambient/weather.js +52 -0
  15. package/dist/ambient/weather.js.map +1 -0
  16. package/dist/anim/AnimStateMachine.js +164 -0
  17. package/dist/anim/AnimStateMachine.js.map +1 -0
  18. package/dist/anim/Animator.js +67 -0
  19. package/dist/anim/Animator.js.map +1 -0
  20. package/dist/anim/animStateCompile.js +113 -0
  21. package/dist/anim/animStateCompile.js.map +1 -0
  22. package/dist/anim/animStateSystem.js +17 -0
  23. package/dist/anim/animStateSystem.js.map +1 -0
  24. package/dist/anim/animationSystem.js +15 -0
  25. package/dist/anim/animationSystem.js.map +1 -0
  26. package/dist/anim/asepriteSlices.js +22 -0
  27. package/dist/anim/asepriteSlices.js.map +1 -0
  28. package/dist/anim/asepriteTags.js +35 -0
  29. package/dist/anim/asepriteTags.js.map +1 -0
  30. package/dist/anim/parseAseprite.js +83 -0
  31. package/dist/anim/parseAseprite.js.map +1 -0
  32. package/dist/assets/AssetLoader.js +104 -0
  33. package/dist/assets/AssetLoader.js.map +1 -0
  34. package/dist/assets/loadAseprite.js +50 -0
  35. package/dist/assets/loadAseprite.js.map +1 -0
  36. package/dist/assets/takeCleanerWorker-DTcI_Jqr.js +31 -0
  37. package/dist/assets/takeCleanerWorker-DTcI_Jqr.js.map +1 -0
  38. package/dist/audio/Footsteps.js +26 -0
  39. package/dist/audio/Footsteps.js.map +1 -0
  40. package/dist/audio/MusicPlayer.js +78 -0
  41. package/dist/audio/MusicPlayer.js.map +1 -0
  42. package/dist/audio/SoundEngine.js +119 -0
  43. package/dist/audio/SoundEngine.js.map +1 -0
  44. package/dist/audio/cleanTake.js +30 -0
  45. package/dist/audio/cleanTake.js.map +1 -0
  46. package/dist/audio/music/ElementVoice.js +35 -0
  47. package/dist/audio/music/ElementVoice.js.map +1 -0
  48. package/dist/audio/music/GraphVoice.js +39 -0
  49. package/dist/audio/music/GraphVoice.js.map +1 -0
  50. package/dist/audio/music/MusicChannel.js +58 -0
  51. package/dist/audio/music/MusicChannel.js.map +1 -0
  52. package/dist/audio/music/musicVoice.js +13 -0
  53. package/dist/audio/music/musicVoice.js.map +1 -0
  54. package/dist/audio/sampleBank.js +82 -0
  55. package/dist/audio/sampleBank.js.map +1 -0
  56. package/dist/audio/soundTable.js +9 -0
  57. package/dist/audio/soundTable.js.map +1 -0
  58. package/dist/audio/synth.js +36 -0
  59. package/dist/audio/synth.js.map +1 -0
  60. package/dist/core/BitmapLabel.js +49 -0
  61. package/dist/core/BitmapLabel.js.map +1 -0
  62. package/dist/core/Camera.js +150 -0
  63. package/dist/core/Camera.js.map +1 -0
  64. package/dist/core/Clock.js +30 -0
  65. package/dist/core/Clock.js.map +1 -0
  66. package/dist/core/Graphics.js +69 -0
  67. package/dist/core/Graphics.js.map +1 -0
  68. package/dist/core/Group.js +29 -0
  69. package/dist/core/Group.js.map +1 -0
  70. package/dist/core/Image.js +51 -0
  71. package/dist/core/Image.js.map +1 -0
  72. package/dist/core/ObjectFactory.js +55 -0
  73. package/dist/core/ObjectFactory.js.map +1 -0
  74. package/dist/core/Pointer.js +58 -0
  75. package/dist/core/Pointer.js.map +1 -0
  76. package/dist/core/Rectangle.js +51 -0
  77. package/dist/core/Rectangle.js.map +1 -0
  78. package/dist/core/Stage.js +86 -0
  79. package/dist/core/Stage.js.map +1 -0
  80. package/dist/core/Text.js +22 -0
  81. package/dist/core/Text.js.map +1 -0
  82. package/dist/core/TextureRegistry.js +111 -0
  83. package/dist/core/TextureRegistry.js.map +1 -0
  84. package/dist/core/Timeline.js +211 -0
  85. package/dist/core/Timeline.js.map +1 -0
  86. package/dist/core/TimelineBuilder.js +73 -0
  87. package/dist/core/TimelineBuilder.js.map +1 -0
  88. package/dist/core/TimelineChild.js +84 -0
  89. package/dist/core/TimelineChild.js.map +1 -0
  90. package/dist/core/Tweener.js +136 -0
  91. package/dist/core/Tweener.js.map +1 -0
  92. package/dist/core/atlas.js +38 -0
  93. package/dist/core/atlas.js.map +1 -0
  94. package/dist/core/atlasPlan.js +22 -0
  95. package/dist/core/atlasPlan.js.map +1 -0
  96. package/dist/core/eases.js +21 -0
  97. package/dist/core/eases.js.map +1 -0
  98. package/dist/core/gameObject.js +115 -0
  99. package/dist/core/gameObject.js.map +1 -0
  100. package/dist/core/pixiPatches.js +18 -0
  101. package/dist/core/pixiPatches.js.map +1 -0
  102. package/dist/core/timelinePlace.js +24 -0
  103. package/dist/core/timelinePlace.js.map +1 -0
  104. package/dist/core/tweenProps.js +12 -0
  105. package/dist/core/tweenProps.js.map +1 -0
  106. package/dist/debug/DebugOverlay.js +94 -0
  107. package/dist/debug/DebugOverlay.js.map +1 -0
  108. package/dist/debug/DrawCallCounter.js +41 -0
  109. package/dist/debug/DrawCallCounter.js.map +1 -0
  110. package/dist/debug/ErrorLog.js +22 -0
  111. package/dist/debug/ErrorLog.js.map +1 -0
  112. package/dist/debug/FrameStats.js +42 -0
  113. package/dist/debug/FrameStats.js.map +1 -0
  114. package/dist/debug/inspectWorld.js +29 -0
  115. package/dist/debug/inspectWorld.js.map +1 -0
  116. package/dist/diagnostics/ErrorDeduper.js +27 -0
  117. package/dist/diagnostics/ErrorDeduper.js.map +1 -0
  118. package/dist/diagnostics/FrameSampler.js +42 -0
  119. package/dist/diagnostics/FrameSampler.js.map +1 -0
  120. package/dist/diagnostics/bootWatch.js +21 -0
  121. package/dist/diagnostics/bootWatch.js.map +1 -0
  122. package/dist/diagnostics/captureErrors.js +27 -0
  123. package/dist/diagnostics/captureErrors.js.map +1 -0
  124. package/dist/diagnostics/contextLoss.js +25 -0
  125. package/dist/diagnostics/contextLoss.js.map +1 -0
  126. package/dist/diagnostics/frameStats.js +31 -0
  127. package/dist/diagnostics/frameStats.js.map +1 -0
  128. package/dist/diagnostics/gpuInfo.js +22 -0
  129. package/dist/diagnostics/gpuInfo.js.map +1 -0
  130. package/dist/diagnostics/renderGuard.js +24 -0
  131. package/dist/diagnostics/renderGuard.js.map +1 -0
  132. package/dist/ecs/SparseSet.js +55 -0
  133. package/dist/ecs/SparseSet.js.map +1 -0
  134. package/dist/ecs/World.js +307 -0
  135. package/dist/ecs/World.js.map +1 -0
  136. package/dist/ecs/fields.js +26 -0
  137. package/dist/ecs/fields.js.map +1 -0
  138. package/dist/engine/Engine.js +82 -0
  139. package/dist/engine/Engine.js.map +1 -0
  140. package/dist/engine/FixedLoop.js +37 -0
  141. package/dist/engine/FixedLoop.js.map +1 -0
  142. package/dist/engine/Scene.js +79 -0
  143. package/dist/engine/Scene.js.map +1 -0
  144. package/dist/engine/SceneManager.js +73 -0
  145. package/dist/engine/SceneManager.js.map +1 -0
  146. package/dist/events/EventBus.js +42 -0
  147. package/dist/events/EventBus.js.map +1 -0
  148. package/dist/fx/FloatingText.js +72 -0
  149. package/dist/fx/FloatingText.js.map +1 -0
  150. package/dist/fx/hitStop.js +28 -0
  151. package/dist/fx/hitStop.js.map +1 -0
  152. package/dist/fx/viewCull.js +10 -0
  153. package/dist/fx/viewCull.js.map +1 -0
  154. package/dist/i18n/Translator.js +72 -0
  155. package/dist/i18n/Translator.js.map +1 -0
  156. package/dist/i18n/extractStrings.js +58 -0
  157. package/dist/i18n/extractStrings.js.map +1 -0
  158. package/dist/i18n/formatMessage.js +19 -0
  159. package/dist/i18n/formatMessage.js.map +1 -0
  160. package/dist/input/Actions.js +131 -0
  161. package/dist/input/Actions.js.map +1 -0
  162. package/dist/input/AimGesture.js +75 -0
  163. package/dist/input/AimGesture.js.map +1 -0
  164. package/dist/input/Keyboard.js +54 -0
  165. package/dist/input/Keyboard.js.map +1 -0
  166. package/dist/input/Keymap.js +171 -0
  167. package/dist/input/Keymap.js.map +1 -0
  168. package/dist/input/TargetLock.js +73 -0
  169. package/dist/input/TargetLock.js.map +1 -0
  170. package/dist/input/aimAxis.js +8 -0
  171. package/dist/input/aimAxis.js.map +1 -0
  172. package/dist/input/keyChord.js +29 -0
  173. package/dist/input/keyChord.js.map +1 -0
  174. package/dist/input/longPress.js +32 -0
  175. package/dist/input/longPress.js.map +1 -0
  176. package/dist/input/stickAxis.js +23 -0
  177. package/dist/input/stickAxis.js.map +1 -0
  178. package/dist/input/touchDetect.js +7 -0
  179. package/dist/input/touchDetect.js.map +1 -0
  180. package/dist/light/LightLayer.js +84 -0
  181. package/dist/light/LightLayer.js.map +1 -0
  182. package/dist/nav/MinHeap.js +39 -0
  183. package/dist/nav/MinHeap.js.map +1 -0
  184. package/dist/nav/findPath.js +78 -0
  185. package/dist/nav/findPath.js.map +1 -0
  186. package/dist/nav/navGrid.js +36 -0
  187. package/dist/nav/navGrid.js.map +1 -0
  188. package/dist/nav/nearestOpen.js +19 -0
  189. package/dist/nav/nearestOpen.js.map +1 -0
  190. package/dist/nav/straightenPath.js +51 -0
  191. package/dist/nav/straightenPath.js.map +1 -0
  192. package/dist/net/Connection.js +84 -0
  193. package/dist/net/Connection.js.map +1 -0
  194. package/dist/net/InterpolationBuffer.js +57 -0
  195. package/dist/net/InterpolationBuffer.js.map +1 -0
  196. package/dist/net/PredictedMover.js +61 -0
  197. package/dist/net/PredictedMover.js.map +1 -0
  198. package/dist/net/Room.js +92 -0
  199. package/dist/net/Room.js.map +1 -0
  200. package/dist/net/RoomHost.js +101 -0
  201. package/dist/net/RoomHost.js.map +1 -0
  202. package/dist/net/cadence.js +22 -0
  203. package/dist/net/cadence.js.map +1 -0
  204. package/dist/net/constants.js +11 -0
  205. package/dist/net/constants.js.map +1 -0
  206. package/dist/net/lobby/LobbyClient.js +124 -0
  207. package/dist/net/lobby/LobbyClient.js.map +1 -0
  208. package/dist/net/lobby/LobbyHost.js +366 -0
  209. package/dist/net/lobby/LobbyHost.js.map +1 -0
  210. package/dist/net/lobby/LobbyRooms.js +66 -0
  211. package/dist/net/lobby/LobbyRooms.js.map +1 -0
  212. package/dist/net/lobby/Matchmaker.js +106 -0
  213. package/dist/net/lobby/Matchmaker.js.map +1 -0
  214. package/dist/net/movement.js +83 -0
  215. package/dist/net/movement.js.map +1 -0
  216. package/dist/net/protocol.js +11 -0
  217. package/dist/net/protocol.js.map +1 -0
  218. package/dist/net/serverClock.js +22 -0
  219. package/dist/net/serverClock.js.map +1 -0
  220. package/dist/net/snapshotCodec.js +92 -0
  221. package/dist/net/snapshotCodec.js.map +1 -0
  222. package/dist/parallax/Parallax.js +32 -0
  223. package/dist/parallax/Parallax.js.map +1 -0
  224. package/dist/parallax/ParallaxLayer.js +70 -0
  225. package/dist/parallax/ParallaxLayer.js.map +1 -0
  226. package/dist/parallax/parallaxMath.js +27 -0
  227. package/dist/parallax/parallaxMath.js.map +1 -0
  228. package/dist/particles/Emitter.js +108 -0
  229. package/dist/particles/Emitter.js.map +1 -0
  230. package/dist/particles/ParticleBudget.js +32 -0
  231. package/dist/particles/ParticleBudget.js.map +1 -0
  232. package/dist/particles/ParticleSim.js +60 -0
  233. package/dist/particles/ParticleSim.js.map +1 -0
  234. package/dist/particles/particleCurves.js +48 -0
  235. package/dist/particles/particleCurves.js.map +1 -0
  236. package/dist/particles/particleSampling.js +30 -0
  237. package/dist/particles/particleSampling.js.map +1 -0
  238. package/dist/physics/Body.js +202 -0
  239. package/dist/physics/Body.js.map +1 -0
  240. package/dist/physics/BroadPhase.js +56 -0
  241. package/dist/physics/BroadPhase.js.map +1 -0
  242. package/dist/physics/Contact.js +76 -0
  243. package/dist/physics/Contact.js.map +1 -0
  244. package/dist/physics/ContactSolver.js +70 -0
  245. package/dist/physics/ContactSolver.js.map +1 -0
  246. package/dist/physics/PhysicsWorld.js +221 -0
  247. package/dist/physics/PhysicsWorld.js.map +1 -0
  248. package/dist/physics/SpatialHash.js +39 -0
  249. package/dist/physics/SpatialHash.js.map +1 -0
  250. package/dist/physics/collide.js +76 -0
  251. package/dist/physics/collide.js.map +1 -0
  252. package/dist/physics/collidePolygon.js +94 -0
  253. package/dist/physics/collidePolygon.js.map +1 -0
  254. package/dist/physics/contactReport.js +14 -0
  255. package/dist/physics/contactReport.js.map +1 -0
  256. package/dist/physics/drawColliders.js +31 -0
  257. package/dist/physics/drawColliders.js.map +1 -0
  258. package/dist/physics/physicsSystem.js +8 -0
  259. package/dist/physics/physicsSystem.js.map +1 -0
  260. package/dist/physics/polygon.js +80 -0
  261. package/dist/physics/polygon.js.map +1 -0
  262. package/dist/physics/raycast.js +62 -0
  263. package/dist/physics/raycast.js.map +1 -0
  264. package/dist/physics/syncToBody.js +19 -0
  265. package/dist/physics/syncToBody.js.map +1 -0
  266. package/dist/physics/tileBodies.js +59 -0
  267. package/dist/physics/tileBodies.js.map +1 -0
  268. package/dist/physics/types.js +8 -0
  269. package/dist/physics/types.js.map +1 -0
  270. package/dist/pixel/Darkness.js +166 -0
  271. package/dist/pixel/Darkness.js.map +1 -0
  272. package/dist/pixel/DitherVignette.js +57 -0
  273. package/dist/pixel/DitherVignette.js.map +1 -0
  274. package/dist/pixel/Evaporation.js +85 -0
  275. package/dist/pixel/Evaporation.js.map +1 -0
  276. package/dist/pixel/NightShade.js +34 -0
  277. package/dist/pixel/NightShade.js.map +1 -0
  278. package/dist/pixel/PixelLayer.js +211 -0
  279. package/dist/pixel/PixelLayer.js.map +1 -0
  280. package/dist/pixel/SwayProp.js +75 -0
  281. package/dist/pixel/SwayProp.js.map +1 -0
  282. package/dist/pixel/lights.js +44 -0
  283. package/dist/pixel/lights.js.map +1 -0
  284. package/dist/pixel/nineSlice.js +62 -0
  285. package/dist/pixel/nineSlice.js.map +1 -0
  286. package/dist/pixel/paintLayer.js +36 -0
  287. package/dist/pixel/paintLayer.js.map +1 -0
  288. package/dist/pixel/palette.js +57 -0
  289. package/dist/pixel/palette.js.map +1 -0
  290. package/dist/pixel/pixel.js +278 -0
  291. package/dist/pixel/pixel.js.map +1 -0
  292. package/dist/pixel/pixelPaint.js +194 -0
  293. package/dist/pixel/pixelPaint.js.map +1 -0
  294. package/dist/pixel/pixelTone.js +164 -0
  295. package/dist/pixel/pixelTone.js.map +1 -0
  296. package/dist/pixel/propKit.js +41 -0
  297. package/dist/pixel/propKit.js.map +1 -0
  298. package/dist/pixel/ramp.js +102 -0
  299. package/dist/pixel/ramp.js.map +1 -0
  300. package/dist/pixel/selout.js +35 -0
  301. package/dist/pixel/selout.js.map +1 -0
  302. package/dist/pixel/spritePixels.js +59 -0
  303. package/dist/pixel/spritePixels.js.map +1 -0
  304. package/dist/pixel/swayRig.js +87 -0
  305. package/dist/pixel/swayRig.js.map +1 -0
  306. package/dist/pixel/vignetteMask.js +24 -0
  307. package/dist/pixel/vignetteMask.js.map +1 -0
  308. package/dist/pixel/weatherArt.js +61 -0
  309. package/dist/pixel/weatherArt.js.map +1 -0
  310. package/dist/pixel.js +90 -0
  311. package/dist/pixel.js.map +1 -0
  312. package/dist/platform/touch.js +33 -0
  313. package/dist/platform/touch.js.map +1 -0
  314. package/dist/postfx/BloomFilter.js +65 -0
  315. package/dist/postfx/BloomFilter.js.map +1 -0
  316. package/dist/postfx/ChromaticAberrationFilter.js +25 -0
  317. package/dist/postfx/ChromaticAberrationFilter.js.map +1 -0
  318. package/dist/postfx/ColorAdjustFilter.js +76 -0
  319. package/dist/postfx/ColorAdjustFilter.js.map +1 -0
  320. package/dist/postfx/CrtFilter.js +42 -0
  321. package/dist/postfx/CrtFilter.js.map +1 -0
  322. package/dist/postfx/PixelateFilter.js +27 -0
  323. package/dist/postfx/PixelateFilter.js.map +1 -0
  324. package/dist/postfx/PostFx.js +123 -0
  325. package/dist/postfx/PostFx.js.map +1 -0
  326. package/dist/postfx/ShockwaveFilter.js +49 -0
  327. package/dist/postfx/ShockwaveFilter.js.map +1 -0
  328. package/dist/postfx/VignetteFilter.js +37 -0
  329. package/dist/postfx/VignetteFilter.js.map +1 -0
  330. package/dist/postfx/fxAnimator.js +38 -0
  331. package/dist/postfx/fxAnimator.js.map +1 -0
  332. package/dist/postfx/fxShader.js +128 -0
  333. package/dist/postfx/fxShader.js.map +1 -0
  334. package/dist/postfx.js +26 -0
  335. package/dist/postfx.js.map +1 -0
  336. package/dist/react/ChoiceDialog.js +51 -0
  337. package/dist/react/ChoiceDialog.js.map +1 -0
  338. package/dist/react/ConfirmDialog.js +53 -0
  339. package/dist/react/ConfirmDialog.js.map +1 -0
  340. package/dist/react/Glyph.js +63 -0
  341. package/dist/react/Glyph.js.map +1 -0
  342. package/dist/react/Modal.js +38 -0
  343. package/dist/react/Modal.js.map +1 -0
  344. package/dist/react/Panel.js +24 -0
  345. package/dist/react/Panel.js.map +1 -0
  346. package/dist/react/PixelImage.js +24 -0
  347. package/dist/react/PixelImage.js.map +1 -0
  348. package/dist/react/Select.js +99 -0
  349. package/dist/react/Select.js.map +1 -0
  350. package/dist/react/Slider.js +62 -0
  351. package/dist/react/Slider.js.map +1 -0
  352. package/dist/react/SplitPane.js +24 -0
  353. package/dist/react/SplitPane.js.map +1 -0
  354. package/dist/react/TabStrip.js +32 -0
  355. package/dist/react/TabStrip.js.map +1 -0
  356. package/dist/react/TitleTips.js +42 -0
  357. package/dist/react/TitleTips.js.map +1 -0
  358. package/dist/react/Tooltip.js +28 -0
  359. package/dist/react/Tooltip.js.map +1 -0
  360. package/dist/react/UiProvider.js +50 -0
  361. package/dist/react/UiProvider.js.map +1 -0
  362. package/dist/react/baseCss.js +222 -0
  363. package/dist/react/baseCss.js.map +1 -0
  364. package/dist/react/choiceStore.js +23 -0
  365. package/dist/react/choiceStore.js.map +1 -0
  366. package/dist/react/classNames.js +19 -0
  367. package/dist/react/classNames.js.map +1 -0
  368. package/dist/react/confirmStore.js +30 -0
  369. package/dist/react/confirmStore.js.map +1 -0
  370. package/dist/react/labels.js +18 -0
  371. package/dist/react/labels.js.map +1 -0
  372. package/dist/react/placement.js +49 -0
  373. package/dist/react/placement.js.map +1 -0
  374. package/dist/react/useFillSheet.js +23 -0
  375. package/dist/react/useFillSheet.js.map +1 -0
  376. package/dist/react/useFitToViewport.js +29 -0
  377. package/dist/react/useFitToViewport.js.map +1 -0
  378. package/dist/react/usePicked.js +13 -0
  379. package/dist/react/usePicked.js.map +1 -0
  380. package/dist/react/useStore.js +9 -0
  381. package/dist/react/useStore.js.map +1 -0
  382. package/dist/react/useViewport.js +17 -0
  383. package/dist/react/useViewport.js.map +1 -0
  384. package/dist/react.js +78 -0
  385. package/dist/react.js.map +1 -0
  386. package/dist/rig/PosePlayer.js +92 -0
  387. package/dist/rig/PosePlayer.js.map +1 -0
  388. package/dist/rig/RigView.js +125 -0
  389. package/dist/rig/RigView.js.map +1 -0
  390. package/dist/rig/Skeleton.js +31 -0
  391. package/dist/rig/Skeleton.js.map +1 -0
  392. package/dist/rig/humanoid.js +6 -0
  393. package/dist/rig/humanoid.js.map +1 -0
  394. package/dist/rig/humanoid.json.js +30 -0
  395. package/dist/rig/humanoid.json.js.map +1 -0
  396. package/dist/rig/humanoidPoses.js +30 -0
  397. package/dist/rig/humanoidPoses.js.map +1 -0
  398. package/dist/rig/poseMath.js +54 -0
  399. package/dist/rig/poseMath.js.map +1 -0
  400. package/dist/rig/poses.json.js +150 -0
  401. package/dist/rig/poses.json.js.map +1 -0
  402. package/dist/save/Autosaver.js +54 -0
  403. package/dist/save/Autosaver.js.map +1 -0
  404. package/dist/save/MemoryBackend.js +19 -0
  405. package/dist/save/MemoryBackend.js.map +1 -0
  406. package/dist/save/SaveStore.js +103 -0
  407. package/dist/save/SaveStore.js.map +1 -0
  408. package/dist/save/WebStorageBackend.js +27 -0
  409. package/dist/save/WebStorageBackend.js.map +1 -0
  410. package/dist/save/checksum.js +10 -0
  411. package/dist/save/checksum.js.map +1 -0
  412. package/dist/save/migrateSave.js +27 -0
  413. package/dist/save/migrateSave.js.map +1 -0
  414. package/dist/settings.js +27 -0
  415. package/dist/settings.js.map +1 -0
  416. package/dist/tilemap/TilemapView.js +69 -0
  417. package/dist/tilemap/TilemapView.js.map +1 -0
  418. package/dist/tilemap/collision.js +25 -0
  419. package/dist/tilemap/collision.js.map +1 -0
  420. package/dist/tilemap/tiled.js +138 -0
  421. package/dist/tilemap/tiled.js.map +1 -0
  422. package/dist/transitions/CrossfadeTransition.js +24 -0
  423. package/dist/transitions/CrossfadeTransition.js.map +1 -0
  424. package/dist/transitions/DitherWipeTransition.js +70 -0
  425. package/dist/transitions/DitherWipeTransition.js.map +1 -0
  426. package/dist/transitions/FadeTransition.js +34 -0
  427. package/dist/transitions/FadeTransition.js.map +1 -0
  428. package/dist/transitions/Letterbox.js +42 -0
  429. package/dist/transitions/Letterbox.js.map +1 -0
  430. package/dist/transitions/ditherMask.js +15 -0
  431. package/dist/transitions/ditherMask.js.map +1 -0
  432. package/dist/transitions/transitionTo.js +28 -0
  433. package/dist/transitions/transitionTo.js.map +1 -0
  434. package/dist/transitions/tweenDone.js +15 -0
  435. package/dist/transitions/tweenDone.js.map +1 -0
  436. package/dist/types/ambient/ColorGrade.d.ts +41 -0
  437. package/dist/types/ambient/ColorGrade.d.ts.map +1 -0
  438. package/dist/types/ambient/DayClock.d.ts +80 -0
  439. package/dist/types/ambient/DayClock.d.ts.map +1 -0
  440. package/dist/types/ambient/WeatherLayer.d.ts +78 -0
  441. package/dist/types/ambient/WeatherLayer.d.ts.map +1 -0
  442. package/dist/types/ambient/grade.d.ts +22 -0
  443. package/dist/types/ambient/grade.d.ts.map +1 -0
  444. package/dist/types/ambient/weather.d.ts +49 -0
  445. package/dist/types/ambient/weather.d.ts.map +1 -0
  446. package/dist/types/anim/AnimStateMachine.d.ts +80 -0
  447. package/dist/types/anim/AnimStateMachine.d.ts.map +1 -0
  448. package/dist/types/anim/Animator.d.ts +50 -0
  449. package/dist/types/anim/Animator.d.ts.map +1 -0
  450. package/dist/types/anim/animStateCompile.d.ts +52 -0
  451. package/dist/types/anim/animStateCompile.d.ts.map +1 -0
  452. package/dist/types/anim/animStateSystem.d.ts +10 -0
  453. package/dist/types/anim/animStateSystem.d.ts.map +1 -0
  454. package/dist/types/anim/animStateTypes.d.ts +50 -0
  455. package/dist/types/anim/animStateTypes.d.ts.map +1 -0
  456. package/dist/types/anim/animationSystem.d.ts +13 -0
  457. package/dist/types/anim/animationSystem.d.ts.map +1 -0
  458. package/dist/types/anim/asepriteSlices.d.ts +19 -0
  459. package/dist/types/anim/asepriteSlices.d.ts.map +1 -0
  460. package/dist/types/anim/asepriteTags.d.ts +16 -0
  461. package/dist/types/anim/asepriteTags.d.ts.map +1 -0
  462. package/dist/types/anim/asepriteTypes.d.ts +159 -0
  463. package/dist/types/anim/asepriteTypes.d.ts.map +1 -0
  464. package/dist/types/anim/parseAseprite.d.ts +21 -0
  465. package/dist/types/anim/parseAseprite.d.ts.map +1 -0
  466. package/dist/types/assets/AssetLoader.d.ts +85 -0
  467. package/dist/types/assets/AssetLoader.d.ts.map +1 -0
  468. package/dist/types/assets/loadAseprite.d.ts +27 -0
  469. package/dist/types/assets/loadAseprite.d.ts.map +1 -0
  470. package/dist/types/audio/Footsteps.d.ts +33 -0
  471. package/dist/types/audio/Footsteps.d.ts.map +1 -0
  472. package/dist/types/audio/MusicPlayer.d.ts +65 -0
  473. package/dist/types/audio/MusicPlayer.d.ts.map +1 -0
  474. package/dist/types/audio/SoundEngine.d.ts +42 -0
  475. package/dist/types/audio/SoundEngine.d.ts.map +1 -0
  476. package/dist/types/audio/cleanTake.d.ts +3 -0
  477. package/dist/types/audio/cleanTake.d.ts.map +1 -0
  478. package/dist/types/audio/music/ElementVoice.d.ts +14 -0
  479. package/dist/types/audio/music/ElementVoice.d.ts.map +1 -0
  480. package/dist/types/audio/music/GraphVoice.d.ts +22 -0
  481. package/dist/types/audio/music/GraphVoice.d.ts.map +1 -0
  482. package/dist/types/audio/music/MusicChannel.d.ts +35 -0
  483. package/dist/types/audio/music/MusicChannel.d.ts.map +1 -0
  484. package/dist/types/audio/music/musicVoice.d.ts +26 -0
  485. package/dist/types/audio/music/musicVoice.d.ts.map +1 -0
  486. package/dist/types/audio/sampleBank.d.ts +27 -0
  487. package/dist/types/audio/sampleBank.d.ts.map +1 -0
  488. package/dist/types/audio/soundTable.d.ts +14 -0
  489. package/dist/types/audio/soundTable.d.ts.map +1 -0
  490. package/dist/types/audio/synth.d.ts +34 -0
  491. package/dist/types/audio/synth.d.ts.map +1 -0
  492. package/dist/types/audio/takeCleanerWorker.d.ts +2 -0
  493. package/dist/types/audio/takeCleanerWorker.d.ts.map +1 -0
  494. package/dist/types/core/BitmapLabel.d.ts +36 -0
  495. package/dist/types/core/BitmapLabel.d.ts.map +1 -0
  496. package/dist/types/core/Camera.d.ts +115 -0
  497. package/dist/types/core/Camera.d.ts.map +1 -0
  498. package/dist/types/core/Clock.d.ts +11 -0
  499. package/dist/types/core/Clock.d.ts.map +1 -0
  500. package/dist/types/core/Graphics.d.ts +37 -0
  501. package/dist/types/core/Graphics.d.ts.map +1 -0
  502. package/dist/types/core/Group.d.ts +15 -0
  503. package/dist/types/core/Group.d.ts.map +1 -0
  504. package/dist/types/core/Image.d.ts +25 -0
  505. package/dist/types/core/Image.d.ts.map +1 -0
  506. package/dist/types/core/ObjectFactory.d.ts +34 -0
  507. package/dist/types/core/ObjectFactory.d.ts.map +1 -0
  508. package/dist/types/core/Pointer.d.ts +27 -0
  509. package/dist/types/core/Pointer.d.ts.map +1 -0
  510. package/dist/types/core/Rectangle.d.ts +26 -0
  511. package/dist/types/core/Rectangle.d.ts.map +1 -0
  512. package/dist/types/core/Stage.d.ts +58 -0
  513. package/dist/types/core/Stage.d.ts.map +1 -0
  514. package/dist/types/core/Text.d.ts +22 -0
  515. package/dist/types/core/Text.d.ts.map +1 -0
  516. package/dist/types/core/TextureRegistry.d.ts +51 -0
  517. package/dist/types/core/TextureRegistry.d.ts.map +1 -0
  518. package/dist/types/core/Timeline.d.ts +115 -0
  519. package/dist/types/core/Timeline.d.ts.map +1 -0
  520. package/dist/types/core/TimelineBuilder.d.ts +53 -0
  521. package/dist/types/core/TimelineBuilder.d.ts.map +1 -0
  522. package/dist/types/core/TimelineChild.d.ts +51 -0
  523. package/dist/types/core/TimelineChild.d.ts.map +1 -0
  524. package/dist/types/core/Tweener.d.ts +70 -0
  525. package/dist/types/core/Tweener.d.ts.map +1 -0
  526. package/dist/types/core/atlas.d.ts +16 -0
  527. package/dist/types/core/atlas.d.ts.map +1 -0
  528. package/dist/types/core/atlasPlan.d.ts +34 -0
  529. package/dist/types/core/atlasPlan.d.ts.map +1 -0
  530. package/dist/types/core/eases.d.ts +3 -0
  531. package/dist/types/core/eases.d.ts.map +1 -0
  532. package/dist/types/core/gameObject.d.ts +42 -0
  533. package/dist/types/core/gameObject.d.ts.map +1 -0
  534. package/dist/types/core/pixiPatches.d.ts +9 -0
  535. package/dist/types/core/pixiPatches.d.ts.map +1 -0
  536. package/dist/types/core/timelinePlace.d.ts +23 -0
  537. package/dist/types/core/timelinePlace.d.ts.map +1 -0
  538. package/dist/types/core/tweenProps.d.ts +8 -0
  539. package/dist/types/core/tweenProps.d.ts.map +1 -0
  540. package/dist/types/core/types.d.ts +4 -0
  541. package/dist/types/core/types.d.ts.map +1 -0
  542. package/dist/types/debug/DebugOverlay.d.ts +63 -0
  543. package/dist/types/debug/DebugOverlay.d.ts.map +1 -0
  544. package/dist/types/debug/DrawCallCounter.d.ts +20 -0
  545. package/dist/types/debug/DrawCallCounter.d.ts.map +1 -0
  546. package/dist/types/debug/ErrorLog.d.ts +20 -0
  547. package/dist/types/debug/ErrorLog.d.ts.map +1 -0
  548. package/dist/types/debug/FrameStats.d.ts +21 -0
  549. package/dist/types/debug/FrameStats.d.ts.map +1 -0
  550. package/dist/types/debug/inspectWorld.d.ts +14 -0
  551. package/dist/types/debug/inspectWorld.d.ts.map +1 -0
  552. package/dist/types/diagnostics/ErrorDeduper.d.ts +17 -0
  553. package/dist/types/diagnostics/ErrorDeduper.d.ts.map +1 -0
  554. package/dist/types/diagnostics/FrameSampler.d.ts +37 -0
  555. package/dist/types/diagnostics/FrameSampler.d.ts.map +1 -0
  556. package/dist/types/diagnostics/bootWatch.d.ts +25 -0
  557. package/dist/types/diagnostics/bootWatch.d.ts.map +1 -0
  558. package/dist/types/diagnostics/captureErrors.d.ts +24 -0
  559. package/dist/types/diagnostics/captureErrors.d.ts.map +1 -0
  560. package/dist/types/diagnostics/contextLoss.d.ts +35 -0
  561. package/dist/types/diagnostics/contextLoss.d.ts.map +1 -0
  562. package/dist/types/diagnostics/frameStats.d.ts +30 -0
  563. package/dist/types/diagnostics/frameStats.d.ts.map +1 -0
  564. package/dist/types/diagnostics/gpuInfo.d.ts +9 -0
  565. package/dist/types/diagnostics/gpuInfo.d.ts.map +1 -0
  566. package/dist/types/diagnostics/renderGuard.d.ts +12 -0
  567. package/dist/types/diagnostics/renderGuard.d.ts.map +1 -0
  568. package/dist/types/ecs/SparseSet.d.ts +25 -0
  569. package/dist/types/ecs/SparseSet.d.ts.map +1 -0
  570. package/dist/types/ecs/World.d.ts +137 -0
  571. package/dist/types/ecs/World.d.ts.map +1 -0
  572. package/dist/types/ecs/fields.d.ts +34 -0
  573. package/dist/types/ecs/fields.d.ts.map +1 -0
  574. package/dist/types/engine/Engine.d.ts +80 -0
  575. package/dist/types/engine/Engine.d.ts.map +1 -0
  576. package/dist/types/engine/FixedLoop.d.ts +32 -0
  577. package/dist/types/engine/FixedLoop.d.ts.map +1 -0
  578. package/dist/types/engine/Scene.d.ts +67 -0
  579. package/dist/types/engine/Scene.d.ts.map +1 -0
  580. package/dist/types/engine/SceneManager.d.ts +36 -0
  581. package/dist/types/engine/SceneManager.d.ts.map +1 -0
  582. package/dist/types/events/EventBus.d.ts +20 -0
  583. package/dist/types/events/EventBus.d.ts.map +1 -0
  584. package/dist/types/fx/FloatingText.d.ts +71 -0
  585. package/dist/types/fx/FloatingText.d.ts.map +1 -0
  586. package/dist/types/fx/hitStop.d.ts +20 -0
  587. package/dist/types/fx/hitStop.d.ts.map +1 -0
  588. package/dist/types/fx/viewCull.d.ts +14 -0
  589. package/dist/types/fx/viewCull.d.ts.map +1 -0
  590. package/dist/types/i18n/Translator.d.ts +52 -0
  591. package/dist/types/i18n/Translator.d.ts.map +1 -0
  592. package/dist/types/i18n/extractStrings.d.ts +25 -0
  593. package/dist/types/i18n/extractStrings.d.ts.map +1 -0
  594. package/dist/types/i18n/formatMessage.d.ts +10 -0
  595. package/dist/types/i18n/formatMessage.d.ts.map +1 -0
  596. package/dist/types/index.d.ts +149 -0
  597. package/dist/types/index.d.ts.map +1 -0
  598. package/dist/types/input/Actions.d.ts +94 -0
  599. package/dist/types/input/Actions.d.ts.map +1 -0
  600. package/dist/types/input/AimGesture.d.ts +106 -0
  601. package/dist/types/input/AimGesture.d.ts.map +1 -0
  602. package/dist/types/input/Keyboard.d.ts +30 -0
  603. package/dist/types/input/Keyboard.d.ts.map +1 -0
  604. package/dist/types/input/Keymap.d.ts +85 -0
  605. package/dist/types/input/Keymap.d.ts.map +1 -0
  606. package/dist/types/input/TargetLock.d.ts +56 -0
  607. package/dist/types/input/TargetLock.d.ts.map +1 -0
  608. package/dist/types/input/aimAxis.d.ts +9 -0
  609. package/dist/types/input/aimAxis.d.ts.map +1 -0
  610. package/dist/types/input/keyChord.d.ts +15 -0
  611. package/dist/types/input/keyChord.d.ts.map +1 -0
  612. package/dist/types/input/longPress.d.ts +21 -0
  613. package/dist/types/input/longPress.d.ts.map +1 -0
  614. package/dist/types/input/stickAxis.d.ts +26 -0
  615. package/dist/types/input/stickAxis.d.ts.map +1 -0
  616. package/dist/types/input/touchDetect.d.ts +18 -0
  617. package/dist/types/input/touchDetect.d.ts.map +1 -0
  618. package/dist/types/light/LightLayer.d.ts +65 -0
  619. package/dist/types/light/LightLayer.d.ts.map +1 -0
  620. package/dist/types/nav/MinHeap.d.ts +15 -0
  621. package/dist/types/nav/MinHeap.d.ts.map +1 -0
  622. package/dist/types/nav/findPath.d.ts +38 -0
  623. package/dist/types/nav/findPath.d.ts.map +1 -0
  624. package/dist/types/nav/navGrid.d.ts +48 -0
  625. package/dist/types/nav/navGrid.d.ts.map +1 -0
  626. package/dist/types/nav/nearestOpen.d.ts +8 -0
  627. package/dist/types/nav/nearestOpen.d.ts.map +1 -0
  628. package/dist/types/nav/straightenPath.d.ts +13 -0
  629. package/dist/types/nav/straightenPath.d.ts.map +1 -0
  630. package/dist/types/net/Connection.d.ts +66 -0
  631. package/dist/types/net/Connection.d.ts.map +1 -0
  632. package/dist/types/net/InterpolationBuffer.d.ts +36 -0
  633. package/dist/types/net/InterpolationBuffer.d.ts.map +1 -0
  634. package/dist/types/net/PredictedMover.d.ts +43 -0
  635. package/dist/types/net/PredictedMover.d.ts.map +1 -0
  636. package/dist/types/net/Room.d.ts +69 -0
  637. package/dist/types/net/Room.d.ts.map +1 -0
  638. package/dist/types/net/RoomHost.d.ts +74 -0
  639. package/dist/types/net/RoomHost.d.ts.map +1 -0
  640. package/dist/types/net/cadence.d.ts +22 -0
  641. package/dist/types/net/cadence.d.ts.map +1 -0
  642. package/dist/types/net/constants.d.ts +24 -0
  643. package/dist/types/net/constants.d.ts.map +1 -0
  644. package/dist/types/net/lobby/LobbyClient.d.ts +107 -0
  645. package/dist/types/net/lobby/LobbyClient.d.ts.map +1 -0
  646. package/dist/types/net/lobby/LobbyHost.d.ts +147 -0
  647. package/dist/types/net/lobby/LobbyHost.d.ts.map +1 -0
  648. package/dist/types/net/lobby/LobbyRooms.d.ts +56 -0
  649. package/dist/types/net/lobby/LobbyRooms.d.ts.map +1 -0
  650. package/dist/types/net/lobby/Matchmaker.d.ts +57 -0
  651. package/dist/types/net/lobby/Matchmaker.d.ts.map +1 -0
  652. package/dist/types/net/lobby/index.d.ts +6 -0
  653. package/dist/types/net/lobby/index.d.ts.map +1 -0
  654. package/dist/types/net/lobby/lobbyProtocol.d.ts +143 -0
  655. package/dist/types/net/lobby/lobbyProtocol.d.ts.map +1 -0
  656. package/dist/types/net/movement.d.ts +50 -0
  657. package/dist/types/net/movement.d.ts.map +1 -0
  658. package/dist/types/net/protocol.d.ts +59 -0
  659. package/dist/types/net/protocol.d.ts.map +1 -0
  660. package/dist/types/net/serverClock.d.ts +14 -0
  661. package/dist/types/net/serverClock.d.ts.map +1 -0
  662. package/dist/types/net/snapshotCodec.d.ts +55 -0
  663. package/dist/types/net/snapshotCodec.d.ts.map +1 -0
  664. package/dist/types/parallax/Parallax.d.ts +37 -0
  665. package/dist/types/parallax/Parallax.d.ts.map +1 -0
  666. package/dist/types/parallax/ParallaxLayer.d.ts +80 -0
  667. package/dist/types/parallax/ParallaxLayer.d.ts.map +1 -0
  668. package/dist/types/parallax/parallaxMath.d.ts +50 -0
  669. package/dist/types/parallax/parallaxMath.d.ts.map +1 -0
  670. package/dist/types/particles/Emitter.d.ts +97 -0
  671. package/dist/types/particles/Emitter.d.ts.map +1 -0
  672. package/dist/types/particles/ParticleBudget.d.ts +28 -0
  673. package/dist/types/particles/ParticleBudget.d.ts.map +1 -0
  674. package/dist/types/particles/ParticleSim.d.ts +38 -0
  675. package/dist/types/particles/ParticleSim.d.ts.map +1 -0
  676. package/dist/types/particles/particleCurves.d.ts +21 -0
  677. package/dist/types/particles/particleCurves.d.ts.map +1 -0
  678. package/dist/types/particles/particleSampling.d.ts +20 -0
  679. package/dist/types/particles/particleSampling.d.ts.map +1 -0
  680. package/dist/types/physics/Body.d.ts +130 -0
  681. package/dist/types/physics/Body.d.ts.map +1 -0
  682. package/dist/types/physics/BroadPhase.d.ts +26 -0
  683. package/dist/types/physics/BroadPhase.d.ts.map +1 -0
  684. package/dist/types/physics/Contact.d.ts +62 -0
  685. package/dist/types/physics/Contact.d.ts.map +1 -0
  686. package/dist/types/physics/ContactSolver.d.ts +29 -0
  687. package/dist/types/physics/ContactSolver.d.ts.map +1 -0
  688. package/dist/types/physics/PhysicsWorld.d.ts +78 -0
  689. package/dist/types/physics/PhysicsWorld.d.ts.map +1 -0
  690. package/dist/types/physics/PhysicsWorldOptions.d.ts +24 -0
  691. package/dist/types/physics/PhysicsWorldOptions.d.ts.map +1 -0
  692. package/dist/types/physics/SpatialHash.d.ts +23 -0
  693. package/dist/types/physics/SpatialHash.d.ts.map +1 -0
  694. package/dist/types/physics/collide.d.ts +27 -0
  695. package/dist/types/physics/collide.d.ts.map +1 -0
  696. package/dist/types/physics/collidePolygon.d.ts +14 -0
  697. package/dist/types/physics/collidePolygon.d.ts.map +1 -0
  698. package/dist/types/physics/contactReport.d.ts +8 -0
  699. package/dist/types/physics/contactReport.d.ts.map +1 -0
  700. package/dist/types/physics/drawColliders.d.ts +43 -0
  701. package/dist/types/physics/drawColliders.d.ts.map +1 -0
  702. package/dist/types/physics/physicsSystem.d.ts +5 -0
  703. package/dist/types/physics/physicsSystem.d.ts.map +1 -0
  704. package/dist/types/physics/polygon.d.ts +28 -0
  705. package/dist/types/physics/polygon.d.ts.map +1 -0
  706. package/dist/types/physics/raycast.d.ts +19 -0
  707. package/dist/types/physics/raycast.d.ts.map +1 -0
  708. package/dist/types/physics/syncToBody.d.ts +16 -0
  709. package/dist/types/physics/syncToBody.d.ts.map +1 -0
  710. package/dist/types/physics/tileBodies.d.ts +36 -0
  711. package/dist/types/physics/tileBodies.d.ts.map +1 -0
  712. package/dist/types/physics/types.d.ts +116 -0
  713. package/dist/types/physics/types.d.ts.map +1 -0
  714. package/dist/types/pixel/Darkness.d.ts +78 -0
  715. package/dist/types/pixel/Darkness.d.ts.map +1 -0
  716. package/dist/types/pixel/DitherVignette.d.ts +35 -0
  717. package/dist/types/pixel/DitherVignette.d.ts.map +1 -0
  718. package/dist/types/pixel/Evaporation.d.ts +30 -0
  719. package/dist/types/pixel/Evaporation.d.ts.map +1 -0
  720. package/dist/types/pixel/NightShade.d.ts +38 -0
  721. package/dist/types/pixel/NightShade.d.ts.map +1 -0
  722. package/dist/types/pixel/PixelLayer.d.ts +85 -0
  723. package/dist/types/pixel/PixelLayer.d.ts.map +1 -0
  724. package/dist/types/pixel/SwayProp.d.ts +52 -0
  725. package/dist/types/pixel/SwayProp.d.ts.map +1 -0
  726. package/dist/types/pixel/index.d.ts +31 -0
  727. package/dist/types/pixel/index.d.ts.map +1 -0
  728. package/dist/types/pixel/lights.d.ts +34 -0
  729. package/dist/types/pixel/lights.d.ts.map +1 -0
  730. package/dist/types/pixel/nineSlice.d.ts +71 -0
  731. package/dist/types/pixel/nineSlice.d.ts.map +1 -0
  732. package/dist/types/pixel/paintLayer.d.ts +35 -0
  733. package/dist/types/pixel/paintLayer.d.ts.map +1 -0
  734. package/dist/types/pixel/palette.d.ts +58 -0
  735. package/dist/types/pixel/palette.d.ts.map +1 -0
  736. package/dist/types/pixel/pixel.d.ts +80 -0
  737. package/dist/types/pixel/pixel.d.ts.map +1 -0
  738. package/dist/types/pixel/pixelPaint.d.ts +43 -0
  739. package/dist/types/pixel/pixelPaint.d.ts.map +1 -0
  740. package/dist/types/pixel/pixelTone.d.ts +51 -0
  741. package/dist/types/pixel/pixelTone.d.ts.map +1 -0
  742. package/dist/types/pixel/propKit.d.ts +26 -0
  743. package/dist/types/pixel/propKit.d.ts.map +1 -0
  744. package/dist/types/pixel/ramp.d.ts +57 -0
  745. package/dist/types/pixel/ramp.d.ts.map +1 -0
  746. package/dist/types/pixel/selout.d.ts +3 -0
  747. package/dist/types/pixel/selout.d.ts.map +1 -0
  748. package/dist/types/pixel/spritePixels.d.ts +29 -0
  749. package/dist/types/pixel/spritePixels.d.ts.map +1 -0
  750. package/dist/types/pixel/swayRig.d.ts +72 -0
  751. package/dist/types/pixel/swayRig.d.ts.map +1 -0
  752. package/dist/types/pixel/vignetteMask.d.ts +16 -0
  753. package/dist/types/pixel/vignetteMask.d.ts.map +1 -0
  754. package/dist/types/pixel/weatherArt.d.ts +29 -0
  755. package/dist/types/pixel/weatherArt.d.ts.map +1 -0
  756. package/dist/types/platform/touch.d.ts +10 -0
  757. package/dist/types/platform/touch.d.ts.map +1 -0
  758. package/dist/types/postfx/BloomFilter.d.ts +33 -0
  759. package/dist/types/postfx/BloomFilter.d.ts.map +1 -0
  760. package/dist/types/postfx/ChromaticAberrationFilter.d.ts +11 -0
  761. package/dist/types/postfx/ChromaticAberrationFilter.d.ts.map +1 -0
  762. package/dist/types/postfx/ColorAdjustFilter.d.ts +32 -0
  763. package/dist/types/postfx/ColorAdjustFilter.d.ts.map +1 -0
  764. package/dist/types/postfx/CrtFilter.d.ts +16 -0
  765. package/dist/types/postfx/CrtFilter.d.ts.map +1 -0
  766. package/dist/types/postfx/PixelateFilter.d.ts +8 -0
  767. package/dist/types/postfx/PixelateFilter.d.ts.map +1 -0
  768. package/dist/types/postfx/PostFx.d.ts +92 -0
  769. package/dist/types/postfx/PostFx.d.ts.map +1 -0
  770. package/dist/types/postfx/ShockwaveFilter.d.ts +20 -0
  771. package/dist/types/postfx/ShockwaveFilter.d.ts.map +1 -0
  772. package/dist/types/postfx/VignetteFilter.d.ts +19 -0
  773. package/dist/types/postfx/VignetteFilter.d.ts.map +1 -0
  774. package/dist/types/postfx/fxAnimator.d.ts +32 -0
  775. package/dist/types/postfx/fxAnimator.d.ts.map +1 -0
  776. package/dist/types/postfx/fxShader.d.ts +49 -0
  777. package/dist/types/postfx/fxShader.d.ts.map +1 -0
  778. package/dist/types/postfx/index.d.ts +11 -0
  779. package/dist/types/postfx/index.d.ts.map +1 -0
  780. package/dist/types/react/ChoiceDialog.d.ts +8 -0
  781. package/dist/types/react/ChoiceDialog.d.ts.map +1 -0
  782. package/dist/types/react/ConfirmDialog.d.ts +9 -0
  783. package/dist/types/react/ConfirmDialog.d.ts.map +1 -0
  784. package/dist/types/react/Glyph.d.ts +54 -0
  785. package/dist/types/react/Glyph.d.ts.map +1 -0
  786. package/dist/types/react/Modal.d.ts +22 -0
  787. package/dist/types/react/Modal.d.ts.map +1 -0
  788. package/dist/types/react/Panel.d.ts +29 -0
  789. package/dist/types/react/Panel.d.ts.map +1 -0
  790. package/dist/types/react/PixelImage.d.ts +19 -0
  791. package/dist/types/react/PixelImage.d.ts.map +1 -0
  792. package/dist/types/react/Select.d.ts +27 -0
  793. package/dist/types/react/Select.d.ts.map +1 -0
  794. package/dist/types/react/Slider.d.ts +24 -0
  795. package/dist/types/react/Slider.d.ts.map +1 -0
  796. package/dist/types/react/SplitPane.d.ts +26 -0
  797. package/dist/types/react/SplitPane.d.ts.map +1 -0
  798. package/dist/types/react/TabStrip.d.ts +31 -0
  799. package/dist/types/react/TabStrip.d.ts.map +1 -0
  800. package/dist/types/react/TitleTips.d.ts +15 -0
  801. package/dist/types/react/TitleTips.d.ts.map +1 -0
  802. package/dist/types/react/Tooltip.d.ts +22 -0
  803. package/dist/types/react/Tooltip.d.ts.map +1 -0
  804. package/dist/types/react/UiProvider.d.ts +52 -0
  805. package/dist/types/react/UiProvider.d.ts.map +1 -0
  806. package/dist/types/react/baseCss.d.ts +27 -0
  807. package/dist/types/react/baseCss.d.ts.map +1 -0
  808. package/dist/types/react/choiceStore.d.ts +34 -0
  809. package/dist/types/react/choiceStore.d.ts.map +1 -0
  810. package/dist/types/react/classNames.d.ts +12 -0
  811. package/dist/types/react/classNames.d.ts.map +1 -0
  812. package/dist/types/react/confirmStore.d.ts +30 -0
  813. package/dist/types/react/confirmStore.d.ts.map +1 -0
  814. package/dist/types/react/index.d.ts +33 -0
  815. package/dist/types/react/index.d.ts.map +1 -0
  816. package/dist/types/react/labels.d.ts +24 -0
  817. package/dist/types/react/labels.d.ts.map +1 -0
  818. package/dist/types/react/placement.d.ts +59 -0
  819. package/dist/types/react/placement.d.ts.map +1 -0
  820. package/dist/types/react/useFillSheet.d.ts +9 -0
  821. package/dist/types/react/useFillSheet.d.ts.map +1 -0
  822. package/dist/types/react/useFitToViewport.d.ts +20 -0
  823. package/dist/types/react/useFitToViewport.d.ts.map +1 -0
  824. package/dist/types/react/usePicked.d.ts +9 -0
  825. package/dist/types/react/usePicked.d.ts.map +1 -0
  826. package/dist/types/react/useStore.d.ts +8 -0
  827. package/dist/types/react/useStore.d.ts.map +1 -0
  828. package/dist/types/react/useViewport.d.ts +4 -0
  829. package/dist/types/react/useViewport.d.ts.map +1 -0
  830. package/dist/types/rig/PosePlayer.d.ts +64 -0
  831. package/dist/types/rig/PosePlayer.d.ts.map +1 -0
  832. package/dist/types/rig/RigView.d.ts +68 -0
  833. package/dist/types/rig/RigView.d.ts.map +1 -0
  834. package/dist/types/rig/Skeleton.d.ts +14 -0
  835. package/dist/types/rig/Skeleton.d.ts.map +1 -0
  836. package/dist/types/rig/humanoid.d.ts +4 -0
  837. package/dist/types/rig/humanoid.d.ts.map +1 -0
  838. package/dist/types/rig/humanoidPoses.d.ts +117 -0
  839. package/dist/types/rig/humanoidPoses.d.ts.map +1 -0
  840. package/dist/types/rig/poseMath.d.ts +14 -0
  841. package/dist/types/rig/poseMath.d.ts.map +1 -0
  842. package/dist/types/rig/rigTypes.d.ts +82 -0
  843. package/dist/types/rig/rigTypes.d.ts.map +1 -0
  844. package/dist/types/save/Autosaver.d.ts +43 -0
  845. package/dist/types/save/Autosaver.d.ts.map +1 -0
  846. package/dist/types/save/MemoryBackend.d.ts +10 -0
  847. package/dist/types/save/MemoryBackend.d.ts.map +1 -0
  848. package/dist/types/save/SaveBackend.d.ts +14 -0
  849. package/dist/types/save/SaveBackend.d.ts.map +1 -0
  850. package/dist/types/save/SaveStore.d.ts +73 -0
  851. package/dist/types/save/SaveStore.d.ts.map +1 -0
  852. package/dist/types/save/WebStorageBackend.d.ts +14 -0
  853. package/dist/types/save/WebStorageBackend.d.ts.map +1 -0
  854. package/dist/types/save/checksum.d.ts +7 -0
  855. package/dist/types/save/checksum.d.ts.map +1 -0
  856. package/dist/types/save/migrateSave.d.ts +17 -0
  857. package/dist/types/save/migrateSave.d.ts.map +1 -0
  858. package/dist/types/settings.d.ts +25 -0
  859. package/dist/types/settings.d.ts.map +1 -0
  860. package/dist/types/tilemap/TilemapView.d.ts +42 -0
  861. package/dist/types/tilemap/TilemapView.d.ts.map +1 -0
  862. package/dist/types/tilemap/collision.d.ts +16 -0
  863. package/dist/types/tilemap/collision.d.ts.map +1 -0
  864. package/dist/types/tilemap/tiled.d.ts +104 -0
  865. package/dist/types/tilemap/tiled.d.ts.map +1 -0
  866. package/dist/types/transitions/CrossfadeTransition.d.ts +20 -0
  867. package/dist/types/transitions/CrossfadeTransition.d.ts.map +1 -0
  868. package/dist/types/transitions/DitherWipeTransition.d.ts +35 -0
  869. package/dist/types/transitions/DitherWipeTransition.d.ts.map +1 -0
  870. package/dist/types/transitions/FadeTransition.d.ts +20 -0
  871. package/dist/types/transitions/FadeTransition.d.ts.map +1 -0
  872. package/dist/types/transitions/Letterbox.d.ts +33 -0
  873. package/dist/types/transitions/Letterbox.d.ts.map +1 -0
  874. package/dist/types/transitions/Transition.d.ts +22 -0
  875. package/dist/types/transitions/Transition.d.ts.map +1 -0
  876. package/dist/types/transitions/ditherMask.d.ts +13 -0
  877. package/dist/types/transitions/ditherMask.d.ts.map +1 -0
  878. package/dist/types/transitions/transitionTo.d.ts +16 -0
  879. package/dist/types/transitions/transitionTo.d.ts.map +1 -0
  880. package/dist/types/transitions/tweenDone.d.ts +5 -0
  881. package/dist/types/transitions/tweenDone.d.ts.map +1 -0
  882. package/dist/types/ui/Bar.d.ts +41 -0
  883. package/dist/types/ui/Bar.d.ts.map +1 -0
  884. package/dist/types/ui/Button.d.ts +47 -0
  885. package/dist/types/ui/Button.d.ts.map +1 -0
  886. package/dist/types/ui/Dialog.d.ts +47 -0
  887. package/dist/types/ui/Dialog.d.ts.map +1 -0
  888. package/dist/types/ui/FocusManager.d.ts +53 -0
  889. package/dist/types/ui/FocusManager.d.ts.map +1 -0
  890. package/dist/types/ui/Label.d.ts +24 -0
  891. package/dist/types/ui/Label.d.ts.map +1 -0
  892. package/dist/types/ui/List.d.ts +23 -0
  893. package/dist/types/ui/List.d.ts.map +1 -0
  894. package/dist/types/ui/Panel.d.ts +38 -0
  895. package/dist/types/ui/Panel.d.ts.map +1 -0
  896. package/dist/types/ui/ScrollView.d.ts +56 -0
  897. package/dist/types/ui/ScrollView.d.ts.map +1 -0
  898. package/dist/types/ui/Slider.d.ts +47 -0
  899. package/dist/types/ui/Slider.d.ts.map +1 -0
  900. package/dist/types/ui/Stack.d.ts +16 -0
  901. package/dist/types/ui/Stack.d.ts.map +1 -0
  902. package/dist/types/ui/Toggle.d.ts +31 -0
  903. package/dist/types/ui/Toggle.d.ts.map +1 -0
  904. package/dist/types/ui/UiHost.d.ts +18 -0
  905. package/dist/types/ui/UiHost.d.ts.map +1 -0
  906. package/dist/types/ui/UiPointerGate.d.ts +17 -0
  907. package/dist/types/ui/UiPointerGate.d.ts.map +1 -0
  908. package/dist/types/ui/UiRoot.d.ts +73 -0
  909. package/dist/types/ui/UiRoot.d.ts.map +1 -0
  910. package/dist/types/ui/Widget.d.ts +56 -0
  911. package/dist/types/ui/Widget.d.ts.map +1 -0
  912. package/dist/types/ui/dom/DomOverlay.d.ts +52 -0
  913. package/dist/types/ui/dom/DomOverlay.d.ts.map +1 -0
  914. package/dist/types/ui/dom/DomWorldAnchors.d.ts +50 -0
  915. package/dist/types/ui/dom/DomWorldAnchors.d.ts.map +1 -0
  916. package/dist/types/ui/dom/InputShield.d.ts +20 -0
  917. package/dist/types/ui/dom/InputShield.d.ts.map +1 -0
  918. package/dist/types/ui/dom/createStore.d.ts +22 -0
  919. package/dist/types/ui/dom/createStore.d.ts.map +1 -0
  920. package/dist/types/ui/dom/shieldDecision.d.ts +34 -0
  921. package/dist/types/ui/dom/shieldDecision.d.ts.map +1 -0
  922. package/dist/types/ui/dom/worldToScreen.d.ts +24 -0
  923. package/dist/types/ui/dom/worldToScreen.d.ts.map +1 -0
  924. package/dist/types/ui/index.d.ts +38 -0
  925. package/dist/types/ui/index.d.ts.map +1 -0
  926. package/dist/types/ui/layout/anchor.d.ts +9 -0
  927. package/dist/types/ui/layout/anchor.d.ts.map +1 -0
  928. package/dist/types/ui/layout/barDrain.d.ts +25 -0
  929. package/dist/types/ui/layout/barDrain.d.ts.map +1 -0
  930. package/dist/types/ui/layout/fitToViewport.d.ts +32 -0
  931. package/dist/types/ui/layout/fitToViewport.d.ts.map +1 -0
  932. package/dist/types/ui/layout/focusNav.d.ts +13 -0
  933. package/dist/types/ui/layout/focusNav.d.ts.map +1 -0
  934. package/dist/types/ui/layout/geometry.d.ts +35 -0
  935. package/dist/types/ui/layout/geometry.d.ts.map +1 -0
  936. package/dist/types/ui/layout/listWidth.d.ts +13 -0
  937. package/dist/types/ui/layout/listWidth.d.ts.map +1 -0
  938. package/dist/types/ui/layout/placeTooltip.d.ts +23 -0
  939. package/dist/types/ui/layout/placeTooltip.d.ts.map +1 -0
  940. package/dist/types/ui/layout/scroll.d.ts +17 -0
  941. package/dist/types/ui/layout/scroll.d.ts.map +1 -0
  942. package/dist/types/ui/layout/slider.d.ts +7 -0
  943. package/dist/types/ui/layout/slider.d.ts.map +1 -0
  944. package/dist/types/ui/layout/stack.d.ts +26 -0
  945. package/dist/types/ui/layout/stack.d.ts.map +1 -0
  946. package/dist/types/ui/layout/wrapRow.d.ts +6 -0
  947. package/dist/types/ui/layout/wrapRow.d.ts.map +1 -0
  948. package/dist/ui/Bar.js +54 -0
  949. package/dist/ui/Bar.js.map +1 -0
  950. package/dist/ui/Button.js +58 -0
  951. package/dist/ui/Button.js.map +1 -0
  952. package/dist/ui/Dialog.js +56 -0
  953. package/dist/ui/Dialog.js.map +1 -0
  954. package/dist/ui/FocusManager.js +97 -0
  955. package/dist/ui/FocusManager.js.map +1 -0
  956. package/dist/ui/Label.js +36 -0
  957. package/dist/ui/Label.js.map +1 -0
  958. package/dist/ui/List.js +45 -0
  959. package/dist/ui/List.js.map +1 -0
  960. package/dist/ui/Panel.js +38 -0
  961. package/dist/ui/Panel.js.map +1 -0
  962. package/dist/ui/ScrollView.js +96 -0
  963. package/dist/ui/ScrollView.js.map +1 -0
  964. package/dist/ui/Slider.js +55 -0
  965. package/dist/ui/Slider.js.map +1 -0
  966. package/dist/ui/Stack.js +28 -0
  967. package/dist/ui/Stack.js.map +1 -0
  968. package/dist/ui/Toggle.js +37 -0
  969. package/dist/ui/Toggle.js.map +1 -0
  970. package/dist/ui/UiHost.js +9 -0
  971. package/dist/ui/UiHost.js.map +1 -0
  972. package/dist/ui/UiPointerGate.js +25 -0
  973. package/dist/ui/UiPointerGate.js.map +1 -0
  974. package/dist/ui/UiRoot.js +93 -0
  975. package/dist/ui/UiRoot.js.map +1 -0
  976. package/dist/ui/Widget.js +90 -0
  977. package/dist/ui/Widget.js.map +1 -0
  978. package/dist/ui/dom/DomOverlay.js +59 -0
  979. package/dist/ui/dom/DomOverlay.js.map +1 -0
  980. package/dist/ui/dom/DomWorldAnchors.js +59 -0
  981. package/dist/ui/dom/DomWorldAnchors.js.map +1 -0
  982. package/dist/ui/dom/InputShield.js +27 -0
  983. package/dist/ui/dom/InputShield.js.map +1 -0
  984. package/dist/ui/dom/createStore.js +42 -0
  985. package/dist/ui/dom/createStore.js.map +1 -0
  986. package/dist/ui/dom/shieldDecision.js +36 -0
  987. package/dist/ui/dom/shieldDecision.js.map +1 -0
  988. package/dist/ui/dom/worldToScreen.js +11 -0
  989. package/dist/ui/dom/worldToScreen.js.map +1 -0
  990. package/dist/ui/layout/anchor.js +20 -0
  991. package/dist/ui/layout/anchor.js.map +1 -0
  992. package/dist/ui/layout/barDrain.js +25 -0
  993. package/dist/ui/layout/barDrain.js.map +1 -0
  994. package/dist/ui/layout/fitToViewport.js +17 -0
  995. package/dist/ui/layout/fitToViewport.js.map +1 -0
  996. package/dist/ui/layout/focusNav.js +42 -0
  997. package/dist/ui/layout/focusNav.js.map +1 -0
  998. package/dist/ui/layout/geometry.js +21 -0
  999. package/dist/ui/layout/geometry.js.map +1 -0
  1000. package/dist/ui/layout/listWidth.js +10 -0
  1001. package/dist/ui/layout/listWidth.js.map +1 -0
  1002. package/dist/ui/layout/placeTooltip.js +28 -0
  1003. package/dist/ui/layout/placeTooltip.js.map +1 -0
  1004. package/dist/ui/layout/scroll.js +24 -0
  1005. package/dist/ui/layout/scroll.js.map +1 -0
  1006. package/dist/ui/layout/slider.js +20 -0
  1007. package/dist/ui/layout/slider.js.map +1 -0
  1008. package/dist/ui/layout/stack.js +27 -0
  1009. package/dist/ui/layout/stack.js.map +1 -0
  1010. package/dist/ui/layout/wrapRow.js +13 -0
  1011. package/dist/ui/layout/wrapRow.js.map +1 -0
  1012. package/dist/ui.js +85 -0
  1013. package/dist/ui.js.map +1 -0
  1014. package/package.json +115 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Emitter.js","sources":["../../src/particles/Emitter.ts"],"sourcesContent":["import { Particle, ParticleContainer, type IParticle, type Texture } from 'pixi.js';\nimport { engineSettings } from '../settings';\nimport { inView, type CameraLike } from '../fx/viewCull';\nimport { ParticleBudget, particleBudget } from './ParticleBudget';\nimport { ParticleSim } from './ParticleSim';\nimport { sampleColor, sampleCurve, type ColorCurve, type Curve } from './particleCurves';\nimport { dueParticles, sampleRange, scaleCount, spreadAngle, type Range } from './particleSampling';\n\n/** Where a new particle appears round the emitter: a disc, or a box centred on it. */\nexport type SpawnArea = { readonly radius: number } | { readonly width: number; readonly height: number };\n\nexport interface EmitterOptions {\n /** Every particle's texture. One emitter draws one texture (a frame of an atlas works: they share a source). */\n texture: Texture;\n /** Particles this emitter may hold at once (default 256). */\n capacity?: number;\n /** Particles a second while emitting (default 0: bursts only). */\n rate?: number;\n /** Seconds a particle lives (default 1). */\n lifetime?: Range;\n /** Starting speed, px/s (default [40, 80]). */\n speed?: Range;\n /** Direction of travel in radians (default -π/2, up the screen) and how far either way it may turn (default π). */\n angle?: number;\n spread?: number;\n /** Px/s² added to velocity (default none). */\n gravityX?: number;\n gravityY?: number;\n /** Share of speed lost per second (default 0). */\n drag?: number;\n /** Scale of the texture over life (default 1), and how much each particle's size may differ (0–1, default 0). */\n size?: Curve;\n sizeVariance?: number;\n /** Opacity over life (default fading from 1 to 0). */\n alpha?: Curve;\n /** Tint over life, `0xrrggbb` (default white). */\n tint?: ColorCurve;\n /** Starting rotation and spin, radians and radians/s (default 0). */\n rotation?: Range;\n spin?: Range;\n /** 'add' for glows, sparks and fire; 'normal' for smoke and debris (default 'normal'). */\n blend?: 'normal' | 'add';\n /** Where particles appear round the emitter (default its exact point). */\n area?: SpawnArea;\n /** World px beyond the screen within which the emitter still spawns and draws (default 64). */\n cullMargin?: number;\n /** Share of particles kept under reduced effects or the battery saver (default 0.35). */\n thinFactor?: number;\n /** The budget shared with other emitters (default the engine-wide `particleBudget`). */\n budget?: ParticleBudget;\n /** Random source (default `Math.random`); a seeded one makes an emitter replayable. */\n random?: () => number;\n}\n\n/**\n * A source of smooth sprite particles for any art style: sparks, smoke, dust, magic. Particles live in world\n * coordinates, so moving the emitter (`x`, `y`) trails new ones behind it instead of dragging the old ones along.\n *\n * Drawn by one Pixi `ParticleContainer` (`view`): add it to a scene's `root`, and call `update(dt, camera)` once a\n * frame. Particle objects are pooled and their colour is written straight into Pixi's packed field, so a steady\n * emitter allocates nothing per frame. Spawning asks the shared `ParticleBudget` first, and off-screen emitters\n * neither spawn nor draw.\n */\nexport class Emitter {\n readonly view: ParticleContainer;\n x = 0;\n y = 0;\n /** Continuous emission on or off (bursts work either way). */\n emitting = false;\n private readonly sim: ParticleSim;\n private readonly pool: IParticle[] = [];\n private readonly budget: ParticleBudget;\n private readonly random: () => number;\n private readonly opts: EmitterOptions;\n private carry = 0;\n private destroyed = false;\n /** Set by the last `update`: whether the emitter's point was near the screen. */\n private near = true;\n\n constructor(options: EmitterOptions) {\n this.opts = options;\n this.sim = new ParticleSim(options.capacity ?? 256);\n this.budget = options.budget ?? particleBudget;\n this.random = options.random ?? Math.random;\n this.view = new ParticleContainer({\n texture: options.texture,\n dynamicProperties: { position: true, rotation: true, vertex: true, color: true, uvs: false },\n });\n this.view.blendMode = options.blend === 'add' ? 'add' : 'normal';\n }\n\n /** Particles alive now. */\n get live(): number {\n return this.sim.count;\n }\n\n setPosition(x: number, y: number): this {\n this.x = x;\n this.y = y;\n return this;\n }\n\n start(): this {\n this.emitting = true;\n return this;\n }\n\n /** Stops emitting; the particles in the air live out their lives. */\n stop(): this {\n this.emitting = false;\n this.carry = 0;\n return this;\n }\n\n /** `count` particles at once, at the emitter or at (x, y). Thinned under reduced effects; skipped off screen. */\n burst(count: number, x = this.x, y = this.y): void {\n if (this.destroyed || !this.near) return;\n this.emit(scaleCount(count, this.thin(), this.random()), x, y);\n }\n\n /** Advances by `dt` seconds. Pass the camera to skip spawning and drawing while everything is off screen. */\n update(dt: number, camera?: CameraLike): void {\n if (this.destroyed) return;\n const margin = this.opts.cullMargin ?? 64;\n this.near = camera ? inView(camera, this.x, this.y, margin) : true;\n const rate = this.opts.rate ?? 0;\n if (this.emitting && rate > 0 && this.near) {\n const due = dueParticles(rate * this.thin(), dt, this.carry);\n const n = Math.floor(due);\n this.carry = due - n;\n if (n > 0) this.emit(n, this.x, this.y);\n } else this.carry = 0;\n const o = this.opts;\n const died = this.sim.step(dt, o.gravityX ?? 0, o.gravityY ?? 0, o.drag ?? 0);\n if (died > 0) this.budget.give(died);\n this.draw(camera, margin);\n }\n\n /** Every particle gone at once (a scene change, a cancelled effect). */\n clear(): void {\n this.budget.give(this.sim.clear());\n this.draw(undefined, 0);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.clear();\n this.destroyed = true;\n this.pool.length = 0;\n this.view.destroy();\n }\n\n private thin(): number {\n const s = engineSettings.getState();\n return s.reducedFx || s.batterySaver ? (this.opts.thinFactor ?? 0.35) : 1;\n }\n\n private emit(n: number, x: number, y: number): void {\n const sim = this.sim;\n const granted = this.budget.take(Math.min(n, sim.capacity - sim.count));\n const o = this.opts;\n const r = this.random;\n const base = o.angle ?? -Math.PI / 2;\n const spread = o.spread ?? Math.PI;\n for (let k = 0; k < granted; k++) {\n let px = x;\n let py = y;\n const area = o.area;\n if (area && 'radius' in area) {\n // the square root spreads them evenly over the disc instead of crowding the centre\n const d = Math.sqrt(r()) * area.radius;\n const a = r() * Math.PI * 2;\n px += Math.cos(a) * d;\n py += Math.sin(a) * d;\n } else if (area) {\n px += (r() - 0.5) * area.width;\n py += (r() - 0.5) * area.height;\n }\n const a = spreadAngle(base, spread, r());\n const v = sampleRange(o.speed ?? [40, 80], r());\n sim.spawn(px, py, Math.cos(a) * v, Math.sin(a) * v, sampleRange(o.lifetime ?? 1, r()), sampleRange(o.rotation ?? 0, r()), sampleRange(o.spin ?? 0, r()), r());\n }\n }\n\n private draw(camera: CameraLike | undefined, margin: number): void {\n const sim = this.sim;\n const list = this.view.particleChildren;\n if (list.length !== sim.count) {\n while (list.length < sim.count) list.push(this.pool.pop() ?? new Particle({ texture: this.opts.texture, anchorX: 0.5, anchorY: 0.5 }));\n while (list.length > sim.count) this.pool.push(list.pop()!);\n this.view.update();\n }\n const o = this.opts;\n const size = o.size ?? 1;\n const alpha = o.alpha ?? FADE_OUT;\n const tint = o.tint ?? 0xffffff;\n const variance = o.sizeVariance ?? 0;\n let anyIn = sim.count === 0;\n for (let i = 0; i < sim.count; i++) {\n const p = list[i]!;\n const t = sim.progress(i);\n const x = sim.x[i]!;\n const y = sim.y[i]!;\n p.x = x;\n p.y = y;\n p.rotation = sim.rot[i]!;\n const s = sampleCurve(size, t) * (1 + (sim.seed[i]! * 2 - 1) * variance);\n p.scaleX = s;\n p.scaleY = s;\n const c = sampleColor(tint, t);\n const al = Math.min(1, Math.max(0, sampleCurve(alpha, t)));\n // Pixi's packed field (BGR plus alpha in the top byte), written directly: the tint setter parses a colour each time\n p.color = (((c & 0xff) << 16) | (c & 0xff00) | ((c >> 16) & 0xff)) + (((al * 255) | 0) << 24);\n if (!anyIn && (!camera || inView(camera, x, y, margin))) anyIn = true;\n }\n this.view.visible = anyIn && sim.count > 0;\n }\n}\n\nconst FADE_OUT: Curve = { start: 1, end: 0 };\n"],"names":["Emitter","options","ParticleSim","particleBudget","ParticleContainer","x","y","count","scaleCount","dt","camera","margin","inView","rate","due","dueParticles","n","o","died","s","engineSettings","sim","granted","r","base","spread","k","px","py","area","d","a","spreadAngle","v","sampleRange","list","Particle","size","alpha","FADE_OUT","tint","variance","anyIn","i","p","t","sampleCurve","c","sampleColor","al"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { engineSettings as i } from "../settings.js";
2
+ class s {
3
+ constructor(t = 4e3, e = 0.35) {
4
+ this.limit = t, this.thinFactor = e;
5
+ }
6
+ limit;
7
+ thinFactor;
8
+ used = 0;
9
+ /** The limit as the settings stand now. */
10
+ get effectiveLimit() {
11
+ const t = i.getState();
12
+ return t.reducedFx || t.batterySaver ? Math.floor(this.limit * this.thinFactor) : this.limit;
13
+ }
14
+ get live() {
15
+ return this.used;
16
+ }
17
+ /** Reserves up to `n` particles and returns how many were granted (0 when the budget is spent). */
18
+ take(t) {
19
+ const e = Math.max(0, Math.min(t, this.effectiveLimit - this.used));
20
+ return this.used += e, e;
21
+ }
22
+ /** Returns `n` particles that died or were cleared. */
23
+ give(t) {
24
+ this.used = Math.max(0, this.used - t);
25
+ }
26
+ }
27
+ const a = new s();
28
+ export {
29
+ s as ParticleBudget,
30
+ a as particleBudget
31
+ };
32
+ //# sourceMappingURL=ParticleBudget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticleBudget.js","sources":["../../src/particles/ParticleBudget.ts"],"sourcesContent":["import { engineSettings } from '../settings';\n\n/**\n * Particles alive across every emitter that shares this budget. An emitter asks before it spawns and gives back as\n * its particles die, so a crowd of emitters at once costs no more than `limit`: ten explosions in one frame share the\n * budget instead of adding up to a frame the GPU cannot finish. Under reduced effects or the battery saver the limit\n * shrinks by `thinFactor`.\n */\nexport class ParticleBudget {\n private used = 0;\n\n constructor(\n /** Particles alive at once, for every emitter together. */\n public limit = 4000,\n /** The share of `limit` left under reduced effects or the battery saver. */\n public thinFactor = 0.35,\n ) {}\n\n /** The limit as the settings stand now. */\n get effectiveLimit(): number {\n const s = engineSettings.getState();\n return s.reducedFx || s.batterySaver ? Math.floor(this.limit * this.thinFactor) : this.limit;\n }\n\n get live(): number {\n return this.used;\n }\n\n /** Reserves up to `n` particles and returns how many were granted (0 when the budget is spent). */\n take(n: number): number {\n const granted = Math.max(0, Math.min(n, this.effectiveLimit - this.used));\n this.used += granted;\n return granted;\n }\n\n /** Returns `n` particles that died or were cleared. */\n give(n: number): void {\n this.used = Math.max(0, this.used - n);\n }\n}\n\n/** The budget every emitter shares unless it is handed its own. */\nexport const particleBudget = new ParticleBudget();\n"],"names":["ParticleBudget","limit","thinFactor","s","engineSettings","n","granted","particleBudget"],"mappings":";AAQO,MAAMA,EAAe;AAAA,EAG1B,YAESC,IAAQ,KAERC,IAAa,MACpB;AAHO,SAAA,QAAAD,GAEA,KAAA,aAAAC;AAAA,EACN;AAAA,EAHM;AAAA,EAEA;AAAA,EAND,OAAO;AAAA;AAAA,EAUf,IAAI,iBAAyB;AAC3B,UAAMC,IAAIC,EAAe,SAAA;AACzB,WAAOD,EAAE,aAAaA,EAAE,eAAe,KAAK,MAAM,KAAK,QAAQ,KAAK,UAAU,IAAI,KAAK;AAAA,EACzF;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,KAAKE,GAAmB;AACtB,UAAMC,IAAU,KAAK,IAAI,GAAG,KAAK,IAAID,GAAG,KAAK,iBAAiB,KAAK,IAAI,CAAC;AACxE,gBAAK,QAAQC,GACNA;AAAA,EACT;AAAA;AAAA,EAGA,KAAKD,GAAiB;AACpB,SAAK,OAAO,KAAK,IAAI,GAAG,KAAK,OAAOA,CAAC;AAAA,EACvC;AACF;AAGO,MAAME,IAAiB,IAAIP,EAAA;"}
@@ -0,0 +1,60 @@
1
+ class y {
2
+ constructor(t) {
3
+ this.capacity = t, this.x = new Float32Array(t), this.y = new Float32Array(t), this.vx = new Float32Array(t), this.vy = new Float32Array(t), this.age = new Float32Array(t), this.life = new Float32Array(t), this.rot = new Float32Array(t), this.spin = new Float32Array(t), this.seed = new Float32Array(t);
4
+ }
5
+ capacity;
6
+ x;
7
+ y;
8
+ vx;
9
+ vy;
10
+ age;
11
+ life;
12
+ rot;
13
+ spin;
14
+ /** A random draw per particle (0–1), fixed for its life: size variance, flicker phase. */
15
+ seed;
16
+ count = 0;
17
+ /** Adds a particle; returns its index, or -1 when the sim is full. `life` is in seconds. */
18
+ spawn(t, i, l, r, e, n, s, o) {
19
+ if (this.count >= this.capacity) return -1;
20
+ const h = this.count++;
21
+ return this.x[h] = t, this.y[h] = i, this.vx[h] = l, this.vy[h] = r, this.age[h] = 0, this.life[h] = e > 0 ? e : 1e-3, this.rot[h] = n, this.spin[h] = s, this.seed[h] = o, h;
22
+ }
23
+ /**
24
+ * Advances every particle by `dt` seconds: gravity (px/s²) added to velocity, then drag, then position. Drag is
25
+ * the share of speed lost per second, applied as `exp(-drag × dt)` so it is the same at any frame rate. Returns how
26
+ * many particles died this step.
27
+ */
28
+ step(t, i, l, r) {
29
+ const e = r > 0 ? Math.exp(-r * t) : 1;
30
+ let n = 0, s = 0;
31
+ for (; s < this.count; ) {
32
+ const o = this.age[s] + t;
33
+ if (o >= this.life[s]) {
34
+ this.removeAt(s), n++;
35
+ continue;
36
+ }
37
+ this.age[s] = o;
38
+ const h = (this.vx[s] + i * t) * e, a = (this.vy[s] + l * t) * e;
39
+ this.vx[s] = h, this.vy[s] = a, this.x[s] = this.x[s] + h * t, this.y[s] = this.y[s] + a * t, this.rot[s] = this.rot[s] + this.spin[s] * t, s++;
40
+ }
41
+ return n;
42
+ }
43
+ /** The share of its life particle `i` has lived (0–1). */
44
+ progress(t) {
45
+ return this.age[t] / this.life[t];
46
+ }
47
+ /** Every particle gone; returns how many there were. */
48
+ clear() {
49
+ const t = this.count;
50
+ return this.count = 0, t;
51
+ }
52
+ removeAt(t) {
53
+ const i = --this.count;
54
+ t !== i && (this.x[t] = this.x[i], this.y[t] = this.y[i], this.vx[t] = this.vx[i], this.vy[t] = this.vy[i], this.age[t] = this.age[i], this.life[t] = this.life[i], this.rot[t] = this.rot[i], this.spin[t] = this.spin[i], this.seed[t] = this.seed[i]);
55
+ }
56
+ }
57
+ export {
58
+ y as ParticleSim
59
+ };
60
+ //# sourceMappingURL=ParticleSim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParticleSim.js","sources":["../../src/particles/ParticleSim.ts"],"sourcesContent":["/**\n * The particles of one emitter as flat typed arrays (structure of arrays): position, velocity, age and lifetime,\n * rotation and spin, and a per-particle random draw the curves can use. Pure, no Pixi: the emitter draws what this\n * holds, and tests step it under node.\n *\n * Live particles are packed at indices `0 … count - 1`. A particle that dies is replaced by the last live one, so a\n * step never leaves holes and never allocates; the order of particles is therefore not stable, which drawing does\n * not need (every live index is written again each frame).\n */\nexport class ParticleSim {\n readonly x: Float32Array;\n readonly y: Float32Array;\n readonly vx: Float32Array;\n readonly vy: Float32Array;\n readonly age: Float32Array;\n readonly life: Float32Array;\n readonly rot: Float32Array;\n readonly spin: Float32Array;\n /** A random draw per particle (0–1), fixed for its life: size variance, flicker phase. */\n readonly seed: Float32Array;\n count = 0;\n\n constructor(readonly capacity: number) {\n this.x = new Float32Array(capacity);\n this.y = new Float32Array(capacity);\n this.vx = new Float32Array(capacity);\n this.vy = new Float32Array(capacity);\n this.age = new Float32Array(capacity);\n this.life = new Float32Array(capacity);\n this.rot = new Float32Array(capacity);\n this.spin = new Float32Array(capacity);\n this.seed = new Float32Array(capacity);\n }\n\n /** Adds a particle; returns its index, or -1 when the sim is full. `life` is in seconds. */\n spawn(x: number, y: number, vx: number, vy: number, life: number, rot: number, spin: number, seed: number): number {\n if (this.count >= this.capacity) return -1;\n const i = this.count++;\n this.x[i] = x;\n this.y[i] = y;\n this.vx[i] = vx;\n this.vy[i] = vy;\n this.age[i] = 0;\n this.life[i] = life > 0 ? life : 1e-3;\n this.rot[i] = rot;\n this.spin[i] = spin;\n this.seed[i] = seed;\n return i;\n }\n\n /**\n * Advances every particle by `dt` seconds: gravity (px/s²) added to velocity, then drag, then position. Drag is\n * the share of speed lost per second, applied as `exp(-drag × dt)` so it is the same at any frame rate. Returns how\n * many particles died this step.\n */\n step(dt: number, gravityX: number, gravityY: number, drag: number): number {\n const damp = drag > 0 ? Math.exp(-drag * dt) : 1;\n let died = 0;\n let i = 0;\n while (i < this.count) {\n const age = this.age[i]! + dt;\n if (age >= this.life[i]!) {\n this.removeAt(i);\n died++;\n continue; // the particle moved into `i` has not stepped yet\n }\n this.age[i] = age;\n const vx = (this.vx[i]! + gravityX * dt) * damp;\n const vy = (this.vy[i]! + gravityY * dt) * damp;\n this.vx[i] = vx;\n this.vy[i] = vy;\n this.x[i] = this.x[i]! + vx * dt;\n this.y[i] = this.y[i]! + vy * dt;\n this.rot[i] = this.rot[i]! + this.spin[i]! * dt;\n i++;\n }\n return died;\n }\n\n /** The share of its life particle `i` has lived (0–1). */\n progress(i: number): number {\n return this.age[i]! / this.life[i]!;\n }\n\n /** Every particle gone; returns how many there were. */\n clear(): number {\n const n = this.count;\n this.count = 0;\n return n;\n }\n\n private removeAt(i: number): void {\n const last = --this.count;\n if (i === last) return;\n this.x[i] = this.x[last]!;\n this.y[i] = this.y[last]!;\n this.vx[i] = this.vx[last]!;\n this.vy[i] = this.vy[last]!;\n this.age[i] = this.age[last]!;\n this.life[i] = this.life[last]!;\n this.rot[i] = this.rot[last]!;\n this.spin[i] = this.spin[last]!;\n this.seed[i] = this.seed[last]!;\n }\n}\n"],"names":["ParticleSim","capacity","x","y","vx","vy","life","rot","spin","seed","i","dt","gravityX","gravityY","drag","damp","died","age","n","last"],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ function u(n, t) {
2
+ if (typeof n == "number") return n;
3
+ if (!p(n)) return n.start + (n.end - n.start) * l(t);
4
+ const f = n.length;
5
+ if (f === 0) return 0;
6
+ const i = n[0];
7
+ if (t <= i[0]) return i[1];
8
+ for (let r = 1; r < f; r++) {
9
+ const o = n[r];
10
+ if (t <= o[0]) {
11
+ const s = n[r - 1], e = o[0] - s[0];
12
+ return e <= 0 ? o[1] : s[1] + (o[1] - s[1]) * ((t - s[0]) / e);
13
+ }
14
+ }
15
+ return n[f - 1][1];
16
+ }
17
+ function d(n, t) {
18
+ if (typeof n == "number") return n;
19
+ if (!p(n)) return a(n.start, n.end, l(t));
20
+ const f = n.length;
21
+ if (f === 0) return 16777215;
22
+ const i = n[0];
23
+ if (t <= i[0]) return i[1];
24
+ for (let r = 1; r < f; r++) {
25
+ const o = n[r];
26
+ if (t <= o[0]) {
27
+ const s = n[r - 1], e = o[0] - s[0];
28
+ return e <= 0 ? o[1] : a(s[1], o[1], (t - s[0]) / e);
29
+ }
30
+ }
31
+ return n[f - 1][1];
32
+ }
33
+ function a(n, t, f) {
34
+ const i = l(f), r = Math.round((n >> 16 & 255) + ((t >> 16 & 255) - (n >> 16 & 255)) * i), o = Math.round((n >> 8 & 255) + ((t >> 8 & 255) - (n >> 8 & 255)) * i), s = Math.round((n & 255) + ((t & 255) - (n & 255)) * i);
35
+ return r << 16 | o << 8 | s;
36
+ }
37
+ function p(n) {
38
+ return Array.isArray(n);
39
+ }
40
+ function l(n) {
41
+ return n < 0 ? 0 : n > 1 ? 1 : n;
42
+ }
43
+ export {
44
+ a as lerpColor,
45
+ d as sampleColor,
46
+ u as sampleCurve
47
+ };
48
+ //# sourceMappingURL=particleCurves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particleCurves.js","sources":["../../src/particles/particleCurves.ts"],"sourcesContent":["/**\n * Values that change over a particle's life, sampled at `t` from 0 (born) to 1 (gone). A curve is one of:\n *\n * - a number: the same the whole life;\n * - `{ start, end }`: a straight line between the two;\n * - keyframes `[[t, value], …]` sorted by `t`: straight lines between them, held flat before the first and after\n * the last (a puff that swells fast then fades slowly is three keys, not a custom function).\n *\n * Pure and allocation-free: an emitter samples three curves per particle per frame.\n */\nexport type Curve = number | { readonly start: number; readonly end: number } | readonly (readonly [t: number, value: number])[];\n\n/** The same three shapes for colours (`0xrrggbb`), blended channel by channel. */\nexport type ColorCurve = Curve;\n\nexport function sampleCurve(curve: Curve, t: number): number {\n if (typeof curve === 'number') return curve;\n if (!isKeys(curve)) return curve.start + (curve.end - curve.start) * clamp01(t);\n const n = curve.length;\n if (n === 0) return 0;\n const first = curve[0]!;\n if (t <= first[0]) return first[1];\n for (let i = 1; i < n; i++) {\n const b = curve[i]!;\n if (t <= b[0]) {\n const a = curve[i - 1]!;\n const span = b[0] - a[0];\n return span <= 0 ? b[1] : a[1] + (b[1] - a[1]) * ((t - a[0]) / span);\n }\n }\n return curve[n - 1]![1];\n}\n\nexport function sampleColor(curve: ColorCurve, t: number): number {\n if (typeof curve === 'number') return curve;\n if (!isKeys(curve)) return lerpColor(curve.start, curve.end, clamp01(t));\n const n = curve.length;\n if (n === 0) return 0xffffff;\n const first = curve[0]!;\n if (t <= first[0]) return first[1];\n for (let i = 1; i < n; i++) {\n const b = curve[i]!;\n if (t <= b[0]) {\n const a = curve[i - 1]!;\n const span = b[0] - a[0];\n return span <= 0 ? b[1] : lerpColor(a[1], b[1], (t - a[0]) / span);\n }\n }\n return curve[n - 1]![1];\n}\n\n/** Two `0xrrggbb` colours mixed per channel, each channel rounded to a whole value. */\nexport function lerpColor(a: number, b: number, t: number): number {\n const k = clamp01(t);\n const r = Math.round(((a >> 16) & 0xff) + (((b >> 16) & 0xff) - ((a >> 16) & 0xff)) * k);\n const g = Math.round(((a >> 8) & 0xff) + (((b >> 8) & 0xff) - ((a >> 8) & 0xff)) * k);\n const bl = Math.round((a & 0xff) + ((b & 0xff) - (a & 0xff)) * k);\n return (r << 16) | (g << 8) | bl;\n}\n\nfunction isKeys(c: Exclude<Curve, number>): c is readonly (readonly [number, number])[] {\n return Array.isArray(c);\n}\n\nfunction clamp01(t: number): number {\n return t < 0 ? 0 : t > 1 ? 1 : t;\n}\n"],"names":["sampleCurve","curve","isKeys","clamp01","n","first","i","b","a","span","sampleColor","lerpColor","t","k","g","bl","c"],"mappings":"AAeO,SAASA,EAAYC,GAAc,GAAmB;AAC3D,MAAI,OAAOA,KAAU,SAAU,QAAOA;AACtC,MAAI,CAACC,EAAOD,CAAK,EAAG,QAAOA,EAAM,SAASA,EAAM,MAAMA,EAAM,SAASE,EAAQ,CAAC;AAC9E,QAAMC,IAAIH,EAAM;AAChB,MAAIG,MAAM,EAAG,QAAO;AACpB,QAAMC,IAAQJ,EAAM,CAAC;AACrB,MAAI,KAAKI,EAAM,CAAC,EAAG,QAAOA,EAAM,CAAC;AACjC,WAASC,IAAI,GAAGA,IAAIF,GAAGE,KAAK;AAC1B,UAAMC,IAAIN,EAAMK,CAAC;AACjB,QAAI,KAAKC,EAAE,CAAC,GAAG;AACb,YAAMC,IAAIP,EAAMK,IAAI,CAAC,GACfG,IAAOF,EAAE,CAAC,IAAIC,EAAE,CAAC;AACvB,aAAOC,KAAQ,IAAIF,EAAE,CAAC,IAAIC,EAAE,CAAC,KAAKD,EAAE,CAAC,IAAIC,EAAE,CAAC,OAAO,IAAIA,EAAE,CAAC,KAAKC;AAAA,IACjE;AAAA,EACF;AACA,SAAOR,EAAMG,IAAI,CAAC,EAAG,CAAC;AACxB;AAEO,SAASM,EAAYT,GAAmB,GAAmB;AAChE,MAAI,OAAOA,KAAU,SAAU,QAAOA;AACtC,MAAI,CAACC,EAAOD,CAAK,EAAG,QAAOU,EAAUV,EAAM,OAAOA,EAAM,KAAKE,EAAQ,CAAC,CAAC;AACvE,QAAMC,IAAIH,EAAM;AAChB,MAAIG,MAAM,EAAG,QAAO;AACpB,QAAMC,IAAQJ,EAAM,CAAC;AACrB,MAAI,KAAKI,EAAM,CAAC,EAAG,QAAOA,EAAM,CAAC;AACjC,WAASC,IAAI,GAAGA,IAAIF,GAAGE,KAAK;AAC1B,UAAMC,IAAIN,EAAMK,CAAC;AACjB,QAAI,KAAKC,EAAE,CAAC,GAAG;AACb,YAAMC,IAAIP,EAAMK,IAAI,CAAC,GACfG,IAAOF,EAAE,CAAC,IAAIC,EAAE,CAAC;AACvB,aAAOC,KAAQ,IAAIF,EAAE,CAAC,IAAII,EAAUH,EAAE,CAAC,GAAGD,EAAE,CAAC,IAAI,IAAIC,EAAE,CAAC,KAAKC,CAAI;AAAA,IACnE;AAAA,EACF;AACA,SAAOR,EAAMG,IAAI,CAAC,EAAG,CAAC;AACxB;AAGO,SAASO,EAAUH,GAAWD,GAAWK,GAAmB;AACjE,QAAMC,IAAIV,EAAQS,CAAC,GACb,IAAI,KAAK,OAAQJ,KAAK,KAAM,SAAWD,KAAK,KAAM,QAAUC,KAAK,KAAM,QAASK,CAAC,GACjFC,IAAI,KAAK,OAAQN,KAAK,IAAK,SAAWD,KAAK,IAAK,QAAUC,KAAK,IAAK,QAASK,CAAC,GAC9EE,IAAK,KAAK,OAAOP,IAAI,SAAUD,IAAI,QAASC,IAAI,QAASK,CAAC;AAChE,SAAQ,KAAK,KAAOC,KAAK,IAAKC;AAChC;AAEA,SAASb,EAAOc,GAAwE;AACtF,SAAO,MAAM,QAAQA,CAAC;AACxB;AAEA,SAASb,EAAQS,GAAmB;AAClC,SAAOA,IAAI,IAAI,IAAIA,IAAI,IAAI,IAAIA;AACjC;"}
@@ -0,0 +1,30 @@
1
+ function o(n, e) {
2
+ return typeof n == "number" ? n : n[0] + (n[1] - n[0]) * e;
3
+ }
4
+ function i(n, e, t) {
5
+ return n + (t * 2 - 1) * e;
6
+ }
7
+ function l(n, e, t) {
8
+ return !(n > 0) || !(e > 0) ? t : t + n * e;
9
+ }
10
+ function f(n, e, t) {
11
+ if (e >= 1) return n;
12
+ const u = n * Math.max(0, e), r = Math.floor(u);
13
+ return r + (t < u - r ? 1 : 0);
14
+ }
15
+ function s(n) {
16
+ let e = n >>> 0;
17
+ return () => {
18
+ e = e + 1831565813 >>> 0;
19
+ let t = e;
20
+ return t = Math.imul(t ^ t >>> 15, t | 1), t ^= t + Math.imul(t ^ t >>> 7, t | 61), ((t ^ t >>> 14) >>> 0) / 4294967296;
21
+ };
22
+ }
23
+ export {
24
+ l as dueParticles,
25
+ o as sampleRange,
26
+ f as scaleCount,
27
+ s as seededRandom,
28
+ i as spreadAngle
29
+ };
30
+ //# sourceMappingURL=particleSampling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"particleSampling.js","sources":["../../src/particles/particleSampling.ts"],"sourcesContent":["/** A number picked at random between two (inclusive of the first), or a fixed one. */\nexport type Range = number | readonly [min: number, max: number];\n\n/** A value of `range` for one random draw `r` in [0, 1). */\nexport function sampleRange(range: Range, r: number): number {\n if (typeof range === 'number') return range;\n return range[0] + (range[1] - range[0]) * r;\n}\n\n/** `base` turned by up to `spread` either way: `r` 0 gives `base - spread`, 0.5 gives `base`. */\nexport function spreadAngle(base: number, spread: number, r: number): number {\n return base + (r * 2 - 1) * spread;\n}\n\n/**\n * Whole particles due after `dt` seconds at `rate` a second, given the fraction `carry` left over from before. Kept\n * as a fraction rather than rounded each frame, or 30 a second at 144 fps (0.21 a frame) would emit none at all.\n * Returns the count in the integer part and the new carry in the fraction: `n = Math.floor(v)`, `carry = v - n`.\n */\nexport function dueParticles(rate: number, dt: number, carry: number): number {\n if (!(rate > 0) || !(dt > 0)) return carry;\n return carry + rate * dt;\n}\n\n/**\n * `n` scaled by `factor` (reduced effects), rounded at random so a burst of 3 at 0.35 still gives one particle about\n * every time rather than never: the expected count stays `n × factor`.\n */\nexport function scaleCount(n: number, factor: number, r: number): number {\n if (factor >= 1) return n;\n const v = n * Math.max(0, factor);\n const whole = Math.floor(v);\n return whole + (r < v - whole ? 1 : 0);\n}\n\n/** A small seedable generator (mulberry32) for tests and replays; the emitter takes any `() => number`. */\nexport function seededRandom(seed: number): () => number {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) >>> 0;\n let t = s;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n"],"names":["sampleRange","range","r","spreadAngle","base","spread","dueParticles","rate","dt","carry","scaleCount","factor","v","whole","seededRandom","seed","s"],"mappings":"AAIO,SAASA,EAAYC,GAAcC,GAAmB;AAC3D,SAAI,OAAOD,KAAU,WAAiBA,IAC/BA,EAAM,CAAC,KAAKA,EAAM,CAAC,IAAIA,EAAM,CAAC,KAAKC;AAC5C;AAGO,SAASC,EAAYC,GAAcC,GAAgBH,GAAmB;AAC3E,SAAOE,KAAQF,IAAI,IAAI,KAAKG;AAC9B;AAOO,SAASC,EAAaC,GAAcC,GAAYC,GAAuB;AAC5E,SAAI,EAAEF,IAAO,MAAM,EAAEC,IAAK,KAAWC,IAC9BA,IAAQF,IAAOC;AACxB;AAMO,SAASE,EAAW,GAAWC,GAAgBT,GAAmB;AACvE,MAAIS,KAAU,EAAG,QAAO;AACxB,QAAMC,IAAI,IAAI,KAAK,IAAI,GAAGD,CAAM,GAC1BE,IAAQ,KAAK,MAAMD,CAAC;AAC1B,SAAOC,KAASX,IAAIU,IAAIC,IAAQ,IAAI;AACtC;AAGO,SAASC,EAAaC,GAA4B;AACvD,MAAIC,IAAID,MAAS;AACjB,SAAO,MAAM;AACX,IAAAC,IAAKA,IAAI,eAAgB;AACzB,QAAI,IAAIA;AACR,eAAI,KAAK,KAAK,IAAK,MAAM,IAAK,IAAI,CAAC,GACnC,KAAK,IAAI,KAAK,KAAK,IAAK,MAAM,GAAI,IAAI,EAAE,KAC/B,IAAK,MAAM,QAAS,KAAK;AAAA,EACpC;AACF;"}
@@ -0,0 +1,202 @@
1
+ import { MAX_POLYGON_VERTICES as l, polygonData as c } from "./polygon.js";
2
+ let f = 1;
3
+ class p {
4
+ id = f++;
5
+ type;
6
+ shape;
7
+ x;
8
+ y;
9
+ /** Position at the start of the last world step: draw at `prev + (current - prev) × alpha`. */
10
+ prevX;
11
+ prevY;
12
+ vx;
13
+ vy;
14
+ /** Radians, clockwise on screen. */
15
+ angle;
16
+ /** Angle at the start of the last world step, for drawing between steps like `prevX`. */
17
+ prevAngle;
18
+ /** Radians per second. */
19
+ angularVelocity;
20
+ /** Contacts and torques turn it (`BodyOptions.rotates`). */
21
+ rotates;
22
+ /** Turning lost per second, as a share. */
23
+ angularDamping;
24
+ /** Torque gathered for the next step, cleared after it. */
25
+ torque = 0;
26
+ /** Moment of inertia about the centre (mass × px²); infinite for a body that does not rotate. */
27
+ inertia;
28
+ invInertia;
29
+ /** Force gathered for the next step (px·mass/s²), cleared after it. */
30
+ fx = 0;
31
+ fy = 0;
32
+ mass;
33
+ invMass;
34
+ restitution;
35
+ friction;
36
+ linearDamping;
37
+ gravityScale;
38
+ sensor;
39
+ layer;
40
+ mask;
41
+ userData;
42
+ /** Box faces lying against more solid ground (`FACE_*` bits): never a contact normal, so seams do not snag. */
43
+ internalFaces = 0;
44
+ /** A sleeping body is not integrated and is treated as immovable until something wakes it. */
45
+ awake = !0;
46
+ /** Seconds spent below the world's sleep speed. */
47
+ restTime = 0;
48
+ /** Standing on something: a solid contact whose normal points up at this body (refreshed every step). */
49
+ grounded = !1;
50
+ /** What it stands on, while grounded. */
51
+ ground = null;
52
+ groundNx = 0;
53
+ groundNy = 0;
54
+ // bounds, refreshed by `updateBounds`
55
+ minX = 0;
56
+ minY = 0;
57
+ maxX = 0;
58
+ maxY = 0;
59
+ /** @internal cosine and sine of `angle`, refreshed by `updateBounds`. */
60
+ cos = 1;
61
+ sin = 0;
62
+ /** @internal corners and outward face normals in world space (boxes and polygons), refreshed by `updateBounds`. */
63
+ wx = new Float64Array(l);
64
+ wy = new Float64Array(l);
65
+ wnx = new Float64Array(l);
66
+ wny = new Float64Array(l);
67
+ /** @internal how many of the above are in use (0 for a circle). */
68
+ corners = 0;
69
+ /** @internal set by the world that holds it. */
70
+ inWorld = !1;
71
+ /** @internal last ray that tested this body, so a ray crossing many cells tests it once. */
72
+ rayStamp = 0;
73
+ constructor(t) {
74
+ this.type = t.type ?? "dynamic", this.shape = t.shape, this.x = this.prevX = t.x ?? 0, this.y = this.prevY = t.y ?? 0, this.vx = t.vx ?? 0, this.vy = t.vy ?? 0, this.angle = this.prevAngle = t.angle ?? 0, this.angularVelocity = t.angularVelocity ?? 0, this.angularDamping = t.angularDamping ?? 0.05;
75
+ const i = t.mass ?? 1;
76
+ if (this.type === "dynamic" && !(i > 0)) throw new Error(`Body: a dynamic body needs a positive mass, got ${i}`);
77
+ this.mass = this.type === "dynamic" ? i : 1 / 0, this.invMass = this.type === "dynamic" ? 1 / i : 0, this.rotates = t.rotates === !0 && this.type !== "static";
78
+ const s = this.rotates && this.type === "dynamic";
79
+ this.inertia = s ? i * w(this.shape) : 1 / 0, this.invInertia = s ? 1 / this.inertia : 0, this.restitution = t.restitution ?? 0, this.friction = t.friction ?? 0.5, this.linearDamping = t.linearDamping ?? 0, this.gravityScale = t.gravityScale ?? 1, this.sensor = t.sensor ?? !1, this.layer = t.layer ?? 1, this.mask = t.mask ?? 4294967295, this.userData = t.userData, this.updateBounds();
80
+ }
81
+ get isDynamic() {
82
+ return this.type === "dynamic";
83
+ }
84
+ get isStatic() {
85
+ return this.type === "static";
86
+ }
87
+ /** Moves by itself this step: an awake dynamic body or any kinematic one. */
88
+ get moving() {
89
+ return this.type === "kinematic" || this.type === "dynamic" && this.awake;
90
+ }
91
+ /** Inverse mass as the solver sees it: a sleeping body holds still like ground. */
92
+ get solverInvMass() {
93
+ return this.awake ? this.invMass : 0;
94
+ }
95
+ /** The smallest half size of the shape: how far it may move in one sub-step without passing through anything. */
96
+ get minHalfExtent() {
97
+ const t = this.shape;
98
+ return t.kind === "circle" ? t.radius : t.kind === "box" ? Math.min(t.halfWidth, t.halfHeight) : c(t).inradius;
99
+ }
100
+ /** The furthest the shape reaches from the centre: how far a corner sweeps as the body turns. */
101
+ get maxExtent() {
102
+ const t = this.shape;
103
+ return t.kind === "circle" ? t.radius : t.kind === "box" ? Math.hypot(t.halfWidth, t.halfHeight) : c(t).radius;
104
+ }
105
+ /** A box at no angle: the cheap axis-aligned tests apply to it. */
106
+ get axisAligned() {
107
+ return this.shape.kind === "box" && this.angle === 0;
108
+ }
109
+ updateBounds() {
110
+ const t = this.shape;
111
+ if (t.kind === "circle") {
112
+ this.cos = Math.cos(this.angle), this.sin = Math.sin(this.angle), this.corners = 0, this.minX = this.x - t.radius, this.maxX = this.x + t.radius, this.minY = this.y - t.radius, this.maxY = this.y + t.radius;
113
+ return;
114
+ }
115
+ if (t.kind === "box" && this.angle === 0) {
116
+ this.cos = 1, this.sin = 0, this.setBoxCorners(t.halfWidth, t.halfHeight), this.minX = this.x - t.halfWidth, this.maxX = this.x + t.halfWidth, this.minY = this.y - t.halfHeight, this.maxY = this.y + t.halfHeight;
117
+ return;
118
+ }
119
+ const i = this.cos = Math.cos(this.angle), s = this.sin = Math.sin(this.angle);
120
+ if (t.kind === "box") this.setBoxCorners(t.halfWidth, t.halfHeight);
121
+ else {
122
+ const h = c(t);
123
+ this.corners = h.vertices.length;
124
+ for (let n = 0; n < h.vertices.length; n++)
125
+ this.wx[n] = h.vertices[n].x, this.wy[n] = h.vertices[n].y, this.wnx[n] = h.normals[n].x, this.wny[n] = h.normals[n].y;
126
+ }
127
+ let e = 1 / 0, o = 1 / 0, u = -1 / 0, x = -1 / 0;
128
+ for (let h = 0; h < this.corners; h++) {
129
+ const n = this.wx[h], d = this.wy[h], r = this.x + i * n - s * d, y = this.y + s * n + i * d;
130
+ this.wx[h] = r, this.wy[h] = y;
131
+ const g = this.wnx[h], m = this.wny[h];
132
+ this.wnx[h] = i * g - s * m, this.wny[h] = s * g + i * m, r < e && (e = r), r > u && (u = r), y < o && (o = y), y > x && (x = y);
133
+ }
134
+ this.minX = e, this.maxX = u, this.minY = o, this.maxY = x;
135
+ }
136
+ /** Box corners in local space (top, right, bottom, left faces), or in world space when the box sits at no angle. */
137
+ setBoxCorners(t, i) {
138
+ const s = this.angle === 0 ? this.x : 0, e = this.angle === 0 ? this.y : 0;
139
+ this.corners = 4, this.wx[0] = s - t, this.wy[0] = e - i, this.wx[1] = s + t, this.wy[1] = e - i, this.wx[2] = s + t, this.wy[2] = e + i, this.wx[3] = s - t, this.wy[3] = e + i, this.wnx[0] = 0, this.wny[0] = -1, this.wnx[1] = 1, this.wny[1] = 0, this.wnx[2] = 0, this.wny[2] = 1, this.wnx[3] = -1, this.wny[3] = 0;
140
+ }
141
+ wake() {
142
+ this.type !== "static" && (this.awake = !0, this.restTime = 0);
143
+ }
144
+ setVelocity(t, i) {
145
+ this.vx = t, this.vy = i, this.wake();
146
+ }
147
+ /**
148
+ * An instant change of momentum (a jump, a hit): velocity changes by `impulse / mass`. Given a world point
149
+ * (`px`, `py`) off the centre, a body that rotates is also set turning.
150
+ */
151
+ applyImpulse(t, i, s, e) {
152
+ this.type === "dynamic" && (this.vx += t * this.invMass, this.vy += i * this.invMass, s !== void 0 && e !== void 0 && (this.angularVelocity += ((s - this.x) * i - (e - this.y) * t) * this.invInertia), this.wake());
153
+ }
154
+ /** A force held for the next step (thrust, wind); it is cleared once the step has used it. At a world point, it also turns the body. */
155
+ applyForce(t, i, s, e) {
156
+ this.type === "dynamic" && (this.fx += t, this.fy += i, s !== void 0 && e !== void 0 && (this.torque += (s - this.x) * i - (e - this.y) * t), this.wake());
157
+ }
158
+ /** A turning force held for the next step (mass × px² / s², clockwise on screen when positive). */
159
+ applyTorque(t) {
160
+ this.type !== "dynamic" || !this.rotates || (this.torque += t, this.wake());
161
+ }
162
+ /** An instant change of spin: angular velocity changes by `impulse / inertia`. */
163
+ applyAngularImpulse(t) {
164
+ this.type === "dynamic" && (this.angularVelocity += t * this.invInertia, this.wake());
165
+ }
166
+ /** Sets the spin (a kinematic body turns at it; a dynamic one that rotates starts at it). */
167
+ setAngularVelocity(t) {
168
+ this.angularVelocity = t, this.wake();
169
+ }
170
+ /** Velocity of the body's material at a world point: its own plus what its spin adds there. */
171
+ velocityAt(t, i) {
172
+ const s = this.angularVelocity;
173
+ return { x: this.vx - s * (i - this.y), y: this.vy + s * (t - this.x) };
174
+ }
175
+ /**
176
+ * Puts the body somewhere without sweeping it there; the drawn position jumps too (no interpolation across it).
177
+ * A static body moved this way must be followed by `PhysicsWorld.staticsChanged()`.
178
+ */
179
+ setPosition(t, i, s = this.angle) {
180
+ this.x = this.prevX = t, this.y = this.prevY = i, this.angle = this.prevAngle = s, this.updateBounds(), this.wake();
181
+ }
182
+ /** Turns the body to `angle` without sweeping it there (like `setPosition`). */
183
+ setAngle(t) {
184
+ this.setPosition(this.x, this.y, t);
185
+ }
186
+ /** A world point in the body's own frame (before its turn). */
187
+ toLocal(t, i) {
188
+ const s = t - this.x, e = i - this.y;
189
+ return { x: this.cos * s + this.sin * e, y: -this.sin * s + this.cos * e };
190
+ }
191
+ /** A point of the body's own frame in the world. */
192
+ toWorld(t, i) {
193
+ return { x: this.x + this.cos * t - this.sin * i, y: this.y + this.sin * t + this.cos * i };
194
+ }
195
+ }
196
+ function w(a) {
197
+ return a.kind === "circle" ? a.radius * a.radius / 2 : a.kind === "box" ? ((2 * a.halfWidth) ** 2 + (2 * a.halfHeight) ** 2) / 12 : c(a).inertiaPerMass;
198
+ }
199
+ export {
200
+ p as Body
201
+ };
202
+ //# sourceMappingURL=Body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Body.js","sources":["../../src/physics/Body.ts"],"sourcesContent":["import { MAX_POLYGON_VERTICES, polygonData } from './polygon';\nimport type { BodyOptions, BodyType, Shape } from './types';\n\nlet nextBodyId = 1;\n\n/**\n * A rigid body: plain data and a few helpers, no drawing. Positions are the shape's centre in world pixels, y down;\n * velocities are px per second. Create bodies with `PhysicsWorld.add`, which also wakes them and puts them in the\n * broad phase.\n */\nexport class Body {\n readonly id = nextBodyId++;\n readonly type: BodyType;\n shape: Shape;\n x: number;\n y: number;\n /** Position at the start of the last world step: draw at `prev + (current - prev) × alpha`. */\n prevX: number;\n prevY: number;\n vx: number;\n vy: number;\n /** Radians, clockwise on screen. */\n angle: number;\n /** Angle at the start of the last world step, for drawing between steps like `prevX`. */\n prevAngle: number;\n /** Radians per second. */\n angularVelocity: number;\n /** Contacts and torques turn it (`BodyOptions.rotates`). */\n readonly rotates: boolean;\n /** Turning lost per second, as a share. */\n angularDamping: number;\n /** Torque gathered for the next step, cleared after it. */\n torque = 0;\n /** Moment of inertia about the centre (mass × px²); infinite for a body that does not rotate. */\n readonly inertia: number;\n readonly invInertia: number;\n /** Force gathered for the next step (px·mass/s²), cleared after it. */\n fx = 0;\n fy = 0;\n readonly mass: number;\n readonly invMass: number;\n restitution: number;\n friction: number;\n linearDamping: number;\n gravityScale: number;\n readonly sensor: boolean;\n layer: number;\n mask: number;\n userData: unknown;\n /** Box faces lying against more solid ground (`FACE_*` bits): never a contact normal, so seams do not snag. */\n internalFaces = 0;\n\n /** A sleeping body is not integrated and is treated as immovable until something wakes it. */\n awake = true;\n /** Seconds spent below the world's sleep speed. */\n restTime = 0;\n /** Standing on something: a solid contact whose normal points up at this body (refreshed every step). */\n grounded = false;\n /** What it stands on, while grounded. */\n ground: Body | null = null;\n groundNx = 0;\n groundNy = 0;\n\n // bounds, refreshed by `updateBounds`\n minX = 0;\n minY = 0;\n maxX = 0;\n maxY = 0;\n\n /** @internal cosine and sine of `angle`, refreshed by `updateBounds`. */\n cos = 1;\n sin = 0;\n /** @internal corners and outward face normals in world space (boxes and polygons), refreshed by `updateBounds`. */\n readonly wx = new Float64Array(MAX_POLYGON_VERTICES);\n readonly wy = new Float64Array(MAX_POLYGON_VERTICES);\n readonly wnx = new Float64Array(MAX_POLYGON_VERTICES);\n readonly wny = new Float64Array(MAX_POLYGON_VERTICES);\n /** @internal how many of the above are in use (0 for a circle). */\n corners = 0;\n\n /** @internal set by the world that holds it. */\n inWorld = false;\n /** @internal last ray that tested this body, so a ray crossing many cells tests it once. */\n rayStamp = 0;\n\n constructor(options: BodyOptions) {\n this.type = options.type ?? 'dynamic';\n this.shape = options.shape;\n this.x = this.prevX = options.x ?? 0;\n this.y = this.prevY = options.y ?? 0;\n this.vx = options.vx ?? 0;\n this.vy = options.vy ?? 0;\n this.angle = this.prevAngle = options.angle ?? 0;\n this.angularVelocity = options.angularVelocity ?? 0;\n this.angularDamping = options.angularDamping ?? 0.05;\n const mass = options.mass ?? 1;\n if (this.type === 'dynamic' && !(mass > 0)) throw new Error(`Body: a dynamic body needs a positive mass, got ${mass}`);\n this.mass = this.type === 'dynamic' ? mass : Infinity;\n this.invMass = this.type === 'dynamic' ? 1 / mass : 0;\n this.rotates = options.rotates === true && this.type !== 'static';\n const turns = this.rotates && this.type === 'dynamic';\n this.inertia = turns ? mass * inertiaPerMass(this.shape) : Infinity;\n this.invInertia = turns ? 1 / this.inertia : 0;\n this.restitution = options.restitution ?? 0;\n this.friction = options.friction ?? 0.5;\n this.linearDamping = options.linearDamping ?? 0;\n this.gravityScale = options.gravityScale ?? 1;\n this.sensor = options.sensor ?? false;\n this.layer = options.layer ?? 1;\n this.mask = options.mask ?? 0xffffffff;\n this.userData = options.userData;\n this.updateBounds();\n }\n\n get isDynamic(): boolean {\n return this.type === 'dynamic';\n }\n\n get isStatic(): boolean {\n return this.type === 'static';\n }\n\n /** Moves by itself this step: an awake dynamic body or any kinematic one. */\n get moving(): boolean {\n return this.type === 'kinematic' || (this.type === 'dynamic' && this.awake);\n }\n\n /** Inverse mass as the solver sees it: a sleeping body holds still like ground. */\n get solverInvMass(): number {\n return this.awake ? this.invMass : 0;\n }\n\n /** The smallest half size of the shape: how far it may move in one sub-step without passing through anything. */\n get minHalfExtent(): number {\n const s = this.shape;\n if (s.kind === 'circle') return s.radius;\n if (s.kind === 'box') return Math.min(s.halfWidth, s.halfHeight);\n return polygonData(s).inradius;\n }\n\n /** The furthest the shape reaches from the centre: how far a corner sweeps as the body turns. */\n get maxExtent(): number {\n const s = this.shape;\n if (s.kind === 'circle') return s.radius;\n if (s.kind === 'box') return Math.hypot(s.halfWidth, s.halfHeight);\n return polygonData(s).radius;\n }\n\n /** A box at no angle: the cheap axis-aligned tests apply to it. */\n get axisAligned(): boolean {\n return this.shape.kind === 'box' && this.angle === 0;\n }\n\n updateBounds(): void {\n const s = this.shape;\n if (s.kind === 'circle') {\n this.cos = Math.cos(this.angle);\n this.sin = Math.sin(this.angle);\n this.corners = 0;\n this.minX = this.x - s.radius;\n this.maxX = this.x + s.radius;\n this.minY = this.y - s.radius;\n this.maxY = this.y + s.radius;\n return;\n }\n if (s.kind === 'box' && this.angle === 0) {\n this.cos = 1;\n this.sin = 0;\n this.setBoxCorners(s.halfWidth, s.halfHeight);\n this.minX = this.x - s.halfWidth;\n this.maxX = this.x + s.halfWidth;\n this.minY = this.y - s.halfHeight;\n this.maxY = this.y + s.halfHeight;\n return;\n }\n const c = (this.cos = Math.cos(this.angle));\n const n = (this.sin = Math.sin(this.angle));\n if (s.kind === 'box') this.setBoxCorners(s.halfWidth, s.halfHeight);\n else {\n const d = polygonData(s);\n this.corners = d.vertices.length;\n for (let i = 0; i < d.vertices.length; i++) {\n this.wx[i] = d.vertices[i]!.x;\n this.wy[i] = d.vertices[i]!.y;\n this.wnx[i] = d.normals[i]!.x;\n this.wny[i] = d.normals[i]!.y;\n }\n }\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < this.corners; i++) {\n const lx = this.wx[i]!;\n const ly = this.wy[i]!;\n const x = this.x + c * lx - n * ly;\n const y = this.y + n * lx + c * ly;\n this.wx[i] = x;\n this.wy[i] = y;\n const nx = this.wnx[i]!;\n const ny = this.wny[i]!;\n this.wnx[i] = c * nx - n * ny;\n this.wny[i] = n * nx + c * ny;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n this.minX = minX;\n this.maxX = maxX;\n this.minY = minY;\n this.maxY = maxY;\n }\n\n /** Box corners in local space (top, right, bottom, left faces), or in world space when the box sits at no angle. */\n private setBoxCorners(hw: number, hh: number): void {\n const ox = this.angle === 0 ? this.x : 0;\n const oy = this.angle === 0 ? this.y : 0;\n this.corners = 4;\n this.wx[0] = ox - hw;\n this.wy[0] = oy - hh;\n this.wx[1] = ox + hw;\n this.wy[1] = oy - hh;\n this.wx[2] = ox + hw;\n this.wy[2] = oy + hh;\n this.wx[3] = ox - hw;\n this.wy[3] = oy + hh;\n this.wnx[0] = 0;\n this.wny[0] = -1;\n this.wnx[1] = 1;\n this.wny[1] = 0;\n this.wnx[2] = 0;\n this.wny[2] = 1;\n this.wnx[3] = -1;\n this.wny[3] = 0;\n }\n\n wake(): void {\n if (this.type === 'static') return;\n this.awake = true;\n this.restTime = 0;\n }\n\n setVelocity(vx: number, vy: number): void {\n this.vx = vx;\n this.vy = vy;\n this.wake();\n }\n\n /**\n * An instant change of momentum (a jump, a hit): velocity changes by `impulse / mass`. Given a world point\n * (`px`, `py`) off the centre, a body that rotates is also set turning.\n */\n applyImpulse(ix: number, iy: number, px?: number, py?: number): void {\n if (this.type !== 'dynamic') return;\n this.vx += ix * this.invMass;\n this.vy += iy * this.invMass;\n if (px !== undefined && py !== undefined) this.angularVelocity += ((px - this.x) * iy - (py - this.y) * ix) * this.invInertia;\n this.wake();\n }\n\n /** A force held for the next step (thrust, wind); it is cleared once the step has used it. At a world point, it also turns the body. */\n applyForce(fx: number, fy: number, px?: number, py?: number): void {\n if (this.type !== 'dynamic') return;\n this.fx += fx;\n this.fy += fy;\n if (px !== undefined && py !== undefined) this.torque += (px - this.x) * fy - (py - this.y) * fx;\n this.wake();\n }\n\n /** A turning force held for the next step (mass × px² / s², clockwise on screen when positive). */\n applyTorque(torque: number): void {\n if (this.type !== 'dynamic' || !this.rotates) return;\n this.torque += torque;\n this.wake();\n }\n\n /** An instant change of spin: angular velocity changes by `impulse / inertia`. */\n applyAngularImpulse(impulse: number): void {\n if (this.type !== 'dynamic') return;\n this.angularVelocity += impulse * this.invInertia;\n this.wake();\n }\n\n /** Sets the spin (a kinematic body turns at it; a dynamic one that rotates starts at it). */\n setAngularVelocity(w: number): void {\n this.angularVelocity = w;\n this.wake();\n }\n\n /** Velocity of the body's material at a world point: its own plus what its spin adds there. */\n velocityAt(px: number, py: number): { x: number; y: number } {\n const w = this.angularVelocity;\n return { x: this.vx - w * (py - this.y), y: this.vy + w * (px - this.x) };\n }\n\n /**\n * Puts the body somewhere without sweeping it there; the drawn position jumps too (no interpolation across it).\n * A static body moved this way must be followed by `PhysicsWorld.staticsChanged()`.\n */\n setPosition(x: number, y: number, angle = this.angle): void {\n this.x = this.prevX = x;\n this.y = this.prevY = y;\n this.angle = this.prevAngle = angle;\n this.updateBounds();\n this.wake();\n }\n\n /** Turns the body to `angle` without sweeping it there (like `setPosition`). */\n setAngle(angle: number): void {\n this.setPosition(this.x, this.y, angle);\n }\n\n /** A world point in the body's own frame (before its turn). */\n toLocal(px: number, py: number): { x: number; y: number } {\n const dx = px - this.x;\n const dy = py - this.y;\n return { x: this.cos * dx + this.sin * dy, y: -this.sin * dx + this.cos * dy };\n }\n\n /** A point of the body's own frame in the world. */\n toWorld(lx: number, ly: number): { x: number; y: number } {\n return { x: this.x + this.cos * lx - this.sin * ly, y: this.y + this.sin * lx + this.cos * ly };\n }\n}\n\n/** Moment of inertia per unit of mass about the centre: a solid disc, a solid box, a solid polygon. */\nfunction inertiaPerMass(s: Shape): number {\n if (s.kind === 'circle') return (s.radius * s.radius) / 2;\n if (s.kind === 'box') return ((2 * s.halfWidth) ** 2 + (2 * s.halfHeight) ** 2) / 12;\n return polygonData(s).inertiaPerMass;\n}\n"],"names":["nextBodyId","Body","MAX_POLYGON_VERTICES","options","mass","turns","inertiaPerMass","s","polygonData","c","n","d","i","minX","minY","maxX","maxY","lx","ly","x","nx","ny","hw","hh","ox","oy","vx","vy","ix","iy","px","py","fx","fy","torque","impulse","w","y","angle","dx","dy"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { SpatialHash as h } from "./SpatialHash.js";
2
+ class y {
3
+ constructor(i, s) {
4
+ this.margin = s, this.statics = new h(i), this.movers = new h(i);
5
+ }
6
+ margin;
7
+ statics;
8
+ movers;
9
+ staticsDirty = !0;
10
+ markStaticsDirty() {
11
+ this.staticsDirty = !0;
12
+ }
13
+ /** Re-lists every body; statics only if they changed. Bounds must be current. */
14
+ rebuild(i) {
15
+ if (this.staticsDirty) {
16
+ this.statics.clear();
17
+ for (const s of i) s.isStatic && this.statics.insert(s, this.margin);
18
+ this.staticsDirty = !1;
19
+ }
20
+ this.movers.clear();
21
+ for (const s of i) s.isStatic || this.movers.insert(s, this.margin);
22
+ }
23
+ /**
24
+ * Calls `visit` once for every pair whose bounds (grown by the margin) overlap and in which at least one body
25
+ * moves. A pair sharing several cells is visited only from the cell holding the corner of their overlap, which
26
+ * needs no set of pairs seen.
27
+ */
28
+ pairs(i, s) {
29
+ const o = this.margin, r = this.movers;
30
+ for (const t of i) {
31
+ if (!t.moving || !t.inWorld) continue;
32
+ const m = r.cellOf(t.minX - o), l = r.cellOf(t.maxX + o), x = r.cellOf(t.minY - o), g = r.cellOf(t.maxY + o);
33
+ for (let a = x; a <= g; a++)
34
+ for (let c = m; c <= l; c++) {
35
+ const f = this.movers.at(c, a);
36
+ if (f)
37
+ for (const n of f)
38
+ n === t || n.moving && n.id < t.id || this.owns(t, n, c, a) && s(t, n);
39
+ const e = this.statics.at(c, a);
40
+ if (e)
41
+ for (const n of e) this.owns(t, n, c, a) && s(t, n);
42
+ }
43
+ }
44
+ }
45
+ /** The pair overlaps and (cx, cy) is the cell of its overlap's top-left corner. */
46
+ owns(i, s, o, r) {
47
+ const t = this.margin;
48
+ if (i.maxX + t < s.minX - t || s.maxX + t < i.minX - t || i.maxY + t < s.minY - t || s.maxY + t < i.minY - t) return !1;
49
+ const m = this.movers;
50
+ return m.cellOf(Math.max(i.minX, s.minX) - t) === o && m.cellOf(Math.max(i.minY, s.minY) - t) === r;
51
+ }
52
+ }
53
+ export {
54
+ y as BroadPhase
55
+ };
56
+ //# sourceMappingURL=BroadPhase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BroadPhase.js","sources":["../../src/physics/BroadPhase.ts"],"sourcesContent":["import type { Body } from './Body';\nimport { SpatialHash } from './SpatialHash';\n\n/**\n * Two spatial hashes: static bodies, rebuilt only when they change (a level's ground is thousands of tiles merged\n * into a few hundred boxes and never moves), and everything else, rebuilt every sub-step. Pairs are found from the\n * moving side only: two sleeping or static bodies are never tested against each other.\n */\nexport class BroadPhase {\n readonly statics: SpatialHash;\n readonly movers: SpatialHash;\n private staticsDirty = true;\n\n constructor(\n cellSize: number,\n private readonly margin: number,\n ) {\n this.statics = new SpatialHash(cellSize);\n this.movers = new SpatialHash(cellSize);\n }\n\n markStaticsDirty(): void {\n this.staticsDirty = true;\n }\n\n /** Re-lists every body; statics only if they changed. Bounds must be current. */\n rebuild(bodies: readonly Body[]): void {\n if (this.staticsDirty) {\n this.statics.clear();\n for (const b of bodies) if (b.isStatic) this.statics.insert(b, this.margin);\n this.staticsDirty = false;\n }\n this.movers.clear();\n for (const b of bodies) if (!b.isStatic) this.movers.insert(b, this.margin);\n }\n\n /**\n * Calls `visit` once for every pair whose bounds (grown by the margin) overlap and in which at least one body\n * moves. A pair sharing several cells is visited only from the cell holding the corner of their overlap, which\n * needs no set of pairs seen.\n */\n pairs(bodies: readonly Body[], visit: (a: Body, b: Body) => void): void {\n const m = this.margin;\n const hash = this.movers;\n for (const a of bodies) {\n if (!a.moving || !a.inWorld) continue;\n const x0 = hash.cellOf(a.minX - m);\n const x1 = hash.cellOf(a.maxX + m);\n const y0 = hash.cellOf(a.minY - m);\n const y1 = hash.cellOf(a.maxY + m);\n for (let cy = y0; cy <= y1; cy++) {\n for (let cx = x0; cx <= x1; cx++) {\n const near = this.movers.at(cx, cy);\n if (near) {\n for (const b of near) {\n // two moving bodies meet from the lower id's side only\n if (b === a || (b.moving && b.id < a.id)) continue;\n if (this.owns(a, b, cx, cy)) visit(a, b);\n }\n }\n const ground = this.statics.at(cx, cy);\n if (ground) for (const b of ground) if (this.owns(a, b, cx, cy)) visit(a, b);\n }\n }\n }\n }\n\n /** The pair overlaps and (cx, cy) is the cell of its overlap's top-left corner. */\n private owns(a: Body, b: Body, cx: number, cy: number): boolean {\n const m = this.margin;\n if (a.maxX + m < b.minX - m || b.maxX + m < a.minX - m || a.maxY + m < b.minY - m || b.maxY + m < a.minY - m) return false;\n const hash = this.movers;\n return hash.cellOf(Math.max(a.minX, b.minX) - m) === cx && hash.cellOf(Math.max(a.minY, b.minY) - m) === cy;\n }\n}\n"],"names":["BroadPhase","cellSize","margin","SpatialHash","bodies","b","visit","m","hash","a","x0","x1","y0","y1","cy","cx","near","ground"],"mappings":";AAQO,MAAMA,EAAW;AAAA,EAKtB,YACEC,GACiBC,GACjB;AADiB,SAAA,SAAAA,GAEjB,KAAK,UAAU,IAAIC,EAAYF,CAAQ,GACvC,KAAK,SAAS,IAAIE,EAAYF,CAAQ;AAAA,EACxC;AAAA,EAJmB;AAAA,EANV;AAAA,EACA;AAAA,EACD,eAAe;AAAA,EAUvB,mBAAyB;AACvB,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA,EAGA,QAAQG,GAA+B;AACrC,QAAI,KAAK,cAAc;AACrB,WAAK,QAAQ,MAAA;AACb,iBAAWC,KAAKD,EAAQ,CAAIC,EAAE,iBAAe,QAAQ,OAAOA,GAAG,KAAK,MAAM;AAC1E,WAAK,eAAe;AAAA,IACtB;AACA,SAAK,OAAO,MAAA;AACZ,eAAWA,KAAKD,EAAQ,CAAKC,EAAE,YAAU,KAAK,OAAO,OAAOA,GAAG,KAAK,MAAM;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAMD,GAAyBE,GAAyC;AACtE,UAAMC,IAAI,KAAK,QACTC,IAAO,KAAK;AAClB,eAAWC,KAAKL,GAAQ;AACtB,UAAI,CAACK,EAAE,UAAU,CAACA,EAAE,QAAS;AAC7B,YAAMC,IAAKF,EAAK,OAAOC,EAAE,OAAOF,CAAC,GAC3BI,IAAKH,EAAK,OAAOC,EAAE,OAAOF,CAAC,GAC3BK,IAAKJ,EAAK,OAAOC,EAAE,OAAOF,CAAC,GAC3BM,IAAKL,EAAK,OAAOC,EAAE,OAAOF,CAAC;AACjC,eAASO,IAAKF,GAAIE,KAAMD,GAAIC;AAC1B,iBAASC,IAAKL,GAAIK,KAAMJ,GAAII,KAAM;AAChC,gBAAMC,IAAO,KAAK,OAAO,GAAGD,GAAID,CAAE;AAClC,cAAIE;AACF,uBAAWX,KAAKW;AAEd,cAAIX,MAAMI,KAAMJ,EAAE,UAAUA,EAAE,KAAKI,EAAE,MACjC,KAAK,KAAKA,GAAGJ,GAAGU,GAAID,CAAE,KAAGR,EAAMG,GAAGJ,CAAC;AAG3C,gBAAMY,IAAS,KAAK,QAAQ,GAAGF,GAAID,CAAE;AACrC,cAAIG;AAAQ,uBAAWZ,KAAKY,EAAQ,CAAI,KAAK,KAAKR,GAAGJ,GAAGU,GAAID,CAAE,KAAGR,EAAMG,GAAGJ,CAAC;AAAA,QAC7E;AAAA,IAEJ;AAAA,EACF;AAAA;AAAA,EAGQ,KAAKI,GAASJ,GAASU,GAAYD,GAAqB;AAC9D,UAAMP,IAAI,KAAK;AACf,QAAIE,EAAE,OAAOF,IAAIF,EAAE,OAAOE,KAAKF,EAAE,OAAOE,IAAIE,EAAE,OAAOF,KAAKE,EAAE,OAAOF,IAAIF,EAAE,OAAOE,KAAKF,EAAE,OAAOE,IAAIE,EAAE,OAAOF,EAAG,QAAO;AACrH,UAAMC,IAAO,KAAK;AAClB,WAAOA,EAAK,OAAO,KAAK,IAAIC,EAAE,MAAMJ,EAAE,IAAI,IAAIE,CAAC,MAAMQ,KAAMP,EAAK,OAAO,KAAK,IAAIC,EAAE,MAAMJ,EAAE,IAAI,IAAIE,CAAC,MAAMO;AAAA,EAC3G;AACF;"}
@@ -0,0 +1,76 @@
1
+ class n {
2
+ /** World position when measured, and the depth there (px, < 0 a gap). */
3
+ x = 0;
4
+ y = 0;
5
+ depth = 0;
6
+ /** Which corners or faces made it: matched from step to step to carry the impulses over. */
7
+ id = 0;
8
+ /** Accumulated normal and friction impulses. */
9
+ jn = 0;
10
+ jt = 0;
11
+ /** Per sub-step solver terms. */
12
+ massN = 0;
13
+ massT = 0;
14
+ target = 0;
15
+ /** Offsets from each body's centre, refreshed every sub-step. */
16
+ rax = 0;
17
+ ray = 0;
18
+ rbx = 0;
19
+ rby = 0;
20
+ /** The point in each body's own frame when measured, so position correction can track its depth as they move and turn. */
21
+ lax = 0;
22
+ lay = 0;
23
+ lbx = 0;
24
+ lby = 0;
25
+ }
26
+ class o {
27
+ constructor(s, t, e) {
28
+ this.a = s, this.b = t, this.key = e;
29
+ }
30
+ a;
31
+ b;
32
+ key;
33
+ nx = 0;
34
+ ny = 1;
35
+ depth = 0;
36
+ /** One or two points; only the first `count` are in use. */
37
+ pts = [new n(), new n()];
38
+ count = 0;
39
+ mu = 0;
40
+ /** Solved this sub-step (false when the pre-solve hook turned it off). */
41
+ enabled = !0;
42
+ /** The world step and sub-step that last found it. */
43
+ seenStep = -1;
44
+ seenSub = -1;
45
+ /** Reported as touching (a `begin` went out and no `end` yet). */
46
+ reported = !1;
47
+ get sensor() {
48
+ return this.a.sensor || this.b.sensor;
49
+ }
50
+ /** Where the two touch, world px. */
51
+ get points() {
52
+ const s = [];
53
+ for (let t = 0; t < this.count; t++) s.push({ x: this.pts[t].x, y: this.pts[t].y });
54
+ return s;
55
+ }
56
+ /** Accumulated normal impulse over the points: how hard the pair pressed together on the last sub-step. */
57
+ get normalImpulse() {
58
+ let s = 0;
59
+ for (let t = 0; t < this.count; t++) s += this.pts[t].jn;
60
+ return s;
61
+ }
62
+ /** The other body of the pair. */
63
+ other(s) {
64
+ return s === this.a ? this.b : this.a;
65
+ }
66
+ /** A stable number for the pair, whichever order it is asked in. */
67
+ static keyOf(s, t) {
68
+ const e = s.id < t.id ? s.id : t.id, r = s.id < t.id ? t.id : s.id;
69
+ return e * 67108864 + r;
70
+ }
71
+ }
72
+ export {
73
+ o as Contact,
74
+ n as ContactPoint
75
+ };
76
+ //# sourceMappingURL=Contact.js.map