step 2: banner_scene substituix doBanner() (piràmides 2-5) + helper playMusic compartit

This commit is contained in:
2026-04-15 23:13:05 +02:00
parent d86cb21efa
commit 2cb38ffb49
9 changed files with 158 additions and 70 deletions

View File

@@ -0,0 +1,71 @@
#include "scenes/banner_scene.hpp"
#include <cstdlib>
#include "core/jail/jail_audio.hpp"
#include "core/jail/jdraw8.hpp"
#include "core/jail/jinput.hpp"
#include "game/info.hpp"
#include "scenes/scene_utils.hpp"
namespace scenes {
void BannerScene::onEnter() {
playMusic("00000004.ogg");
gfx_ = SurfaceHandle("ffase.gif");
JD8_ClearScreen(0);
// Títols superior i inferior del banner (compartits per tots els nivells)
JD8_Blit(81, 24, gfx_, 81, 155, 168, 21);
JD8_Blit(39, 150, gfx_, 39, 175, 248, 20);
// Número de piràmide: les 4 variants del vell `doBanner` es reduïxen
// a coordenades (sx,sy) calculades a partir de l'índex 0..3.
const int idx = info::ctx.num_piramide - 2; // 2..5 → 0..3
if (idx >= 0 && idx <= 3) {
const int sx = (idx % 2) * 160;
const int sy = (idx / 2) * 75;
JD8_Blit(82, 60, gfx_, sx, sy, 160, 75);
}
// PaletteFade copia internament amb memcpy; alliberem la paleta temporal.
JD8_Palette pal = JD8_LoadPalette("ffase.gif");
fade_.startFadeTo(pal);
std::free(pal);
phase_ = Phase::FadingIn;
remaining_ms_ = 5000;
}
void BannerScene::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) {
JA_FadeOutMusic(250);
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

View File

@@ -0,0 +1,40 @@
#pragma once
#include "scenes/palette_fade.hpp"
#include "scenes/scene.hpp"
#include "scenes/surface_handle.hpp"
namespace scenes {
// Banner pre-piràmide ("PIRÀMIDE X"). Reemplaça `ModuleSequence::doBanner()`.
//
// Flux:
// 1. Arranca música "00000004.ogg" i carrega ffase.gif.
// 2. Pinta títol, subtítol i número de piràmide segons info::ctx.num_piramide.
// 3. Fade-in de paleta.
// 4. Mostra ~5s o fins que es polse una tecla.
// 5. JA_FadeOutMusic(250) + fade-out de paleta.
// 6. Retorna nextState=0 per a entrar al ModuleGame.
//
// Registrat al SceneRegistry amb state_keys 2..5 (els num_piramide on
// el vell `doBanner()` es cridava).
class BannerScene : public Scene {
public:
void onEnter() override;
void tick(int delta_ms) override;
bool done() const override { return phase_ == Phase::Done; }
int nextState() const override { return 0; }
private:
enum class Phase { FadingIn,
Showing,
FadingOut,
Done };
SurfaceHandle gfx_;
PaletteFade fade_;
Phase phase_{Phase::FadingIn};
int remaining_ms_{5000};
};
} // namespace scenes

View File

@@ -2,31 +2,15 @@
#include <cstdlib>
#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<Uint8*>(buffer), size, music));
}
} // namespace
#include "scenes/scene_utils.hpp"
namespace scenes {
void MortScene::onEnter() {
play_music("00000001.ogg");
playMusic("00000001.ogg");
JI_DisableKeyboard(60);
info::ctx.vida = 5;
@@ -60,7 +44,7 @@ void MortScene::tick(int 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");
playMusic("00000003.ogg");
info::ctx.num_piramide = 0;
fade_.startFadeOut();
phase_ = Phase::FadingOut;

View File

@@ -0,0 +1,21 @@
#include "scenes/scene_utils.hpp"
#include <SDL3/SDL.h>
#include "core/jail/jail_audio.hpp"
#include "core/jail/jfile.hpp"
namespace scenes {
void playMusic(const char* filename) {
if (!filename) return;
int size = 0;
char* buffer = file_getfilebuffer(filename, size);
if (!buffer) return;
// JA_LoadMusic fa una còpia del OGG comprimit (SDL_malloc), així que
// el `buffer` original es queda huérfano. Leak conegut heredat del
// codi original — es tractarà quan jfile tinga una API std::vector.
JA_PlayMusic(JA_LoadMusic(reinterpret_cast<Uint8*>(buffer), size, filename));
}
} // namespace scenes

View File

@@ -0,0 +1,12 @@
#pragma once
// Helpers compartits per les escenes. Aquest header és petit i creix
// quan una abstracció comú apareix en dos o més escenes.
namespace scenes {
// Carrega un OGG de `data/` i arranca'l com a música de fons. Substituïx
// el `play_music()` repetit en tots els doX() del vell modulesequence.
void playMusic(const char* filename);
} // namespace scenes