reinici real (execv) des del service menu

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).
This commit is contained in:
2026-05-17 10:12:22 +02:00
parent 2c1673d2dd
commit 11eec8f222
4 changed files with 64 additions and 18 deletions
+10 -8
View File
@@ -2,13 +2,12 @@
#include <SDL3/SDL.h> // Para SDL_AppResult, SDL_Event
#include <memory> // Para unique_ptr
#include <string> // Para string
#include <cstdint> // Para std::uint8_t
#include <memory> // Para unique_ptr
#include <string> // Para string
#include "core/system/section.hpp" // Para Section::Name
#include <cstdint> // Para std::uint8_t
namespace Lang {
enum class Code : std::uint8_t;
}
@@ -27,7 +26,7 @@ class Credits;
class Director {
public:
// --- Constructor y destructor ---
Director();
Director(int argc, char** argv);
~Director();
// --- Callbacks para SDL_MAIN_USE_CALLBACKS ---
@@ -55,6 +54,7 @@ class Director {
// --- 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_;
@@ -71,9 +71,11 @@ class Director {
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 close(); // Cierra y libera recursos
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