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:
1 parent
62f4b857ef
commit
6a6a1a52c7
3 files changed
+106
-13
No files matched your search
@@ -126,6 +126,23 @@ class EntityManager {
|
||||
// d'una posició del cursor i el passa.
|
||||
auto addSpawn(const fkyaml::node& spawn) -> Entity*;
|
||||
|
||||
// Instancia tots els actors que estan en `pending_actors_` (cua que
|
||||
// `loadFromLevel` omple amb les DynamicHazards declarades al YAML del
|
||||
// mapa). Cada actor neix en estat SPAWN (per defecte des de la
|
||||
// plantilla; veure `Mummy::Mummy`) i s'arma immediatament el
|
||||
// `triggerSpawnExit()` perquè la fase EMERGING corri els seus segons
|
||||
// de `spawn.duration_s` i transiti a ACTIVE. Vacia la cua. Cridada
|
||||
// des de GameScene en una subfase concreta de ROOM_INTRO i des de
|
||||
// `respawnPlayersInstant` (salt debug).
|
||||
void spawnPendingActors();
|
||||
|
||||
// Crea un actor on-demand i el deixa en EMERGING (com a
|
||||
// `spawnPendingActors` però per a un sol). Pensat per a futurs
|
||||
// generadors (StaticHazards que produeixen DynamicHazards en runtime,
|
||||
// p.ex. gotes que cauen, roques que rodolen). Retorna el punter
|
||||
// observacional o `nullptr` si la plantilla o el factory fallen.
|
||||
auto spawnActor(const std::string& type, int col, int row) -> DynamicHazard*;
|
||||
|
||||
// Reset complet del nivell: destrueix totes les entitats, reseteja
|
||||
// els comptadors interns (sarcòfags oberts, total, exited, flag de
|
||||
// level_complete) i torna a cridar `loadFromLevel` per regenerar les
|
||||
@@ -144,6 +161,7 @@ class EntityManager {
|
||||
|
||||
[[nodiscard]] auto getBus() -> EventBus& { return bus_; }
|
||||
[[nodiscard]] auto entityCount() const -> std::size_t { return map_entities_.size() + actors_.size(); }
|
||||
[[nodiscard]] auto pendingActorCount() const -> std::size_t { return pending_actors_.size(); }
|
||||
[[nodiscard]] auto sarcophagusCount() const -> std::size_t { return total_sarcs_; }
|
||||
[[nodiscard]] auto openedSarcophagusCount() const -> std::size_t { return opened_sarcs_; }
|
||||
[[nodiscard]] auto exitedPlayerCount() const -> std::size_t { return exited_players_; }
|
||||
@@ -168,6 +186,16 @@ class EntityManager {
|
||||
// `add()` enruta automàticament segons sigui o no DynamicHazard.
|
||||
std::vector<std::unique_ptr<Entity>> map_entities_;
|
||||
std::vector<std::unique_ptr<DynamicHazard>> actors_;
|
||||
// Cua d'actors declarats al YAML del mapa però encara no instanciats:
|
||||
// `loadFromLevel` hi empeny tots els DynamicHazards. `spawnPendingActors`
|
||||
// o `spawnActor` consumeixen aquesta cua (o creen un actor on-demand)
|
||||
// i ho buiden. El `fkyaml::node` original es guarda perquè conté la
|
||||
// posició i qualsevol override del map respecte a la plantilla.
|
||||
struct PendingActor {
|
||||
std::string type;
|
||||
fkyaml::node spawn_node;
|
||||
};
|
||||
std::vector<PendingActor> pending_actors_;
|
||||
Door* door_{nullptr};
|
||||
std::size_t total_sarcs_{0};
|
||||
std::size_t opened_sarcs_{0};
|
||||
|
||||
Reference in new issue
Block a user