feat(em): spawn diferit de DynamicHazards (pending_actors_)

`loadFromLevel` ja no instancia immediatament les DynamicHazards del
YAML del mapa: les acumula a `pending_actors_` (estructura {type,
spawn_node}). El loader decideix per la categoria semàntica de la
plantilla (`type:` del YAML d'entity: "dynamic_hazard" → pending; la
resta → addSpawn d'instant).

Dues APIs noves consumeixen pending_actors_:
- `spawnPendingActors()` — itera la cua, instancia tots via addSpawn
  i arma `triggerSpawnExit()` a cada un. Vacia la cua. El path
  d'aparició massiva al final del text-exit de ROOM_INTRO.
- `spawnActor(type, col, row)` — instancia un únic actor on-demand
  des d'un spawn YAML sintètic. Pensat per a futurs generadors
  (StaticHazards que produeixen DynamicHazards en runtime: gotes,
  roques, etc.). Cada actor neix ja en EMERGING.

`GameScene::triggerHazardSpawnExit` ara és un wrapper de
`spawnPendingActors()` — el dispar segueix en la subfase actual
(fase 5 de ROOM_INTRO) i a `respawnPlayersInstant`. El canvi de timing
ve en el commit següent.

`reload` també buida pending_actors_. Log: "N map entities + M actors
pending des de PATH" — visible per a diagnòstic.

Sense canvis de comportament observables al joc: les mòmies segueixen
apareixent al final del text-exit, però ara la "aparició" és la seua
instanciació real (abans ja existien quietes des del fade-in).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
JailDesignerandClaude Opus 4.7 committed 2026-05-11 10:35:02 +02:00
1 parent 62f4b857ef
commit 6a6a1a52c7
3 files changed
+106 -13

No files matched your search

+6 -10
View File
@@ -687,16 +687,12 @@ void GameScene::respawnPlayersInstant() {
#endif
void GameScene::triggerHazardSpawnExit() {
int count = 0;
// `getActors()` retorna directament `DynamicHazard*` — sense
// dynamic_cast (els actors viuen en el seu sac dedicat).
for (auto* actor : entity_manager_.getActors()) {
if (actor->isSpawning()) {
actor->triggerSpawnExit();
++count;
}
}
Log::info("ROOM", "INTRO: hazard spawn-exit armat ({} DynamicHazards)", count);
// Instancia els actors diferits (els que `loadFromLevel` ha empès a
// `pending_actors_`) i els arma el `triggerSpawnExit()` perquè entrin
// ja en EMERGING. L'aparició visual de la mòmia és aquesta crida.
const std::size_t PENDING = entity_manager_.pendingActorCount();
entity_manager_.spawnPendingActors();
Log::info("ROOM", "INTRO: spawn diferit de {} actors", PENDING);
}
void GameScene::triggerPlayerSpawn(std::size_t slot_index) {