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:
1 parent
8921b9fd0c
commit
c13b11c501
12 files changed
+325
-56
No files matched your search
+29
-2
@@ -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
|
||||
|
||||
Reference in new issue
Block a user