11eec8f222
El Reiniciar fins ara recarregava recursos però no rellegia el preset ni recreava la finestra (idioma/dificultat/preset es quedaven pendents fins al pròxim arrencada manual). Ara Director rep argv al constructor i, quan Section::name passa a RESET, fa execv del propi binari (_execv a Windows). El procés es reemplaça → init complet amb tots els canvis aplicats. Refactor: extret shutdownSubsystems() de close() i compartit amb relaunch(). Si execv falla els subsistemes ja s'han destruït, no podem tornar al bucle: exit amb error. A Emscripten s'amaga l'opció Reiniciar al service menu (execv no existeix; el cheat code per teclat encara cau al reset clàssic com fallback).
100 lines
3.8 KiB
C++
100 lines
3.8 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h> // Para SDL_AppResult, SDL_Event
|
|
|
|
#include <cstdint> // Para std::uint8_t
|
|
#include <memory> // Para unique_ptr
|
|
#include <string> // Para string
|
|
|
|
#include "core/system/section.hpp" // Para Section::Name
|
|
|
|
namespace Lang {
|
|
enum class Code : std::uint8_t;
|
|
}
|
|
|
|
// Declaraciones adelantadas de las secciones
|
|
class Preload;
|
|
class Logo;
|
|
class Intro;
|
|
class Title;
|
|
class Game;
|
|
class Instructions;
|
|
class HiScoreTable;
|
|
class Credits;
|
|
|
|
// --- Clase Director: gestor principal de la aplicación ---
|
|
class Director {
|
|
public:
|
|
// --- Constructor y destructor ---
|
|
Director(int argc, char** argv);
|
|
~Director();
|
|
|
|
// --- Callbacks para SDL_MAIN_USE_CALLBACKS ---
|
|
auto iterate() -> SDL_AppResult; // Avanza un frame de la sección activa
|
|
auto handleEvent(const SDL_Event& event) -> SDL_AppResult; // Procesa un evento SDL
|
|
|
|
// --- Debug config (accesible desde otras clases) ---
|
|
struct DebugConfig {
|
|
std::string initial_section;
|
|
std::string initial_options;
|
|
int initial_stage = 0;
|
|
bool show_render_info = true;
|
|
std::string resource_loading;
|
|
bool autoplay = false;
|
|
bool invincibility = false;
|
|
|
|
DebugConfig()
|
|
: initial_section("game"),
|
|
initial_options("1p"),
|
|
resource_loading("preload") {}
|
|
};
|
|
static inline DebugConfig debug_config;
|
|
|
|
private:
|
|
// --- Variables internas ---
|
|
std::string executable_path_; // Ruta del ejecutable
|
|
std::string system_folder_; // Carpeta del sistema para almacenar datos
|
|
char** argv_ = nullptr; // argv original; usat per relaunch() (execv)
|
|
|
|
// --- Sección activa (una y sólo una viva en cada momento) ---
|
|
std::unique_ptr<Preload> preload_;
|
|
std::unique_ptr<Logo> logo_;
|
|
std::unique_ptr<Intro> intro_;
|
|
std::unique_ptr<Title> title_;
|
|
std::unique_ptr<Game> game_;
|
|
std::unique_ptr<Instructions> instructions_;
|
|
std::unique_ptr<HiScoreTable> hi_score_table_;
|
|
std::unique_ptr<Credits> credits_;
|
|
Section::Name last_built_section_name_ = Section::Name::RESET;
|
|
|
|
// --- Fase de arranque no bloqueante ---
|
|
bool boot_loading_ = true; // True mientras Resource::loadStep está cargando incremental
|
|
|
|
// --- Inicialización y cierre del sistema ---
|
|
void init(); // Inicializa la aplicación (pre-boot)
|
|
static void finishBoot(); // Post-boot: inicializa lo que depende de recursos cargados
|
|
static void shutdownSubsystems(); // Allibera singletons i SDL (sense apagar el sistema)
|
|
static void close(); // Cierra y libera recursos
|
|
void relaunch() const; // Reemplaça el procés via execv (fallback silenciós si no es pot)
|
|
|
|
// --- Configuración inicial ---
|
|
static void loadParams(); // Carga los parámetros del programa
|
|
static void loadScoreFile(); // Carga el fichero de puntuaciones
|
|
void createSystemFolder(const std::string& folder); // Crea la carpeta del sistema
|
|
void loadDebugConfig(); // Carga debug.yaml (solo en _DEBUG)
|
|
|
|
// --- Gestión de entrada y archivos ---
|
|
void loadAssets(); // Crea el índice de archivos disponibles
|
|
|
|
// --- Gestión de secciones ---
|
|
void handleSectionTransition(); // Destruye la sección anterior y construye la nueva si Section::name ha cambiado
|
|
void resetActiveSection(); // Libera todos los unique_ptr de sección
|
|
static void reset(); // Reinicia objetos y vuelve a la sección inicial
|
|
|
|
// --- Gestión de archivos de idioma ---
|
|
auto getLangFile(Lang::Code code) -> std::string; // Obtiene un fichero de idioma según el código
|
|
|
|
// --- Apagado del sistema ---
|
|
static void shutdownSystem(bool should_shutdown); // Apaga el sistema
|
|
};
|