@zylem/game-lib 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/README.md +23 -41
  2. package/dist/actions.d.ts +25 -0
  3. package/dist/actions.js +287 -8
  4. package/dist/actions.js.map +1 -0
  5. package/dist/behaviors.d.ts +106 -0
  6. package/dist/behaviors.js +396 -6
  7. package/dist/behaviors.js.map +1 -0
  8. package/dist/blueprints-BOCc3Wve.d.ts +26 -0
  9. package/dist/{src/lib/camera/zylem-camera.d.ts → camera-CpbDr4-V.d.ts} +48 -27
  10. package/dist/camera.d.ts +5 -0
  11. package/dist/camera.js +608 -4
  12. package/dist/camera.js.map +1 -0
  13. package/dist/core-CZhozNRH.d.ts +466 -0
  14. package/dist/core.d.ts +10 -0
  15. package/dist/core.js +5761 -9
  16. package/dist/core.js.map +1 -0
  17. package/dist/entities-BAxfJOkk.d.ts +307 -0
  18. package/dist/entities.d.ts +6 -0
  19. package/dist/entities.js +2284 -17
  20. package/dist/entities.js.map +1 -0
  21. package/dist/{src/lib/interfaces/entity.d.ts → entity-Bq_eNEDI.d.ts} +8 -6
  22. package/dist/entity-COvRtFNG.d.ts +395 -0
  23. package/dist/main.d.ts +211 -0
  24. package/dist/main.js +7600 -56
  25. package/dist/main.js.map +1 -0
  26. package/dist/moveable-B_vyA6cw.d.ts +67 -0
  27. package/dist/stage-types-CD21XoIU.d.ts +338 -0
  28. package/dist/stage.d.ts +46 -0
  29. package/dist/stage.js +2765 -4
  30. package/dist/stage.js.map +1 -0
  31. package/dist/transformable-CUhvyuYO.d.ts +67 -0
  32. package/package.json +11 -47
  33. package/dist/.vite/manifest.json +0 -716
  34. package/dist/assets/zylem-logo.png +0 -0
  35. package/dist/examples/00-readme-example.d.ts +0 -2
  36. package/dist/examples/00-readme-example.d.ts.map +0 -1
  37. package/dist/examples/01-basic.d.ts +0 -2
  38. package/dist/examples/01-basic.d.ts.map +0 -1
  39. package/dist/examples/01.1-basic-ball.d.ts +0 -9
  40. package/dist/examples/01.1-basic-ball.d.ts.map +0 -1
  41. package/dist/examples/01.2-ricochet-test.d.ts +0 -2
  42. package/dist/examples/01.2-ricochet-test.d.ts.map +0 -1
  43. package/dist/examples/01.3-rect.d.ts +0 -2
  44. package/dist/examples/01.3-rect.d.ts.map +0 -1
  45. package/dist/examples/02-input.d.ts +0 -2
  46. package/dist/examples/02-input.d.ts.map +0 -1
  47. package/dist/examples/03-stage-test/03-stage-test.d.ts +0 -2
  48. package/dist/examples/03-stage-test/03-stage-test.d.ts.map +0 -1
  49. package/dist/examples/03-stage-test/stage0.d.ts +0 -2
  50. package/dist/examples/03-stage-test/stage0.d.ts.map +0 -1
  51. package/dist/examples/03-stage-test/stage1.d.ts +0 -2
  52. package/dist/examples/03-stage-test/stage1.d.ts.map +0 -1
  53. package/dist/examples/03-stage-test/stage2.d.ts +0 -2
  54. package/dist/examples/03-stage-test/stage2.d.ts.map +0 -1
  55. package/dist/examples/03-stage-test/stage3.d.ts +0 -2
  56. package/dist/examples/03-stage-test/stage3.d.ts.map +0 -1
  57. package/dist/examples/03.1-stage-variable.d.ts +0 -2
  58. package/dist/examples/03.1-stage-variable.d.ts.map +0 -1
  59. package/dist/examples/04-vessel-test.d.ts +0 -18
  60. package/dist/examples/04-vessel-test.d.ts.map +0 -1
  61. package/dist/examples/05-camera-test.d.ts +0 -2
  62. package/dist/examples/05-camera-test.d.ts.map +0 -1
  63. package/dist/examples/06-entity-test.d.ts +0 -2
  64. package/dist/examples/06-entity-test.d.ts.map +0 -1
  65. package/dist/examples/07-behaviors.d.ts +0 -2
  66. package/dist/examples/07-behaviors.d.ts.map +0 -1
  67. package/dist/examples/07.01-behavior-context.d.ts +0 -2
  68. package/dist/examples/07.01-behavior-context.d.ts.map +0 -1
  69. package/dist/examples/08-pong.d.ts +0 -2
  70. package/dist/examples/08-pong.d.ts.map +0 -1
  71. package/dist/examples/08.01-breakout.d.ts +0 -2
  72. package/dist/examples/08.01-breakout.d.ts.map +0 -1
  73. package/dist/examples/09-space-invaders.d.ts +0 -2
  74. package/dist/examples/09-space-invaders.d.ts.map +0 -1
  75. package/dist/examples/10-asteroids.d.ts +0 -2
  76. package/dist/examples/10-asteroids.d.ts.map +0 -1
  77. package/dist/examples/11-2d-platformer.d.ts +0 -2
  78. package/dist/examples/11-2d-platformer.d.ts.map +0 -1
  79. package/dist/examples/12-3d-platformer.d.ts +0 -2
  80. package/dist/examples/12-3d-platformer.d.ts.map +0 -1
  81. package/dist/examples/13-fps.d.ts +0 -2
  82. package/dist/examples/13-fps.d.ts.map +0 -1
  83. package/dist/examples/14-strategy.d.ts +0 -2
  84. package/dist/examples/14-strategy.d.ts.map +0 -1
  85. package/dist/examples/15-zylem-planet-demo.d.ts +0 -2
  86. package/dist/examples/15-zylem-planet-demo.d.ts.map +0 -1
  87. package/dist/examples/16-timbotron.d.ts +0 -2
  88. package/dist/examples/16-timbotron.d.ts.map +0 -1
  89. package/dist/examples/17-stress-test.d.ts +0 -2
  90. package/dist/examples/17-stress-test.d.ts.map +0 -1
  91. package/dist/examples/architecture-test.d.ts +0 -2
  92. package/dist/examples/architecture-test.d.ts.map +0 -1
  93. package/dist/examples/utils.d.ts +0 -10
  94. package/dist/examples/utils.d.ts.map +0 -1
  95. package/dist/lib/actions/behaviors/actions.js +0 -35
  96. package/dist/lib/actions/behaviors/boundaries/boundary.js +0 -40
  97. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-collision.js +0 -100
  98. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.js +0 -37
  99. package/dist/lib/actions/behaviors/ricochet/ricochet.js +0 -6
  100. package/dist/lib/actions/capabilities/moveable.js +0 -108
  101. package/dist/lib/actions/capabilities/rotatable.js +0 -82
  102. package/dist/lib/actions/capabilities/transformable.js +0 -9
  103. package/dist/lib/actions/global-change.js +0 -40
  104. package/dist/lib/camera/camera.js +0 -19
  105. package/dist/lib/camera/fixed-2d.js +0 -30
  106. package/dist/lib/camera/perspective.js +0 -10
  107. package/dist/lib/camera/third-person.js +0 -42
  108. package/dist/lib/camera/zylem-camera.js +0 -208
  109. package/dist/lib/collision/collision-builder.js +0 -46
  110. package/dist/lib/collision/collision-delegate.js +0 -6
  111. package/dist/lib/collision/utils.js +0 -24
  112. package/dist/lib/collision/world.js +0 -77
  113. package/dist/lib/core/base-node.js +0 -61
  114. package/dist/lib/core/entity-asset-loader.js +0 -54
  115. package/dist/lib/core/lifecycle-base.js +0 -20
  116. package/dist/lib/core/preset-shader.js +0 -26
  117. package/dist/lib/core/three-addons/Timer.js +0 -103
  118. package/dist/lib/core/utility/nodes.js +0 -31
  119. package/dist/lib/core/utility/strings.js +0 -14
  120. package/dist/lib/core/utility/vector.js +0 -8
  121. package/dist/lib/core/vessel.js +0 -26
  122. package/dist/lib/debug/console/console-state.js +0 -11
  123. package/dist/lib/debug/debug-state.js +0 -40
  124. package/dist/lib/device/aspect-ratio.js +0 -44
  125. package/dist/lib/entities/actor.js +0 -122
  126. package/dist/lib/entities/box.js +0 -68
  127. package/dist/lib/entities/builder.js +0 -79
  128. package/dist/lib/entities/create.js +0 -31
  129. package/dist/lib/entities/delegates/animation.js +0 -58
  130. package/dist/lib/entities/delegates/debug.js +0 -71
  131. package/dist/lib/entities/delegates/loader.js +0 -19
  132. package/dist/lib/entities/destroy.js +0 -15
  133. package/dist/lib/entities/entity-factory.js +0 -24
  134. package/dist/lib/entities/entity.js +0 -121
  135. package/dist/lib/entities/plane.js +0 -81
  136. package/dist/lib/entities/rect.js +0 -160
  137. package/dist/lib/entities/sphere.js +0 -68
  138. package/dist/lib/entities/sprite.js +0 -125
  139. package/dist/lib/entities/text.js +0 -140
  140. package/dist/lib/entities/zone.js +0 -103
  141. package/dist/lib/game/game-canvas.js +0 -57
  142. package/dist/lib/game/game-config.js +0 -78
  143. package/dist/lib/game/game-default.js +0 -23
  144. package/dist/lib/game/game-retro-resolutions.js +0 -80
  145. package/dist/lib/game/game-state.js +0 -17
  146. package/dist/lib/game/game.js +0 -131
  147. package/dist/lib/game/zylem-game.js +0 -140
  148. package/dist/lib/graphics/geometries/XZPlaneGeometry.js +0 -34
  149. package/dist/lib/graphics/material.js +0 -64
  150. package/dist/lib/graphics/mesh.js +0 -14
  151. package/dist/lib/graphics/render-pass.js +0 -56
  152. package/dist/lib/graphics/shaders/fragment/debug.glsl.js +0 -23
  153. package/dist/lib/graphics/shaders/fragment/fire.glsl.js +0 -52
  154. package/dist/lib/graphics/shaders/fragment/standard.glsl.js +0 -11
  155. package/dist/lib/graphics/shaders/fragment/stars.glsl.js +0 -44
  156. package/dist/lib/graphics/shaders/vertex/debug.glsl.js +0 -15
  157. package/dist/lib/graphics/shaders/vertex/object-shader.glsl.js +0 -11
  158. package/dist/lib/graphics/shaders/vertex/standard.glsl.js +0 -9
  159. package/dist/lib/graphics/zylem-scene.js +0 -75
  160. package/dist/lib/input/gamepad-provider.js +0 -58
  161. package/dist/lib/input/input-manager.js +0 -70
  162. package/dist/lib/input/keyboard-provider.js +0 -120
  163. package/dist/lib/stage/debug-entity-cursor.js +0 -53
  164. package/dist/lib/stage/entity-spawner.js +0 -27
  165. package/dist/lib/stage/stage-debug-delegate.js +0 -100
  166. package/dist/lib/stage/stage-default.js +0 -32
  167. package/dist/lib/stage/stage-factory.js +0 -22
  168. package/dist/lib/stage/stage-manager.js +0 -49
  169. package/dist/lib/stage/stage-state.js +0 -36
  170. package/dist/lib/stage/stage.js +0 -67
  171. package/dist/lib/stage/zylem-stage.js +0 -268
  172. package/dist/lib/systems/transformable.system.js +0 -43
  173. package/dist/node_modules/.pnpm/idb-keyval@6.2.2/node_modules/idb-keyval/dist/index.js +0 -34
  174. package/dist/node_modules/.pnpm/msgpackr@1.11.5/node_modules/msgpackr/pack.js +0 -520
  175. package/dist/node_modules/.pnpm/msgpackr@1.11.5/node_modules/msgpackr/unpack.js +0 -672
  176. package/dist/src/api/actions.d.ts +0 -5
  177. package/dist/src/api/actions.d.ts.map +0 -1
  178. package/dist/src/api/behaviors.d.ts +0 -4
  179. package/dist/src/api/behaviors.d.ts.map +0 -1
  180. package/dist/src/api/camera.d.ts +0 -4
  181. package/dist/src/api/camera.d.ts.map +0 -1
  182. package/dist/src/api/core.d.ts +0 -6
  183. package/dist/src/api/core.d.ts.map +0 -1
  184. package/dist/src/api/entities.d.ts +0 -9
  185. package/dist/src/api/entities.d.ts.map +0 -1
  186. package/dist/src/api/main.d.ts +0 -32
  187. package/dist/src/api/main.d.ts.map +0 -1
  188. package/dist/src/api/stage.d.ts +0 -5
  189. package/dist/src/api/stage.d.ts.map +0 -1
  190. package/dist/src/lib/actions/behaviors/actions.d.ts +0 -11
  191. package/dist/src/lib/actions/behaviors/actions.d.ts.map +0 -1
  192. package/dist/src/lib/actions/behaviors/behavior.d.ts +0 -6
  193. package/dist/src/lib/actions/behaviors/behavior.d.ts.map +0 -1
  194. package/dist/src/lib/actions/behaviors/boundaries/boundary.d.ts +0 -37
  195. package/dist/src/lib/actions/behaviors/boundaries/boundary.d.ts.map +0 -1
  196. package/dist/src/lib/actions/behaviors/character-controller.d.ts +0 -6
  197. package/dist/src/lib/actions/behaviors/character-controller.d.ts.map +0 -1
  198. package/dist/src/lib/actions/behaviors/debug/debug-collision.d.ts +0 -6
  199. package/dist/src/lib/actions/behaviors/debug/debug-collision.d.ts.map +0 -1
  200. package/dist/src/lib/actions/behaviors/debug/debug-update.d.ts +0 -5
  201. package/dist/src/lib/actions/behaviors/debug/debug-update.d.ts.map +0 -1
  202. package/dist/src/lib/actions/behaviors/debug/debug.d.ts +0 -10
  203. package/dist/src/lib/actions/behaviors/debug/debug.d.ts.map +0 -1
  204. package/dist/src/lib/actions/behaviors/movement/movement-sequence-2d.d.ts +0 -24
  205. package/dist/src/lib/actions/behaviors/movement/movement-sequence-2d.d.ts.map +0 -1
  206. package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-collision.d.ts +0 -11
  207. package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-collision.d.ts.map +0 -1
  208. package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.d.ts +0 -12
  209. package/dist/src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.d.ts.map +0 -1
  210. package/dist/src/lib/actions/behaviors/ricochet/ricochet.d.ts +0 -44
  211. package/dist/src/lib/actions/behaviors/ricochet/ricochet.d.ts.map +0 -1
  212. package/dist/src/lib/actions/behaviors/zylem-behavior.d.ts +0 -2
  213. package/dist/src/lib/actions/behaviors/zylem-behavior.d.ts.map +0 -1
  214. package/dist/src/lib/actions/capabilities/moveable.d.ts +0 -125
  215. package/dist/src/lib/actions/capabilities/moveable.d.ts.map +0 -1
  216. package/dist/src/lib/actions/capabilities/rotatable.d.ts +0 -111
  217. package/dist/src/lib/actions/capabilities/rotatable.d.ts.map +0 -1
  218. package/dist/src/lib/actions/capabilities/transformable.d.ts +0 -7
  219. package/dist/src/lib/actions/capabilities/transformable.d.ts.map +0 -1
  220. package/dist/src/lib/actions/global-change.d.ts +0 -23
  221. package/dist/src/lib/actions/global-change.d.ts.map +0 -1
  222. package/dist/src/lib/camera/camera.d.ts +0 -16
  223. package/dist/src/lib/camera/camera.d.ts.map +0 -1
  224. package/dist/src/lib/camera/fixed-2d.d.ts +0 -32
  225. package/dist/src/lib/camera/fixed-2d.d.ts.map +0 -1
  226. package/dist/src/lib/camera/perspective.d.ts +0 -9
  227. package/dist/src/lib/camera/perspective.d.ts.map +0 -1
  228. package/dist/src/lib/camera/third-person.d.ts +0 -32
  229. package/dist/src/lib/camera/third-person.d.ts.map +0 -1
  230. package/dist/src/lib/camera/zylem-camera.d.ts.map +0 -1
  231. package/dist/src/lib/collision/collision-builder.d.ts +0 -17
  232. package/dist/src/lib/collision/collision-builder.d.ts.map +0 -1
  233. package/dist/src/lib/collision/collision-delegate.d.ts +0 -6
  234. package/dist/src/lib/collision/collision-delegate.d.ts.map +0 -1
  235. package/dist/src/lib/collision/collision-group.d.ts +0 -11
  236. package/dist/src/lib/collision/collision-group.d.ts.map +0 -1
  237. package/dist/src/lib/collision/collision-mask.d.ts +0 -18
  238. package/dist/src/lib/collision/collision-mask.d.ts.map +0 -1
  239. package/dist/src/lib/collision/collision.d.ts +0 -19
  240. package/dist/src/lib/collision/collision.d.ts.map +0 -1
  241. package/dist/src/lib/collision/utils.d.ts +0 -15
  242. package/dist/src/lib/collision/utils.d.ts.map +0 -1
  243. package/dist/src/lib/collision/world.d.ts +0 -23
  244. package/dist/src/lib/collision/world.d.ts.map +0 -1
  245. package/dist/src/lib/core/asset-manager.d.ts +0 -2
  246. package/dist/src/lib/core/asset-manager.d.ts.map +0 -1
  247. package/dist/src/lib/core/base-node-life-cycle.d.ts +0 -54
  248. package/dist/src/lib/core/base-node-life-cycle.d.ts.map +0 -1
  249. package/dist/src/lib/core/base-node.d.ts +0 -36
  250. package/dist/src/lib/core/base-node.d.ts.map +0 -1
  251. package/dist/src/lib/core/blueprints.d.ts +0 -22
  252. package/dist/src/lib/core/blueprints.d.ts.map +0 -1
  253. package/dist/src/lib/core/entity-asset-loader.d.ts +0 -16
  254. package/dist/src/lib/core/entity-asset-loader.d.ts.map +0 -1
  255. package/dist/src/lib/core/errors.d.ts +0 -5
  256. package/dist/src/lib/core/errors.d.ts.map +0 -1
  257. package/dist/src/lib/core/flags.d.ts +0 -3
  258. package/dist/src/lib/core/flags.d.ts.map +0 -1
  259. package/dist/src/lib/core/index.d.ts +0 -5
  260. package/dist/src/lib/core/index.d.ts.map +0 -1
  261. package/dist/src/lib/core/interfaces.d.ts +0 -25
  262. package/dist/src/lib/core/interfaces.d.ts.map +0 -1
  263. package/dist/src/lib/core/lazy-loader.d.ts +0 -80
  264. package/dist/src/lib/core/lazy-loader.d.ts.map +0 -1
  265. package/dist/src/lib/core/lifecycle-base.d.ts +0 -17
  266. package/dist/src/lib/core/lifecycle-base.d.ts.map +0 -1
  267. package/dist/src/lib/core/node-interface.d.ts +0 -12
  268. package/dist/src/lib/core/node-interface.d.ts.map +0 -1
  269. package/dist/src/lib/core/preset-shader.d.ts +0 -8
  270. package/dist/src/lib/core/preset-shader.d.ts.map +0 -1
  271. package/dist/src/lib/core/three-addons/Timer.d.ts +0 -92
  272. package/dist/src/lib/core/three-addons/Timer.d.ts.map +0 -1
  273. package/dist/src/lib/core/utility/nodes.d.ts +0 -13
  274. package/dist/src/lib/core/utility/nodes.d.ts.map +0 -1
  275. package/dist/src/lib/core/utility/strings.d.ts +0 -3
  276. package/dist/src/lib/core/utility/strings.d.ts.map +0 -1
  277. package/dist/src/lib/core/utility/vector.d.ts +0 -8
  278. package/dist/src/lib/core/utility/vector.d.ts.map +0 -1
  279. package/dist/src/lib/core/vector.d.ts +0 -4
  280. package/dist/src/lib/core/vector.d.ts.map +0 -1
  281. package/dist/src/lib/core/vessel.d.ts +0 -13
  282. package/dist/src/lib/core/vessel.d.ts.map +0 -1
  283. package/dist/src/lib/debug/console/console-state.d.ts +0 -20
  284. package/dist/src/lib/debug/console/console-state.d.ts.map +0 -1
  285. package/dist/src/lib/debug/console/console-store.d.ts +0 -6
  286. package/dist/src/lib/debug/console/console-store.d.ts.map +0 -1
  287. package/dist/src/lib/debug/debug-state.d.ts +0 -38
  288. package/dist/src/lib/debug/debug-state.d.ts.map +0 -1
  289. package/dist/src/lib/debug/debug-store.d.ts +0 -15
  290. package/dist/src/lib/debug/debug-store.d.ts.map +0 -1
  291. package/dist/src/lib/debug/state-based-debug-loader.d.ts +0 -8
  292. package/dist/src/lib/debug/state-based-debug-loader.d.ts.map +0 -1
  293. package/dist/src/lib/device/aspect-ratio.d.ts +0 -38
  294. package/dist/src/lib/device/aspect-ratio.d.ts.map +0 -1
  295. package/dist/src/lib/device/desktop.d.ts +0 -2
  296. package/dist/src/lib/device/desktop.d.ts.map +0 -1
  297. package/dist/src/lib/device/mobile.d.ts +0 -2
  298. package/dist/src/lib/device/mobile.d.ts.map +0 -1
  299. package/dist/src/lib/device/tablet.d.ts +0 -2
  300. package/dist/src/lib/device/tablet.d.ts.map +0 -1
  301. package/dist/src/lib/entities/actor.d.ts +0 -44
  302. package/dist/src/lib/entities/actor.d.ts.map +0 -1
  303. package/dist/src/lib/entities/box.d.ts +0 -27
  304. package/dist/src/lib/entities/box.d.ts.map +0 -1
  305. package/dist/src/lib/entities/builder.d.ts +0 -28
  306. package/dist/src/lib/entities/builder.d.ts.map +0 -1
  307. package/dist/src/lib/entities/create.d.ts +0 -15
  308. package/dist/src/lib/entities/create.d.ts.map +0 -1
  309. package/dist/src/lib/entities/delegates/animation.d.ts +0 -33
  310. package/dist/src/lib/entities/delegates/animation.d.ts.map +0 -1
  311. package/dist/src/lib/entities/delegates/debug.d.ts +0 -29
  312. package/dist/src/lib/entities/delegates/debug.d.ts.map +0 -1
  313. package/dist/src/lib/entities/delegates/loader.d.ts +0 -12
  314. package/dist/src/lib/entities/delegates/loader.d.ts.map +0 -1
  315. package/dist/src/lib/entities/destroy.d.ts +0 -4
  316. package/dist/src/lib/entities/destroy.d.ts.map +0 -1
  317. package/dist/src/lib/entities/entity-factory.d.ts +0 -10
  318. package/dist/src/lib/entities/entity-factory.d.ts.map +0 -1
  319. package/dist/src/lib/entities/entity.d.ts +0 -98
  320. package/dist/src/lib/entities/entity.d.ts.map +0 -1
  321. package/dist/src/lib/entities/index.d.ts +0 -12
  322. package/dist/src/lib/entities/index.d.ts.map +0 -1
  323. package/dist/src/lib/entities/plane.d.ts +0 -36
  324. package/dist/src/lib/entities/plane.d.ts.map +0 -1
  325. package/dist/src/lib/entities/rect.d.ts +0 -63
  326. package/dist/src/lib/entities/rect.d.ts.map +0 -1
  327. package/dist/src/lib/entities/sphere.d.ts +0 -29
  328. package/dist/src/lib/entities/sphere.d.ts.map +0 -1
  329. package/dist/src/lib/entities/sprite.d.ts +0 -54
  330. package/dist/src/lib/entities/sprite.d.ts.map +0 -1
  331. package/dist/src/lib/entities/text.d.ts +0 -49
  332. package/dist/src/lib/entities/text.d.ts.map +0 -1
  333. package/dist/src/lib/entities/zone.d.ts +0 -54
  334. package/dist/src/lib/entities/zone.d.ts.map +0 -1
  335. package/dist/src/lib/game/game-blueprint.d.ts +0 -38
  336. package/dist/src/lib/game/game-blueprint.d.ts.map +0 -1
  337. package/dist/src/lib/game/game-canvas.d.ts +0 -35
  338. package/dist/src/lib/game/game-canvas.d.ts.map +0 -1
  339. package/dist/src/lib/game/game-config.d.ts +0 -59
  340. package/dist/src/lib/game/game-config.d.ts.map +0 -1
  341. package/dist/src/lib/game/game-default.d.ts +0 -14
  342. package/dist/src/lib/game/game-default.d.ts.map +0 -1
  343. package/dist/src/lib/game/game-interfaces.d.ts +0 -29
  344. package/dist/src/lib/game/game-interfaces.d.ts.map +0 -1
  345. package/dist/src/lib/game/game-retro-resolutions.d.ts +0 -25
  346. package/dist/src/lib/game/game-retro-resolutions.d.ts.map +0 -1
  347. package/dist/src/lib/game/game-state.d.ts +0 -11
  348. package/dist/src/lib/game/game-state.d.ts.map +0 -1
  349. package/dist/src/lib/game/game.d.ts +0 -39
  350. package/dist/src/lib/game/game.d.ts.map +0 -1
  351. package/dist/src/lib/game/zylem-game.d.ts +0 -58
  352. package/dist/src/lib/game/zylem-game.d.ts.map +0 -1
  353. package/dist/src/lib/graphics/geometries/XZPlaneGeometry.d.ts +0 -8
  354. package/dist/src/lib/graphics/geometries/XZPlaneGeometry.d.ts.map +0 -1
  355. package/dist/src/lib/graphics/material.d.ts +0 -29
  356. package/dist/src/lib/graphics/material.d.ts.map +0 -1
  357. package/dist/src/lib/graphics/mesh.d.ts +0 -19
  358. package/dist/src/lib/graphics/mesh.d.ts.map +0 -1
  359. package/dist/src/lib/graphics/render-pass.d.ts +0 -17
  360. package/dist/src/lib/graphics/render-pass.d.ts.map +0 -1
  361. package/dist/src/lib/graphics/zylem-scene.d.ts +0 -50
  362. package/dist/src/lib/graphics/zylem-scene.d.ts.map +0 -1
  363. package/dist/src/lib/input/gamepad-provider.d.ts +0 -14
  364. package/dist/src/lib/input/gamepad-provider.d.ts.map +0 -1
  365. package/dist/src/lib/input/input-manager.d.ts +0 -15
  366. package/dist/src/lib/input/input-manager.d.ts.map +0 -1
  367. package/dist/src/lib/input/input-provider.d.ts +0 -7
  368. package/dist/src/lib/input/input-provider.d.ts.map +0 -1
  369. package/dist/src/lib/input/input.d.ts +0 -48
  370. package/dist/src/lib/input/input.d.ts.map +0 -1
  371. package/dist/src/lib/input/keyboard-provider.d.ts +0 -21
  372. package/dist/src/lib/input/keyboard-provider.d.ts.map +0 -1
  373. package/dist/src/lib/interfaces/entity.d.ts.map +0 -1
  374. package/dist/src/lib/sounds/index.d.ts +0 -3
  375. package/dist/src/lib/sounds/index.d.ts.map +0 -1
  376. package/dist/src/lib/sounds/ping-pong-sound.d.ts +0 -5
  377. package/dist/src/lib/sounds/ping-pong-sound.d.ts.map +0 -1
  378. package/dist/src/lib/sounds/ricochet-sound.d.ts +0 -5
  379. package/dist/src/lib/sounds/ricochet-sound.d.ts.map +0 -1
  380. package/dist/src/lib/stage/debug-entity-cursor.d.ts +0 -24
  381. package/dist/src/lib/stage/debug-entity-cursor.d.ts.map +0 -1
  382. package/dist/src/lib/stage/entity-spawner.d.ts +0 -9
  383. package/dist/src/lib/stage/entity-spawner.d.ts.map +0 -1
  384. package/dist/src/lib/stage/stage-camera-debug-delegate.d.ts +0 -14
  385. package/dist/src/lib/stage/stage-camera-debug-delegate.d.ts.map +0 -1
  386. package/dist/src/lib/stage/stage-debug-delegate.d.ts +0 -26
  387. package/dist/src/lib/stage/stage-debug-delegate.d.ts.map +0 -1
  388. package/dist/src/lib/stage/stage-default.d.ts +0 -3
  389. package/dist/src/lib/stage/stage-default.d.ts.map +0 -1
  390. package/dist/src/lib/stage/stage-factory.d.ts +0 -6
  391. package/dist/src/lib/stage/stage-factory.d.ts.map +0 -1
  392. package/dist/src/lib/stage/stage-manager.d.ts +0 -30
  393. package/dist/src/lib/stage/stage-manager.d.ts.map +0 -1
  394. package/dist/src/lib/stage/stage-state.d.ts +0 -14
  395. package/dist/src/lib/stage/stage-state.d.ts.map +0 -1
  396. package/dist/src/lib/stage/stage.d.ts +0 -35
  397. package/dist/src/lib/stage/stage.d.ts.map +0 -1
  398. package/dist/src/lib/stage/zylem-stage.d.ts +0 -128
  399. package/dist/src/lib/stage/zylem-stage.d.ts.map +0 -1
  400. package/dist/src/lib/systems/test-system.d.ts +0 -2
  401. package/dist/src/lib/systems/test-system.d.ts.map +0 -1
  402. package/dist/src/lib/systems/transformable.system.d.ts +0 -25
  403. package/dist/src/lib/systems/transformable.system.d.ts.map +0 -1
  404. package/dist/src/lib/types/entity-types.d.ts +0 -24
  405. package/dist/src/lib/types/entity-types.d.ts.map +0 -1
  406. package/dist/src/lib/types/index.d.ts +0 -3
  407. package/dist/src/lib/types/index.d.ts.map +0 -1
  408. package/dist/src/lib/types/stage-types.d.ts +0 -26
  409. package/dist/src/lib/types/stage-types.d.ts.map +0 -1
  410. package/dist/src/lib/ui/Debug.d.ts +0 -6
  411. package/dist/src/lib/ui/Debug.d.ts.map +0 -1
  412. package/dist/src/lib/ui/console/Console.d.ts +0 -7
  413. package/dist/src/lib/ui/console/Console.d.ts.map +0 -1
  414. package/dist/src/lib/ui/debug-panel/AccordionMenu.d.ts +0 -7
  415. package/dist/src/lib/ui/debug-panel/AccordionMenu.d.ts.map +0 -1
  416. package/dist/src/lib/ui/debug-panel/Menu.d.ts +0 -6
  417. package/dist/src/lib/ui/debug-panel/Menu.d.ts.map +0 -1
  418. package/dist/src/lib/ui/debug-panel/sections/EntitiesSection.d.ts +0 -4
  419. package/dist/src/lib/ui/debug-panel/sections/EntitiesSection.d.ts.map +0 -1
  420. package/dist/src/lib/ui/debug-panel/sections/GameSection.d.ts +0 -3
  421. package/dist/src/lib/ui/debug-panel/sections/GameSection.d.ts.map +0 -1
  422. package/dist/src/lib/ui/debug-panel/sections/StagesSection.d.ts +0 -3
  423. package/dist/src/lib/ui/debug-panel/sections/StagesSection.d.ts.map +0 -1
  424. package/dist/src/lib/ui/debug-panel/sections/all.d.ts +0 -4
  425. package/dist/src/lib/ui/debug-panel/sections/all.d.ts.map +0 -1
  426. package/dist/src/lib/ui/toolbar/Toolbar.d.ts +0 -6
  427. package/dist/src/lib/ui/toolbar/Toolbar.d.ts.map +0 -1
  428. package/dist/tests/e2e/basic-game.spec.d.ts +0 -2
  429. package/dist/tests/e2e/basic-game.spec.d.ts.map +0 -1
  430. package/dist/tests/integration/debug.sim.spec.d.ts +0 -2
  431. package/dist/tests/integration/debug.sim.spec.d.ts.map +0 -1
  432. package/dist/tests/unit/collision/collision.spec.d.ts +0 -2
  433. package/dist/tests/unit/collision/collision.spec.d.ts.map +0 -1
  434. package/dist/tests/unit/core/base-node.spec.d.ts +0 -2
  435. package/dist/tests/unit/core/base-node.spec.d.ts.map +0 -1
  436. package/dist/tests/unit/core/game.spec.d.ts +0 -2
  437. package/dist/tests/unit/core/game.spec.d.ts.map +0 -1
  438. package/dist/tests/unit/core/stage.spec.d.ts +0 -2
  439. package/dist/tests/unit/core/stage.spec.d.ts.map +0 -1
  440. package/dist/tests/unit/core/vessel.spec.d.ts +0 -2
  441. package/dist/tests/unit/core/vessel.spec.d.ts.map +0 -1
package/dist/behaviors.js CHANGED
@@ -1,8 +1,398 @@
1
- import { boundary2d as e } from "./lib/actions/behaviors/boundaries/boundary.js";
2
- import { ricochet2DInBounds as c } from "./lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.js";
3
- import { ricochet2DCollision as n } from "./lib/actions/behaviors/ricochet/ricochet-2d-collision.js";
1
+ // src/lib/actions/behaviors/boundaries/boundary.ts
2
+ var defaultBoundaryOptions = {
3
+ boundaries: {
4
+ top: 0,
5
+ bottom: 0,
6
+ left: 0,
7
+ right: 0
8
+ },
9
+ stopMovement: true
10
+ };
11
+ function boundary2d(options = {}) {
12
+ return {
13
+ type: "update",
14
+ handler: (updateContext) => {
15
+ _boundary2d(updateContext, options);
16
+ }
17
+ };
18
+ }
19
+ function _boundary2d(updateContext, options) {
20
+ const { me: entity } = updateContext;
21
+ const { boundaries, onBoundary } = {
22
+ ...defaultBoundaryOptions,
23
+ ...options
24
+ };
25
+ const position = entity.getPosition();
26
+ if (!position) return;
27
+ let boundariesHit = { top: false, bottom: false, left: false, right: false };
28
+ if (position.x <= boundaries.left) {
29
+ boundariesHit.left = true;
30
+ } else if (position.x >= boundaries.right) {
31
+ boundariesHit.right = true;
32
+ }
33
+ if (position.y <= boundaries.bottom) {
34
+ boundariesHit.bottom = true;
35
+ } else if (position.y >= boundaries.top) {
36
+ boundariesHit.top = true;
37
+ }
38
+ const stopMovement = options.stopMovement ?? true;
39
+ if (stopMovement && boundariesHit) {
40
+ const velocity = entity.getVelocity() ?? { x: 0, y: 0, z: 0 };
41
+ let { x: newX, y: newY } = velocity;
42
+ if (velocity?.y < 0 && boundariesHit.bottom) {
43
+ newY = 0;
44
+ } else if (velocity?.y > 0 && boundariesHit.top) {
45
+ newY = 0;
46
+ }
47
+ if (velocity?.x < 0 && boundariesHit.left) {
48
+ newX = 0;
49
+ } else if (velocity?.x > 0 && boundariesHit.right) {
50
+ newX = 0;
51
+ }
52
+ entity.moveXY(newX, newY);
53
+ }
54
+ if (onBoundary && boundariesHit) {
55
+ onBoundary({
56
+ me: entity,
57
+ boundary: boundariesHit,
58
+ position: { x: position.x, y: position.y, z: position.z },
59
+ updateContext
60
+ });
61
+ }
62
+ }
63
+
64
+ // src/lib/collision/collision-builder.ts
65
+ import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from "@dimforge/rapier3d-compat";
66
+ var typeToGroup = /* @__PURE__ */ new Map();
67
+ var nextGroupId = 0;
68
+ function getOrCreateCollisionGroupId(type) {
69
+ let groupId = typeToGroup.get(type);
70
+ if (groupId === void 0) {
71
+ groupId = nextGroupId++ % 16;
72
+ typeToGroup.set(type, groupId);
73
+ }
74
+ return groupId;
75
+ }
76
+
77
+ // src/lib/collision/utils.ts
78
+ function matchesCollisionSelector(other, selector) {
79
+ if (!selector) return true;
80
+ const otherName = other.name ?? "";
81
+ if ("name" in selector) {
82
+ const sel = selector.name;
83
+ if (sel instanceof RegExp) {
84
+ return sel.test(otherName);
85
+ } else if (Array.isArray(sel)) {
86
+ return sel.some((s) => s === otherName);
87
+ } else {
88
+ return otherName === sel;
89
+ }
90
+ } else if ("mask" in selector) {
91
+ const m = selector.mask;
92
+ if (m instanceof RegExp) {
93
+ const type = other.collisionType ?? "";
94
+ return m.test(type);
95
+ } else {
96
+ const type = other.collisionType ?? "";
97
+ const gid = getOrCreateCollisionGroupId(type);
98
+ return (m & 1 << gid) !== 0;
99
+ }
100
+ } else if ("test" in selector) {
101
+ return !!selector.test(other);
102
+ }
103
+ return true;
104
+ }
105
+
106
+ // src/lib/actions/behaviors/ricochet/ricochet-2d-collision.ts
107
+ function ricochet2DCollision(options = {}, callback) {
108
+ return {
109
+ type: "collision",
110
+ handler: (collisionContext) => {
111
+ _handleRicochet2DCollision(collisionContext, options, callback);
112
+ }
113
+ };
114
+ }
115
+ function _handleRicochet2DCollision(collisionContext, options, callback) {
116
+ const { entity, other } = collisionContext;
117
+ const self = entity;
118
+ if (other.collider?.isSensor()) return;
119
+ const {
120
+ minSpeed = 2,
121
+ maxSpeed = 20,
122
+ separation = 0,
123
+ collisionWith = void 0
124
+ } = {
125
+ ...options
126
+ };
127
+ const reflectionMode = options?.reflectionMode ?? "angled";
128
+ const maxAngleDeg = options?.maxAngleDeg ?? 60;
129
+ const speedUpFactor = options?.speedUpFactor ?? 1.05;
130
+ const minOffsetForAngle = options?.minOffsetForAngle ?? 0.15;
131
+ const centerRetentionFactor = options?.centerRetentionFactor ?? 0.5;
132
+ if (!matchesCollisionSelector(other, collisionWith)) return;
133
+ const selfPos = self.getPosition();
134
+ const otherPos = other.body?.translation();
135
+ const vel = self.getVelocity();
136
+ if (!selfPos || !otherPos || !vel) return;
137
+ let newVelX = vel.x;
138
+ let newVelY = vel.y;
139
+ let newX = selfPos.x;
140
+ let newY = selfPos.y;
141
+ const dx = selfPos.x - otherPos.x;
142
+ const dy = selfPos.y - otherPos.y;
143
+ let extentX = null;
144
+ let extentY = null;
145
+ const colliderShape = other.collider?.shape;
146
+ if (colliderShape) {
147
+ if (colliderShape.halfExtents) {
148
+ extentX = Math.abs(colliderShape.halfExtents.x ?? colliderShape.halfExtents[0] ?? null);
149
+ extentY = Math.abs(colliderShape.halfExtents.y ?? colliderShape.halfExtents[1] ?? null);
150
+ }
151
+ if ((extentX == null || extentY == null) && typeof colliderShape.radius === "number") {
152
+ extentX = extentX ?? Math.abs(colliderShape.radius);
153
+ extentY = extentY ?? Math.abs(colliderShape.radius);
154
+ }
155
+ }
156
+ if ((extentX == null || extentY == null) && typeof other.collider?.halfExtents === "function") {
157
+ const he = other.collider.halfExtents();
158
+ if (he) {
159
+ extentX = extentX ?? Math.abs(he.x);
160
+ extentY = extentY ?? Math.abs(he.y);
161
+ }
162
+ }
163
+ if ((extentX == null || extentY == null) && typeof other.collider?.radius === "function") {
164
+ const r = other.collider.radius();
165
+ if (typeof r === "number") {
166
+ extentX = extentX ?? Math.abs(r);
167
+ extentY = extentY ?? Math.abs(r);
168
+ }
169
+ }
170
+ let relX = 0;
171
+ let relY = 0;
172
+ if (extentX && extentY) {
173
+ relX = clamp(dx / extentX, -1, 1);
174
+ relY = clamp(dy / extentY, -1, 1);
175
+ } else {
176
+ relX = Math.sign(dx);
177
+ relY = Math.sign(dy);
178
+ }
179
+ let bounceVertical = Math.abs(dy) >= Math.abs(dx);
180
+ let selfExtentX = null;
181
+ let selfExtentY = null;
182
+ const selfShape = self.collider?.shape;
183
+ if (selfShape) {
184
+ if (selfShape.halfExtents) {
185
+ selfExtentX = Math.abs(selfShape.halfExtents.x ?? selfShape.halfExtents[0] ?? null);
186
+ selfExtentY = Math.abs(selfShape.halfExtents.y ?? selfShape.halfExtents[1] ?? null);
187
+ }
188
+ if ((selfExtentX == null || selfExtentY == null) && typeof selfShape.radius === "number") {
189
+ selfExtentX = selfExtentX ?? Math.abs(selfShape.radius);
190
+ selfExtentY = selfExtentY ?? Math.abs(selfShape.radius);
191
+ }
192
+ }
193
+ if ((selfExtentX == null || selfExtentY == null) && typeof self.collider?.halfExtents === "function") {
194
+ const heS = self.collider.halfExtents();
195
+ if (heS) {
196
+ selfExtentX = selfExtentX ?? Math.abs(heS.x);
197
+ selfExtentY = selfExtentY ?? Math.abs(heS.y);
198
+ }
199
+ }
200
+ if ((selfExtentX == null || selfExtentY == null) && typeof self.collider?.radius === "function") {
201
+ const rS = self.collider.radius();
202
+ if (typeof rS === "number") {
203
+ selfExtentX = selfExtentX ?? Math.abs(rS);
204
+ selfExtentY = selfExtentY ?? Math.abs(rS);
205
+ }
206
+ }
207
+ if (extentX != null && extentY != null && selfExtentX != null && selfExtentY != null) {
208
+ const penX = selfExtentX + extentX - Math.abs(dx);
209
+ const penY = selfExtentY + extentY - Math.abs(dy);
210
+ if (!Number.isNaN(penX) && !Number.isNaN(penY)) {
211
+ bounceVertical = penY <= penX;
212
+ }
213
+ }
214
+ let usedAngleDeflection = false;
215
+ if (bounceVertical) {
216
+ const resolvedY = (extentY ?? 0) + (selfExtentY ?? 0) + separation;
217
+ newY = otherPos.y + (dy > 0 ? resolvedY : -resolvedY);
218
+ newX = selfPos.x;
219
+ const isHorizontalPaddle = extentX != null && extentY != null && extentX > extentY;
220
+ if (isHorizontalPaddle && reflectionMode === "angled") {
221
+ const maxAngleRad = maxAngleDeg * Math.PI / 180;
222
+ const deadzone = Math.max(0, Math.min(1, minOffsetForAngle));
223
+ const clampedOffsetX = clamp(relX, -1, 1);
224
+ const absOff = Math.abs(clampedOffsetX);
225
+ const baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);
226
+ const speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);
227
+ if (absOff > deadzone) {
228
+ const t = (absOff - deadzone) / (1 - deadzone);
229
+ const angle = Math.sign(clampedOffsetX) * (t * maxAngleRad);
230
+ const cosA = Math.cos(angle);
231
+ const sinA = Math.sin(angle);
232
+ const vy = Math.abs(speed * cosA);
233
+ const vx = speed * sinA;
234
+ newVelY = dy > 0 ? vy : -vy;
235
+ newVelX = vx;
236
+ } else {
237
+ const vx = vel.x * centerRetentionFactor;
238
+ const vyMagSquared = Math.max(0, speed * speed - vx * vx);
239
+ const vy = Math.sqrt(vyMagSquared);
240
+ newVelY = dy > 0 ? vy : -vy;
241
+ newVelX = vx;
242
+ }
243
+ usedAngleDeflection = true;
244
+ } else {
245
+ newVelY = dy > 0 ? Math.abs(vel.y) : -Math.abs(vel.y);
246
+ if (reflectionMode === "simple") usedAngleDeflection = true;
247
+ }
248
+ } else {
249
+ const resolvedX = (extentX ?? 0) + (selfExtentX ?? 0) + separation;
250
+ newX = otherPos.x + (dx > 0 ? resolvedX : -resolvedX);
251
+ newY = selfPos.y;
252
+ if (reflectionMode === "angled") {
253
+ const maxAngleRad = maxAngleDeg * Math.PI / 180;
254
+ const deadzone = Math.max(0, Math.min(1, minOffsetForAngle));
255
+ const clampedOffsetY = clamp(relY, -1, 1);
256
+ const absOff = Math.abs(clampedOffsetY);
257
+ const baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);
258
+ const speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);
259
+ if (absOff > deadzone) {
260
+ const t = (absOff - deadzone) / (1 - deadzone);
261
+ const angle = Math.sign(clampedOffsetY) * (t * maxAngleRad);
262
+ const cosA = Math.cos(angle);
263
+ const sinA = Math.sin(angle);
264
+ const vx = Math.abs(speed * cosA);
265
+ const vy = speed * sinA;
266
+ newVelX = dx > 0 ? vx : -vx;
267
+ newVelY = vy;
268
+ } else {
269
+ const vy = vel.y * centerRetentionFactor;
270
+ const vxMagSquared = Math.max(0, speed * speed - vy * vy);
271
+ const vx = Math.sqrt(vxMagSquared);
272
+ newVelX = dx > 0 ? vx : -vx;
273
+ newVelY = vy;
274
+ }
275
+ usedAngleDeflection = true;
276
+ } else {
277
+ newVelX = dx > 0 ? Math.abs(vel.x) : -Math.abs(vel.x);
278
+ newVelY = vel.y;
279
+ usedAngleDeflection = true;
280
+ }
281
+ }
282
+ if (!usedAngleDeflection) {
283
+ const additionBaseX = Math.abs(newVelX);
284
+ const additionBaseY = Math.abs(newVelY);
285
+ const addX = Math.sign(relX) * Math.abs(relX) * additionBaseX;
286
+ const addY = Math.sign(relY) * Math.abs(relY) * additionBaseY;
287
+ newVelX += addX;
288
+ newVelY += addY;
289
+ }
290
+ const currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);
291
+ if (currentSpeed > 0) {
292
+ const targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);
293
+ if (targetSpeed !== currentSpeed) {
294
+ const scale = targetSpeed / currentSpeed;
295
+ newVelX *= scale;
296
+ newVelY *= scale;
297
+ }
298
+ }
299
+ if (newX !== selfPos.x || newY !== selfPos.y) {
300
+ self.setPosition(newX, newY, selfPos.z);
301
+ self.moveXY(newVelX, newVelY);
302
+ if (callback) {
303
+ const velocityAfter = self.getVelocity();
304
+ if (velocityAfter) {
305
+ callback({
306
+ position: { x: newX, y: newY, z: selfPos.z },
307
+ ...collisionContext
308
+ });
309
+ }
310
+ }
311
+ }
312
+ }
313
+
314
+ // src/lib/actions/behaviors/ricochet/ricochet.ts
315
+ function clamp(value, min, max) {
316
+ return Math.max(min, Math.min(max, value));
317
+ }
318
+
319
+ // src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.ts
320
+ function ricochet2DInBounds(options = {}, callback) {
321
+ return {
322
+ type: "update",
323
+ handler: (updateContext) => {
324
+ _handleRicochet2DInBounds(updateContext, options, callback);
325
+ }
326
+ };
327
+ }
328
+ function _handleRicochet2DInBounds(updateContext, options, callback) {
329
+ const { me } = updateContext;
330
+ const {
331
+ restitution = 0,
332
+ minSpeed = 2,
333
+ maxSpeed = 20,
334
+ boundaries = { top: 5, bottom: -5, left: -6.5, right: 6.5 },
335
+ separation = 0
336
+ } = { ...options };
337
+ const position = me.getPosition();
338
+ const velocity = me.getVelocity();
339
+ if (!position || !velocity) return;
340
+ let newVelX = velocity.x;
341
+ let newVelY = velocity.y;
342
+ let newX = position.x;
343
+ let newY = position.y;
344
+ let ricochetBoundary = null;
345
+ if (position.x <= boundaries.left) {
346
+ newVelX = Math.abs(velocity.x);
347
+ newX = boundaries.left + separation;
348
+ ricochetBoundary = "left";
349
+ } else if (position.x >= boundaries.right) {
350
+ newVelX = -Math.abs(velocity.x);
351
+ newX = boundaries.right - separation;
352
+ ricochetBoundary = "right";
353
+ }
354
+ if (position.y <= boundaries.bottom) {
355
+ newVelY = Math.abs(velocity.y);
356
+ newY = boundaries.bottom + separation;
357
+ ricochetBoundary = "bottom";
358
+ } else if (position.y >= boundaries.top) {
359
+ newVelY = -Math.abs(velocity.y);
360
+ newY = boundaries.top - separation;
361
+ ricochetBoundary = "top";
362
+ }
363
+ const currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);
364
+ if (currentSpeed > 0) {
365
+ const targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);
366
+ if (targetSpeed !== currentSpeed) {
367
+ const scale = targetSpeed / currentSpeed;
368
+ newVelX *= scale;
369
+ newVelY *= scale;
370
+ }
371
+ }
372
+ if (restitution) {
373
+ newVelX *= restitution;
374
+ newVelY *= restitution;
375
+ }
376
+ if (newX !== position.x || newY !== position.y) {
377
+ me.setPosition(newX, newY, position.z);
378
+ me.moveXY(newVelX, newVelY);
379
+ if (callback && ricochetBoundary) {
380
+ const velocityAfter = me.getVelocity();
381
+ if (velocityAfter) {
382
+ callback({
383
+ boundary: ricochetBoundary,
384
+ position: { x: newX, y: newY, z: position.z },
385
+ velocityBefore: velocity,
386
+ velocityAfter,
387
+ ...updateContext
388
+ });
389
+ }
390
+ }
391
+ }
392
+ }
4
393
  export {
5
- e as boundary2d,
6
- n as ricochet2DCollision,
7
- c as ricochet2DInBounds
394
+ boundary2d,
395
+ ricochet2DCollision,
396
+ ricochet2DInBounds
8
397
  };
398
+ //# sourceMappingURL=behaviors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/actions/behaviors/boundaries/boundary.ts","../src/lib/collision/collision-builder.ts","../src/lib/collision/utils.ts","../src/lib/actions/behaviors/ricochet/ricochet-2d-collision.ts","../src/lib/actions/behaviors/ricochet/ricochet.ts","../src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.ts"],"sourcesContent":["import { UpdateContext } from \"../../../core/base-node-life-cycle\";\nimport { MoveableEntity } from \"../../capabilities/moveable\";\nimport { Vector } from \"@dimforge/rapier3d-compat\";\nimport { BehaviorCallbackType } from \"../../../entities/entity\";\n\nexport interface BoundaryEvent {\n\tme: MoveableEntity;\n\tboundary: BoundaryHits;\n\tposition: Vector;\n\tupdateContext: UpdateContext<MoveableEntity>;\n}\n\nexport interface BoundaryOptions {\n\tboundaries: {\n\t\ttop: number;\n\t\tbottom: number;\n\t\tleft: number;\n\t\tright: number;\n\t};\n\tonBoundary?: (event: BoundaryEvent) => void;\n\tstopMovement?: boolean;\n}\n\nconst defaultBoundaryOptions: BoundaryOptions = {\n\tboundaries: {\n\t\ttop: 0,\n\t\tbottom: 0,\n\t\tleft: 0,\n\t\tright: 0\n\t},\n\tstopMovement: true\n};\n\n/**\n * Checks if the entity has hit a boundary and stops its movement if it has\n * \n * @param options Configuration options for the boundary behavior\n * @param options.boundaries The boundaries of the stage\n * @param options.onBoundary A callback function that is called when the entity hits a boundary\n * @param options.stopMovement Whether to stop the entity's movement when it hits a boundary\n * @returns A behavior callback with type 'update' and a handler function\n */\nexport function boundary2d(\n\toptions: Partial<BoundaryOptions> = {}\n): { type: BehaviorCallbackType; handler: (ctx: UpdateContext<MoveableEntity>) => void } {\n\treturn {\n\t\ttype: 'update' as BehaviorCallbackType,\n\t\thandler: (updateContext: UpdateContext<MoveableEntity>) => {\n\t\t\t_boundary2d(updateContext, options);\n\t\t}\n\t};\n}\n\ntype BoundaryHit = 'top' | 'bottom' | 'left' | 'right';\n\ntype BoundaryHits = Record<BoundaryHit, boolean>;\n\nfunction _boundary2d(updateContext: UpdateContext<MoveableEntity>, options: Partial<BoundaryOptions>) {\n\tconst { me: entity } = updateContext;\n\tconst { boundaries, onBoundary } = {\n\t\t...defaultBoundaryOptions,\n\t\t...options\n\t};\n\n\tconst position = entity.getPosition();\n\tif (!position) return;\n\n\tlet boundariesHit: BoundaryHits = { top: false, bottom: false, left: false, right: false };\n\n\tif (position.x <= boundaries.left) {\n\t\tboundariesHit.left = true;\n\t} else if (position.x >= boundaries.right) {\n\t\tboundariesHit.right = true;\n\t}\n\n\tif (position.y <= boundaries.bottom) {\n\t\tboundariesHit.bottom = true;\n\t} else if (position.y >= boundaries.top) {\n\t\tboundariesHit.top = true;\n\t}\n\n\tconst stopMovement = options.stopMovement ?? true;\n\tif (stopMovement && boundariesHit) {\n\t\tconst velocity = entity.getVelocity() ?? { x: 0, y: 0, z: 0 };\n\t\tlet { x: newX, y: newY } = velocity;\n\t\tif (velocity?.y < 0 && boundariesHit.bottom) {\n\t\t\tnewY = 0;\n\t\t} else if (velocity?.y > 0 && boundariesHit.top) {\n\t\t\tnewY = 0;\n\t\t}\n\t\tif (velocity?.x < 0 && boundariesHit.left) {\n\t\t\tnewX = 0;\n\t\t} else if (velocity?.x > 0 && boundariesHit.right) {\n\t\t\tnewX = 0;\n\t\t}\n\t\tentity.moveXY(newX, newY);\n\t}\n\tif (onBoundary && boundariesHit) {\n\t\tonBoundary({\n\t\t\tme: entity,\n\t\t\tboundary: boundariesHit,\n\t\t\tposition: { x: position.x, y: position.y, z: position.z },\n\t\t\tupdateContext\n\t\t});\n\t}\n}","import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from \"@dimforge/rapier3d-compat\";\nimport { Vec3 } from \"../core/vector\";\n\n/**\n * Options for configuring entity collision behavior.\n */\nexport interface CollisionOptions {\n\tstatic?: boolean;\n\tsensor?: boolean;\n\tsize?: Vector3;\n\tposition?: Vector3;\n\tcollisionType?: string;\n\tcollisionFilter?: string[];\n}\n\nconst typeToGroup = new Map<string, number>();\nlet nextGroupId = 0;\n\nexport function getOrCreateCollisionGroupId(type: string): number {\n\tlet groupId = typeToGroup.get(type);\n\tif (groupId === undefined) {\n\t\tgroupId = nextGroupId++ % 16;\n\t\ttypeToGroup.set(type, groupId);\n\t}\n\treturn groupId;\n}\n\nexport function createCollisionFilter(allowedTypes: string[]): number {\n\tlet filter = 0;\n\tallowedTypes.forEach(type => {\n\t\tconst groupId = getOrCreateCollisionGroupId(type);\n\t\tfilter |= (1 << groupId);\n\t});\n\treturn filter;\n}\n\nexport class CollisionBuilder {\n\tstatic: boolean = false;\n\tsensor: boolean = false;\n\tgravity: Vec3 = new Vector3(0, 0, 0);\n\n\tbuild(options: Partial<CollisionOptions>): [RigidBodyDesc, ColliderDesc] {\n\t\tconst bodyDesc = this.bodyDesc({\n\t\t\tisDynamicBody: !this.static\n\t\t});\n\t\tconst collider = this.collider(options);\n\t\tconst type = options.collisionType;\n\t\tif (type) {\n\t\t\tlet groupId = getOrCreateCollisionGroupId(type);\n\t\t\tlet filter = 0b1111111111111111;\n\t\t\tif (options.collisionFilter) {\n\t\t\t\tfilter = createCollisionFilter(options.collisionFilter);\n\t\t\t}\n\t\t\tcollider.setCollisionGroups((groupId << 16) | filter);\n\t\t}\n\t\tconst { KINEMATIC_FIXED, DEFAULT } = ActiveCollisionTypes;\n\t\tcollider.activeCollisionTypes = (this.sensor) ? KINEMATIC_FIXED : DEFAULT;\n\t\treturn [bodyDesc, collider];\n\t}\n\n\twithCollision(collisionOptions: Partial<CollisionOptions>): this {\n\t\tthis.sensor = collisionOptions?.sensor ?? this.sensor;\n\t\tthis.static = collisionOptions?.static ?? this.static;\n\t\treturn this;\n\t}\n\n\tcollider(options: CollisionOptions): ColliderDesc {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n\n\tbodyDesc({ isDynamicBody = true }): RigidBodyDesc {\n\t\tconst type = isDynamicBody ? RigidBodyType.Dynamic : RigidBodyType.Fixed;\n\t\tconst bodyDesc = new RigidBodyDesc(type)\n\t\t\t.setTranslation(0, 0, 0)\n\t\t\t.setGravityScale(1.0)\n\t\t\t.setCanSleep(false)\n\t\t\t.setCcdEnabled(true);\n\t\treturn bodyDesc;\n\t}\n}","import type { GameEntity } from \"../entities/entity\";\nimport { getOrCreateCollisionGroupId } from \"./collision-builder\";\n\n/**\n * A branded bitmask representing a set of collision types.\n */\nexport type CollisionMask = number & { readonly __brand: \"CollisionMask\" };\n\nexport type NameSelector = string | string[] | RegExp;\n\nexport type CollisionSelector =\n\t| { name: NameSelector }\n\t| { mask: CollisionMask | RegExp }\n\t| { test: (other: GameEntity<any>) => boolean };\n\n/**\n * Returns true if the `other` entity matches the provided selector.\n */\nexport function matchesCollisionSelector(other: GameEntity<any>, selector?: CollisionSelector): boolean {\n\tif (!selector) return true;\n\tconst otherName = other.name ?? '';\n\tif ('name' in selector) {\n\t\tconst sel = selector.name as NameSelector;\n\t\tif (sel instanceof RegExp) {\n\t\t\treturn sel.test(otherName);\n\t\t} else if (Array.isArray(sel)) {\n\t\t\treturn sel.some(s => s === otherName);\n\t\t} else {\n\t\t\treturn otherName === sel;\n\t\t}\n\t} else if ('mask' in selector) {\n\t\tconst m = selector.mask as CollisionMask | RegExp;\n\t\tif (m instanceof RegExp) {\n\t\t\tconst type = other.collisionType ?? '';\n\t\t\treturn m.test(type);\n\t\t} else {\n\t\t\tconst type = other.collisionType ?? '';\n\t\t\tconst gid = getOrCreateCollisionGroupId(type);\n\t\t\treturn ((m as number) & (1 << gid)) !== 0;\n\t\t}\n\t} else if ('test' in selector) {\n\t\treturn !!selector.test(other);\n\t}\n\treturn true;\n}\n","import { CollisionContext, GameEntity } from '../../../entities/entity';\nimport { MoveableEntity } from '../../capabilities/moveable';\nimport { matchesCollisionSelector } from '../../../collision/utils';\nimport { Ricochet2DCollisionOptions, clamp, Ricochet2DCollisionCallback } from './ricochet';\n\n/**\n * Behavior for ricocheting an entity off other objects in 2D\n */\nexport function ricochet2DCollision(\n\toptions: Partial<Ricochet2DCollisionOptions> = {},\n\tcallback?: Ricochet2DCollisionCallback\n): { type: 'collision'; handler: (ctx: CollisionContext<MoveableEntity, GameEntity<any>>) => void } {\n\treturn {\n\t\ttype: 'collision',\n\t\thandler: (collisionContext: CollisionContext<MoveableEntity, GameEntity<any>>) => {\n\t\t\t_handleRicochet2DCollision(collisionContext, options, callback);\n\t\t},\n\t};\n}\n\nfunction _handleRicochet2DCollision(\n\tcollisionContext: CollisionContext<MoveableEntity, GameEntity<any>>,\n\toptions: Partial<Ricochet2DCollisionOptions>,\n\tcallback?: Ricochet2DCollisionCallback\n) {\n\tconst { entity, other } = collisionContext;\n\tconst self = entity as unknown as GameEntity<any> & MoveableEntity;\n\tif (other.collider?.isSensor()) return;\n\n\tconst {\n\t\tminSpeed = 2,\n\t\tmaxSpeed = 20,\n\t\tseparation = 0,\n\t\tcollisionWith = undefined,\n\t} = {\n\t\t...options,\n\t} as Ricochet2DCollisionOptions;\n\tconst reflectionMode: 'simple' | 'angled' = (options as any)?.reflectionMode ?? 'angled';\n\tconst maxAngleDeg = (options as any)?.maxAngleDeg ?? 60;\n\tconst speedUpFactor = (options as any)?.speedUpFactor ?? 1.05;\n\tconst minOffsetForAngle = (options as any)?.minOffsetForAngle ?? 0.15; // 0..1\n\tconst centerRetentionFactor = (options as any)?.centerRetentionFactor ?? 0.5; // keep some Y on center hits\n\n\tif (!matchesCollisionSelector(other, collisionWith)) return;\n\n\tconst selfPos = self.getPosition();\n\tconst otherPos = other.body?.translation();\n\tconst vel = self.getVelocity();\n\tif (!selfPos || !otherPos || !vel) return;\n\n\tlet newVelX = vel.x;\n\tlet newVelY = vel.y;\n\tlet newX = selfPos.x;\n\tlet newY = selfPos.y;\n\n\tconst dx = selfPos.x - otherPos.x;\n\tconst dy = selfPos.y - otherPos.y;\n\n\tlet extentX: number | null = null;\n\tlet extentY: number | null = null;\n\tconst colliderShape: any = other.collider?.shape as any;\n\tif (colliderShape) {\n\t\tif (colliderShape.halfExtents) {\n\t\t\textentX = Math.abs(colliderShape.halfExtents.x ?? colliderShape.halfExtents[0] ?? null);\n\t\t\textentY = Math.abs(colliderShape.halfExtents.y ?? colliderShape.halfExtents[1] ?? null);\n\t\t}\n\t\tif ((extentX == null || extentY == null) && (typeof colliderShape.radius === 'number')) {\n\t\t\textentX = extentX ?? Math.abs(colliderShape.radius);\n\t\t\textentY = extentY ?? Math.abs(colliderShape.radius);\n\t\t}\n\t}\n\tif ((extentX == null || extentY == null) && typeof (other.collider as any)?.halfExtents === 'function') {\n\t\tconst he = (other.collider as any).halfExtents();\n\t\tif (he) {\n\t\t\textentX = extentX ?? Math.abs(he.x);\n\t\t\textentY = extentY ?? Math.abs(he.y);\n\t\t}\n\t}\n\tif ((extentX == null || extentY == null) && typeof (other.collider as any)?.radius === 'function') {\n\t\tconst r = (other.collider as any).radius();\n\t\tif (typeof r === 'number') {\n\t\t\textentX = extentX ?? Math.abs(r);\n\t\t\textentY = extentY ?? Math.abs(r);\n\t\t}\n\t}\n\n\tlet relX = 0;\n\tlet relY = 0;\n\tif (extentX && extentY) {\n\t\trelX = clamp(dx / extentX, -1, 1);\n\t\trelY = clamp(dy / extentY, -1, 1);\n\t} else {\n\t\trelX = Math.sign(dx);\n\t\trelY = Math.sign(dy);\n\t}\n\tlet bounceVertical = Math.abs(dy) >= Math.abs(dx);\n\n\tlet selfExtentX: number | null = null;\n\tlet selfExtentY: number | null = null;\n\tconst selfShape: any = self.collider?.shape as any;\n\tif (selfShape) {\n\t\tif (selfShape.halfExtents) {\n\t\t\tselfExtentX = Math.abs(selfShape.halfExtents.x ?? selfShape.halfExtents[0] ?? null);\n\t\t\tselfExtentY = Math.abs(selfShape.halfExtents.y ?? selfShape.halfExtents[1] ?? null);\n\t\t}\n\t\tif ((selfExtentX == null || selfExtentY == null) && (typeof selfShape.radius === 'number')) {\n\t\t\tselfExtentX = selfExtentX ?? Math.abs(selfShape.radius);\n\t\t\tselfExtentY = selfExtentY ?? Math.abs(selfShape.radius);\n\t\t}\n\t}\n\tif ((selfExtentX == null || selfExtentY == null) && typeof (self.collider as any)?.halfExtents === 'function') {\n\t\tconst heS = (self.collider as any).halfExtents();\n\t\tif (heS) {\n\t\t\tselfExtentX = selfExtentX ?? Math.abs(heS.x);\n\t\t\tselfExtentY = selfExtentY ?? Math.abs(heS.y);\n\t\t}\n\t}\n\tif ((selfExtentX == null || selfExtentY == null) && typeof (self.collider as any)?.radius === 'function') {\n\t\tconst rS = (self.collider as any).radius();\n\t\tif (typeof rS === 'number') {\n\t\t\tselfExtentX = selfExtentX ?? Math.abs(rS);\n\t\t\tselfExtentY = selfExtentY ?? Math.abs(rS);\n\t\t}\n\t}\n\n\tif (extentX != null && extentY != null && selfExtentX != null && selfExtentY != null) {\n\t\tconst penX = (selfExtentX + extentX) - Math.abs(dx);\n\t\tconst penY = (selfExtentY + extentY) - Math.abs(dy);\n\t\tif (!Number.isNaN(penX) && !Number.isNaN(penY)) {\n\t\t\tbounceVertical = penY <= penX;\n\t\t}\n\t}\n\n\tlet usedAngleDeflection = false;\n\tif (bounceVertical) {\n\t\tconst resolvedY = (extentY ?? 0) + (selfExtentY ?? 0) + separation;\n\t\tnewY = otherPos.y + (dy > 0 ? resolvedY : -resolvedY);\n\t\tnewX = selfPos.x;\n\n\t\tconst isHorizontalPaddle = extentX != null && extentY != null && extentX > extentY;\n\t\tif (isHorizontalPaddle && reflectionMode === 'angled') {\n\t\t\tconst maxAngleRad = (maxAngleDeg * Math.PI) / 180;\n\t\t\tconst deadzone = Math.max(0, Math.min(1, minOffsetForAngle));\n\t\t\tconst clampedOffsetX = clamp(relX, -1, 1);\n\t\t\tconst absOff = Math.abs(clampedOffsetX);\n\t\t\tconst baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);\n\t\t\tconst speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);\n\t\t\tif (absOff > deadzone) {\n\t\t\t\tconst t = (absOff - deadzone) / (1 - deadzone);\n\t\t\t\tconst angle = Math.sign(clampedOffsetX) * (t * maxAngleRad);\n\t\t\t\tconst cosA = Math.cos(angle);\n\t\t\t\tconst sinA = Math.sin(angle);\n\t\t\t\tconst vy = Math.abs(speed * cosA);\n\t\t\t\tconst vx = speed * sinA;\n\t\t\t\tnewVelY = dy > 0 ? vy : -vy;\n\t\t\t\tnewVelX = vx;\n\t\t\t} else {\n\t\t\t\tconst vx = vel.x * centerRetentionFactor;\n\t\t\t\tconst vyMagSquared = Math.max(0, speed * speed - vx * vx);\n\t\t\t\tconst vy = Math.sqrt(vyMagSquared);\n\t\t\t\tnewVelY = dy > 0 ? vy : -vy;\n\t\t\t\tnewVelX = vx;\n\t\t\t}\n\t\t\tusedAngleDeflection = true;\n\t\t} else {\n\t\t\t// Simple vertical reflection (or non-paddle surface)\n\t\t\tnewVelY = dy > 0 ? Math.abs(vel.y) : -Math.abs(vel.y);\n\t\t\tif (reflectionMode === 'simple') usedAngleDeflection = true;\n\t\t}\n\t} else {\n\t\tconst resolvedX = (extentX ?? 0) + (selfExtentX ?? 0) + separation;\n\t\tnewX = otherPos.x + (dx > 0 ? resolvedX : -resolvedX);\n\t\tnewY = selfPos.y;\n\n\t\tif (reflectionMode === 'angled') {\n\t\t\tconst maxAngleRad = (maxAngleDeg * Math.PI) / 180;\n\t\t\tconst deadzone = Math.max(0, Math.min(1, minOffsetForAngle));\n\t\t\tconst clampedOffsetY = clamp(relY, -1, 1);\n\t\t\tconst absOff = Math.abs(clampedOffsetY);\n\t\t\tconst baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);\n\t\t\tconst speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);\n\t\t\tif (absOff > deadzone) {\n\t\t\t\tconst t = (absOff - deadzone) / (1 - deadzone);\n\t\t\t\tconst angle = Math.sign(clampedOffsetY) * (t * maxAngleRad);\n\t\t\t\tconst cosA = Math.cos(angle);\n\t\t\t\tconst sinA = Math.sin(angle);\n\t\t\t\tconst vx = Math.abs(speed * cosA);\n\t\t\t\tconst vy = speed * sinA;\n\t\t\t\tnewVelX = dx > 0 ? vx : -vx;\n\t\t\t\tnewVelY = vy;\n\t\t\t} else {\n\t\t\t\tconst vy = vel.y * centerRetentionFactor;\n\t\t\t\tconst vxMagSquared = Math.max(0, speed * speed - vy * vy);\n\t\t\t\tconst vx = Math.sqrt(vxMagSquared);\n\t\t\t\tnewVelX = dx > 0 ? vx : -vx;\n\t\t\t\tnewVelY = vy;\n\t\t\t}\n\t\t\tusedAngleDeflection = true;\n\t\t} else {\n\t\t\tnewVelX = dx > 0 ? Math.abs(vel.x) : -Math.abs(vel.x);\n\t\t\tnewVelY = vel.y;\n\t\t\tusedAngleDeflection = true;\n\t\t}\n\t}\n\n\tif (!usedAngleDeflection) {\n\t\tconst additionBaseX = Math.abs(newVelX);\n\t\tconst additionBaseY = Math.abs(newVelY);\n\t\tconst addX = Math.sign(relX) * Math.abs(relX) * additionBaseX;\n\t\tconst addY = Math.sign(relY) * Math.abs(relY) * additionBaseY;\n\t\tnewVelX += addX;\n\t\tnewVelY += addY;\n\t}\n\tconst currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);\n\tif (currentSpeed > 0) {\n\t\tconst targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);\n\t\tif (targetSpeed !== currentSpeed) {\n\t\t\tconst scale = targetSpeed / currentSpeed;\n\t\t\tnewVelX *= scale;\n\t\t\tnewVelY *= scale;\n\t\t}\n\t}\n\n\tif (newX !== selfPos.x || newY !== selfPos.y) {\n\t\tself.setPosition(newX, newY, selfPos.z);\n\t\tself.moveXY(newVelX, newVelY);\n\t\tif (callback) {\n\t\t\tconst velocityAfter = self.getVelocity();\n\t\t\tif (velocityAfter) {\n\t\t\t\tcallback({\n\t\t\t\t\tposition: { x: newX, y: newY, z: selfPos.z },\n\t\t\t\t\t...collisionContext,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}","import { Vector } from '@dimforge/rapier3d-compat';\nimport { MoveableEntity } from '../../capabilities/moveable';\nimport { CollisionContext, GameEntity } from '../../../entities/entity';\nimport { UpdateContext } from '../../../core/base-node-life-cycle';\nimport { CollisionSelector } from '../../../collision/utils';\n\nexport interface RicochetEvent extends Partial<UpdateContext<MoveableEntity>> {\n\tboundary?: 'top' | 'bottom' | 'left' | 'right';\n\tposition: Vector;\n\tvelocityBefore: Vector;\n\tvelocityAfter: Vector;\n}\n\nexport interface RicochetCollisionEvent extends CollisionContext<MoveableEntity, GameEntity<any>> {\n\tposition: Vector;\n}\n\nexport interface Ricochet2DInBoundsOptions {\n\trestitution?: number;\n\tminSpeed?: number;\n\tmaxSpeed?: number;\n\tboundaries: {\n\t\ttop: number;\n\t\tbottom: number;\n\t\tleft: number;\n\t\tright: number;\n\t};\n\tseparation?: number;\n}\n\nexport interface Ricochet2DCollisionOptions {\n\trestitution?: number;\n\tminSpeed?: number;\n\tmaxSpeed?: number;\n\tseparation?: number;\n\tcollisionWith?: CollisionSelector;\n\t/**\n\t * Choose between simple axis inversion or angled (paddle-style) reflection.\n\t * Defaults to 'angled'.\n\t */\n\treflectionMode?: 'simple' | 'angled';\n}\n\nexport type Ricochet2DCallback = (event: RicochetEvent) => void;\nexport type Ricochet2DCollisionCallback = (event: RicochetCollisionEvent) => void;\n\nexport function clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n\nexport { ricochet2DInBounds } from './ricochet-2d-in-bounds';\nexport { ricochet2DCollision } from './ricochet-2d-collision';","import { UpdateContext } from '../../../core/base-node-life-cycle';\nimport { MoveableEntity } from '../../capabilities/moveable';\nimport { Ricochet2DInBoundsOptions, Ricochet2DCallback, clamp } from './ricochet';\nimport { BehaviorCallbackType } from '../../../entities/entity';\n\n/**\n * Behavior for ricocheting an entity within fixed 2D boundaries\n */\nexport function ricochet2DInBounds(\n\toptions: Partial<Ricochet2DInBoundsOptions> = {},\n\tcallback?: Ricochet2DCallback\n): { type: BehaviorCallbackType; handler: (ctx: UpdateContext<MoveableEntity>) => void } {\n\treturn {\n\t\ttype: 'update' as BehaviorCallbackType,\n\t\thandler: (updateContext: UpdateContext<MoveableEntity>) => {\n\t\t\t_handleRicochet2DInBounds(updateContext, options, callback);\n\t\t},\n\t};\n}\n\nfunction _handleRicochet2DInBounds(\n\tupdateContext: UpdateContext<MoveableEntity>,\n\toptions: Partial<Ricochet2DInBoundsOptions>,\n\tcallback?: Ricochet2DCallback\n) {\n\tconst { me } = updateContext;\n\tconst {\n\t\trestitution = 0,\n\t\tminSpeed = 2,\n\t\tmaxSpeed = 20,\n\t\tboundaries = { top: 5, bottom: -5, left: -6.5, right: 6.5 },\n\t\tseparation = 0.0\n\t} = { ...options } as Ricochet2DInBoundsOptions;\n\n\tconst position = me.getPosition();\n\tconst velocity = me.getVelocity();\n\tif (!position || !velocity) return;\n\n\tlet newVelX = velocity.x;\n\tlet newVelY = velocity.y;\n\tlet newX = position.x;\n\tlet newY = position.y;\n\tlet ricochetBoundary: 'top' | 'bottom' | 'left' | 'right' | null = null;\n\n\tif (position.x <= boundaries.left) {\n\t\tnewVelX = Math.abs(velocity.x);\n\t\tnewX = boundaries.left + separation;\n\t\tricochetBoundary = 'left';\n\t} else if (position.x >= boundaries.right) {\n\t\tnewVelX = -Math.abs(velocity.x);\n\t\tnewX = boundaries.right - separation;\n\t\tricochetBoundary = 'right';\n\t}\n\n\tif (position.y <= boundaries.bottom) {\n\t\tnewVelY = Math.abs(velocity.y);\n\t\tnewY = boundaries.bottom + separation;\n\t\tricochetBoundary = 'bottom';\n\t} else if (position.y >= boundaries.top) {\n\t\tnewVelY = -Math.abs(velocity.y);\n\t\tnewY = boundaries.top - separation;\n\t\tricochetBoundary = 'top';\n\t}\n\n\tconst currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);\n\tif (currentSpeed > 0) {\n\t\tconst targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);\n\t\tif (targetSpeed !== currentSpeed) {\n\t\t\tconst scale = targetSpeed / currentSpeed;\n\t\t\tnewVelX *= scale;\n\t\t\tnewVelY *= scale;\n\t\t}\n\t}\n\n\tif (restitution) {\n\t\tnewVelX *= restitution;\n\t\tnewVelY *= restitution;\n\t}\n\n\tif (newX !== position.x || newY !== position.y) {\n\t\tme.setPosition(newX, newY, position.z);\n\t\tme.moveXY(newVelX, newVelY);\n\n\t\tif (callback && ricochetBoundary) {\n\t\t\tconst velocityAfter = me.getVelocity();\n\t\t\tif (velocityAfter) {\n\t\t\t\tcallback({\n\t\t\t\t\tboundary: ricochetBoundary,\n\t\t\t\t\tposition: { x: newX, y: newY, z: position.z },\n\t\t\t\t\tvelocityBefore: velocity,\n\t\t\t\t\tvelocityAfter,\n\t\t\t\t\t...updateContext,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}"],"mappings":"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","names":[]}
@@ -0,0 +1,26 @@
1
+ import { Vector2 } from 'three';
2
+ import { G as GameEntity } from './entity-COvRtFNG.js';
3
+ import { b as Stage } from './stage-types-CD21XoIU.js';
4
+ import * as _sinclair_typebox from '@sinclair/typebox';
5
+ import { Static } from '@sinclair/typebox';
6
+
7
+ interface EntitySpawner {
8
+ spawn: (stage: Stage, x: number, y: number) => Promise<GameEntity<any>>;
9
+ spawnRelative: (source: any, stage: Stage, offset?: Vector2) => Promise<any | void>;
10
+ }
11
+ declare function entitySpawner(factory: (x: number, y: number) => Promise<any> | GameEntity<any>): EntitySpawner;
12
+
13
+ declare const StageSchema: _sinclair_typebox.TObject<{
14
+ id: _sinclair_typebox.TString;
15
+ name: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
16
+ entities: _sinclair_typebox.TArray<_sinclair_typebox.TObject<{
17
+ id: _sinclair_typebox.TString;
18
+ type: _sinclair_typebox.TString;
19
+ position: _sinclair_typebox.TOptional<_sinclair_typebox.TTuple<[_sinclair_typebox.TNumber, _sinclair_typebox.TNumber]>>;
20
+ data: _sinclair_typebox.TOptional<_sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TAny>>;
21
+ }>>;
22
+ assets: _sinclair_typebox.TOptional<_sinclair_typebox.TArray<_sinclair_typebox.TString>>;
23
+ }>;
24
+ type StageBlueprint = Static<typeof StageSchema>;
25
+
26
+ export { type StageBlueprint as S, entitySpawner as e };
@@ -1,12 +1,29 @@
1
- import { Vector2, Camera, Vector3, Object3D, WebGLRenderer, Scene } from 'three';
2
- import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
3
- import { PerspectiveType } from './perspective';
1
+ import { Object3D, Camera, Vector2, WebGLRenderer, Scene, Vector3 } from 'three';
4
2
  import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
5
- import { StageEntity } from '../interfaces/entity';
3
+ import { S as StageEntity } from './entity-Bq_eNEDI.js';
4
+
5
+ declare const Perspectives: {
6
+ readonly FirstPerson: "first-person";
7
+ readonly ThirdPerson: "third-person";
8
+ readonly Isometric: "isometric";
9
+ readonly Flat2D: "flat-2d";
10
+ readonly Fixed2D: "fixed-2d";
11
+ };
12
+ type PerspectiveType = (typeof Perspectives)[keyof typeof Perspectives];
13
+
14
+ interface CameraDebugState {
15
+ enabled: boolean;
16
+ selected: string[];
17
+ }
18
+ interface CameraDebugDelegate {
19
+ subscribe(listener: (state: CameraDebugState) => void): () => void;
20
+ resolveTarget(uuid: string): Object3D | null;
21
+ }
22
+
6
23
  /**
7
24
  * Interface for perspective-specific camera controllers
8
25
  */
9
- export interface PerspectiveController {
26
+ interface PerspectiveController {
10
27
  setup(params: {
11
28
  screenResolution: Vector2;
12
29
  renderer: WebGLRenderer;
@@ -16,31 +33,18 @@ export interface PerspectiveController {
16
33
  update(delta: number): void;
17
34
  resize(width: number, height: number): void;
18
35
  }
19
- export interface CameraDebugState {
20
- enabled: boolean;
21
- selected: string[];
22
- }
23
- export interface CameraDebugDelegate {
24
- subscribe(listener: (state: CameraDebugState) => void): () => void;
25
- resolveTarget(uuid: string): Object3D | null;
26
- }
27
- export declare class ZylemCamera {
28
- cameraRig: Object3D;
36
+ declare class ZylemCamera {
37
+ cameraRig: Object3D | null;
29
38
  camera: Camera;
30
39
  screenResolution: Vector2;
31
40
  renderer: WebGLRenderer;
32
41
  composer: EffectComposer;
33
42
  _perspective: PerspectiveType;
34
- orbitControls: OrbitControls | null;
35
43
  target: StageEntity | null;
36
44
  sceneRef: Scene | null;
37
45
  frustumSize: number;
38
46
  perspectiveController: PerspectiveController | null;
39
- debugDelegate: CameraDebugDelegate | null;
40
- private debugUnsubscribe;
41
- private debugStateSnapshot;
42
- private orbitTarget;
43
- private orbitTargetWorldPos;
47
+ private orbitController;
44
48
  constructor(perspective: PerspectiveType, screenResolution: Vector2, frustumSize?: number);
45
49
  /**
46
50
  * Setup the camera with a scene
@@ -50,6 +54,10 @@ export declare class ZylemCamera {
50
54
  * Update camera and render
51
55
  */
52
56
  update(delta: number): void;
57
+ /**
58
+ * Check if debug mode is active (orbit controls taking over camera)
59
+ */
60
+ isDebugModeActive(): boolean;
53
61
  /**
54
62
  * Dispose renderer, composer, controls, and detach from scene
55
63
  */
@@ -82,14 +90,27 @@ export declare class ZylemCamera {
82
90
  private moveCamera;
83
91
  move(position: Vector3): void;
84
92
  rotate(pitch: number, yaw: number, roll: number): void;
93
+ /**
94
+ * Check if this perspective type needs a camera rig
95
+ */
96
+ private needsRig;
85
97
  /**
86
98
  * Get the DOM element for the renderer
87
99
  */
88
100
  getDomElement(): HTMLCanvasElement;
89
- private applyDebugState;
90
- private enableOrbitControls;
91
- private disableOrbitControls;
92
- private updateOrbitTargetFromSelection;
93
- private detachDebugDelegate;
94
101
  }
95
- //# sourceMappingURL=zylem-camera.d.ts.map
102
+
103
+ interface CameraOptions {
104
+ perspective?: PerspectiveType;
105
+ position?: Vector3;
106
+ target?: Vector3;
107
+ zoom?: number;
108
+ screenResolution?: Vector2;
109
+ }
110
+ declare class CameraWrapper {
111
+ cameraRef: ZylemCamera;
112
+ constructor(camera: ZylemCamera);
113
+ }
114
+ declare function camera(options: CameraOptions): CameraWrapper;
115
+
116
+ export { type CameraDebugDelegate as C, type PerspectiveType as P, ZylemCamera as Z, Perspectives as a, type CameraDebugState as b, camera as c, CameraWrapper as d };
@@ -0,0 +1,5 @@
1
+ export { P as PerspectiveType, a as Perspectives, c as camera } from './camera-CpbDr4-V.js';
2
+ import 'three';
3
+ import 'three/examples/jsm/postprocessing/EffectComposer.js';
4
+ import './entity-Bq_eNEDI.js';
5
+ import '@dimforge/rapier3d-compat';