From a717411eddf26c17c72623b2a85ba13484188452 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 8 May 2026 22:06:44 +0200 Subject: [PATCH] feat(audio): musica acelerada en CONTINUE?, game_over.ogg, tick del countdown --- data/audio/music/game_over.ogg | Bin 0 -> 58623 bytes data/audio/sounds/countdown.wav | Bin 0 -> 7364 bytes data/scenes/game/game.yaml | 14 ++++ source/core/audio/audio.cpp | 7 ++ source/core/audio/audio.hpp | 5 ++ source/core/audio/jail_audio.cpp | 5 ++ source/core/audio/jail_audio.hpp | 8 ++ source/core/system/director.cpp | 3 + source/game/scenes/game_over_fsm.cpp | 9 +++ source/game/scenes/game_over_fsm.hpp | 19 +++++ source/game/scenes/game_scene.cpp | 105 ++++++++++++++++++++++++++- source/game/scenes/game_scene.hpp | 12 +++ source/utils/defaults.hpp | 1 + 13 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 data/audio/music/game_over.ogg create mode 100644 data/audio/sounds/countdown.wav diff --git a/data/audio/music/game_over.ogg b/data/audio/music/game_over.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e71324ca359f1a629a8e5c3a6ad378824ac6fb66 GIT binary patch literal 58623 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%0A!VFmKNo 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]+?W_b8h&+5CVC+67nstfw#p{pY*M=~2*hnUjLN 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 literal 0 HcmV?d00001 diff --git a/data/scenes/game/game.yaml b/data/scenes/game/game.yaml index 1f11ad7..811e875 100644 --- a/data/scenes/game/game.yaml +++ b/data/scenes/game/game.yaml @@ -71,3 +71,17 @@ game_over: # abans que el GameScene demani la transició d'escena. fade_out_ms: 500 black_hold_ms: 500 + # Velocitat (frequency ratio) de la música mentre dura el countdown + # de CONTINUE_PROMPT. 1.0 = sense canvi, 1.5 = un 50% més ràpid (i + # amb el to més agut: efecte arcade clàssic). Es restableix a 1.0 al + # sortir del prompt — tant si el jugador reviu com si entra GAME OVER. + continue_music_speed: 1.05 + # Pista de música que sona durant l'estat GAME_OVER (sense loop). + # La fase de hold del text es sincronitza amb la durada real de la + # pista, així que el rètol "Fi del Joc" es manté visible mentre dura + # la música; després ve l'exit anim, el wait i el fade a LOGO. + game_over_music_track: "game_over.ogg" + # So que sona cada vegada que apareix un nou número del countdown + # (al primer cop que es mostra `continue_count_start`, a cada canvi, + # i quan apareix el 0 — però NO al saltar a GAME OVER). Buit = silenci. + countdown_sound_key: "countdown.wav" diff --git a/source/core/audio/audio.cpp b/source/core/audio/audio.cpp index 3aca318..7477cd9 100644 --- a/source/core/audio/audio.cpp +++ b/source/core/audio/audio.cpp @@ -113,6 +113,13 @@ void Audio::stopMusic() { } } +// NOLINTNEXTLINE(readability-make-member-function-const) +void Audio::setMusicSpeed(float ratio) { + if (music_enabled_) { + engine_->setMusicSpeed(ratio); + } +} + // Reprodueix un so per nom // NOLINTNEXTLINE(readability-make-member-function-const) — muta estat via engine_; unique_ptr::operator-> no propaga const void Audio::playSound(const std::string& name, Group group) { diff --git a/source/core/audio/audio.hpp b/source/core/audio/audio.hpp index 26b94c1..1f930a4 100644 --- a/source/core/audio/audio.hpp +++ b/source/core/audio/audio.hpp @@ -76,6 +76,11 @@ class Audio { void stopMusic(); // Aturar completament la música void fadeOutMusic(int milliseconds); // Fosa de sortida de la música (muta globals de Ja) void setOnMusicEnded(std::function callback); // Callback disparat quan la pista actual acaba de drenar (CONV-03) + // Multiplicador de velocitat de la música actual. 1.0 = normal, + // 1.5 = un 50% més ràpid (efecte "chipmunk" — també puja el to). + // Es reseteja a 1.0 implícitament a cada `playMusic`. No-op si no + // hi ha música activa. + void setMusicSpeed(float ratio); // --- Control de sons --- void playSound(const std::string& name, Group group = Group::GAME); // Reproduir so puntual per nom (muta globals de Ja) diff --git a/source/core/audio/jail_audio.cpp b/source/core/audio/jail_audio.cpp index 9c9a3ac..83ec17a 100644 --- a/source/core/audio/jail_audio.cpp +++ b/source/core/audio/jail_audio.cpp @@ -286,6 +286,11 @@ namespace Ja { } } + void Engine::setMusicSpeed(float ratio) { + if (current_music_ == nullptr || current_music_->stream == nullptr) { return; } + SDL_SetAudioStreamFrequencyRatio(current_music_->stream, ratio); + } + void Engine::pauseMusic() { if (current_music_ == nullptr || current_music_->state != MusicState::PLAYING) { return; } diff --git a/source/core/audio/jail_audio.hpp b/source/core/audio/jail_audio.hpp index aba0ba9..88db498 100644 --- a/source/core/audio/jail_audio.hpp +++ b/source/core/audio/jail_audio.hpp @@ -171,6 +171,14 @@ namespace Ja { void crossfadeMusic(Music* music, int crossfade_ms, int loop = -1); [[nodiscard]] auto getMusicState() const -> MusicState; auto setMusicVolume(float volume) -> float; + // Multiplicador de velocitat de reproducció de la música actual + // via `SDL_SetAudioStreamFrequencyRatio`. 1.0 = normal, 2.0 = + // doble velocitat. Cal saber que també puja el to (efecte + // "chipmunk") — és el comportament arcade clàssic dels comptes + // enrere. Cada `playMusic` crea un stream nou amb ratio 1.0, + // així que un canvi de track reseteja la velocitat + // implícitament. No-op si no hi ha música activa. + void setMusicSpeed(float ratio); // Registra un callback que es disparà quan la música actual acabi de // drenar naturalment (times == 0 + stream buit). Es crida DESPRÉS de // stopMusic, així que el callback pot invocar playMusic sense córrer. diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index e0a3c3d..53209a0 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -168,6 +168,9 @@ Director::Director() { Resource::Cache::get().loadMusic("room_intro.ogg", Defaults::Paths::MUSIC_ROOM_INTRO); Resource::Cache::get().loadMusic("playing.ogg", Defaults::Paths::MUSIC_PLAYING); Resource::Cache::get().loadMusic("room_outro.ogg", Defaults::Paths::MUSIC_ROOM_OUTRO); + // Pista de game over: pre-load igual que la resta perquè el playMusic + // del moment en què es dispara la sub-FSM no facti disc. + Resource::Cache::get().loadMusic("game_over.ogg", Defaults::Paths::MUSIC_GAME_OVER); // Música de la TITLE: arrenca al constructor de l'escena i es fa // fade-out quan l'escena entra a STARTING. Resource::Cache::get().loadMusic("title.ogg", Defaults::Paths::MUSIC_TITLE); diff --git a/source/game/scenes/game_over_fsm.cpp b/source/game/scenes/game_over_fsm.cpp index 8c21f48..9157ac0 100644 --- a/source/game/scenes/game_over_fsm.cpp +++ b/source/game/scenes/game_over_fsm.cpp @@ -42,6 +42,15 @@ namespace GameOverFsm { cfg.game_over_wait_ms = readChildInt(n, "game_over_wait_ms", cfg.game_over_wait_ms); cfg.fade_out_ms = readChildInt(n, "fade_out_ms", cfg.fade_out_ms); cfg.black_hold_ms = readChildInt(n, "black_hold_ms", cfg.black_hold_ms); + if (n.contains("continue_music_speed")) { + cfg.continue_music_speed = n["continue_music_speed"].get_value(); + } + if (n.contains("game_over_music_track")) { + cfg.game_over_music_track = n["game_over_music_track"].get_value(); + } + if (n.contains("countdown_sound_key")) { + cfg.countdown_sound_key = n["countdown_sound_key"].get_value(); + } } Log::info("GameOverFsm", "timings carregats des de {} (continue hold {}ms, fade {}ms)", yaml_path, cfg.continue_text_hold_ms, cfg.fade_out_ms); diff --git a/source/game/scenes/game_over_fsm.hpp b/source/game/scenes/game_over_fsm.hpp index c738bad..ab23d59 100644 --- a/source/game/scenes/game_over_fsm.hpp +++ b/source/game/scenes/game_over_fsm.hpp @@ -73,6 +73,25 @@ namespace GameOverFsm { // canvas negre opac abans que el GameScene demani la transició. int fade_out_ms{500}; int black_hold_ms{500}; + + // Multiplicador de velocitat de la música mentre dura el + // CONTINUE_PROMPT. 1.0 = sense canvi, >1 = més ràpid (i amb el + // to més agut: és l'efecte arcade clàssic dels comptes enrere). + // Es restableix a 1.0 al sortir del prompt (revive o GAME_OVER). + float continue_music_speed{1.5F}; + + // Pista de música que sona durant l'estat GAME_OVER (sense loop). + // Si la pista no està carregada al Resource::Cache, s'omet la + // reproducció i la fase manté els timings configurats. La durada + // de la pista determina implícitament `game_over_text_hold_ms` + // (vegeu `GameScene::setGameOverState`). + std::string game_over_music_track{"game_over.ogg"}; + + // So que sona cada vegada que apareix un nou número del + // countdown (al primer cop que es mostra el `start`, cada + // canvi de número, i quan apareix el 0). NO sona en la + // transició posterior cap a GAME_OVER. Buit = sense so. + std::string countdown_sound_key{"countdown.wav"}; }; // Llegeix la configuració des del YAML. Si el fitxer manca o falta diff --git a/source/game/scenes/game_scene.cpp b/source/game/scenes/game_scene.cpp index a8317a5..092ba2c 100644 --- a/source/game/scenes/game_scene.cpp +++ b/source/game/scenes/game_scene.cpp @@ -506,6 +506,8 @@ GameScene::GameScene(Config config) // pròpia (`game_over:`). game_over_config_ = GameOverFsm::loadConfig(Defaults::GameScene::GAME_YAML); + preloadGameOverAssets(); + // Cinemàtica d'entrada de la primera sala: arrenca la pista // `room_intro.ogg` i arma el callback de fi que farà spawn + salt // a PLAYING. Cal cridar `enterRoomIntro` ací (i no només des @@ -514,7 +516,18 @@ GameScene::GameScene(Config config) enterRoomIntro(); } -GameScene::~GameScene() = default; +GameScene::~GameScene() { + // Aturem qualsevol música que estigués sonant al sortir de la + // GameScene. Això cobreix tres camins: (a) transició natural a + // LOGO al final del game over (l'única audio activa pot ser la + // pista `game_over.ogg`, que en aquell moment ja s'ha drenat); + // (b) tancament directe via service menu o ALT+F4; (c) qualsevol + // futura sortida no-natural. La LogoScene té la seva pròpia + // música i no s'ha de mesclar amb la del joc. + if (auto* audio = Audio::get(); audio != nullptr) { + audio->stopMusic(); + } +} auto GameScene::computeSpawn() -> PlayerSpawn { // Centre de la columna del passadís en píxels canvas. La caixa de @@ -711,6 +724,19 @@ void GameScene::onPlayerDisabled(int player_id) { players_active_[player_id] = false; } +void GameScene::preloadGameOverAssets() const { + // Pre-load del so del countdown: el dispara `updateGameOverFlow` + // cada vegada que canvia el número visible de CONTINUE? (incloent + // l'aparició del 0 — però NO la transició a GAME_OVER). Sense + // pre-load, la primera reproducció faria disc amb el countdown ja + // en marxa. + const auto& key = game_over_config_.countdown_sound_key; + if (key.empty()) { return; } + Resource::Cache::get().loadSound( + key, + std::string{Defaults::Paths::AUDIO_SOUNDS_DIR} + key); +} + void GameScene::handleJoinInput() { // El "join in progress" es processa durant PLAYING (regla 1) i, // com a cas especial, durant CONTINUE_PROMPT — ahí un START reviu @@ -1112,9 +1138,62 @@ void GameScene::drawRoomTextLine(const std::string& text, int x, int y, std::uin void GameScene::setGameOverState(GameOverFsm::State new_state) { if (new_state == game_over_state_) { return; } - Log::info("GAMEOVER", "{} -> {}", GameOverFsm::stateName(game_over_state_), GameOverFsm::stateName(new_state)); + const auto PREV = game_over_state_; + Log::info("GAMEOVER", "{} -> {}", GameOverFsm::stateName(PREV), GameOverFsm::stateName(new_state)); game_over_state_ = new_state; game_over_transition_ = {}; + + auto* audio = Audio::get(); + + // Sortida de CONTINUE_PROMPT cap a OFF (revive): reinici de la + // música de joc des del principi a velocitat normal. Reaprofitem + // el track gravat a `config_.music_track` (sempre `playing.ogg` + // amb loop infinit). Si la sortida és cap a GAME_OVER, la branca + // de més avall ja talla la música i posa `game_over.ogg` — aquí + // saltem perquè el stop+play seria redundant. + if (PREV == GameOverFsm::State::CONTINUE_PROMPT && new_state == GameOverFsm::State::OFF && audio != nullptr) { + audio->stopMusic(); + audio->playMusic(config_.music_track, -1); + audio->setMusicSpeed(1.0F); + } + + if (new_state == GameOverFsm::State::CONTINUE_PROMPT && audio != nullptr) { + // Acceleració arcade: stop+play perquè la pista arrenqui des + // del principi al ritme accelerat (sense aquest reinici, el + // canvi de velocitat sobre la posició actual queda poc + // perceptible amb ratios subtils com 1.05). El to també puja: + // és l'efecte clàssic dels comptes enrere. + audio->stopMusic(); + audio->playMusic(config_.music_track, -1); + audio->setMusicSpeed(game_over_config_.continue_music_speed); + } + + // Reset del tracker del so del countdown cada vegada que entrem + // a CONTINUE_PROMPT, perquè la primera aparició del valor inicial + // (`continue_count_start`) dispari el "tick". Fora de + // CONTINUE_PROMPT no s'usa. + if (new_state == GameOverFsm::State::CONTINUE_PROMPT) { + last_countdown_value_ = -1; + } + + if (new_state == GameOverFsm::State::GAME_OVER && audio != nullptr) { + // Talla la música actual i arrenca la pista de GAME OVER sense + // loop. La fase de hold es redimensiona a la durada real de la + // pista perquè el text es mantingui visible mentre dura la + // música; l'exit anim, el wait i el fade arrenquen quan la + // música ja s'ha drenat. + audio->stopMusic(); + const auto& track = game_over_config_.game_over_music_track; + if (!track.empty()) { + audio->playMusic(track, 0); + const int DUR_MS = Audio::getMusicDurationMs(track); + if (DUR_MS > 0) { + game_over_config_.game_over_text_hold_ms = DUR_MS; + Log::info("GAMEOVER", "{}: durada {} ms (text_hold sincronitzat)", track, DUR_MS); + } + } + } + if (new_state == GameOverFsm::State::FADE_OUT) { // Arma el fade en el moment que entrem a la fase de fade-out. // Mateix patró que `outro_fade_started_` per a OUTRO de sala. @@ -1151,6 +1230,28 @@ void GameScene::updateGameOverFlow(int delta_ms) { Log::info("GAMEOVER", "DONE -> requesting LOGO scene"); } } + + // Tick del so del countdown: cada vegada que el número visible + // canvia (incloent l'aparició del primer valor i del 0), reproduïm + // el so configurat. La detecció es fa post-`advance` perquè el + // canvi de fase 0 → 1 arribi a aparèixer com a transició -1 → start. + // En la transició cap a GAME_OVER el state ja no és CONTINUE_PROMPT + // i la branca s'omet — així no sona un "tick" extra al saltar. + if (game_over_state_ == GameOverFsm::State::CONTINUE_PROMPT) { + const int CURRENT = GameOverFsm::countdownSecondsRemaining( + game_over_state_, + game_over_transition_, + game_over_config_); + if (game_over_transition_.phase == 1 && CURRENT != last_countdown_value_) { + last_countdown_value_ = CURRENT; + const auto& key = game_over_config_.countdown_sound_key; + if (!key.empty()) { + if (auto* audio = Audio::get(); audio != nullptr) { + audio->playSound(key, Audio::Group::INTERFACE); + } + } + } + } } void GameScene::renderGameOverText() { diff --git a/source/game/scenes/game_scene.hpp b/source/game/scenes/game_scene.hpp index 38f0dde..8cf5341 100644 --- a/source/game/scenes/game_scene.hpp +++ b/source/game/scenes/game_scene.hpp @@ -140,6 +140,12 @@ class GameScene : public Scene { // mètode per acotar la complexitat cognitiva del subscriber/ctor. void onPlayerDisabled(int player_id); + // Pre-load dels recursos d'àudio que s'usen mid-partida i no els + // toca el Director (so del countdown, etc.). Si la clau és buida + // o ja està al cache, és no-op. Extret a mètode per acotar la + // complexitat cognitiva del ctor. + void preloadGameOverAssets() const; + // Itera els slots actius i, si el delay configurat ha expirat des // del callback de fi de música d'INTRO, dispara `triggerPlayerSpawn`. // Cridada cada frame durant la fase d'spawn escalonat (entre el @@ -307,6 +313,12 @@ class GameScene : public Scene { Transitions::FadeToBlack game_over_fade_; bool game_over_fade_started_{false}; + // Últim valor del countdown reproduït amb so. -1 com a sentinel + // perquè la primera detecció del valor inicial (`continue_count_start`) + // dispari el "tick". Es reseteja a -1 cada vegada que entrem a + // CONTINUE_PROMPT (vegeu `setGameOverState`). + int last_countdown_value_{-1}; + // Avança la sub-FSM de game over consumint `delta_ms`. Detecta la // transició de "tots els jugadors fora de partida" durant PLAYING // (entrada a CONTINUE_PROMPT), arma el fade de FADE_OUT i, en diff --git a/source/utils/defaults.hpp b/source/utils/defaults.hpp index fd80dac..d5c4c80 100644 --- a/source/utils/defaults.hpp +++ b/source/utils/defaults.hpp @@ -508,6 +508,7 @@ namespace Defaults { constexpr const char* MUSIC_PLAYING = "data/audio/music/playing.ogg"; constexpr const char* MUSIC_ROOM_INTRO = "data/audio/music/room_intro.ogg"; constexpr const char* MUSIC_ROOM_OUTRO = "data/audio/music/room_outro.ogg"; + constexpr const char* MUSIC_GAME_OVER = "data/audio/music/game_over.ogg"; // Gràfics de logo / title pre-carregats pel Director. constexpr const char* LOGO_MINI_GIF = "data/scenes/logo/logo_jailgames_mini.gif";