test(game-scene): extracció RoomFsm i smoke test de la FSM de sala
This commit is contained in:
1 parent
9a2c677153
commit
63bb41425a
6 files changed
+493
-211
No files matched your search
@@ -11,6 +11,7 @@
|
||||
#include "game/entities/entity_manager.hpp"
|
||||
#include "game/map/paint_layer.hpp"
|
||||
#include "game/map/tilemap.hpp"
|
||||
#include "game/scenes/room_fsm.hpp"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#include "game/editor/editor.hpp"
|
||||
@@ -38,39 +39,6 @@ class GameScene : public Scene {
|
||||
|
||||
[[nodiscard]] static auto defaultConfig() -> Config;
|
||||
|
||||
// Estat de l'escena dins del cicle d'una sala. La màquina és interna a
|
||||
// GameScene: SceneManager segueix tractant GameScene com una sola
|
||||
// escena. ROOM_INTRO i ROOM_OUTRO bloquegen input i render dels
|
||||
// jugadors; l'EntityManager segueix avançant i el HUD/Notifier també.
|
||||
// L'enum es declara públic perquè els helpers de log (stateName) i
|
||||
// tests viuen fora de la classe; el camp `state_` segueix privat.
|
||||
enum class State : std::uint8_t {
|
||||
ROOM_INTRO, // Entrada de sala: fade in + text d'entrada.
|
||||
PLAYING, // Joc normal.
|
||||
ROOM_OUTRO, // Sortida de sala: text de sortida + fade out.
|
||||
};
|
||||
|
||||
// Configuració de la FSM de sala llegida de `data/scenes/game.yaml`.
|
||||
// Si el YAML manca, els camps queden amb els fallbacks compilats. Es
|
||||
// carrega un sol cop al ctor; canvis al fitxer requereixen reiniciar.
|
||||
// Pública pel mateix motiu que State: el reader viu en un anonymous
|
||||
// namespace fora de la classe per simetria amb els altres readers.
|
||||
struct SceneTransitionConfig {
|
||||
int intro_fade_in_ms{500};
|
||||
int intro_text_delay_ms{500};
|
||||
int intro_text_enter_ms{500};
|
||||
int intro_text_hold_ms{1000};
|
||||
int intro_text_exit_ms{500};
|
||||
|
||||
int outro_text_enter_ms{500};
|
||||
int outro_text_hold_ms{1000};
|
||||
int outro_text_exit_ms{500};
|
||||
int outro_fade_out_ms{500};
|
||||
|
||||
UiConfig::CurveFn text_enter_curve{nullptr};
|
||||
UiConfig::CurveFn text_exit_curve{nullptr};
|
||||
};
|
||||
|
||||
explicit GameScene(Config config = defaultConfig());
|
||||
~GameScene() override;
|
||||
|
||||
@@ -78,16 +46,15 @@ class GameScene : public Scene {
|
||||
void render() override;
|
||||
|
||||
private:
|
||||
// Punt centralitzat per canviar d'estat. Imprimeix la transició i
|
||||
// reinicialitza els acumuladors de la transició de sala. Cap estat
|
||||
// s'ha de canviar fora d'aquí.
|
||||
void setState(State new_state);
|
||||
// Punt centralitzat per canviar d'estat de sala. Imprimeix la
|
||||
// transició i reinicialitza els acumuladors de la `RoomFsm::Transition`.
|
||||
// Cap estat s'ha de canviar fora d'aquí.
|
||||
void setState(RoomFsm::State new_state);
|
||||
|
||||
// Avança la transició activa (sub-fases, timings). En aquesta fita
|
||||
// les transicions són instantànies (sense efectes); les sub-fases
|
||||
// amb fades i text arribaran als commits següents. S'executa cada
|
||||
// frame amb delta real (no escalat per la pausa) perquè la
|
||||
// transició viu en temps de UI.
|
||||
// Avança la transició activa via `RoomFsm::advance`. S'executa cada
|
||||
// frame amb delta real (no escalat per la pausa) perquè la transició
|
||||
// viu en temps de UI. Si l'estat retornat és diferent de l'actual,
|
||||
// crida `setState` (que reseteja la `Transition`).
|
||||
void updateRoomTransition(int delta_ms);
|
||||
|
||||
// Consumeix events d'aquest frame (F11 del KeyConfig "pause" o botó
|
||||
@@ -178,22 +145,16 @@ class GameScene : public Scene {
|
||||
|
||||
// Configuració de la FSM de sala (intro/outro). Carregada al ctor des
|
||||
// de `data/scenes/game.yaml`; valors per defecte si manca el YAML.
|
||||
SceneTransitionConfig transition_config_{};
|
||||
RoomFsm::Config transition_config_{};
|
||||
|
||||
// Estat actual de la FSM de sala. S'inicialitza a ROOM_INTRO al ctor
|
||||
// perquè cada vegada que entres al joc passes per la presentació de
|
||||
// la sala. La transició a PLAYING l'orquestra `updateRoomTransition`.
|
||||
State state_{State::ROOM_INTRO};
|
||||
RoomFsm::State state_{RoomFsm::State::ROOM_INTRO};
|
||||
|
||||
// Sub-fase i temps acumulat dins de l'estat actual. `setState` el
|
||||
// reseteja a {0, 0}. La interpretació depèn de l'estat:
|
||||
// ROOM_INTRO: 0=fade_in, 1=text_delay, 2=text_enter, 3=text_hold, 4=text_exit
|
||||
// ROOM_OUTRO: 0=text_enter, 1=text_hold, 2=text_exit, 3=fade_out
|
||||
// PLAYING: no s'usa (updateRoomTransition no avança res).
|
||||
struct RoomTransition {
|
||||
int phase{0};
|
||||
int elapsed_ms{0};
|
||||
} transition_{};
|
||||
// reseteja a {0, 0}.
|
||||
RoomFsm::Transition transition_{};
|
||||
|
||||
// Índex de sala que es passa com a paràmetre {n} al text d'intro.
|
||||
// Avui és sempre 1 (no hi ha itinerari de sales encara). Quan
|
||||
@@ -201,13 +162,6 @@ class GameScene : public Scene {
|
||||
// de ROOM_OUTRO → ROOM_INTRO per saltar a la pròxima.
|
||||
int room_index_{1};
|
||||
|
||||
// Substitueix `{n}` de `Locale::get().text("game.room_intro")` per
|
||||
// l'enter passat. Pensat com a primer pas mínim cap a un format
|
||||
// genèric: si apareix més text parametritzat, val la pena ascendir
|
||||
// a un `Locale::format` propi. Estàtica perquè no depèn d'estat de
|
||||
// l'escena (només consulta el Locale singleton).
|
||||
[[nodiscard]] static auto formatRoomTitle(int n) -> std::string;
|
||||
|
||||
// Píxels del fade negre i del text de la transició de sala.
|
||||
// Cridats des de `render()` entre el bloc d'actors i el HUD —
|
||||
// així marcador, notificacions i service menu queden per damunt.
|
||||
|
||||
Reference in new issue
Block a user