feat(level-manager): avança a la sala següent al creuar la porta

Reemplaça resetRoom() per loadRoom(yaml_path) — la mateixa mecànica de
recàrrega però parametritzada amb el path de la nova sala. setState
de OUTRO → INTRO ara crida advanceToNextRoom(): demana al LevelManager
el següent nivell, sincronitza room_index_ amb el currentRoom() i
carrega via loadRoom. Si l'OUTRO arriba a l'última sala del levels.yaml,
fa loop a la primera (política temporal mentre no hi haja pantalla de
fi de joc). El comentari TODO de room_fsm.cpp queda actualitzat: la
FSM continua sent agnostica a quina sala ve, només marca el canvi
d'estat — l'itinerari el resol GameScene amb el LevelManager.
This commit is contained in:
JailDesigner committed 2026-04-26 14:53:07 +02:00
1 parent f51fe3d820
commit 9d4f92c98b
3 files changed
+43 -19

No files matched your search

+25 -10
View File
@@ -466,12 +466,13 @@ auto GameScene::computeSpawn() -> PlayerSpawn {
};
}
void GameScene::resetRoom() {
// Recarregar les entitats des del YAML del mapa: la porta torna a
void GameScene::loadRoom(const std::string& yaml_path) {
// Recarregar les entitats des del YAML donat: la porta torna a
// CLOSED (amb l'open=false a Map al loadFrom), els sarcs tornen a
// CLOSED amb visited buit, momies i altres actors a la posició inicial.
Map::loadFrom(config_.map_yaml);
entity_manager_.reload(config_.map_yaml);
config_.map_yaml = yaml_path;
Map::loadFrom(yaml_path);
entity_manager_.reload(yaml_path);
// Tornem a fixar el comptador de "esperats" amb només els slots
// actius — un slot DISABLED permanent (single-player) no compta.
const int ACTIVE_COUNT = std::ranges::count(players_starts_active_, true);
@@ -485,10 +486,22 @@ void GameScene::resetRoom() {
// el primer.
for (auto& p : players_) { p->disable(); }
std::cout << "[ROOM] reset: entities reloaded, paint cleared, "
std::cout << "[ROOM] load " << yaml_path << ": entities reloaded, paint cleared, "
<< ACTIVE_COUNT << " active player(s) disabled (awaiting spawn cinematic)\n";
}
void GameScene::advanceToNextRoom() {
auto& mgr = Levels::LevelManager::get();
if (!mgr.advance()) {
// Política temporal mentre no hi haja pantalla de "Fi de joc":
// arribar al final del levels.yaml fa loop a la primera sala.
std::cout << "[ROOM] final del levels.yaml — bucle a la primera sala\n";
mgr.restart();
}
room_index_ = mgr.currentRoom();
loadRoom(mgr.currentPath());
}
void GameScene::triggerActivePlayerSpawn() {
if (players_spawned_in_intro_) { return; }
players_spawned_in_intro_ = true;
@@ -524,12 +537,14 @@ void GameScene::setState(RoomFsm::State new_state) {
room_intro_elapsed_ms_ = 0;
players_spawned_in_intro_ = false;
}
// En tornar a ROOM_INTRO des de ROOM_OUTRO (placeholder de
// "torna a la mateixa sala"), reseteja completament l'estat del
// nivell. Si la transició és la inicial (PREV també és ROOM_INTRO,
// imposible amb el guard de dalt) o ve d'un altre estat, no fa res.
// En tornar a ROOM_INTRO des de ROOM_OUTRO ja hi ha itinerari: el
// jugador acaba de creuar la porta, així que avancem al següent
// nivell del LevelManager i carreguem la nova sala. Si era l'última,
// `advanceToNextRoom` fa loop a la primera. Per a la transició
// inicial (PREV també és ROOM_INTRO, impossible amb el guard de dalt)
// o vinguda d'un altre estat, no fem res.
if (new_state == RoomFsm::State::ROOM_INTRO && PREV == RoomFsm::State::ROOM_OUTRO) {
resetRoom();
advanceToNextRoom();
}
}