Files

69 lines
2.2 KiB
C++

#pragma once
#include <cstdint>
#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