feat(player): join in progress + DISABLED en agotar vidas (Fase 1)

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>
This commit is contained in:
JailDesignerandClaude Opus 4.7 committed 2026-05-08 20:04:33 +02:00
1 parent 8921b9fd0c
commit c13b11c501
12 files changed
+325 -56

No files matched your search

+29 -2
View File
@@ -41,6 +41,20 @@ class Hud {
WIN,
EMPTY };
// Prompt mostrat al bloc d'un slot inactiu (en lloc dels zeros). El
// GameScene fixa aquest valor cada frame segons el `RoomFsm::State`
// perquè el missatge sigui coherent amb si el jugador pot pulsar
// START per entrar ara mateix o si ha d'esperar al canvi de fase.
// - NONE → render històric (zeros). Per a slots actius o per
// quan el GameScene no vol ensenyar prompt.
// - CAN_JOIN → "PULSA START / PARA JUGAR". Slot inactiu en PLAYING.
// - WAIT → "ESPERA / PARA JUGAR". Slot inactiu durant
// ROOM_INTRO/ROOM_OUTRO i, en fases futures, després
// de GAME OVER.
enum class JoinPromptMode : std::uint8_t { NONE,
CAN_JOIN,
WAIT };
Hud(EventBus& bus, std::shared_ptr<Text> font);
~Hud();
@@ -71,6 +85,14 @@ class Hud {
// arrenca amb les vides per defecte.
void activatePlayer(int player_one_based);
// Fixa el prompt visible al bloc d'un slot inactiu (1-based: 1 → P1,
// 2 → P2). Cridat des de `GameScene::update()` cada frame perquè el
// missatge depèn de l'estat de la `RoomFsm` (vegeu enum
// `JoinPromptMode`). Sobre un slot actiu el prompt no es renderitza
// — el camp existeix per simetria i per evitar branques al caller.
// Idempotent: cridar amb el mateix mode és no-op.
void setJoinPrompt(int player_one_based, JoinPromptMode mode);
// Geometria pública perquè la GameScene puga calcular si el HUD
// s'està movent encara (p. ex. retardar l'spawn fins que estiga al
// seu lloc) — opcional, no obligatori.
@@ -124,9 +146,14 @@ class Hud {
int lives{DEFAULT_LIVES};
int score{0};
int treasures{0};
// `false` → el bloc mostra `000000`/`0`/`00` (jugador inactiu).
// Sempre es renderitza per mantenir el layout fix.
// `false` → el bloc mostra el prompt actiu (`join_prompt`) o
// bé zeros si el prompt és NONE. Sempre es renderitza per
// mantenir el layout fix.
bool active{false};
// Missatge a mostrar quan `active==false`. El GameScene el
// refresca cada frame segons l'estat de la RoomFsm (vegeu
// `Hud::setJoinPrompt`).
JoinPromptMode join_prompt{JoinPromptMode::NONE};
};
// Pinta el bloc indicat amb el seu fons + el contingut del seu mode