/* * input.h * MontaukOS 2D Game Engine - Input State * Keyboard and mouse state tracking across frames * Copyright (c) 2026 Daniel Hammer */ #pragma once #include #include #include namespace engine { // Scancode constants for common keys namespace key { static constexpr uint8_t ESC = 0x01; static constexpr uint8_t W = 0x11; static constexpr uint8_t A = 0x1E; static constexpr uint8_t S = 0x1F; static constexpr uint8_t D = 0x20; static constexpr uint8_t E = 0x12; static constexpr uint8_t SPACE = 0x39; static constexpr uint8_t UP = 0x48; static constexpr uint8_t DOWN = 0x50; static constexpr uint8_t LEFT = 0x4B; static constexpr uint8_t RIGHT = 0x4D; static constexpr uint8_t ENTER = 0x1C; static constexpr uint8_t TAB = 0x0F; } struct InputState { // Key states: true = currently held bool keys[256]; // Keys pressed this frame (edge-triggered) bool keys_pressed[256]; // Mouse int mouse_x = 0; int mouse_y = 0; int mouse_scroll = 0; uint8_t mouse_buttons = 0; uint8_t prev_mouse_buttons = 0; void init() { montauk::memset(keys, 0, sizeof(keys)); montauk::memset(keys_pressed, 0, sizeof(keys_pressed)); } // Call at the start of each frame to clear per-frame state void begin_frame() { montauk::memset(keys_pressed, 0, sizeof(keys_pressed)); mouse_scroll = 0; prev_mouse_buttons = mouse_buttons; } // Process a window event void handle_event(const montauk::abi::WinEvent& ev) { if (ev.type == 0) { // keyboard // PS/2 scan code set 1: release codes have bit 7 set. // Mask to base scancode so press and release map to the same index. uint8_t sc = ev.key.scancode & 0x7F; if (ev.key.pressed) { if (!keys[sc]) keys_pressed[sc] = true; keys[sc] = true; } else { keys[sc] = false; } } else if (ev.type == 1) { // mouse mouse_x = ev.mouse.x; mouse_y = ev.mouse.y; mouse_scroll = ev.mouse.scroll; mouse_buttons = ev.mouse.buttons; } } bool key_held(uint8_t scancode) const { return keys[scancode]; } bool key_just_pressed(uint8_t scancode) const { return keys_pressed[scancode]; } bool mouse_clicked() const { return (mouse_buttons & 1) && !(prev_mouse_buttons & 1); } bool mouse_held() const { return mouse_buttons & 1; } }; } // namespace engine