import { Button } from '../shared/input'; // KeyboardEvent.code is layout-independent: KeyA/KeyW are Q/Z on AZERTY. const KEYMAP: Record = { KeyA: Button.Left, ArrowLeft: Button.Left, KeyD: Button.Right, ArrowRight: Button.Right, KeyW: Button.Jump, ArrowUp: Button.Jump, Space: Button.Jump, KeyS: Button.Down, ArrowDown: Button.Down, KeyE: Button.Special, KeyF: Button.Use, }; /** Tracks keyboard/mouse state as a button bitmask plus the mouse position in screen pixels. */ export class InputTracker { buttons = 0; mouseX = 0; mouseY = 0; constructor(target: HTMLElement) { window.addEventListener('keydown', (e) => { const b = KEYMAP[e.code]; if (b) { this.buttons |= b; e.preventDefault(); } }); window.addEventListener('keyup', (e) => { const b = KEYMAP[e.code]; if (b) this.buttons &= ~b; }); window.addEventListener('blur', () => (this.buttons = 0)); target.addEventListener('pointermove', (e) => { this.mouseX = e.clientX; this.mouseY = e.clientY; }); target.addEventListener('pointerdown', (e) => { if (e.button === 0) this.buttons |= Button.Attack; if (e.button === 2) this.buttons |= Button.Special; }); window.addEventListener('pointerup', (e) => { if (e.button === 0) this.buttons &= ~Button.Attack; if (e.button === 2) this.buttons &= ~Button.Special; }); target.addEventListener('contextmenu', (e) => e.preventDefault()); } }