clang format
This commit is contained in:
@@ -7,16 +7,16 @@
|
||||
#include <string> // Para string
|
||||
#include <vector> // Para vector
|
||||
|
||||
#include "core/audio/audio.hpp" // Para Audio
|
||||
#include "core/rendering/screen.hpp" // Para Screen
|
||||
#include "core/rendering/sprite/sprite.hpp" // Para Sprite
|
||||
#include "core/rendering/surface.hpp" // Para Surface
|
||||
#include "core/rendering/text.hpp" // Para Text
|
||||
#include "core/resources/resource_cache.hpp" // Para Resource
|
||||
#include "game/options.hpp" // Para Options
|
||||
#include "core/rendering/render_info.hpp" // Para RenderInfo
|
||||
#include "game/scene_manager.hpp" // Para SceneManager
|
||||
#include "game/ui/notifier.hpp" // Para Notifier
|
||||
#include "core/audio/audio.hpp" // Para Audio
|
||||
#include "core/rendering/render_info.hpp" // Para RenderInfo
|
||||
#include "core/rendering/screen.hpp" // Para Screen
|
||||
#include "core/rendering/sprite/sprite.hpp" // Para Sprite
|
||||
#include "core/rendering/surface.hpp" // Para Surface
|
||||
#include "core/rendering/text.hpp" // Para Text
|
||||
#include "core/resources/resource_cache.hpp" // Para Resource
|
||||
#include "game/options.hpp" // Para Options
|
||||
#include "game/scene_manager.hpp" // Para SceneManager
|
||||
#include "game/ui/notifier.hpp" // Para Notifier
|
||||
|
||||
// ── Sistema de comandos ────────────────────────────────────────────────────────
|
||||
|
||||
@@ -46,21 +46,23 @@ static auto parseTokens(const std::string& input) -> std::vector<std::string> {
|
||||
}
|
||||
|
||||
// Macro para comando de toggle booleano (evita repetición en ON/OFF)
|
||||
#define BOOL_TOGGLE_CMD(label, getter, toggle_fn) \
|
||||
[](const std::vector<std::string>& args) -> std::string { \
|
||||
if (args.empty()) { \
|
||||
(toggle_fn); \
|
||||
return label " " + std::string((getter) ? "ON" : "OFF"); \
|
||||
} \
|
||||
if (args[0] == "ON") { \
|
||||
if (getter) { return label " already ON"; } \
|
||||
(toggle_fn); return label " ON"; \
|
||||
} \
|
||||
if (args[0] == "OFF") { \
|
||||
if (!(getter)) { return label " already OFF"; } \
|
||||
(toggle_fn); return label " OFF"; \
|
||||
} \
|
||||
return "Usage: " label " [ON|OFF]"; \
|
||||
#define BOOL_TOGGLE_CMD(label, getter, toggle_fn) \
|
||||
[](const std::vector<std::string>& args) -> std::string { \
|
||||
if (args.empty()) { \
|
||||
(toggle_fn); \
|
||||
return label " " + std::string((getter) ? "ON" : "OFF"); \
|
||||
} \
|
||||
if (args[0] == "ON") { \
|
||||
if (getter) { return label " already ON"; } \
|
||||
(toggle_fn); \
|
||||
return label " ON"; \
|
||||
} \
|
||||
if (args[0] == "OFF") { \
|
||||
if (!(getter)) { return label " already OFF"; } \
|
||||
(toggle_fn); \
|
||||
return label " OFF"; \
|
||||
} \
|
||||
return "Usage: " label " [ON|OFF]"; \
|
||||
}
|
||||
|
||||
// Texto de ayuda común para HELP y ?
|
||||
@@ -92,408 +94,410 @@ static void printHelp() {
|
||||
// Tabla de comandos disponibles
|
||||
static const std::vector<ConsoleCommand> COMMANDS = {
|
||||
// SS [ON|OFF] — Supersampling (Ctrl+F4)
|
||||
{.keyword = "SS", .execute = BOOL_TOGGLE_CMD("Supersampling",
|
||||
Options::video.supersampling,
|
||||
Screen::get()->toggleSupersampling())},
|
||||
{.keyword = "SS", .execute = BOOL_TOGGLE_CMD("Supersampling", Options::video.supersampling, Screen::get()->toggleSupersampling())},
|
||||
|
||||
// POSTFX [ON|OFF|NEXT] — PostFX y presets (F4 / Shift+F4)
|
||||
{.keyword = "POSTFX", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) {
|
||||
Screen::get()->togglePostFX();
|
||||
return std::string("PostFX ") + (Options::video.postfx ? "ON" : "OFF");
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::video.postfx) { return "PostFX already ON"; }
|
||||
Screen::get()->togglePostFX(); return "PostFX ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::video.postfx) { return "PostFX already OFF"; }
|
||||
Screen::get()->togglePostFX(); return "PostFX OFF";
|
||||
}
|
||||
if (args[0] == "NEXT") {
|
||||
if (Options::postfx_presets.empty()) { return "No presets available"; }
|
||||
Options::current_postfx_preset =
|
||||
(Options::current_postfx_preset + 1) %
|
||||
static_cast<int>(Options::postfx_presets.size());
|
||||
Screen::get()->reloadPostFX();
|
||||
return "PostFX preset: " +
|
||||
Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name;
|
||||
}
|
||||
return "Usage: POSTFX [ON|OFF|NEXT]";
|
||||
}},
|
||||
if (args.empty()) {
|
||||
Screen::get()->togglePostFX();
|
||||
return std::string("PostFX ") + (Options::video.postfx ? "ON" : "OFF");
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::video.postfx) { return "PostFX already ON"; }
|
||||
Screen::get()->togglePostFX();
|
||||
return "PostFX ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::video.postfx) { return "PostFX already OFF"; }
|
||||
Screen::get()->togglePostFX();
|
||||
return "PostFX OFF";
|
||||
}
|
||||
if (args[0] == "NEXT") {
|
||||
if (Options::postfx_presets.empty()) { return "No presets available"; }
|
||||
Options::current_postfx_preset =
|
||||
(Options::current_postfx_preset + 1) %
|
||||
static_cast<int>(Options::postfx_presets.size());
|
||||
Screen::get()->reloadPostFX();
|
||||
return "PostFX preset: " +
|
||||
Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name;
|
||||
}
|
||||
return "Usage: POSTFX [ON|OFF|NEXT]";
|
||||
}},
|
||||
|
||||
// BORDER [ON|OFF] — Borde decorativo (B)
|
||||
{.keyword = "BORDER", .execute = BOOL_TOGGLE_CMD("Border",
|
||||
Options::video.border.enabled,
|
||||
Screen::get()->toggleBorder())},
|
||||
{.keyword = "BORDER", .execute = BOOL_TOGGLE_CMD("Border", Options::video.border.enabled, Screen::get()->toggleBorder())},
|
||||
|
||||
// FULLSCREEN [ON|OFF [PLEASE]] — Pantalla completa (F3); OFF bloqueado en kiosk sin PLEASE
|
||||
{.keyword = "FULLSCREEN", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
const bool EXPLICIT_ON = !args.empty() && args[0] == "ON";
|
||||
const bool EXPLICIT_OFF = !args.empty() && args[0] == "OFF";
|
||||
const bool WITH_PLEASE = !args.empty() && args.back() == "PLEASE";
|
||||
const bool IS_TOGGLE = args.empty();
|
||||
const bool TURNING_OFF = EXPLICIT_OFF || (IS_TOGGLE && Options::video.fullscreen);
|
||||
const bool EXPLICIT_ON = !args.empty() && args[0] == "ON";
|
||||
const bool EXPLICIT_OFF = !args.empty() && args[0] == "OFF";
|
||||
const bool WITH_PLEASE = !args.empty() && args.back() == "PLEASE";
|
||||
const bool IS_TOGGLE = args.empty();
|
||||
const bool TURNING_OFF = EXPLICIT_OFF || (IS_TOGGLE && Options::video.fullscreen);
|
||||
|
||||
if (TURNING_OFF && Options::kiosk.enabled && !WITH_PLEASE) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
if (EXPLICIT_ON) {
|
||||
if (Options::video.fullscreen) { return "Fullscreen already ON"; }
|
||||
Screen::get()->toggleVideoMode(); return "Fullscreen ON";
|
||||
}
|
||||
if (EXPLICIT_OFF) {
|
||||
if (!Options::video.fullscreen) { return "Fullscreen already OFF"; }
|
||||
Screen::get()->toggleVideoMode(); return "Fullscreen OFF";
|
||||
}
|
||||
if (IS_TOGGLE) {
|
||||
Screen::get()->toggleVideoMode();
|
||||
return std::string("Fullscreen ") + (Options::video.fullscreen ? "ON" : "OFF");
|
||||
}
|
||||
return "Usage: FULLSCREEN [ON|OFF]";
|
||||
}},
|
||||
if (TURNING_OFF && Options::kiosk.enabled && !WITH_PLEASE) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
if (EXPLICIT_ON) {
|
||||
if (Options::video.fullscreen) { return "Fullscreen already ON"; }
|
||||
Screen::get()->toggleVideoMode();
|
||||
return "Fullscreen ON";
|
||||
}
|
||||
if (EXPLICIT_OFF) {
|
||||
if (!Options::video.fullscreen) { return "Fullscreen already OFF"; }
|
||||
Screen::get()->toggleVideoMode();
|
||||
return "Fullscreen OFF";
|
||||
}
|
||||
if (IS_TOGGLE) {
|
||||
Screen::get()->toggleVideoMode();
|
||||
return std::string("Fullscreen ") + (Options::video.fullscreen ? "ON" : "OFF");
|
||||
}
|
||||
return "Usage: FULLSCREEN [ON|OFF]";
|
||||
}},
|
||||
|
||||
// ZOOM UP/DOWN — Zoom de ventana (F1/F2)
|
||||
{.keyword = "ZOOM", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) { return "Usage: ZOOM [UP|DOWN]"; }
|
||||
if (args[0] == "UP") {
|
||||
if (!Screen::get()->incWindowZoom()) { return "Max zoom reached"; }
|
||||
return "Zoom " + std::to_string(Options::window.zoom);
|
||||
}
|
||||
if (args[0] == "DOWN") {
|
||||
if (!Screen::get()->decWindowZoom()) { return "Min zoom reached"; }
|
||||
return "Zoom " + std::to_string(Options::window.zoom);
|
||||
}
|
||||
return "Usage: ZOOM [UP|DOWN]";
|
||||
}},
|
||||
if (args.empty()) { return "Usage: ZOOM [UP|DOWN]"; }
|
||||
if (args[0] == "UP") {
|
||||
if (!Screen::get()->incWindowZoom()) { return "Max zoom reached"; }
|
||||
return "Zoom " + std::to_string(Options::window.zoom);
|
||||
}
|
||||
if (args[0] == "DOWN") {
|
||||
if (!Screen::get()->decWindowZoom()) { return "Min zoom reached"; }
|
||||
return "Zoom " + std::to_string(Options::window.zoom);
|
||||
}
|
||||
return "Usage: ZOOM [UP|DOWN]";
|
||||
}},
|
||||
|
||||
// INTSCALE [ON|OFF] — Escalado entero (F7)
|
||||
{.keyword = "INTSCALE", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
const bool ON = args.empty() ? !Options::video.integer_scale
|
||||
: (args[0] == "ON");
|
||||
if (!args.empty() && args[0] != "ON" && args[0] != "OFF") {
|
||||
return "Usage: INTSCALE [ON|OFF]";
|
||||
}
|
||||
if (ON == Options::video.integer_scale) {
|
||||
return std::string("IntScale already ") + (ON ? "ON" : "OFF");
|
||||
}
|
||||
Screen::get()->toggleIntegerScale();
|
||||
Screen::get()->setVideoMode(Options::video.fullscreen);
|
||||
return std::string("IntScale ") + (Options::video.integer_scale ? "ON" : "OFF");
|
||||
}},
|
||||
const bool ON = args.empty() ? !Options::video.integer_scale
|
||||
: (args[0] == "ON");
|
||||
if (!args.empty() && args[0] != "ON" && args[0] != "OFF") {
|
||||
return "Usage: INTSCALE [ON|OFF]";
|
||||
}
|
||||
if (ON == Options::video.integer_scale) {
|
||||
return std::string("IntScale already ") + (ON ? "ON" : "OFF");
|
||||
}
|
||||
Screen::get()->toggleIntegerScale();
|
||||
Screen::get()->setVideoMode(Options::video.fullscreen);
|
||||
return std::string("IntScale ") + (Options::video.integer_scale ? "ON" : "OFF");
|
||||
}},
|
||||
|
||||
// UPSCALE [NEAREST|LINEAR] — Filtro de upscale en supersampling
|
||||
{.keyword = "UPSCALE", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) {
|
||||
Screen::get()->setLinearUpscale(!Options::video.linear_upscale);
|
||||
return std::string("Upscale: ") + (Options::video.linear_upscale ? "Linear" : "Nearest");
|
||||
}
|
||||
if (args[0] == "NEAREST") {
|
||||
if (!Options::video.linear_upscale) { return "Upscale already Nearest"; }
|
||||
Screen::get()->setLinearUpscale(false); return "Upscale: Nearest";
|
||||
}
|
||||
if (args[0] == "LINEAR") {
|
||||
if (Options::video.linear_upscale) { return "Upscale already Linear"; }
|
||||
Screen::get()->setLinearUpscale(true); return "Upscale: Linear";
|
||||
}
|
||||
return "Usage: UPSCALE [NEAREST|LINEAR]";
|
||||
}},
|
||||
if (args.empty()) {
|
||||
Screen::get()->setLinearUpscale(!Options::video.linear_upscale);
|
||||
return std::string("Upscale: ") + (Options::video.linear_upscale ? "Linear" : "Nearest");
|
||||
}
|
||||
if (args[0] == "NEAREST") {
|
||||
if (!Options::video.linear_upscale) { return "Upscale already Nearest"; }
|
||||
Screen::get()->setLinearUpscale(false);
|
||||
return "Upscale: Nearest";
|
||||
}
|
||||
if (args[0] == "LINEAR") {
|
||||
if (Options::video.linear_upscale) { return "Upscale already Linear"; }
|
||||
Screen::get()->setLinearUpscale(true);
|
||||
return "Upscale: Linear";
|
||||
}
|
||||
return "Usage: UPSCALE [NEAREST|LINEAR]";
|
||||
}},
|
||||
|
||||
// DOWNSCALE [BILINEAR|LANCZOS2|LANCZOS3] — Algoritmo de downscale en supersampling
|
||||
{.keyword = "DOWNSCALE", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
static const std::array<std::string_view, 3> NAMES = {"Bilinear", "Lanczos2", "Lanczos3"};
|
||||
if (args.empty()) {
|
||||
return std::string("Downscale: ") + std::string(NAMES[static_cast<size_t>(Options::video.downscale_algo)]);
|
||||
}
|
||||
int algo = -1;
|
||||
if (args[0] == "BILINEAR") { algo = 0; }
|
||||
if (args[0] == "LANCZOS2") { algo = 1; }
|
||||
if (args[0] == "LANCZOS3") { algo = 2; }
|
||||
if (algo == -1) { return "Usage: DOWNSCALE [BILINEAR|LANCZOS2|LANCZOS3]"; }
|
||||
if (Options::video.downscale_algo == algo) {
|
||||
return std::string("Downscale already ") + std::string(NAMES[static_cast<size_t>(algo)]);
|
||||
}
|
||||
Screen::get()->setDownscaleAlgo(algo);
|
||||
return std::string("Downscale: ") + std::string(NAMES[static_cast<size_t>(algo)]);
|
||||
}},
|
||||
static const std::array<std::string_view, 3> NAMES = {"Bilinear", "Lanczos2", "Lanczos3"};
|
||||
if (args.empty()) {
|
||||
return std::string("Downscale: ") + std::string(NAMES[static_cast<size_t>(Options::video.downscale_algo)]);
|
||||
}
|
||||
int algo = -1;
|
||||
if (args[0] == "BILINEAR") { algo = 0; }
|
||||
if (args[0] == "LANCZOS2") { algo = 1; }
|
||||
if (args[0] == "LANCZOS3") { algo = 2; }
|
||||
if (algo == -1) { return "Usage: DOWNSCALE [BILINEAR|LANCZOS2|LANCZOS3]"; }
|
||||
if (Options::video.downscale_algo == algo) {
|
||||
return std::string("Downscale already ") + std::string(NAMES[static_cast<size_t>(algo)]);
|
||||
}
|
||||
Screen::get()->setDownscaleAlgo(algo);
|
||||
return std::string("Downscale: ") + std::string(NAMES[static_cast<size_t>(algo)]);
|
||||
}},
|
||||
|
||||
// VSYNC [ON|OFF] — Sincronización vertical
|
||||
{.keyword = "VSYNC", .execute = BOOL_TOGGLE_CMD("VSync",
|
||||
Options::video.vertical_sync,
|
||||
Screen::get()->toggleVSync())},
|
||||
{.keyword = "VSYNC", .execute = BOOL_TOGGLE_CMD("VSync", Options::video.vertical_sync, Screen::get()->toggleVSync())},
|
||||
|
||||
// DRIVER [LIST|AUTO|<nombre>] — Driver GPU (aplica en el próximo arranque)
|
||||
{.keyword = "DRIVER", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
// Sin argumentos: muestra el driver activo (permitido en kiosk)
|
||||
if (args.empty()) {
|
||||
const auto& driver = Screen::get()->getGPUDriver();
|
||||
return "GPU: " + (driver.empty() ? std::string("sdl") : driver);
|
||||
}
|
||||
// LIST: lista drivers disponibles marcando el activo con * (permitido en kiosk)
|
||||
if (args[0] == "LIST") {
|
||||
const int COUNT = SDL_GetNumGPUDrivers();
|
||||
if (COUNT <= 0) { return "No GPU drivers found"; }
|
||||
const std::string& active = Screen::get()->getGPUDriver();
|
||||
std::string result = "Drivers:";
|
||||
for (int i = 0; i < COUNT; ++i) {
|
||||
const char* name = SDL_GetGPUDriver(i);
|
||||
if (name != nullptr) {
|
||||
result += ' ';
|
||||
result += name;
|
||||
if (active == name) { result += '*'; }
|
||||
}
|
||||
}
|
||||
SDL_Log("SDL GPU drivers: %s", result.c_str());
|
||||
return result;
|
||||
}
|
||||
// Cambiar driver: bloqueado en kiosk salvo PLEASE
|
||||
const bool HAS_PLEASE = std::ranges::find(args, std::string("PLEASE")) != args.end();
|
||||
if (Options::kiosk.enabled && !HAS_PLEASE) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
if (args[0] == "AUTO") {
|
||||
Options::video.gpu_preferred_driver.clear();
|
||||
Options::saveToFile();
|
||||
return "Driver: auto (restart)";
|
||||
}
|
||||
if (args[0] == "NONE") {
|
||||
Options::video.gpu_preferred_driver = "none";
|
||||
Options::saveToFile();
|
||||
return "Driver: none (SDL fallback, restart)";
|
||||
}
|
||||
std::string driver_lower = args[0];
|
||||
std::ranges::transform(driver_lower, driver_lower.begin(), ::tolower);
|
||||
// Validar que el nombre existe en la lista de drivers SDL
|
||||
const int COUNT = SDL_GetNumGPUDrivers();
|
||||
bool found = false;
|
||||
for (int i = 0; i < COUNT && !found; ++i) {
|
||||
const char* name = SDL_GetGPUDriver(i);
|
||||
if (name != nullptr && driver_lower == name) { found = true; }
|
||||
}
|
||||
if (!found) {
|
||||
return "Unknown driver: " + driver_lower + ". Use DRIVER LIST or NONE";
|
||||
}
|
||||
Options::video.gpu_preferred_driver = driver_lower;
|
||||
Options::saveToFile();
|
||||
return "Driver: " + driver_lower + " (restart)";
|
||||
}},
|
||||
// Sin argumentos: muestra el driver activo (permitido en kiosk)
|
||||
if (args.empty()) {
|
||||
const auto& driver = Screen::get()->getGPUDriver();
|
||||
return "GPU: " + (driver.empty() ? std::string("sdl") : driver);
|
||||
}
|
||||
// LIST: lista drivers disponibles marcando el activo con * (permitido en kiosk)
|
||||
if (args[0] == "LIST") {
|
||||
const int COUNT = SDL_GetNumGPUDrivers();
|
||||
if (COUNT <= 0) { return "No GPU drivers found"; }
|
||||
const std::string& active = Screen::get()->getGPUDriver();
|
||||
std::string result = "Drivers:";
|
||||
for (int i = 0; i < COUNT; ++i) {
|
||||
const char* name = SDL_GetGPUDriver(i);
|
||||
if (name != nullptr) {
|
||||
result += ' ';
|
||||
result += name;
|
||||
if (active == name) { result += '*'; }
|
||||
}
|
||||
}
|
||||
SDL_Log("SDL GPU drivers: %s", result.c_str());
|
||||
return result;
|
||||
}
|
||||
// Cambiar driver: bloqueado en kiosk salvo PLEASE
|
||||
const bool HAS_PLEASE = std::ranges::find(args, std::string("PLEASE")) != args.end();
|
||||
if (Options::kiosk.enabled && !HAS_PLEASE) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
if (args[0] == "AUTO") {
|
||||
Options::video.gpu_preferred_driver.clear();
|
||||
Options::saveToFile();
|
||||
return "Driver: auto (restart)";
|
||||
}
|
||||
if (args[0] == "NONE") {
|
||||
Options::video.gpu_preferred_driver = "none";
|
||||
Options::saveToFile();
|
||||
return "Driver: none (SDL fallback, restart)";
|
||||
}
|
||||
std::string driver_lower = args[0];
|
||||
std::ranges::transform(driver_lower, driver_lower.begin(), ::tolower);
|
||||
// Validar que el nombre existe en la lista de drivers SDL
|
||||
const int COUNT = SDL_GetNumGPUDrivers();
|
||||
bool found = false;
|
||||
for (int i = 0; i < COUNT && !found; ++i) {
|
||||
const char* name = SDL_GetGPUDriver(i);
|
||||
if (name != nullptr && driver_lower == name) { found = true; }
|
||||
}
|
||||
if (!found) {
|
||||
return "Unknown driver: " + driver_lower + ". Use DRIVER LIST or NONE";
|
||||
}
|
||||
Options::video.gpu_preferred_driver = driver_lower;
|
||||
Options::saveToFile();
|
||||
return "Driver: " + driver_lower + " (restart)";
|
||||
}},
|
||||
|
||||
// PALETTE NEXT/PREV — Paleta de colores (F5/F6)
|
||||
{.keyword = "PALETTE", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) { return "Usage: PALETTE [NEXT|PREV]"; }
|
||||
if (args[0] == "NEXT") {
|
||||
Screen::get()->nextPalette();
|
||||
return "Palette: " + Options::video.palette;
|
||||
}
|
||||
if (args[0] == "PREV") {
|
||||
Screen::get()->previousPalette();
|
||||
return "Palette: " + Options::video.palette;
|
||||
}
|
||||
return "Usage: PALETTE [NEXT|PREV]";
|
||||
}},
|
||||
if (args.empty()) { return "Usage: PALETTE [NEXT|PREV]"; }
|
||||
if (args[0] == "NEXT") {
|
||||
Screen::get()->nextPalette();
|
||||
return "Palette: " + Options::video.palette;
|
||||
}
|
||||
if (args[0] == "PREV") {
|
||||
Screen::get()->previousPalette();
|
||||
return "Palette: " + Options::video.palette;
|
||||
}
|
||||
return "Usage: PALETTE [NEXT|PREV]";
|
||||
}},
|
||||
|
||||
#ifdef _DEBUG
|
||||
// DEBUG [ON|OFF] — Overlay de debug (F12, solo en builds debug)
|
||||
{.keyword = "DEBUG", .execute = BOOL_TOGGLE_CMD("Debug overlay",
|
||||
RenderInfo::get()->isActive(),
|
||||
RenderInfo::get()->toggle())},
|
||||
{.keyword = "DEBUG", .execute = BOOL_TOGGLE_CMD("Debug overlay", RenderInfo::get()->isActive(), RenderInfo::get()->toggle())},
|
||||
|
||||
// SHOW FPS / HIDE FPS — Aliases de DEBUG ON / DEBUG OFF
|
||||
{.keyword = "SHOW", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty() || args[0] != "FPS") { return "Usage: SHOW FPS"; }
|
||||
if (RenderInfo::get()->isActive()) { return "Debug overlay already ON"; }
|
||||
RenderInfo::get()->toggle(); return "Debug overlay ON";
|
||||
}},
|
||||
if (args.empty() || args[0] != "FPS") { return "Usage: SHOW FPS"; }
|
||||
if (RenderInfo::get()->isActive()) { return "Debug overlay already ON"; }
|
||||
RenderInfo::get()->toggle();
|
||||
return "Debug overlay ON";
|
||||
}},
|
||||
{.keyword = "HIDE", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty() || args[0] != "FPS") { return "Usage: HIDE FPS"; }
|
||||
if (!RenderInfo::get()->isActive()) { return "Debug overlay already OFF"; }
|
||||
RenderInfo::get()->toggle(); return "Debug overlay OFF";
|
||||
}},
|
||||
if (args.empty() || args[0] != "FPS") { return "Usage: HIDE FPS"; }
|
||||
if (!RenderInfo::get()->isActive()) { return "Debug overlay already OFF"; }
|
||||
RenderInfo::get()->toggle();
|
||||
return "Debug overlay OFF";
|
||||
}},
|
||||
#endif
|
||||
|
||||
// SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART] — Cambiar o reiniciar escena
|
||||
{.keyword = "SCENE", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (Options::kiosk.enabled) { return "Not allowed in kiosk mode"; }
|
||||
if (args.empty()) { return "Usage: SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART]"; }
|
||||
if (Options::kiosk.enabled) { return "Not allowed in kiosk mode"; }
|
||||
if (args.empty()) { return "Usage: SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART]"; }
|
||||
|
||||
// RESTART: reinicia la escena actual (funciona desde cualquier escena)
|
||||
if (args[0] == "RESTART") {
|
||||
SceneManager::scene_before_restart = SceneManager::current;
|
||||
SceneManager::current = SceneManager::Scene::RESTART_CURRENT;
|
||||
return "Restarting...";
|
||||
}
|
||||
// RESTART: reinicia la escena actual (funciona desde cualquier escena)
|
||||
if (args[0] == "RESTART") {
|
||||
SceneManager::scene_before_restart = SceneManager::current;
|
||||
SceneManager::current = SceneManager::Scene::RESTART_CURRENT;
|
||||
return "Restarting...";
|
||||
}
|
||||
|
||||
// Para el resto: si pedimos la escena que ya está activa → también reiniciar
|
||||
const auto GO_TO = [](SceneManager::Scene target, const std::string& label) -> std::string {
|
||||
if (SceneManager::current == target) {
|
||||
SceneManager::scene_before_restart = target;
|
||||
SceneManager::current = SceneManager::Scene::RESTART_CURRENT;
|
||||
} else {
|
||||
SceneManager::current = target;
|
||||
}
|
||||
return "Scene: " + label;
|
||||
};
|
||||
// Para el resto: si pedimos la escena que ya está activa → también reiniciar
|
||||
const auto GO_TO = [](SceneManager::Scene target, const std::string& label) -> std::string {
|
||||
if (SceneManager::current == target) {
|
||||
SceneManager::scene_before_restart = target;
|
||||
SceneManager::current = SceneManager::Scene::RESTART_CURRENT;
|
||||
} else {
|
||||
SceneManager::current = target;
|
||||
}
|
||||
return "Scene: " + label;
|
||||
};
|
||||
|
||||
if (args[0] == "LOGO") { return GO_TO(SceneManager::Scene::LOGO, "Logo"); }
|
||||
if (args[0] == "LOADING") { return GO_TO(SceneManager::Scene::LOADING_SCREEN, "Loading"); }
|
||||
if (args[0] == "TITLE") { return GO_TO(SceneManager::Scene::TITLE, "Title"); }
|
||||
if (args[0] == "CREDITS") { return GO_TO(SceneManager::Scene::CREDITS, "Credits"); }
|
||||
if (args[0] == "GAME") { return GO_TO(SceneManager::Scene::GAME, "Game"); }
|
||||
if (args[0] == "ENDING") { return GO_TO(SceneManager::Scene::ENDING, "Ending"); }
|
||||
if (args[0] == "ENDING2") { return GO_TO(SceneManager::Scene::ENDING2, "Ending 2"); }
|
||||
return "Unknown scene: " + args[0];
|
||||
}},
|
||||
if (args[0] == "LOGO") { return GO_TO(SceneManager::Scene::LOGO, "Logo"); }
|
||||
if (args[0] == "LOADING") { return GO_TO(SceneManager::Scene::LOADING_SCREEN, "Loading"); }
|
||||
if (args[0] == "TITLE") { return GO_TO(SceneManager::Scene::TITLE, "Title"); }
|
||||
if (args[0] == "CREDITS") { return GO_TO(SceneManager::Scene::CREDITS, "Credits"); }
|
||||
if (args[0] == "GAME") { return GO_TO(SceneManager::Scene::GAME, "Game"); }
|
||||
if (args[0] == "ENDING") { return GO_TO(SceneManager::Scene::ENDING, "Ending"); }
|
||||
if (args[0] == "ENDING2") { return GO_TO(SceneManager::Scene::ENDING2, "Ending 2"); }
|
||||
return "Unknown scene: " + args[0];
|
||||
}},
|
||||
|
||||
// RESTART — Reiniciar desde el principio (equivale a SCENE LOGO)
|
||||
{.keyword = "RESTART", .execute = [](const std::vector<std::string>&) -> std::string {
|
||||
SceneManager::current = SceneManager::Scene::LOGO;
|
||||
return "Restarting...";
|
||||
}},
|
||||
SceneManager::current = SceneManager::Scene::LOGO;
|
||||
return "Restarting...";
|
||||
}},
|
||||
|
||||
// KIOSK [ON|OFF PLEASE|PLEASE] — Modo kiosko
|
||||
{.keyword = "KIOSK", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
const bool DISABLE = (!args.empty() && args[0] == "PLEASE") ||
|
||||
(args.size() >= 2 && args[0] == "OFF" && args[1] == "PLEASE");
|
||||
if (DISABLE) {
|
||||
Options::kiosk.enabled = false;
|
||||
return "Kiosk mode OFF";
|
||||
}
|
||||
if (!args.empty() && args[0] == "OFF") {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
if (args.empty() || args[0] == "ON") {
|
||||
if (Options::kiosk.enabled) { return "Kiosk mode already ON"; }
|
||||
Options::kiosk.enabled = true;
|
||||
if (!Options::video.fullscreen) { Screen::get()->toggleVideoMode(); }
|
||||
return "Kiosk mode ON";
|
||||
}
|
||||
return "Usage: KIOSK [ON]";
|
||||
}},
|
||||
const bool DISABLE = (!args.empty() && args[0] == "PLEASE") ||
|
||||
(args.size() >= 2 && args[0] == "OFF" && args[1] == "PLEASE");
|
||||
if (DISABLE) {
|
||||
Options::kiosk.enabled = false;
|
||||
return "Kiosk mode OFF";
|
||||
}
|
||||
if (!args.empty() && args[0] == "OFF") {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
if (args.empty() || args[0] == "ON") {
|
||||
if (Options::kiosk.enabled) { return "Kiosk mode already ON"; }
|
||||
Options::kiosk.enabled = true;
|
||||
if (!Options::video.fullscreen) { Screen::get()->toggleVideoMode(); }
|
||||
return "Kiosk mode ON";
|
||||
}
|
||||
return "Usage: KIOSK [ON]";
|
||||
}},
|
||||
|
||||
// AUDIO [ON|OFF|VOL <0-100>] — Audio maestro (estado + volumen)
|
||||
{.keyword = "AUDIO", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) {
|
||||
const int VOL = static_cast<int>(Options::audio.volume * 100.0F);
|
||||
return std::string("Audio ") + (Options::audio.enabled ? "ON" : "OFF") +
|
||||
" vol:" + std::to_string(VOL);
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::audio.enabled) { return "Audio already ON"; }
|
||||
Options::audio.enabled = true;
|
||||
Audio::get()->enable(true);
|
||||
return "Audio ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::audio.enabled) { return "Audio already OFF"; }
|
||||
Options::audio.enabled = false;
|
||||
Audio::get()->enable(false);
|
||||
return "Audio OFF";
|
||||
}
|
||||
if (args[0] == "VOL" && args.size() >= 2) {
|
||||
try {
|
||||
const int VAL = std::stoi(args[1]);
|
||||
if (VAL < 0 || VAL > 100) { return "Vol must be 0-100"; }
|
||||
Options::audio.volume = static_cast<float>(VAL) / 100.0F;
|
||||
Audio::get()->enable(Options::audio.enabled);
|
||||
return "Audio vol:" + std::to_string(VAL);
|
||||
} catch (...) { return "Usage: AUDIO VOL <0-100>"; }
|
||||
}
|
||||
return "Usage: AUDIO [ON|OFF|VOL N]";
|
||||
}},
|
||||
if (args.empty()) {
|
||||
const int VOL = static_cast<int>(Options::audio.volume * 100.0F);
|
||||
return std::string("Audio ") + (Options::audio.enabled ? "ON" : "OFF") +
|
||||
" vol:" + std::to_string(VOL);
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::audio.enabled) { return "Audio already ON"; }
|
||||
Options::audio.enabled = true;
|
||||
Audio::get()->enable(true);
|
||||
return "Audio ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::audio.enabled) { return "Audio already OFF"; }
|
||||
Options::audio.enabled = false;
|
||||
Audio::get()->enable(false);
|
||||
return "Audio OFF";
|
||||
}
|
||||
if (args[0] == "VOL" && args.size() >= 2) {
|
||||
try {
|
||||
const int VAL = std::stoi(args[1]);
|
||||
if (VAL < 0 || VAL > 100) { return "Vol must be 0-100"; }
|
||||
Options::audio.volume = static_cast<float>(VAL) / 100.0F;
|
||||
Audio::get()->enable(Options::audio.enabled);
|
||||
return "Audio vol:" + std::to_string(VAL);
|
||||
} catch (...) { return "Usage: AUDIO VOL <0-100>"; }
|
||||
}
|
||||
return "Usage: AUDIO [ON|OFF|VOL N]";
|
||||
}},
|
||||
|
||||
// MUSIC [ON|OFF|VOL <0-100>] — Volumen e interruptor de música
|
||||
{.keyword = "MUSIC", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) {
|
||||
const int VOL = static_cast<int>(Options::audio.music.volume * 100.0F);
|
||||
return std::string("Music ") + (Options::audio.music.enabled ? "ON" : "OFF") +
|
||||
" vol:" + std::to_string(VOL);
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::audio.music.enabled) { return "Music already ON"; }
|
||||
Options::audio.music.enabled = true;
|
||||
Audio::get()->enableMusic(true);
|
||||
Audio::get()->setMusicVolume(Options::audio.music.volume);
|
||||
return "Music ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::audio.music.enabled) { return "Music already OFF"; }
|
||||
Audio::get()->setMusicVolume(0.0F);
|
||||
Audio::get()->enableMusic(false);
|
||||
Options::audio.music.enabled = false;
|
||||
return "Music OFF";
|
||||
}
|
||||
if (args[0] == "VOL" && args.size() >= 2) {
|
||||
try {
|
||||
const int VAL = std::stoi(args[1]);
|
||||
if (VAL < 0 || VAL > 100) { return "Vol must be 0-100"; }
|
||||
Options::audio.music.volume = static_cast<float>(VAL) / 100.0F;
|
||||
if (Options::audio.music.enabled) {
|
||||
Audio::get()->setMusicVolume(Options::audio.music.volume);
|
||||
}
|
||||
return "Music vol:" + std::to_string(VAL);
|
||||
} catch (...) { return "Usage: MUSIC VOL <0-100>"; }
|
||||
}
|
||||
return "Usage: MUSIC [ON|OFF|VOL N]";
|
||||
}},
|
||||
if (args.empty()) {
|
||||
const int VOL = static_cast<int>(Options::audio.music.volume * 100.0F);
|
||||
return std::string("Music ") + (Options::audio.music.enabled ? "ON" : "OFF") +
|
||||
" vol:" + std::to_string(VOL);
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::audio.music.enabled) { return "Music already ON"; }
|
||||
Options::audio.music.enabled = true;
|
||||
Audio::get()->enableMusic(true);
|
||||
Audio::get()->setMusicVolume(Options::audio.music.volume);
|
||||
return "Music ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::audio.music.enabled) { return "Music already OFF"; }
|
||||
Audio::get()->setMusicVolume(0.0F);
|
||||
Audio::get()->enableMusic(false);
|
||||
Options::audio.music.enabled = false;
|
||||
return "Music OFF";
|
||||
}
|
||||
if (args[0] == "VOL" && args.size() >= 2) {
|
||||
try {
|
||||
const int VAL = std::stoi(args[1]);
|
||||
if (VAL < 0 || VAL > 100) { return "Vol must be 0-100"; }
|
||||
Options::audio.music.volume = static_cast<float>(VAL) / 100.0F;
|
||||
if (Options::audio.music.enabled) {
|
||||
Audio::get()->setMusicVolume(Options::audio.music.volume);
|
||||
}
|
||||
return "Music vol:" + std::to_string(VAL);
|
||||
} catch (...) { return "Usage: MUSIC VOL <0-100>"; }
|
||||
}
|
||||
return "Usage: MUSIC [ON|OFF|VOL N]";
|
||||
}},
|
||||
|
||||
// SOUND [ON|OFF|VOL <0-100>] — Volumen e interruptor de efectos de sonido
|
||||
{.keyword = "SOUND", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (args.empty()) {
|
||||
const int VOL = static_cast<int>(Options::audio.sound.volume * 100.0F);
|
||||
return std::string("Sound ") + (Options::audio.sound.enabled ? "ON" : "OFF") +
|
||||
" vol:" + std::to_string(VOL);
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::audio.sound.enabled) { return "Sound already ON"; }
|
||||
Options::audio.sound.enabled = true;
|
||||
Audio::get()->enableSound(true);
|
||||
Audio::get()->setSoundVolume(Options::audio.sound.volume);
|
||||
return "Sound ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::audio.sound.enabled) { return "Sound already OFF"; }
|
||||
Audio::get()->setSoundVolume(0.0F);
|
||||
Audio::get()->enableSound(false);
|
||||
Options::audio.sound.enabled = false;
|
||||
return "Sound OFF";
|
||||
}
|
||||
if (args[0] == "VOL" && args.size() >= 2) {
|
||||
try {
|
||||
const int VAL = std::stoi(args[1]);
|
||||
if (VAL < 0 || VAL > 100) { return "Vol must be 0-100"; }
|
||||
Options::audio.sound.volume = static_cast<float>(VAL) / 100.0F;
|
||||
if (Options::audio.sound.enabled) {
|
||||
Audio::get()->setSoundVolume(Options::audio.sound.volume);
|
||||
}
|
||||
return "Sound vol:" + std::to_string(VAL);
|
||||
} catch (...) { return "Usage: SOUND VOL <0-100>"; }
|
||||
}
|
||||
return "Usage: SOUND [ON|OFF|VOL N]";
|
||||
}},
|
||||
if (args.empty()) {
|
||||
const int VOL = static_cast<int>(Options::audio.sound.volume * 100.0F);
|
||||
return std::string("Sound ") + (Options::audio.sound.enabled ? "ON" : "OFF") +
|
||||
" vol:" + std::to_string(VOL);
|
||||
}
|
||||
if (args[0] == "ON") {
|
||||
if (Options::audio.sound.enabled) { return "Sound already ON"; }
|
||||
Options::audio.sound.enabled = true;
|
||||
Audio::get()->enableSound(true);
|
||||
Audio::get()->setSoundVolume(Options::audio.sound.volume);
|
||||
return "Sound ON";
|
||||
}
|
||||
if (args[0] == "OFF") {
|
||||
if (!Options::audio.sound.enabled) { return "Sound already OFF"; }
|
||||
Audio::get()->setSoundVolume(0.0F);
|
||||
Audio::get()->enableSound(false);
|
||||
Options::audio.sound.enabled = false;
|
||||
return "Sound OFF";
|
||||
}
|
||||
if (args[0] == "VOL" && args.size() >= 2) {
|
||||
try {
|
||||
const int VAL = std::stoi(args[1]);
|
||||
if (VAL < 0 || VAL > 100) { return "Vol must be 0-100"; }
|
||||
Options::audio.sound.volume = static_cast<float>(VAL) / 100.0F;
|
||||
if (Options::audio.sound.enabled) {
|
||||
Audio::get()->setSoundVolume(Options::audio.sound.volume);
|
||||
}
|
||||
return "Sound vol:" + std::to_string(VAL);
|
||||
} catch (...) { return "Usage: SOUND VOL <0-100>"; }
|
||||
}
|
||||
return "Usage: SOUND [ON|OFF|VOL N]";
|
||||
}},
|
||||
|
||||
// EXIT / QUIT — Cerrar la aplicacion (bloqueado en kiosk)
|
||||
{.keyword = "EXIT", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (Options::kiosk.enabled && (args.empty() || args[0] != "PLEASE")) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
SceneManager::current = SceneManager::Scene::QUIT;
|
||||
return "Quitting...";
|
||||
}},
|
||||
if (Options::kiosk.enabled && (args.empty() || args[0] != "PLEASE")) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
SceneManager::current = SceneManager::Scene::QUIT;
|
||||
return "Quitting...";
|
||||
}},
|
||||
{.keyword = "QUIT", .execute = [](const std::vector<std::string>& args) -> std::string {
|
||||
if (Options::kiosk.enabled && (args.empty() || args[0] != "PLEASE")) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
SceneManager::current = SceneManager::Scene::QUIT;
|
||||
return "Quitting...";
|
||||
}},
|
||||
if (Options::kiosk.enabled && (args.empty() || args[0] != "PLEASE")) {
|
||||
return "Not allowed in kiosk mode";
|
||||
}
|
||||
SceneManager::current = SceneManager::Scene::QUIT;
|
||||
return "Quitting...";
|
||||
}},
|
||||
|
||||
// HELP / ? — Muestra ayuda en la terminal del sistema
|
||||
{.keyword = "HELP", .execute = [](const std::vector<std::string>&) -> std::string {
|
||||
printHelp(); return "Help printed to terminal";
|
||||
}},
|
||||
printHelp();
|
||||
return "Help printed to terminal";
|
||||
}},
|
||||
{.keyword = "?", .execute = [](const std::vector<std::string>&) -> std::string {
|
||||
printHelp(); return "Help printed to terminal";
|
||||
}},
|
||||
printHelp();
|
||||
return "Help printed to terminal";
|
||||
}},
|
||||
};
|
||||
|
||||
// ── Singleton ─────────────────────────────────────────────────────────────────
|
||||
@@ -581,7 +585,7 @@ void Console::update(float delta_time) {
|
||||
cursor_timer_ += delta_time;
|
||||
const float THRESHOLD = cursor_visible_ ? CURSOR_ON_TIME : CURSOR_OFF_TIME;
|
||||
if (cursor_timer_ >= THRESHOLD) {
|
||||
cursor_timer_ = 0.0F;
|
||||
cursor_timer_ = 0.0F;
|
||||
cursor_visible_ = !cursor_visible_;
|
||||
}
|
||||
}
|
||||
@@ -626,16 +630,16 @@ void Console::render() {
|
||||
void Console::toggle() {
|
||||
switch (status_) {
|
||||
case Status::HIDDEN:
|
||||
status_ = Status::RISING;
|
||||
status_ = Status::RISING;
|
||||
input_line_.clear();
|
||||
cursor_timer_ = 0.0F;
|
||||
cursor_timer_ = 0.0F;
|
||||
cursor_visible_ = true;
|
||||
SDL_StartTextInput(SDL_GetKeyboardFocus());
|
||||
if (Notifier::get() != nullptr) { Notifier::get()->addYOffset(static_cast<int>(height_)); }
|
||||
break;
|
||||
case Status::ACTIVE:
|
||||
status_ = Status::VANISHING;
|
||||
msg_line_ = std::string(CONSOLE_NAME) + " " + std::string(CONSOLE_VERSION);
|
||||
status_ = Status::VANISHING;
|
||||
msg_line_ = std::string(CONSOLE_NAME) + " " + std::string(CONSOLE_VERSION);
|
||||
history_index_ = -1;
|
||||
saved_input_.clear();
|
||||
SDL_StopTextInput(SDL_GetKeyboardFocus());
|
||||
@@ -724,7 +728,7 @@ void Console::processCommand() {
|
||||
input_line_.clear();
|
||||
history_index_ = -1;
|
||||
saved_input_.clear();
|
||||
cursor_timer_ = 0.0F;
|
||||
cursor_timer_ = 0.0F;
|
||||
cursor_visible_ = true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user