fix: corregida logica per obrir i entrar a la jail. ja no mira el nom de la habitacio sino el numero

This commit is contained in:
2026-03-29 12:58:32 +02:00
parent f5a82229fe
commit 1bb2142d19
9 changed files with 73 additions and 41 deletions

View File

@@ -94,12 +94,12 @@ void Debug::setDebugFile(const std::string& path) {
// Convierte string a SceneManager::Scene (para debug.yaml) // Convierte string a SceneManager::Scene (para debug.yaml)
static auto sceneFromString(const std::string& s) -> SceneManager::Scene { static auto sceneFromString(const std::string& s) -> SceneManager::Scene {
if (s == "LOGO") { return SceneManager::Scene::LOGO; } if (s == "LOGO") { return SceneManager::Scene::LOGO; }
if (s == "LOADING") { return SceneManager::Scene::LOADING_SCREEN; } if (s == "LOADING") { return SceneManager::Scene::LOADING_SCREEN; }
if (s == "TITLE") { return SceneManager::Scene::TITLE; } if (s == "TITLE") { return SceneManager::Scene::TITLE; }
if (s == "CREDITS") { return SceneManager::Scene::CREDITS; } if (s == "CREDITS") { return SceneManager::Scene::CREDITS; }
if (s == "DEMO") { return SceneManager::Scene::DEMO; } if (s == "DEMO") { return SceneManager::Scene::DEMO; }
if (s == "ENDING") { return SceneManager::Scene::ENDING; } if (s == "ENDING") { return SceneManager::Scene::ENDING; }
if (s == "ENDING2") { return SceneManager::Scene::ENDING2; } if (s == "ENDING2") { return SceneManager::Scene::ENDING2; }
return SceneManager::Scene::GAME; // Fallback seguro return SceneManager::Scene::GAME; // Fallback seguro
} }
@@ -107,14 +107,22 @@ static auto sceneFromString(const std::string& s) -> SceneManager::Scene {
// Convierte SceneManager::Scene a string (para debug.yaml) // Convierte SceneManager::Scene a string (para debug.yaml)
static auto sceneToString(SceneManager::Scene scene) -> std::string { static auto sceneToString(SceneManager::Scene scene) -> std::string {
switch (scene) { switch (scene) {
case SceneManager::Scene::LOGO: return "LOGO"; case SceneManager::Scene::LOGO:
case SceneManager::Scene::LOADING_SCREEN: return "LOADING"; return "LOGO";
case SceneManager::Scene::TITLE: return "TITLE"; case SceneManager::Scene::LOADING_SCREEN:
case SceneManager::Scene::CREDITS: return "CREDITS"; return "LOADING";
case SceneManager::Scene::DEMO: return "DEMO"; case SceneManager::Scene::TITLE:
case SceneManager::Scene::ENDING: return "ENDING"; return "TITLE";
case SceneManager::Scene::ENDING2: return "ENDING2"; case SceneManager::Scene::CREDITS:
default: return "GAME"; return "CREDITS";
case SceneManager::Scene::DEMO:
return "DEMO";
case SceneManager::Scene::ENDING:
return "ENDING";
case SceneManager::Scene::ENDING2:
return "ENDING2";
default:
return "GAME";
} }
} }

View File

@@ -43,10 +43,10 @@ class Debug {
void setDebugFile(const std::string& path); // Establece la ruta del archivo debug.yaml void setDebugFile(const std::string& path); // Establece la ruta del archivo debug.yaml
void loadFromFile(); // Carga la configuración de debug desde debug.yaml void loadFromFile(); // Carga la configuración de debug desde debug.yaml
void saveToFile() const; // Guarda la configuración de debug en debug.yaml void saveToFile() const; // Guarda la configuración de debug en debug.yaml
[[nodiscard]] auto getSpawnSettings() const -> const SpawnSettings& { return spawn_settings_; } // Obtiene los valores de spawn [[nodiscard]] auto getSpawnSettings() const -> const SpawnSettings& { return spawn_settings_; } // Obtiene los valores de spawn
void setSpawnSettings(const SpawnSettings& s) { spawn_settings_ = s; } // Establece los valores de spawn void setSpawnSettings(const SpawnSettings& s) { spawn_settings_ = s; } // Establece los valores de spawn
[[nodiscard]] auto getInitialScene() const -> SceneManager::Scene { return initial_scene_; } // Obtiene la escena inicial de debug [[nodiscard]] auto getInitialScene() const -> SceneManager::Scene { return initial_scene_; } // Obtiene la escena inicial de debug
void setInitialScene(SceneManager::Scene s) { initial_scene_ = s; } // Establece la escena inicial de debug void setInitialScene(SceneManager::Scene s) { initial_scene_ = s; } // Establece la escena inicial de debug
private: private:
static Debug* debug; // [SINGLETON] Objeto privado static Debug* debug; // [SINGLETON] Objeto privado
@@ -55,14 +55,14 @@ class Debug {
~Debug() = default; // Destructor ~Debug() = default; // Destructor
// Variables // Variables
std::map<std::string, std::string> watches_; // Watch window: valores persistentes (key→value) std::map<std::string, std::string> watches_; // Watch window: valores persistentes (key→value)
std::vector<std::string> slot_; // One-shot: textos que se limpian cada frame std::vector<std::string> slot_; // One-shot: textos que se limpian cada frame
std::vector<std::string> log_; // Log persistente std::vector<std::string> log_; // Log persistente
int x_ = 0; // Posicion donde escribir el texto de debug int x_ = 0; // Posicion donde escribir el texto de debug
int y_ = 0; // Posición donde escribir el texto de debug int y_ = 0; // Posición donde escribir el texto de debug
bool enabled_ = false; // Indica si esta activo el modo debug bool enabled_ = false; // Indica si esta activo el modo debug
std::string debug_file_path_; // Ruta del archivo debug.yaml std::string debug_file_path_; // Ruta del archivo debug.yaml
SpawnSettings spawn_settings_; // Configuración de spawn para debug SpawnSettings spawn_settings_; // Configuración de spawn para debug
SceneManager::Scene initial_scene_ = SceneManager::Scene::GAME; // Escena inicial en debug SceneManager::Scene initial_scene_ = SceneManager::Scene::GAME; // Escena inicial en debug
}; };

View File

@@ -88,8 +88,13 @@ namespace Defaults::Localization {
constexpr const char* LANGUAGE = "ca"; // Idioma por defecto (en = inglés, ca = catalán) constexpr const char* LANGUAGE = "ca"; // Idioma por defecto (en = inglés, ca = catalán)
} // namespace Defaults::Localization } // namespace Defaults::Localization
namespace Defaults::Game::Items {
constexpr const float PERCENT_TO_OPEN_THE_JAIL = 0.9F; // Porcentaje de items necesarios para abrir la jail
} // namespace Defaults::Game::Items
namespace Defaults::Game::Room { namespace Defaults::Game::Room {
constexpr const char* INITIAL = "03.yaml"; // Habitación de inicio constexpr const char* INITIAL = "03.yaml"; // Habitación de inicio
constexpr const char* END_ROOM = "01"; // Habitación final (jail)
} // namespace Defaults::Game::Room } // namespace Defaults::Game::Room
namespace Defaults::Game::Player { namespace Defaults::Game::Player {

View File

@@ -5,7 +5,7 @@
namespace GameControl { namespace GameControl {
// Disponible en todos los builds — refresca el color del jugador según cheats // Disponible en todos los builds — refresca el color del jugador según cheats
inline std::function<void()> refresh_player_color; inline std::function<void()> refresh_player_color;
} } // namespace GameControl
#ifdef _DEBUG #ifdef _DEBUG
namespace GameControl { namespace GameControl {

View File

@@ -5,6 +5,7 @@
#include "core/rendering/screen.hpp" // Para Screen #include "core/rendering/screen.hpp" // Para Screen
#include "core/rendering/surface.hpp" // Para Surface #include "core/rendering/surface.hpp" // Para Surface
#include "core/resources/resource_cache.hpp" // Para Resource #include "core/resources/resource_cache.hpp" // Para Resource
#include "game/defaults.hpp" // Para Defaults::Game
#include "game/gameplay/collision_map.hpp" // Para CollisionMap #include "game/gameplay/collision_map.hpp" // Para CollisionMap
#include "game/gameplay/enemy_manager.hpp" // Para EnemyManager #include "game/gameplay/enemy_manager.hpp" // Para EnemyManager
#include "game/gameplay/item_manager.hpp" // Para ItemManager #include "game/gameplay/item_manager.hpp" // Para ItemManager
@@ -82,7 +83,7 @@ void Room::initializeRoom(const Data& room) {
// Abre la jail para poder entrar // Abre la jail para poder entrar
void Room::openTheJail() { // NOLINT(readability-convert-member-functions-to-static) void Room::openTheJail() { // NOLINT(readability-convert-member-functions-to-static)
if (data_->jail_is_open && name_ == "THE JAIL") { if (data_->jail_is_open && number_ == Defaults::Game::Room::END_ROOM) {
// Elimina el último enemigo (Bry debe ser el último enemigo definido en el fichero) // Elimina el último enemigo (Bry debe ser el último enemigo definido en el fichero)
if (!enemy_manager_->isEmpty()) { if (!enemy_manager_->isEmpty()) {
enemy_manager_->removeLastEnemy(); enemy_manager_->removeLastEnemy();

View File

@@ -61,6 +61,7 @@ class Room {
~Room(); // NOLINT(modernize-use-equals-default, performance-trivially-destructible) -- defined in .cpp for unique_ptr with forward declarations ~Room(); // NOLINT(modernize-use-equals-default, performance-trivially-destructible) -- defined in .cpp for unique_ptr with forward declarations
// --- Funciones --- // --- Funciones ---
[[nodiscard]] auto getNumber() const -> const std::string& { return number_; } // Devuelve el numero de la habitación
[[nodiscard]] auto getName() const -> const std::string& { return name_; } // Devuelve el nombre de la habitación [[nodiscard]] auto getName() const -> const std::string& { return name_; } // Devuelve el nombre de la habitación
[[nodiscard]] auto getBGColor() const -> Uint8 { return stringToColor(bg_color_); } // Devuelve el color de la habitación [[nodiscard]] auto getBGColor() const -> Uint8 { return stringToColor(bg_color_); } // Devuelve el color de la habitación
[[nodiscard]] auto getBorderColor() const -> Uint8 { return stringToColor(border_color_); } // Devuelve el color del borde [[nodiscard]] auto getBorderColor() const -> Uint8 { return stringToColor(border_color_); } // Devuelve el color del borde

View File

@@ -33,8 +33,8 @@ namespace SceneManager {
TITLE_WITHOUT_LOADING_SCREEN // Al título sin pantalla de carga TITLE_WITHOUT_LOADING_SCREEN // Al título sin pantalla de carga
}; };
// --- Variables de estado globales --- // --- Variables de estado globales ---
inline Scene current = Scene::LOGO; // Escena actual (en _DEBUG sobrescrito por Director tras cargar debug.yaml) inline Scene current = Scene::LOGO; // Escena actual (en _DEBUG sobrescrito por Director tras cargar debug.yaml)
inline Options options = Options::LOGO_TO_LOADING_SCREEN; // Opciones de la escena actual inline Options options = Options::LOGO_TO_LOADING_SCREEN; // Opciones de la escena actual
inline Scene scene_before_restart = Scene::LOGO; // escena a relanzar tras RESTART_CURRENT inline Scene scene_before_restart = Scene::LOGO; // escena a relanzar tras RESTART_CURRENT

View File

@@ -720,9 +720,11 @@ void Game::setScoreBoardColor() { // NOLINT(readability-convert-member-function
// Comprueba si ha finalizado el juego // Comprueba si ha finalizado el juego
auto Game::checkEndGame() -> bool { auto Game::checkEndGame() -> bool {
const bool IS_ON_THE_ROOM = room_->getName() == "THE JAIL"; // Estar en la habitación que toca const bool IS_ON_THE_ROOM = room_->getNumber() == Defaults::Game::Room::END_ROOM; // Estar en la habitación que toca
const bool HAVE_THE_ITEMS = scoreboard_data_->items >= int(total_items_ * 0.9F) || Options::cheats.jail_is_open == Options::Cheat::State::ENABLED; // Con mas del 90% de los items recogidos const bool HAVE_THE_ITEMS =
const bool IS_ON_THE_DOOR = player_->getRect().x <= 128; // Y en la ubicación que toca (En la puerta) scoreboard_data_->items >= int(total_items_ * Defaults::Game::Items::PERCENT_TO_OPEN_THE_JAIL) ||
Options::cheats.jail_is_open == Options::Cheat::State::ENABLED; // Con mas del 90% de los items recogidos
const bool IS_ON_THE_DOOR = player_->getRect().x <= 128; // Y en la ubicación que toca (En la puerta)
scoreboard_data_->jail_is_open = HAVE_THE_ITEMS; scoreboard_data_->jail_is_open = HAVE_THE_ITEMS;

View File

@@ -15,12 +15,11 @@
#include "core/rendering/surface.hpp" // Para Surface #include "core/rendering/surface.hpp" // Para Surface
#include "core/rendering/text.hpp" // Para Text #include "core/rendering/text.hpp" // Para Text
#include "core/resources/resource_cache.hpp" // Para Resource #include "core/resources/resource_cache.hpp" // Para Resource
#include "game/game_control.hpp" // Para GameControl (refresh_player_color)
#include "game/options.hpp" // Para Options #include "game/options.hpp" // Para Options
#include "game/scene_manager.hpp" // Para SceneManager #include "game/scene_manager.hpp" // Para SceneManager
#include "game/ui/notifier.hpp" // Para Notifier #include "game/ui/notifier.hpp" // Para Notifier
#include "game/game_control.hpp" // Para GameControl (refresh_player_color)
#ifdef _DEBUG #ifdef _DEBUG
#include "core/system/debug.hpp" // Para Debug #include "core/system/debug.hpp" // Para Debug
#endif #endif
@@ -500,14 +499,30 @@ static const std::vector<ConsoleCommand> COMMANDS = {
SceneManager::Scene target = SceneManager::current; SceneManager::Scene target = SceneManager::current;
std::string name = "current"; std::string name = "current";
if (args.size() >= 3) { if (args.size() >= 3) {
if (args[2] == "GAME") { target = SceneManager::Scene::GAME; name = "GAME"; } if (args[2] == "GAME") {
else if (args[2] == "LOGO") { target = SceneManager::Scene::LOGO; name = "LOGO"; } target = SceneManager::Scene::GAME;
else if (args[2] == "LOADING") { target = SceneManager::Scene::LOADING_SCREEN; name = "LOADING"; } name = "GAME";
else if (args[2] == "TITLE") { target = SceneManager::Scene::TITLE; name = "TITLE"; } } else if (args[2] == "LOGO") {
else if (args[2] == "CREDITS") { target = SceneManager::Scene::CREDITS; name = "CREDITS"; } target = SceneManager::Scene::LOGO;
else if (args[2] == "ENDING") { target = SceneManager::Scene::ENDING; name = "ENDING"; } name = "LOGO";
else if (args[2] == "ENDING2") { target = SceneManager::Scene::ENDING2; name = "ENDING2"; } } else if (args[2] == "LOADING") {
else { return "Unknown scene: " + args[2]; } target = SceneManager::Scene::LOADING_SCREEN;
name = "LOADING";
} else if (args[2] == "TITLE") {
target = SceneManager::Scene::TITLE;
name = "TITLE";
} else if (args[2] == "CREDITS") {
target = SceneManager::Scene::CREDITS;
name = "CREDITS";
} else if (args[2] == "ENDING") {
target = SceneManager::Scene::ENDING;
name = "ENDING";
} else if (args[2] == "ENDING2") {
target = SceneManager::Scene::ENDING2;
name = "ENDING2";
} else {
return "Unknown scene: " + args[2];
}
} }
Debug::get()->setInitialScene(target); Debug::get()->setInitialScene(target);
Debug::get()->saveToFile(); Debug::get()->saveToFile();