@al8b/input 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +25 -0
  2. package/dist/core/input-manager.d.mts +25 -0
  3. package/dist/core/input-manager.d.ts +25 -0
  4. package/dist/core/input-manager.js +724 -0
  5. package/dist/core/input-manager.js.map +1 -0
  6. package/dist/core/input-manager.mjs +701 -0
  7. package/dist/core/input-manager.mjs.map +1 -0
  8. package/dist/devices/gamepad.d.mts +24 -0
  9. package/dist/devices/gamepad.d.ts +24 -0
  10. package/dist/devices/gamepad.js +244 -0
  11. package/dist/devices/gamepad.js.map +1 -0
  12. package/dist/devices/gamepad.mjs +221 -0
  13. package/dist/devices/gamepad.mjs.map +1 -0
  14. package/dist/devices/keyboard.d.mts +16 -0
  15. package/dist/devices/keyboard.d.ts +16 -0
  16. package/dist/devices/keyboard.js +131 -0
  17. package/dist/devices/keyboard.js.map +1 -0
  18. package/dist/devices/keyboard.mjs +106 -0
  19. package/dist/devices/keyboard.mjs.map +1 -0
  20. package/dist/devices/mouse.d.mts +21 -0
  21. package/dist/devices/mouse.d.ts +21 -0
  22. package/dist/devices/mouse.js +207 -0
  23. package/dist/devices/mouse.js.map +1 -0
  24. package/dist/devices/mouse.mjs +182 -0
  25. package/dist/devices/mouse.mjs.map +1 -0
  26. package/dist/devices/touch.d.mts +22 -0
  27. package/dist/devices/touch.d.ts +22 -0
  28. package/dist/devices/touch.js +186 -0
  29. package/dist/devices/touch.js.map +1 -0
  30. package/dist/devices/touch.mjs +161 -0
  31. package/dist/devices/touch.mjs.map +1 -0
  32. package/dist/index.d.mts +6 -0
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.js +735 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/index.mjs +706 -0
  37. package/dist/index.mjs.map +1 -0
  38. package/dist/shared/constants.d.mts +6 -0
  39. package/dist/shared/constants.d.ts +6 -0
  40. package/dist/shared/constants.js +40 -0
  41. package/dist/shared/constants.js.map +1 -0
  42. package/dist/shared/constants.mjs +12 -0
  43. package/dist/shared/constants.mjs.map +1 -0
  44. package/dist/shared/utils.d.mts +9 -0
  45. package/dist/shared/utils.d.ts +9 -0
  46. package/dist/shared/utils.js +56 -0
  47. package/dist/shared/utils.js.map +1 -0
  48. package/dist/shared/utils.mjs +29 -0
  49. package/dist/shared/utils.mjs.map +1 -0
  50. package/dist/types/index.d.mts +41 -0
  51. package/dist/types/index.d.ts +41 -0
  52. package/dist/types/index.js +19 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/types/index.mjs +1 -0
  55. package/dist/types/index.mjs.map +1 -0
  56. package/package.json +34 -0
@@ -0,0 +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"]}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Gamepad - Game controller input handling
3
+ *
4
+ * Provides gamepad polling and state management.
5
+ */
6
+ interface StateMap extends Record<string, any> {
7
+ press: Record<string, number>;
8
+ release: Record<string, number>;
9
+ }
10
+ declare class GamepadInput {
11
+ status: StateMap & Record<number, StateMap>;
12
+ previous: {
13
+ global: StateMap;
14
+ } & Record<number, StateMap>;
15
+ count: number;
16
+ constructor();
17
+ update(): void;
18
+ private getGamepads;
19
+ private updateStick;
20
+ private aggregateStatus;
21
+ private updateChanges;
22
+ }
23
+
24
+ export { GamepadInput };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Gamepad - Game controller input handling
3
+ *
4
+ * Provides gamepad polling and state management.
5
+ */
6
+ interface StateMap extends Record<string, any> {
7
+ press: Record<string, number>;
8
+ release: Record<string, number>;
9
+ }
10
+ declare class GamepadInput {
11
+ status: StateMap & Record<number, StateMap>;
12
+ previous: {
13
+ global: StateMap;
14
+ } & Record<number, StateMap>;
15
+ count: number;
16
+ constructor();
17
+ update(): void;
18
+ private getGamepads;
19
+ private updateStick;
20
+ private aggregateStatus;
21
+ private updateChanges;
22
+ }
23
+
24
+ export { GamepadInput };
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/devices/gamepad.ts
22
+ var gamepad_exports = {};
23
+ __export(gamepad_exports, {
24
+ GamepadInput: () => GamepadInput
25
+ });
26
+ module.exports = __toCommonJS(gamepad_exports);
27
+ var createState = /* @__PURE__ */ __name(() => ({
28
+ press: {},
29
+ release: {}
30
+ }), "createState");
31
+ var BUTTONS_MAP = {
32
+ 0: "A",
33
+ 1: "B",
34
+ 2: "X",
35
+ 3: "Y",
36
+ 4: "LB",
37
+ 5: "RB",
38
+ 8: "VIEW",
39
+ 9: "MENU",
40
+ 10: "LS",
41
+ 11: "RS",
42
+ 12: "DPAD_UP",
43
+ 13: "DPAD_DOWN",
44
+ 14: "DPAD_LEFT",
45
+ 15: "DPAD_RIGHT"
46
+ };
47
+ var TRIGGERS_MAP = {
48
+ 6: "LT",
49
+ 7: "RT"
50
+ };
51
+ var ensureState = /* @__PURE__ */ __name((state) => {
52
+ if (!state) {
53
+ return createState();
54
+ }
55
+ state.press ??= {};
56
+ state.release ??= {};
57
+ return state;
58
+ }, "ensureState");
59
+ var GamepadInput = class {
60
+ static {
61
+ __name(this, "GamepadInput");
62
+ }
63
+ status;
64
+ previous;
65
+ count = 0;
66
+ constructor() {
67
+ this.status = createState();
68
+ this.previous = {
69
+ global: createState()
70
+ };
71
+ }
72
+ update() {
73
+ const pads = this.getGamepads();
74
+ if (!pads) {
75
+ this.count = 0;
76
+ return;
77
+ }
78
+ let padCount = 0;
79
+ for (let i = 0; i < pads.length; i++) {
80
+ const pad = pads[i];
81
+ if (!pad) {
82
+ break;
83
+ }
84
+ padCount++;
85
+ this.status[i] = ensureState(this.status[i]);
86
+ this.previous[i] = ensureState(this.previous[i]);
87
+ for (const [index, name] of Object.entries(BUTTONS_MAP)) {
88
+ const idx = Number(index);
89
+ const button = pad.buttons[idx];
90
+ if (button) {
91
+ this.status[i][name] = button.pressed ? 1 : 0;
92
+ }
93
+ }
94
+ for (const [index, name] of Object.entries(TRIGGERS_MAP)) {
95
+ const idx = Number(index);
96
+ const trigger = pad.buttons[idx];
97
+ if (trigger) {
98
+ this.status[i][name] = trigger.value ?? 0;
99
+ }
100
+ }
101
+ if (pad.axes.length >= 2) {
102
+ this.updateStick(pad.axes[0], -pad.axes[1], this.status[i], "LEFT");
103
+ }
104
+ if (pad.axes.length >= 4) {
105
+ this.updateStick(pad.axes[2], -pad.axes[3], this.status[i], "RIGHT");
106
+ }
107
+ }
108
+ this.aggregateStatus(pads, padCount);
109
+ this.count = padCount;
110
+ this.updateChanges(this.status, this.previous.global);
111
+ for (let i = 0; i < padCount; i++) {
112
+ this.updateChanges(this.status[i], this.previous[i]);
113
+ }
114
+ for (let i = padCount; i < 4; i++) {
115
+ delete this.status[i];
116
+ delete this.previous[i];
117
+ }
118
+ }
119
+ getGamepads() {
120
+ if (typeof navigator === "undefined" || !navigator.getGamepads) {
121
+ return null;
122
+ }
123
+ try {
124
+ return navigator.getGamepads();
125
+ } catch {
126
+ return null;
127
+ }
128
+ }
129
+ updateStick(x, y, target, prefix) {
130
+ const radius = Math.sqrt(x * x + y * y);
131
+ const angle = Math.floor((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2) / (Math.PI * 2) * 360);
132
+ target[`${prefix}_STICK_ANGLE`] = angle;
133
+ target[`${prefix}_STICK_AMOUNT`] = radius;
134
+ target[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;
135
+ target[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;
136
+ target[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;
137
+ target[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;
138
+ }
139
+ aggregateStatus(pads, padCount) {
140
+ for (const [index, name] of Object.entries(BUTTONS_MAP)) {
141
+ this.status[name] = 0;
142
+ const idx = Number(index);
143
+ for (const pad of pads) {
144
+ if (!pad) break;
145
+ if (pad.buttons[idx]?.pressed) {
146
+ this.status[name] = 1;
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ for (const [index, name] of Object.entries(TRIGGERS_MAP)) {
152
+ this.status[name] = 0;
153
+ const idx = Number(index);
154
+ for (const pad of pads) {
155
+ if (!pad) break;
156
+ const button = pad.buttons[idx];
157
+ if (button) {
158
+ this.status[name] = button.value ?? 0;
159
+ }
160
+ }
161
+ }
162
+ this.status.UP = 0;
163
+ this.status.DOWN = 0;
164
+ this.status.LEFT = 0;
165
+ this.status.RIGHT = 0;
166
+ this.status.LEFT_STICK_UP = 0;
167
+ this.status.LEFT_STICK_DOWN = 0;
168
+ this.status.LEFT_STICK_LEFT = 0;
169
+ this.status.LEFT_STICK_RIGHT = 0;
170
+ this.status.RIGHT_STICK_UP = 0;
171
+ this.status.RIGHT_STICK_DOWN = 0;
172
+ this.status.RIGHT_STICK_LEFT = 0;
173
+ this.status.RIGHT_STICK_RIGHT = 0;
174
+ this.status.LEFT_STICK_ANGLE = 0;
175
+ this.status.LEFT_STICK_AMOUNT = 0;
176
+ this.status.RIGHT_STICK_ANGLE = 0;
177
+ this.status.RIGHT_STICK_AMOUNT = 0;
178
+ this.status.RT = 0;
179
+ this.status.LT = 0;
180
+ for (let i = 0; i < padCount; i++) {
181
+ const padState = this.status[i];
182
+ if (!padState) continue;
183
+ padState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;
184
+ padState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;
185
+ padState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;
186
+ padState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;
187
+ if (padState.UP) this.status.UP = 1;
188
+ if (padState.DOWN) this.status.DOWN = 1;
189
+ if (padState.LEFT) this.status.LEFT = 1;
190
+ if (padState.RIGHT) this.status.RIGHT = 1;
191
+ if (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;
192
+ if (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;
193
+ if (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;
194
+ if (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;
195
+ if (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;
196
+ if (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;
197
+ if (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;
198
+ if (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;
199
+ if (padState.LT) this.status.LT = padState.LT;
200
+ if (padState.RT) this.status.RT = padState.RT;
201
+ if ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {
202
+ this.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;
203
+ this.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;
204
+ }
205
+ if ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {
206
+ this.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;
207
+ this.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;
208
+ }
209
+ }
210
+ }
211
+ updateChanges(current, previous) {
212
+ for (const key in current.press) {
213
+ current.press[key] = 0;
214
+ }
215
+ for (const key in current.release) {
216
+ current.release[key] = 0;
217
+ }
218
+ for (const key in previous) {
219
+ if (key === "press" || key === "release") continue;
220
+ if (previous[key] && !current[key]) {
221
+ current.release[key] = 1;
222
+ }
223
+ }
224
+ for (const key in current) {
225
+ if (key === "press" || key === "release") continue;
226
+ if (current[key] && !previous[key]) {
227
+ current.press[key] = 1;
228
+ }
229
+ }
230
+ for (const key in previous) {
231
+ if (key === "press" || key === "release") continue;
232
+ previous[key] = 0;
233
+ }
234
+ for (const key in current) {
235
+ if (key === "press" || key === "release") continue;
236
+ previous[key] = current[key];
237
+ }
238
+ }
239
+ };
240
+ // Annotate the CommonJS export names for ESM import in node:
241
+ 0 && (module.exports = {
242
+ GamepadInput
243
+ });
244
+ //# sourceMappingURL=gamepad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/devices/gamepad.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"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAcA,IAAMA,cAAc,8BAAiB;EACpCC,OAAO,CAAC;EACRC,SAAS,CAAC;AACX,IAHoB;AAKpB,IAAMC,cAAyB;EAC9B,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;AACL;AAEA,IAAMC,eAA0B;EAC/B,GAAG;EACH,GAAG;AACJ;AAEA,IAAMC,cAAc,wBAACC,UAAAA;AACpB,MAAI,CAACA,OAAO;AACX,WAAON,YAAAA;EACR;AACAM,QAAML,UAAU,CAAC;AACjBK,QAAMJ,YAAY,CAAC;AACnB,SAAOI;AACR,GAPoB;AASb,IAAMC,eAAN,MAAMA;EAlDb,OAkDaA;;;EACLC;EACAC;EAGAC,QAAQ;EAEf,cAAc;AACb,SAAKF,SAASR,YAAAA;AACd,SAAKS,WAAW;MACfE,QAAQX,YAAAA;IACT;EACD;EAEAY,SAAe;AACd,UAAMC,OAAO,KAAKC,YAAW;AAC7B,QAAI,CAACD,MAAM;AACV,WAAKH,QAAQ;AACb;IACD;AAEA,QAAIK,WAAW;AACf,aAASC,IAAI,GAAGA,IAAIH,KAAKI,QAAQD,KAAK;AACrC,YAAME,MAAML,KAAKG,CAAAA;AACjB,UAAI,CAACE,KAAK;AACT;MACD;AACAH;AACA,WAAKP,OAAOQ,CAAAA,IAAKX,YAAY,KAAKG,OAAOQ,CAAAA,CAAE;AAC3C,WAAKP,SAASO,CAAAA,IAAKX,YAAY,KAAKI,SAASO,CAAAA,CAAE;AAE/C,iBAAW,CAACG,OAAOC,IAAAA,KAASC,OAAOC,QAAQnB,WAAAA,GAAc;AACxD,cAAMoB,MAAMC,OAAOL,KAAAA;AACnB,cAAMM,SAASP,IAAIQ,QAAQH,GAAAA;AAC3B,YAAIE,QAAQ;AACX,eAAKjB,OAAOQ,CAAAA,EAAGI,IAAAA,IAAQK,OAAOE,UAAU,IAAI;QAC7C;MACD;AAEA,iBAAW,CAACR,OAAOC,IAAAA,KAASC,OAAOC,QAAQlB,YAAAA,GAAe;AACzD,cAAMmB,MAAMC,OAAOL,KAAAA;AACnB,cAAMS,UAAUV,IAAIQ,QAAQH,GAAAA;AAC5B,YAAIK,SAAS;AACZ,eAAKpB,OAAOQ,CAAAA,EAAGI,IAAAA,IAAQQ,QAAQC,SAAS;QACzC;MACD;AAEA,UAAIX,IAAIY,KAAKb,UAAU,GAAG;AACzB,aAAKc,YAAYb,IAAIY,KAAK,CAAA,GAAI,CAACZ,IAAIY,KAAK,CAAA,GAAI,KAAKtB,OAAOQ,CAAAA,GAAI,MAAA;MAC7D;AACA,UAAIE,IAAIY,KAAKb,UAAU,GAAG;AACzB,aAAKc,YAAYb,IAAIY,KAAK,CAAA,GAAI,CAACZ,IAAIY,KAAK,CAAA,GAAI,KAAKtB,OAAOQ,CAAAA,GAAI,OAAA;MAC7D;IACD;AAEA,SAAKgB,gBAAgBnB,MAAME,QAAAA;AAC3B,SAAKL,QAAQK;AACb,SAAKkB,cAAc,KAAKzB,QAAQ,KAAKC,SAASE,MAAM;AACpD,aAASK,IAAI,GAAGA,IAAID,UAAUC,KAAK;AAClC,WAAKiB,cAAc,KAAKzB,OAAOQ,CAAAA,GAAI,KAAKP,SAASO,CAAAA,CAAE;IACpD;AAEA,aAASA,IAAID,UAAUC,IAAI,GAAGA,KAAK;AAClC,aAAO,KAAKR,OAAOQ,CAAAA;AACnB,aAAO,KAAKP,SAASO,CAAAA;IACtB;EACD;EAEQF,cAAgD;AACvD,QAAI,OAAOoB,cAAc,eAAe,CAACA,UAAUpB,aAAa;AAC/D,aAAO;IACR;AACA,QAAI;AACH,aAAOoB,UAAUpB,YAAW;IAC7B,QAAQ;AACP,aAAO;IACR;EACD;EAEQiB,YAAYI,GAAWC,GAAWC,QAAkBC,QAAgC;AAC3F,UAAMC,SAASC,KAAKC,KAAKN,IAAIA,IAAIC,IAAIA,CAAAA;AACrC,UAAMM,QAAQF,KAAKG,OAASH,KAAKI,MAAMR,GAAGD,CAAAA,IAAKK,KAAKK,KAAK,MAAML,KAAKK,KAAK,MAAOL,KAAKK,KAAK,KAAM,GAAA;AAChGR,WAAO,GAAGC,MAAAA,cAAoB,IAAII;AAClCL,WAAO,GAAGC,MAAAA,eAAqB,IAAIC;AACnCF,WAAO,GAAGC,MAAAA,WAAiB,IAAIF,IAAI,MAAM,IAAI;AAC7CC,WAAO,GAAGC,MAAAA,aAAmB,IAAIF,IAAI,OAAO,IAAI;AAChDC,WAAO,GAAGC,MAAAA,aAAmB,IAAIH,IAAI,OAAO,IAAI;AAChDE,WAAO,GAAGC,MAAAA,cAAoB,IAAIH,IAAI,MAAM,IAAI;EACjD;EAEQH,gBAAgBnB,MAAiCE,UAAwB;AAChF,eAAW,CAACI,OAAOC,IAAAA,KAASC,OAAOC,QAAQnB,WAAAA,GAAc;AACxD,WAAKK,OAAOY,IAAAA,IAAQ;AACpB,YAAMG,MAAMC,OAAOL,KAAAA;AACnB,iBAAWD,OAAOL,MAAM;AACvB,YAAI,CAACK,IAAK;AACV,YAAIA,IAAIQ,QAAQH,GAAAA,GAAMI,SAAS;AAC9B,eAAKnB,OAAOY,IAAAA,IAAQ;AACpB;QACD;MACD;IACD;AAEA,eAAW,CAACD,OAAOC,IAAAA,KAASC,OAAOC,QAAQlB,YAAAA,GAAe;AACzD,WAAKI,OAAOY,IAAAA,IAAQ;AACpB,YAAMG,MAAMC,OAAOL,KAAAA;AACnB,iBAAWD,OAAOL,MAAM;AACvB,YAAI,CAACK,IAAK;AACV,cAAMO,SAASP,IAAIQ,QAAQH,GAAAA;AAC3B,YAAIE,QAAQ;AACX,eAAKjB,OAAOY,IAAAA,IAAQK,OAAOI,SAAS;QACrC;MACD;IACD;AAEA,SAAKrB,OAAOsC,KAAK;AACjB,SAAKtC,OAAOuC,OAAO;AACnB,SAAKvC,OAAOwC,OAAO;AACnB,SAAKxC,OAAOyC,QAAQ;AACpB,SAAKzC,OAAO0C,gBAAgB;AAC5B,SAAK1C,OAAO2C,kBAAkB;AAC9B,SAAK3C,OAAO4C,kBAAkB;AAC9B,SAAK5C,OAAO6C,mBAAmB;AAC/B,SAAK7C,OAAO8C,iBAAiB;AAC7B,SAAK9C,OAAO+C,mBAAmB;AAC/B,SAAK/C,OAAOgD,mBAAmB;AAC/B,SAAKhD,OAAOiD,oBAAoB;AAChC,SAAKjD,OAAOkD,mBAAmB;AAC/B,SAAKlD,OAAOmD,oBAAoB;AAChC,SAAKnD,OAAOoD,oBAAoB;AAChC,SAAKpD,OAAOqD,qBAAqB;AACjC,SAAKrD,OAAOsD,KAAK;AACjB,SAAKtD,OAAOuD,KAAK;AAEjB,aAAS/C,IAAI,GAAGA,IAAID,UAAUC,KAAK;AAClC,YAAMgD,WAAW,KAAKxD,OAAOQ,CAAAA;AAC7B,UAAI,CAACgD,SAAU;AAEfA,eAASlB,KAAKkB,SAASC,WAAWD,SAASd,iBAAiBc,SAASV,kBAAkB,IAAI,IAAI;AAC/FU,eAASjB,OAAOiB,SAASE,aAAaF,SAASb,mBAAmBa,SAAST,oBAAoB,IAAI,IAAI;AACvGS,eAAShB,OAAOgB,SAASG,aAAaH,SAASZ,mBAAmBY,SAASR,oBAAoB,IAAI,IAAI;AACvGQ,eAASf,QAAQe,SAASI,cAAcJ,SAASX,oBAAoBW,SAASP,qBAAqB,IAAI,IAAI;AAE3G,UAAIO,SAASlB,GAAI,MAAKtC,OAAOsC,KAAK;AAClC,UAAIkB,SAASjB,KAAM,MAAKvC,OAAOuC,OAAO;AACtC,UAAIiB,SAAShB,KAAM,MAAKxC,OAAOwC,OAAO;AACtC,UAAIgB,SAASf,MAAO,MAAKzC,OAAOyC,QAAQ;AAExC,UAAIe,SAASd,cAAe,MAAK1C,OAAO0C,gBAAgB;AACxD,UAAIc,SAASb,gBAAiB,MAAK3C,OAAO2C,kBAAkB;AAC5D,UAAIa,SAASZ,gBAAiB,MAAK5C,OAAO4C,kBAAkB;AAC5D,UAAIY,SAASX,iBAAkB,MAAK7C,OAAO6C,mBAAmB;AAC9D,UAAIW,SAASV,eAAgB,MAAK9C,OAAO8C,iBAAiB;AAC1D,UAAIU,SAAST,iBAAkB,MAAK/C,OAAO+C,mBAAmB;AAC9D,UAAIS,SAASR,iBAAkB,MAAKhD,OAAOgD,mBAAmB;AAC9D,UAAIQ,SAASP,kBAAmB,MAAKjD,OAAOiD,oBAAoB;AAChE,UAAIO,SAASD,GAAI,MAAKvD,OAAOuD,KAAKC,SAASD;AAC3C,UAAIC,SAASF,GAAI,MAAKtD,OAAOsD,KAAKE,SAASF;AAE3C,WAAKE,SAASL,qBAAqB,MAAM,KAAKnD,OAAOmD,qBAAqB,IAAI;AAC7E,aAAKnD,OAAOmD,oBAAoBK,SAASL;AACzC,aAAKnD,OAAOkD,mBAAmBM,SAASN;MACzC;AACA,WAAKM,SAASH,sBAAsB,MAAM,KAAKrD,OAAOqD,sBAAsB,IAAI;AAC/E,aAAKrD,OAAOqD,qBAAqBG,SAASH;AAC1C,aAAKrD,OAAOoD,oBAAoBI,SAASJ;MAC1C;IACD;EACD;EAEQ3B,cAAcoC,SAAmB5D,UAA0B;AAClE,eAAW6D,OAAOD,QAAQpE,OAAO;AAChCoE,cAAQpE,MAAMqE,GAAAA,IAAO;IACtB;AACA,eAAWA,OAAOD,QAAQnE,SAAS;AAClCmE,cAAQnE,QAAQoE,GAAAA,IAAO;IACxB;AACA,eAAWA,OAAO7D,UAAU;AAC3B,UAAI6D,QAAQ,WAAWA,QAAQ,UAAW;AAC1C,UAAI7D,SAAS6D,GAAAA,KAAQ,CAACD,QAAQC,GAAAA,GAAM;AACnCD,gBAAQnE,QAAQoE,GAAAA,IAAO;MACxB;IACD;AACA,eAAWA,OAAOD,SAAS;AAC1B,UAAIC,QAAQ,WAAWA,QAAQ,UAAW;AAC1C,UAAID,QAAQC,GAAAA,KAAQ,CAAC7D,SAAS6D,GAAAA,GAAM;AACnCD,gBAAQpE,MAAMqE,GAAAA,IAAO;MACtB;IACD;AACA,eAAWA,OAAO7D,UAAU;AAC3B,UAAI6D,QAAQ,WAAWA,QAAQ,UAAW;AAC1C7D,eAAS6D,GAAAA,IAAO;IACjB;AACA,eAAWA,OAAOD,SAAS;AAC1B,UAAIC,QAAQ,WAAWA,QAAQ,UAAW;AAC1C7D,eAAS6D,GAAAA,IAAOD,QAAQC,GAAAA;IACzB;EACD;AACD;","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"]}
@@ -0,0 +1,221 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/devices/gamepad.ts
5
+ var createState = /* @__PURE__ */ __name(() => ({
6
+ press: {},
7
+ release: {}
8
+ }), "createState");
9
+ var BUTTONS_MAP = {
10
+ 0: "A",
11
+ 1: "B",
12
+ 2: "X",
13
+ 3: "Y",
14
+ 4: "LB",
15
+ 5: "RB",
16
+ 8: "VIEW",
17
+ 9: "MENU",
18
+ 10: "LS",
19
+ 11: "RS",
20
+ 12: "DPAD_UP",
21
+ 13: "DPAD_DOWN",
22
+ 14: "DPAD_LEFT",
23
+ 15: "DPAD_RIGHT"
24
+ };
25
+ var TRIGGERS_MAP = {
26
+ 6: "LT",
27
+ 7: "RT"
28
+ };
29
+ var ensureState = /* @__PURE__ */ __name((state) => {
30
+ if (!state) {
31
+ return createState();
32
+ }
33
+ state.press ??= {};
34
+ state.release ??= {};
35
+ return state;
36
+ }, "ensureState");
37
+ var GamepadInput = class {
38
+ static {
39
+ __name(this, "GamepadInput");
40
+ }
41
+ status;
42
+ previous;
43
+ count = 0;
44
+ constructor() {
45
+ this.status = createState();
46
+ this.previous = {
47
+ global: createState()
48
+ };
49
+ }
50
+ update() {
51
+ const pads = this.getGamepads();
52
+ if (!pads) {
53
+ this.count = 0;
54
+ return;
55
+ }
56
+ let padCount = 0;
57
+ for (let i = 0; i < pads.length; i++) {
58
+ const pad = pads[i];
59
+ if (!pad) {
60
+ break;
61
+ }
62
+ padCount++;
63
+ this.status[i] = ensureState(this.status[i]);
64
+ this.previous[i] = ensureState(this.previous[i]);
65
+ for (const [index, name] of Object.entries(BUTTONS_MAP)) {
66
+ const idx = Number(index);
67
+ const button = pad.buttons[idx];
68
+ if (button) {
69
+ this.status[i][name] = button.pressed ? 1 : 0;
70
+ }
71
+ }
72
+ for (const [index, name] of Object.entries(TRIGGERS_MAP)) {
73
+ const idx = Number(index);
74
+ const trigger = pad.buttons[idx];
75
+ if (trigger) {
76
+ this.status[i][name] = trigger.value ?? 0;
77
+ }
78
+ }
79
+ if (pad.axes.length >= 2) {
80
+ this.updateStick(pad.axes[0], -pad.axes[1], this.status[i], "LEFT");
81
+ }
82
+ if (pad.axes.length >= 4) {
83
+ this.updateStick(pad.axes[2], -pad.axes[3], this.status[i], "RIGHT");
84
+ }
85
+ }
86
+ this.aggregateStatus(pads, padCount);
87
+ this.count = padCount;
88
+ this.updateChanges(this.status, this.previous.global);
89
+ for (let i = 0; i < padCount; i++) {
90
+ this.updateChanges(this.status[i], this.previous[i]);
91
+ }
92
+ for (let i = padCount; i < 4; i++) {
93
+ delete this.status[i];
94
+ delete this.previous[i];
95
+ }
96
+ }
97
+ getGamepads() {
98
+ if (typeof navigator === "undefined" || !navigator.getGamepads) {
99
+ return null;
100
+ }
101
+ try {
102
+ return navigator.getGamepads();
103
+ } catch {
104
+ return null;
105
+ }
106
+ }
107
+ updateStick(x, y, target, prefix) {
108
+ const radius = Math.sqrt(x * x + y * y);
109
+ const angle = Math.floor((Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2) / (Math.PI * 2) * 360);
110
+ target[`${prefix}_STICK_ANGLE`] = angle;
111
+ target[`${prefix}_STICK_AMOUNT`] = radius;
112
+ target[`${prefix}_STICK_UP`] = y > 0.5 ? 1 : 0;
113
+ target[`${prefix}_STICK_DOWN`] = y < -0.5 ? 1 : 0;
114
+ target[`${prefix}_STICK_LEFT`] = x < -0.5 ? 1 : 0;
115
+ target[`${prefix}_STICK_RIGHT`] = x > 0.5 ? 1 : 0;
116
+ }
117
+ aggregateStatus(pads, padCount) {
118
+ for (const [index, name] of Object.entries(BUTTONS_MAP)) {
119
+ this.status[name] = 0;
120
+ const idx = Number(index);
121
+ for (const pad of pads) {
122
+ if (!pad) break;
123
+ if (pad.buttons[idx]?.pressed) {
124
+ this.status[name] = 1;
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ for (const [index, name] of Object.entries(TRIGGERS_MAP)) {
130
+ this.status[name] = 0;
131
+ const idx = Number(index);
132
+ for (const pad of pads) {
133
+ if (!pad) break;
134
+ const button = pad.buttons[idx];
135
+ if (button) {
136
+ this.status[name] = button.value ?? 0;
137
+ }
138
+ }
139
+ }
140
+ this.status.UP = 0;
141
+ this.status.DOWN = 0;
142
+ this.status.LEFT = 0;
143
+ this.status.RIGHT = 0;
144
+ this.status.LEFT_STICK_UP = 0;
145
+ this.status.LEFT_STICK_DOWN = 0;
146
+ this.status.LEFT_STICK_LEFT = 0;
147
+ this.status.LEFT_STICK_RIGHT = 0;
148
+ this.status.RIGHT_STICK_UP = 0;
149
+ this.status.RIGHT_STICK_DOWN = 0;
150
+ this.status.RIGHT_STICK_LEFT = 0;
151
+ this.status.RIGHT_STICK_RIGHT = 0;
152
+ this.status.LEFT_STICK_ANGLE = 0;
153
+ this.status.LEFT_STICK_AMOUNT = 0;
154
+ this.status.RIGHT_STICK_ANGLE = 0;
155
+ this.status.RIGHT_STICK_AMOUNT = 0;
156
+ this.status.RT = 0;
157
+ this.status.LT = 0;
158
+ for (let i = 0; i < padCount; i++) {
159
+ const padState = this.status[i];
160
+ if (!padState) continue;
161
+ padState.UP = padState.DPAD_UP || padState.LEFT_STICK_UP || padState.RIGHT_STICK_UP || 0 ? 1 : 0;
162
+ padState.DOWN = padState.DPAD_DOWN || padState.LEFT_STICK_DOWN || padState.RIGHT_STICK_DOWN || 0 ? 1 : 0;
163
+ padState.LEFT = padState.DPAD_LEFT || padState.LEFT_STICK_LEFT || padState.RIGHT_STICK_LEFT || 0 ? 1 : 0;
164
+ padState.RIGHT = padState.DPAD_RIGHT || padState.LEFT_STICK_RIGHT || padState.RIGHT_STICK_RIGHT || 0 ? 1 : 0;
165
+ if (padState.UP) this.status.UP = 1;
166
+ if (padState.DOWN) this.status.DOWN = 1;
167
+ if (padState.LEFT) this.status.LEFT = 1;
168
+ if (padState.RIGHT) this.status.RIGHT = 1;
169
+ if (padState.LEFT_STICK_UP) this.status.LEFT_STICK_UP = 1;
170
+ if (padState.LEFT_STICK_DOWN) this.status.LEFT_STICK_DOWN = 1;
171
+ if (padState.LEFT_STICK_LEFT) this.status.LEFT_STICK_LEFT = 1;
172
+ if (padState.LEFT_STICK_RIGHT) this.status.LEFT_STICK_RIGHT = 1;
173
+ if (padState.RIGHT_STICK_UP) this.status.RIGHT_STICK_UP = 1;
174
+ if (padState.RIGHT_STICK_DOWN) this.status.RIGHT_STICK_DOWN = 1;
175
+ if (padState.RIGHT_STICK_LEFT) this.status.RIGHT_STICK_LEFT = 1;
176
+ if (padState.RIGHT_STICK_RIGHT) this.status.RIGHT_STICK_RIGHT = 1;
177
+ if (padState.LT) this.status.LT = padState.LT;
178
+ if (padState.RT) this.status.RT = padState.RT;
179
+ if ((padState.LEFT_STICK_AMOUNT ?? 0) > (this.status.LEFT_STICK_AMOUNT ?? 0)) {
180
+ this.status.LEFT_STICK_AMOUNT = padState.LEFT_STICK_AMOUNT;
181
+ this.status.LEFT_STICK_ANGLE = padState.LEFT_STICK_ANGLE;
182
+ }
183
+ if ((padState.RIGHT_STICK_AMOUNT ?? 0) > (this.status.RIGHT_STICK_AMOUNT ?? 0)) {
184
+ this.status.RIGHT_STICK_AMOUNT = padState.RIGHT_STICK_AMOUNT;
185
+ this.status.RIGHT_STICK_ANGLE = padState.RIGHT_STICK_ANGLE;
186
+ }
187
+ }
188
+ }
189
+ updateChanges(current, previous) {
190
+ for (const key in current.press) {
191
+ current.press[key] = 0;
192
+ }
193
+ for (const key in current.release) {
194
+ current.release[key] = 0;
195
+ }
196
+ for (const key in previous) {
197
+ if (key === "press" || key === "release") continue;
198
+ if (previous[key] && !current[key]) {
199
+ current.release[key] = 1;
200
+ }
201
+ }
202
+ for (const key in current) {
203
+ if (key === "press" || key === "release") continue;
204
+ if (current[key] && !previous[key]) {
205
+ current.press[key] = 1;
206
+ }
207
+ }
208
+ for (const key in previous) {
209
+ if (key === "press" || key === "release") continue;
210
+ previous[key] = 0;
211
+ }
212
+ for (const key in current) {
213
+ if (key === "press" || key === "release") continue;
214
+ previous[key] = current[key];
215
+ }
216
+ }
217
+ };
218
+ export {
219
+ GamepadInput
220
+ };
221
+ //# sourceMappingURL=gamepad.mjs.map