diff --git a/source/core/input/global_inputs.cpp b/source/core/input/global_inputs.cpp index c494f73..6e0c5a7 100644 --- a/source/core/input/global_inputs.cpp +++ b/source/core/input/global_inputs.cpp @@ -13,20 +13,29 @@ #include "utils/utils.hpp" // Para stringInVector namespace GlobalInputs { -void quit() { + +// Funciones internas +namespace { +void handleQuit() { const std::string CODE = SceneManager::current == SceneManager::Scene::GAME ? "PRESS AGAIN TO RETURN TO MENU" : "PRESS AGAIN TO EXIT"; auto code_found = stringInVector(Notifier::get()->getCodes(), CODE); if (code_found) { // Si la notificación de salir está activa, cambia de sección - SceneManager::current = SceneManager::current == SceneManager::Scene::GAME ? SceneManager::Scene::TITLE : SceneManager::Scene::QUIT; + switch (SceneManager::current) { + case SceneManager::Scene::GAME: + SceneManager::current = SceneManager::Scene::TITLE; + break; + default: + SceneManager::current = SceneManager::Scene::QUIT; + break; + } } else { // Si la notificación de salir no está activa, muestra la notificación Notifier::get()->show({CODE}, NotificationText::CENTER, 2000, -1, true, CODE); } } -// Cambia de seccion -void skipSection() { +void handleSkipSection() { switch (SceneManager::current) { case SceneManager::Scene::LOGO: case SceneManager::Scene::LOADING_SCREEN: @@ -44,61 +53,150 @@ void skipSection() { } } +void handleToggleBorder() { + Screen::get()->toggleBorder(); + Notifier::get()->show({"BORDER " + std::string(Options::video.border.enabled ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); +} + +void handleToggleVideoMode() { + Screen::get()->toggleVideoMode(); + Notifier::get()->show({"FULLSCREEN " + std::string(static_cast(Options::video.fullscreen) == 0 ? "DISABLED" : "ENABLED")}, NotificationText::CENTER); +} + +void handleDecWindowZoom() { + if (Screen::get()->decWindowZoom()) { + Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)}, NotificationText::CENTER); + } +} + +void handleIncWindowZoom() { + if (Screen::get()->incWindowZoom()) { + Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)}, NotificationText::CENTER); + } +} + +void handleToggleShaders() { + Screen::get()->toggleShaders(); + Notifier::get()->show({"SHADERS " + std::string(Options::video.shaders ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); +} + +void handleNextPalette() { + Screen::get()->nextPalette(); + Notifier::get()->show({"PALETTE " + Options::video.palette}, NotificationText::CENTER); +} + +void handlePreviousPalette() { + Screen::get()->previousPalette(); + Notifier::get()->show({"PALETTE " + Options::video.palette}, NotificationText::CENTER); +} + +void handleToggleIntegerScale() { + Screen::get()->toggleIntegerScale(); + Screen::get()->setVideoMode(Options::video.fullscreen); + Notifier::get()->show({"INTEGER SCALE " + std::string(Options::video.integer_scale ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); +} + +void handleShowDebugInfo() { + Screen::get()->toggleDebugInfo(); +} + +// Detecta qué acción global ha sido presionada (si alguna) +InputAction getPressedAction() { + if (Input::get()->checkAction(InputAction::EXIT, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::EXIT; + } + if (Input::get()->checkAction(InputAction::ACCEPT, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::ACCEPT; + } + if (Input::get()->checkAction(InputAction::TOGGLE_BORDER, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::TOGGLE_BORDER; + } + if (Input::get()->checkAction(InputAction::TOGGLE_VIDEOMODE, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::TOGGLE_VIDEOMODE; + } + if (Input::get()->checkAction(InputAction::WINDOW_DEC_ZOOM, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::WINDOW_DEC_ZOOM; + } + if (Input::get()->checkAction(InputAction::WINDOW_INC_ZOOM, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::WINDOW_INC_ZOOM; + } + if (Input::get()->checkAction(InputAction::TOGGLE_SHADERS, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::TOGGLE_SHADERS; + } + if (Input::get()->checkAction(InputAction::NEXT_PALETTE, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::NEXT_PALETTE; + } + if (Input::get()->checkAction(InputAction::PREVIOUS_PALETTE, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::PREVIOUS_PALETTE; + } + if (Input::get()->checkAction(InputAction::TOGGLE_INTEGER_SCALE, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::TOGGLE_INTEGER_SCALE; + } + if (Input::get()->checkAction(InputAction::SHOW_DEBUG_INFO, Input::DO_NOT_ALLOW_REPEAT)) { + return InputAction::SHOW_DEBUG_INFO; + } + return InputAction::NONE; +} + +} // namespace + +// Funciones públicas + // Comprueba los inputs que se pueden introducir en cualquier sección del juego void handle() { - if (Input::get()->checkAction(InputAction::EXIT, Input::DO_NOT_ALLOW_REPEAT)) { - quit(); - } + // Detectar qué acción global está siendo presionada + InputAction action = getPressedAction(); - else if (Input::get()->checkAction(InputAction::ACCEPT, Input::DO_NOT_ALLOW_REPEAT)) { - skipSection(); - } + // Ejecutar el handler correspondiente usando switch statement + switch (action) { + case InputAction::EXIT: + handleQuit(); + break; - else if (Input::get()->checkAction(InputAction::TOGGLE_BORDER, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->toggleBorder(); - Notifier::get()->show({"BORDER " + std::string(Options::video.border.enabled ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); - } + case InputAction::ACCEPT: + handleSkipSection(); + break; - else if (Input::get()->checkAction(InputAction::TOGGLE_VIDEOMODE, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->toggleVideoMode(); - Notifier::get()->show({"FULLSCREEN " + std::string(static_cast(Options::video.fullscreen) == 0 ? "DISABLED" : "ENABLED")}, NotificationText::CENTER); - } + case InputAction::TOGGLE_BORDER: + handleToggleBorder(); + break; - else if (Input::get()->checkAction(InputAction::WINDOW_DEC_ZOOM, Input::DO_NOT_ALLOW_REPEAT)) { - if (Screen::get()->decWindowZoom()) { - Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)}, NotificationText::CENTER); - } - } + case InputAction::TOGGLE_VIDEOMODE: + handleToggleVideoMode(); + break; - else if (Input::get()->checkAction(InputAction::WINDOW_INC_ZOOM, Input::DO_NOT_ALLOW_REPEAT)) { - if (Screen::get()->incWindowZoom()) { - Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)}, NotificationText::CENTER); - } - } + case InputAction::WINDOW_DEC_ZOOM: + handleDecWindowZoom(); + break; - else if (Input::get()->checkAction(InputAction::TOGGLE_SHADERS, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->toggleShaders(); - Notifier::get()->show({"SHADERS " + std::string(Options::video.shaders ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); - } + case InputAction::WINDOW_INC_ZOOM: + handleIncWindowZoom(); + break; - else if (Input::get()->checkAction(InputAction::NEXT_PALETTE, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->nextPalette(); - Notifier::get()->show({"PALETTE " + Options::video.palette}, NotificationText::CENTER); - } + case InputAction::TOGGLE_SHADERS: + handleToggleShaders(); + break; - else if (Input::get()->checkAction(InputAction::PREVIOUS_PALETTE, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->previousPalette(); - Notifier::get()->show({"PALETTE " + Options::video.palette}, NotificationText::CENTER); - } + case InputAction::NEXT_PALETTE: + handleNextPalette(); + break; - else if (Input::get()->checkAction(InputAction::TOGGLE_INTEGER_SCALE, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->toggleIntegerScale(); - Screen::get()->setVideoMode(Options::video.fullscreen); - Notifier::get()->show({"INTEGER SCALE " + std::string(Options::video.integer_scale ? "ENABLED" : "DISABLED")}, NotificationText::CENTER); - } + case InputAction::PREVIOUS_PALETTE: + handlePreviousPalette(); + break; - else if (Input::get()->checkAction(InputAction::SHOW_DEBUG_INFO, Input::DO_NOT_ALLOW_REPEAT)) { - Screen::get()->toggleDebugInfo(); + case InputAction::TOGGLE_INTEGER_SCALE: + handleToggleIntegerScale(); + break; + + case InputAction::SHOW_DEBUG_INFO: + handleShowDebugInfo(); + break; + + case InputAction::NONE: + default: + // No se presionó ninguna acción global + break; } } } // namespace GlobalInputs \ No newline at end of file