82 lines
2.8 KiB
C++
82 lines
2.8 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 {
|
|
|
|
// 3 slides narratius amb scroll d'entrada + espera + transició amb
|
|
// fade-out. Reemplaça `ModuleSequence::doSlides()`.
|
|
//
|
|
// Tria d'asset segons context:
|
|
// - num_piramide == 7 i diners < 200: gfx/intro2.gif + música "music/final.ogg"
|
|
// - num_piramide == 7 i diners >= 200: gfx/intro3.gif + música "music/final.ogg"
|
|
// - altre cas (num_piramide == 1): gfx/intro.gif, sense música nova
|
|
//
|
|
// Flux:
|
|
// SLIDE1_ENTER (1600 ms scroll dreta→centre, easing outCubic)
|
|
// → SLIDE1_HOLD (4600 ms)
|
|
// → FADE_OUT1 + clear + reset paleta
|
|
// → SLIDE2_ENTER (1600 ms scroll esquerra→centre)
|
|
// → SLIDE2_HOLD (4600 ms)
|
|
// → FADE_OUT2 + clear + reset paleta
|
|
// → SLIDE3_ENTER (1600 ms scroll dreta→centre)
|
|
// → SLIDE3_HOLD (4600 ms)
|
|
// → FADE_FINAL (Ja::fadeOutMusic si num_piramide != 7 + fade paleta)
|
|
// → Done
|
|
//
|
|
// Qualsevol tecla salta directament a FADE_FINAL (sense cortar la música
|
|
// si hem entrat per num_piramide==7, per fidelitat al vell).
|
|
//
|
|
// NextState:
|
|
// - num_piramide==7 al entrar → num_piramide=8 + return 1 (a Credits)
|
|
// - altre cas → return 0 (entra al ModuleGame)
|
|
class SlidesScene : public Scene {
|
|
public:
|
|
SlidesScene() = default;
|
|
~SlidesScene() 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 next_state_; }
|
|
|
|
private:
|
|
enum class Phase : std::uint8_t {
|
|
SLIDE1_ENTER,
|
|
SLIDE1_HOLD,
|
|
FADE_OUT1,
|
|
SLIDE2_ENTER,
|
|
SLIDE2_HOLD,
|
|
FADE_OUT2,
|
|
SLIDE3_ENTER,
|
|
SLIDE3_HOLD,
|
|
FADE_FINAL,
|
|
DONE,
|
|
};
|
|
|
|
// Pinta un slide amb desplaçament horitzontal. `slide_idx` = 0..2
|
|
// (correspon a la franja 65x65 a y = 0, 65, 130 dins de gfx_).
|
|
// `pos_x` = desplaçament, amb clipping manual quan surt de pantalla.
|
|
void drawSlide(int slide_idx, int pos_x);
|
|
void restorePalette();
|
|
void beginFinalFade();
|
|
|
|
SurfaceHandle gfx_;
|
|
Jd8::Palette pal_aux_{nullptr}; // còpia "neta" que preservem
|
|
Jd8::Palette pal_active_{nullptr}; // propietat transferida a main_palette
|
|
PaletteFade fade_;
|
|
|
|
Phase phase_{Phase::SLIDE1_ENTER};
|
|
int phase_acc_ms_{0};
|
|
int num_piramide_at_start_{1};
|
|
int next_state_{0};
|
|
bool skip_triggered_{false};
|
|
};
|
|
|
|
} // namespace scenes
|