#include "scenes/mort_scene.hpp" #include #include "core/jail/jail_audio.hpp" #include "core/jail/jdraw8.hpp" #include "core/jail/jfile.hpp" #include "core/jail/jinput.hpp" #include "game/info.hpp" namespace { // Helper local: carrega un OGG del disc i l'envia a JA_PlayMusic. Equivalent // al `play_music()` del modulesequence vell. El buffer es queda huérfano // després de passar-lo a JA_LoadMusic (que n'ha fet una còpia SDL_malloc'd). // Leak conegut del codi original, no el fixem en aquesta escena. void play_music(const char* music) { int size = 0; char* buffer = file_getfilebuffer(music, size); if (!buffer) return; JA_PlayMusic(JA_LoadMusic(reinterpret_cast(buffer), size, music)); } } // namespace namespace scenes { void MortScene::onEnter() { play_music("00000001.ogg"); JI_DisableKeyboard(60); info::ctx.vida = 5; gfx_ = SurfaceHandle("gameover.gif"); JD8_ClearScreen(0); JD8_Blit(gfx_); // PaletteFade en fa una còpia interna via memcpy, així que alliberem // la paleta temporal immediatament. JD8_Palette pal = JD8_LoadPalette("gameover.gif"); fade_.startFadeTo(pal); std::free(pal); phase_ = Phase::FadingIn; remaining_ms_ = 10000; } void MortScene::tick(int delta_ms) { switch (phase_) { case Phase::FadingIn: fade_.tick(delta_ms); if (fade_.done()) phase_ = Phase::Showing; break; case Phase::Showing: if (JI_AnyKey()) { remaining_ms_ = 0; } else { remaining_ms_ -= delta_ms; } if (remaining_ms_ <= 0) { // Arrenca música del següent mòdul abans del fade out, // igual que la versió vella feia al final de doMort(). play_music("00000003.ogg"); info::ctx.num_piramide = 0; fade_.startFadeOut(); phase_ = Phase::FadingOut; } break; case Phase::FadingOut: fade_.tick(delta_ms); if (fade_.done()) phase_ = Phase::Done; break; case Phase::Done: break; } } } // namespace scenes