#pragma once #include "core/jail/jdraw8.hpp" #include "scenes/frame_animator.hpp" #include "scenes/palette_fade.hpp" #include "scenes/scene.hpp" #include "scenes/surface_handle.hpp" namespace scenes { // Crèdits finals del joc. Reemplaça `ModuleSequence::doCredits()`. // // Flux: // 1. Carrega final.gif (sprites de crèdits) i finals.gif (fons). // 2. Mostra els crèdits amb scroll vertical de 2 columnes durant // ~62 segons (contador 0..3100 × 20 ms). // 3. Si `info::ctx.diamants == 16`, pinta addicionalment un parallax // de 4 capes amb cotxe animat (8 frames). Si no, 2 blits fixos. // 4. Al acabar (per tecla o per contador), crea el fitxer `trick.ini` // i activa `info::ctx.nou_personatge`. // 5. Fade-out de paleta. Torna a la intro (num_piramide = 255). // // Registrada al SceneRegistry amb state_key = 8. class CreditsScene : public Scene { public: CreditsScene() = default; ~CreditsScene() override; void onEnter() override; void tick(int delta_ms) override; bool done() const override { return phase_ == Phase::Done; } int nextState() const override { return 1; } private: enum class Phase { Rolling, FadingOut, Done }; void render(); void writeTrickIni(); SurfaceHandle vaddr2_; // final.gif (sprites i coches) SurfaceHandle vaddr3_; // finals.gif (fons / parallax) PaletteFade fade_; FrameAnimator coche_{8, 60, true}; // 8 frames × 60 ms (~3 × 20 ms tick vell) Phase phase_{Phase::Rolling}; int contador_{1}; int contador_acc_ms_{0}; }; } // namespace scenes