#include "core/system/global_events.hpp" #include "core/input/input.hpp" // Para Input (gamepad add/remove) #include "core/input/mouse.hpp" #include "core/locale/locale.hpp" // Para Locale #include "game/options.hpp" // Para Options, options, OptionsGame, OptionsAudio #include "game/scene_manager.hpp" // Para SceneManager #include "game/ui/console.hpp" // Para Console #include "game/ui/notifier.hpp" // Para Notifier namespace GlobalEvents { // Comprueba los eventos que se pueden producir en cualquier sección del juego void handle(const SDL_Event& event) { #ifndef __EMSCRIPTEN__ // En la versión web no tenemos evento de quit del navegador if (event.type == SDL_EVENT_QUIT) { SceneManager::current = SceneManager::Scene::QUIT; return; } #endif if (event.type == SDL_EVENT_RENDER_DEVICE_RESET || event.type == SDL_EVENT_RENDER_TARGETS_RESET) { // reLoadTextures(); } // Conexión/desconexión de gamepads: hay que enrutarlos a Input para que // añada el dispositivo a gamepads_. Sin esto, en wasm los gamepads // nunca se detectan (la Gamepad API del navegador sólo los expone // tras que el usuario los active, más tarde que el discoverGamepads // inicial). En desktop también arregla la conexión en caliente. if (event.type == SDL_EVENT_GAMEPAD_ADDED || event.type == SDL_EVENT_GAMEPAD_REMOVED) { if (Input::get() != nullptr) { std::string name = Input::get()->handleEvent(event); if (!name.empty() && Notifier::get() != nullptr && Locale::get() != nullptr) { const std::string KEY = (event.type == SDL_EVENT_GAMEPAD_ADDED) ? "ui.gamepad_connected" : "ui.gamepad_disconnected"; Notifier::get()->show({name + " " + Locale::get()->get(KEY)}); } } } // Enrutar eventos de texto a la consola cuando está activa if (Console::get() != nullptr && Console::get()->isActive()) { if (event.type == SDL_EVENT_TEXT_INPUT || event.type == SDL_EVENT_KEY_DOWN) { Console::get()->handleEvent(event); return; } } Mouse::handleEvent(event); } } // namespace GlobalEvents