@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.
- package/LICENSE +21 -0
- package/README.md +344 -0
- package/dist/animation/animation-clip.d.ts +12 -0
- package/dist/animation/animation-clip.d.ts.map +1 -0
- package/dist/animation/animation-clip.js +85 -0
- package/dist/animation/animation-clip.js.map +1 -0
- package/dist/animation/animation-state-pool.d.ts +25 -0
- package/dist/animation/animation-state-pool.d.ts.map +1 -0
- package/dist/animation/animation-state-pool.js +113 -0
- package/dist/animation/animation-state-pool.js.map +1 -0
- package/dist/asset/sprite-sheet-loader.d.ts +41 -0
- package/dist/asset/sprite-sheet-loader.d.ts.map +1 -0
- package/dist/asset/sprite-sheet-loader.js +313 -0
- package/dist/asset/sprite-sheet-loader.js.map +1 -0
- package/dist/audio/audio-bus.d.ts +43 -0
- package/dist/audio/audio-bus.d.ts.map +1 -0
- package/dist/audio/audio-bus.js +258 -0
- package/dist/audio/audio-bus.js.map +1 -0
- package/dist/combat/mob-catalog.d.ts +29 -0
- package/dist/combat/mob-catalog.d.ts.map +1 -0
- package/dist/combat/mob-catalog.js +104 -0
- package/dist/combat/mob-catalog.js.map +1 -0
- package/dist/components/health.d.ts +28 -0
- package/dist/components/health.d.ts.map +1 -0
- package/dist/components/health.js +150 -0
- package/dist/components/health.js.map +1 -0
- package/dist/components/interactable.d.ts +30 -0
- package/dist/components/interactable.d.ts.map +1 -0
- package/dist/components/interactable.js +94 -0
- package/dist/components/interactable.js.map +1 -0
- package/dist/components/particle-emitter.d.ts +62 -0
- package/dist/components/particle-emitter.d.ts.map +1 -0
- package/dist/components/particle-emitter.js +193 -0
- package/dist/components/particle-emitter.js.map +1 -0
- package/dist/components/pursue.d.ts +23 -0
- package/dist/components/pursue.d.ts.map +1 -0
- package/dist/components/pursue.js +96 -0
- package/dist/components/pursue.js.map +1 -0
- package/dist/components/ranged-attack.d.ts +44 -0
- package/dist/components/ranged-attack.d.ts.map +1 -0
- package/dist/components/ranged-attack.js +120 -0
- package/dist/components/ranged-attack.js.map +1 -0
- package/dist/components/sprite.d.ts +27 -0
- package/dist/components/sprite.d.ts.map +1 -0
- package/dist/components/sprite.js +122 -0
- package/dist/components/sprite.js.map +1 -0
- package/dist/components/transform.d.ts +30 -0
- package/dist/components/transform.d.ts.map +1 -0
- package/dist/components/transform.js +150 -0
- package/dist/components/transform.js.map +1 -0
- package/dist/director/director-bridge.d.ts +22 -0
- package/dist/director/director-bridge.d.ts.map +1 -0
- package/dist/director/director-bridge.js +23 -0
- package/dist/director/director-bridge.js.map +1 -0
- package/dist/director/director-encounter-system.d.ts +21 -0
- package/dist/director/director-encounter-system.d.ts.map +1 -0
- package/dist/director/director-encounter-system.js +128 -0
- package/dist/director/director-encounter-system.js.map +1 -0
- package/dist/director/director-system.d.ts +19 -0
- package/dist/director/director-system.d.ts.map +1 -0
- package/dist/director/director-system.js +179 -0
- package/dist/director/director-system.js.map +1 -0
- package/dist/director/event-envelope.d.ts +144 -0
- package/dist/director/event-envelope.d.ts.map +1 -0
- package/dist/director/event-envelope.js +108 -0
- package/dist/director/event-envelope.js.map +1 -0
- package/dist/director/knot-context-resource.d.ts +25 -0
- package/dist/director/knot-context-resource.d.ts.map +1 -0
- package/dist/director/knot-context-resource.js +152 -0
- package/dist/director/knot-context-resource.js.map +1 -0
- package/dist/director/mock-director-bridge.d.ts +18 -0
- package/dist/director/mock-director-bridge.d.ts.map +1 -0
- package/dist/director/mock-director-bridge.js +75 -0
- package/dist/director/mock-director-bridge.js.map +1 -0
- package/dist/director/snapshot-recovery.d.ts +37 -0
- package/dist/director/snapshot-recovery.d.ts.map +1 -0
- package/dist/director/snapshot-recovery.js +180 -0
- package/dist/director/snapshot-recovery.js.map +1 -0
- package/dist/director/sse-director-bridge.d.ts +42 -0
- package/dist/director/sse-director-bridge.d.ts.map +1 -0
- package/dist/director/sse-director-bridge.js +280 -0
- package/dist/director/sse-director-bridge.js.map +1 -0
- package/dist/engine.d.ts +25 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +166 -0
- package/dist/engine.js.map +1 -0
- package/dist/entity.d.ts +17 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/entity.js +77 -0
- package/dist/entity.js.map +1 -0
- package/dist/index.d.ts +85 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/input/input-manager.d.ts +91 -0
- package/dist/input/input-manager.d.ts.map +1 -0
- package/dist/input/input-manager.js +349 -0
- package/dist/input/input-manager.js.map +1 -0
- package/dist/input/tap-to-walk.d.ts +27 -0
- package/dist/input/tap-to-walk.d.ts.map +1 -0
- package/dist/input/tap-to-walk.js +118 -0
- package/dist/input/tap-to-walk.js.map +1 -0
- package/dist/input/virtual-dpad.d.ts +34 -0
- package/dist/input/virtual-dpad.d.ts.map +1 -0
- package/dist/input/virtual-dpad.js +267 -0
- package/dist/input/virtual-dpad.js.map +1 -0
- package/dist/renderer/camera.d.ts +26 -0
- package/dist/renderer/camera.d.ts.map +1 -0
- package/dist/renderer/camera.js +39 -0
- package/dist/renderer/camera.js.map +1 -0
- package/dist/renderer/canvas2d-device.d.ts +26 -0
- package/dist/renderer/canvas2d-device.d.ts.map +1 -0
- package/dist/renderer/canvas2d-device.js +252 -0
- package/dist/renderer/canvas2d-device.js.map +1 -0
- package/dist/renderer/graphics-device.d.ts +36 -0
- package/dist/renderer/graphics-device.d.ts.map +1 -0
- package/dist/renderer/graphics-device.js +12 -0
- package/dist/renderer/graphics-device.js.map +1 -0
- package/dist/renderer/iso-projection.d.ts +11 -0
- package/dist/renderer/iso-projection.d.ts.map +1 -0
- package/dist/renderer/iso-projection.js +59 -0
- package/dist/renderer/iso-projection.js.map +1 -0
- package/dist/resources.d.ts +28 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +53 -0
- package/dist/resources.js.map +1 -0
- package/dist/system.d.ts +14 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +25 -0
- package/dist/system.js.map +1 -0
- package/dist/systems/animation-system.d.ts +8 -0
- package/dist/systems/animation-system.d.ts.map +1 -0
- package/dist/systems/animation-system.js +77 -0
- package/dist/systems/animation-system.js.map +1 -0
- package/dist/systems/attack-system.d.ts +17 -0
- package/dist/systems/attack-system.d.ts.map +1 -0
- package/dist/systems/attack-system.js +94 -0
- package/dist/systems/attack-system.js.map +1 -0
- package/dist/systems/damage-system.d.ts +18 -0
- package/dist/systems/damage-system.d.ts.map +1 -0
- package/dist/systems/damage-system.js +77 -0
- package/dist/systems/damage-system.js.map +1 -0
- package/dist/systems/input-system.d.ts +7 -0
- package/dist/systems/input-system.d.ts.map +1 -0
- package/dist/systems/input-system.js +27 -0
- package/dist/systems/input-system.js.map +1 -0
- package/dist/systems/interaction-system.d.ts +23 -0
- package/dist/systems/interaction-system.d.ts.map +1 -0
- package/dist/systems/interaction-system.js +120 -0
- package/dist/systems/interaction-system.js.map +1 -0
- package/dist/systems/particle-emitter-system.d.ts +8 -0
- package/dist/systems/particle-emitter-system.d.ts.map +1 -0
- package/dist/systems/particle-emitter-system.js +161 -0
- package/dist/systems/particle-emitter-system.js.map +1 -0
- package/dist/systems/particle-render-system.d.ts +7 -0
- package/dist/systems/particle-render-system.d.ts.map +1 -0
- package/dist/systems/particle-render-system.js +53 -0
- package/dist/systems/particle-render-system.js.map +1 -0
- package/dist/systems/particle-simulation-system.d.ts +8 -0
- package/dist/systems/particle-simulation-system.d.ts.map +1 -0
- package/dist/systems/particle-simulation-system.js +45 -0
- package/dist/systems/particle-simulation-system.js.map +1 -0
- package/dist/systems/projectile-render-system.d.ts +7 -0
- package/dist/systems/projectile-render-system.d.ts.map +1 -0
- package/dist/systems/projectile-render-system.js +35 -0
- package/dist/systems/projectile-render-system.js.map +1 -0
- package/dist/systems/projectile-system.d.ts +7 -0
- package/dist/systems/projectile-system.d.ts.map +1 -0
- package/dist/systems/projectile-system.js +114 -0
- package/dist/systems/projectile-system.js.map +1 -0
- package/dist/systems/pursue-system.d.ts +7 -0
- package/dist/systems/pursue-system.d.ts.map +1 -0
- package/dist/systems/pursue-system.js +83 -0
- package/dist/systems/pursue-system.js.map +1 -0
- package/dist/systems/ranged-attack-system.d.ts +7 -0
- package/dist/systems/ranged-attack-system.d.ts.map +1 -0
- package/dist/systems/ranged-attack-system.js +98 -0
- package/dist/systems/ranged-attack-system.js.map +1 -0
- package/dist/systems/sprite-render-system.d.ts +9 -0
- package/dist/systems/sprite-render-system.d.ts.map +1 -0
- package/dist/systems/sprite-render-system.js +108 -0
- package/dist/systems/sprite-render-system.js.map +1 -0
- package/dist/systems/veil-budget-system.d.ts +7 -0
- package/dist/systems/veil-budget-system.d.ts.map +1 -0
- package/dist/systems/veil-budget-system.js +37 -0
- package/dist/systems/veil-budget-system.js.map +1 -0
- package/dist/util/color.d.ts +19 -0
- package/dist/util/color.d.ts.map +1 -0
- package/dist/util/color.js +45 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/math.d.ts +26 -0
- package/dist/util/math.d.ts.map +1 -0
- package/dist/util/math.js +47 -0
- package/dist/util/math.js.map +1 -0
- package/dist/util/typed-arrays.d.ts +7 -0
- package/dist/util/typed-arrays.d.ts.map +1 -0
- package/dist/util/typed-arrays.js +42 -0
- package/dist/util/typed-arrays.js.map +1 -0
- package/dist/vfx/particle-pool.d.ts +61 -0
- package/dist/vfx/particle-pool.d.ts.map +1 -0
- package/dist/vfx/particle-pool.js +204 -0
- package/dist/vfx/particle-pool.js.map +1 -0
- package/dist/vfx/projectile-pool.d.ts +56 -0
- package/dist/vfx/projectile-pool.d.ts.map +1 -0
- package/dist/vfx/projectile-pool.js +157 -0
- package/dist/vfx/projectile-pool.js.map +1 -0
- package/dist/world.d.ts +23 -0
- package/dist/world.d.ts.map +1 -0
- package/dist/world.js +101 -0
- package/dist/world.js.map +1 -0
- package/dist/zone/zone-catalog.d.ts +17 -0
- package/dist/zone/zone-catalog.d.ts.map +1 -0
- package/dist/zone/zone-catalog.js +116 -0
- package/dist/zone/zone-catalog.js.map +1 -0
- package/dist/zone/zone-state.d.ts +18 -0
- package/dist/zone/zone-state.d.ts.map +1 -0
- package/dist/zone/zone-state.js +52 -0
- package/dist/zone/zone-state.js.map +1 -0
- 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"}
|