@al8b/input 0.1.12 → 0.1.14
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/dist/core/input-manager.js +24 -9
- package/dist/core/input-manager.js.map +1 -1
- package/dist/core/input-manager.mjs +24 -11
- package/dist/core/input-manager.mjs.map +1 -1
- package/dist/index.js +24 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +30 -32
package/dist/index.js
CHANGED
|
@@ -30,9 +30,6 @@ __export(index_exports, {
|
|
|
30
30
|
});
|
|
31
31
|
module.exports = __toCommonJS(index_exports);
|
|
32
32
|
|
|
33
|
-
// src/core/input-manager.ts
|
|
34
|
-
var import_diagnostics = require("@al8b/diagnostics");
|
|
35
|
-
|
|
36
33
|
// src/devices/gamepad.ts
|
|
37
34
|
var createState = /* @__PURE__ */ __name(() => ({
|
|
38
35
|
press: {},
|
|
@@ -686,8 +683,12 @@ var Input = class {
|
|
|
686
683
|
}
|
|
687
684
|
getKeyboard() {
|
|
688
685
|
if (!this.keyboard || !this.keyboard.state) {
|
|
689
|
-
|
|
690
|
-
|
|
686
|
+
this.runtime?.listener?.reportError?.({
|
|
687
|
+
code: "E7052",
|
|
688
|
+
message: "Keyboard state not available",
|
|
689
|
+
data: {
|
|
690
|
+
error: "Keyboard state not available"
|
|
691
|
+
}
|
|
691
692
|
});
|
|
692
693
|
return {};
|
|
693
694
|
}
|
|
@@ -695,8 +696,12 @@ var Input = class {
|
|
|
695
696
|
}
|
|
696
697
|
getMouse() {
|
|
697
698
|
if (!this.mouse || !this.mouse.state) {
|
|
698
|
-
|
|
699
|
-
|
|
699
|
+
this.runtime?.listener?.reportError?.({
|
|
700
|
+
code: "E7052",
|
|
701
|
+
message: "Mouse state not available",
|
|
702
|
+
data: {
|
|
703
|
+
error: "Mouse state not available"
|
|
704
|
+
}
|
|
700
705
|
});
|
|
701
706
|
return {};
|
|
702
707
|
}
|
|
@@ -704,8 +709,12 @@ var Input = class {
|
|
|
704
709
|
}
|
|
705
710
|
getTouch() {
|
|
706
711
|
if (!this.touch || !this.touch.state) {
|
|
707
|
-
|
|
708
|
-
|
|
712
|
+
this.runtime?.listener?.reportError?.({
|
|
713
|
+
code: "E7052",
|
|
714
|
+
message: "Touch state not available",
|
|
715
|
+
data: {
|
|
716
|
+
error: "Touch state not available"
|
|
717
|
+
}
|
|
709
718
|
});
|
|
710
719
|
return {};
|
|
711
720
|
}
|
|
@@ -713,8 +722,12 @@ var Input = class {
|
|
|
713
722
|
}
|
|
714
723
|
getGamepad() {
|
|
715
724
|
if (!this.gamepad || !navigator.getGamepads) {
|
|
716
|
-
|
|
717
|
-
|
|
725
|
+
this.runtime?.listener?.reportError?.({
|
|
726
|
+
code: "E7051",
|
|
727
|
+
message: "Gamepad API not available",
|
|
728
|
+
data: {
|
|
729
|
+
device: "gamepad"
|
|
730
|
+
}
|
|
718
731
|
});
|
|
719
732
|
}
|
|
720
733
|
return this.gamepad;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/input-manager.ts","../src/devices/gamepad.ts","../src/shared/constants.ts","../src/shared/utils.ts","../src/devices/keyboard.ts","../src/devices/mouse.ts","../src/devices/touch.ts"],"sourcesContent":["/**\n * @al8b/input - Modular input subsystem\n *\n * Architecture:\n * - core/: Input orchestrator\n * - devices/: Keyboard, mouse, touch, and gamepad handlers\n * - shared/: Cross-device helpers\n * - types/: Shared state definitions\n */\n\nexport {\n\tInput,\n\tInput as default,\n} from \"./core/input-manager\";\nexport { GamepadInput } from \"./devices/gamepad\";\nexport { KeyboardInput } from \"./devices/keyboard\";\nexport { MouseInput } from \"./devices/mouse\";\nexport { TouchInput } from \"./devices/touch\";\nexport * from \"./types\";\n","import { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { GamepadInput } from \"../devices/gamepad\";\nimport { KeyboardInput } from \"../devices/keyboard\";\nimport { MouseInput } from \"../devices/mouse\";\nimport { TouchInput } from \"../devices/touch\";\nimport type { KeyboardState, MouseState, TouchState } from \"../types\";\n\n/**\n * Input manager - orchestrates keyboard, mouse, touch, and gamepad handlers.\n */\nexport class Input {\n\tprivate readonly keyboard: KeyboardInput;\n\tprivate readonly mouse: MouseInput;\n\tprivate readonly touch: TouchInput;\n\tprivate readonly gamepad: GamepadInput;\n\tprivate runtime?: any;\n\n\tconstructor(canvas?: HTMLCanvasElement, runtime?: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput(canvas);\n\t\tthis.touch = new TouchInput(this.mouse, canvas);\n\t\tthis.gamepad = new GamepadInput();\n\t}\n\n\t/**\n\t * Poll all devices for state updates.\n\t */\n\tpublic update(): void {\n\t\tthis.keyboard.update();\n\t\tthis.mouse.update();\n\t\tthis.touch.update();\n\t\tthis.gamepad.update();\n\t}\n\n\tpublic getKeyboard(): KeyboardState {\n\t\t// Validate keyboard state exists before returning\n\t\tif (!this.keyboard || !this.keyboard.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Keyboard state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as KeyboardState;\n\t\t}\n\t\treturn this.keyboard.state;\n\t}\n\n\tpublic getMouse(): MouseState {\n\t\t// Validate mouse state exists before returning\n\t\tif (!this.mouse || !this.mouse.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Mouse state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as MouseState;\n\t\t}\n\t\treturn this.mouse.state;\n\t}\n\n\tpublic getTouch(): TouchState {\n\t\t// Validate touch state exists before returning\n\t\tif (!this.touch || !this.touch.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Touch state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as TouchState;\n\t\t}\n\t\treturn this.touch.state;\n\t}\n\n\tpublic getGamepad(): GamepadInput {\n\t\t// Check if gamepad API is available in the browser\n\t\tif (!this.gamepad || !navigator.getGamepads) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7051, { device: \"gamepad\" });\n\t\t}\n\t\treturn this.gamepad;\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\n\t}\n}\n","/**\n * Gamepad - Game controller input handling\n *\n * Provides gamepad polling and state management.\n */\n\ntype ButtonMap = Record<number, string>;\ntype BrowserGamepad = globalThis.Gamepad;\n\ninterface StateMap extends Record<string, any> {\n\tpress: Record<string, number>;\n\trelease: Record<string, number>;\n}\n\nconst createState = (): StateMap => ({\n\tpress: {},\n\trelease: {},\n});\n\nconst BUTTONS_MAP: ButtonMap = {\n\t0: \"A\",\n\t1: \"B\",\n\t2: \"X\",\n\t3: \"Y\",\n\t4: \"LB\",\n\t5: \"RB\",\n\t8: \"VIEW\",\n\t9: \"MENU\",\n\t10: \"LS\",\n\t11: \"RS\",\n\t12: \"DPAD_UP\",\n\t13: \"DPAD_DOWN\",\n\t14: \"DPAD_LEFT\",\n\t15: \"DPAD_RIGHT\",\n};\n\nconst TRIGGERS_MAP: ButtonMap = {\n\t6: \"LT\",\n\t7: \"RT\",\n};\n\nconst ensureState = (state?: StateMap): StateMap => {\n\tif (!state) {\n\t\treturn createState();\n\t}\n\tstate.press ??= {};\n\tstate.release ??= {};\n\treturn state;\n};\n\nexport class GamepadInput {\n\tpublic status: StateMap & Record<number, StateMap>;\n\tpublic previous: {\n\t\tglobal: StateMap;\n\t} & Record<number, StateMap>;\n\tpublic count = 0;\n\n\tconstructor() {\n\t\tthis.status = createState();\n\t\tthis.previous = {\n\t\t\tglobal: createState(),\n\t\t};\n\t}\n\n\tupdate(): void {\n\t\tconst pads = this.getGamepads();\n\t\tif (!pads) {\n\t\t\tthis.count = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tlet padCount = 0;\n\t\tfor (let i = 0; i < pads.length; i++) {\n\t\t\tconst pad = pads[i];\n\t\t\tif (!pad) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpadCount++;\n\t\t\tthis.status[i] = ensureState(this.status[i]);\n\t\t\tthis.previous[i] = ensureState(this.previous[i]);\n\n\t\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[i][name] = button.pressed ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst trigger = pad.buttons[idx];\n\t\t\t\tif (trigger) {\n\t\t\t\t\tthis.status[i][name] = trigger.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pad.axes.length >= 2) {\n\t\t\t\tthis.updateStick(pad.axes[0], -pad.axes[1], this.status[i], \"LEFT\");\n\t\t\t}\n\t\t\tif (pad.axes.length >= 4) {\n\t\t\t\tthis.updateStick(pad.axes[2], -pad.axes[3], this.status[i], \"RIGHT\");\n\t\t\t}\n\t\t}\n\n\t\tthis.aggregateStatus(pads, padCount);\n\t\tthis.count = padCount;\n\t\tthis.updateChanges(this.status, this.previous.global);\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tthis.updateChanges(this.status[i], this.previous[i]);\n\t\t}\n\n\t\tfor (let i = padCount; i < 4; i++) {\n\t\t\tdelete this.status[i];\n\t\t\tdelete this.previous[i];\n\t\t}\n\t}\n\n\tprivate getGamepads(): (BrowserGamepad | null)[] | null {\n\t\tif (typeof navigator === \"undefined\" || !navigator.getGamepads) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn navigator.getGamepads();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate updateStick(x: number, y: number, target: StateMap, prefix: \"LEFT\" | \"RIGHT\"): void {\n\t\tconst radius = Math.sqrt(x * x + y * y);\n\t\tconst angle = Math.floor((((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2)) / (Math.PI * 2)) * 360);\n\t\ttarget[`${prefix}_STICK_ANGLE`] = angle;\n\t\ttarget[`${prefix}_STICK_AMOUNT`] = radius;\n\t\ttarget[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;\n\t}\n\n\tprivate aggregateStatus(pads: (BrowserGamepad | null)[], padCount: number): void {\n\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tif (pad.buttons[idx]?.pressed) {\n\t\t\t\t\tthis.status[name] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[name] = button.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.status.UP = 0;\n\t\tthis.status.DOWN = 0;\n\t\tthis.status.LEFT = 0;\n\t\tthis.status.RIGHT = 0;\n\t\tthis.status.LEFT_STICK_UP = 0;\n\t\tthis.status.LEFT_STICK_DOWN = 0;\n\t\tthis.status.LEFT_STICK_LEFT = 0;\n\t\tthis.status.LEFT_STICK_RIGHT = 0;\n\t\tthis.status.RIGHT_STICK_UP = 0;\n\t\tthis.status.RIGHT_STICK_DOWN = 0;\n\t\tthis.status.RIGHT_STICK_LEFT = 0;\n\t\tthis.status.RIGHT_STICK_RIGHT = 0;\n\t\tthis.status.LEFT_STICK_ANGLE = 0;\n\t\tthis.status.LEFT_STICK_AMOUNT = 0;\n\t\tthis.status.RIGHT_STICK_ANGLE = 0;\n\t\tthis.status.RIGHT_STICK_AMOUNT = 0;\n\t\tthis.status.RT = 0;\n\t\tthis.status.LT = 0;\n\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tconst padState = this.status[i];\n\t\t\tif (!padState) continue;\n\n\t\t\tpadState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;\n\t\t\tpadState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;\n\t\t\tpadState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;\n\t\t\tpadState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;\n\n\t\t\tif (padState.UP) this.status.UP = 1;\n\t\t\tif (padState.DOWN) this.status.DOWN = 1;\n\t\t\tif (padState.LEFT) this.status.LEFT = 1;\n\t\t\tif (padState.RIGHT) this.status.RIGHT = 1;\n\n\t\t\tif (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;\n\t\t\tif (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;\n\t\t\tif (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;\n\t\t\tif (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;\n\t\t\tif (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;\n\t\t\tif (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;\n\t\t\tif (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;\n\t\t\tif (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;\n\t\t\tif (padState.LT) this.status.LT = padState.LT;\n\t\t\tif (padState.RT) this.status.RT = padState.RT;\n\n\t\t\tif ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;\n\t\t\t\tthis.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;\n\t\t\t}\n\t\t\tif ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;\n\t\t\t\tthis.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateChanges(current: StateMap, previous: StateMap): void {\n\t\tfor (const key in current.press) {\n\t\t\tcurrent.press[key] = 0;\n\t\t}\n\t\tfor (const key in current.release) {\n\t\t\tcurrent.release[key] = 0;\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (previous[key] && !current[key]) {\n\t\t\t\tcurrent.release[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (current[key] && !previous[key]) {\n\t\t\t\tcurrent.press[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = 0;\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = current[key];\n\t\t}\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { PREVENT_DEFAULT_REGEX } from \"../shared/constants\";\nimport { hasDocument } from \"../shared/utils\";\nimport type { KeyboardState } from \"../types\";\n\nexport class KeyboardInput {\n\tpublic readonly state: KeyboardState = {\n\t\tpress: {},\n\t\trelease: {},\n\t\tUP: 0,\n\t\tDOWN: 0,\n\t\tLEFT: 0,\n\t\tRIGHT: 0,\n\t};\n\n\tprivate previous: Record<string, number> = {};\n\n\t// Track only keys that changed since last update() — avoids O(n) iteration of all keys\n\tprivate dirtyKeys: Set<string> = new Set();\n\n\tconstructor(target: Document = hasDocument ? document : (undefined as any)) {\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.addEventListener(\"keydown\", (event) => this.handleKeyDown(event));\n\t\ttarget.addEventListener(\"keyup\", (event) => this.handleKeyUp(event));\n\t}\n\n\tprivate convertCode(code: string): string {\n\t\tlet res = \"\";\n\t\tlet low = false;\n\t\tfor (let i = 0; i < code.length; i++) {\n\t\t\tconst c = code.charAt(i);\n\t\t\tif (c === c.toUpperCase() && low) {\n\t\t\t\tres += \"_\";\n\t\t\t\tlow = false;\n\t\t\t} else {\n\t\t\t\tlow = true;\n\t\t\t}\n\t\t\tres += c.toUpperCase();\n\t\t}\n\t\treturn res;\n\t}\n\n\tprivate handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!(event.altKey || event.ctrlKey || event.metaKey || PREVENT_DEFAULT_REGEX.test(event.key))) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 1;\n\t\tthis.state[upperKey] = 1;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate handleKeyUp(event: KeyboardEvent): void {\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 0;\n\t\tthis.state[upperKey] = 0;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate updateDirectional(): void {\n\t\tthis.state.UP = (this.state.KEY_W as number) || (this.state.ARROW_UP as number) || 0;\n\t\tthis.state.DOWN = (this.state.KEY_S as number) || (this.state.ARROW_DOWN as number) || 0;\n\t\tthis.state.LEFT = (this.state.KEY_A as number) || (this.state.ARROW_LEFT as number) || 0;\n\t\tthis.state.RIGHT = (this.state.KEY_D as number) || (this.state.ARROW_RIGHT as number) || 0;\n\t}\n\n\tpublic update(): void {\n\t\t// Clear previous press/release state only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tif (this.state.press[key]) this.state.press[key] = 0;\n\t\t\tif (this.state.release[key]) this.state.release[key] = 0;\n\t\t}\n\n\t\t// Detect press/release transitions only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tconst current = this.state[key] as number;\n\t\t\tconst prev = this.previous[key] || 0;\n\n\t\t\tif (current && !prev) {\n\t\t\t\tthis.state.press[key] = 1;\n\t\t\t} else if (!current && prev) {\n\t\t\t\tthis.state.release[key] = 1;\n\t\t\t}\n\n\t\t\tthis.previous[key] = current;\n\t\t}\n\n\t\tthis.dirtyKeys.clear();\n\t}\n\n\tpublic reset(): void {\n\t\tfor (const key in this.state) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tthis.state[key] = 0;\n\t\t}\n\t\tfor (const key in this.previous) {\n\t\t\tthis.previous[key] = 0;\n\t\t}\n\t\tthis.dirtyKeys.clear();\n\t}\n}\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n"],"mappings":"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","names":["createState","press","release","BUTTONS_MAP","TRIGGERS_MAP","ensureState","state","GamepadInput","status","previous","count","global","update","pads","getGamepads","padCount","i","length","pad","index","name","Object","entries","idx","Number","button","buttons","pressed","trigger","value","axes","updateStick","aggregateStatus","updateChanges","navigator","x","y","target","prefix","radius","Math","sqrt","angle","floor","atan2","PI","UP","DOWN","LEFT","RIGHT","LEFT_STICK_UP","LEFT_STICK_DOWN","LEFT_STICK_LEFT","LEFT_STICK_RIGHT","RIGHT_STICK_UP","RIGHT_STICK_DOWN","RIGHT_STICK_LEFT","RIGHT_STICK_RIGHT","LEFT_STICK_ANGLE","LEFT_STICK_AMOUNT","RIGHT_STICK_ANGLE","RIGHT_STICK_AMOUNT","RT","LT","padState","DPAD_UP","DPAD_DOWN","DPAD_LEFT","DPAD_RIGHT","current","key","NORMALIZED_SCALE","OUT_OF_BOUNDS","PREVENT_DEFAULT_REGEX","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","KeyboardInput","state","press","release","UP","DOWN","LEFT","RIGHT","previous","dirtyKeys","Set","target","hasDocument","document","undefined","addEventListener","event","handleKeyDown","handleKeyUp","convertCode","code","res","low","i","length","c","charAt","toUpperCase","altKey","ctrlKey","metaKey","PREVENT_DEFAULT_REGEX","test","key","preventDefault","codeKey","upperKey","add","updateDirectional","KEY_W","ARROW_UP","KEY_S","ARROW_DOWN","KEY_A","ARROW_LEFT","KEY_D","ARROW_RIGHT","update","current","prev","clear","reset","MouseInput","state","x","OUT_OF_BOUNDS","y","pressed","left","middle","right","press","release","wheel","previousPressed","canvas","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","update","hasDocument","target","document","onDown","event","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","addEventListener","passive","removeEventListener","undefined","preventDefault","computeRelativePosition","clientX","clientY","button","Math","min","wheelEvent","deltaY","wheelDelta","detail","TouchInput","state","touching","x","y","press","release","touches","Map","previousTouching","canvas","removeListeners","mouse","setCanvas","detach","attach","update","syncMouseTouch","list","id","entries","push","size","mouseState","pressed","set","TOUCH_MOUSE_ID","delete","hasDocument","onStart","event","handleTouchStart","onMove","handleTouchMove","onEnd","handleTouchEnd","document","addEventListener","passive","removeEventListener","undefined","clear","preventDefault","stopPropagation","i","changedTouches","length","t","computeRelativePosition","clientX","clientY","identifier","syncFromTouch","has","Input","keyboard","mouse","touch","gamepad","runtime","canvas","KeyboardInput","MouseInput","TouchInput","GamepadInput","update","getKeyboard","state","reportRuntimeError","listener","APIErrorCode","E7052","error","getMouse","getTouch","getGamepad","navigator","getGamepads","E7051","device","setCanvas"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/devices/gamepad.ts","../src/shared/constants.ts","../src/shared/utils.ts","../src/devices/keyboard.ts","../src/devices/mouse.ts","../src/devices/touch.ts","../src/core/input-manager.ts"],"sourcesContent":["/**\n * @al8b/input - Modular input subsystem\n *\n * Architecture:\n * - core/: Input orchestrator\n * - devices/: Keyboard, mouse, touch, and gamepad handlers\n * - shared/: Cross-device helpers\n * - types/: Shared state definitions\n */\n\nexport {\n\tInput,\n\tInput as default,\n} from \"./core/input-manager\";\nexport { GamepadInput } from \"./devices/gamepad\";\nexport { KeyboardInput } from \"./devices/keyboard\";\nexport { MouseInput } from \"./devices/mouse\";\nexport { TouchInput } from \"./devices/touch\";\nexport * from \"./types\";\n","/**\n * Gamepad - Game controller input handling\n *\n * Provides gamepad polling and state management.\n */\n\ntype ButtonMap = Record<number, string>;\ntype BrowserGamepad = globalThis.Gamepad;\n\ninterface StateMap extends Record<string, any> {\n\tpress: Record<string, number>;\n\trelease: Record<string, number>;\n}\n\nconst createState = (): StateMap => ({\n\tpress: {},\n\trelease: {},\n});\n\nconst BUTTONS_MAP: ButtonMap = {\n\t0: \"A\",\n\t1: \"B\",\n\t2: \"X\",\n\t3: \"Y\",\n\t4: \"LB\",\n\t5: \"RB\",\n\t8: \"VIEW\",\n\t9: \"MENU\",\n\t10: \"LS\",\n\t11: \"RS\",\n\t12: \"DPAD_UP\",\n\t13: \"DPAD_DOWN\",\n\t14: \"DPAD_LEFT\",\n\t15: \"DPAD_RIGHT\",\n};\n\nconst TRIGGERS_MAP: ButtonMap = {\n\t6: \"LT\",\n\t7: \"RT\",\n};\n\nconst ensureState = (state?: StateMap): StateMap => {\n\tif (!state) {\n\t\treturn createState();\n\t}\n\tstate.press ??= {};\n\tstate.release ??= {};\n\treturn state;\n};\n\nexport class GamepadInput {\n\tpublic status: StateMap & Record<number, StateMap>;\n\tpublic previous: {\n\t\tglobal: StateMap;\n\t} & Record<number, StateMap>;\n\tpublic count = 0;\n\n\tconstructor() {\n\t\tthis.status = createState();\n\t\tthis.previous = {\n\t\t\tglobal: createState(),\n\t\t};\n\t}\n\n\tupdate(): void {\n\t\tconst pads = this.getGamepads();\n\t\tif (!pads) {\n\t\t\tthis.count = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tlet padCount = 0;\n\t\tfor (let i = 0; i < pads.length; i++) {\n\t\t\tconst pad = pads[i];\n\t\t\tif (!pad) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpadCount++;\n\t\t\tthis.status[i] = ensureState(this.status[i]);\n\t\t\tthis.previous[i] = ensureState(this.previous[i]);\n\n\t\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[i][name] = button.pressed ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst trigger = pad.buttons[idx];\n\t\t\t\tif (trigger) {\n\t\t\t\t\tthis.status[i][name] = trigger.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pad.axes.length >= 2) {\n\t\t\t\tthis.updateStick(pad.axes[0], -pad.axes[1], this.status[i], \"LEFT\");\n\t\t\t}\n\t\t\tif (pad.axes.length >= 4) {\n\t\t\t\tthis.updateStick(pad.axes[2], -pad.axes[3], this.status[i], \"RIGHT\");\n\t\t\t}\n\t\t}\n\n\t\tthis.aggregateStatus(pads, padCount);\n\t\tthis.count = padCount;\n\t\tthis.updateChanges(this.status, this.previous.global);\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tthis.updateChanges(this.status[i], this.previous[i]);\n\t\t}\n\n\t\tfor (let i = padCount; i < 4; i++) {\n\t\t\tdelete this.status[i];\n\t\t\tdelete this.previous[i];\n\t\t}\n\t}\n\n\tprivate getGamepads(): (BrowserGamepad | null)[] | null {\n\t\tif (typeof navigator === \"undefined\" || !navigator.getGamepads) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn navigator.getGamepads();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate updateStick(x: number, y: number, target: StateMap, prefix: \"LEFT\" | \"RIGHT\"): void {\n\t\tconst radius = Math.sqrt(x * x + y * y);\n\t\tconst angle = Math.floor((((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2)) / (Math.PI * 2)) * 360);\n\t\ttarget[`${prefix}_STICK_ANGLE`] = angle;\n\t\ttarget[`${prefix}_STICK_AMOUNT`] = radius;\n\t\ttarget[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;\n\t}\n\n\tprivate aggregateStatus(pads: (BrowserGamepad | null)[], padCount: number): void {\n\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tif (pad.buttons[idx]?.pressed) {\n\t\t\t\t\tthis.status[name] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[name] = button.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.status.UP = 0;\n\t\tthis.status.DOWN = 0;\n\t\tthis.status.LEFT = 0;\n\t\tthis.status.RIGHT = 0;\n\t\tthis.status.LEFT_STICK_UP = 0;\n\t\tthis.status.LEFT_STICK_DOWN = 0;\n\t\tthis.status.LEFT_STICK_LEFT = 0;\n\t\tthis.status.LEFT_STICK_RIGHT = 0;\n\t\tthis.status.RIGHT_STICK_UP = 0;\n\t\tthis.status.RIGHT_STICK_DOWN = 0;\n\t\tthis.status.RIGHT_STICK_LEFT = 0;\n\t\tthis.status.RIGHT_STICK_RIGHT = 0;\n\t\tthis.status.LEFT_STICK_ANGLE = 0;\n\t\tthis.status.LEFT_STICK_AMOUNT = 0;\n\t\tthis.status.RIGHT_STICK_ANGLE = 0;\n\t\tthis.status.RIGHT_STICK_AMOUNT = 0;\n\t\tthis.status.RT = 0;\n\t\tthis.status.LT = 0;\n\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tconst padState = this.status[i];\n\t\t\tif (!padState) continue;\n\n\t\t\tpadState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;\n\t\t\tpadState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;\n\t\t\tpadState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;\n\t\t\tpadState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;\n\n\t\t\tif (padState.UP) this.status.UP = 1;\n\t\t\tif (padState.DOWN) this.status.DOWN = 1;\n\t\t\tif (padState.LEFT) this.status.LEFT = 1;\n\t\t\tif (padState.RIGHT) this.status.RIGHT = 1;\n\n\t\t\tif (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;\n\t\t\tif (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;\n\t\t\tif (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;\n\t\t\tif (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;\n\t\t\tif (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;\n\t\t\tif (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;\n\t\t\tif (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;\n\t\t\tif (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;\n\t\t\tif (padState.LT) this.status.LT = padState.LT;\n\t\t\tif (padState.RT) this.status.RT = padState.RT;\n\n\t\t\tif ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;\n\t\t\t\tthis.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;\n\t\t\t}\n\t\t\tif ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;\n\t\t\t\tthis.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateChanges(current: StateMap, previous: StateMap): void {\n\t\tfor (const key in current.press) {\n\t\t\tcurrent.press[key] = 0;\n\t\t}\n\t\tfor (const key in current.release) {\n\t\t\tcurrent.release[key] = 0;\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (previous[key] && !current[key]) {\n\t\t\t\tcurrent.release[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (current[key] && !previous[key]) {\n\t\t\t\tcurrent.press[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = 0;\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = current[key];\n\t\t}\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { PREVENT_DEFAULT_REGEX } from \"../shared/constants\";\nimport { hasDocument } from \"../shared/utils\";\nimport type { KeyboardState } from \"../types\";\n\nexport class KeyboardInput {\n\tpublic readonly state: KeyboardState = {\n\t\tpress: {},\n\t\trelease: {},\n\t\tUP: 0,\n\t\tDOWN: 0,\n\t\tLEFT: 0,\n\t\tRIGHT: 0,\n\t};\n\n\tprivate previous: Record<string, number> = {};\n\n\t// Track only keys that changed since last update() — avoids O(n) iteration of all keys\n\tprivate dirtyKeys: Set<string> = new Set();\n\n\tconstructor(target: Document = hasDocument ? document : (undefined as any)) {\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.addEventListener(\"keydown\", (event) => this.handleKeyDown(event));\n\t\ttarget.addEventListener(\"keyup\", (event) => this.handleKeyUp(event));\n\t}\n\n\tprivate convertCode(code: string): string {\n\t\tlet res = \"\";\n\t\tlet low = false;\n\t\tfor (let i = 0; i < code.length; i++) {\n\t\t\tconst c = code.charAt(i);\n\t\t\tif (c === c.toUpperCase() && low) {\n\t\t\t\tres += \"_\";\n\t\t\t\tlow = false;\n\t\t\t} else {\n\t\t\t\tlow = true;\n\t\t\t}\n\t\t\tres += c.toUpperCase();\n\t\t}\n\t\treturn res;\n\t}\n\n\tprivate handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!(event.altKey || event.ctrlKey || event.metaKey || PREVENT_DEFAULT_REGEX.test(event.key))) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 1;\n\t\tthis.state[upperKey] = 1;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate handleKeyUp(event: KeyboardEvent): void {\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 0;\n\t\tthis.state[upperKey] = 0;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate updateDirectional(): void {\n\t\tthis.state.UP = (this.state.KEY_W as number) || (this.state.ARROW_UP as number) || 0;\n\t\tthis.state.DOWN = (this.state.KEY_S as number) || (this.state.ARROW_DOWN as number) || 0;\n\t\tthis.state.LEFT = (this.state.KEY_A as number) || (this.state.ARROW_LEFT as number) || 0;\n\t\tthis.state.RIGHT = (this.state.KEY_D as number) || (this.state.ARROW_RIGHT as number) || 0;\n\t}\n\n\tpublic update(): void {\n\t\t// Clear previous press/release state only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tif (this.state.press[key]) this.state.press[key] = 0;\n\t\t\tif (this.state.release[key]) this.state.release[key] = 0;\n\t\t}\n\n\t\t// Detect press/release transitions only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tconst current = this.state[key] as number;\n\t\t\tconst prev = this.previous[key] || 0;\n\n\t\t\tif (current && !prev) {\n\t\t\t\tthis.state.press[key] = 1;\n\t\t\t} else if (!current && prev) {\n\t\t\t\tthis.state.release[key] = 1;\n\t\t\t}\n\n\t\t\tthis.previous[key] = current;\n\t\t}\n\n\t\tthis.dirtyKeys.clear();\n\t}\n\n\tpublic reset(): void {\n\t\tfor (const key in this.state) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tthis.state[key] = 0;\n\t\t}\n\t\tfor (const key in this.previous) {\n\t\t\tthis.previous[key] = 0;\n\t\t}\n\t\tthis.dirtyKeys.clear();\n\t}\n}\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n","import { GamepadInput } from \"../devices/gamepad\";\nimport { KeyboardInput } from \"../devices/keyboard\";\nimport { MouseInput } from \"../devices/mouse\";\nimport { TouchInput } from \"../devices/touch\";\nimport type { KeyboardState, MouseState, TouchState } from \"../types\";\n\n/**\n * Input manager - orchestrates keyboard, mouse, touch, and gamepad handlers.\n */\nexport class Input {\n\tprivate readonly keyboard: KeyboardInput;\n\tprivate readonly mouse: MouseInput;\n\tprivate readonly touch: TouchInput;\n\tprivate readonly gamepad: GamepadInput;\n\tprivate runtime?: any;\n\n\tconstructor(canvas?: HTMLCanvasElement, runtime?: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput(canvas);\n\t\tthis.touch = new TouchInput(this.mouse, canvas);\n\t\tthis.gamepad = new GamepadInput();\n\t}\n\n\t/**\n\t * Poll all devices for state updates.\n\t */\n\tpublic update(): void {\n\t\tthis.keyboard.update();\n\t\tthis.mouse.update();\n\t\tthis.touch.update();\n\t\tthis.gamepad.update();\n\t}\n\n\tpublic getKeyboard(): KeyboardState {\n\t\t// Validate keyboard state exists before returning\n\t\tif (!this.keyboard || !this.keyboard.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Keyboard state not available\", data: { error: \"Keyboard state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as KeyboardState;\n\t\t}\n\t\treturn this.keyboard.state;\n\t}\n\n\tpublic getMouse(): MouseState {\n\t\t// Validate mouse state exists before returning\n\t\tif (!this.mouse || !this.mouse.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Mouse state not available\", data: { error: \"Mouse state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as MouseState;\n\t\t}\n\t\treturn this.mouse.state;\n\t}\n\n\tpublic getTouch(): TouchState {\n\t\t// Validate touch state exists before returning\n\t\tif (!this.touch || !this.touch.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Touch state not available\", data: { error: \"Touch state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as TouchState;\n\t\t}\n\t\treturn this.touch.state;\n\t}\n\n\tpublic getGamepad(): GamepadInput {\n\t\t// Check if gamepad API is available in the browser\n\t\tif (!this.gamepad || !navigator.getGamepads) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7051\", message: \"Gamepad API not available\", data: { device: \"gamepad\" } });\n\t\t}\n\t\treturn this.gamepad;\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\n\t}\n}\n"],"mappings":"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","names":["createState","press","release","BUTTONS_MAP","TRIGGERS_MAP","ensureState","state","GamepadInput","status","previous","count","global","update","pads","getGamepads","padCount","i","length","pad","index","name","Object","entries","idx","Number","button","buttons","pressed","trigger","value","axes","updateStick","aggregateStatus","updateChanges","navigator","x","y","target","prefix","radius","Math","sqrt","angle","floor","atan2","PI","UP","DOWN","LEFT","RIGHT","LEFT_STICK_UP","LEFT_STICK_DOWN","LEFT_STICK_LEFT","LEFT_STICK_RIGHT","RIGHT_STICK_UP","RIGHT_STICK_DOWN","RIGHT_STICK_LEFT","RIGHT_STICK_RIGHT","LEFT_STICK_ANGLE","LEFT_STICK_AMOUNT","RIGHT_STICK_ANGLE","RIGHT_STICK_AMOUNT","RT","LT","padState","DPAD_UP","DPAD_DOWN","DPAD_LEFT","DPAD_RIGHT","current","key","NORMALIZED_SCALE","OUT_OF_BOUNDS","PREVENT_DEFAULT_REGEX","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","KeyboardInput","state","press","release","UP","DOWN","LEFT","RIGHT","previous","dirtyKeys","Set","target","hasDocument","document","undefined","addEventListener","event","handleKeyDown","handleKeyUp","convertCode","code","res","low","i","length","c","charAt","toUpperCase","altKey","ctrlKey","metaKey","PREVENT_DEFAULT_REGEX","test","key","preventDefault","codeKey","upperKey","add","updateDirectional","KEY_W","ARROW_UP","KEY_S","ARROW_DOWN","KEY_A","ARROW_LEFT","KEY_D","ARROW_RIGHT","update","current","prev","clear","reset","MouseInput","state","x","OUT_OF_BOUNDS","y","pressed","left","middle","right","press","release","wheel","previousPressed","canvas","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","update","hasDocument","target","document","onDown","event","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","addEventListener","passive","removeEventListener","undefined","preventDefault","computeRelativePosition","clientX","clientY","button","Math","min","wheelEvent","deltaY","wheelDelta","detail","TouchInput","state","touching","x","y","press","release","touches","Map","previousTouching","canvas","removeListeners","mouse","setCanvas","detach","attach","update","syncMouseTouch","list","id","entries","push","size","mouseState","pressed","set","TOUCH_MOUSE_ID","delete","hasDocument","onStart","event","handleTouchStart","onMove","handleTouchMove","onEnd","handleTouchEnd","document","addEventListener","passive","removeEventListener","undefined","clear","preventDefault","stopPropagation","i","changedTouches","length","t","computeRelativePosition","clientX","clientY","identifier","syncFromTouch","has","Input","keyboard","mouse","touch","gamepad","runtime","canvas","KeyboardInput","MouseInput","TouchInput","GamepadInput","update","getKeyboard","state","listener","reportError","code","message","data","error","getMouse","getTouch","getGamepad","navigator","getGamepads","device","setCanvas"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
3
|
|
|
4
|
-
// src/core/input-manager.ts
|
|
5
|
-
import { APIErrorCode, reportRuntimeError } from "@al8b/diagnostics";
|
|
6
|
-
|
|
7
4
|
// src/devices/gamepad.ts
|
|
8
5
|
var createState = /* @__PURE__ */ __name(() => ({
|
|
9
6
|
press: {},
|
|
@@ -657,8 +654,12 @@ var Input = class {
|
|
|
657
654
|
}
|
|
658
655
|
getKeyboard() {
|
|
659
656
|
if (!this.keyboard || !this.keyboard.state) {
|
|
660
|
-
|
|
661
|
-
|
|
657
|
+
this.runtime?.listener?.reportError?.({
|
|
658
|
+
code: "E7052",
|
|
659
|
+
message: "Keyboard state not available",
|
|
660
|
+
data: {
|
|
661
|
+
error: "Keyboard state not available"
|
|
662
|
+
}
|
|
662
663
|
});
|
|
663
664
|
return {};
|
|
664
665
|
}
|
|
@@ -666,8 +667,12 @@ var Input = class {
|
|
|
666
667
|
}
|
|
667
668
|
getMouse() {
|
|
668
669
|
if (!this.mouse || !this.mouse.state) {
|
|
669
|
-
|
|
670
|
-
|
|
670
|
+
this.runtime?.listener?.reportError?.({
|
|
671
|
+
code: "E7052",
|
|
672
|
+
message: "Mouse state not available",
|
|
673
|
+
data: {
|
|
674
|
+
error: "Mouse state not available"
|
|
675
|
+
}
|
|
671
676
|
});
|
|
672
677
|
return {};
|
|
673
678
|
}
|
|
@@ -675,8 +680,12 @@ var Input = class {
|
|
|
675
680
|
}
|
|
676
681
|
getTouch() {
|
|
677
682
|
if (!this.touch || !this.touch.state) {
|
|
678
|
-
|
|
679
|
-
|
|
683
|
+
this.runtime?.listener?.reportError?.({
|
|
684
|
+
code: "E7052",
|
|
685
|
+
message: "Touch state not available",
|
|
686
|
+
data: {
|
|
687
|
+
error: "Touch state not available"
|
|
688
|
+
}
|
|
680
689
|
});
|
|
681
690
|
return {};
|
|
682
691
|
}
|
|
@@ -684,8 +693,12 @@ var Input = class {
|
|
|
684
693
|
}
|
|
685
694
|
getGamepad() {
|
|
686
695
|
if (!this.gamepad || !navigator.getGamepads) {
|
|
687
|
-
|
|
688
|
-
|
|
696
|
+
this.runtime?.listener?.reportError?.({
|
|
697
|
+
code: "E7051",
|
|
698
|
+
message: "Gamepad API not available",
|
|
699
|
+
data: {
|
|
700
|
+
device: "gamepad"
|
|
701
|
+
}
|
|
689
702
|
});
|
|
690
703
|
}
|
|
691
704
|
return this.gamepad;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/input-manager.ts","../src/devices/gamepad.ts","../src/shared/constants.ts","../src/shared/utils.ts","../src/devices/keyboard.ts","../src/devices/mouse.ts","../src/devices/touch.ts"],"sourcesContent":["import { APIErrorCode, reportRuntimeError } from \"@al8b/diagnostics\";\nimport { GamepadInput } from \"../devices/gamepad\";\nimport { KeyboardInput } from \"../devices/keyboard\";\nimport { MouseInput } from \"../devices/mouse\";\nimport { TouchInput } from \"../devices/touch\";\nimport type { KeyboardState, MouseState, TouchState } from \"../types\";\n\n/**\n * Input manager - orchestrates keyboard, mouse, touch, and gamepad handlers.\n */\nexport class Input {\n\tprivate readonly keyboard: KeyboardInput;\n\tprivate readonly mouse: MouseInput;\n\tprivate readonly touch: TouchInput;\n\tprivate readonly gamepad: GamepadInput;\n\tprivate runtime?: any;\n\n\tconstructor(canvas?: HTMLCanvasElement, runtime?: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput(canvas);\n\t\tthis.touch = new TouchInput(this.mouse, canvas);\n\t\tthis.gamepad = new GamepadInput();\n\t}\n\n\t/**\n\t * Poll all devices for state updates.\n\t */\n\tpublic update(): void {\n\t\tthis.keyboard.update();\n\t\tthis.mouse.update();\n\t\tthis.touch.update();\n\t\tthis.gamepad.update();\n\t}\n\n\tpublic getKeyboard(): KeyboardState {\n\t\t// Validate keyboard state exists before returning\n\t\tif (!this.keyboard || !this.keyboard.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Keyboard state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as KeyboardState;\n\t\t}\n\t\treturn this.keyboard.state;\n\t}\n\n\tpublic getMouse(): MouseState {\n\t\t// Validate mouse state exists before returning\n\t\tif (!this.mouse || !this.mouse.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Mouse state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as MouseState;\n\t\t}\n\t\treturn this.mouse.state;\n\t}\n\n\tpublic getTouch(): TouchState {\n\t\t// Validate touch state exists before returning\n\t\tif (!this.touch || !this.touch.state) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7052, { error: \"Touch state not available\" });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as TouchState;\n\t\t}\n\t\treturn this.touch.state;\n\t}\n\n\tpublic getGamepad(): GamepadInput {\n\t\t// Check if gamepad API is available in the browser\n\t\tif (!this.gamepad || !navigator.getGamepads) {\n\t\t\treportRuntimeError(this.runtime?.listener, APIErrorCode.E7051, { device: \"gamepad\" });\n\t\t}\n\t\treturn this.gamepad;\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\n\t}\n}\n","/**\n * Gamepad - Game controller input handling\n *\n * Provides gamepad polling and state management.\n */\n\ntype ButtonMap = Record<number, string>;\ntype BrowserGamepad = globalThis.Gamepad;\n\ninterface StateMap extends Record<string, any> {\n\tpress: Record<string, number>;\n\trelease: Record<string, number>;\n}\n\nconst createState = (): StateMap => ({\n\tpress: {},\n\trelease: {},\n});\n\nconst BUTTONS_MAP: ButtonMap = {\n\t0: \"A\",\n\t1: \"B\",\n\t2: \"X\",\n\t3: \"Y\",\n\t4: \"LB\",\n\t5: \"RB\",\n\t8: \"VIEW\",\n\t9: \"MENU\",\n\t10: \"LS\",\n\t11: \"RS\",\n\t12: \"DPAD_UP\",\n\t13: \"DPAD_DOWN\",\n\t14: \"DPAD_LEFT\",\n\t15: \"DPAD_RIGHT\",\n};\n\nconst TRIGGERS_MAP: ButtonMap = {\n\t6: \"LT\",\n\t7: \"RT\",\n};\n\nconst ensureState = (state?: StateMap): StateMap => {\n\tif (!state) {\n\t\treturn createState();\n\t}\n\tstate.press ??= {};\n\tstate.release ??= {};\n\treturn state;\n};\n\nexport class GamepadInput {\n\tpublic status: StateMap & Record<number, StateMap>;\n\tpublic previous: {\n\t\tglobal: StateMap;\n\t} & Record<number, StateMap>;\n\tpublic count = 0;\n\n\tconstructor() {\n\t\tthis.status = createState();\n\t\tthis.previous = {\n\t\t\tglobal: createState(),\n\t\t};\n\t}\n\n\tupdate(): void {\n\t\tconst pads = this.getGamepads();\n\t\tif (!pads) {\n\t\t\tthis.count = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tlet padCount = 0;\n\t\tfor (let i = 0; i < pads.length; i++) {\n\t\t\tconst pad = pads[i];\n\t\t\tif (!pad) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpadCount++;\n\t\t\tthis.status[i] = ensureState(this.status[i]);\n\t\t\tthis.previous[i] = ensureState(this.previous[i]);\n\n\t\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[i][name] = button.pressed ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst trigger = pad.buttons[idx];\n\t\t\t\tif (trigger) {\n\t\t\t\t\tthis.status[i][name] = trigger.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pad.axes.length >= 2) {\n\t\t\t\tthis.updateStick(pad.axes[0], -pad.axes[1], this.status[i], \"LEFT\");\n\t\t\t}\n\t\t\tif (pad.axes.length >= 4) {\n\t\t\t\tthis.updateStick(pad.axes[2], -pad.axes[3], this.status[i], \"RIGHT\");\n\t\t\t}\n\t\t}\n\n\t\tthis.aggregateStatus(pads, padCount);\n\t\tthis.count = padCount;\n\t\tthis.updateChanges(this.status, this.previous.global);\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tthis.updateChanges(this.status[i], this.previous[i]);\n\t\t}\n\n\t\tfor (let i = padCount; i < 4; i++) {\n\t\t\tdelete this.status[i];\n\t\t\tdelete this.previous[i];\n\t\t}\n\t}\n\n\tprivate getGamepads(): (BrowserGamepad | null)[] | null {\n\t\tif (typeof navigator === \"undefined\" || !navigator.getGamepads) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn navigator.getGamepads();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate updateStick(x: number, y: number, target: StateMap, prefix: \"LEFT\" | \"RIGHT\"): void {\n\t\tconst radius = Math.sqrt(x * x + y * y);\n\t\tconst angle = Math.floor((((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2)) / (Math.PI * 2)) * 360);\n\t\ttarget[`${prefix}_STICK_ANGLE`] = angle;\n\t\ttarget[`${prefix}_STICK_AMOUNT`] = radius;\n\t\ttarget[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;\n\t}\n\n\tprivate aggregateStatus(pads: (BrowserGamepad | null)[], padCount: number): void {\n\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tif (pad.buttons[idx]?.pressed) {\n\t\t\t\t\tthis.status[name] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[name] = button.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.status.UP = 0;\n\t\tthis.status.DOWN = 0;\n\t\tthis.status.LEFT = 0;\n\t\tthis.status.RIGHT = 0;\n\t\tthis.status.LEFT_STICK_UP = 0;\n\t\tthis.status.LEFT_STICK_DOWN = 0;\n\t\tthis.status.LEFT_STICK_LEFT = 0;\n\t\tthis.status.LEFT_STICK_RIGHT = 0;\n\t\tthis.status.RIGHT_STICK_UP = 0;\n\t\tthis.status.RIGHT_STICK_DOWN = 0;\n\t\tthis.status.RIGHT_STICK_LEFT = 0;\n\t\tthis.status.RIGHT_STICK_RIGHT = 0;\n\t\tthis.status.LEFT_STICK_ANGLE = 0;\n\t\tthis.status.LEFT_STICK_AMOUNT = 0;\n\t\tthis.status.RIGHT_STICK_ANGLE = 0;\n\t\tthis.status.RIGHT_STICK_AMOUNT = 0;\n\t\tthis.status.RT = 0;\n\t\tthis.status.LT = 0;\n\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tconst padState = this.status[i];\n\t\t\tif (!padState) continue;\n\n\t\t\tpadState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;\n\t\t\tpadState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;\n\t\t\tpadState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;\n\t\t\tpadState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;\n\n\t\t\tif (padState.UP) this.status.UP = 1;\n\t\t\tif (padState.DOWN) this.status.DOWN = 1;\n\t\t\tif (padState.LEFT) this.status.LEFT = 1;\n\t\t\tif (padState.RIGHT) this.status.RIGHT = 1;\n\n\t\t\tif (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;\n\t\t\tif (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;\n\t\t\tif (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;\n\t\t\tif (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;\n\t\t\tif (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;\n\t\t\tif (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;\n\t\t\tif (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;\n\t\t\tif (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;\n\t\t\tif (padState.LT) this.status.LT = padState.LT;\n\t\t\tif (padState.RT) this.status.RT = padState.RT;\n\n\t\t\tif ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;\n\t\t\t\tthis.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;\n\t\t\t}\n\t\t\tif ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;\n\t\t\t\tthis.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateChanges(current: StateMap, previous: StateMap): void {\n\t\tfor (const key in current.press) {\n\t\t\tcurrent.press[key] = 0;\n\t\t}\n\t\tfor (const key in current.release) {\n\t\t\tcurrent.release[key] = 0;\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (previous[key] && !current[key]) {\n\t\t\t\tcurrent.release[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (current[key] && !previous[key]) {\n\t\t\t\tcurrent.press[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = 0;\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = current[key];\n\t\t}\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { PREVENT_DEFAULT_REGEX } from \"../shared/constants\";\nimport { hasDocument } from \"../shared/utils\";\nimport type { KeyboardState } from \"../types\";\n\nexport class KeyboardInput {\n\tpublic readonly state: KeyboardState = {\n\t\tpress: {},\n\t\trelease: {},\n\t\tUP: 0,\n\t\tDOWN: 0,\n\t\tLEFT: 0,\n\t\tRIGHT: 0,\n\t};\n\n\tprivate previous: Record<string, number> = {};\n\n\t// Track only keys that changed since last update() — avoids O(n) iteration of all keys\n\tprivate dirtyKeys: Set<string> = new Set();\n\n\tconstructor(target: Document = hasDocument ? document : (undefined as any)) {\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.addEventListener(\"keydown\", (event) => this.handleKeyDown(event));\n\t\ttarget.addEventListener(\"keyup\", (event) => this.handleKeyUp(event));\n\t}\n\n\tprivate convertCode(code: string): string {\n\t\tlet res = \"\";\n\t\tlet low = false;\n\t\tfor (let i = 0; i < code.length; i++) {\n\t\t\tconst c = code.charAt(i);\n\t\t\tif (c === c.toUpperCase() && low) {\n\t\t\t\tres += \"_\";\n\t\t\t\tlow = false;\n\t\t\t} else {\n\t\t\t\tlow = true;\n\t\t\t}\n\t\t\tres += c.toUpperCase();\n\t\t}\n\t\treturn res;\n\t}\n\n\tprivate handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!(event.altKey || event.ctrlKey || event.metaKey || PREVENT_DEFAULT_REGEX.test(event.key))) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 1;\n\t\tthis.state[upperKey] = 1;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate handleKeyUp(event: KeyboardEvent): void {\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 0;\n\t\tthis.state[upperKey] = 0;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate updateDirectional(): void {\n\t\tthis.state.UP = (this.state.KEY_W as number) || (this.state.ARROW_UP as number) || 0;\n\t\tthis.state.DOWN = (this.state.KEY_S as number) || (this.state.ARROW_DOWN as number) || 0;\n\t\tthis.state.LEFT = (this.state.KEY_A as number) || (this.state.ARROW_LEFT as number) || 0;\n\t\tthis.state.RIGHT = (this.state.KEY_D as number) || (this.state.ARROW_RIGHT as number) || 0;\n\t}\n\n\tpublic update(): void {\n\t\t// Clear previous press/release state only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tif (this.state.press[key]) this.state.press[key] = 0;\n\t\t\tif (this.state.release[key]) this.state.release[key] = 0;\n\t\t}\n\n\t\t// Detect press/release transitions only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tconst current = this.state[key] as number;\n\t\t\tconst prev = this.previous[key] || 0;\n\n\t\t\tif (current && !prev) {\n\t\t\t\tthis.state.press[key] = 1;\n\t\t\t} else if (!current && prev) {\n\t\t\t\tthis.state.release[key] = 1;\n\t\t\t}\n\n\t\t\tthis.previous[key] = current;\n\t\t}\n\n\t\tthis.dirtyKeys.clear();\n\t}\n\n\tpublic reset(): void {\n\t\tfor (const key in this.state) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tthis.state[key] = 0;\n\t\t}\n\t\tfor (const key in this.previous) {\n\t\t\tthis.previous[key] = 0;\n\t\t}\n\t\tthis.dirtyKeys.clear();\n\t}\n}\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n"],"mappings":"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","names":["APIErrorCode","reportRuntimeError","createState","press","release","BUTTONS_MAP","TRIGGERS_MAP","ensureState","state","GamepadInput","status","previous","count","global","update","pads","getGamepads","padCount","i","length","pad","index","name","Object","entries","idx","Number","button","buttons","pressed","trigger","value","axes","updateStick","aggregateStatus","updateChanges","navigator","x","y","target","prefix","radius","Math","sqrt","angle","floor","atan2","PI","UP","DOWN","LEFT","RIGHT","LEFT_STICK_UP","LEFT_STICK_DOWN","LEFT_STICK_LEFT","LEFT_STICK_RIGHT","RIGHT_STICK_UP","RIGHT_STICK_DOWN","RIGHT_STICK_LEFT","RIGHT_STICK_RIGHT","LEFT_STICK_ANGLE","LEFT_STICK_AMOUNT","RIGHT_STICK_ANGLE","RIGHT_STICK_AMOUNT","RT","LT","padState","DPAD_UP","DPAD_DOWN","DPAD_LEFT","DPAD_RIGHT","current","key","NORMALIZED_SCALE","OUT_OF_BOUNDS","PREVENT_DEFAULT_REGEX","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","KeyboardInput","state","press","release","UP","DOWN","LEFT","RIGHT","previous","dirtyKeys","Set","target","hasDocument","document","undefined","addEventListener","event","handleKeyDown","handleKeyUp","convertCode","code","res","low","i","length","c","charAt","toUpperCase","altKey","ctrlKey","metaKey","PREVENT_DEFAULT_REGEX","test","key","preventDefault","codeKey","upperKey","add","updateDirectional","KEY_W","ARROW_UP","KEY_S","ARROW_DOWN","KEY_A","ARROW_LEFT","KEY_D","ARROW_RIGHT","update","current","prev","clear","reset","MouseInput","state","x","OUT_OF_BOUNDS","y","pressed","left","middle","right","press","release","wheel","previousPressed","canvas","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","update","hasDocument","target","document","onDown","event","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","addEventListener","passive","removeEventListener","undefined","preventDefault","computeRelativePosition","clientX","clientY","button","Math","min","wheelEvent","deltaY","wheelDelta","detail","TouchInput","state","touching","x","y","press","release","touches","Map","previousTouching","canvas","removeListeners","mouse","setCanvas","detach","attach","update","syncMouseTouch","list","id","entries","push","size","mouseState","pressed","set","TOUCH_MOUSE_ID","delete","hasDocument","onStart","event","handleTouchStart","onMove","handleTouchMove","onEnd","handleTouchEnd","document","addEventListener","passive","removeEventListener","undefined","clear","preventDefault","stopPropagation","i","changedTouches","length","t","computeRelativePosition","clientX","clientY","identifier","syncFromTouch","has","Input","keyboard","mouse","touch","gamepad","runtime","canvas","KeyboardInput","MouseInput","TouchInput","GamepadInput","update","getKeyboard","state","reportRuntimeError","listener","APIErrorCode","E7052","error","getMouse","getTouch","getGamepad","navigator","getGamepads","E7051","device","setCanvas"]}
|
|
1
|
+
{"version":3,"sources":["../src/devices/gamepad.ts","../src/shared/constants.ts","../src/shared/utils.ts","../src/devices/keyboard.ts","../src/devices/mouse.ts","../src/devices/touch.ts","../src/core/input-manager.ts"],"sourcesContent":["/**\n * Gamepad - Game controller input handling\n *\n * Provides gamepad polling and state management.\n */\n\ntype ButtonMap = Record<number, string>;\ntype BrowserGamepad = globalThis.Gamepad;\n\ninterface StateMap extends Record<string, any> {\n\tpress: Record<string, number>;\n\trelease: Record<string, number>;\n}\n\nconst createState = (): StateMap => ({\n\tpress: {},\n\trelease: {},\n});\n\nconst BUTTONS_MAP: ButtonMap = {\n\t0: \"A\",\n\t1: \"B\",\n\t2: \"X\",\n\t3: \"Y\",\n\t4: \"LB\",\n\t5: \"RB\",\n\t8: \"VIEW\",\n\t9: \"MENU\",\n\t10: \"LS\",\n\t11: \"RS\",\n\t12: \"DPAD_UP\",\n\t13: \"DPAD_DOWN\",\n\t14: \"DPAD_LEFT\",\n\t15: \"DPAD_RIGHT\",\n};\n\nconst TRIGGERS_MAP: ButtonMap = {\n\t6: \"LT\",\n\t7: \"RT\",\n};\n\nconst ensureState = (state?: StateMap): StateMap => {\n\tif (!state) {\n\t\treturn createState();\n\t}\n\tstate.press ??= {};\n\tstate.release ??= {};\n\treturn state;\n};\n\nexport class GamepadInput {\n\tpublic status: StateMap & Record<number, StateMap>;\n\tpublic previous: {\n\t\tglobal: StateMap;\n\t} & Record<number, StateMap>;\n\tpublic count = 0;\n\n\tconstructor() {\n\t\tthis.status = createState();\n\t\tthis.previous = {\n\t\t\tglobal: createState(),\n\t\t};\n\t}\n\n\tupdate(): void {\n\t\tconst pads = this.getGamepads();\n\t\tif (!pads) {\n\t\t\tthis.count = 0;\n\t\t\treturn;\n\t\t}\n\n\t\tlet padCount = 0;\n\t\tfor (let i = 0; i < pads.length; i++) {\n\t\t\tconst pad = pads[i];\n\t\t\tif (!pad) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpadCount++;\n\t\t\tthis.status[i] = ensureState(this.status[i]);\n\t\t\tthis.previous[i] = ensureState(this.previous[i]);\n\n\t\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[i][name] = button.pressed ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\t\tconst idx = Number(index);\n\t\t\t\tconst trigger = pad.buttons[idx];\n\t\t\t\tif (trigger) {\n\t\t\t\t\tthis.status[i][name] = trigger.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pad.axes.length >= 2) {\n\t\t\t\tthis.updateStick(pad.axes[0], -pad.axes[1], this.status[i], \"LEFT\");\n\t\t\t}\n\t\t\tif (pad.axes.length >= 4) {\n\t\t\t\tthis.updateStick(pad.axes[2], -pad.axes[3], this.status[i], \"RIGHT\");\n\t\t\t}\n\t\t}\n\n\t\tthis.aggregateStatus(pads, padCount);\n\t\tthis.count = padCount;\n\t\tthis.updateChanges(this.status, this.previous.global);\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tthis.updateChanges(this.status[i], this.previous[i]);\n\t\t}\n\n\t\tfor (let i = padCount; i < 4; i++) {\n\t\t\tdelete this.status[i];\n\t\t\tdelete this.previous[i];\n\t\t}\n\t}\n\n\tprivate getGamepads(): (BrowserGamepad | null)[] | null {\n\t\tif (typeof navigator === \"undefined\" || !navigator.getGamepads) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\treturn navigator.getGamepads();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate updateStick(x: number, y: number, target: StateMap, prefix: \"LEFT\" | \"RIGHT\"): void {\n\t\tconst radius = Math.sqrt(x * x + y * y);\n\t\tconst angle = Math.floor((((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2)) / (Math.PI * 2)) * 360);\n\t\ttarget[`${prefix}_STICK_ANGLE`] = angle;\n\t\ttarget[`${prefix}_STICK_AMOUNT`] = radius;\n\t\ttarget[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;\n\t\ttarget[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;\n\t}\n\n\tprivate aggregateStatus(pads: (BrowserGamepad | null)[], padCount: number): void {\n\t\tfor (const [index, name] of Object.entries(BUTTONS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tif (pad.buttons[idx]?.pressed) {\n\t\t\t\t\tthis.status[name] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const [index, name] of Object.entries(TRIGGERS_MAP)) {\n\t\t\tthis.status[name] = 0;\n\t\t\tconst idx = Number(index);\n\t\t\tfor (const pad of pads) {\n\t\t\t\tif (!pad) break;\n\t\t\t\tconst button = pad.buttons[idx];\n\t\t\t\tif (button) {\n\t\t\t\t\tthis.status[name] = button.value ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.status.UP = 0;\n\t\tthis.status.DOWN = 0;\n\t\tthis.status.LEFT = 0;\n\t\tthis.status.RIGHT = 0;\n\t\tthis.status.LEFT_STICK_UP = 0;\n\t\tthis.status.LEFT_STICK_DOWN = 0;\n\t\tthis.status.LEFT_STICK_LEFT = 0;\n\t\tthis.status.LEFT_STICK_RIGHT = 0;\n\t\tthis.status.RIGHT_STICK_UP = 0;\n\t\tthis.status.RIGHT_STICK_DOWN = 0;\n\t\tthis.status.RIGHT_STICK_LEFT = 0;\n\t\tthis.status.RIGHT_STICK_RIGHT = 0;\n\t\tthis.status.LEFT_STICK_ANGLE = 0;\n\t\tthis.status.LEFT_STICK_AMOUNT = 0;\n\t\tthis.status.RIGHT_STICK_ANGLE = 0;\n\t\tthis.status.RIGHT_STICK_AMOUNT = 0;\n\t\tthis.status.RT = 0;\n\t\tthis.status.LT = 0;\n\n\t\tfor (let i = 0; i < padCount; i++) {\n\t\t\tconst padState = this.status[i];\n\t\t\tif (!padState) continue;\n\n\t\t\tpadState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;\n\t\t\tpadState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;\n\t\t\tpadState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;\n\t\t\tpadState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;\n\n\t\t\tif (padState.UP) this.status.UP = 1;\n\t\t\tif (padState.DOWN) this.status.DOWN = 1;\n\t\t\tif (padState.LEFT) this.status.LEFT = 1;\n\t\t\tif (padState.RIGHT) this.status.RIGHT = 1;\n\n\t\t\tif (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;\n\t\t\tif (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;\n\t\t\tif (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;\n\t\t\tif (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;\n\t\t\tif (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;\n\t\t\tif (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;\n\t\t\tif (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;\n\t\t\tif (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;\n\t\t\tif (padState.LT) this.status.LT = padState.LT;\n\t\t\tif (padState.RT) this.status.RT = padState.RT;\n\n\t\t\tif ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;\n\t\t\t\tthis.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;\n\t\t\t}\n\t\t\tif ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {\n\t\t\t\tthis.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;\n\t\t\t\tthis.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateChanges(current: StateMap, previous: StateMap): void {\n\t\tfor (const key in current.press) {\n\t\t\tcurrent.press[key] = 0;\n\t\t}\n\t\tfor (const key in current.release) {\n\t\t\tcurrent.release[key] = 0;\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (previous[key] && !current[key]) {\n\t\t\t\tcurrent.release[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tif (current[key] && !previous[key]) {\n\t\t\t\tcurrent.press[key] = 1;\n\t\t\t}\n\t\t}\n\t\tfor (const key in previous) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = 0;\n\t\t}\n\t\tfor (const key in current) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tprevious[key] = current[key];\n\t\t}\n\t}\n}\n","export const NORMALIZED_SCALE = 200;\nexport const OUT_OF_BOUNDS = -10000;\nexport const PREVENT_DEFAULT_REGEX = /Escape|(F\\d+)/;\nexport const TOUCH_MOUSE_ID = \"mouse\";\n","import { NORMALIZED_SCALE } from \"./constants\";\n\ninterface RelativePosition {\n\tx: number;\n\ty: number;\n}\n\nexport const hasDocument = typeof document !== \"undefined\";\n\nexport const computeRelativePosition = (\n\tcanvas: HTMLCanvasElement,\n\tclientX: number,\n\tclientY: number,\n): RelativePosition => {\n\tconst rect = canvas.getBoundingClientRect();\n\tconst min = Math.min(canvas.clientWidth, canvas.clientHeight) || 1;\n\tconst x = ((clientX - rect.left - canvas.clientWidth / 2) / min) * NORMALIZED_SCALE;\n\tconst y = ((canvas.clientHeight / 2 - (clientY - rect.top)) / min) * NORMALIZED_SCALE;\n\treturn {\n\t\tx,\n\t\ty,\n\t};\n};\n\nexport const addEventListener = <K extends keyof DocumentEventMap>(\n\ttarget: Document | HTMLElement,\n\ttype: K,\n\tlistener: (this: Document | HTMLElement, ev: DocumentEventMap[K]) => any,\n): void => {\n\ttarget.addEventListener(type, listener as EventListener, {\n\t\tpassive: false,\n\t});\n};\n","import { PREVENT_DEFAULT_REGEX } from \"../shared/constants\";\nimport { hasDocument } from \"../shared/utils\";\nimport type { KeyboardState } from \"../types\";\n\nexport class KeyboardInput {\n\tpublic readonly state: KeyboardState = {\n\t\tpress: {},\n\t\trelease: {},\n\t\tUP: 0,\n\t\tDOWN: 0,\n\t\tLEFT: 0,\n\t\tRIGHT: 0,\n\t};\n\n\tprivate previous: Record<string, number> = {};\n\n\t// Track only keys that changed since last update() — avoids O(n) iteration of all keys\n\tprivate dirtyKeys: Set<string> = new Set();\n\n\tconstructor(target: Document = hasDocument ? document : (undefined as any)) {\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\t\ttarget.addEventListener(\"keydown\", (event) => this.handleKeyDown(event));\n\t\ttarget.addEventListener(\"keyup\", (event) => this.handleKeyUp(event));\n\t}\n\n\tprivate convertCode(code: string): string {\n\t\tlet res = \"\";\n\t\tlet low = false;\n\t\tfor (let i = 0; i < code.length; i++) {\n\t\t\tconst c = code.charAt(i);\n\t\t\tif (c === c.toUpperCase() && low) {\n\t\t\t\tres += \"_\";\n\t\t\t\tlow = false;\n\t\t\t} else {\n\t\t\t\tlow = true;\n\t\t\t}\n\t\t\tres += c.toUpperCase();\n\t\t}\n\t\treturn res;\n\t}\n\n\tprivate handleKeyDown(event: KeyboardEvent): void {\n\t\tif (!(event.altKey || event.ctrlKey || event.metaKey || PREVENT_DEFAULT_REGEX.test(event.key))) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 1;\n\t\tthis.state[upperKey] = 1;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate handleKeyUp(event: KeyboardEvent): void {\n\t\tconst codeKey = this.convertCode(event.code);\n\t\tconst upperKey = event.key.toUpperCase();\n\t\tthis.state[codeKey] = 0;\n\t\tthis.state[upperKey] = 0;\n\t\tthis.dirtyKeys.add(codeKey);\n\t\tthis.dirtyKeys.add(upperKey);\n\t\tthis.updateDirectional();\n\t}\n\n\tprivate updateDirectional(): void {\n\t\tthis.state.UP = (this.state.KEY_W as number) || (this.state.ARROW_UP as number) || 0;\n\t\tthis.state.DOWN = (this.state.KEY_S as number) || (this.state.ARROW_DOWN as number) || 0;\n\t\tthis.state.LEFT = (this.state.KEY_A as number) || (this.state.ARROW_LEFT as number) || 0;\n\t\tthis.state.RIGHT = (this.state.KEY_D as number) || (this.state.ARROW_RIGHT as number) || 0;\n\t}\n\n\tpublic update(): void {\n\t\t// Clear previous press/release state only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tif (this.state.press[key]) this.state.press[key] = 0;\n\t\t\tif (this.state.release[key]) this.state.release[key] = 0;\n\t\t}\n\n\t\t// Detect press/release transitions only for dirty keys\n\t\tfor (const key of this.dirtyKeys) {\n\t\t\tconst current = this.state[key] as number;\n\t\t\tconst prev = this.previous[key] || 0;\n\n\t\t\tif (current && !prev) {\n\t\t\t\tthis.state.press[key] = 1;\n\t\t\t} else if (!current && prev) {\n\t\t\t\tthis.state.release[key] = 1;\n\t\t\t}\n\n\t\t\tthis.previous[key] = current;\n\t\t}\n\n\t\tthis.dirtyKeys.clear();\n\t}\n\n\tpublic reset(): void {\n\t\tfor (const key in this.state) {\n\t\t\tif (key === \"press\" || key === \"release\") continue;\n\t\t\tthis.state[key] = 0;\n\t\t}\n\t\tfor (const key in this.previous) {\n\t\t\tthis.previous[key] = 0;\n\t\t}\n\t\tthis.dirtyKeys.clear();\n\t}\n}\n","import { OUT_OF_BOUNDS } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { MouseState } from \"../types\";\n\ntype MouseListener = (event: MouseEvent) => void;\ntype WheelListener = (event: WheelEvent | Event) => void;\n\nexport class MouseInput {\n\tpublic readonly state: MouseState = {\n\t\tx: OUT_OF_BOUNDS,\n\t\ty: OUT_OF_BOUNDS,\n\t\tpressed: 0,\n\t\tleft: 0,\n\t\tmiddle: 0,\n\t\tright: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\twheel: 0,\n\t};\n\n\tprivate previousPressed = false;\n\tprivate wheel = 0;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(canvas?: HTMLCanvasElement) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic syncFromTouch(x: number, y: number, touching: boolean): void {\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tif (touching) {\n\t\t\tthis.state.left = 1;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 1;\n\t\t} else {\n\t\t\tthis.state.left = 0;\n\t\t\tthis.state.middle = 0;\n\t\t\tthis.state.right = 0;\n\t\t\tthis.state.pressed = 0;\n\t\t}\n\t}\n\n\tpublic update(): void {\n\t\tif (this.state.pressed && !this.previousPressed) {\n\t\t\tthis.previousPressed = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.pressed && this.previousPressed) {\n\t\t\tthis.previousPressed = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\n\t\tthis.state.wheel = this.wheel;\n\t\tthis.wheel = 0;\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) {\n\t\t\treturn;\n\t\t}\n\t\tconst target = document;\n\t\tconst onDown: MouseListener = (event) => this.handleMouseDown(event);\n\t\tconst onMove: MouseListener = (event) => this.handleMouseMove(event);\n\t\tconst onUp: MouseListener = (event) => this.handleMouseUp(event);\n\t\tconst onWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\t\tconst onDomWheel: WheelListener = (event) => this.handleWheel(event as WheelEvent);\n\n\t\ttarget.addEventListener(\"mousedown\", onDown, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousemove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mouseup\", onUp, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"mousewheel\", onWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\t\ttarget.addEventListener(\"DOMMouseScroll\", onDomWheel as EventListener, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\ttarget.removeEventListener(\"mousedown\", onDown);\n\t\t\ttarget.removeEventListener(\"mousemove\", onMove);\n\t\t\ttarget.removeEventListener(\"mouseup\", onUp);\n\t\t\ttarget.removeEventListener(\"mousewheel\", onWheel as EventListener);\n\t\t\ttarget.removeEventListener(\"DOMMouseScroll\", onDomWheel as EventListener);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t}\n\n\tprivate handleMouseDown(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 1;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 1;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleMouseMove(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t}\n\n\tprivate handleMouseUp(event: MouseEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tconst { x, y } = computeRelativePosition(this.canvas, event.clientX, event.clientY);\n\t\tthis.state.x = x;\n\t\tthis.state.y = y;\n\t\tswitch (event.button) {\n\t\t\tcase 0:\n\t\t\t\tthis.state.left = 0;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.state.middle = 0;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.state.right = 0;\n\t\t\t\tbreak;\n\t\t}\n\t\tthis.state.pressed = Math.min(1, this.state.left + this.state.right + this.state.middle);\n\t}\n\n\tprivate handleWheel(event: WheelEvent | Event): void {\n\t\tconst wheelEvent = event as WheelEvent & {\n\t\t\twheelDelta?: number;\n\t\t\tdetail?: number;\n\t\t};\n\t\tif (typeof wheelEvent.deltaY === \"number\" && wheelEvent.deltaY !== 0) {\n\t\t\tthis.wheel = wheelEvent.deltaY > 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.wheelDelta === \"number\" && wheelEvent.wheelDelta !== 0) {\n\t\t\tthis.wheel = wheelEvent.wheelDelta < 0 ? -1 : 1;\n\t\t} else if (typeof wheelEvent.detail === \"number\" && wheelEvent.detail !== 0) {\n\t\t\tthis.wheel = wheelEvent.detail > 0 ? -1 : 1;\n\t\t} else {\n\t\t\tthis.wheel = 0;\n\t\t}\n\t\tevent.preventDefault();\n\t}\n}\n","import { TOUCH_MOUSE_ID } from \"../shared/constants\";\nimport { computeRelativePosition, hasDocument } from \"../shared/utils\";\nimport type { PointerIdentifier, TouchPoint, TouchState } from \"../types\";\nimport type { MouseInput } from \"./mouse\";\n\ntype TouchListener = (event: TouchEvent) => void;\n\nexport class TouchInput {\n\tpublic readonly state: TouchState = {\n\t\ttouching: 0,\n\t\tx: 0,\n\t\ty: 0,\n\t\tpress: 0,\n\t\trelease: 0,\n\t\ttouches: [],\n\t};\n\n\tprivate touches = new Map<\n\t\tPointerIdentifier,\n\t\t{\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t}\n\t>();\n\tprivate previousTouching = false;\n\tprivate canvas?: HTMLCanvasElement;\n\tprivate removeListeners?: () => void;\n\n\tconstructor(\n\t\tprivate mouse: MouseInput,\n\t\tcanvas?: HTMLCanvasElement,\n\t) {\n\t\tif (canvas) {\n\t\t\tthis.setCanvas(canvas);\n\t\t}\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.detach();\n\t\tthis.canvas = canvas;\n\t\tthis.attach();\n\t}\n\n\tpublic update(): void {\n\t\tthis.syncMouseTouch();\n\n\t\tconst list: TouchPoint[] = [];\n\t\tfor (const [id, { x, y }] of this.touches.entries()) {\n\t\t\tlist.push({\n\t\t\t\tid,\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.state.x = x;\n\t\t\tthis.state.y = y;\n\t\t}\n\t\tthis.state.touches = list;\n\t\tthis.state.touching = this.touches.size > 0 ? 1 : 0;\n\n\t\tif (this.state.touching && !this.previousTouching) {\n\t\t\tthis.previousTouching = true;\n\t\t\tthis.state.press = 1;\n\t\t} else {\n\t\t\tthis.state.press = 0;\n\t\t}\n\n\t\tif (!this.state.touching && this.previousTouching) {\n\t\t\tthis.previousTouching = false;\n\t\t\tthis.state.release = 1;\n\t\t} else {\n\t\t\tthis.state.release = 0;\n\t\t}\n\t}\n\n\tprivate syncMouseTouch(): void {\n\t\tconst mouseState = this.mouse.state;\n\t\tif (mouseState.pressed) {\n\t\t\tthis.touches.set(TOUCH_MOUSE_ID, {\n\t\t\t\tx: mouseState.x,\n\t\t\t\ty: mouseState.y,\n\t\t\t});\n\t\t} else {\n\t\t\tthis.touches.delete(TOUCH_MOUSE_ID);\n\t\t}\n\t}\n\n\tprivate attach(): void {\n\t\tif (!hasDocument) return;\n\t\tconst onStart: TouchListener = (event) => this.handleTouchStart(event);\n\t\tconst onMove: TouchListener = (event) => this.handleTouchMove(event);\n\t\tconst onEnd: TouchListener = (event) => this.handleTouchEnd(event);\n\n\t\tdocument.addEventListener(\"touchstart\", onStart, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchmove\", onMove, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchend\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\t\tdocument.addEventListener(\"touchcancel\", onEnd, {\n\t\t\tpassive: false,\n\t\t});\n\n\t\tthis.removeListeners = () => {\n\t\t\tdocument.removeEventListener(\"touchstart\", onStart);\n\t\t\tdocument.removeEventListener(\"touchmove\", onMove);\n\t\t\tdocument.removeEventListener(\"touchend\", onEnd);\n\t\t\tdocument.removeEventListener(\"touchcancel\", onEnd);\n\t\t};\n\t}\n\n\tprivate detach(): void {\n\t\tthis.removeListeners?.();\n\t\tthis.removeListeners = undefined;\n\t\tthis.canvas = undefined;\n\t\tthis.touches.clear();\n\t}\n\n\tprivate handleTouchStart(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchMove(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tif (!this.touches.has(t.identifier)) continue;\n\t\t\tconst { x, y } = computeRelativePosition(this.canvas, t.clientX, t.clientY);\n\t\t\tthis.touches.set(t.identifier, {\n\t\t\t\tx,\n\t\t\t\ty,\n\t\t\t});\n\t\t\tthis.mouse.syncFromTouch(x, y, true);\n\t\t}\n\t}\n\n\tprivate handleTouchEnd(event: TouchEvent): void {\n\t\tif (!this.canvas) return;\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tfor (let i = 0; i < event.changedTouches.length; i++) {\n\t\t\tconst t = event.changedTouches[i];\n\t\t\tthis.touches.delete(t.identifier);\n\t\t}\n\t\tthis.mouse.syncFromTouch(this.state.x, this.state.y, false);\n\t}\n}\n","import { GamepadInput } from \"../devices/gamepad\";\nimport { KeyboardInput } from \"../devices/keyboard\";\nimport { MouseInput } from \"../devices/mouse\";\nimport { TouchInput } from \"../devices/touch\";\nimport type { KeyboardState, MouseState, TouchState } from \"../types\";\n\n/**\n * Input manager - orchestrates keyboard, mouse, touch, and gamepad handlers.\n */\nexport class Input {\n\tprivate readonly keyboard: KeyboardInput;\n\tprivate readonly mouse: MouseInput;\n\tprivate readonly touch: TouchInput;\n\tprivate readonly gamepad: GamepadInput;\n\tprivate runtime?: any;\n\n\tconstructor(canvas?: HTMLCanvasElement, runtime?: any) {\n\t\tthis.runtime = runtime;\n\t\tthis.keyboard = new KeyboardInput();\n\t\tthis.mouse = new MouseInput(canvas);\n\t\tthis.touch = new TouchInput(this.mouse, canvas);\n\t\tthis.gamepad = new GamepadInput();\n\t}\n\n\t/**\n\t * Poll all devices for state updates.\n\t */\n\tpublic update(): void {\n\t\tthis.keyboard.update();\n\t\tthis.mouse.update();\n\t\tthis.touch.update();\n\t\tthis.gamepad.update();\n\t}\n\n\tpublic getKeyboard(): KeyboardState {\n\t\t// Validate keyboard state exists before returning\n\t\tif (!this.keyboard || !this.keyboard.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Keyboard state not available\", data: { error: \"Keyboard state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as KeyboardState;\n\t\t}\n\t\treturn this.keyboard.state;\n\t}\n\n\tpublic getMouse(): MouseState {\n\t\t// Validate mouse state exists before returning\n\t\tif (!this.mouse || !this.mouse.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Mouse state not available\", data: { error: \"Mouse state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as MouseState;\n\t\t}\n\t\treturn this.mouse.state;\n\t}\n\n\tpublic getTouch(): TouchState {\n\t\t// Validate touch state exists before returning\n\t\tif (!this.touch || !this.touch.state) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7052\", message: \"Touch state not available\", data: { error: \"Touch state not available\" } });\n\t\t\t// Return empty state as fallback to prevent crashes\n\t\t\treturn {} as TouchState;\n\t\t}\n\t\treturn this.touch.state;\n\t}\n\n\tpublic getGamepad(): GamepadInput {\n\t\t// Check if gamepad API is available in the browser\n\t\tif (!this.gamepad || !navigator.getGamepads) {\n\t\t\tthis.runtime?.listener?.reportError?.({ code: \"E7051\", message: \"Gamepad API not available\", data: { device: \"gamepad\" } });\n\t\t}\n\t\treturn this.gamepad;\n\t}\n\n\tpublic setCanvas(canvas: HTMLCanvasElement): void {\n\t\tthis.mouse.setCanvas(canvas);\n\t\tthis.touch.setCanvas(canvas);\n\t}\n}\n"],"mappings":"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","names":["createState","press","release","BUTTONS_MAP","TRIGGERS_MAP","ensureState","state","GamepadInput","status","previous","count","global","update","pads","getGamepads","padCount","i","length","pad","index","name","Object","entries","idx","Number","button","buttons","pressed","trigger","value","axes","updateStick","aggregateStatus","updateChanges","navigator","x","y","target","prefix","radius","Math","sqrt","angle","floor","atan2","PI","UP","DOWN","LEFT","RIGHT","LEFT_STICK_UP","LEFT_STICK_DOWN","LEFT_STICK_LEFT","LEFT_STICK_RIGHT","RIGHT_STICK_UP","RIGHT_STICK_DOWN","RIGHT_STICK_LEFT","RIGHT_STICK_RIGHT","LEFT_STICK_ANGLE","LEFT_STICK_AMOUNT","RIGHT_STICK_ANGLE","RIGHT_STICK_AMOUNT","RT","LT","padState","DPAD_UP","DPAD_DOWN","DPAD_LEFT","DPAD_RIGHT","current","key","NORMALIZED_SCALE","OUT_OF_BOUNDS","PREVENT_DEFAULT_REGEX","TOUCH_MOUSE_ID","hasDocument","document","computeRelativePosition","canvas","clientX","clientY","rect","getBoundingClientRect","min","Math","clientWidth","clientHeight","x","left","NORMALIZED_SCALE","y","top","KeyboardInput","state","press","release","UP","DOWN","LEFT","RIGHT","previous","dirtyKeys","Set","target","hasDocument","document","undefined","addEventListener","event","handleKeyDown","handleKeyUp","convertCode","code","res","low","i","length","c","charAt","toUpperCase","altKey","ctrlKey","metaKey","PREVENT_DEFAULT_REGEX","test","key","preventDefault","codeKey","upperKey","add","updateDirectional","KEY_W","ARROW_UP","KEY_S","ARROW_DOWN","KEY_A","ARROW_LEFT","KEY_D","ARROW_RIGHT","update","current","prev","clear","reset","MouseInput","state","x","OUT_OF_BOUNDS","y","pressed","left","middle","right","press","release","wheel","previousPressed","canvas","removeListeners","setCanvas","detach","attach","syncFromTouch","touching","update","hasDocument","target","document","onDown","event","handleMouseDown","onMove","handleMouseMove","onUp","handleMouseUp","onWheel","handleWheel","onDomWheel","addEventListener","passive","removeEventListener","undefined","preventDefault","computeRelativePosition","clientX","clientY","button","Math","min","wheelEvent","deltaY","wheelDelta","detail","TouchInput","state","touching","x","y","press","release","touches","Map","previousTouching","canvas","removeListeners","mouse","setCanvas","detach","attach","update","syncMouseTouch","list","id","entries","push","size","mouseState","pressed","set","TOUCH_MOUSE_ID","delete","hasDocument","onStart","event","handleTouchStart","onMove","handleTouchMove","onEnd","handleTouchEnd","document","addEventListener","passive","removeEventListener","undefined","clear","preventDefault","stopPropagation","i","changedTouches","length","t","computeRelativePosition","clientX","clientY","identifier","syncFromTouch","has","Input","keyboard","mouse","touch","gamepad","runtime","canvas","KeyboardInput","MouseInput","TouchInput","GamepadInput","update","getKeyboard","state","listener","reportError","code","message","data","error","getMouse","getTouch","getGamepad","navigator","getGamepads","device","setCanvas"]}
|