@sadhaka/loom-engine 0.10.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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +344 -0
  3. package/dist/animation/animation-clip.d.ts +12 -0
  4. package/dist/animation/animation-clip.d.ts.map +1 -0
  5. package/dist/animation/animation-clip.js +85 -0
  6. package/dist/animation/animation-clip.js.map +1 -0
  7. package/dist/animation/animation-state-pool.d.ts +25 -0
  8. package/dist/animation/animation-state-pool.d.ts.map +1 -0
  9. package/dist/animation/animation-state-pool.js +113 -0
  10. package/dist/animation/animation-state-pool.js.map +1 -0
  11. package/dist/asset/sprite-sheet-loader.d.ts +41 -0
  12. package/dist/asset/sprite-sheet-loader.d.ts.map +1 -0
  13. package/dist/asset/sprite-sheet-loader.js +313 -0
  14. package/dist/asset/sprite-sheet-loader.js.map +1 -0
  15. package/dist/audio/audio-bus.d.ts +43 -0
  16. package/dist/audio/audio-bus.d.ts.map +1 -0
  17. package/dist/audio/audio-bus.js +258 -0
  18. package/dist/audio/audio-bus.js.map +1 -0
  19. package/dist/combat/mob-catalog.d.ts +29 -0
  20. package/dist/combat/mob-catalog.d.ts.map +1 -0
  21. package/dist/combat/mob-catalog.js +104 -0
  22. package/dist/combat/mob-catalog.js.map +1 -0
  23. package/dist/components/health.d.ts +28 -0
  24. package/dist/components/health.d.ts.map +1 -0
  25. package/dist/components/health.js +150 -0
  26. package/dist/components/health.js.map +1 -0
  27. package/dist/components/interactable.d.ts +30 -0
  28. package/dist/components/interactable.d.ts.map +1 -0
  29. package/dist/components/interactable.js +94 -0
  30. package/dist/components/interactable.js.map +1 -0
  31. package/dist/components/particle-emitter.d.ts +62 -0
  32. package/dist/components/particle-emitter.d.ts.map +1 -0
  33. package/dist/components/particle-emitter.js +193 -0
  34. package/dist/components/particle-emitter.js.map +1 -0
  35. package/dist/components/pursue.d.ts +23 -0
  36. package/dist/components/pursue.d.ts.map +1 -0
  37. package/dist/components/pursue.js +96 -0
  38. package/dist/components/pursue.js.map +1 -0
  39. package/dist/components/ranged-attack.d.ts +44 -0
  40. package/dist/components/ranged-attack.d.ts.map +1 -0
  41. package/dist/components/ranged-attack.js +120 -0
  42. package/dist/components/ranged-attack.js.map +1 -0
  43. package/dist/components/sprite.d.ts +27 -0
  44. package/dist/components/sprite.d.ts.map +1 -0
  45. package/dist/components/sprite.js +122 -0
  46. package/dist/components/sprite.js.map +1 -0
  47. package/dist/components/transform.d.ts +30 -0
  48. package/dist/components/transform.d.ts.map +1 -0
  49. package/dist/components/transform.js +150 -0
  50. package/dist/components/transform.js.map +1 -0
  51. package/dist/director/director-bridge.d.ts +22 -0
  52. package/dist/director/director-bridge.d.ts.map +1 -0
  53. package/dist/director/director-bridge.js +23 -0
  54. package/dist/director/director-bridge.js.map +1 -0
  55. package/dist/director/director-encounter-system.d.ts +21 -0
  56. package/dist/director/director-encounter-system.d.ts.map +1 -0
  57. package/dist/director/director-encounter-system.js +128 -0
  58. package/dist/director/director-encounter-system.js.map +1 -0
  59. package/dist/director/director-system.d.ts +19 -0
  60. package/dist/director/director-system.d.ts.map +1 -0
  61. package/dist/director/director-system.js +179 -0
  62. package/dist/director/director-system.js.map +1 -0
  63. package/dist/director/event-envelope.d.ts +144 -0
  64. package/dist/director/event-envelope.d.ts.map +1 -0
  65. package/dist/director/event-envelope.js +108 -0
  66. package/dist/director/event-envelope.js.map +1 -0
  67. package/dist/director/knot-context-resource.d.ts +25 -0
  68. package/dist/director/knot-context-resource.d.ts.map +1 -0
  69. package/dist/director/knot-context-resource.js +152 -0
  70. package/dist/director/knot-context-resource.js.map +1 -0
  71. package/dist/director/mock-director-bridge.d.ts +18 -0
  72. package/dist/director/mock-director-bridge.d.ts.map +1 -0
  73. package/dist/director/mock-director-bridge.js +75 -0
  74. package/dist/director/mock-director-bridge.js.map +1 -0
  75. package/dist/director/snapshot-recovery.d.ts +37 -0
  76. package/dist/director/snapshot-recovery.d.ts.map +1 -0
  77. package/dist/director/snapshot-recovery.js +180 -0
  78. package/dist/director/snapshot-recovery.js.map +1 -0
  79. package/dist/director/sse-director-bridge.d.ts +42 -0
  80. package/dist/director/sse-director-bridge.d.ts.map +1 -0
  81. package/dist/director/sse-director-bridge.js +280 -0
  82. package/dist/director/sse-director-bridge.js.map +1 -0
  83. package/dist/engine.d.ts +25 -0
  84. package/dist/engine.d.ts.map +1 -0
  85. package/dist/engine.js +166 -0
  86. package/dist/engine.js.map +1 -0
  87. package/dist/entity.d.ts +17 -0
  88. package/dist/entity.d.ts.map +1 -0
  89. package/dist/entity.js +77 -0
  90. package/dist/entity.js.map +1 -0
  91. package/dist/index.d.ts +85 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +64 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/input/input-manager.d.ts +91 -0
  96. package/dist/input/input-manager.d.ts.map +1 -0
  97. package/dist/input/input-manager.js +349 -0
  98. package/dist/input/input-manager.js.map +1 -0
  99. package/dist/input/tap-to-walk.d.ts +27 -0
  100. package/dist/input/tap-to-walk.d.ts.map +1 -0
  101. package/dist/input/tap-to-walk.js +118 -0
  102. package/dist/input/tap-to-walk.js.map +1 -0
  103. package/dist/input/virtual-dpad.d.ts +34 -0
  104. package/dist/input/virtual-dpad.d.ts.map +1 -0
  105. package/dist/input/virtual-dpad.js +267 -0
  106. package/dist/input/virtual-dpad.js.map +1 -0
  107. package/dist/renderer/camera.d.ts +26 -0
  108. package/dist/renderer/camera.d.ts.map +1 -0
  109. package/dist/renderer/camera.js +39 -0
  110. package/dist/renderer/camera.js.map +1 -0
  111. package/dist/renderer/canvas2d-device.d.ts +26 -0
  112. package/dist/renderer/canvas2d-device.d.ts.map +1 -0
  113. package/dist/renderer/canvas2d-device.js +252 -0
  114. package/dist/renderer/canvas2d-device.js.map +1 -0
  115. package/dist/renderer/graphics-device.d.ts +36 -0
  116. package/dist/renderer/graphics-device.d.ts.map +1 -0
  117. package/dist/renderer/graphics-device.js +12 -0
  118. package/dist/renderer/graphics-device.js.map +1 -0
  119. package/dist/renderer/iso-projection.d.ts +11 -0
  120. package/dist/renderer/iso-projection.d.ts.map +1 -0
  121. package/dist/renderer/iso-projection.js +59 -0
  122. package/dist/renderer/iso-projection.js.map +1 -0
  123. package/dist/resources.d.ts +28 -0
  124. package/dist/resources.d.ts.map +1 -0
  125. package/dist/resources.js +53 -0
  126. package/dist/resources.js.map +1 -0
  127. package/dist/system.d.ts +14 -0
  128. package/dist/system.d.ts.map +1 -0
  129. package/dist/system.js +25 -0
  130. package/dist/system.js.map +1 -0
  131. package/dist/systems/animation-system.d.ts +8 -0
  132. package/dist/systems/animation-system.d.ts.map +1 -0
  133. package/dist/systems/animation-system.js +77 -0
  134. package/dist/systems/animation-system.js.map +1 -0
  135. package/dist/systems/attack-system.d.ts +17 -0
  136. package/dist/systems/attack-system.d.ts.map +1 -0
  137. package/dist/systems/attack-system.js +94 -0
  138. package/dist/systems/attack-system.js.map +1 -0
  139. package/dist/systems/damage-system.d.ts +18 -0
  140. package/dist/systems/damage-system.d.ts.map +1 -0
  141. package/dist/systems/damage-system.js +77 -0
  142. package/dist/systems/damage-system.js.map +1 -0
  143. package/dist/systems/input-system.d.ts +7 -0
  144. package/dist/systems/input-system.d.ts.map +1 -0
  145. package/dist/systems/input-system.js +27 -0
  146. package/dist/systems/input-system.js.map +1 -0
  147. package/dist/systems/interaction-system.d.ts +23 -0
  148. package/dist/systems/interaction-system.d.ts.map +1 -0
  149. package/dist/systems/interaction-system.js +120 -0
  150. package/dist/systems/interaction-system.js.map +1 -0
  151. package/dist/systems/particle-emitter-system.d.ts +8 -0
  152. package/dist/systems/particle-emitter-system.d.ts.map +1 -0
  153. package/dist/systems/particle-emitter-system.js +161 -0
  154. package/dist/systems/particle-emitter-system.js.map +1 -0
  155. package/dist/systems/particle-render-system.d.ts +7 -0
  156. package/dist/systems/particle-render-system.d.ts.map +1 -0
  157. package/dist/systems/particle-render-system.js +53 -0
  158. package/dist/systems/particle-render-system.js.map +1 -0
  159. package/dist/systems/particle-simulation-system.d.ts +8 -0
  160. package/dist/systems/particle-simulation-system.d.ts.map +1 -0
  161. package/dist/systems/particle-simulation-system.js +45 -0
  162. package/dist/systems/particle-simulation-system.js.map +1 -0
  163. package/dist/systems/projectile-render-system.d.ts +7 -0
  164. package/dist/systems/projectile-render-system.d.ts.map +1 -0
  165. package/dist/systems/projectile-render-system.js +35 -0
  166. package/dist/systems/projectile-render-system.js.map +1 -0
  167. package/dist/systems/projectile-system.d.ts +7 -0
  168. package/dist/systems/projectile-system.d.ts.map +1 -0
  169. package/dist/systems/projectile-system.js +114 -0
  170. package/dist/systems/projectile-system.js.map +1 -0
  171. package/dist/systems/pursue-system.d.ts +7 -0
  172. package/dist/systems/pursue-system.d.ts.map +1 -0
  173. package/dist/systems/pursue-system.js +83 -0
  174. package/dist/systems/pursue-system.js.map +1 -0
  175. package/dist/systems/ranged-attack-system.d.ts +7 -0
  176. package/dist/systems/ranged-attack-system.d.ts.map +1 -0
  177. package/dist/systems/ranged-attack-system.js +98 -0
  178. package/dist/systems/ranged-attack-system.js.map +1 -0
  179. package/dist/systems/sprite-render-system.d.ts +9 -0
  180. package/dist/systems/sprite-render-system.d.ts.map +1 -0
  181. package/dist/systems/sprite-render-system.js +108 -0
  182. package/dist/systems/sprite-render-system.js.map +1 -0
  183. package/dist/systems/veil-budget-system.d.ts +7 -0
  184. package/dist/systems/veil-budget-system.d.ts.map +1 -0
  185. package/dist/systems/veil-budget-system.js +37 -0
  186. package/dist/systems/veil-budget-system.js.map +1 -0
  187. package/dist/util/color.d.ts +19 -0
  188. package/dist/util/color.d.ts.map +1 -0
  189. package/dist/util/color.js +45 -0
  190. package/dist/util/color.js.map +1 -0
  191. package/dist/util/math.d.ts +26 -0
  192. package/dist/util/math.d.ts.map +1 -0
  193. package/dist/util/math.js +47 -0
  194. package/dist/util/math.js.map +1 -0
  195. package/dist/util/typed-arrays.d.ts +7 -0
  196. package/dist/util/typed-arrays.d.ts.map +1 -0
  197. package/dist/util/typed-arrays.js +42 -0
  198. package/dist/util/typed-arrays.js.map +1 -0
  199. package/dist/vfx/particle-pool.d.ts +61 -0
  200. package/dist/vfx/particle-pool.d.ts.map +1 -0
  201. package/dist/vfx/particle-pool.js +204 -0
  202. package/dist/vfx/particle-pool.js.map +1 -0
  203. package/dist/vfx/projectile-pool.d.ts +56 -0
  204. package/dist/vfx/projectile-pool.d.ts.map +1 -0
  205. package/dist/vfx/projectile-pool.js +157 -0
  206. package/dist/vfx/projectile-pool.js.map +1 -0
  207. package/dist/world.d.ts +23 -0
  208. package/dist/world.d.ts.map +1 -0
  209. package/dist/world.js +101 -0
  210. package/dist/world.js.map +1 -0
  211. package/dist/zone/zone-catalog.d.ts +17 -0
  212. package/dist/zone/zone-catalog.d.ts.map +1 -0
  213. package/dist/zone/zone-catalog.js +116 -0
  214. package/dist/zone/zone-catalog.js.map +1 -0
  215. package/dist/zone/zone-state.d.ts +18 -0
  216. package/dist/zone/zone-state.d.ts.map +1 -0
  217. package/dist/zone/zone-state.js +52 -0
  218. package/dist/zone/zone-state.js.map +1 -0
  219. package/package.json +56 -0
@@ -0,0 +1,349 @@
1
+ // InputManager - DOM event listener that accumulates input state
2
+ // between ticks. Read by InputSystem in PHASE_INPUT, which promotes
3
+ // the accumulator to a frame-coherent InputResource that other
4
+ // systems read.
5
+ //
6
+ // What it tracks:
7
+ // - Keyboard: keys held (Set<string>), keys pressed this frame
8
+ // (transitioned up->down between last beginFrame and this one),
9
+ // keys released this frame
10
+ // - Pointer: position in canvas-relative coordinates, button state,
11
+ // pressed-this-frame, released-this-frame
12
+ // - Touches: an array of active touch points (id, x, y)
13
+ //
14
+ // Frame-coherence model:
15
+ // Per-frame transient state (pressedThisFrame / releasedThisFrame /
16
+ // wheelDeltaThisFrame) accumulates DOM events between calls to
17
+ // beginFrame(). beginFrame() snapshots the transient state into
18
+ // "current frame" buffers and clears the accumulators for the next
19
+ // tick. Held / position / buttons remain continuous.
20
+ //
21
+ // Browsers fire DOM events asynchronously. RAF gives one tick per
22
+ // vsync; multiple events can fire between ticks. Callers must call
23
+ // beginFrame() once per frame (the InputSystem does this in
24
+ // PHASE_INPUT, the very first phase, so all other systems read
25
+ // stable state for the rest of the tick).
26
+ export class InputManager {
27
+ keysHeld = new Set();
28
+ keysPressedAccum = new Set();
29
+ keysReleasedAccum = new Set();
30
+ pointer = { x: 0, y: 0, buttons: 0, inside: false };
31
+ pointerPressedAccum = 0;
32
+ pointerReleasedAccum = 0;
33
+ wheelDeltaAccum = 0;
34
+ activeTouches = new Map();
35
+ touchesStartedAccum = [];
36
+ touchesEndedAccum = [];
37
+ // Per-frame buffers (snapshot at beginFrame).
38
+ currentKeysPressed = new Set();
39
+ currentKeysReleased = new Set();
40
+ currentPointerPressed = 0;
41
+ currentPointerReleased = 0;
42
+ currentWheelDelta = 0;
43
+ currentTouchesStarted = [];
44
+ currentTouchesEnded = [];
45
+ // Phase 9.1: cached snapshot + cached touches array, mutated in
46
+ // place each frame so RESOURCE_INPUT readers don't trigger an
47
+ // allocation per tick. The fields below alias the manager's own
48
+ // collections; the snapshot's identity is stable across frames.
49
+ cachedTouchesArray = [];
50
+ cachedSnapshot;
51
+ // Bound listener refs so dispose() can detach them cleanly.
52
+ boundKeyDown = this.onKeyDown.bind(this);
53
+ boundKeyUp = this.onKeyUp.bind(this);
54
+ boundPointerMove = this.onPointerMove.bind(this);
55
+ boundPointerDown = this.onPointerDown.bind(this);
56
+ boundPointerUp = this.onPointerUp.bind(this);
57
+ boundPointerEnter = this.onPointerEnter.bind(this);
58
+ boundPointerLeave = this.onPointerLeave.bind(this);
59
+ boundWheel = this.onWheel.bind(this);
60
+ boundTouchStart = this.onTouchStart.bind(this);
61
+ boundTouchMove = this.onTouchMove.bind(this);
62
+ boundTouchEnd = this.onTouchEnd.bind(this);
63
+ boundTouchCancel = this.onTouchCancel.bind(this);
64
+ boundContextMenu = this.onContextMenu.bind(this);
65
+ canvas = null;
66
+ targetWindow = null;
67
+ attached = false;
68
+ constructor() {
69
+ // Build a stable cached snapshot once. snapshot() returns this
70
+ // same reference each frame, having mutated only the fields that
71
+ // change. Phase 9.1 alloc-churn fix.
72
+ this.cachedSnapshot = {
73
+ keysHeld: this.keysHeld,
74
+ keysPressedThisFrame: this.currentKeysPressed,
75
+ keysReleasedThisFrame: this.currentKeysReleased,
76
+ pointer: this.pointer,
77
+ pointerPressedThisFrame: 0,
78
+ pointerReleasedThisFrame: 0,
79
+ wheelDeltaThisFrame: 0,
80
+ touches: this.cachedTouchesArray,
81
+ touchesStartedThisFrame: this.currentTouchesStarted,
82
+ touchesEndedThisFrame: this.currentTouchesEnded,
83
+ };
84
+ }
85
+ // Attach DOM listeners. Keyboard goes on window so the canvas
86
+ // doesn't need focus to receive arrow keys. Pointer + wheel go on
87
+ // the canvas so coordinates resolve cleanly.
88
+ attach(canvas, win = window) {
89
+ if (this.attached)
90
+ return;
91
+ this.canvas = canvas;
92
+ this.targetWindow = win;
93
+ win.addEventListener('keydown', this.boundKeyDown);
94
+ win.addEventListener('keyup', this.boundKeyUp);
95
+ canvas.addEventListener('mousemove', this.boundPointerMove);
96
+ canvas.addEventListener('mousedown', this.boundPointerDown);
97
+ canvas.addEventListener('mouseup', this.boundPointerUp);
98
+ canvas.addEventListener('mouseenter', this.boundPointerEnter);
99
+ canvas.addEventListener('mouseleave', this.boundPointerLeave);
100
+ canvas.addEventListener('wheel', this.boundWheel, { passive: false });
101
+ canvas.addEventListener('touchstart', this.boundTouchStart, { passive: false });
102
+ canvas.addEventListener('touchmove', this.boundTouchMove, { passive: false });
103
+ canvas.addEventListener('touchend', this.boundTouchEnd);
104
+ canvas.addEventListener('touchcancel', this.boundTouchCancel);
105
+ canvas.addEventListener('contextmenu', this.boundContextMenu);
106
+ this.attached = true;
107
+ }
108
+ detach() {
109
+ if (!this.attached)
110
+ return;
111
+ const c = this.canvas;
112
+ const w = this.targetWindow;
113
+ if (w) {
114
+ w.removeEventListener('keydown', this.boundKeyDown);
115
+ w.removeEventListener('keyup', this.boundKeyUp);
116
+ }
117
+ if (c) {
118
+ c.removeEventListener('mousemove', this.boundPointerMove);
119
+ c.removeEventListener('mousedown', this.boundPointerDown);
120
+ c.removeEventListener('mouseup', this.boundPointerUp);
121
+ c.removeEventListener('mouseenter', this.boundPointerEnter);
122
+ c.removeEventListener('mouseleave', this.boundPointerLeave);
123
+ c.removeEventListener('wheel', this.boundWheel);
124
+ c.removeEventListener('touchstart', this.boundTouchStart);
125
+ c.removeEventListener('touchmove', this.boundTouchMove);
126
+ c.removeEventListener('touchend', this.boundTouchEnd);
127
+ c.removeEventListener('touchcancel', this.boundTouchCancel);
128
+ c.removeEventListener('contextmenu', this.boundContextMenu);
129
+ }
130
+ this.canvas = null;
131
+ this.targetWindow = null;
132
+ this.attached = false;
133
+ }
134
+ // Promote accumulated state to per-frame buffers and reset
135
+ // accumulators. Called once per tick by InputSystem in PHASE_INPUT.
136
+ //
137
+ // Phase 9.1 alloc-churn fix: ping-pong the accumulator/current pair
138
+ // and clear in place rather than allocating fresh Sets and arrays
139
+ // each tick. The snapshot's identity is stable across frames; only
140
+ // its contained collections change. Consumers must not retain a
141
+ // reference across frames (documented at the top of this module).
142
+ beginFrame() {
143
+ // Swap accumulator <-> current. After the swap, the old "current"
144
+ // (which is now the accumulator) gets cleared in place to be the
145
+ // collection for the next tick's events.
146
+ const swapPressed = this.currentKeysPressed;
147
+ this.currentKeysPressed = this.keysPressedAccum;
148
+ this.keysPressedAccum = swapPressed;
149
+ swapPressed.clear();
150
+ const swapReleased = this.currentKeysReleased;
151
+ this.currentKeysReleased = this.keysReleasedAccum;
152
+ this.keysReleasedAccum = swapReleased;
153
+ swapReleased.clear();
154
+ this.currentPointerPressed = this.pointerPressedAccum;
155
+ this.currentPointerReleased = this.pointerReleasedAccum;
156
+ this.currentWheelDelta = this.wheelDeltaAccum;
157
+ this.pointerPressedAccum = 0;
158
+ this.pointerReleasedAccum = 0;
159
+ this.wheelDeltaAccum = 0;
160
+ const swapStarted = this.currentTouchesStarted;
161
+ this.currentTouchesStarted = this.touchesStartedAccum;
162
+ this.touchesStartedAccum = swapStarted;
163
+ swapStarted.length = 0;
164
+ const swapEnded = this.currentTouchesEnded;
165
+ this.currentTouchesEnded = this.touchesEndedAccum;
166
+ this.touchesEndedAccum = swapEnded;
167
+ swapEnded.length = 0;
168
+ }
169
+ // Build the immutable snapshot that systems read. Phase 9.1: returns
170
+ // a cached snapshot object, mutating only the fields that change so
171
+ // RESOURCE_INPUT updates are zero-alloc per frame. The touches array
172
+ // is rebuilt in place into the cached array (no Array.from).
173
+ snapshot() {
174
+ const snap = this.cachedSnapshot;
175
+ snap.keysPressedThisFrame = this.currentKeysPressed;
176
+ snap.keysReleasedThisFrame = this.currentKeysReleased;
177
+ snap.pointerPressedThisFrame = this.currentPointerPressed;
178
+ snap.pointerReleasedThisFrame = this.currentPointerReleased;
179
+ snap.wheelDeltaThisFrame = this.currentWheelDelta;
180
+ snap.touchesStartedThisFrame = this.currentTouchesStarted;
181
+ snap.touchesEndedThisFrame = this.currentTouchesEnded;
182
+ // Rebuild touches array in place from the active-touches map.
183
+ const touchesArr = this.cachedTouchesArray;
184
+ touchesArr.length = 0;
185
+ for (const tp of this.activeTouches.values()) {
186
+ touchesArr.push(tp);
187
+ }
188
+ return this.cachedSnapshot;
189
+ }
190
+ // ---------- Test / synthetic injection helpers ----------
191
+ // Inject a keydown without a real DOM event (for unit tests).
192
+ injectKeyDown(code) {
193
+ if (!this.keysHeld.has(code)) {
194
+ this.keysPressedAccum.add(code);
195
+ this.keysHeld.add(code);
196
+ }
197
+ }
198
+ injectKeyUp(code) {
199
+ if (this.keysHeld.has(code)) {
200
+ this.keysReleasedAccum.add(code);
201
+ this.keysHeld.delete(code);
202
+ }
203
+ }
204
+ injectPointerMove(x, y, buttons, inside = true) {
205
+ this.pointer.x = x;
206
+ this.pointer.y = y;
207
+ this.pointer.buttons = buttons;
208
+ this.pointer.inside = inside;
209
+ }
210
+ injectPointerDown(buttonsBit) {
211
+ this.pointerPressedAccum |= buttonsBit;
212
+ this.pointer.buttons |= buttonsBit;
213
+ }
214
+ injectPointerUp(buttonsBit) {
215
+ this.pointerReleasedAccum |= buttonsBit;
216
+ this.pointer.buttons &= ~buttonsBit;
217
+ }
218
+ // Inject a synthetic touchstart for tests / virtual-input adapters.
219
+ // Coordinates are in canvas-internal pixel space (same space as the
220
+ // real touch listener produces after DPR scaling).
221
+ injectTouchStart(id, x, y) {
222
+ const tp = { id, x, y };
223
+ this.activeTouches.set(id, tp);
224
+ this.touchesStartedAccum.push(tp);
225
+ }
226
+ injectTouchMove(id, x, y) {
227
+ const tp = { id, x, y };
228
+ this.activeTouches.set(id, tp);
229
+ }
230
+ injectTouchEnd(id, x, y) {
231
+ const tp = { id, x, y };
232
+ this.activeTouches.delete(id);
233
+ this.touchesEndedAccum.push(tp);
234
+ }
235
+ // ---------- DOM listener implementations ----------
236
+ onKeyDown(e) {
237
+ if (!this.keysHeld.has(e.code)) {
238
+ this.keysPressedAccum.add(e.code);
239
+ this.keysHeld.add(e.code);
240
+ }
241
+ }
242
+ onKeyUp(e) {
243
+ if (this.keysHeld.has(e.code)) {
244
+ this.keysReleasedAccum.add(e.code);
245
+ this.keysHeld.delete(e.code);
246
+ }
247
+ }
248
+ updatePointerFromEvent(e) {
249
+ if (!this.canvas)
250
+ return;
251
+ const rect = this.canvas.getBoundingClientRect();
252
+ // Account for canvas display-size vs internal-resolution: the
253
+ // canvas may be CSS-scaled. We multiply by the ratio so the
254
+ // returned coords match the canvas's intrinsic pixel space.
255
+ const sx = this.canvas.width / Math.max(1, rect.width);
256
+ const sy = this.canvas.height / Math.max(1, rect.height);
257
+ this.pointer.x = (e.clientX - rect.left) * sx;
258
+ this.pointer.y = (e.clientY - rect.top) * sy;
259
+ this.pointer.buttons = e.buttons;
260
+ this.pointer.inside = true;
261
+ }
262
+ onPointerMove(e) {
263
+ this.updatePointerFromEvent(e);
264
+ }
265
+ onPointerDown(e) {
266
+ this.updatePointerFromEvent(e);
267
+ const bit = 1 << e.button;
268
+ this.pointerPressedAccum |= bit;
269
+ }
270
+ onPointerUp(e) {
271
+ this.updatePointerFromEvent(e);
272
+ const bit = 1 << e.button;
273
+ this.pointerReleasedAccum |= bit;
274
+ }
275
+ onPointerEnter(e) {
276
+ this.updatePointerFromEvent(e);
277
+ this.pointer.inside = true;
278
+ }
279
+ onPointerLeave(_e) {
280
+ this.pointer.inside = false;
281
+ this.pointer.buttons = 0;
282
+ }
283
+ onWheel(e) {
284
+ this.wheelDeltaAccum += e.deltaY;
285
+ e.preventDefault();
286
+ }
287
+ updateTouchPoint(t) {
288
+ if (!this.canvas)
289
+ return { id: t.identifier, x: 0, y: 0 };
290
+ const rect = this.canvas.getBoundingClientRect();
291
+ const sx = this.canvas.width / Math.max(1, rect.width);
292
+ const sy = this.canvas.height / Math.max(1, rect.height);
293
+ return {
294
+ id: t.identifier,
295
+ x: (t.clientX - rect.left) * sx,
296
+ y: (t.clientY - rect.top) * sy,
297
+ };
298
+ }
299
+ onTouchStart(e) {
300
+ for (let i = 0; i < e.changedTouches.length; i++) {
301
+ const t = e.changedTouches[i];
302
+ if (!t)
303
+ continue;
304
+ const tp = this.updateTouchPoint(t);
305
+ this.activeTouches.set(tp.id, tp);
306
+ this.touchesStartedAccum.push(tp);
307
+ }
308
+ e.preventDefault();
309
+ }
310
+ onTouchMove(e) {
311
+ for (let i = 0; i < e.changedTouches.length; i++) {
312
+ const t = e.changedTouches[i];
313
+ if (!t)
314
+ continue;
315
+ const tp = this.updateTouchPoint(t);
316
+ this.activeTouches.set(tp.id, tp);
317
+ }
318
+ e.preventDefault();
319
+ }
320
+ onTouchEnd(e) {
321
+ for (let i = 0; i < e.changedTouches.length; i++) {
322
+ const t = e.changedTouches[i];
323
+ if (!t)
324
+ continue;
325
+ const tp = this.updateTouchPoint(t);
326
+ this.activeTouches.delete(tp.id);
327
+ this.touchesEndedAccum.push(tp);
328
+ }
329
+ }
330
+ onTouchCancel(e) {
331
+ for (let i = 0; i < e.changedTouches.length; i++) {
332
+ const t = e.changedTouches[i];
333
+ if (!t)
334
+ continue;
335
+ this.activeTouches.delete(t.identifier);
336
+ }
337
+ }
338
+ // Default-prevent the right-click menu so a Phase 6+ ARPG can use
339
+ // RMB without the OS context menu. Callers that need the menu can
340
+ // wrap the canvas in a parent and listen there instead.
341
+ onContextMenu(e) {
342
+ e.preventDefault();
343
+ }
344
+ }
345
+ // Resource key. Engine.create registers the InputManager + a current
346
+ // snapshot under these keys.
347
+ export const RESOURCE_INPUT_MANAGER = 'input_manager';
348
+ export const RESOURCE_INPUT = 'input';
349
+ //# sourceMappingURL=input-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-manager.js","sourceRoot":"","sources":["../../src/input/input-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { System } from '../system.js';
2
+ import type { World } from '../world.js';
3
+ export interface TapWalkTargetResource {
4
+ x: number;
5
+ y: number;
6
+ active: boolean;
7
+ frameSet: number;
8
+ }
9
+ export declare const RESOURCE_TAP_WALK: 'tap_walk';
10
+ export declare function createTapWalkTarget(): TapWalkTargetResource;
11
+ export interface TapToWalkSystemOptions {
12
+ moveThresholdPx?: number;
13
+ maxFrames?: number;
14
+ }
15
+ export declare class TapToWalkSystem implements System {
16
+ readonly name: string;
17
+ private inFlight;
18
+ private moveThresholdSq;
19
+ private maxFrames;
20
+ private scratchA;
21
+ private scratchB;
22
+ constructor(opts?: TapToWalkSystemOptions);
23
+ update(world: World, _dt: number): void;
24
+ private publishTarget;
25
+ resetInFlight(): void;
26
+ }
27
+ //# sourceMappingURL=tap-to-walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap-to-walk.d.ts","sourceRoot":"","sources":["../../src/input/tap-to-walk.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AASzC,MAAM,WAAW,qBAAqB;IAEpC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAEV,MAAM,EAAE,OAAO,CAAC;IAGhB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,EAAE,UAAuB,CAAC;AAExD,wBAAgB,mBAAmB,IAAI,qBAAqB,CAE3D;AAOD,MAAM,WAAW,sBAAsB;IAIrC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,qBAAa,eAAgB,YAAW,MAAM;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,SAAS,CAAS;IAG1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,IAAI,GAAE,sBAA2B;IAM7C,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAoDvC,OAAO,CAAC,aAAa;IAqBrB,aAAa,IAAI,IAAI;CAGtB"}
@@ -0,0 +1,118 @@
1
+ // TapToWalkSystem - converts a single quick canvas tap into a
2
+ // world-tile target the game can walk to.
3
+ //
4
+ // Touch lifecycle:
5
+ // - Multi-touch is ignored entirely. A second active touch cancels
6
+ // the in-flight tap candidate so two-finger gestures (zoom, pan)
7
+ // don't accidentally drop a walk target.
8
+ // - A "tap" is a single touch whose start/end happen within
9
+ // `maxFrames` frames AND whose end position is within
10
+ // `moveThresholdPx` of its start position.
11
+ // - On a confirmed tap, the system computes the world-tile target
12
+ // by inverting the iso projection: canvas pixel -> camera/iso
13
+ // space via screenToWorld, then iso -> tile via isoToTile.
14
+ //
15
+ // Cancellation:
16
+ // - Any held WASD or Arrow key clears the target on the same frame
17
+ // it appears in keysHeld. This is how a manual D-pad press
18
+ // ("press up to keep walking") cancels an old tap-to-walk goal.
19
+ //
20
+ // The target is published to RESOURCE_TAP_WALK as a small mutable
21
+ // resource: { x, y, active, frameSet }. Consumers (the player-move
22
+ // system) read it each tick. The system never owns the player entity
23
+ // or the movement logic - it just publishes the target.
24
+ import { RESOURCE_INPUT } from './input-manager.js';
25
+ import { RESOURCE_TIME, RESOURCE_CAMERA } from '../resources.js';
26
+ import { screenToWorld } from '../renderer/camera.js';
27
+ import { isoToTile } from '../renderer/iso-projection.js';
28
+ export const RESOURCE_TAP_WALK = 'tap_walk';
29
+ export function createTapWalkTarget() {
30
+ return { x: 0, y: 0, active: false, frameSet: -1 };
31
+ }
32
+ const CANCEL_KEYS = [
33
+ 'KeyW', 'KeyA', 'KeyS', 'KeyD',
34
+ 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight',
35
+ ];
36
+ export class TapToWalkSystem {
37
+ name = 'tap-to-walk';
38
+ inFlight = null;
39
+ moveThresholdSq;
40
+ maxFrames;
41
+ // Scratch vectors so per-frame iso math doesn't allocate.
42
+ scratchA = { x: 0, y: 0 };
43
+ scratchB = { x: 0, y: 0 };
44
+ constructor(opts = {}) {
45
+ const px = opts.moveThresholdPx ?? 12;
46
+ this.moveThresholdSq = px * px;
47
+ this.maxFrames = opts.maxFrames ?? 30;
48
+ }
49
+ update(world, _dt) {
50
+ const input = world.resources.get(RESOURCE_INPUT);
51
+ if (!input)
52
+ return;
53
+ const time = world.resources.require(RESOURCE_TIME);
54
+ const target = world.resources.get(RESOURCE_TAP_WALK);
55
+ if (!target)
56
+ return;
57
+ // Manual movement (keyboard or D-pad-injected WASD) cancels any
58
+ // pending walk target.
59
+ for (const code of CANCEL_KEYS) {
60
+ if (input.keysHeld.has(code)) {
61
+ target.active = false;
62
+ this.inFlight = null;
63
+ return;
64
+ }
65
+ }
66
+ // Multi-touch -> abort tap candidacy. Two-finger gestures should
67
+ // never resolve to a walk command.
68
+ if (input.touches.length > 1) {
69
+ this.inFlight = null;
70
+ return;
71
+ }
72
+ // Track the first touchstart of an idle frame.
73
+ if (this.inFlight === null && input.touchesStartedThisFrame.length > 0) {
74
+ const t = input.touchesStartedThisFrame[0];
75
+ this.inFlight = {
76
+ id: t.id,
77
+ startX: t.x,
78
+ startY: t.y,
79
+ startFrame: time.frame,
80
+ };
81
+ }
82
+ // Resolve on touchend matching the in-flight id.
83
+ if (this.inFlight !== null) {
84
+ for (const ended of input.touchesEndedThisFrame) {
85
+ if (ended.id !== this.inFlight.id)
86
+ continue;
87
+ const dx = ended.x - this.inFlight.startX;
88
+ const dy = ended.y - this.inFlight.startY;
89
+ const distSq = dx * dx + dy * dy;
90
+ const frames = time.frame - this.inFlight.startFrame;
91
+ if (distSq <= this.moveThresholdSq && frames <= this.maxFrames) {
92
+ this.publishTarget(world, target, ended.x, ended.y, time.frame);
93
+ }
94
+ this.inFlight = null;
95
+ break;
96
+ }
97
+ }
98
+ }
99
+ publishTarget(world, target, canvasPxX, canvasPxY, frame) {
100
+ const camera = world.resources.get(RESOURCE_CAMERA);
101
+ if (!camera)
102
+ return;
103
+ // Canvas pixel -> iso (camera) space.
104
+ screenToWorld(camera, canvasPxX, canvasPxY, this.scratchA);
105
+ // Iso -> world tile.
106
+ isoToTile(this.scratchA.x, this.scratchA.y, this.scratchB);
107
+ target.x = this.scratchB.x;
108
+ target.y = this.scratchB.y;
109
+ target.active = true;
110
+ target.frameSet = frame;
111
+ }
112
+ // Test helper: clear any in-flight tap candidate. Mostly used by
113
+ // tests that want to drive the system through state transitions.
114
+ resetInFlight() {
115
+ this.inFlight = null;
116
+ }
117
+ }
118
+ //# sourceMappingURL=tap-to-walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tap-to-walk.js","sourceRoot":"","sources":["../../src/input/tap-to-walk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { InputManager } from './input-manager.js';
2
+ export type DpadDirection = 'up' | 'down' | 'left' | 'right';
3
+ export interface VirtualDpadOptions {
4
+ inputManager: InputManager;
5
+ parent?: HTMLElement;
6
+ document?: Document;
7
+ visible?: boolean;
8
+ onPress?: (dir: DpadDirection) => void;
9
+ }
10
+ export declare class VirtualDpad {
11
+ private opts;
12
+ private root;
13
+ private buttons;
14
+ private mounted;
15
+ private visible;
16
+ constructor(opts: VirtualDpadOptions);
17
+ static detectTouchSupport(win?: Window): boolean;
18
+ isMounted(): boolean;
19
+ isVisible(): boolean;
20
+ mount(): void;
21
+ unmount(): void;
22
+ pressDirection(dir: DpadDirection, touchId?: number): void;
23
+ releaseDirection(dir: DpadDirection, touchId?: number): void;
24
+ pressedTouchCount(dir: DpadDirection): number;
25
+ private requireButton;
26
+ private buildButton;
27
+ private spacer;
28
+ private deadzone;
29
+ private styleRoot;
30
+ private styleGrid;
31
+ private styleButton;
32
+ private attachListeners;
33
+ }
34
+ //# sourceMappingURL=virtual-dpad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-dpad.d.ts","sourceRoot":"","sources":["../../src/input/virtual-dpad.ts"],"names":[],"mappings":"AAoBA,OAAO,EACL,YAAY,EACb,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS7D,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAE3B,MAAM,CAAC,EAAE,WAAW,CAAC;IAGrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAIpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAOD,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,IAAI,CAA4B;IACxC,OAAO,CAAC,OAAO,CAAuD;IACtE,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,OAAO,CAAU;gBAEb,IAAI,EAAE,kBAAkB;IASpC,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO;IAShD,SAAS,IAAI,OAAO;IAIpB,SAAS,IAAI,OAAO;IAMpB,KAAK,IAAI,IAAI;IA2Cb,OAAO,IAAI,IAAI;IAqBf,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAU9D,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,MAAW,GAAG,IAAI;IAUhE,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM;IAK7C,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,eAAe;CAqCxB"}