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:
1 parent
f51fe3d820
commit
9d4f92c98b
3 files changed
+43
-19
No files matched your search
@@ -466,12 +466,13 @@ auto GameScene::computeSpawn() -> PlayerSpawn {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameScene::resetRoom() {
|
void GameScene::loadRoom(const std::string& yaml_path) {
|
||||||
// Recarregar les entitats des del YAML del mapa: la porta torna a
|
// 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 l'open=false a Map al loadFrom), els sarcs tornen a
|
||||||
// CLOSED amb visited buit, momies i altres actors a la posició inicial.
|
// CLOSED amb visited buit, momies i altres actors a la posició inicial.
|
||||||
Map::loadFrom(config_.map_yaml);
|
config_.map_yaml = yaml_path;
|
||||||
entity_manager_.reload(config_.map_yaml);
|
Map::loadFrom(yaml_path);
|
||||||
|
entity_manager_.reload(yaml_path);
|
||||||
// Tornem a fixar el comptador de "esperats" amb només els slots
|
// Tornem a fixar el comptador de "esperats" amb només els slots
|
||||||
// actius — un slot DISABLED permanent (single-player) no compta.
|
// actius — un slot DISABLED permanent (single-player) no compta.
|
||||||
const int ACTIVE_COUNT = std::ranges::count(players_starts_active_, true);
|
const int ACTIVE_COUNT = std::ranges::count(players_starts_active_, true);
|
||||||
@@ -485,10 +486,22 @@ void GameScene::resetRoom() {
|
|||||||
// el primer.
|
// el primer.
|
||||||
for (auto& p : players_) { p->disable(); }
|
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";
|
<< 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() {
|
void GameScene::triggerActivePlayerSpawn() {
|
||||||
if (players_spawned_in_intro_) { return; }
|
if (players_spawned_in_intro_) { return; }
|
||||||
players_spawned_in_intro_ = true;
|
players_spawned_in_intro_ = true;
|
||||||
@@ -524,12 +537,14 @@ void GameScene::setState(RoomFsm::State new_state) {
|
|||||||
room_intro_elapsed_ms_ = 0;
|
room_intro_elapsed_ms_ = 0;
|
||||||
players_spawned_in_intro_ = false;
|
players_spawned_in_intro_ = false;
|
||||||
}
|
}
|
||||||
// En tornar a ROOM_INTRO des de ROOM_OUTRO (placeholder de
|
// En tornar a ROOM_INTRO des de ROOM_OUTRO ja hi ha itinerari: el
|
||||||
// "torna a la mateixa sala"), reseteja completament l'estat del
|
// jugador acaba de creuar la porta, així que avancem al següent
|
||||||
// nivell. Si la transició és la inicial (PREV també és ROOM_INTRO,
|
// nivell del LevelManager i carreguem la nova sala. Si era l'última,
|
||||||
// imposible amb el guard de dalt) o ve d'un altre estat, no fa res.
|
// `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) {
|
if (new_state == RoomFsm::State::ROOM_INTRO && PREV == RoomFsm::State::ROOM_OUTRO) {
|
||||||
resetRoom();
|
advanceToNextRoom();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -208,11 +208,20 @@ class GameScene : public Scene {
|
|||||||
};
|
};
|
||||||
[[nodiscard]] static auto computeSpawn() -> PlayerSpawn;
|
[[nodiscard]] static auto computeSpawn() -> PlayerSpawn;
|
||||||
|
|
||||||
// Reset complet de la sala: reload de l'EntityManager (sarcs/porta/
|
// Recarrega la sala apuntada per `yaml_path`: refresca Map (geometria,
|
||||||
// momies des de zero), neteja del PaintLayer i respawn dels jugadors
|
// porta tancada), entitats (sarcs/porta/momies des de zero), neteja
|
||||||
// a la posició calculada per `computeSpawn`. Cridat des de
|
// el PaintLayer i deixa els jugadors a DISABLED esperant la cinemàtica
|
||||||
// `setState(ROOM_INTRO)` quan la transició anterior era OUTRO.
|
// d'spawn aeri del nou cicle d'INTRO. També actualitza
|
||||||
void resetRoom();
|
// `config_.map_yaml` perquè futurs consumidors (l'Editor en guardar,
|
||||||
|
// logs, etc.) sàpiguen quina sala està viva.
|
||||||
|
void loadRoom(const std::string& yaml_path);
|
||||||
|
|
||||||
|
// Demana al LevelManager el següent nivell i el carrega via
|
||||||
|
// `loadRoom`. Si ja era a l'última entrada, fa loop a la primera
|
||||||
|
// (política temporal mentre no hi haja pantalla de fi de joc).
|
||||||
|
// Cridat des de `setState(ROOM_INTRO)` quan la transició anterior
|
||||||
|
// era OUTRO — és la conseqüència de creuar la porta.
|
||||||
|
void advanceToNextRoom();
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
// Editor modal del tilemap. Mútuament excloent amb la pausa: si la
|
// Editor modal del tilemap. Mútuament excloent amb la pausa: si la
|
||||||
|
|||||||
@@ -99,10 +99,10 @@ namespace RoomFsm {
|
|||||||
t.elapsed_ms -= DURS[t.phase];
|
t.elapsed_ms -= DURS[t.phase];
|
||||||
++t.phase;
|
++t.phase;
|
||||||
}
|
}
|
||||||
// Placeholder fins a l'itinerari de sales: l'OUTRO recau a INTRO.
|
// Final de l'OUTRO → ROOM_INTRO de la sala SEGÜENT. La FSM no
|
||||||
// TODO(itinerari): aquest mateix retorn sortirà cap a una nova
|
// sap quina és — només avisa del canvi d'estat. La GameScene,
|
||||||
// sala (incrementant `room_index_` i recreant tilemap/entitats al
|
// dins `setState(ROOM_INTRO)` amb PREV=OUTRO, demana al
|
||||||
// GameScene) abans de tornar a ROOM_INTRO.
|
// LevelManager el següent nivell i recarrega tilemap/entitats.
|
||||||
if (t.phase >= static_cast<int>(DURS.size())) { return State::ROOM_INTRO; }
|
if (t.phase >= static_cast<int>(DURS.size())) { return State::ROOM_INTRO; }
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user