#pragma once #include #include #include "core/jail/jdraw8.hpp" #include "game/scenes/intro_sprites_scene.hpp" #include "game/scenes/scene.hpp" #include "game/scenes/surface_handle.hpp" namespace Scenes { // Intro "moderna" del logo Jailgames amb revelat lletra-a-lletra + // ciclo de paleta final. Reemplaça `ModuleSequence::doIntroNewLogo()`. // // Flux: // 1. Carrega gfx/logo_new.gif, arranca música "music/menu.ogg" i posa // la paleta directament (sense fade-in). Mostra pantalla negra 1s. // 2. Revelat: 9 lletres × 2 frames (amb cursor / sense cursor), 150 ms // cada frame. // 3. Logo complet amb cursor fix 200 ms. // 4. Cicle de paleta de 256 passos modificant índexs 16–31 cada 20 ms. // 5. Espera final 20 ms. // 6. Transfereix el gfx_ a una `IntroSpritesScene` com a sub-escena // i li delega els ticks fins que acaba (anima el prota + momia + // mapa, amb 3 variants aleatòries). En acabar, setzea num_piramide // = 0 per passar al menú. // // Registrada al SceneRegistry amb state_key = 255, amb una factory // condicional: només s'activa si `Options::game.use_new_logo == true`. // Si és false, la factory retorna nullptr i el gameFiberEntry cau al // path legacy (`ModuleSequence::doIntro()` vell). class IntroNewLogoScene : public Scene { public: IntroNewLogoScene(); ~IntroNewLogoScene() override; void onEnter() override; void tick(int delta_ms) override; [[nodiscard]] auto done() const -> bool override { return phase_ == Phase::DONE; } private: enum class Phase : std::uint8_t { INITIAL, // pantalla negra 1000 ms REVEALING, // 9 × 2 frames × 150 ms cada un FULL_LOGO_FLASH, // logo complet + cursor, 200 ms PALETTE_CYCLE, // 256 passos × 20 ms modificant paleta FINAL_WAIT, // 20 ms final SPRITES, // tick delegat a IntroSpritesScene fins que acaba DONE, }; void render(); void advancePaletteCycle(); // Helpers per a `tick()` — extrets per reduir complexitat cognitiva. void advanceRevealing(int delta_ms); void advancePaletteStep(int delta_ms); void advanceSpritesPhase(int delta_ms); SurfaceHandle gfx_; SurfaceHandle cursor_surf_; Jd8::Palette pal_{nullptr}; // propietat transferida a main_palette via SetScreenPalette std::unique_ptr sprites_scene_; Phase phase_{Phase::INITIAL}; int phase_acc_ms_{0}; int reveal_letter_{0}; bool reveal_cursor_visible_{true}; int palette_step_{0}; }; } // namespace Scenes