diff --git a/source/core/rendering/screen.cpp b/source/core/rendering/screen.cpp index fe59e40..a424dc3 100644 --- a/source/core/rendering/screen.cpp +++ b/source/core/rendering/screen.cpp @@ -194,6 +194,21 @@ auto Screen::incWindowZoom() -> bool { return false; } +// Establece el zoom directamente; false si fuera del rango [1, max_zoom] o en pantalla completa +auto Screen::setWindowZoom(int zoom) -> bool { + if (Options::video.fullscreen) { return false; } + if (zoom < 1 || zoom > Options::window.max_zoom) { return false; } + if (zoom == Options::window.zoom) { return false; } + Options::window.zoom = zoom; + setVideoMode(Options::video.fullscreen); + return true; +} + +// Devuelve el zoom máximo permitido según la pantalla actual +auto Screen::getMaxZoom() const -> int { + return Options::window.max_zoom; +} + // Cambia el color del borde void Screen::setBorderColor(Uint8 color) { border_color_ = color; diff --git a/source/core/rendering/screen.hpp b/source/core/rendering/screen.hpp index fd30de9..dca9931 100644 --- a/source/core/rendering/screen.hpp +++ b/source/core/rendering/screen.hpp @@ -39,8 +39,9 @@ class Screen { void toggleVideoMode(); // Cambia entre pantalla completa y ventana void toggleIntegerScale(); // Alterna entre activar y desactivar el escalado entero void toggleVSync(); // Alterna entre activar y desactivar el V-Sync - auto decWindowZoom() -> bool; // Reduce el tamaño de la ventana - auto incWindowZoom() -> bool; // Aumenta el tamaño de la ventana + auto decWindowZoom() -> bool; // Reduce el tamaño de la ventana + auto incWindowZoom() -> bool; // Aumenta el tamaño de la ventana + auto setWindowZoom(int zoom) -> bool; // Establece zoom directo; false si fuera de [1, max_zoom] void show(); // Muestra la ventana void hide(); // Oculta la ventana @@ -81,6 +82,7 @@ class Screen { [[nodiscard]] auto getGPUDriver() const -> const std::string& { return gpu_driver_; } [[nodiscard]] auto getLastFPS() const -> int { return fps_.last_value; } [[nodiscard]] auto getZoomFactor() const -> float { return zoom_factor_; } + [[nodiscard]] auto getMaxZoom() const -> int; [[nodiscard]] auto getSsTextureSize() const -> std::pair; private: diff --git a/source/game/ui/console.cpp b/source/game/ui/console.cpp index 79853e8..0d87a8a 100644 --- a/source/game/ui/console.cpp +++ b/source/game/ui/console.cpp @@ -298,7 +298,7 @@ static const std::vector COMMANDS = { // ZOOM UP/DOWN — Zoom de ventana (F1/F2) {.keyword = "ZOOM", .execute = [](const std::vector& args) -> std::string { - if (args.empty()) { return "usage: zoom [up|down]"; } + if (args.empty()) { return "usage: zoom [up|down|<1-" + std::to_string(Screen::get()->getMaxZoom()) + ">]"; } if (args[0] == "UP") { if (!Screen::get()->incWindowZoom()) { return "Max zoom reached"; } return "Zoom " + std::to_string(Options::window.zoom); @@ -307,7 +307,18 @@ static const std::vector COMMANDS = { if (!Screen::get()->decWindowZoom()) { return "Min zoom reached"; } return "Zoom " + std::to_string(Options::window.zoom); } - return "usage: zoom [up|down]"; + // Zoom numérico directo + try { + const int N = std::stoi(args[0]); + const int MAX = Screen::get()->getMaxZoom(); + if (N < 1 || N > MAX) { + return "Zoom must be between 1 and " + std::to_string(MAX); + } + if (N == Options::window.zoom) { return "Zoom already " + std::to_string(N); } + Screen::get()->setWindowZoom(N); + return "Zoom " + std::to_string(Options::window.zoom); + } catch (...) {} + return "usage: zoom [up|down|<1-" + std::to_string(Screen::get()->getMaxZoom()) + ">]"; }, .completions = {{"ZOOM", {"UP", "DOWN"}}}},