@zylem/behaviors 0.5.11 → 0.8.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 (135) hide show
  1. package/dist/{chunk-EIWQM6U3.js → chunk-2HKY6WF7.js} +0 -1
  2. package/dist/{chunk-IZJFUAXB.js → chunk-2HLZBWGD.js} +0 -1
  3. package/dist/{chunk-LL4FLHIY.js → chunk-2YF7J3H4.js} +0 -1
  4. package/dist/{chunk-SGHIGTVZ.js → chunk-3X3CL24Z.js} +0 -1
  5. package/dist/{chunk-HZMY3TT4.js → chunk-4DVDFCVY.js} +0 -1
  6. package/dist/{chunk-QVCMJ4Q2.js → chunk-4EWASZHB.js} +0 -1
  7. package/dist/{chunk-S5HFWDGM.js → chunk-55CFXXZH.js} +3 -4
  8. package/dist/{chunk-IRMJTAIK.js → chunk-57GLKGEX.js} +3 -4
  9. package/dist/{chunk-MUBU2DIB.js → chunk-7CE6OHLW.js} +3 -4
  10. package/dist/{chunk-WQUPSOFV.js → chunk-7GGR26YA.js} +3 -4
  11. package/dist/{chunk-3QUECYMT.js → chunk-7LHXAEOZ.js} +4 -5
  12. package/dist/{chunk-PLIXVF7B.js → chunk-7TIIRJKF.js} +3 -4
  13. package/dist/{chunk-DWVLGXMF.js → chunk-CB3C7CRD.js} +4 -5
  14. package/dist/{chunk-DGDNFX43.js → chunk-CTSYM56P.js} +5 -6
  15. package/dist/{chunk-NW4SE5XW.js → chunk-DD4U42FG.js} +2 -3
  16. package/dist/{chunk-BAXJ7XHJ.js → chunk-E2MOFIDH.js} +3 -4
  17. package/dist/{chunk-WOMHL23C.js → chunk-ERS6SNA5.js} +1 -2
  18. package/dist/{chunk-4WH2ZN7P.js → chunk-F7E23E26.js} +0 -1
  19. package/dist/{chunk-4GW6DCYF.js → chunk-GZ3DQIIZ.js} +0 -1
  20. package/dist/{chunk-5WRI5ZAA.js → chunk-JSBRDJBE.js} +0 -1
  21. package/dist/{chunk-5A5AYP2C.js → chunk-K6CWKFHL.js} +0 -1
  22. package/dist/{chunk-52FJIDGL.js → chunk-LAN7U3AK.js} +1 -2
  23. package/dist/{chunk-GL5JGXPR.js → chunk-LLDLVVG4.js} +4 -5
  24. package/dist/{chunk-M3QDKKDF.js → chunk-LWM346FW.js} +0 -1
  25. package/dist/{chunk-JACX7ZMJ.js → chunk-M25QJBDN.js} +4 -5
  26. package/dist/{chunk-GLXEJD2P.js → chunk-NDJO56BB.js} +3 -4
  27. package/dist/{chunk-AS3HR7AS.js → chunk-OBF6BIA2.js} +1 -2
  28. package/dist/{chunk-KIYUUSPK.js → chunk-OSPQFWQF.js} +2 -3
  29. package/dist/{chunk-ZOYA3TZG.js → chunk-OU2SW4U5.js} +3 -4
  30. package/dist/{chunk-H4TJ7X4O.js → chunk-QU6GQ657.js} +2 -3
  31. package/dist/{chunk-KFFETUAL.js → chunk-RR3XNDKG.js} +2 -3
  32. package/dist/{chunk-JVADRLWX.js → chunk-SHZZ2QRV.js} +2 -3
  33. package/dist/{chunk-D7N6SC4D.js → chunk-TK3AXXXI.js} +3 -4
  34. package/dist/{chunk-OPZ2LVS2.js → chunk-TZQQYJYK.js} +0 -1
  35. package/dist/{chunk-USFIJUDN.js → chunk-UF7QPYUX.js} +0 -1
  36. package/dist/{chunk-NQPYMUDF.js → chunk-UKGBQTHL.js} +3 -4
  37. package/dist/{chunk-5XPPLTC7.js → chunk-UUMH3DC3.js} +1 -2
  38. package/dist/{chunk-TBUKJKY6.js → chunk-VJ3UA6OD.js} +1 -2
  39. package/dist/{chunk-OHCPV2NT.js → chunk-WHKPWIQO.js} +0 -1
  40. package/dist/{chunk-EZNCCO4L.js → chunk-YDLO5M7S.js} +0 -1
  41. package/dist/cooldown.js +3 -4
  42. package/dist/coordinators/boundary-ricochet-3d.js +4 -5
  43. package/dist/coordinators/boundary-ricochet.js +4 -5
  44. package/dist/coordinators/first-person-shooter.js +4 -5
  45. package/dist/coordinators/multidirectional-space-shooter.js +6 -7
  46. package/dist/coordinators/top-down-shooter.js +6 -7
  47. package/dist/core.js +6 -7
  48. package/dist/destructible-3d.js +4 -5
  49. package/dist/destructible-prebake.js +2 -3
  50. package/dist/first-person.js +7 -8
  51. package/dist/index.js +40 -41
  52. package/dist/jumper-2d.js +5 -6
  53. package/dist/jumper-3d.js +6 -7
  54. package/dist/particle-emitter/presets.js +2 -3
  55. package/dist/particle-emitter.js +5 -6
  56. package/dist/platformer-2d.js +5 -6
  57. package/dist/platformer-3d.js +5 -6
  58. package/dist/ricochet-2d.js +5 -6
  59. package/dist/ricochet-3d.js +5 -6
  60. package/dist/runtime-2d.js +2 -3
  61. package/dist/screen-visibility.js +3 -4
  62. package/dist/screen-wrap.js +5 -6
  63. package/dist/shooter-2d.js +5 -6
  64. package/dist/thruster.js +5 -6
  65. package/dist/top-down-movement.js +7 -8
  66. package/dist/world-boundary-2d.js +6 -7
  67. package/dist/world-boundary-3d.js +6 -7
  68. package/package.json +158 -160
  69. package/dist/chunk-3QUECYMT.js.map +0 -1
  70. package/dist/chunk-4GW6DCYF.js.map +0 -1
  71. package/dist/chunk-4WH2ZN7P.js.map +0 -1
  72. package/dist/chunk-52FJIDGL.js.map +0 -1
  73. package/dist/chunk-5A5AYP2C.js.map +0 -1
  74. package/dist/chunk-5WRI5ZAA.js.map +0 -1
  75. package/dist/chunk-5XPPLTC7.js.map +0 -1
  76. package/dist/chunk-AS3HR7AS.js.map +0 -1
  77. package/dist/chunk-BAXJ7XHJ.js.map +0 -1
  78. package/dist/chunk-D7N6SC4D.js.map +0 -1
  79. package/dist/chunk-DGDNFX43.js.map +0 -1
  80. package/dist/chunk-DWVLGXMF.js.map +0 -1
  81. package/dist/chunk-EIWQM6U3.js.map +0 -1
  82. package/dist/chunk-EZNCCO4L.js.map +0 -1
  83. package/dist/chunk-GL5JGXPR.js.map +0 -1
  84. package/dist/chunk-GLXEJD2P.js.map +0 -1
  85. package/dist/chunk-H4TJ7X4O.js.map +0 -1
  86. package/dist/chunk-HZMY3TT4.js.map +0 -1
  87. package/dist/chunk-IRMJTAIK.js.map +0 -1
  88. package/dist/chunk-IZJFUAXB.js.map +0 -1
  89. package/dist/chunk-JACX7ZMJ.js.map +0 -1
  90. package/dist/chunk-JVADRLWX.js.map +0 -1
  91. package/dist/chunk-KFFETUAL.js.map +0 -1
  92. package/dist/chunk-KIYUUSPK.js.map +0 -1
  93. package/dist/chunk-LL4FLHIY.js.map +0 -1
  94. package/dist/chunk-M3QDKKDF.js.map +0 -1
  95. package/dist/chunk-MUBU2DIB.js.map +0 -1
  96. package/dist/chunk-NQPYMUDF.js.map +0 -1
  97. package/dist/chunk-NW4SE5XW.js.map +0 -1
  98. package/dist/chunk-OHCPV2NT.js.map +0 -1
  99. package/dist/chunk-OPZ2LVS2.js.map +0 -1
  100. package/dist/chunk-PLIXVF7B.js.map +0 -1
  101. package/dist/chunk-QVCMJ4Q2.js.map +0 -1
  102. package/dist/chunk-S5HFWDGM.js.map +0 -1
  103. package/dist/chunk-SGHIGTVZ.js.map +0 -1
  104. package/dist/chunk-TBUKJKY6.js.map +0 -1
  105. package/dist/chunk-USFIJUDN.js.map +0 -1
  106. package/dist/chunk-WOMHL23C.js.map +0 -1
  107. package/dist/chunk-WQUPSOFV.js.map +0 -1
  108. package/dist/chunk-ZOYA3TZG.js.map +0 -1
  109. package/dist/cooldown.js.map +0 -1
  110. package/dist/coordinators/boundary-ricochet-3d.js.map +0 -1
  111. package/dist/coordinators/boundary-ricochet.js.map +0 -1
  112. package/dist/coordinators/first-person-shooter.js.map +0 -1
  113. package/dist/coordinators/multidirectional-space-shooter.js.map +0 -1
  114. package/dist/coordinators/top-down-shooter.js.map +0 -1
  115. package/dist/core.js.map +0 -1
  116. package/dist/destructible-3d.js.map +0 -1
  117. package/dist/destructible-prebake.js.map +0 -1
  118. package/dist/first-person.js.map +0 -1
  119. package/dist/index.js.map +0 -1
  120. package/dist/jumper-2d.js.map +0 -1
  121. package/dist/jumper-3d.js.map +0 -1
  122. package/dist/particle-emitter/presets.js.map +0 -1
  123. package/dist/particle-emitter.js.map +0 -1
  124. package/dist/platformer-2d.js.map +0 -1
  125. package/dist/platformer-3d.js.map +0 -1
  126. package/dist/ricochet-2d.js.map +0 -1
  127. package/dist/ricochet-3d.js.map +0 -1
  128. package/dist/runtime-2d.js.map +0 -1
  129. package/dist/screen-visibility.js.map +0 -1
  130. package/dist/screen-wrap.js.map +0 -1
  131. package/dist/shooter-2d.js.map +0 -1
  132. package/dist/thruster.js.map +0 -1
  133. package/dist/top-down-movement.js.map +0 -1
  134. package/dist/world-boundary-2d.js.map +0 -1
  135. package/dist/world-boundary-3d.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/behaviors/jumper-2d/components.ts","../src/lib/behaviors/jumper-2d/jumper-2d-fsm.ts","../src/lib/behaviors/jumper-2d/jumper-2d.descriptor.ts"],"sourcesContent":["export interface JumpConfig2D {\n\tjumpHeight: number;\n\tgravity: number;\n\tmaxFallSpeed?: number;\n\tmaxJumps: number;\n\tresetJumpsOnGround: boolean;\n\tcoyoteTimeMs: number;\n\tjumpBufferMs: number;\n\tminTimeBetweenJumpsMs?: number;\n\tvariableJump?: {\n\t\tenabled: boolean;\n\t\tcutGravityMultiplier: number;\n\t\tmaxHoldMs?: number;\n\t};\n}\n\nexport function createJumpConfig2D(\n\toptions: Partial<JumpConfig2D> = {},\n): JumpConfig2D {\n\treturn {\n\t\tjumpHeight: options.jumpHeight ?? 2.5,\n\t\tgravity: options.gravity ?? 20,\n\t\tmaxFallSpeed: options.maxFallSpeed,\n\t\tmaxJumps: options.maxJumps ?? 1,\n\t\tresetJumpsOnGround: options.resetJumpsOnGround ?? true,\n\t\tcoyoteTimeMs: options.coyoteTimeMs ?? 100,\n\t\tjumpBufferMs: options.jumpBufferMs ?? 80,\n\t\tminTimeBetweenJumpsMs: options.minTimeBetweenJumpsMs,\n\t\tvariableJump: options.variableJump,\n\t};\n}\n\nexport interface JumpInput2D {\n\tjumpPressed: boolean;\n\tjumpHeld: boolean;\n\tjumpReleased: boolean;\n\tfastFall?: boolean;\n}\n\nexport function createJumpInput2D(): JumpInput2D {\n\treturn {\n\t\tjumpPressed: false,\n\t\tjumpHeld: false,\n\t\tjumpReleased: false,\n\t\tfastFall: false,\n\t};\n}\n\nexport interface JumpContext2D {\n\tdt: number;\n\tvelocityY: number;\n\tisGrounded: boolean;\n\ttimeSinceGroundedMs: number;\n\tsetVerticalVelocity(y: number): void;\n}\n\nexport interface JumpState2D {\n\tjumpsUsed: number;\n\tlastJumpTimeMs: number;\n\tbufferedJumpMs: number;\n\tcoyoteMs: number;\n\tisJumping: boolean;\n\tjumpHoldMs: number;\n\tjumpCutApplied: boolean;\n}\n\nexport function createJumpState2D(): JumpState2D {\n\treturn {\n\t\tjumpsUsed: 0,\n\t\tlastJumpTimeMs: 0,\n\t\tbufferedJumpMs: 0,\n\t\tcoyoteMs: 0,\n\t\tisJumping: false,\n\t\tjumpHoldMs: 0,\n\t\tjumpCutApplied: false,\n\t};\n}\n","import { SyncStateMachine, t } from '../../core/utility/sync-state-machine';\nimport type { JumpState2D } from './components';\n\nexport enum Jumper2DState {\n\tGrounded = 'grounded',\n\tJumping = 'jumping',\n\tFalling = 'falling',\n}\n\nexport enum Jumper2DEvent {\n\tJump = 'jump',\n\tFall = 'fall',\n\tLand = 'land',\n}\n\nexport interface Jumper2DFSMContext {\n\tstate: JumpState2D;\n}\n\nexport class Jumper2DFSM {\n\tmachine: SyncStateMachine<Jumper2DState, Jumper2DEvent, never>;\n\n\tconstructor(private ctx: Jumper2DFSMContext) {\n\t\tthis.machine = new SyncStateMachine<Jumper2DState, Jumper2DEvent, never>(\n\t\t\tJumper2DState.Grounded,\n\t\t\t[\n\t\t\t\tt(Jumper2DState.Grounded, Jumper2DEvent.Jump, Jumper2DState.Jumping),\n\t\t\t\tt(Jumper2DState.Grounded, Jumper2DEvent.Fall, Jumper2DState.Falling),\n\t\t\t\tt(Jumper2DState.Grounded, Jumper2DEvent.Land, Jumper2DState.Grounded),\n\t\t\t\tt(Jumper2DState.Jumping, Jumper2DEvent.Fall, Jumper2DState.Falling),\n\t\t\t\tt(Jumper2DState.Jumping, Jumper2DEvent.Land, Jumper2DState.Grounded),\n\t\t\t\tt(Jumper2DState.Jumping, Jumper2DEvent.Jump, Jumper2DState.Jumping),\n\t\t\t\tt(Jumper2DState.Falling, Jumper2DEvent.Land, Jumper2DState.Grounded),\n\t\t\t\tt(Jumper2DState.Falling, Jumper2DEvent.Jump, Jumper2DState.Jumping),\n\t\t\t\tt(Jumper2DState.Falling, Jumper2DEvent.Fall, Jumper2DState.Falling),\n\t\t\t],\n\t\t);\n\t}\n\n\tgetState(): Jumper2DState {\n\t\treturn this.machine.getState();\n\t}\n\n\tdispatch(event: Jumper2DEvent): void {\n\t\tif (this.machine.can(event)) {\n\t\t\tthis.machine.syncDispatch(event);\n\t\t}\n\t}\n\n\tisJumping(): boolean {\n\t\treturn this.getState() === Jumper2DState.Jumping;\n\t}\n\n\tisGrounded(): boolean {\n\t\treturn this.getState() === Jumper2DState.Grounded;\n\t}\n\n\tgetJumpsUsed(): number {\n\t\treturn this.ctx.state.jumpsUsed;\n\t}\n\n\tapplyTickEvent(tickEvent: string, isGrounded: boolean): void {\n\t\tswitch (tickEvent) {\n\t\t\tcase 'jump':\n\t\t\t\tthis.dispatch(Jumper2DEvent.Jump);\n\t\t\t\tbreak;\n\t\t\tcase 'fall':\n\t\t\t\tthis.dispatch(Jumper2DEvent.Fall);\n\t\t\t\tbreak;\n\t\t\tcase 'land':\n\t\t\t\tthis.dispatch(Jumper2DEvent.Land);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (!isGrounded && this.getState() === Jumper2DState.Grounded) {\n\t\t\t\t\tthis.dispatch(Jumper2DEvent.Fall);\n\t\t\t\t}\n\t\t\t\tif (isGrounded && this.getState() !== Jumper2DState.Grounded) {\n\t\t\t\t\tthis.dispatch(Jumper2DEvent.Land);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import { defineBehavior } from '../behavior-descriptor';\nimport type { BehaviorEntityLink, BehaviorSystem } from '../behavior-system';\nimport {\n\tcreateJumpInput2D,\n\ttype JumpConfig2D,\n\ttype JumpInput2D,\n\ttype JumpState2D,\n} from './components';\nimport { Jumper2DState } from './jumper-2d-fsm';\nimport {\n\tSTAGE_INPUT_BUTTON_JUMP,\n\treadBehaviorSnapshot,\n\ttype BehaviorRuntime,\n} from '../../runtime/wasm-stage-runtime';\n\nexport interface Jumper2DBehaviorOptions {\n\tjumpHeight?: number;\n\tgravity?: number;\n\tmaxFallSpeed?: number;\n\tmaxJumps?: number;\n\tresetJumpsOnGround?: boolean;\n\tcoyoteTimeMs?: number;\n\tjumpBufferMs?: number;\n\tminTimeBetweenJumpsMs?: number;\n\tvariableJump?: JumpConfig2D['variableJump'];\n\tgroundRayLength?: number;\n\tsnapToGroundDistance?: number;\n\tdebugGroundProbe?: boolean;\n}\n\nconst defaultOptions: Jumper2DBehaviorOptions = {\n\tjumpHeight: 2.5,\n\tgravity: 20,\n\tmaxJumps: 1,\n\tresetJumpsOnGround: true,\n\tcoyoteTimeMs: 100,\n\tjumpBufferMs: 80,\n\tgroundRayLength: 1,\n\tdebugGroundProbe: false,\n};\n\nconst JUMPER_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:jumper-2d');\n\nexport function isJumper2DGrounded(params: {\n\tnearGround?: boolean;\n\tvelocityY: number;\n\tsupportToi?: number | null;\n\tsnapToGroundDistance?: number;\n}): boolean {\n\tif (params.velocityY > 0) {\n\t\treturn false;\n\t}\n\n\tif (params.snapToGroundDistance != null) {\n\t\treturn (\n\t\t\tparams.supportToi != null &&\n\t\t\tparams.supportToi <= params.snapToGroundDistance\n\t\t);\n\t}\n\n\treturn params.nearGround === true;\n}\n\nexport interface Jumper2DEntity {\n\tuuid: string;\n\ttransformStore: import('../../capabilities/transform-store').TransformState;\n\tjumper2d: JumpConfig2D;\n\t$jumper2d: JumpInput2D;\n\tjumper2dState: JumpState2D;\n}\n\n/**\n * Forwards jump input into the wasm runtime. The Rust `jumper_2d` Stage\n * behavior (ground probe + jump core) is the single simulation path; handles\n * read its state back via the snapshot buffer.\n */\nclass Jumper2DBehaviorSystem implements BehaviorSystem {\n\tprivate attachedRuntimeSlots = new Set<number>();\n\n\tconstructor(\n\t\tprivate wasmStage: BehaviorRuntime | null,\n\t\tprivate getBehaviorLinks?: (key: symbol) => Iterable<BehaviorEntityLink>,\n\t) {}\n\n\tupdate(_ecs: unknown, _delta: number): void {\n\t\tconst links = this.getBehaviorLinks?.(JUMPER_2D_BEHAVIOR_KEY);\n\t\tif (!links) return;\n\n\t\tfor (const link of links) {\n\t\t\tconst gameEntity = link.entity as any;\n\t\t\tconst jumperRef = link.ref as any;\n\n\t\t\tconst options = jumperRef.options as Jumper2DBehaviorOptions;\n\t\t\tconst handle = (gameEntity.runtimeHandle ?? -1) as number;\n\t\t\tif (!this.wasmStage || handle < 0) continue;\n\n\t\t\tif (!gameEntity.$jumper2d) {\n\t\t\t\tgameEntity.$jumper2d = createJumpInput2D();\n\t\t\t}\n\n\t\t\tthis.ensureWasmAttached(handle, options);\n\t\t\tjumperRef.__wasmStage = this.wasmStage;\n\t\t\tjumperRef.__entity = gameEntity;\n\t\t\tconst input = gameEntity.$jumper2d as JumpInput2D;\n\t\t\tconst jumpPressed = !!(input.jumpPressed || input.jumpHeld);\n\t\t\tthis.wasmStage.writeInputButton(handle, STAGE_INPUT_BUTTON_JUMP, jumpPressed);\n\t\t}\n\t}\n\n\tprivate ensureWasmAttached(handle: number, options: Jumper2DBehaviorOptions): void {\n\t\tif (!this.wasmStage || this.attachedRuntimeSlots.has(handle)) return;\n\t\tconst jumpForce = Math.sqrt(2 * (options.gravity ?? 20) * (options.jumpHeight ?? 2.5));\n\t\tthis.wasmStage.attachJumper2D(handle, {\n\t\t\tjumpForce,\n\t\t\tmaxJumps: options.maxJumps ?? 1,\n\t\t\tjumpBufferTime: (options.jumpBufferMs ?? 80) / 1000,\n\t\t\tcoyoteTime: (options.coyoteTimeMs ?? 100) / 1000,\n\t\t\tgravity: options.gravity ?? 20,\n\t\t});\n\t\tthis.attachedRuntimeSlots.add(handle);\n\t}\n\n\tdestroy(_ecs: unknown): void {\n\t\tthis.attachedRuntimeSlots.clear();\n\t}\n}\n\nexport const Jumper2DBehavior = defineBehavior<\n\tJumper2DBehaviorOptions,\n\t{\n\t\tgetState: () => Jumper2DState;\n\t\tisJumping: () => boolean;\n\t\tgetJumpsUsed: () => number;\n\t\tgetJumpsRemaining: () => number;\n\t},\n\tJumper2DEntity\n>({\n\tname: 'jumper-2d',\n\tdefaultOptions,\n\tsystemFactory: (ctx) =>\n\t\tnew Jumper2DBehaviorSystem(ctx.wasmStage ?? null, ctx.getBehaviorLinks),\n\t// Handles read the runtime snapshot buffer (previous-step values). The\n\t// Rust behavior is the single source of truth.\n\tcreateHandle: (ref) => {\n\t\tconst jumpsUsed = () => readBehaviorSnapshot(ref)?.jumpCount ?? 0;\n\t\treturn {\n\t\t\tgetState: () => {\n\t\t\t\tconst snapshot = readBehaviorSnapshot(ref);\n\t\t\t\tif (!snapshot) return Jumper2DState.Grounded;\n\t\t\t\tif (snapshot.grounded) return Jumper2DState.Grounded;\n\t\t\t\treturn snapshot.verticalVelocity > 0\n\t\t\t\t\t? Jumper2DState.Jumping\n\t\t\t\t\t: Jumper2DState.Falling;\n\t\t\t},\n\t\t\tisJumping: () => {\n\t\t\t\tconst snapshot = readBehaviorSnapshot(ref);\n\t\t\t\treturn snapshot ? !snapshot.grounded && snapshot.verticalVelocity > 0 : false;\n\t\t\t},\n\t\t\tgetJumpsUsed: jumpsUsed,\n\t\t\tgetJumpsRemaining: () => (ref.options.maxJumps ?? 1) - jumpsUsed(),\n\t\t};\n\t},\n});\n"],"mappings":"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","names":["Jumper2DState","Jumper2DEvent"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/core.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/capabilities/transform-store.ts","../src/lib/capabilities/velocity-intents.ts","../src/lib/capabilities/moveable.ts","../src/lib/runtime/mock-behavior-runtime.ts","../src/lib/runtime/simulation.ts","../src/lib/entities/entity.ts"],"sourcesContent":["import { proxy } from 'valtio/vanilla';\n\nexport type VelocityIntentMode = 'replace' | 'add';\n\nexport interface VelocityIntent {\n\tx?: number;\n\ty?: number;\n\tz?: number;\n\tmode: VelocityIntentMode;\n\tpriority?: number;\n}\n\n/**\n * Transform state managed by Valtio for per-frame physics intent accumulation.\n * \n * This store accumulates transformation intents during the frame,\n * then applies them all at once after onUpdate() callbacks complete.\n * \n * Design decisions:\n * - Position: Accumulated deltas (additive)\n * - Rotation: Last value wins (replacement)\n * - Velocity: Accumulated deltas (additive)\n * - Angular velocity: Accumulated deltas (additive)\n */\nexport interface TransformState {\n\t/** Position deltas to be applied (accumulated) */\n\tposition: { x: number; y: number; z: number };\n\t\n\t/** Rotation quaternion (last value wins) */\n\trotation: { x: number; y: number; z: number; w: number };\n\t\n\t/** Linear velocity (accumulated) */\n\tvelocity: { x: number; y: number; z: number };\n\t\n\t/** Angular velocity (accumulated) */\n\tangularVelocity: { x: number; y: number; z: number };\n\n\t/** Per-source velocity intents composed once per frame */\n\tvelocityChannels: Record<string, VelocityIntent>;\n\t\n\t/** Dirty flags to track what needs to be applied */\n\tdirty: {\n\t\tposition: boolean;\n\t\trotation: boolean;\n\t\tvelocityX: boolean;\n\t\tvelocityY: boolean;\n\t\tvelocityZ: boolean;\n\t\tvelocityChannels: boolean;\n\t\tangularVelocity: boolean;\n\t};\n}\n\n/**\n * Create a new transform store with optional initial values.\n * The store is a Valtio proxy, making it reactive for debugging/visualization.\n * \n * @param initial Optional initial state values\n * @returns Reactive transform state\n */\nexport function createTransformStore(initial?: Partial<TransformState>): TransformState {\n\tconst defaultState: TransformState = {\n\t\tposition: { x: 0, y: 0, z: 0 },\n\t\trotation: { x: 0, y: 0, z: 0, w: 1 },\n\t\tvelocity: { x: 0, y: 0, z: 0 },\n\t\tangularVelocity: { x: 0, y: 0, z: 0 },\n\t\tvelocityChannels: {},\n\t\tdirty: {\n\t\t\tposition: false,\n\t\t\trotation: false,\n\t\t\tvelocityX: false,\n\t\t\tvelocityY: false,\n\t\t\tvelocityZ: false,\n\t\t\tvelocityChannels: false,\n\t\t\tangularVelocity: false,\n\t\t},\n\t};\n\n\treturn proxy({\n\t\t...defaultState,\n\t\t...initial,\n\t\t// Ensure dirty flags are properly initialized even if partial initial state\n\t\tdirty: {\n\t\t\t...defaultState.dirty,\n\t\t\t...initial?.dirty,\n\t\t},\n\t});\n}\n\n","import { TransformState, VelocityIntentMode } from './transform-store';\n\nexport interface VelocityIntentOptions {\n\tmode?: VelocityIntentMode;\n\tpriority?: number;\n}\n\nexport interface VelocityIntentVector {\n\tx?: number;\n\ty?: number;\n\tz?: number;\n}\n\nexport function setVelocityIntent(\n\tstore: TransformState,\n\tsourceId: string,\n\tvector: VelocityIntentVector,\n\toptions: VelocityIntentOptions = {},\n): void {\n\tconst prev = store.velocityChannels[sourceId];\n\tconst mode = options.mode ?? prev?.mode ?? 'replace';\n\tconst priority = options.priority ?? prev?.priority ?? 0;\n\tconst isAdditiveMerge = mode === 'add' && prev?.mode === 'add';\n\n\tconst x =\n\t\tvector.x == null\n\t\t\t? prev?.x\n\t\t\t: isAdditiveMerge\n\t\t\t\t? (prev?.x ?? 0) + vector.x\n\t\t\t\t: vector.x;\n\tconst y =\n\t\tvector.y == null\n\t\t\t? prev?.y\n\t\t\t: isAdditiveMerge\n\t\t\t\t? (prev?.y ?? 0) + vector.y\n\t\t\t\t: vector.y;\n\tconst z =\n\t\tvector.z == null\n\t\t\t? prev?.z\n\t\t\t: isAdditiveMerge\n\t\t\t\t? (prev?.z ?? 0) + vector.z\n\t\t\t\t: vector.z;\n\n\tstore.velocityChannels[sourceId] = {\n\t\tx,\n\t\ty,\n\t\tz,\n\t\tmode,\n\t\tpriority,\n\t};\n\tstore.dirty.velocityChannels = true;\n}\n\nexport function clearVelocityIntent(store: TransformState, sourceId: string): void {\n\tif (!(sourceId in store.velocityChannels)) return;\n\tdelete store.velocityChannels[sourceId];\n\tstore.dirty.velocityChannels = true;\n}\n","import { Vector3 } from 'three';\nimport type { TransformState } from './transform-store';\nimport { createTransformStore } from './transform-store';\nimport { setVelocityIntent } from './velocity-intents';\n\n/** Plain `{ x, y, z }` vector returned by pose/velocity reads. */\nexport interface Vector {\n\tx: number;\n\ty: number;\n\tz: number;\n}\n\n/**\n * Structural slice of the host body reference used by the direct-body helpers\n * below (`getPosition`, `setPosition`, `resetVelocity`, ...). The host's\n * runtime-backed body proxy satisfies this shape.\n */\nexport interface MoveableBodyLike {\n\ttranslation(): Vector;\n\tlinvel(): Vector;\n\tsetTranslation(translation: Vector, wakeUp: boolean): void;\n\tsetLinvel(velocity: Vector, wakeUp: boolean): void;\n\tsetLinearDamping(damping: number): void;\n}\n\nexport interface EntityWithBody {\n\tbody: MoveableBodyLike | null;\n\ttransformStore?: TransformState;\n}\n\n/**\n * Move an entity along the X axis, preserving other velocities.\n */\nexport function moveX(entity: EntityWithBody, delta: number): void {\n\tif (!entity.transformStore) return;\n\tsetVelocityIntent(entity.transformStore, 'actions', { x: delta }, { mode: 'replace' });\n}\n\n/**\n * Move an entity along the Y axis, preserving other velocities.\n */\nexport function moveY(entity: EntityWithBody, delta: number): void {\n\tif (!entity.transformStore) return;\n\tsetVelocityIntent(entity.transformStore, 'actions', { y: delta }, { mode: 'replace' });\n}\n\n/**\n * Move an entity along the Z axis, preserving other velocities.\n */\nexport function moveZ(entity: EntityWithBody, delta: number): void {\n\tif (!entity.transformStore) return;\n\tsetVelocityIntent(entity.transformStore, 'actions', { z: delta }, { mode: 'replace' });\n}\n\n/**\n * Move an entity along the X and Y axis, preserving Z velocity.\n */\nexport function moveXY(entity: EntityWithBody, deltaX: number, deltaY: number): void {\n\tif (!entity.transformStore) return;\n\tsetVelocityIntent(\n\t\tentity.transformStore,\n\t\t'actions',\n\t\t{ x: deltaX, y: deltaY },\n\t\t{ mode: 'replace' },\n\t);\n}\n\n/**\n * Move an entity along the X and Z axis, preserving Y velocity.\n */\nexport function moveXZ(entity: EntityWithBody, deltaX: number, deltaZ: number): void {\n\tif (!entity.transformStore) return;\n\tsetVelocityIntent(\n\t\tentity.transformStore,\n\t\t'actions',\n\t\t{ x: deltaX, z: deltaZ },\n\t\t{ mode: 'replace' },\n\t);\n}\n\n/**\n * Move entity based on a vector, adding to existing velocities.\n */\nexport function move(entity: EntityWithBody, vector: Vector3): void {\n\tif (!entity.transformStore) return;\n\tsetVelocityIntent(\n\t\tentity.transformStore,\n\t\t'actions',\n\t\t{ x: vector.x, y: vector.y, z: vector.z },\n\t\t{ mode: 'add' },\n\t);\n}\n\n/**\n * Reset entity velocity\n */\nexport function resetVelocity(entity: EntityWithBody): void {\n\tif (!entity.body) return;\n\tentity.body.setLinvel(new Vector3(0, 0, 0), true);\n\tentity.body.setLinearDamping(5);\n}\n\n/**\n * Move entity forward in 2D space, preserving Z velocity\n */\nexport function moveForwardXY(entity: EntityWithBody, delta: number, rotation2DAngle: number): void {\n\tconst deltaX = Math.sin(-rotation2DAngle) * delta;\n\tconst deltaY = Math.cos(-rotation2DAngle) * delta;\n\tmoveXY(entity, deltaX, deltaY);\n}\n\n/**\n * Get entity position\n */\nexport function getPosition(entity: EntityWithBody): Vector | null {\n\tif (!entity.body) return null;\n\treturn entity.body.translation();\n}\n\n/**\n * Get entity velocity\n */\nexport function getVelocity(entity: EntityWithBody): Vector | null {\n\tif (!entity.body) return null;\n\treturn entity.body.linvel();\n}\n\n/**\n * Set entity position\n */\nexport function setPosition(entity: EntityWithBody, x: number, y: number, z: number): void {\n\tif (!entity.body) return;\n\tentity.body.setTranslation({ x, y, z }, true);\n}\n\n/**\n * Set entity X position\n */\nexport function setPositionX(entity: EntityWithBody, x: number): void {\n\tif (!entity.body) return;\n\tconst { y, z } = entity.body.translation();\n\tentity.body.setTranslation({ x, y, z }, true);\n}\n\n/**\n * Set entity Y position\n */\nexport function setPositionY(entity: EntityWithBody, y: number): void {\n\tif (!entity.body) return;\n\tconst { x, z } = entity.body.translation();\n\tentity.body.setTranslation({ x, y, z }, true);\n}\n\n/**\n * Set entity Z position\n */\nexport function setPositionZ(entity: EntityWithBody, z: number): void {\n\tif (!entity.body) return;\n\tconst { x, y } = entity.body.translation();\n\tentity.body.setTranslation({ x, y, z }, true);\n}\n\n/**\n * Wrap entity around 2D bounds\n */\nexport function wrapAroundXY(entity: EntityWithBody, boundsX: number, boundsY: number): void {\n\tconst position = getPosition(entity);\n\tif (!position) return;\n\n\tconst { x, y } = position;\n\tconst newX = x > boundsX ? -boundsX : (x < -boundsX ? boundsX : x);\n\tconst newY = y > boundsY ? -boundsY : (y < -boundsY ? boundsY : y);\n\n\tif (newX !== x || newY !== y) {\n\t\tsetPosition(entity, newX, newY, 0);\n\t}\n}\n\n/**\n * Wrap entity around 3D bounds\n */\nexport function wrapAround3D(entity: EntityWithBody, boundsX: number, boundsY: number, boundsZ: number): void {\n\tconst position = getPosition(entity);\n\tif (!position) return;\n\n\tconst { x, y, z } = position;\n\tconst newX = x > boundsX ? -boundsX : (x < -boundsX ? boundsX : x);\n\tconst newY = y > boundsY ? -boundsY : (y < -boundsY ? boundsY : y);\n\tconst newZ = z > boundsZ ? -boundsZ : (z < -boundsZ ? boundsZ : z);\n\n\tif (newX !== x || newY !== y || newZ !== z) {\n\t\tsetPosition(entity, newX, newY, newZ);\n\t}\n}\n\n/**\n * Enhanced moveable entity with bound methods\n */\nexport interface MoveableEntity extends EntityWithBody {\n\tmoveX(delta: number): void;\n\tmoveY(delta: number): void;\n\tmoveZ(delta: number): void;\n\tmoveXY(deltaX: number, deltaY: number): void;\n\tmoveXZ(deltaX: number, deltaZ: number): void;\n\tmove(vector: Vector3): void;\n\tresetVelocity(): void;\n\tmoveForwardXY(delta: number, rotation2DAngle: number): void;\n\tgetPosition(): Vector | null;\n\tgetVelocity(): Vector | null;\n\tsetPosition(x: number, y: number, z: number): void;\n\tsetPositionX(x: number): void;\n\tsetPositionY(y: number): void;\n\tsetPositionZ(z: number): void;\n\twrapAroundXY(boundsX: number, boundsY: number): void;\n\twrapAround3D(boundsX: number, boundsY: number, boundsZ: number): void;\n}\n\n/**\n * Enhance an entity with additive movement methods.\n * Automatically creates a transform store if one doesn't exist.\n */\nexport function makeMoveable<T extends EntityWithBody>(entity: T): T & MoveableEntity {\n\tconst moveable = entity as T & MoveableEntity;\n\n\t// Create transform store if it doesn't exist\n\tif (!moveable.transformStore) {\n\t\tmoveable.transformStore = createTransformStore();\n\t}\n\n\tmoveable.moveX = (delta: number) => moveX(entity, delta);\n\tmoveable.moveY = (delta: number) => moveY(entity, delta);\n\tmoveable.moveZ = (delta: number) => moveZ(entity, delta);\n\tmoveable.moveXY = (deltaX: number, deltaY: number) => moveXY(entity, deltaX, deltaY);\n\tmoveable.moveXZ = (deltaX: number, deltaZ: number) => moveXZ(entity, deltaX, deltaZ);\n\tmoveable.move = (vector: Vector3) => move(entity, vector);\n\tmoveable.resetVelocity = () => resetVelocity(entity);\n\tmoveable.moveForwardXY = (delta: number, rotation2DAngle: number) => moveForwardXY(entity, delta, rotation2DAngle);\n\tmoveable.getPosition = () => getPosition(entity);\n\tmoveable.getVelocity = () => getVelocity(entity);\n\tmoveable.setPosition = (x: number, y: number, z: number) => setPosition(entity, x, y, z);\n\tmoveable.setPositionX = (x: number) => setPositionX(entity, x);\n\tmoveable.setPositionY = (y: number) => setPositionY(entity, y);\n\tmoveable.setPositionZ = (z: number) => setPositionZ(entity, z);\n\tmoveable.wrapAroundXY = (boundsX: number, boundsY: number) => wrapAroundXY(entity, boundsX, boundsY);\n\tmoveable.wrapAround3D = (boundsX: number, boundsY: number, boundsZ: number) => wrapAround3D(entity, boundsX, boundsY, boundsZ);\n\n\treturn moveable;\n}","/**\n * In-memory implementation of the {@link BehaviorRuntime} contract for unit\n * tests. Records every attach / input call per handle and lets tests seed\n * poses and behavior snapshots without instantiating the wasm runtime.\n */\n\nimport type {\n\tBehaviorRuntime,\n\tStageBehaviorSnapshot,\n\tStageBoundaryDimValue,\n\tStageFirstPersonInput,\n\tStageFirstPersonOptions,\n\tStageJumper2DOptions,\n\tStageJumper3DOptions,\n\tStagePlatformer2DOptions,\n\tStagePlatformer3DOptions,\n\tStagePose,\n\tStageRicochetDimValue,\n\tStageRicochetOptions,\n\tStageScreenWrapOptions,\n\tStageShooter2DOptions,\n\tStageThrusterOptions,\n\tStageTopDownOptions,\n\tStageWorldBoundaryOptions,\n} from './wasm-stage-runtime';\n\ninterface MockSlotState {\n\tpose: StagePose;\n\tsnapshot: StageBehaviorSnapshot | null;\n\tinput: {\n\t\taxisA: number;\n\t\taxisB: number;\n\t\tyawDelta: number;\n\t\tpitchDelta: number;\n\t\treservedA: number;\n\t\treservedB: number;\n\t\tbuttons: number;\n\t};\n\tattachments: Map<string, unknown>;\n\tinputs: Array<{ kind: string; args: unknown[] }>;\n\tscreenWrapQuery: { fsm: number; lastWrappedAxes: number } | null;\n\tworldBoundaryQuery: { hits: number; clamped: [number, number, number] } | null;\n}\n\nfunction freshSlot(): MockSlotState {\n\treturn {\n\t\tpose: { position: [0, 0, 0], rotation: [0, 0, 0, 1] },\n\t\tsnapshot: null,\n\t\tinput: { axisA: 0, axisB: 0, yawDelta: 0, pitchDelta: 0, reservedA: 0, reservedB: 0, buttons: 0 },\n\t\tattachments: new Map(),\n\t\tinputs: [],\n\t\tscreenWrapQuery: null,\n\t\tworldBoundaryQuery: null,\n\t};\n}\n\nexport class MockBehaviorRuntime implements BehaviorRuntime {\n\tprivate slots = new Map<number, MockSlotState>();\n\n\tprivate slot(handle: number): MockSlotState {\n\t\tlet state = this.slots.get(handle);\n\t\tif (!state) {\n\t\t\tstate = freshSlot();\n\t\t\tthis.slots.set(handle, state);\n\t\t}\n\t\treturn state;\n\t}\n\n\t// ─── Test seams ─────────────────────────────────────────────────────\n\n\t/** Seed the pose returned by {@link getPose} for a handle. */\n\tsetPose(handle: number, pose: StagePose): void {\n\t\tthis.slot(handle).pose = pose;\n\t}\n\n\t/** Seed the snapshot returned by {@link readSnapshot} for a handle. */\n\tsetSnapshot(handle: number, snapshot: StageBehaviorSnapshot | null): void {\n\t\tthis.slot(handle).snapshot = snapshot;\n\t}\n\n\t/** Seed {@link queryScreenWrap} results. */\n\tsetScreenWrapQuery(handle: number, value: { fsm: number; lastWrappedAxes: number } | null): void {\n\t\tthis.slot(handle).screenWrapQuery = value;\n\t}\n\n\t/** Seed {@link queryWorldBoundary} results. */\n\tsetWorldBoundaryQuery(\n\t\thandle: number,\n\t\tvalue: { hits: number; clamped: [number, number, number] } | null,\n\t): void {\n\t\tthis.slot(handle).worldBoundaryQuery = value;\n\t}\n\n\t/** Attachment options recorded for a handle, keyed by behavior name. */\n\tgetAttachment<T>(handle: number, kind: string): T | undefined {\n\t\treturn this.slots.get(handle)?.attachments.get(kind) as T | undefined;\n\t}\n\n\thasAttachment(handle: number, kind: string): boolean {\n\t\treturn this.slots.get(handle)?.attachments.has(kind) ?? false;\n\t}\n\n\t/** Every per-entity input call recorded for a handle, oldest first. */\n\tgetInputCalls(handle: number): Array<{ kind: string; args: unknown[] }> {\n\t\treturn this.slots.get(handle)?.inputs ?? [];\n\t}\n\n\t/** Last written slot-indexed input state for a handle. */\n\tgetBatchedInput(handle: number): MockSlotState['input'] {\n\t\treturn this.slot(handle).input;\n\t}\n\n\treset(): void {\n\t\tthis.slots.clear();\n\t}\n\n\t// ─── BehaviorRuntime contract ───────────────────────────────────────\n\n\tsetPosition(handle: number, x: number, y: number, z: number): boolean {\n\t\tconst pose = this.slot(handle).pose;\n\t\tpose.position[0] = x;\n\t\tpose.position[1] = y;\n\t\tpose.position[2] = z;\n\t\treturn true;\n\t}\n\n\tsetRotation(handle: number, x: number, y: number, z: number, w: number): boolean {\n\t\tconst pose = this.slot(handle).pose;\n\t\tpose.rotation[0] = x;\n\t\tpose.rotation[1] = y;\n\t\tpose.rotation[2] = z;\n\t\tpose.rotation[3] = w;\n\t\treturn true;\n\t}\n\n\tgetPose(handle: number, out?: StagePose): StagePose | null {\n\t\tconst state = this.slots.get(handle);\n\t\tif (!state) return null;\n\t\tconst result = out ?? { position: [0, 0, 0], rotation: [0, 0, 0, 1] } as StagePose;\n\t\tresult.position[0] = state.pose.position[0];\n\t\tresult.position[1] = state.pose.position[1];\n\t\tresult.position[2] = state.pose.position[2];\n\t\tresult.rotation[0] = state.pose.rotation[0];\n\t\tresult.rotation[1] = state.pose.rotation[1];\n\t\tresult.rotation[2] = state.pose.rotation[2];\n\t\tresult.rotation[3] = state.pose.rotation[3];\n\t\treturn result;\n\t}\n\n\twriteInputAxes(handle: number, axisA: number, axisB: number): boolean {\n\t\tconst input = this.slot(handle).input;\n\t\tinput.axisA = axisA;\n\t\tinput.axisB = axisB;\n\t\treturn true;\n\t}\n\n\twriteInputLook(handle: number, yawDelta: number, pitchDelta: number): boolean {\n\t\tconst input = this.slot(handle).input;\n\t\tinput.yawDelta = yawDelta;\n\t\tinput.pitchDelta = pitchDelta;\n\t\treturn true;\n\t}\n\n\twriteInputReserved(handle: number, reservedA: number, reservedB: number): boolean {\n\t\tconst input = this.slot(handle).input;\n\t\tinput.reservedA = reservedA;\n\t\tinput.reservedB = reservedB;\n\t\treturn true;\n\t}\n\n\twriteInputButton(handle: number, buttonMask: number, pressed: boolean): boolean {\n\t\tconst input = this.slot(handle).input;\n\t\tinput.buttons = pressed ? (input.buttons | buttonMask) : (input.buttons & ~buttonMask);\n\t\treturn true;\n\t}\n\n\treadSnapshot(handle: number, out?: StageBehaviorSnapshot): StageBehaviorSnapshot | null {\n\t\tconst snapshot = this.slots.get(handle)?.snapshot ?? null;\n\t\tif (!snapshot) return null;\n\t\tif (!out) return { ...snapshot };\n\t\tObject.assign(out, snapshot);\n\t\treturn out;\n\t}\n\n\tattachThruster(handle: number, opts: StageThrusterOptions): boolean {\n\t\tthis.slot(handle).attachments.set('thruster', opts);\n\t\treturn true;\n\t}\n\n\tsetThrusterInput(\n\t\thandle: number,\n\t\tthrust: number,\n\t\trotate: number,\n\t\tvectorX = 0,\n\t\tvectorY = 0,\n\t): void {\n\t\tthis.slot(handle).inputs.push({\n\t\t\tkind: 'thruster',\n\t\t\targs: [thrust, rotate, vectorX, vectorY],\n\t\t});\n\t}\n\n\tattachTopDown(handle: number, opts: StageTopDownOptions): boolean {\n\t\tthis.slot(handle).attachments.set('topDown', opts);\n\t\treturn true;\n\t}\n\n\tsetTopDownInput(handle: number, moveX: number, moveY: number): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'topDown', args: [moveX, moveY] });\n\t}\n\n\tattachShooter2D(handle: number, opts: StageShooter2DOptions): boolean {\n\t\tthis.slot(handle).attachments.set('shooter2d', opts);\n\t\treturn true;\n\t}\n\n\tattachScreenWrap(handle: number, opts: StageScreenWrapOptions): boolean {\n\t\tthis.slot(handle).attachments.set('screenWrap', opts);\n\t\treturn true;\n\t}\n\n\tqueryScreenWrap(handle: number): { fsm: number; lastWrappedAxes: number } | null {\n\t\treturn this.slots.get(handle)?.screenWrapQuery ?? null;\n\t}\n\n\tattachWorldBoundary(\n\t\thandle: number,\n\t\tdim: StageBoundaryDimValue,\n\t\topts: StageWorldBoundaryOptions,\n\t): boolean {\n\t\tthis.slot(handle).attachments.set('worldBoundary', { dim, ...opts });\n\t\treturn true;\n\t}\n\n\tqueryWorldBoundary(handle: number): { hits: number; clamped: [number, number, number] } | null {\n\t\treturn this.slots.get(handle)?.worldBoundaryQuery ?? null;\n\t}\n\n\tattachRicochet(handle: number, dim: StageRicochetDimValue, opts: StageRicochetOptions): boolean {\n\t\tthis.slot(handle).attachments.set('ricochet', { dim, ...opts });\n\t\treturn true;\n\t}\n\n\tattachPlatformer3D(handle: number, opts: StagePlatformer3DOptions): boolean {\n\t\tthis.slot(handle).attachments.set('platformer3d', opts);\n\t\treturn true;\n\t}\n\n\tsetPlatformer3DInputAxes(handle: number, moveX: number, moveZ: number): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'platformer3dAxes', args: [moveX, moveZ] });\n\t}\n\n\tsetPlatformer3DInputButtons(handle: number, jump: boolean, run: boolean): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'platformer3dButtons', args: [jump, run] });\n\t}\n\n\tattachPlatformer2D(handle: number, opts: StagePlatformer2DOptions): boolean {\n\t\tthis.slot(handle).attachments.set('platformer2d', opts);\n\t\treturn true;\n\t}\n\n\tsetPlatformer2DInputAxes(handle: number, moveX: number): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'platformer2dAxes', args: [moveX] });\n\t}\n\n\tsetPlatformer2DInputButtons(handle: number, jump: boolean, run: boolean): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'platformer2dButtons', args: [jump, run] });\n\t}\n\n\tattachFirstPerson(handle: number, opts: StageFirstPersonOptions): boolean {\n\t\tthis.slot(handle).attachments.set('firstPerson', opts);\n\t\treturn true;\n\t}\n\n\tsetFirstPersonInput(handle: number, input: StageFirstPersonInput): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'firstPerson', args: [input] });\n\t}\n\n\tattachJumper2D(handle: number, opts: StageJumper2DOptions): boolean {\n\t\tthis.slot(handle).attachments.set('jumper2d', opts);\n\t\treturn true;\n\t}\n\n\tsetJumper2DInput(handle: number, jumpPressed: boolean): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'jumper2d', args: [jumpPressed] });\n\t}\n\n\tattachJumper3D(handle: number, opts: StageJumper3DOptions): boolean {\n\t\tthis.slot(handle).attachments.set('jumper3d', opts);\n\t\treturn true;\n\t}\n\n\tsetJumper3DInput(handle: number, jumpPressed: boolean): void {\n\t\tthis.slot(handle).inputs.push({ kind: 'jumper3d', args: [jumpPressed] });\n\t}\n}\n","/**\n * `Simulation` (a.k.a. `BehaviorWorld`) — the primary public abstraction of\n * `@zylem/behaviors`. It owns the wasm runtime lifecycle (one\n * `WebAssembly.Instance` of `@zylem/runtime` per simulation), the fixed\n * timestep accumulator, an entity registry mapping opaque\n * {@link EntityHandle}s to runtime slots, and per-step event translation\n * from raw stage events into typed {@link SimulationEvent}s.\n *\n * Hosts (e.g. `@zylem/game-lib`) call {@link createSimulation} once per\n * stage, `spawn()`/`despawn()` entities, call `update(delta)` once per\n * render frame, and read poses for rendering from the returned\n * {@link SimulationFrame}.\n */\n\nimport {\n\tWasmStageRuntime,\n\tcreateWasmStageRuntime,\n\tStageBodyKind,\n\tStageEventType,\n\tSTAGE_RENDER_STRIDE,\n\treadStageRenderSlot,\n\ttype StageBehaviorSnapshot,\n\ttype StageBodyConfig,\n\ttype StageBodyKindValue,\n\ttype StageColliderConfig,\n\ttype StageColliderShape,\n\ttype StageDebugRender,\n\ttype StageBodyInfo,\n\ttype StageEvent,\n\ttype StagePose,\n\ttype StageRaycastHit,\n\ttype StageRenderSlot,\n\ttype WasmStageRuntimeOptions,\n} from './wasm-stage-runtime';\n\n/**\n * Opaque, stable identifier for a simulation entity. `slot` is the raw\n * runtime slot index — treat it as an implementation detail owned by the\n * Simulation (it is only exposed so hosts can wire behavior systems, which\n * address the slot-indexed buffers by slot).\n */\nexport interface EntityHandle {\n\t/** Monotonic public id, never reused within a Simulation. */\n\treadonly id: number;\n\t/** Raw runtime slot index. Internal — may be reused after despawn. */\n\treadonly slot: number;\n}\n\n/** Partial body description; unspecified fields use sensible defaults. */\nexport interface SimulationBodyDefinition {\n\tkind?: StageBodyKindValue;\n\tposition?: readonly [number, number, number];\n\trotation?: readonly [number, number, number, number];\n\tlinearDamping?: number;\n\tangularDamping?: number;\n\tgravityScale?: number;\n\tcanSleep?: boolean;\n\tccdEnabled?: boolean;\n\tlockRotation?: readonly [boolean, boolean, boolean];\n\tlockTranslation?: readonly [boolean, boolean, boolean];\n}\n\n/** Partial collider description; unspecified fields use sensible defaults. */\nexport interface SimulationColliderDefinition {\n\tshape: StageColliderShape;\n\toffset?: readonly [number, number, number];\n\tfriction?: number;\n\trestitution?: number;\n\tsensor?: boolean;\n\tcollisionGroups?: number;\n}\n\n/** Everything needed to materialize one entity inside the runtime. */\nexport interface EntityDefinition {\n\tbody?: SimulationBodyDefinition;\n\tcolliders?: SimulationColliderDefinition[];\n}\n\n/** Typed, handle-resolved simulation event. */\nexport type SimulationEvent =\n\t| {\n\t\ttype: 'collisionStarted' | 'collisionStopped';\n\t\ta: EntityHandle | null;\n\t\tb: EntityHandle | null;\n\t\t/** True when either collider in the pair is a sensor (zone overlap). */\n\t\tsensor: boolean;\n\t\t/** Best-effort contact normal (x, y); zero for sensor pairs / stops. */\n\t\tnormal: [number, number];\n\t}\n\t| { type: 'boundaryHit'; entity: EntityHandle | null; axes: number; signs: number }\n\t| { type: 'ricochet'; entity: EntityHandle | null; kind: number }\n\t| { type: 'regionEntered'; entity: EntityHandle | null; triggerId: number }\n\t| { type: 'jumpStarted'; entity: EntityHandle | null; jumpCount: number }\n\t| { type: 'landed'; entity: EntityHandle | null }\n\t| { type: 'wrapped'; entity: EntityHandle | null; axes: number }\n\t| { type: 'cooldownFired'; entity: EntityHandle | null; cooldownId: number };\n\n/**\n * Snapshot of one `update()` call: how many fixed steps ran, the live render\n * buffer view, the previous-step render copy + interpolation alpha for\n * smooth rendering, and the translated events from every step taken.\n */\nexport interface SimulationFrame {\n\t/** Wall-clock delta handed to `update()`. */\n\tdeltaTime: number;\n\t/** Number of fixed steps executed (0 when accumulating). */\n\tstepsTaken: number;\n\t/** Interpolation alpha in [0, 1): fraction of a fixed step accumulated. */\n\talpha: number;\n\t/** Live render buffer (post-step poses), {@link STAGE_RENDER_STRIDE} floats per slot. */\n\trender: Float32Array;\n\t/** Copy of the render buffer as of the step before the last one. */\n\tpreviousRender: Float32Array;\n\trenderStride: number;\n\t/** Typed events from all steps taken this update, oldest first. */\n\tevents: SimulationEvent[];\n}\n\nexport interface SimulationOptions extends WasmStageRuntimeOptions {\n\t/** Fixed physics timestep in seconds (default 1/60). */\n\tfixedTimestep?: number;\n\t/** Max fixed steps per `update()` to avoid death spirals (default 2). */\n\tmaxSubSteps?: number;\n\t/**\n\t * Rapier contact solver iterations (default 4; auto-drops to 2 when a\n\t * stage has 512+ dynamic bodies). Lower = faster, less stable stacks.\n\t */\n\tsolverIterations?: number;\n\t/**\n\t * Sleep activation overrides applied after create. Defaults match the\n\t * aggressive canSleep policy on newly attached bodies.\n\t */\n\tsleepLinearThreshold?: number;\n\tsleepAngularThreshold?: number;\n\ttimeUntilSleep?: number;\n}\n\nconst DEFAULT_FIXED_TIMESTEP = 1 / 60;\n// Hosts clamp frame delta to 1/30s, so more than 2 substeps of 1/60 per\n// frame is wasted work that amplifies slow steps into a death spiral.\nconst DEFAULT_MAX_SUB_STEPS = 2;\n\n/**\n * The behavior world. Construct via {@link createSimulation}.\n */\nexport class Simulation {\n\t/**\n\t * The low-level wasm adapter. Behavior systems receive this as their\n\t * `wasmStage` context so descriptors can attach/query behaviors by slot;\n\t * hosts should prefer the handle-based methods on the Simulation itself.\n\t */\n\treadonly adapter: WasmStageRuntime;\n\n\treadonly fixedTimestep: number;\n\tprivate readonly maxSubSteps: number;\n\n\tprivate accumulator = 0;\n\tprivate nextEntityId = 1;\n\tprivate slotToHandle = new Map<number, EntityHandle>();\n\tprivate idToHandle = new Map<number, EntityHandle>();\n\tprivate previousRender: Float32Array = new Float32Array(0);\n\tprivate disposed = false;\n\tprivate eventsEnabled = true;\n\n\tconstructor(adapter: WasmStageRuntime, options: SimulationOptions = {}) {\n\t\tthis.adapter = adapter;\n\t\tthis.fixedTimestep = options.fixedTimestep ?? DEFAULT_FIXED_TIMESTEP;\n\t\tthis.maxSubSteps = Math.max(1, options.maxSubSteps ?? DEFAULT_MAX_SUB_STEPS);\n\t\tif (options.solverIterations !== undefined) {\n\t\t\tthis.adapter.setSolverIterations(options.solverIterations);\n\t\t}\n\t\tif (\n\t\t\toptions.sleepLinearThreshold !== undefined ||\n\t\t\toptions.sleepAngularThreshold !== undefined ||\n\t\t\toptions.timeUntilSleep !== undefined\n\t\t) {\n\t\t\tthis.adapter.setSleepThresholds(\n\t\t\t\toptions.sleepLinearThreshold ?? 0.8,\n\t\t\t\toptions.sleepAngularThreshold ?? 1.0,\n\t\t\t\toptions.timeUntilSleep ?? 0.5,\n\t\t\t);\n\t\t}\n\t}\n\n\t// ─── Entity lifecycle ───────────────────────────────────────────────\n\n\t/**\n\t * Create a runtime entity from a plain definition. Returns `null` when\n\t * the runtime rejects the allocation.\n\t */\n\tspawn(definition: EntityDefinition = {}): EntityHandle | null {\n\t\tconst slot = this.adapter.createEntity();\n\t\tif (slot === 0xffffffff) return null;\n\n\t\tconst body = definition.body;\n\t\tconst bodyConfig: StageBodyConfig = {\n\t\t\tkind: body?.kind ?? StageBodyKind.Dynamic,\n\t\t\tposition: body?.position ?? [0, 0, 0],\n\t\t\trotation: body?.rotation ?? [0, 0, 0, 1],\n\t\t\tlinearDamping: body?.linearDamping ?? 0,\n\t\t\tangularDamping: body?.angularDamping ?? 0,\n\t\t\tgravityScale: body?.gravityScale ?? 1,\n\t\t\tcanSleep: body?.canSleep ?? false,\n\t\t\tccdEnabled: body?.ccdEnabled ?? true,\n\t\t\tlockRotation: body?.lockRotation ?? [false, false, false],\n\t\t\tlockTranslation: body?.lockTranslation ?? [false, false, false],\n\t\t};\n\t\tthis.adapter.attachBody(slot, bodyConfig);\n\n\t\tfor (const collider of definition.colliders ?? []) {\n\t\t\tconst config: StageColliderConfig = {\n\t\t\t\tshape: collider.shape,\n\t\t\t\toffset: collider.offset ?? [0, 0, 0],\n\t\t\t\tfriction: collider.friction ?? 0.5,\n\t\t\t\trestitution: collider.restitution ?? 0,\n\t\t\t\tsensor: collider.sensor ?? false,\n\t\t\t\tcollisionGroups: collider.collisionGroups ?? 0xffffffff,\n\t\t\t};\n\t\t\tthis.adapter.addCollider(slot, config);\n\t\t}\n\n\t\tconst handle: EntityHandle = { id: this.nextEntityId++, slot };\n\t\tthis.slotToHandle.set(slot, handle);\n\t\tthis.idToHandle.set(handle.id, handle);\n\t\treturn handle;\n\t}\n\n\tdespawn(handle: EntityHandle): boolean {\n\t\tconst registered = this.idToHandle.get(handle.id);\n\t\tif (!registered) return false;\n\t\tthis.idToHandle.delete(handle.id);\n\t\tif (this.slotToHandle.get(registered.slot) === registered) {\n\t\t\tthis.slotToHandle.delete(registered.slot);\n\t\t}\n\t\treturn this.adapter.destroyEntity(registered.slot);\n\t}\n\n\t/** Resolve a raw runtime slot back to its public handle, if alive. */\n\thandleForSlot(slot: number): EntityHandle | null {\n\t\treturn this.slotToHandle.get(slot) ?? null;\n\t}\n\n\t/**\n\t * Toggle collision-event collection. When disabled the wasm stage skips\n\t * per-step contact-pair hashing and `update()` skips event draining /\n\t * translation entirely (`frame.events` stays empty). Re-enabling emits\n\t * `collisionStarted` for every currently overlapping pair on the next\n\t * step, so late listeners observe current state.\n\t */\n\tsetEventsEnabled(enabled: boolean): void {\n\t\tif (this.eventsEnabled === enabled) return;\n\t\tthis.eventsEnabled = enabled;\n\t\tthis.adapter.setEventsEnabled(enabled);\n\t}\n\n\tget areEventsEnabled(): boolean {\n\t\treturn this.eventsEnabled;\n\t}\n\n\tget entityCount(): number {\n\t\treturn this.idToHandle.size;\n\t}\n\n\t// ─── Per-frame update ───────────────────────────────────────────────\n\n\t/**\n\t * Advance the simulation by `deltaTime` seconds using a fixed-timestep\n\t * accumulator. Runs zero or more fixed steps and returns a\n\t * {@link SimulationFrame} with translated events and interpolation data.\n\t */\n\tupdate(deltaTime: number): SimulationFrame {\n\t\tconst events: SimulationEvent[] = [];\n\t\tthis.accumulator += Math.max(0, deltaTime);\n\t\tlet steps = 0;\n\n\t\twhile (this.accumulator >= this.fixedTimestep && steps < this.maxSubSteps) {\n\t\t\tthis.capturePreviousRender();\n\t\t\tthis.adapter.step(this.fixedTimestep);\n\t\t\tif (this.eventsEnabled) {\n\t\t\t\tthis.translateEvents(this.adapter.drainEvents(), events);\n\t\t\t}\n\t\t\tthis.accumulator -= this.fixedTimestep;\n\t\t\tsteps++;\n\t\t}\n\t\t// Drop leftover time we couldn't consume (death-spiral guard).\n\t\tif (steps === this.maxSubSteps && this.accumulator >= this.fixedTimestep) {\n\t\t\tthis.accumulator = this.accumulator % this.fixedTimestep;\n\t\t}\n\n\t\treturn {\n\t\t\tdeltaTime,\n\t\t\tstepsTaken: steps,\n\t\t\talpha: this.fixedTimestep > 0 ? this.accumulator / this.fixedTimestep : 0,\n\t\t\trender: this.adapter.render,\n\t\t\tpreviousRender: this.previousRender,\n\t\t\trenderStride: STAGE_RENDER_STRIDE,\n\t\t\tevents,\n\t\t};\n\t}\n\n\tprivate capturePreviousRender(): void {\n\t\tthis.adapter.refreshViews();\n\t\tconst current = this.adapter.render;\n\t\tif (this.previousRender.length !== current.length) {\n\t\t\tthis.previousRender = new Float32Array(current.length);\n\t\t}\n\t\tthis.previousRender.set(current);\n\t}\n\n\tprivate translateEvents(raw: StageEvent[], out: SimulationEvent[]): void {\n\t\tfor (const event of raw) {\n\t\t\tconst primary = event.primarySlot !== null ? this.handleForSlot(event.primarySlot) : null;\n\t\t\tconst secondary = event.secondarySlot !== null ? this.handleForSlot(event.secondarySlot) : null;\n\t\t\tswitch (event.type) {\n\t\t\t\tcase StageEventType.CollisionStarted:\n\t\t\t\tcase StageEventType.CollisionStopped:\n\t\t\t\t\tout.push({\n\t\t\t\t\t\ttype: event.type === StageEventType.CollisionStarted\n\t\t\t\t\t\t\t? 'collisionStarted'\n\t\t\t\t\t\t\t: 'collisionStopped',\n\t\t\t\t\t\ta: primary,\n\t\t\t\t\t\tb: secondary,\n\t\t\t\t\t\tsensor: event.payload[0] !== 0,\n\t\t\t\t\t\tnormal: [event.payload[1], event.payload[2]],\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.BoundaryHit:\n\t\t\t\t\tout.push({\n\t\t\t\t\t\ttype: 'boundaryHit',\n\t\t\t\t\t\tentity: primary,\n\t\t\t\t\t\taxes: event.payload[0] | 0,\n\t\t\t\t\t\tsigns: event.payload[1] | 0,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.Ricochet:\n\t\t\t\t\tout.push({ type: 'ricochet', entity: primary, kind: event.payload[0] | 0 });\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.RegionEntered:\n\t\t\t\t\tout.push({ type: 'regionEntered', entity: primary, triggerId: event.payload[0] | 0 });\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.JumpStarted:\n\t\t\t\t\tout.push({ type: 'jumpStarted', entity: primary, jumpCount: event.payload[0] | 0 });\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.Landed:\n\t\t\t\t\tout.push({ type: 'landed', entity: primary });\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.Wrapped:\n\t\t\t\t\tout.push({ type: 'wrapped', entity: primary, axes: event.payload[0] | 0 });\n\t\t\t\t\tbreak;\n\t\t\t\tcase StageEventType.CooldownFired:\n\t\t\t\t\tout.push({ type: 'cooldownFired', entity: primary, cooldownId: event.payload[0] | 0 });\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// ─── Handle-based reads / writes ────────────────────────────────────\n\n\tgetPose(handle: EntityHandle, out?: StagePose): StagePose | null {\n\t\treturn this.adapter.getPose(handle.slot, out);\n\t}\n\n\tsetPosition(handle: EntityHandle, x: number, y: number, z: number): boolean {\n\t\treturn this.adapter.setPosition(handle.slot, x, y, z);\n\t}\n\n\tsetRotation(handle: EntityHandle, x: number, y: number, z: number, w: number): boolean {\n\t\treturn this.adapter.setRotation(handle.slot, x, y, z, w);\n\t}\n\n\tsetLinearVelocity(handle: EntityHandle, x: number, y: number, z: number): boolean {\n\t\treturn this.adapter.setLinearVelocity(handle.slot, x, y, z);\n\t}\n\n\tgetLinearVelocity(handle: EntityHandle): [number, number, number] | null {\n\t\treturn this.adapter.getLinearVelocity(handle.slot);\n\t}\n\n\tsetAngularVelocity(handle: EntityHandle, x: number, y: number, z: number): boolean {\n\t\treturn this.adapter.setAngularVelocity(handle.slot, x, y, z);\n\t}\n\n\tapplyImpulse(handle: EntityHandle, x: number, y: number, z: number): boolean {\n\t\treturn this.adapter.applyImpulse(handle.slot, x, y, z);\n\t}\n\n\treadRenderSlot(handle: EntityHandle, out?: StageRenderSlot): StageRenderSlot | null {\n\t\treturn readStageRenderSlot(this.adapter.render, handle.slot, out);\n\t}\n\n\t/** Decode a handle's pose from the previous-step render copy. */\n\treadPreviousRenderSlot(handle: EntityHandle, out?: StageRenderSlot): StageRenderSlot | null {\n\t\treturn readStageRenderSlot(this.previousRender, handle.slot, out);\n\t}\n\n\treadSnapshot(handle: EntityHandle, out?: StageBehaviorSnapshot): StageBehaviorSnapshot | null {\n\t\treturn this.adapter.readSnapshot(handle.slot, out);\n\t}\n\n\t// ─── World-level controls / diagnostics ─────────────────────────────\n\n\tsetGravity(x: number, y: number, z: number): void {\n\t\tthis.adapter.setGravity(x, y, z);\n\t}\n\n\tsetSolverIterations(iterations: number): void {\n\t\tthis.adapter.setSolverIterations(iterations);\n\t}\n\n\tsetSleepThresholds(\n\t\tnormalizedLinearThreshold: number,\n\t\tangularThreshold: number,\n\t\ttimeUntilSleep: number,\n\t): void {\n\t\tthis.adapter.setSleepThresholds(\n\t\t\tnormalizedLinearThreshold,\n\t\t\tangularThreshold,\n\t\t\ttimeUntilSleep,\n\t\t);\n\t}\n\n\tawakeDynamicCount(): number {\n\t\treturn this.adapter.awakeDynamicCount();\n\t}\n\n\t/** Physics raycast; the hit's slot is resolved to an entity handle. */\n\tcastRay(\n\t\torigin: readonly [number, number, number],\n\t\tdir: readonly [number, number, number],\n\t\tmaxDistance: number,\n\t\tsolidOnly = true,\n\t): (Omit<StageRaycastHit, 'slot'> & { entity: EntityHandle | null }) | null {\n\t\tconst hit = this.adapter.castRay(origin, dir, maxDistance, solidOnly);\n\t\tif (!hit) return null;\n\t\treturn {\n\t\t\tdistance: hit.distance,\n\t\t\tnormal: hit.normal,\n\t\t\tentity: this.handleForSlot(hit.slot),\n\t\t};\n\t}\n\n\tgetBodyInfo(handle: EntityHandle): StageBodyInfo | null {\n\t\treturn this.adapter.getBodyInfo(handle.slot);\n\t}\n\n\tgetDebugRender(): StageDebugRender | null {\n\t\treturn this.adapter.getDebugRender();\n\t}\n\n\tget isDisposed(): boolean {\n\t\treturn this.disposed;\n\t}\n\n\t/** Destroy the wasm stage. The Simulation must not be used afterwards. */\n\tdispose(): void {\n\t\tif (this.disposed) return;\n\t\tthis.disposed = true;\n\t\tthis.slotToHandle.clear();\n\t\tthis.idToHandle.clear();\n\t\tthis.adapter.dispose();\n\t}\n}\n\n/** Alias matching the architecture doc's naming. */\nexport type BehaviorWorld = Simulation;\n\n/**\n * Load and instantiate the `@zylem/runtime` wasm module and wrap it in a\n * {@link Simulation}. One call per logical stage/world.\n */\nexport async function createSimulation(options: SimulationOptions = {}): Promise<Simulation> {\n\tconst adapter = await createWasmStageRuntime(options);\n\treturn new Simulation(adapter, options);\n}\n","import type {\n\tBehaviorDescriptor,\n\tBehaviorHandle,\n\tBehaviorRef,\n} from '../behaviors/behavior-descriptor';\nimport type { TransformState } from '../capabilities/transform-store';\n\n/**\n * Minimal, runtime-agnostic entity options contract.\n *\n * The full engine entity (in `@zylem/game-lib`) provides a richer options type,\n * but behaviors only rely on this loose shape.\n */\nexport interface GameEntityOptions {\n\t[key: string]: any;\n\tname?: string;\n}\n\n/**\n * Structural stand-in for the engine `GameEntity`.\n *\n * Behaviors annotate against this loose contract so that `@zylem/behaviors`\n * (and its `@zylem/behaviors/core` surface) never has to depend on the concrete\n * `@zylem/game-lib` entity implementation. The real engine entity is\n * structurally assignable to this type.\n */\nexport class GameEntity<TOptions = unknown> {\n\t[key: string]: any;\n\n\tuuid!: string;\n\tname!: string;\n\ttype!: string;\n\toptions?: TOptions & Record<string, unknown>;\n\tgroup: any = null;\n\tmesh?: any;\n\tmaterials?: any[];\n\t/** Opaque host-owned physics references (never inspected by behaviors). */\n\tbody: unknown | null = null;\n\tcollider: unknown | null = null;\n\tcolliderDesc?: any;\n\tcolliderDescs: any[] = [];\n\tbodyDesc?: any;\n\tphysicsAttached = false;\n\truntimeHandle?: number;\n\ttransformStore?: TransformState;\n\tnodeDestroy?: any;\n\tisInstanced?: boolean;\n\n\tprivate __behaviorRefs: BehaviorRef<any>[] = [];\n\n\tcreate(): this {\n\t\treturn this;\n\t}\n\n\tonCleanup(callback: () => void): this {\n\t\tvoid callback;\n\t\treturn this;\n\t}\n\n\tsetPosition(_x: number, _y: number, _z: number): void {}\n\tsetRotation(_x: number, _y: number, _z: number): void {}\n\tsetRotationZ(_z: number): void {}\n\tsetScale(_x: number, _y: number, _z: number): void {}\n\n\t/**\n\t * Attach a behavior to this entity. The real engine entity does substantially\n\t * more, but this functional stub stores the merged ref and builds the handle\n\t * so descriptor/handle logic (and tests that drive behaviors directly) work\n\t * without the full engine.\n\t */\n\tuse<\n\t\tO extends Record<string, any>,\n\t\tH extends Record<string, any> = Record<string, never>,\n\t>(\n\t\tdescriptor: BehaviorDescriptor<O, H>,\n\t\toptions?: Partial<O>,\n\t): BehaviorHandle<O, H> {\n\t\tconst mergedOptions = {\n\t\t\t...(descriptor.defaultOptions as O),\n\t\t\t...(options ?? {}),\n\t\t} as O;\n\t\tconst ref: BehaviorRef<O> = { descriptor, options: mergedOptions };\n\t\tthis.__behaviorRefs.push(ref as BehaviorRef<any>);\n\n\t\tconst baseHandle = {\n\t\t\tgetFSM: () => ref.fsm ?? null,\n\t\t\tgetOptions: () => ref.options,\n\t\t\tref,\n\t\t};\n\t\tconst extra = descriptor.createHandle\n\t\t\t? descriptor.createHandle(ref)\n\t\t\t: ({} as H);\n\t\treturn { ...baseHandle, ...extra } as BehaviorHandle<O, H>;\n\t}\n\n\t/** Live behavior refs attached via {@link use}. */\n\tgetBehaviorRefs(): BehaviorRef<any>[] {\n\t\treturn this.__behaviorRefs;\n\t}\n}\n\n/**\n * Factory contract injected into behavior systems via\n * {@link BehaviorSystemContext.createEntity}. The host engine supplies the real\n * entity factory at stage-construction time.\n */\nexport type CreateEntityFn = (\n\toptions?: Partial<GameEntityOptions>,\n) => GameEntity<GameEntityOptions>;\n"],"mappings":"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","names":["moveX","moveY","moveZ"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/lib/behaviors/runtime-2d/runtime-2d.descriptor.ts"],"sourcesContent":["/**\n * Runtime 2D Behavior Descriptors\n *\n * Marker descriptors for entities managed entirely by the wasm gameplay-2d\n * runtime (paddle-and-ball style games, boundaries, trigger regions, goal\n * zones). The descriptors carry configuration and event wiring only — all\n * per-frame simulation happens inside the wasm runtime, so their systems are\n * no-ops. The host runtime binds concrete callbacks onto the behavior refs\n * (see {@link bindRuntimeDynamicCircleBody2DHandle} and the emit helpers).\n */\n\nimport {\n\tdefineBehavior,\n\ttype BehaviorRef,\n} from '../behavior-descriptor';\nimport type { BehaviorSystem } from '../behavior-system';\n\nexport interface RuntimeDynamicCircleBody2DOptions {\n\tinitialVelocity: readonly [number, number];\n}\n\nexport interface RuntimeDynamicCircleBody2DHandle {\n\tsetRuntimePosition(x: number, y: number, z?: number): void;\n\tsetRuntimeVelocity(x: number, y: number): void;\n\tgetRuntimePosition(): { x: number; y: number; z: number } | null;\n}\n\nexport interface RuntimePlayerInput2DOptions {\n\tplayer: 'p1' | 'p2';\n\tspeed: number;\n}\n\nexport interface RuntimeBoundary2DOptions {\n\tboundaries: {\n\t\tleft: number;\n\t\tright: number;\n\t\tbottom: number;\n\t\ttop: number;\n\t};\n}\n\nexport interface RuntimeRicochet2DOptions {\n\tminSpeed: number;\n\tmaxSpeed: number;\n\tspeedMultiplier: number;\n\treflectionMode: 'simple' | 'angled';\n\tmaxAngleDeg: number;\n}\n\nexport interface RuntimeRicochet2DEvent {\n\tkind: 'wall' | 'paddle';\n}\n\nexport interface RuntimeRicochet2DHandle {\n\tonRicochet(callback: (event: RuntimeRicochet2DEvent) => void): () => void;\n}\n\n/** Registers a gameplay2d trigger AABB (sensor); wasm reports overlap via {@link emitRuntimeTriggerRegionEnter}. */\nexport interface RuntimeTriggerRegion2DOptions {\n\ttriggerId: number;\n\thalfExtents: readonly [number, number];\n}\n\nexport interface RuntimeTriggerRegion2DEvent {\n\ttriggerId: number;\n}\n\nexport interface RuntimeTriggerRegion2DHandle {\n\tonRegionEnter(callback: (event: RuntimeTriggerRegion2DEvent) => void): () => void;\n}\n\nexport interface RuntimeGoalZone2DOptions {\n\tscorer: 'p1' | 'p2';\n}\n\nexport interface RuntimeGoalZone2DEvent {\n\tscorer: 'p1' | 'p2';\n}\n\nexport interface RuntimeGoalZone2DHandle {\n\tonGoal(callback: (event: RuntimeGoalZone2DEvent) => void): () => void;\n}\n\nconst runtimeNoopSystemFactory = (): BehaviorSystem => ({\n\tupdate(_ecs: unknown, _delta: number) {},\n});\n\nexport const RUNTIME_DYNAMIC_CIRCLE_BODY_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:runtime-dynamic-circle-body-2d');\nexport const RUNTIME_PLAYER_INPUT_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:runtime-player-input-2d');\nexport const RUNTIME_BOUNDARY_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:runtime-boundary-2d');\nexport const RUNTIME_RICOCHET_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:runtime-ricochet-2d');\nexport const RUNTIME_TRIGGER_REGION_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:runtime-trigger-region-2d');\nexport const RUNTIME_GOAL_ZONE_2D_BEHAVIOR_KEY = Symbol.for('zylem:behavior:runtime-goal-zone-2d');\n\nconst RICOCHET_LISTENERS = Symbol('runtime-ricochet-listeners');\nconst TRIGGER_REGION_LISTENERS = Symbol('runtime-trigger-region-listeners');\nconst GOAL_LISTENERS = Symbol('runtime-goal-listeners');\nconst CIRCLE_BODY_SET_POSITION = Symbol('runtime-circle-body-set-position');\nconst CIRCLE_BODY_SET_VELOCITY = Symbol('runtime-circle-body-set-velocity');\nconst CIRCLE_BODY_GET_POSITION = Symbol('runtime-circle-body-get-position');\n\nfunction getListeners<E>(ref: BehaviorRef<any>, slot: symbol): Array<(event: E) => void> {\n\tlet listeners = (ref as any)[slot] as Array<(event: E) => void> | undefined;\n\tif (!listeners) {\n\t\tlisteners = [];\n\t\t(ref as any)[slot] = listeners;\n\t}\n\treturn listeners;\n}\n\nfunction addListener<E>(ref: BehaviorRef<any>, slot: symbol, callback: (event: E) => void): () => void {\n\tconst listeners = getListeners<E>(ref, slot);\n\tlisteners.push(callback);\n\treturn () => {\n\t\tconst index = listeners.indexOf(callback);\n\t\tif (index >= 0) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\t};\n}\n\nfunction emit<E>(ref: BehaviorRef<any>, slot: symbol, event: E): void {\n\tconst listeners = (ref as any)[slot] as Array<(event: E) => void> | undefined;\n\tif (!listeners) return;\n\tfor (const listener of listeners) {\n\t\tlistener(event);\n\t}\n}\n\nexport const RuntimeDynamicCircleBody2DBehavior = defineBehavior<\n\tRuntimeDynamicCircleBody2DOptions,\n\tRuntimeDynamicCircleBody2DHandle\n>({\n\tname: 'runtime-dynamic-circle-body-2d',\n\tdefaultOptions: {\n\t\tinitialVelocity: [0, 0] as [number, number],\n\t},\n\tsystemFactory: runtimeNoopSystemFactory,\n\tcreateHandle: (ref: BehaviorRef<RuntimeDynamicCircleBody2DOptions>) => ({\n\t\tsetRuntimePosition(x: number, y: number, z: number = 0): void {\n\t\t\tconst callback = (ref as any)[CIRCLE_BODY_SET_POSITION] as\n\t\t\t\t| ((x: number, y: number, z: number) => void)\n\t\t\t\t| undefined;\n\t\t\tcallback?.(x, y, z);\n\t\t},\n\t\tsetRuntimeVelocity(x: number, y: number): void {\n\t\t\tconst callback = (ref as any)[CIRCLE_BODY_SET_VELOCITY] as\n\t\t\t\t| ((x: number, y: number) => void)\n\t\t\t\t| undefined;\n\t\t\tcallback?.(x, y);\n\t\t},\n\t\tgetRuntimePosition(): { x: number; y: number; z: number } | null {\n\t\t\tconst callback = (ref as any)[CIRCLE_BODY_GET_POSITION] as\n\t\t\t\t| (() => { x: number; y: number; z: number } | null)\n\t\t\t\t| undefined;\n\t\t\treturn callback?.() ?? null;\n\t\t},\n\t}),\n});\n\nexport const RuntimePlayerInput2DBehavior = defineBehavior<RuntimePlayerInput2DOptions>({\n\tname: 'runtime-player-input-2d',\n\tdefaultOptions: {\n\t\tplayer: 'p1',\n\t\tspeed: 5,\n\t} as RuntimePlayerInput2DOptions,\n\tsystemFactory: runtimeNoopSystemFactory,\n});\n\nexport const RuntimeBoundary2DBehavior = defineBehavior({\n\tname: 'runtime-boundary-2d',\n\tdefaultOptions: {\n\t\tboundaries: {\n\t\t\tleft: 0,\n\t\t\tright: 0,\n\t\t\tbottom: 0,\n\t\t\ttop: 0,\n\t\t},\n\t},\n\tsystemFactory: runtimeNoopSystemFactory,\n});\n\nexport const RuntimeRicochet2DBehavior = defineBehavior<\n\tRuntimeRicochet2DOptions,\n\tRuntimeRicochet2DHandle\n>({\n\tname: 'runtime-ricochet-2d',\n\tdefaultOptions: {\n\t\tminSpeed: 2,\n\t\tmaxSpeed: 20,\n\t\tspeedMultiplier: 1.05,\n\t\treflectionMode: 'angled' as const,\n\t\tmaxAngleDeg: 60,\n\t},\n\tsystemFactory: runtimeNoopSystemFactory,\n\tcreateHandle: (ref: BehaviorRef<RuntimeRicochet2DOptions>) => ({\n\t\tonRicochet: (callback: (event: RuntimeRicochet2DEvent) => void) =>\n\t\t\taddListener(ref, RICOCHET_LISTENERS, callback),\n\t}),\n});\n\nexport const RuntimeTriggerRegion2DBehavior = defineBehavior<\n\tRuntimeTriggerRegion2DOptions,\n\tRuntimeTriggerRegion2DHandle\n>({\n\tname: 'runtime-trigger-region-2d',\n\tdefaultOptions: {\n\t\ttriggerId: 0,\n\t\thalfExtents: [0.5, 2.5] as [number, number],\n\t},\n\tsystemFactory: runtimeNoopSystemFactory,\n\tcreateHandle: (ref: BehaviorRef<RuntimeTriggerRegion2DOptions>) => ({\n\t\tonRegionEnter: (callback: (event: RuntimeTriggerRegion2DEvent) => void) =>\n\t\t\taddListener(ref, TRIGGER_REGION_LISTENERS, callback),\n\t}),\n});\n\nexport const RuntimeGoalZone2DBehavior = defineBehavior<\n\tRuntimeGoalZone2DOptions,\n\tRuntimeGoalZone2DHandle\n>({\n\tname: 'runtime-goal-zone-2d',\n\tdefaultOptions: {\n\t\tscorer: 'p1',\n\t} as RuntimeGoalZone2DOptions,\n\tsystemFactory: runtimeNoopSystemFactory,\n\tcreateHandle: (ref: BehaviorRef<RuntimeGoalZone2DOptions>) => ({\n\t\tonGoal: (callback: (event: RuntimeGoalZone2DEvent) => void) =>\n\t\t\taddListener(ref, GOAL_LISTENERS, callback),\n\t}),\n});\n\nexport function emitRuntimeRicochet(\n\tref: BehaviorRef<RuntimeRicochet2DOptions>,\n\tevent: RuntimeRicochet2DEvent,\n): void {\n\temit(ref, RICOCHET_LISTENERS, event);\n}\n\nexport function emitRuntimeTriggerRegionEnter(\n\tref: BehaviorRef<RuntimeTriggerRegion2DOptions>,\n\tevent: RuntimeTriggerRegion2DEvent,\n): void {\n\temit(ref, TRIGGER_REGION_LISTENERS, event);\n}\n\nexport function emitRuntimeGoal(\n\tref: BehaviorRef<RuntimeGoalZone2DOptions>,\n\tevent: RuntimeGoalZone2DEvent,\n): void {\n\temit(ref, GOAL_LISTENERS, event);\n}\n\nexport function bindRuntimeDynamicCircleBody2DHandle(\n\tref: BehaviorRef<RuntimeDynamicCircleBody2DOptions>,\n\tcontrols: {\n\t\tsetPosition: (x: number, y: number, z: number) => void;\n\t\tsetVelocity: (x: number, y: number) => void;\n\t\tgetPosition: () => { x: number; y: number; z: number } | null;\n\t},\n): void {\n\t(ref as any)[CIRCLE_BODY_SET_POSITION] = controls.setPosition;\n\t(ref as any)[CIRCLE_BODY_SET_VELOCITY] = controls.setVelocity;\n\t(ref as any)[CIRCLE_BODY_GET_POSITION] = controls.getPosition;\n}\n"],"mappings":";;;;;;AAmFA,IAAM,2BAA2B,OAAuB;AAAA,EACvD,OAAO,MAAe,QAAgB;AAAA,EAAC;AACxC;AAEO,IAAM,8CAA8C,uBAAO,IAAI,+CAA+C;AAC9G,IAAM,uCAAuC,uBAAO,IAAI,wCAAwC;AAChG,IAAM,mCAAmC,uBAAO,IAAI,oCAAoC;AACxF,IAAM,mCAAmC,uBAAO,IAAI,oCAAoC;AACxF,IAAM,yCAAyC,uBAAO,IAAI,0CAA0C;AACpG,IAAM,oCAAoC,uBAAO,IAAI,qCAAqC;AAEjG,IAAM,qBAAqB,uBAAO,4BAA4B;AAC9D,IAAM,2BAA2B,uBAAO,kCAAkC;AAC1E,IAAM,iBAAiB,uBAAO,wBAAwB;AACtD,IAAM,2BAA2B,uBAAO,kCAAkC;AAC1E,IAAM,2BAA2B,uBAAO,kCAAkC;AAC1E,IAAM,2BAA2B,uBAAO,kCAAkC;AAE1E,SAAS,aAAgB,KAAuB,MAAyC;AACxF,MAAI,YAAa,IAAY,IAAI;AACjC,MAAI,CAAC,WAAW;AACf,gBAAY,CAAC;AACb,IAAC,IAAY,IAAI,IAAI;AAAA,EACtB;AACA,SAAO;AACR;AAEA,SAAS,YAAe,KAAuB,MAAc,UAA0C;AACtG,QAAM,YAAY,aAAgB,KAAK,IAAI;AAC3C,YAAU,KAAK,QAAQ;AACvB,SAAO,MAAM;AACZ,UAAM,QAAQ,UAAU,QAAQ,QAAQ;AACxC,QAAI,SAAS,GAAG;AACf,gBAAU,OAAO,OAAO,CAAC;AAAA,IAC1B;AAAA,EACD;AACD;AAEA,SAAS,KAAQ,KAAuB,MAAc,OAAgB;AACrE,QAAM,YAAa,IAAY,IAAI;AACnC,MAAI,CAAC,UAAW;AAChB,aAAW,YAAY,WAAW;AACjC,aAAS,KAAK;AAAA,EACf;AACD;AAEO,IAAM,qCAAqC,eAGhD;AAAA,EACD,MAAM;AAAA,EACN,gBAAgB;AAAA,IACf,iBAAiB,CAAC,GAAG,CAAC;AAAA,EACvB;AAAA,EACA,eAAe;AAAA,EACf,cAAc,CAAC,SAAyD;AAAA,IACvE,mBAAmB,GAAW,GAAW,IAAY,GAAS;AAC7D,YAAM,WAAY,IAAY,wBAAwB;AAGtD,iBAAW,GAAG,GAAG,CAAC;AAAA,IACnB;AAAA,IACA,mBAAmB,GAAW,GAAiB;AAC9C,YAAM,WAAY,IAAY,wBAAwB;AAGtD,iBAAW,GAAG,CAAC;AAAA,IAChB;AAAA,IACA,qBAAiE;AAChE,YAAM,WAAY,IAAY,wBAAwB;AAGtD,aAAO,WAAW,KAAK;AAAA,IACxB;AAAA,EACD;AACD,CAAC;AAEM,IAAM,+BAA+B,eAA4C;AAAA,EACvF,MAAM;AAAA,EACN,gBAAgB;AAAA,IACf,QAAQ;AAAA,IACR,OAAO;AAAA,EACR;AAAA,EACA,eAAe;AAChB,CAAC;AAEM,IAAM,4BAA4B,eAAe;AAAA,EACvD,MAAM;AAAA,EACN,gBAAgB;AAAA,IACf,YAAY;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,IACN;AAAA,EACD;AAAA,EACA,eAAe;AAChB,CAAC;AAEM,IAAM,4BAA4B,eAGvC;AAAA,EACD,MAAM;AAAA,EACN,gBAAgB;AAAA,IACf,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,aAAa;AAAA,EACd;AAAA,EACA,eAAe;AAAA,EACf,cAAc,CAAC,SAAgD;AAAA,IAC9D,YAAY,CAAC,aACZ,YAAY,KAAK,oBAAoB,QAAQ;AAAA,EAC/C;AACD,CAAC;AAEM,IAAM,iCAAiC,eAG5C;AAAA,EACD,MAAM;AAAA,EACN,gBAAgB;AAAA,IACf,WAAW;AAAA,IACX,aAAa,CAAC,KAAK,GAAG;AAAA,EACvB;AAAA,EACA,eAAe;AAAA,EACf,cAAc,CAAC,SAAqD;AAAA,IACnE,eAAe,CAAC,aACf,YAAY,KAAK,0BAA0B,QAAQ;AAAA,EACrD;AACD,CAAC;AAEM,IAAM,4BAA4B,eAGvC;AAAA,EACD,MAAM;AAAA,EACN,gBAAgB;AAAA,IACf,QAAQ;AAAA,EACT;AAAA,EACA,eAAe;AAAA,EACf,cAAc,CAAC,SAAgD;AAAA,IAC9D,QAAQ,CAAC,aACR,YAAY,KAAK,gBAAgB,QAAQ;AAAA,EAC3C;AACD,CAAC;AAEM,SAAS,oBACf,KACA,OACO;AACP,OAAK,KAAK,oBAAoB,KAAK;AACpC;AAEO,SAAS,8BACf,KACA,OACO;AACP,OAAK,KAAK,0BAA0B,KAAK;AAC1C;AAEO,SAAS,gBACf,KACA,OACO;AACP,OAAK,KAAK,gBAAgB,KAAK;AAChC;AAEO,SAAS,qCACf,KACA,UAKO;AACP,EAAC,IAAY,wBAAwB,IAAI,SAAS;AAClD,EAAC,IAAY,wBAAwB,IAAI,SAAS;AAClD,EAAC,IAAY,wBAAwB,IAAI,SAAS;AACnD;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}