#pragma once #include #include #include #include "game/bola.hpp" #include "game/info.hpp" #include "game/mapa.hpp" #include "game/marcador.hpp" #include "game/momia.hpp" #include "game/prota.hpp" #include "game/scenes/palette_fade.hpp" #include "game/scenes/scene.hpp" // Escena de gameplay pur. Reemplaça el vell `Go()` bloquejant amb // l'interfície `Scenes::Scene` tick-based: `onEnter()` arranca la // música i un fade-in, el `tick()` avança un frame (Draw + Update // gated per Jg::shouldUpdate), i quan la partida acaba fa un fade-out // abans de retornar el next state. // // Tres fases internes: // 1. FADING_IN — fade-in 32 passos mentre el render segueix viu. // 2. Playing — gameplay normal; `final_` es setja quan el prota mor // o canvia de sala. `Update()` només avança cada 10 ms // via `Jg::shouldUpdate` (ticker fix del jail). // 3. FADING_OUT — fade-out 32 passos mantenint l'últim frame visible // (substituïx el `JD8_FadeOut` bloquejant que feia el // destructor legacy). class ModuleGame : public Scenes::Scene { public: ModuleGame(); ~ModuleGame() override; ModuleGame(const ModuleGame&) = delete; auto operator=(const ModuleGame&) -> ModuleGame& = delete; ModuleGame(ModuleGame&&) = delete; auto operator=(ModuleGame&&) -> ModuleGame& = delete; void onEnter() override; void tick(int delta_ms) override; [[nodiscard]] auto done() const -> bool override { return phase_ == Phase::DONE; } [[nodiscard]] auto nextState() const -> int override; private: enum class Phase : std::uint8_t { FADING_IN, PLAYING, FADING_OUT, DONE, }; void draw(); // render a `screen`; no crida Jd8::flip (ho fa el caller) void update(); // gated per Jg::shouldUpdate void iniciarMomies(); void applyFinalTransitions() const; // muta Info::ctx quan final_ passa a !=0 Phase phase_{Phase::FADING_IN}; Scenes::PaletteFade fade_; Uint8 final_{0}; Jd8::Surface gfx_{nullptr}; std::unique_ptr mapa_; std::unique_ptr sam_; std::unique_ptr marcador_; std::vector> momies_; std::unique_ptr bola_; };