feat(entity-manager): comptador player_exited agrega a level_complete

This commit is contained in:
JailDesigner committed 2026-04-26 10:22:42 +02:00
1 parent 5c5cd1d5da
commit 28e55a0615
3 files changed
+47

No files matched your search

+26
View File
@@ -32,11 +32,37 @@ EntityManager::EntityManager() {
const auto* tile = std::get_if<TilePos>(&ev.payload);
if (tile != nullptr) { notifyPlayerTilePainted(tile->col, tile->row); }
});
// Subscripció a `player_exited` (publicat per Door en travessar la
// porta oberta amb un jugador): comptem una vegada per jugador i,
// quan tots els jugadors actius han eixit, emetem `level_complete`
// — l'event d'agregat que GameScene escolta per disparar la
// transició FSM a ROOM_OUTRO. La idempotència de Door (check
// `isExited`) garanteix que cada jugador suma com a màxim un cop.
exit_sub_id_ = bus_.subscribe("player_exited", [this](const Event& /*ev*/) {
++exited_players_;
if (level_complete_emitted_) { return; }
if (expected_players_ > 0 && exited_players_ >= expected_players_) {
level_complete_emitted_ = true;
bus_.publish(Event{
.name = "level_complete",
.payload = std::monostate{},
.player_id = -1,
});
}
});
}
EntityManager::~EntityManager() {
bus_.unsubscribe(sarc_sub_id_);
bus_.unsubscribe(tile_sub_id_);
bus_.unsubscribe(exit_sub_id_);
}
void EntityManager::setExpectedPlayerCount(int n) {
expected_players_ = n;
exited_players_ = 0;
level_complete_emitted_ = false;
}
auto EntityManager::add(std::unique_ptr<Entity> entity) -> Entity* {