export module vibe2.input; import vibe2.core; import vibe2.external.sdl_wrapper; export namespace vibe2::input { // Acciones del juego enum class GameAction { EXIT, PUSH_BALLS, TOGGLE_GRAVITY, TOGGLE_VSYNC, TOGGLE_DEBUG, CYCLE_THEME, SET_THEME_SUNSET, SET_THEME_OCEAN, SET_THEME_NEON, SET_THEME_FOREST, SET_SCENARIO_1, SET_SCENARIO_2, SET_SCENARIO_3, SET_SCENARIO_4, SET_SCENARIO_5, SET_SCENARIO_6, SET_SCENARIO_7, SET_SCENARIO_8, NONE }; // Mapeador básico de teclas class KeyMapper { public: static GameAction getActionForKey(int key) { switch (key) { case vibe2::sdl::KEY_ESCAPE: return GameAction::EXIT; case vibe2::sdl::KEY_SPACE: return GameAction::PUSH_BALLS; case vibe2::sdl::KEY_G: return GameAction::TOGGLE_GRAVITY; case vibe2::sdl::KEY_V: return GameAction::TOGGLE_VSYNC; case vibe2::sdl::KEY_H: return GameAction::TOGGLE_DEBUG; case vibe2::sdl::KEY_T: return GameAction::CYCLE_THEME; case vibe2::sdl::KEY_F1: return GameAction::SET_THEME_SUNSET; case vibe2::sdl::KEY_F2: return GameAction::SET_THEME_OCEAN; case vibe2::sdl::KEY_F3: return GameAction::SET_THEME_NEON; case vibe2::sdl::KEY_F4: return GameAction::SET_THEME_FOREST; case vibe2::sdl::KEY_1: return GameAction::SET_SCENARIO_1; case vibe2::sdl::KEY_2: return GameAction::SET_SCENARIO_2; case vibe2::sdl::KEY_3: return GameAction::SET_SCENARIO_3; case vibe2::sdl::KEY_4: return GameAction::SET_SCENARIO_4; case vibe2::sdl::KEY_5: return GameAction::SET_SCENARIO_5; case vibe2::sdl::KEY_6: return GameAction::SET_SCENARIO_6; case vibe2::sdl::KEY_7: return GameAction::SET_SCENARIO_7; case vibe2::sdl::KEY_8: return GameAction::SET_SCENARIO_8; default: return GameAction::NONE; } } static const char* getActionDescription(GameAction action) { switch (action) { case GameAction::EXIT: return "Salir"; case GameAction::PUSH_BALLS: return "Impulsar pelotas"; case GameAction::TOGGLE_GRAVITY: return "Alternar gravedad"; case GameAction::TOGGLE_VSYNC: return "Alternar V-Sync"; case GameAction::TOGGLE_DEBUG: return "Alternar debug"; case GameAction::CYCLE_THEME: return "Cambiar tema"; case GameAction::SET_THEME_SUNSET: return "Tema Atardecer"; case GameAction::SET_THEME_OCEAN: return "Tema Océano"; case GameAction::SET_THEME_NEON: return "Tema Neón"; case GameAction::SET_THEME_FOREST: return "Tema Bosque"; case GameAction::SET_SCENARIO_1: return "1 pelota"; case GameAction::SET_SCENARIO_2: return "10 pelotas"; case GameAction::SET_SCENARIO_3: return "100 pelotas"; case GameAction::SET_SCENARIO_4: return "500 pelotas"; case GameAction::SET_SCENARIO_5: return "1K pelotas"; case GameAction::SET_SCENARIO_6: return "10K pelotas"; case GameAction::SET_SCENARIO_7: return "50K pelotas"; case GameAction::SET_SCENARIO_8: return "100K pelotas"; default: return "Desconocido"; } } }; // Utilidades para conversión de escenarios namespace utils { constexpr int SCENARIO_COUNTS[8] = {1, 10, 100, 500, 1000, 10000, 50000, 100000}; inline int getScenarioIndex(GameAction action) { switch (action) { case GameAction::SET_SCENARIO_1: return 0; case GameAction::SET_SCENARIO_2: return 1; case GameAction::SET_SCENARIO_3: return 2; case GameAction::SET_SCENARIO_4: return 3; case GameAction::SET_SCENARIO_5: return 4; case GameAction::SET_SCENARIO_6: return 5; case GameAction::SET_SCENARIO_7: return 6; case GameAction::SET_SCENARIO_8: return 7; default: return -1; } } inline int getScenarioCount(GameAction action) { int index = getScenarioIndex(action); return (index >= 0) ? SCENARIO_COUNTS[index] : 0; } inline ColorTheme getThemeFromAction(GameAction action) { switch (action) { case GameAction::SET_THEME_SUNSET: return ColorTheme::SUNSET; case GameAction::SET_THEME_OCEAN: return ColorTheme::OCEAN; case GameAction::SET_THEME_NEON: return ColorTheme::NEON; case GameAction::SET_THEME_FOREST: return ColorTheme::FOREST; default: return ColorTheme::SUNSET; } } inline bool isScenarioAction(GameAction action) { return action >= GameAction::SET_SCENARIO_1 && action <= GameAction::SET_SCENARIO_8; } inline bool isThemeAction(GameAction action) { return action >= GameAction::SET_THEME_SUNSET && action <= GameAction::SET_THEME_FOREST; } } }