Tres canvis coordinats que tanquen la cinemàtica desitjada de
ROOM_INTRO:
1. `spawn.duration_s` de mummy.yaml passa de 0.6 a 1.0 s. Les mòmies
tarden ~1 segon a "emergir" — temps suficient perquè el jugador
noti que estan apareixent, no que ja eren a la sala.
2. El disparador es mou de fase 5 (music_tail) a fase 4 (text-exit).
Ara, just quan el text "PIRÀMIDE X, SALA Y" comença a sortir de
pantalla, GameScene crida `entity_manager_.spawnPendingActors()`
i les mòmies s'instancien ja en EMERGING. Visualment apareixen
alhora que el text desapareix; durant la fase 5 acaben d'emergir
i a l'entrada a PLAYING ja són ACTIVE — coincidint amb la caiguda
aèria dels jugadors.
3. `completeIntro` afegeix un fallback: si arribem a PLAYING sense
haver passat per fase 4 (config patològica, fases molt curtes),
instanciem els pending igualment per garantir que la sala mai no
queda sense enemics.
Renomenat: `hazards_spawn_triggered_` → `pending_actors_spawned_`,
nom que reflecteix què representa el flag al model nou.
El mètode privat `triggerHazardSpawnExit()` desapareix: era un
wrapper que ja només cridava `spawnPendingActors()`. Crida directa
des de `updateRoomTransition`, `respawnPlayersInstant` i
`completeIntro` (fallback).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
La mòmia ara entra a l'estat SPAWN al construir-se: visible al
pixel_rect_ inicial, sense moviment ni dany, esperant que algú extern
(GameScene) li armi el comptador via `triggerSpawnExit()`.
La durada (`spawn.duration_s` al YAML, default 0) controla quan passa
a ROAMING una vegada armat el comptador. Posat a 0.6s a mummy.yaml.
Aquest commit encara no enganxa el trigger: la mòmia es queda quieta
tota la partida — comportament visual intermedi, esperat. El commit
següent posarà el trigger a GameScene al final del text-exit de
ROOM_INTRO.
Tests de smoke i whip ajustats: les mòmies construïdes en stand-alone
necessiten `triggerSpawnExit()` + un update gran abans d'interactuar
amb `enterHurt`/contacto. Helper `exitMummySpawn` afegit a cada fitxer.
Guards defensius a `enterHurt` i `onPlayerContact`: encara que el filtre
central a EntityManager salta DynamicHazards en SPAWN, blindem la
crida directa per a futurs camins (whip propers, scripts...).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sub-FSM nova `GameOverFsm` (CONTINUE_PROMPT → GAME_OVER → FADE_OUT →
DONE) que viu en paral·lel a la `RoomFsm`. Es dispara quan tots els
jugadors queden DISABLED durant PLAYING, mostra el rètol "Continuar?"
amb countdown reusant el panel del room text, i si ningú pulsa START
acaba en "Fi del Joc" + fade negre i sol·licita la transició a LOGO.
Pulsar START durant CONTINUE? cancel·la el countdown i fa join (revive)
del jugador. Després de GAME OVER, el HUD passa a "ESPERA / PER JUGAR"
i el START queda bloquejat fins a la transició d'escena.
Els helpers d'animació del room text (X i altura del panel) ara reben
phase + elapsed_ms per paràmetre per poder ser reaprofitats per les
dues sub-FSMs sense duplicar la lògica visual.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Habilita la regla 1 de la nova FSM de joc: durant PLAYING, qualsevol
slot DISABLED pot pulsar START per entrar a partida amb spawn aeri al
seu costat de la porta i vides reseteades. Quan un jugador esgota les
vides, `respawnFromDying` el deixa a DISABLED i publica `player_disabled`
al bus; GameScene i HUD reaccionen, deixant el slot disponible per a un
nou join. Afegeix prompts al HUD ("PULSA START / PER JUGAR" o
"ESPERA / PER JUGAR") segons l'estat de la RoomFsm.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Nou apartat al ServiceMenu (entre Controls i Sistema) amb tres toggles
ON/OFF connectats a GameplayConfig: látec travessa sarcs, foc amic,
col·lisió entre jugadors. Cada canvi crida save() immediatament, així
l'estat persisteix entre sessions sense necessitat de "aplicar".
Locales ca/en: claus `tweaks` + tres `menu.items.*` corresponents.