#pragma once #include #include "core/jail/jdraw8.hpp" #include "game/scenes/palette_fade.hpp" #include "game/scenes/scene.hpp" #include "game/scenes/surface_handle.hpp" namespace Scenes { // Pre-Secreta. Reemplaça `ModuleSequence::doSecreta()`. // // Flux: // 1. Arranca música "music/secreta.ogg" i fa fade-out de la paleta anterior. // 2. Carrega gfx/tomba1.gif + paleta i pinta un scroll vertical doble // (dos blits solapats, un a velocitat meitat que l'altre) durant // ~2.5 s + ~2.5 s de pausa. // 3. Swap a gfx/tomba2.gif + reset de paleta, scroll vertical del segon // asset (~1.9 s + ~1.9 s de pausa). // 4. ClearScreen a 0, set colors 253/254 a vermell fosc (12,11,11) // i pinta un revelat horitzontal (~1.6 s + ~1.6 s de pausa). // 5. "Red pulse": anima els colors 253/254 incrementant el canal R // de 12 a 62 durant ~1 s (+ ~1 s de pausa). // 6. FadeOut + Ja::fadeOutMusic(250). // 7. Retorna nextState=0 per entrar al ModuleGame amb num_piramide=6. // // Registrada al SceneRegistry amb state_key = 6. class SecretaScene : public Scene { public: SecretaScene() = default; ~SecretaScene() override; 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 { return 0; } private: enum class Phase : std::uint8_t { INITIAL_FADE_OUT, TOMBA1_SCROLL_IN, TOMBA1_HOLD, TOMBA2_SCROLL_IN, TOMBA2_HOLD, TOMBA2_REVEAL, TOMBA2_REVEAL_HOLD, RED_PULSE, RED_PULSE_HOLD, FINAL_FADE_OUT, DONE, }; void swapToTomba2(); static void beginRedPulseSetup(); void beginFinalFade(); SurfaceHandle gfx_; Jd8::Palette pal_aux_{nullptr}; Jd8::Palette pal_active_{nullptr}; // propietat transferida a main_palette PaletteFade fade_; Phase phase_{Phase::INITIAL_FADE_OUT}; int phase_acc_ms_{0}; bool skip_triggered_{false}; }; } // namespace Scenes