#pragma once #include #include "core/jail/jdraw8.hpp" #include "scenes/intro_sprites_scene.hpp" #include "scenes/scene.hpp" #include "scenes/surface_handle.hpp" namespace scenes { // Intro "legacy" del wordmark JAILGAMES lletra a lletra + cicle de paleta. // Reemplaça `ModuleSequence::doIntro()`. S'activa quan // `Options::game.use_new_logo == false`; l'alternativa moderna és // `IntroNewLogoScene`. // // Flux: // 1. Carrega gfx/logo.gif, arranca música "music/menu.ogg", pantalla negra // 1000 ms. // 2. Revelat: 15 passos (100 o 200 ms) que van acumulant les lletres // "JAILGAMES" d'esquerra a dreta amb un avió escombrant al final // de la paraula. Els passos 5, 11, 13 i 15 netegen la pantalla // per generar els parpelleigs finals. // 3. Cicle de paleta: 256 passos × 20 ms modificant els índexs 16..31. // 4. Espera final 200 ms. // 5. 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: la mateixa factory que // per a IntroNewLogoScene, però retornada quan `use_new_logo == false`. class IntroScene : public Scene { public: IntroScene(); ~IntroScene() 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 { InitialWait, // 1000 ms pantalla negra Reveal, // 15 passos del wordmark PaletteCycle, // 256 × 20 ms mutant pal[16..31] FinalWait, // 200 ms abans de la sub-escena de sprites Sprites, // tick delegat a IntroSpritesScene fins que acaba Done, }; void render(); void advancePaletteCycle(); SurfaceHandle gfx_; JD8_Palette pal_{nullptr}; // propietat transferida a main_palette via SetScreenPalette std::unique_ptr sprites_scene_; Phase phase_{Phase::InitialWait}; int phase_acc_ms_{0}; int reveal_index_{0}; int palette_step_{0}; }; } // namespace scenes