#include "core/jail/jinput.hpp" #include #include "core/input/global_inputs.hpp" #include "core/input/mouse.hpp" #include "core/jail/jgame.hpp" #include "core/rendering/overlay.hpp" #include "game/options.hpp" const bool* keystates; // = SDL_GetKeyboardState( NULL ); SDL_Event event; Uint8 cheat[5]; bool key_pressed = false; int waitTime = 0; static bool esc_blocked_ = false; // Bloqueja ESC per polling quan l'overlay l'ha consumit // Comprova si un scancode pertany a les tecles reservades per a la GUI static bool isGuiKey(SDL_Scancode sc) { return sc == Options::keys_gui.dec_zoom || sc == Options::keys_gui.inc_zoom || sc == Options::keys_gui.fullscreen || sc == Options::keys_gui.toggle_shader || sc == Options::keys_gui.toggle_aspect_ratio || sc == Options::keys_gui.toggle_supersampling || sc == Options::keys_gui.next_shader || sc == Options::keys_gui.next_shader_preset || sc == Options::keys_gui.toggle_stretch_filter || sc == Options::keys_gui.toggle_render_info; } void JI_DisableKeyboard(Uint32 time) { waitTime = time; } void JI_moveCheats(Uint8 new_key) { cheat[0] = cheat[1]; cheat[1] = cheat[2]; cheat[2] = cheat[3]; cheat[3] = cheat[4]; cheat[4] = new_key; } void JI_Update() { key_pressed = false; keystates = SDL_GetKeyboardState(NULL); if (waitTime > 0) waitTime--; while (SDL_PollEvent(&event)) { if (event.type == SDL_EVENT_QUIT) JG_QuitSignal(); if (event.type == SDL_EVENT_KEY_UP) { // ESC interceptat per l'overlay (doble pulsació per eixir) if (event.key.scancode == SDL_SCANCODE_ESCAPE) { if (Overlay::handleEscape()) { // Consumit: primera pulsació, bloqueja ESC per polling esc_blocked_ = true; } else { // Segona pulsació: desbloqueja i passa al joc esc_blocked_ = false; key_pressed = true; JG_QuitSignal(); } } else if (!isGuiKey(event.key.scancode)) { // Tecles normals del joc key_pressed = true; JI_moveCheats(event.key.scancode); } } Mouse::handleEvent(event); } // Desbloqueja ESC quan la tecla ja no està polsada i l'overlay ha fet timeout if (esc_blocked_ && !keystates[SDL_SCANCODE_ESCAPE]) { esc_blocked_ = false; } Mouse::updateCursorVisibility(); GlobalInputs::handle(); } bool JI_KeyPressed(int key) { if (waitTime > 0) return false; // Si ESC està bloquejat per l'overlay, no la passem al joc if (key == SDL_SCANCODE_ESCAPE && esc_blocked_) return false; return keystates[key] != 0; } bool JI_CheatActivated(const char* cheat_code) { bool found = true; for (size_t i = 0; i < strlen(cheat_code); i++) { if (cheat[i] != cheat_code[i]) found = false; } return found; } bool JI_AnyKey() { return waitTime > 0 ? false : key_pressed; }