// Input module for lance3d var events = use('sdl3/events') var keyboard = use('sdl3/keyboard') var mouse = use('sdl3/mouse') // Private input state var _keys_held = {} var _keys_pressed = {} var _mouse_x = 0 var _mouse_y = 0 var _mouse_buttons = {} var _mouse_buttons_pressed = {} var _axes = [0, 0, 0, 0] // Key mapping for btn/btnp var _key_map = ['z', 'x', 'c', 'v', 'a', 's', 'return', 'escape'] // Called at start of frame to reset pressed state function begin_frame() { _keys_pressed = {} _mouse_buttons_pressed = {} var ms = mouse.get_state() if (ms) { _mouse_x = ms.x _mouse_y = ms.y } } // Process SDL events, returns false if quit requested function process_events() { var ev while ((ev = events.poll()) != null) { if (ev.type == "quit" || ev.type == "window_close_requested") { return false } if (ev.type == "key_down" || ev.type == "key_up") { var key_name = lower(keyboard.get_key_name(ev.key)) var pressed = ev.type == "key_down" if (pressed && !_keys_held[key_name]) { _keys_pressed[key_name] = true } _keys_held[key_name] = pressed // Map WASD to axes if (key_name == "w") _axes[1] = pressed ? -1 : 0 if (key_name == "s") _axes[1] = pressed ? 1 : 0 if (key_name == "a") _axes[0] = pressed ? -1 : 0 if (key_name == "d") _axes[0] = pressed ? 1 : 0 } if (ev.type == "mouse_button_down" || ev.type == "mouse_button_up") { var btn_pressed = ev.type == "mouse_button_down" if (btn_pressed && !_mouse_buttons[ev.button]) { _mouse_buttons_pressed[ev.button] = true } _mouse_buttons[ev.button] = btn_pressed } } return true } // Check if a key is held (by name) function key(name) { return _keys_held[lower(name)] || false } // Check if a key was just pressed this frame (by name) function keyp(name) { return _keys_pressed[lower(name)] || false } // Check if a button is held (by index 0-7) function btn(id, player) { var key_name = _key_map[id] return _keys_held[key_name] || false } // Check if a button was just pressed (by index 0-7) function btnp(id, player) { var key_name = _key_map[id] return _keys_pressed[key_name] || false } // Get axis value (-1, 0, or 1) function axis(id) { return _axes[id] || 0 } // Get mouse position function mouse_pos() { return { x: _mouse_x, y: _mouse_y } } // Check if mouse button is held function mouse_btn(button) { return _mouse_buttons[button] || false } // Check if mouse button was just pressed function mouse_btnp(button) { return _mouse_buttons_pressed[button] || false } // Get raw access to keys_pressed for internal use function get_keys_pressed() { return _keys_pressed } return { begin_frame: begin_frame, process_events: process_events, key: key, keyp: keyp, btn: btn, btnp: btnp, axis: axis, mouse_pos: mouse_pos, mouse_btn: mouse_btn, mouse_btnp: mouse_btnp, get_keys_pressed: get_keys_pressed, }