#pragma once #include "scenes/scene.hpp" #include "scenes/surface_handle.hpp" namespace scenes { // Sub-escena de sprites de la intro (prota + momia + mapa + etc). // Reemplaça `ModuleSequence::doIntroSprites()`. No es registra al // SceneRegistry — es construeix com a membre de `IntroScene` o // `IntroNewLogoScene` quan aquestes completen el seu revelat del logo. // Rep el `SurfaceHandle` del gfx de la intro via move, de manera que // quan acabe l'escena el surface es lliberarà automàticament. // // En entrar tria una de 3 variants (`rand() % 3`): "interrogant/momia", // "creu/pedra" o "ball de carnaval". Cada variant té un nombre // diferent de fases però comparteixen el mateix motor: un comptador // `step` que s'incrementa cada 20 ms, amb una taula per variant que // mapeja (rang d'i, renderer) a cada fase. Qualsevol tecla salta // l'escena — el flag `skippable` per fase es manté com a mecanisme // per si alguna fase futura ha de ser no interrompuda (al vell codi // la fase "final" de la variant 0 no cridava wait_frame_or_skip, cosa // molt probablement un oversight: ací es tracta com a skippable). class IntroSpritesScene : public Scene { public: explicit IntroSpritesScene(SurfaceHandle&& gfx); ~IntroSpritesScene() override = default; void onEnter() override; void tick(int delta_ms) override; bool done() const override { return done_; } private: SurfaceHandle gfx_; int variant_{0}; // 0..2 — triada a onEnter() amb rand() % 3 int phase_{0}; // índex dins la variant actual int phase_step_{0}; // passos consumits dins la fase actual int step_acc_ms_{0}; // acumulador per emetre steps de 20 ms bool done_{false}; }; } // namespace scenes