feat(player): estat EXITED i porta oberta despawna jugadors via player_exited
This commit is contained in:
1 parent
377e5d0b97
commit
5c5cd1d5da
5 files changed
+93
-22
No files matched your search
@@ -7,7 +7,9 @@
|
||||
// T4 sarcòfag — perímetre computat correctament; notifyTilePainted
|
||||
// passa a OPENING quan es visiten tots els tiles.
|
||||
// T5 manager — 2 sarcs + 1 door: forçant l'obertura dels sarcs, la porta
|
||||
// s'obri sola; contactar la porta OPEN emet `level_complete`.
|
||||
// s'obri sola. El contacte de la porta amb un jugador
|
||||
// nul·l és no-op segur (la porta ja no emet `level_complete`
|
||||
// directament; ho fa EntityManager comptant `player_exited`).
|
||||
// T6 animation — 3 frames @ 10 fps, `tick(0.15)` → frame índex == 1.
|
||||
// T7 plantilles — carrega els 7 YAML d'entitat sense excepcions.
|
||||
// T8 decoration — Torch no col·lisiona ni és interactable.
|
||||
@@ -173,12 +175,6 @@ namespace {
|
||||
manager.add(std::move(door));
|
||||
manager.setDoor(door_ptr);
|
||||
|
||||
// Subscriptor local per capturar `level_complete`.
|
||||
bool level_complete_fired = false;
|
||||
manager.getBus().subscribe("level_complete", [&](const Event&) {
|
||||
level_complete_fired = true;
|
||||
});
|
||||
|
||||
// Forcem l'obertura dels dos sarcs visitant els seus perímetres.
|
||||
auto forceOpen = [](Sarcophagus* s) {
|
||||
const int COL0 = s->getTilePos().col;
|
||||
@@ -206,12 +202,16 @@ namespace {
|
||||
REQUIRE(manager.openedSarcophagusCount() == 2);
|
||||
REQUIRE(door_ptr->getState() == Door::State::OPEN);
|
||||
|
||||
// Contacte amb la porta oberta → level_complete.
|
||||
door_ptr->onPlayerContact(nullptr);
|
||||
REQUIRE(level_complete_fired);
|
||||
|
||||
// Un segon contacte NO torna a disparar (idempotent).
|
||||
level_complete_fired = false;
|
||||
// Contacte sense jugador (nullptr): no-op segur. La porta ja no
|
||||
// emet `level_complete` directament — ara és EntityManager qui
|
||||
// l'emet quan tots els jugadors han eixit. La cobertura
|
||||
// d'aquest agregat viu al test específic d'EntityManager
|
||||
// (test_game_fsm) perquè requereix instanciar Player, fora
|
||||
// d'abast d'aquest smoke purament d'entitats.
|
||||
bool level_complete_fired = false;
|
||||
manager.getBus().subscribe("level_complete", [&](const Event&) {
|
||||
level_complete_fired = true;
|
||||
});
|
||||
door_ptr->onPlayerContact(nullptr);
|
||||
REQUIRE(!level_complete_fired);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user