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,55 @@
1
+ class n {
2
+ sparse = new Int32Array(64).fill(-1);
3
+ /** Packed entity ids, in the same order as `values`. */
4
+ entities = [];
5
+ values = [];
6
+ /** Bumped whenever an entity joins or leaves the set (not when a value changes): query caches key on it. */
7
+ version = 0;
8
+ get size() {
9
+ return this.entities.length;
10
+ }
11
+ has(s) {
12
+ return s < this.sparse.length && this.sparse[s] >= 0;
13
+ }
14
+ /** The value at slot `index`, or undefined. */
15
+ get(s) {
16
+ if (s >= this.sparse.length) return;
17
+ const t = this.sparse[s];
18
+ return t >= 0 ? this.values[t] : void 0;
19
+ }
20
+ set(s, t, e) {
21
+ this.grow(s);
22
+ const i = this.sparse[s];
23
+ if (i >= 0) {
24
+ this.values[i] = e, this.entities[i] = t;
25
+ return;
26
+ }
27
+ this.sparse[s] = this.entities.length, this.version++, this.entities.push(t), this.values.push(e);
28
+ }
29
+ /** Removes slot `index`; true if it was there. */
30
+ delete(s, t) {
31
+ if (s >= this.sparse.length) return !1;
32
+ const e = this.sparse[s];
33
+ if (e < 0) return !1;
34
+ const i = this.entities.length - 1;
35
+ if (e !== i) {
36
+ const h = this.entities[i];
37
+ this.entities[e] = h, this.values[e] = this.values[i], this.sparse[t(h)] = e;
38
+ }
39
+ return this.entities.pop(), this.values.pop(), this.sparse[s] = -1, this.version++, !0;
40
+ }
41
+ clear() {
42
+ this.version++, this.sparse.fill(-1), this.entities.length = 0, this.values.length = 0;
43
+ }
44
+ grow(s) {
45
+ if (s < this.sparse.length) return;
46
+ let t = this.sparse.length;
47
+ for (; t <= s; ) t *= 2;
48
+ const e = new Int32Array(t).fill(-1);
49
+ e.set(this.sparse), this.sparse = e;
50
+ }
51
+ }
52
+ export {
53
+ n as SparseSet
54
+ };
55
+ //# sourceMappingURL=SparseSet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SparseSet.js","sources":["../../src/ecs/SparseSet.ts"],"sourcesContent":["/**\n * One component type's storage: a sparse set. `sparse[index]` is where the entity's value sits in the dense arrays\n * (or -1), and `entities`/`values` are packed with no holes, so walking a component is a walk over two flat arrays\n * and finding one is two array reads. Removing swaps the last entry into the hole.\n *\n * Indexed by the entity's slot index (`entityIndex`), not the whole id: the generation is checked by the world.\n */\nexport class SparseSet<T> {\n private sparse: Int32Array = new Int32Array(64).fill(-1);\n /** Packed entity ids, in the same order as `values`. */\n readonly entities: number[] = [];\n readonly values: T[] = [];\n /** Bumped whenever an entity joins or leaves the set (not when a value changes): query caches key on it. */\n version = 0;\n\n get size(): number {\n return this.entities.length;\n }\n\n has(index: number): boolean {\n return index < this.sparse.length && this.sparse[index]! >= 0;\n }\n\n /** The value at slot `index`, or undefined. */\n get(index: number): T | undefined {\n if (index >= this.sparse.length) return undefined;\n const d = this.sparse[index]!;\n return d >= 0 ? this.values[d] : undefined;\n }\n\n set(index: number, entity: number, value: T): void {\n this.grow(index);\n const d = this.sparse[index]!;\n if (d >= 0) {\n this.values[d] = value;\n this.entities[d] = entity;\n return;\n }\n this.sparse[index] = this.entities.length;\n this.version++;\n this.entities.push(entity);\n this.values.push(value);\n }\n\n /** Removes slot `index`; true if it was there. */\n delete(index: number, indexOf: (entity: number) => number): boolean {\n if (index >= this.sparse.length) return false;\n const d = this.sparse[index]!;\n if (d < 0) return false;\n const last = this.entities.length - 1;\n if (d !== last) {\n const moved = this.entities[last]!;\n this.entities[d] = moved;\n this.values[d] = this.values[last]!;\n this.sparse[indexOf(moved)] = d;\n }\n this.entities.pop();\n this.values.pop();\n this.sparse[index] = -1;\n this.version++;\n return true;\n }\n\n clear(): void {\n this.version++;\n this.sparse.fill(-1);\n this.entities.length = 0;\n this.values.length = 0;\n }\n\n private grow(index: number): void {\n if (index < this.sparse.length) return;\n let n = this.sparse.length;\n while (n <= index) n *= 2;\n const next = new Int32Array(n).fill(-1);\n next.set(this.sparse);\n this.sparse = next;\n }\n}\n"],"names":["SparseSet","index","d","entity","value","indexOf","last","moved","n","next"],"mappings":"AAOO,MAAMA,EAAa;AAAA,EAChB,SAAqB,IAAI,WAAW,EAAE,EAAE,KAAK,EAAE;AAAA;AAAA,EAE9C,WAAqB,CAAA;AAAA,EACrB,SAAc,CAAA;AAAA;AAAA,EAEvB,UAAU;AAAA,EAEV,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAIC,GAAwB;AAC1B,WAAOA,IAAQ,KAAK,OAAO,UAAU,KAAK,OAAOA,CAAK,KAAM;AAAA,EAC9D;AAAA;AAAA,EAGA,IAAIA,GAA8B;AAChC,QAAIA,KAAS,KAAK,OAAO,OAAQ;AACjC,UAAMC,IAAI,KAAK,OAAOD,CAAK;AAC3B,WAAOC,KAAK,IAAI,KAAK,OAAOA,CAAC,IAAI;AAAA,EACnC;AAAA,EAEA,IAAID,GAAeE,GAAgBC,GAAgB;AACjD,SAAK,KAAKH,CAAK;AACf,UAAMC,IAAI,KAAK,OAAOD,CAAK;AAC3B,QAAIC,KAAK,GAAG;AACV,WAAK,OAAOA,CAAC,IAAIE,GACjB,KAAK,SAASF,CAAC,IAAIC;AACnB;AAAA,IACF;AACA,SAAK,OAAOF,CAAK,IAAI,KAAK,SAAS,QACnC,KAAK,WACL,KAAK,SAAS,KAAKE,CAAM,GACzB,KAAK,OAAO,KAAKC,CAAK;AAAA,EACxB;AAAA;AAAA,EAGA,OAAOH,GAAeI,GAA8C;AAClE,QAAIJ,KAAS,KAAK,OAAO,OAAQ,QAAO;AACxC,UAAMC,IAAI,KAAK,OAAOD,CAAK;AAC3B,QAAIC,IAAI,EAAG,QAAO;AAClB,UAAMI,IAAO,KAAK,SAAS,SAAS;AACpC,QAAIJ,MAAMI,GAAM;AACd,YAAMC,IAAQ,KAAK,SAASD,CAAI;AAChC,WAAK,SAASJ,CAAC,IAAIK,GACnB,KAAK,OAAOL,CAAC,IAAI,KAAK,OAAOI,CAAI,GACjC,KAAK,OAAOD,EAAQE,CAAK,CAAC,IAAIL;AAAA,IAChC;AACA,gBAAK,SAAS,IAAA,GACd,KAAK,OAAO,IAAA,GACZ,KAAK,OAAOD,CAAK,IAAI,IACrB,KAAK,WACE;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,WACL,KAAK,OAAO,KAAK,EAAE,GACnB,KAAK,SAAS,SAAS,GACvB,KAAK,OAAO,SAAS;AAAA,EACvB;AAAA,EAEQ,KAAKA,GAAqB;AAChC,QAAIA,IAAQ,KAAK,OAAO,OAAQ;AAChC,QAAIO,IAAI,KAAK,OAAO;AACpB,WAAOA,KAAKP,IAAO,CAAAO,KAAK;AACxB,UAAMC,IAAO,IAAI,WAAWD,CAAC,EAAE,KAAK,EAAE;AACtC,IAAAC,EAAK,IAAI,KAAK,MAAM,GACpB,KAAK,SAASA;AAAA,EAChB;AACF;"}
@@ -0,0 +1,307 @@
1
+ import { SparseSet as k } from "./SparseSet.js";
2
+ import { isFields as A, growColumns as x } from "./fields.js";
3
+ let y = 0;
4
+ const p = [];
5
+ function O(f) {
6
+ const t = { id: y++, name: f };
7
+ return p[t.id] = t, t;
8
+ }
9
+ function U(f, t) {
10
+ const s = { id: y++, name: f, fields: t };
11
+ return p[s.id] = s, s;
12
+ }
13
+ function b(f, t, s) {
14
+ return { name: f, phase: t, run: s };
15
+ }
16
+ const E = 22, u = (1 << E) - 1, v = 2 ** 31, h = (f) => f & u;
17
+ class z {
18
+ /** Current generation per slot; an id is alive when its generation matches and the slot is in use. */
19
+ generations = [];
20
+ inUse = [];
21
+ free = [];
22
+ live = 0;
23
+ stores = [];
24
+ /** Typed-array columns of the field components, by component id. */
25
+ cols = [];
26
+ systems = [];
27
+ pending = [];
28
+ /** `slots` results by the component ids asked for, rebuilt only when one of those sets changed membership. */
29
+ slotCache = /* @__PURE__ */ new Map();
30
+ /** Walks (`query`, `each`, system runs) in progress: structure changes wait until it is 0. */
31
+ walking = 0;
32
+ /** A new entity with no components. */
33
+ create() {
34
+ let t;
35
+ if (this.free.length)
36
+ t = this.free.pop();
37
+ else {
38
+ if (t = this.generations.length, t > u) throw new Error("World: too many live entities");
39
+ this.generations.push(0), this.inUse.push(!1);
40
+ }
41
+ return this.inUse[t] = !0, this.live++, this.generations[t] * (u + 1) + t;
42
+ }
43
+ /** A new entity with these components. */
44
+ spawn(...t) {
45
+ const s = this.create();
46
+ for (const [i, e] of t) this.add(s, i, e);
47
+ return s;
48
+ }
49
+ isAlive(t) {
50
+ const s = h(t);
51
+ return this.inUse[s] === !0 && this.generations[s] === Math.floor(t / (u + 1));
52
+ }
53
+ /** Every live entity, for tools (a debugger, a save); allocates, so not for a per-frame path. */
54
+ entities() {
55
+ const t = [];
56
+ for (let s = 0; s < this.inUse.length; s++) this.inUse[s] && t.push(this.generations[s] * (u + 1) + s);
57
+ return t;
58
+ }
59
+ /** The component types `e` holds, for tools; allocates. */
60
+ componentsOf(t) {
61
+ if (!this.isAlive(t)) return [];
62
+ const s = h(t), i = [];
63
+ return this.stores.forEach((e, n) => {
64
+ e?.has(s) && i.push(p[n]);
65
+ }), i;
66
+ }
67
+ /** Live entities. */
68
+ get size() {
69
+ return this.live;
70
+ }
71
+ /** Removes an entity and every component it had (deferred while a walk is in progress). */
72
+ destroy(t) {
73
+ if (!this.isAlive(t)) return;
74
+ if (this.walking > 0) {
75
+ this.pending.push({ kind: "destroy", e: t });
76
+ return;
77
+ }
78
+ const s = h(t);
79
+ for (const i of this.stores) i?.delete(s, h);
80
+ this.inUse[s] = !1, this.generations[s] = (this.generations[s] + 1) % v, this.free.push(s), this.live--;
81
+ }
82
+ add(t, s, i) {
83
+ if (!this.isAlive(t)) throw new Error(`World.add: entity ${t} is not alive`);
84
+ const e = h(t);
85
+ if (A(s)) {
86
+ const n = this.columnsOf(s, e + 1), l = i ?? {};
87
+ for (const r of Object.keys(s.fields)) n[r][e] = l[r] ?? 0;
88
+ return this.store(s).set(e, t, e), e;
89
+ }
90
+ return this.store(s).set(e, t, i), i;
91
+ }
92
+ /**
93
+ * The typed-array columns of a field component, indexed by slot. Fetch them per system run: adding entities may
94
+ * grow them into new arrays.
95
+ */
96
+ columns(t) {
97
+ return this.columnsOf(t, this.generations.length);
98
+ }
99
+ get(t, s) {
100
+ if (this.isAlive(t))
101
+ return this.stores[s.id]?.get(h(t));
102
+ }
103
+ /** The component, or an error naming what is missing: for code that knows the entity has it. */
104
+ require(t, s) {
105
+ const i = this.stores[s.id];
106
+ if (!this.isAlive(t) || !i?.has(h(t))) throw new Error(`World.require: entity ${t} has no ${s.name}`);
107
+ return i.get(h(t));
108
+ }
109
+ has(t, s) {
110
+ return this.isAlive(t) && (this.stores[s.id]?.has(h(t)) ?? !1);
111
+ }
112
+ /** Takes one component off an entity (deferred while a walk is in progress). */
113
+ remove(t, s) {
114
+ if (this.isAlive(t)) {
115
+ if (this.walking > 0) {
116
+ this.pending.push({ kind: "remove", e: t, type: s });
117
+ return;
118
+ }
119
+ this.stores[s.id]?.delete(h(t), h);
120
+ }
121
+ }
122
+ /** How many entities hold `type`. */
123
+ count(t) {
124
+ return this.stores[t.id]?.size ?? 0;
125
+ }
126
+ /**
127
+ * Calls `fn(entity, ...components)` for every live entity holding all of `types`. Allocates nothing per entity:
128
+ * the form for systems that walk thousands of bodies every step.
129
+ */
130
+ each(...t) {
131
+ const s = t[t.length - 1], i = t.slice(0, -1), e = this.setsFor(i);
132
+ if (!e) return;
133
+ const n = m(e), l = n.entities.length;
134
+ this.walking++;
135
+ try {
136
+ if (e.length === 1)
137
+ for (let r = l - 1; r >= 0; r--) s(n.entities[r], n.values[r]);
138
+ else if (e.length === 2) {
139
+ const [r, o] = e;
140
+ for (let a = l - 1; a >= 0; a--) {
141
+ const d = n.entities[a], c = h(d);
142
+ !r.has(c) || !o.has(c) || s(d, r.get(c), o.get(c));
143
+ }
144
+ } else {
145
+ const r = new Array(e.length);
146
+ for (let o = l - 1; o >= 0; o--) {
147
+ const a = n.entities[o], d = h(a);
148
+ let c = !0;
149
+ for (let g = 0; g < e.length; g++) {
150
+ const w = e[g];
151
+ if (!w.has(d)) {
152
+ c = !1;
153
+ break;
154
+ }
155
+ r[g] = w.get(d);
156
+ }
157
+ c && s(a, ...r);
158
+ }
159
+ }
160
+ } finally {
161
+ this.endWalk();
162
+ }
163
+ }
164
+ /**
165
+ * The slot index of every entity holding all of `types`, as a typed array: the fastest walk there is, made for
166
+ * field components (`defineFields`), whose columns are indexed by slot.
167
+ *
168
+ * ```ts
169
+ * const p = world.columns(Position), v = world.columns(Velocity);
170
+ * const slots = world.slots(Position, Velocity);
171
+ * for (let k = 0; k < slots.length; k++) { const i = slots[k]!; p.x[i]! += v.x[i]! * dt; }
172
+ * ```
173
+ *
174
+ * The result is cached and rebuilt only when an entity joins or leaves one of those components, so asking every
175
+ * step is cheap. It is a view the world owns: read it, don't keep it past the step, and fetch it again after
176
+ * adding or removing components.
177
+ */
178
+ slots(...t) {
179
+ const s = t.map((o) => o.id).join(","), i = this.setsFor(t);
180
+ if (!i) return S;
181
+ let e = this.slotCache.get(s);
182
+ if (e && e.versions.every((o, a) => o === i[a].version)) return e.view;
183
+ const n = m(i), l = e && e.slots.length >= n.size ? e.slots : new Int32Array(Math.max(16, n.size));
184
+ let r = 0;
185
+ for (let o = 0; o < n.entities.length; o++) {
186
+ const a = h(n.entities[o]);
187
+ let d = !0;
188
+ for (const c of i)
189
+ if (c !== n && !c.has(a)) {
190
+ d = !1;
191
+ break;
192
+ }
193
+ d && (l[r++] = a);
194
+ }
195
+ return e = { versions: i.map((o) => o.version), slots: l, view: l.subarray(0, r) }, this.slotCache.set(s, e), e.view;
196
+ }
197
+ /**
198
+ * Every live entity holding all of `types`, with those components in the same order. Yields a fresh row per
199
+ * entity: convenient, but `each` is the form for hot loops.
200
+ */
201
+ *query(...t) {
202
+ const s = this.setsFor(t);
203
+ if (!s) return;
204
+ const i = m(s);
205
+ this.walking++;
206
+ try {
207
+ for (let e = i.entities.length - 1; e >= 0; e--) {
208
+ const n = i.entities[e], l = h(n), r = [n];
209
+ let o = !0;
210
+ for (const a of s) {
211
+ if (!a.has(l)) {
212
+ o = !1;
213
+ break;
214
+ }
215
+ r.push(a.get(l));
216
+ }
217
+ o && (yield r);
218
+ }
219
+ } finally {
220
+ this.endWalk();
221
+ }
222
+ }
223
+ /** The first entity matching the query, or undefined: for singletons (the player, the camera target). */
224
+ first(...t) {
225
+ for (const s of this.query(...t)) return s;
226
+ }
227
+ addSystem(t) {
228
+ if (this.systems.some((s) => s.name === t.name)) throw new Error(`World.addSystem: a system named "${t.name}" is already added`);
229
+ return this.systems.push(t), this;
230
+ }
231
+ removeSystem(t) {
232
+ const s = this.systems.findIndex((e) => e.name === t);
233
+ if (s < 0) return;
234
+ const [i] = this.systems.splice(s, 1);
235
+ i.dispose?.();
236
+ }
237
+ /** Runs every system of `phase` in the order added. A system that throws is reported and the rest still run. */
238
+ run(t, s, i) {
239
+ const e = { dt: s.dt, now: s.now, alpha: s.alpha, world: this };
240
+ this.walking++;
241
+ try {
242
+ for (const n of this.systems)
243
+ if (n.phase === t)
244
+ try {
245
+ n.run(e);
246
+ } catch (l) {
247
+ if (i) i(n, l);
248
+ else throw l;
249
+ }
250
+ } finally {
251
+ this.endWalk();
252
+ }
253
+ }
254
+ /** Every entity, component and system gone. */
255
+ clear() {
256
+ for (const t of this.systems.splice(0)) t.dispose?.();
257
+ for (const t of this.stores) t?.clear();
258
+ this.generations = this.generations.map((t) => (t + 1) % v), this.inUse.fill(!1), this.free.length = 0;
259
+ for (let t = this.generations.length - 1; t >= 0; t--) this.free.push(t);
260
+ this.live = 0, this.pending.length = 0, this.slotCache.clear();
261
+ }
262
+ columnsOf(t, s) {
263
+ let i = this.cols[t.id];
264
+ const e = i ? Object.values(i)[0]?.length ?? 0 : 0;
265
+ if (!i || e < s) {
266
+ let n = Math.max(64, e);
267
+ for (; n < s; ) n *= 2;
268
+ i = x(t.fields, n, i), this.cols[t.id] = i;
269
+ }
270
+ return i;
271
+ }
272
+ store(t) {
273
+ let s = this.stores[t.id];
274
+ return s || (s = new k(), this.stores[t.id] = s), s;
275
+ }
276
+ /** The stores for `types`, or null when one has never been used (so nothing can match). */
277
+ setsFor(t) {
278
+ if (t.length === 0) return null;
279
+ const s = [];
280
+ for (const i of t) {
281
+ const e = this.stores[i.id];
282
+ if (!e || e.size === 0) return null;
283
+ s.push(e);
284
+ }
285
+ return s;
286
+ }
287
+ endWalk() {
288
+ if (this.walking--, this.walking > 0 || this.pending.length === 0) return;
289
+ const t = this.pending.splice(0);
290
+ for (const s of t)
291
+ s.kind === "destroy" ? this.destroy(s.e) : this.remove(s.e, s.type);
292
+ }
293
+ }
294
+ const S = new Int32Array(0);
295
+ function m(f) {
296
+ let t = f[0];
297
+ for (const s of f) s.size < t.size && (t = s);
298
+ return t;
299
+ }
300
+ export {
301
+ z as World,
302
+ O as defineComponent,
303
+ U as defineFields,
304
+ h as entityIndex,
305
+ b as system
306
+ };
307
+ //# sourceMappingURL=World.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"World.js","sources":["../../src/ecs/World.ts"],"sourcesContent":["import { SparseSet } from './SparseSet';\nimport { growColumns, isFields, type Columns, type FieldSpec, type FieldValues, type FieldsType } from './fields';\n\n/**\n * An entity–component–system store. Entities are numbers; components are data kept in one sparse set per component\n * type; systems are functions run in the order they were added, each in a phase:\n *\n * - `fixed` runs once per simulation step (`FixedLoop`), for movement and rules;\n * - `frame` runs once per rendered frame, for drawing and anything purely visual.\n *\n * Storage is a sparse set per component (packed arrays, O(1) lookups), the layout fast ECS libraries use. For hot\n * loops prefer `each` (a callback, no allocation per entity) over `query` (an iterator yielding a fresh row).\n *\n * Entity ids are recycled: an id carries its slot index and a generation, so an id kept after its entity was\n * destroyed never matches the entity that later reuses the slot.\n *\n * Changing structure while walking: adding components is always safe (new entries are not visited this walk).\n * Removing a component or destroying an entity while a `query`, an `each` or a system run is in progress is deferred\n * until it ends, so nothing is skipped or visited twice.\n */\n\nexport type Entity = number;\n\n/** A component type: a typed key. Make one per kind of data with `defineComponent`. */\nexport interface ComponentType<T> {\n readonly id: number;\n readonly name: string;\n /** Phantom field carrying `T`; never set. */\n readonly __type?: T;\n}\n\nlet nextComponentId = 0;\n/** Every component type made, by id: what a debugger names a store by. */\nconst TYPES: ComponentType<unknown>[] = [];\n\nexport function defineComponent<T>(name: string): ComponentType<T> {\n const type = { id: nextComponentId++, name };\n TYPES[type.id] = type;\n return type;\n}\n\n/** A component of numeric fields kept in typed-array columns (`fields.ts`): the fast form for data every body has. */\nexport function defineFields<const S extends FieldSpec>(name: string, fields: S): FieldsType<S> {\n const type = { id: nextComponentId++, name, fields };\n TYPES[type.id] = type;\n return type;\n}\n\nexport type SystemPhase = 'fixed' | 'frame';\n\nexport interface SystemContext {\n world: World;\n /** Seconds this run covers: one step in `fixed`, the frame's length in `frame`. */\n dt: number;\n /** `performance.now()` of the frame. */\n now: number;\n /** In `frame`: the share of a step since the last fixed step (0–1), for interpolation. 0 in `fixed`. */\n alpha: number;\n}\n\nexport interface System {\n readonly name: string;\n readonly phase: SystemPhase;\n run(ctx: SystemContext): void;\n /** Called when the system is taken out of its world (or the world is cleared). */\n dispose?(): void;\n}\n\n/** A system from a function. */\nexport function system(name: string, phase: SystemPhase, run: (ctx: SystemContext) => void): System {\n return { name, phase, run };\n}\n\nexport type ComponentValues<T extends readonly ComponentType<unknown>[]> = { [K in keyof T]: T[K] extends ComponentType<infer V> ? V : never };\n\n/** Slot index in the low 22 bits (4 million live entities), generation above. */\nconst INDEX_BITS = 22;\nconst INDEX_MASK = (1 << INDEX_BITS) - 1;\nconst MAX_GENERATION = 2 ** 31;\n\n/** The slot an entity id sits in. */\nexport const entityIndex = (e: Entity): number => e & INDEX_MASK;\n\ntype Pending = { kind: 'destroy'; e: Entity } | { kind: 'remove'; e: Entity; type: ComponentType<unknown> };\n\nexport class World {\n /** Current generation per slot; an id is alive when its generation matches and the slot is in use. */\n private generations: number[] = [];\n private readonly inUse: boolean[] = [];\n private readonly free: number[] = [];\n private live = 0;\n private readonly stores: (SparseSet<unknown> | undefined)[] = [];\n /** Typed-array columns of the field components, by component id. */\n private readonly cols: (Record<string, ArrayLike<number>> | undefined)[] = [];\n private readonly systems: System[] = [];\n private readonly pending: Pending[] = [];\n /** `slots` results by the component ids asked for, rebuilt only when one of those sets changed membership. */\n private readonly slotCache = new Map<string, { versions: number[]; slots: Int32Array; view: Int32Array }>();\n /** Walks (`query`, `each`, system runs) in progress: structure changes wait until it is 0. */\n private walking = 0;\n\n /** A new entity with no components. */\n create(): Entity {\n let index: number;\n if (this.free.length) {\n index = this.free.pop()!;\n } else {\n index = this.generations.length;\n if (index > INDEX_MASK) throw new Error('World: too many live entities');\n this.generations.push(0);\n this.inUse.push(false);\n }\n this.inUse[index] = true;\n this.live++;\n return this.generations[index]! * (INDEX_MASK + 1) + index;\n }\n\n /** A new entity with these components. */\n spawn(...components: [ComponentType<unknown>, unknown][]): Entity {\n const e = this.create();\n for (const [type, value] of components) this.add(e, type, value);\n return e;\n }\n\n isAlive(e: Entity): boolean {\n const index = entityIndex(e);\n return this.inUse[index] === true && this.generations[index] === Math.floor(e / (INDEX_MASK + 1));\n }\n\n /** Every live entity, for tools (a debugger, a save); allocates, so not for a per-frame path. */\n entities(): Entity[] {\n const out: Entity[] = [];\n for (let i = 0; i < this.inUse.length; i++) if (this.inUse[i]) out.push(this.generations[i]! * (INDEX_MASK + 1) + i);\n return out;\n }\n\n /** The component types `e` holds, for tools; allocates. */\n componentsOf(e: Entity): ComponentType<unknown>[] {\n if (!this.isAlive(e)) return [];\n const index = entityIndex(e);\n const out: ComponentType<unknown>[] = [];\n this.stores.forEach((store, id) => {\n if (store?.has(index)) out.push(TYPES[id]!);\n });\n return out;\n }\n\n /** Live entities. */\n get size(): number {\n return this.live;\n }\n\n /** Removes an entity and every component it had (deferred while a walk is in progress). */\n destroy(e: Entity): void {\n if (!this.isAlive(e)) return;\n if (this.walking > 0) {\n this.pending.push({ kind: 'destroy', e });\n return;\n }\n const index = entityIndex(e);\n for (const store of this.stores) store?.delete(index, entityIndex);\n this.inUse[index] = false;\n this.generations[index] = (this.generations[index]! + 1) % MAX_GENERATION;\n this.free.push(index);\n this.live--;\n }\n\n /** Gives an entity a field component; fields left out start at 0. Returns the slot index into its columns. */\n add<S extends FieldSpec>(e: Entity, type: FieldsType<S>, values?: FieldValues<S>): number;\n add<T>(e: Entity, type: ComponentType<T>, value: T): T;\n add(e: Entity, type: ComponentType<unknown>, value?: unknown): unknown {\n if (!this.isAlive(e)) throw new Error(`World.add: entity ${e} is not alive`);\n const index = entityIndex(e);\n if (isFields(type)) {\n const cols = this.columnsOf(type, index + 1) as Record<string, { [i: number]: number }>;\n const values = (value ?? {}) as Record<string, number>;\n for (const name of Object.keys(type.fields)) cols[name]![index] = values[name] ?? 0;\n this.store(type).set(index, e, index);\n return index;\n }\n this.store(type).set(index, e, value);\n return value;\n }\n\n /**\n * The typed-array columns of a field component, indexed by slot. Fetch them per system run: adding entities may\n * grow them into new arrays.\n */\n columns<S extends FieldSpec>(type: FieldsType<S>): Columns<S> {\n return this.columnsOf(type, this.generations.length) as unknown as Columns<S>;\n }\n\n get<T>(e: Entity, type: ComponentType<T>): T | undefined {\n if (!this.isAlive(e)) return undefined;\n return this.stores[type.id]?.get(entityIndex(e)) as T | undefined;\n }\n\n /** The component, or an error naming what is missing: for code that knows the entity has it. */\n require<T>(e: Entity, type: ComponentType<T>): T {\n const store = this.stores[type.id];\n if (!this.isAlive(e) || !store?.has(entityIndex(e))) throw new Error(`World.require: entity ${e} has no ${type.name}`);\n return store.get(entityIndex(e)) as T;\n }\n\n has(e: Entity, type: ComponentType<unknown>): boolean {\n return this.isAlive(e) && (this.stores[type.id]?.has(entityIndex(e)) ?? false);\n }\n\n /** Takes one component off an entity (deferred while a walk is in progress). */\n remove(e: Entity, type: ComponentType<unknown>): void {\n if (!this.isAlive(e)) return;\n if (this.walking > 0) {\n this.pending.push({ kind: 'remove', e, type });\n return;\n }\n this.stores[type.id]?.delete(entityIndex(e), entityIndex);\n }\n\n /** How many entities hold `type`. */\n count(type: ComponentType<unknown>): number {\n return this.stores[type.id]?.size ?? 0;\n }\n\n /**\n * Calls `fn(entity, ...components)` for every live entity holding all of `types`. Allocates nothing per entity:\n * the form for systems that walk thousands of bodies every step.\n */\n each<const T extends readonly ComponentType<unknown>[]>(...args: [...types: T, fn: (e: Entity, ...values: ComponentValues<T>) => void]): void {\n const fn = args[args.length - 1] as (e: Entity, ...values: unknown[]) => void;\n const types = args.slice(0, -1) as unknown as T;\n const sets = this.setsFor(types);\n if (!sets) return;\n const lead = smallest(sets);\n const n = lead.entities.length;\n this.walking++;\n try {\n if (sets.length === 1) {\n for (let i = n - 1; i >= 0; i--) fn(lead.entities[i]!, lead.values[i]);\n } else if (sets.length === 2) {\n const [a, b] = sets as [SparseSet<unknown>, SparseSet<unknown>];\n for (let i = n - 1; i >= 0; i--) {\n const e = lead.entities[i]!;\n const index = entityIndex(e);\n if (!a.has(index) || !b.has(index)) continue;\n fn(e, a.get(index), b.get(index));\n }\n } else {\n const row: unknown[] = new Array(sets.length);\n for (let i = n - 1; i >= 0; i--) {\n const e = lead.entities[i]!;\n const index = entityIndex(e);\n let all = true;\n for (let s = 0; s < sets.length; s++) {\n const set = sets[s]!;\n if (!set.has(index)) {\n all = false;\n break;\n }\n row[s] = set.get(index);\n }\n if (all) fn(e, ...row);\n }\n }\n } finally {\n this.endWalk();\n }\n }\n\n /**\n * The slot index of every entity holding all of `types`, as a typed array: the fastest walk there is, made for\n * field components (`defineFields`), whose columns are indexed by slot.\n *\n * ```ts\n * const p = world.columns(Position), v = world.columns(Velocity);\n * const slots = world.slots(Position, Velocity);\n * for (let k = 0; k < slots.length; k++) { const i = slots[k]!; p.x[i]! += v.x[i]! * dt; }\n * ```\n *\n * The result is cached and rebuilt only when an entity joins or leaves one of those components, so asking every\n * step is cheap. It is a view the world owns: read it, don't keep it past the step, and fetch it again after\n * adding or removing components.\n */\n slots(...types: ComponentType<unknown>[]): Int32Array {\n const key = types.map((t) => t.id).join(',');\n const sets = this.setsFor(types);\n if (!sets) return EMPTY_SLOTS;\n let cached = this.slotCache.get(key);\n if (cached && cached.versions.every((v, k) => v === sets[k]!.version)) return cached.view;\n const lead = smallest(sets);\n const out = cached && cached.slots.length >= lead.size ? cached.slots : new Int32Array(Math.max(16, lead.size));\n let n = 0;\n for (let d = 0; d < lead.entities.length; d++) {\n const index = entityIndex(lead.entities[d]!);\n let all = true;\n for (const set of sets) {\n if (set !== lead && !set.has(index)) {\n all = false;\n break;\n }\n }\n if (all) out[n++] = index;\n }\n cached = { versions: sets.map((x) => x.version), slots: out, view: out.subarray(0, n) };\n this.slotCache.set(key, cached);\n return cached.view;\n }\n\n /**\n * Every live entity holding all of `types`, with those components in the same order. Yields a fresh row per\n * entity: convenient, but `each` is the form for hot loops.\n */\n *query<const T extends readonly ComponentType<unknown>[]>(...types: T): IterableIterator<[Entity, ...ComponentValues<T>]> {\n const sets = this.setsFor(types);\n if (!sets) return;\n const lead = smallest(sets);\n this.walking++;\n try {\n for (let i = lead.entities.length - 1; i >= 0; i--) {\n const e = lead.entities[i]!;\n const index = entityIndex(e);\n const row: unknown[] = [e];\n let all = true;\n for (const set of sets) {\n if (!set.has(index)) {\n all = false;\n break;\n }\n row.push(set.get(index));\n }\n if (all) yield row as [Entity, ...ComponentValues<T>];\n }\n } finally {\n this.endWalk();\n }\n }\n\n /** The first entity matching the query, or undefined: for singletons (the player, the camera target). */\n first<const T extends readonly ComponentType<unknown>[]>(...types: T): [Entity, ...ComponentValues<T>] | undefined {\n for (const row of this.query(...types)) return row;\n return undefined;\n }\n\n addSystem(s: System): this {\n if (this.systems.some((x) => x.name === s.name)) throw new Error(`World.addSystem: a system named \"${s.name}\" is already added`);\n this.systems.push(s);\n return this;\n }\n\n removeSystem(name: string): void {\n const i = this.systems.findIndex((s) => s.name === name);\n if (i < 0) return;\n const [s] = this.systems.splice(i, 1);\n s!.dispose?.();\n }\n\n /** Runs every system of `phase` in the order added. A system that throws is reported and the rest still run. */\n run(phase: SystemPhase, ctx: Omit<SystemContext, 'world'>, onError?: (system: System, err: unknown) => void): void {\n const full: SystemContext = { dt: ctx.dt, now: ctx.now, alpha: ctx.alpha, world: this };\n this.walking++;\n try {\n for (const s of this.systems) {\n if (s.phase !== phase) continue;\n try {\n s.run(full);\n } catch (err) {\n if (onError) onError(s, err);\n else throw err;\n }\n }\n } finally {\n this.endWalk();\n }\n }\n\n /** Every entity, component and system gone. */\n clear(): void {\n for (const s of this.systems.splice(0)) s.dispose?.();\n for (const store of this.stores) store?.clear();\n this.generations = this.generations.map((g) => (g + 1) % MAX_GENERATION);\n this.inUse.fill(false);\n this.free.length = 0;\n for (let i = this.generations.length - 1; i >= 0; i--) this.free.push(i);\n this.live = 0;\n this.pending.length = 0;\n this.slotCache.clear();\n }\n\n private columnsOf(type: FieldsType<FieldSpec>, slots: number): Record<string, ArrayLike<number>> {\n let cols = this.cols[type.id];\n const have = cols ? (Object.values(cols)[0]?.length ?? 0) : 0;\n if (!cols || have < slots) {\n let n = Math.max(64, have);\n while (n < slots) n *= 2;\n cols = growColumns(type.fields, n, cols);\n this.cols[type.id] = cols;\n }\n return cols;\n }\n\n private store<T>(type: ComponentType<T>): SparseSet<unknown> {\n let s = this.stores[type.id];\n if (!s) {\n s = new SparseSet<unknown>();\n this.stores[type.id] = s;\n }\n return s;\n }\n\n /** The stores for `types`, or null when one has never been used (so nothing can match). */\n private setsFor(types: readonly ComponentType<unknown>[]): SparseSet<unknown>[] | null {\n if (types.length === 0) return null;\n const sets: SparseSet<unknown>[] = [];\n for (const t of types) {\n const s = this.stores[t.id];\n if (!s || s.size === 0) return null;\n sets.push(s);\n }\n return sets;\n }\n\n private endWalk(): void {\n this.walking--;\n if (this.walking > 0 || this.pending.length === 0) return;\n const pending = this.pending.splice(0);\n for (const p of pending) {\n if (p.kind === 'destroy') this.destroy(p.e);\n else this.remove(p.e, p.type);\n }\n }\n}\n\nconst EMPTY_SLOTS = new Int32Array(0);\n\nfunction smallest(sets: SparseSet<unknown>[]): SparseSet<unknown> {\n let lead = sets[0]!;\n for (const s of sets) if (s.size < lead.size) lead = s;\n return lead;\n}\n"],"names":["nextComponentId","TYPES","defineComponent","name","type","defineFields","fields","system","phase","run","INDEX_BITS","INDEX_MASK","MAX_GENERATION","entityIndex","e","World","index","components","value","out","i","store","id","isFields","cols","values","args","fn","types","sets","lead","smallest","n","a","b","row","all","s","set","key","t","EMPTY_SLOTS","cached","v","k","d","x","ctx","onError","full","err","g","slots","have","growColumns","SparseSet","pending","p"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ const c = {
2
+ f32: Float32Array,
3
+ f64: Float64Array,
4
+ i8: Int8Array,
5
+ i16: Int16Array,
6
+ i32: Int32Array,
7
+ u8: Uint8Array,
8
+ u16: Uint16Array,
9
+ u32: Uint32Array
10
+ };
11
+ function u(r) {
12
+ return r.fields !== void 0;
13
+ }
14
+ function f(r, e, a) {
15
+ const n = {};
16
+ for (const [t, s] of Object.entries(r)) {
17
+ const o = new c[s](e), i = a?.[t];
18
+ i && o.set(i), n[t] = o;
19
+ }
20
+ return n;
21
+ }
22
+ export {
23
+ f as growColumns,
24
+ u as isFields
25
+ };
26
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sources":["../../src/ecs/fields.ts"],"sourcesContent":["import type { ComponentType } from './World';\n\n/**\n * Numeric components stored as columns of typed arrays instead of one object per entity: `Position.x` and\n * `Position.y` are two `Float32Array`s indexed by the entity's slot. A system walking thousands of bodies then reads\n * memory in order and makes no garbage, which is several times faster than objects at scale (see `bench/`).\n *\n * ```ts\n * const Position = defineFields('Position', { x: 'f32', y: 'f32' });\n * world.add(e, Position, { x: 10, y: 20 });\n * const p = world.columns(Position); // fetch per run: columns grow (and are replaced) as entities are added\n * world.each(Position, (e, i) => { p.x[i] += 1; });\n * ```\n *\n * In `each`/`query` a field component's value is the entity's slot index `i`, the index into every column.\n */\nexport type FieldKind = 'f32' | 'f64' | 'i8' | 'i16' | 'i32' | 'u8' | 'u16' | 'u32';\n\nexport type FieldSpec = Record<string, FieldKind>;\n\nexport type ArrayOf<K extends FieldKind> = K extends 'f32'\n ? Float32Array\n : K extends 'f64'\n ? Float64Array\n : K extends 'i8'\n ? Int8Array\n : K extends 'i16'\n ? Int16Array\n : K extends 'i32'\n ? Int32Array\n : K extends 'u8'\n ? Uint8Array\n : K extends 'u16'\n ? Uint16Array\n : Uint32Array;\n\n/** One typed array per field, indexed by slot. */\nexport type Columns<S extends FieldSpec> = { [K in keyof S]: ArrayOf<S[K]> };\n\n/** What `add` takes for a field component: any subset of its fields (the rest start at 0). */\nexport type FieldValues<S extends FieldSpec> = { [K in keyof S]?: number };\n\n/** A component of numeric fields. Its value in `each`/`query` is the slot index. */\nexport interface FieldsType<S extends FieldSpec> extends ComponentType<number> {\n readonly fields: S;\n}\n\nconst CTORS: Record<FieldKind, new (n: number) => ArrayLike<number> & { set(a: ArrayLike<number>): void }> = {\n f32: Float32Array,\n f64: Float64Array,\n i8: Int8Array,\n i16: Int16Array,\n i32: Int32Array,\n u8: Uint8Array,\n u16: Uint16Array,\n u32: Uint32Array,\n};\n\nexport function isFields(type: ComponentType<unknown>): type is FieldsType<FieldSpec> {\n return (type as { fields?: unknown }).fields !== undefined;\n}\n\n/** Fresh columns of at least `n` slots, keeping what `old` held. */\nexport function growColumns(spec: FieldSpec, n: number, old?: Record<string, ArrayLike<number>>): Record<string, ArrayLike<number>> {\n const out: Record<string, ArrayLike<number>> = {};\n for (const [name, kind] of Object.entries(spec)) {\n const col = new CTORS[kind](n);\n const prev = old?.[name];\n if (prev) col.set(prev);\n out[name] = col;\n }\n return out;\n}\n"],"names":["CTORS","isFields","type","growColumns","spec","n","old","out","name","kind","col","prev"],"mappings":"AA+CA,MAAMA,IAAuG;AAAA,EAC3G,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AACP;AAEO,SAASC,EAASC,GAA6D;AACpF,SAAQA,EAA8B,WAAW;AACnD;AAGO,SAASC,EAAYC,GAAiBC,GAAWC,GAA4E;AAClI,QAAMC,IAAyC,CAAA;AAC/C,aAAW,CAACC,GAAMC,CAAI,KAAK,OAAO,QAAQL,CAAI,GAAG;AAC/C,UAAMM,IAAM,IAAIV,EAAMS,CAAI,EAAEJ,CAAC,GACvBM,IAAOL,IAAME,CAAI;AACvB,IAAIG,KAAMD,EAAI,IAAIC,CAAI,GACtBJ,EAAIC,CAAI,IAAIE;AAAA,EACd;AACA,SAAOH;AACT;"}
@@ -0,0 +1,82 @@
1
+ import { TextureSource as d, Application as l } from "pixi.js";
2
+ import { Stage as o } from "../core/Stage.js";
3
+ import { TextureRegistry as p } from "../core/TextureRegistry.js";
4
+ import { patchPixi as m } from "../core/pixiPatches.js";
5
+ import { EventBus as f } from "../events/EventBus.js";
6
+ import { FixedLoop as g } from "./FixedLoop.js";
7
+ import { SceneManager as v } from "./SceneManager.js";
8
+ class x extends o {
9
+ constructor(e, t, r) {
10
+ super(e, t), this.tick = r;
11
+ }
12
+ tick;
13
+ update(e, t) {
14
+ this.tick(e, t);
15
+ }
16
+ }
17
+ class c {
18
+ constructor(e, t, r) {
19
+ this.app = e, this.loop = new g(r.hz === void 0 ? {} : { hz: r.hz }), this.stage = new x(e, t, (s, n) => this.tick(s, n));
20
+ const i = this.stage.cameras.main;
21
+ i.setZoom(r.zoom ?? 1), i.defaultZoom = i.zoom, i.roundPixels = r.pixelPerfect === !0, i.resolution = e.renderer.resolution, this.scenes = new v(this), o.onCaught = (s, n) => this.events.emit("error", { where: s, error: n }), e.ticker.add(this.onTick);
22
+ }
23
+ app;
24
+ stage;
25
+ loop;
26
+ scenes;
27
+ events = new f();
28
+ running = !0;
29
+ destroyed = !1;
30
+ onTick = (e) => this.stage.frame(e.deltaMS);
31
+ static async create(e) {
32
+ const t = e.pixelPerfect === !0;
33
+ d.defaultOptions.scaleMode = t ? "nearest" : "linear";
34
+ const r = t ? 1 : e.resolution ?? Math.min(2, typeof devicePixelRatio == "number" ? devicePixelRatio : 1);
35
+ m();
36
+ const i = new l(), s = e.width === void 0 && e.height === void 0;
37
+ return await i.init({
38
+ ...s ? { resizeTo: e.parent } : { width: e.width ?? 800, height: e.height ?? 600 },
39
+ background: e.background ?? "#000000",
40
+ antialias: !t,
41
+ resolution: r,
42
+ autoDensity: !0,
43
+ preference: e.preference ?? "webgl"
44
+ }), e.parent.appendChild(i.canvas), new c(i, e.textures ?? new p(), e);
45
+ }
46
+ /** The scene that updates now, if any. */
47
+ get scene() {
48
+ return this.scenes.current;
49
+ }
50
+ /** Stops simulating and drawing; the canvas keeps its last frame. */
51
+ pause() {
52
+ this.running && (this.running = !1, this.app.ticker.stop());
53
+ }
54
+ resume() {
55
+ this.running || this.destroyed || (this.running = !0, this.loop.reset(), this.app.ticker.start());
56
+ }
57
+ get paused() {
58
+ return !this.running;
59
+ }
60
+ /** Reports a fault to `events.error` (and the console when nobody listens). */
61
+ reportError(e, t) {
62
+ this.events.listenerCount("error") === 0 && console.error(`[engine] ${e}`, t), this.events.emit("error", { where: e, error: t });
63
+ }
64
+ /** Leaves every scene, removes the canvas and frees the renderer. */
65
+ async destroy() {
66
+ this.destroyed || (this.destroyed = !0, await this.scenes.clear(), this.app.ticker.remove(this.onTick), o.onCaught && (o.onCaught = null), this.stage.destroy(), this.events.clear(), this.app.destroy({ removeView: !0 }, { children: !0 }));
67
+ }
68
+ tick(e, t) {
69
+ const r = this.scenes.current;
70
+ if (r) {
71
+ const i = (h, u) => this.reportError(`system ${h.name}`, u), s = this.loop.stepSeconds, n = this.loop.advance(t, () => {
72
+ r.world.run("fixed", { dt: s, now: e, alpha: 0 }, i), r.fixedUpdate(s);
73
+ }), a = t / 1e3;
74
+ r.world.run("frame", { dt: a, now: e, alpha: n }, i), r.update(a, n);
75
+ }
76
+ this.events.emit("frame", { now: e, dt: t / 1e3 });
77
+ }
78
+ }
79
+ export {
80
+ c as Engine
81
+ };
82
+ //# sourceMappingURL=Engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Engine.js","sources":["../../src/engine/Engine.ts"],"sourcesContent":["import { Application, TextureSource } from 'pixi.js';\nimport { Stage } from '../core/Stage';\nimport { TextureRegistry } from '../core/TextureRegistry';\nimport { patchPixi } from '../core/pixiPatches';\nimport { EventBus } from '../events/EventBus';\nimport { FixedLoop } from './FixedLoop';\nimport { SceneManager } from './SceneManager';\nimport type { Scene } from './Scene';\n\nexport interface EngineOptions {\n /** Where the canvas goes. */\n parent: HTMLElement;\n /** A fixed canvas size in CSS pixels. Leave both out to fill `parent` and follow its size. */\n width?: number;\n height?: number;\n /** CSS colour behind the world (default black). */\n background?: string;\n /** World pixels are drawn this many screen pixels wide (default 1). Whole numbers keep pixel art crisp. */\n zoom?: number;\n /** Simulation steps per second (default 60). */\n hz?: number;\n /** Textures shared by the stage; a fresh registry by default. */\n textures?: TextureRegistry;\n /**\n * Pixel art: nearest-neighbour textures, no antialiasing, one backing pixel per CSS pixel, and a camera that lands\n * on whole pixels (default false: smooth textures drawn at the screen's own density, for any other art style).\n */\n pixelPerfect?: boolean;\n /** Backing pixels per CSS pixel when not `pixelPerfect` (default `devicePixelRatio`, at most 2). */\n resolution?: number;\n /**\n * Renderer preference (default 'webgl'). WebGL 2 runs everywhere the engine is tested. 'webgpu' is experimental:\n * Pixi falls back to WebGL where WebGPU is missing, but the engine's own paths (pooled `PixelLayer` buffers, the\n * `erase` blend `Darkness` cuts lights with, the fill filters) have only been profiled on WebGL.\n */\n preference?: 'webgl' | 'webgpu';\n}\n\nexport interface EngineEvents {\n /** Something a guarded step or a system threw; the frame carried on. */\n error: { where: string; error: unknown };\n /** After every rendered frame's update, before Pixi renders. */\n frame: { now: number; dt: number };\n}\n\n/** The stage the engine drives: its per-frame update is the engine's tick. */\nclass EngineStage extends Stage {\n constructor(\n app: Application,\n textures: TextureRegistry,\n private readonly tick: (now: number, delta: number) => void,\n ) {\n super(app, textures);\n }\n\n override update(now: number, delta: number): void {\n this.tick(now, delta);\n }\n}\n\n/**\n * The top of the engine: a Pixi application, the `Stage` (world and screen layers, camera, tweens, timers,\n * pointer), a fixed-step simulation loop and a stack of scenes.\n *\n * ```ts\n * const engine = await Engine.create({ parent: document.body, zoom: 3 });\n * await engine.scenes.replace(new MyLevel());\n * ```\n */\nexport class Engine {\n readonly stage: Stage;\n readonly loop: FixedLoop;\n readonly scenes: SceneManager;\n readonly events = new EventBus<EngineEvents>();\n private running = true;\n private destroyed = false;\n private readonly onTick = (t: { deltaMS: number }) => this.stage.frame(t.deltaMS);\n\n private constructor(\n readonly app: Application,\n textures: TextureRegistry,\n options: EngineOptions,\n ) {\n this.loop = new FixedLoop(options.hz === undefined ? {} : { hz: options.hz });\n this.stage = new EngineStage(app, textures, (now, delta) => this.tick(now, delta));\n const cam = this.stage.cameras.main;\n cam.setZoom(options.zoom ?? 1);\n cam.defaultZoom = cam.zoom;\n cam.roundPixels = options.pixelPerfect === true;\n cam.resolution = app.renderer.resolution;\n this.scenes = new SceneManager(this);\n Stage.onCaught = (where, error) => this.events.emit('error', { where, error });\n app.ticker.add(this.onTick);\n }\n\n static async create(options: EngineOptions): Promise<Engine> {\n const pixel = options.pixelPerfect === true;\n TextureSource.defaultOptions.scaleMode = pixel ? 'nearest' : 'linear';\n const resolution = pixel ? 1 : (options.resolution ?? Math.min(2, typeof devicePixelRatio === 'number' ? devicePixelRatio : 1));\n patchPixi();\n const app = new Application();\n const fill = options.width === undefined && options.height === undefined;\n await app.init({\n ...(fill ? { resizeTo: options.parent } : { width: options.width ?? 800, height: options.height ?? 600 }),\n background: options.background ?? '#000000',\n antialias: !pixel,\n resolution,\n autoDensity: true,\n preference: options.preference ?? 'webgl',\n });\n options.parent.appendChild(app.canvas);\n return new Engine(app, options.textures ?? new TextureRegistry(), options);\n }\n\n /** The scene that updates now, if any. */\n get scene(): Scene | undefined {\n return this.scenes.current;\n }\n\n /** Stops simulating and drawing; the canvas keeps its last frame. */\n pause(): void {\n if (!this.running) return;\n this.running = false;\n this.app.ticker.stop();\n }\n\n resume(): void {\n if (this.running || this.destroyed) return;\n this.running = true;\n this.loop.reset();\n this.app.ticker.start();\n }\n\n get paused(): boolean {\n return !this.running;\n }\n\n /** Reports a fault to `events.error` (and the console when nobody listens). */\n reportError(where: string, error: unknown): void {\n if (this.events.listenerCount('error') === 0) console.error(`[engine] ${where}`, error);\n this.events.emit('error', { where, error });\n }\n\n /** Leaves every scene, removes the canvas and frees the renderer. */\n async destroy(): Promise<void> {\n if (this.destroyed) return;\n this.destroyed = true;\n await this.scenes.clear();\n this.app.ticker.remove(this.onTick);\n if (Stage.onCaught) Stage.onCaught = null;\n this.stage.destroy();\n this.events.clear();\n this.app.destroy({ removeView: true }, { children: true });\n }\n\n private tick(now: number, delta: number): void {\n const scene = this.scenes.current;\n if (scene) {\n const report = (s: { name: string }, err: unknown) => this.reportError(`system ${s.name}`, err);\n const step = this.loop.stepSeconds;\n const alpha = this.loop.advance(delta, () => {\n scene.world.run('fixed', { dt: step, now, alpha: 0 }, report);\n scene.fixedUpdate(step);\n });\n const dt = delta / 1000;\n scene.world.run('frame', { dt, now, alpha }, report);\n scene.update(dt, alpha);\n }\n this.events.emit('frame', { now, dt: delta / 1000 });\n }\n}\n"],"names":["EngineStage","Stage","app","textures","tick","now","delta","Engine","options","FixedLoop","cam","SceneManager","where","error","EventBus","t","pixel","TextureSource","resolution","patchPixi","Application","fill","TextureRegistry","scene","report","s","err","step","alpha","dt"],"mappings":";;;;;;;AA8CA,MAAMA,UAAoBC,EAAM;AAAA,EAC9B,YACEC,GACAC,GACiBC,GACjB;AACA,UAAMF,GAAKC,CAAQ,GAFF,KAAA,OAAAC;AAAA,EAGnB;AAAA,EAHmB;AAAA,EAKV,OAAOC,GAAaC,GAAqB;AAChD,SAAK,KAAKD,GAAKC,CAAK;AAAA,EACtB;AACF;AAWO,MAAMC,EAAO;AAAA,EASV,YACGL,GACTC,GACAK,GACA;AAHS,SAAA,MAAAN,GAIT,KAAK,OAAO,IAAIO,EAAUD,EAAQ,OAAO,SAAY,CAAA,IAAK,EAAE,IAAIA,EAAQ,GAAA,CAAI,GAC5E,KAAK,QAAQ,IAAIR,EAAYE,GAAKC,GAAU,CAACE,GAAKC,MAAU,KAAK,KAAKD,GAAKC,CAAK,CAAC;AACjF,UAAMI,IAAM,KAAK,MAAM,QAAQ;AAC/B,IAAAA,EAAI,QAAQF,EAAQ,QAAQ,CAAC,GAC7BE,EAAI,cAAcA,EAAI,MACtBA,EAAI,cAAcF,EAAQ,iBAAiB,IAC3CE,EAAI,aAAaR,EAAI,SAAS,YAC9B,KAAK,SAAS,IAAIS,EAAa,IAAI,GACnCV,EAAM,WAAW,CAACW,GAAOC,MAAU,KAAK,OAAO,KAAK,SAAS,EAAE,OAAAD,GAAO,OAAAC,EAAA,CAAO,GAC7EX,EAAI,OAAO,IAAI,KAAK,MAAM;AAAA,EAC5B;AAAA,EAdW;AAAA,EATF;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,IAAIY,EAAA;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACH,SAAS,CAACC,MAA2B,KAAK,MAAM,MAAMA,EAAE,OAAO;AAAA,EAmBhF,aAAa,OAAOP,GAAyC;AAC3D,UAAMQ,IAAQR,EAAQ,iBAAiB;AACvC,IAAAS,EAAc,eAAe,YAAYD,IAAQ,YAAY;AAC7D,UAAME,IAAaF,IAAQ,IAAKR,EAAQ,cAAc,KAAK,IAAI,GAAG,OAAO,oBAAqB,WAAW,mBAAmB,CAAC;AAC7H,IAAAW,EAAA;AACA,UAAMjB,IAAM,IAAIkB,EAAA,GACVC,IAAOb,EAAQ,UAAU,UAAaA,EAAQ,WAAW;AAC/D,iBAAMN,EAAI,KAAK;AAAA,MACb,GAAImB,IAAO,EAAE,UAAUb,EAAQ,OAAA,IAAW,EAAE,OAAOA,EAAQ,SAAS,KAAK,QAAQA,EAAQ,UAAU,IAAA;AAAA,MACnG,YAAYA,EAAQ,cAAc;AAAA,MAClC,WAAW,CAACQ;AAAA,MACZ,YAAAE;AAAA,MACA,aAAa;AAAA,MACb,YAAYV,EAAQ,cAAc;AAAA,IAAA,CACnC,GACDA,EAAQ,OAAO,YAAYN,EAAI,MAAM,GAC9B,IAAIK,EAAOL,GAAKM,EAAQ,YAAY,IAAIc,EAAA,GAAmBd,CAAO;AAAA,EAC3E;AAAA;AAAA,EAGA,IAAI,QAA2B;AAC7B,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAGA,QAAc;AACZ,IAAK,KAAK,YACV,KAAK,UAAU,IACf,KAAK,IAAI,OAAO,KAAA;AAAA,EAClB;AAAA,EAEA,SAAe;AACb,IAAI,KAAK,WAAW,KAAK,cACzB,KAAK,UAAU,IACf,KAAK,KAAK,MAAA,GACV,KAAK,IAAI,OAAO,MAAA;AAAA,EAClB;AAAA,EAEA,IAAI,SAAkB;AACpB,WAAO,CAAC,KAAK;AAAA,EACf;AAAA;AAAA,EAGA,YAAYI,GAAeC,GAAsB;AAC/C,IAAI,KAAK,OAAO,cAAc,OAAO,MAAM,KAAG,QAAQ,MAAM,YAAYD,CAAK,IAAIC,CAAK,GACtF,KAAK,OAAO,KAAK,SAAS,EAAE,OAAAD,GAAO,OAAAC,GAAO;AAAA,EAC5C;AAAA;AAAA,EAGA,MAAM,UAAyB;AAC7B,IAAI,KAAK,cACT,KAAK,YAAY,IACjB,MAAM,KAAK,OAAO,MAAA,GAClB,KAAK,IAAI,OAAO,OAAO,KAAK,MAAM,GAC9BZ,EAAM,aAAUA,EAAM,WAAW,OACrC,KAAK,MAAM,QAAA,GACX,KAAK,OAAO,MAAA,GACZ,KAAK,IAAI,QAAQ,EAAE,YAAY,MAAQ,EAAE,UAAU,IAAM;AAAA,EAC3D;AAAA,EAEQ,KAAKI,GAAaC,GAAqB;AAC7C,UAAMiB,IAAQ,KAAK,OAAO;AAC1B,QAAIA,GAAO;AACT,YAAMC,IAAS,CAACC,GAAqBC,MAAiB,KAAK,YAAY,UAAUD,EAAE,IAAI,IAAIC,CAAG,GACxFC,IAAO,KAAK,KAAK,aACjBC,IAAQ,KAAK,KAAK,QAAQtB,GAAO,MAAM;AAC3C,QAAAiB,EAAM,MAAM,IAAI,SAAS,EAAE,IAAII,GAAM,KAAAtB,GAAK,OAAO,EAAA,GAAKmB,CAAM,GAC5DD,EAAM,YAAYI,CAAI;AAAA,MACxB,CAAC,GACKE,IAAKvB,IAAQ;AACnB,MAAAiB,EAAM,MAAM,IAAI,SAAS,EAAE,IAAAM,GAAI,KAAAxB,GAAK,OAAAuB,EAAA,GAASJ,CAAM,GACnDD,EAAM,OAAOM,GAAID,CAAK;AAAA,IACxB;AACA,SAAK,OAAO,KAAK,SAAS,EAAE,KAAAvB,GAAK,IAAIC,IAAQ,KAAM;AAAA,EACrD;AACF;"}
@@ -0,0 +1,37 @@
1
+ class i {
2
+ stepMs;
3
+ stepSeconds;
4
+ maxSteps;
5
+ carry = 0;
6
+ /** Steps taken since the loop started. */
7
+ tick = 0;
8
+ constructor(s = {}) {
9
+ const t = s.hz ?? 60;
10
+ if (!(t > 0)) throw new Error(`FixedLoop: hz must be positive, got ${t}`);
11
+ this.stepMs = 1e3 / t, this.stepSeconds = 1 / t, this.maxSteps = Math.max(1, s.maxStepsPerFrame ?? 8);
12
+ }
13
+ /**
14
+ * Feeds one frame of `deltaMs` and runs `step` as many times as it owes. Returns the share of a step left over
15
+ * (0–1), for interpolating what is drawn between the last two steps.
16
+ */
17
+ advance(s, t) {
18
+ s > 0 && Number.isFinite(s) && (this.carry += s);
19
+ let e = 0;
20
+ for (; this.carry >= this.stepMs; ) {
21
+ if (e === this.maxSteps) {
22
+ this.carry %= this.stepMs;
23
+ break;
24
+ }
25
+ this.carry -= this.stepMs, e++, t(this.tick++);
26
+ }
27
+ return this.carry / this.stepMs;
28
+ }
29
+ /** Forgets any debt, e.g. after a scene change or a long load. */
30
+ reset() {
31
+ this.carry = 0;
32
+ }
33
+ }
34
+ export {
35
+ i as FixedLoop
36
+ };
37
+ //# sourceMappingURL=FixedLoop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FixedLoop.js","sources":["../../src/engine/FixedLoop.ts"],"sourcesContent":["/**\n * A fixed-timestep accumulator: frames arrive whenever the display wants them, the simulation advances in equal\n * steps. Movement and anything a server replays must run here, so every machine takes the same steps whatever its\n * frame rate.\n *\n * A frame that comes very late (a tab in the background, a debugger) would owe hundreds of steps; at most\n * `maxStepsPerFrame` are run and the rest of the debt is dropped, so the game slows down instead of freezing while it\n * catches up (the \"spiral of death\").\n */\nexport interface FixedLoopOptions {\n /** Steps per second (default 60). */\n hz?: number;\n /** The most steps one frame may run before the debt is dropped (default 8). */\n maxStepsPerFrame?: number;\n}\n\nexport class FixedLoop {\n readonly stepMs: number;\n readonly stepSeconds: number;\n private readonly maxSteps: number;\n private carry = 0;\n /** Steps taken since the loop started. */\n tick = 0;\n\n constructor(options: FixedLoopOptions = {}) {\n const hz = options.hz ?? 60;\n if (!(hz > 0)) throw new Error(`FixedLoop: hz must be positive, got ${hz}`);\n this.stepMs = 1000 / hz;\n this.stepSeconds = 1 / hz;\n this.maxSteps = Math.max(1, options.maxStepsPerFrame ?? 8);\n }\n\n /**\n * Feeds one frame of `deltaMs` and runs `step` as many times as it owes. Returns the share of a step left over\n * (0–1), for interpolating what is drawn between the last two steps.\n */\n advance(deltaMs: number, step: (tick: number) => void): number {\n if (deltaMs > 0 && Number.isFinite(deltaMs)) this.carry += deltaMs;\n let ran = 0;\n while (this.carry >= this.stepMs) {\n if (ran === this.maxSteps) {\n this.carry %= this.stepMs;\n break;\n }\n this.carry -= this.stepMs;\n ran++;\n step(this.tick++);\n }\n return this.carry / this.stepMs;\n }\n\n /** Forgets any debt, e.g. after a scene change or a long load. */\n reset(): void {\n this.carry = 0;\n }\n}\n"],"names":["FixedLoop","options","hz","deltaMs","step","ran"],"mappings":"AAgBO,MAAMA,EAAU;AAAA,EACZ;AAAA,EACA;AAAA,EACQ;AAAA,EACT,QAAQ;AAAA;AAAA,EAEhB,OAAO;AAAA,EAEP,YAAYC,IAA4B,IAAI;AAC1C,UAAMC,IAAKD,EAAQ,MAAM;AACzB,QAAI,EAAEC,IAAK,GAAI,OAAM,IAAI,MAAM,uCAAuCA,CAAE,EAAE;AAC1E,SAAK,SAAS,MAAOA,GACrB,KAAK,cAAc,IAAIA,GACvB,KAAK,WAAW,KAAK,IAAI,GAAGD,EAAQ,oBAAoB,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQE,GAAiBC,GAAsC;AAC7D,IAAID,IAAU,KAAK,OAAO,SAASA,CAAO,WAAQ,SAASA;AAC3D,QAAIE,IAAM;AACV,WAAO,KAAK,SAAS,KAAK,UAAQ;AAChC,UAAIA,MAAQ,KAAK,UAAU;AACzB,aAAK,SAAS,KAAK;AACnB;AAAA,MACF;AACA,WAAK,SAAS,KAAK,QACnBA,KACAD,EAAK,KAAK,MAAM;AAAA,IAClB;AACA,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,QAAQ;AAAA,EACf;AACF;"}