From 34ec886d3428465d5388f441ef4e20439757c22e Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 20 Mar 2024 19:46:10 +0000 Subject: [PATCH 1/5] (WIP) Play Title music after credits track ends For some reason I_GetSongLength is not reliable here, and try to accomodate fastforward... --- src/f_finale.c | 13 ++++++++++++- src/k_credits.cpp | 21 ++++++++++++++++++++- src/k_credits.h | 2 ++ src/music.cpp | 2 -- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/f_finale.c b/src/f_finale.c index 15c863b9e..eb2782538 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -982,6 +982,7 @@ UINT16 finaleemeralds = 0; void F_StartGameEvaluation(void) { + Music_SetFadeOut("credits", 250); Music_DelayEnd("credits", TICRATE/4); Music_Tick(); // it needs to fade out right now @@ -1327,6 +1328,7 @@ void F_GameEvaluationTicker(void) { if (finalecount == 1) { + Music_Stop("credits"); // sitting on that distant _shore Music_Remap("shore", "_SHORE"); Music_Play("shore"); @@ -1336,6 +1338,7 @@ void F_GameEvaluationTicker(void) { if (finalecount == TICRATE/2) { + Music_Stop("credits"); // _drift across open waters Music_Remap("shore", "_DRIFT"); Music_Play("shore"); @@ -2075,7 +2078,15 @@ void F_AttractDemoTicker(void) { keypressed = false; - if (attractcountdown > 0 && !g_fast_forward) + if (g_fast_forward) + return; + + if (demo.attract == DEMO_ATTRACT_CREDITS) + { + F_ConsiderCreditsMusicUpdate(); + } + + if (attractcountdown > 0) { if (attractcredit) { diff --git a/src/k_credits.cpp b/src/k_credits.cpp index 039dbf21d..a1ba8c92f 100644 --- a/src/k_credits.cpp +++ b/src/k_credits.cpp @@ -33,6 +33,7 @@ #include "w_wad.h" #include "z_zone.h" #include "i_system.h" +#include "i_sound.h" #include "i_joy.h" #include "i_threads.h" #include "dehacked.h" @@ -371,6 +372,21 @@ static void F_InitCreditsSlide(void) CON_ClearHUD(); } +static void F_NewCreditsMusic(const char *trackname, bool looping) +{ + Music_Remap("credits", trackname); + Music_Loop("credits", looping); + Music_Play("credits"); +} + +void F_ConsiderCreditsMusicUpdate(void) +{ + if (!Music_CanLoop("credits") && I_GetSongLength() == I_GetSongPosition()) + { + F_NewCreditsMusic("_title", true); + } +} + void F_StartCredits(void) { G_SetGamestate(GS_CREDITS); @@ -391,7 +407,8 @@ void F_StartCredits(void) Music_StopAll(); S_StopSounds(); - Music_Play("credits"); + Music_SetFadeOut("credits", 0); + F_NewCreditsMusic("_creds", false); F_CreditsReset(); @@ -809,6 +826,8 @@ void F_CreditTicker(void) { g_credits.havent_ticked = false; + F_ConsiderCreditsMusicUpdate(); + g_credits.transition_prev = g_credits.transition; g_credits.scroll_timer_prev = g_credits.scroll_timer; diff --git a/src/k_credits.h b/src/k_credits.h index 6711af378..c2836f07d 100644 --- a/src/k_credits.h +++ b/src/k_credits.h @@ -32,6 +32,8 @@ void F_TickCreditsDemoExit(void); INT32 F_CreditsDemoExitFade(void); +void F_ConsiderCreditsMusicUpdate(void); + void F_CreditTicker(void); void F_CreditDrawer(void); diff --git a/src/music.cpp b/src/music.cpp index 16109c6aa..5a8261459 100644 --- a/src/music.cpp +++ b/src/music.cpp @@ -168,8 +168,6 @@ void Music_Init(void) tune.priority = 100; tune.song = "_creds"; - tune.fade_out = 250; - tune.loop = false; tune.credit = true; } From a8851e96dc799fb8f52f0ca98f22a2318ba1f4db Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 22 Mar 2024 18:40:27 +0000 Subject: [PATCH 2/5] Fix x offset of Kart Krew Dev logo in credits, too --- src/k_credits.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_credits.cpp b/src/k_credits.cpp index a1ba8c92f..65a916028 100644 --- a/src/k_credits.cpp +++ b/src/k_credits.cpp @@ -1125,7 +1125,7 @@ static void F_DrawCreditsKartKrew(void) ); V_DrawFixedPatch( - 116 * FRACUNIT, 70 * FRACUNIT, + 111 * FRACUNIT, 70 * FRACUNIT, FRACUNIT / 2, 0, static_cast(W_CachePatchName( "KKLOGO_C", @@ -1135,7 +1135,7 @@ static void F_DrawCreditsKartKrew(void) ); V_DrawFixedPatch( - 116 * FRACUNIT, 70 * FRACUNIT, + 111 * FRACUNIT, 70 * FRACUNIT, FRACUNIT / 2, 0, static_cast(W_CachePatchName( "KKTEXT_C", From a4f2712d8a1fb2a875e05a5a66beaed2d68ceb72 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 23 Mar 2024 06:03:03 -0700 Subject: [PATCH 3/5] WIP - credits audio/wipe fixes, document this later --- src/d_main.cpp | 8 +++++++- src/f_finale.c | 18 ++++++++++++++++-- src/f_finale.h | 2 ++ src/k_credits.cpp | 25 +++++++++++++++++++++++++ src/k_credits.h | 2 ++ src/p_setup.cpp | 8 ++++++-- src/s_sound.c | 4 ++-- 7 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 7dcf0a7b8..51183db0c 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -427,6 +427,9 @@ static bool D_Display(void) { // Fade to black first if (G_GamestateUsesLevel() == false // fades to black on its own timing, always + // Wipe between credits slides. + // But not back from attract demo, since F_CreditsDemoExitFade exists. + && (gamestate != GS_CREDITS || wipegamestate != GS_LEVEL) && wipetypepre != UINT8_MAX) { F_WipeStartScreen(); @@ -1120,8 +1123,11 @@ void D_ClearState(void) if (rendermode != render_none) V_SetPaletteLump("PLAYPAL"); - S_StopMusicCredit(); + if (!Music_Playing("credits")) + S_StopMusicCredit(); + S_StopSounds(); + S_SetSfxVolume(); // reset sound volume if (gamedata && gamedata->deferredsave) G_SaveGameData(); diff --git a/src/f_finale.c b/src/f_finale.c index eb2782538..be404b80e 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -49,6 +49,7 @@ #include "k_grandprix.h" #include "music.h" #include "k_credits.h" +#include "i_sound.h" // Stage of animation: // 0 = text, 1 = art screen @@ -1858,6 +1859,13 @@ luahook: M_DrawMenuMessage(); } +void F_PlayTitleScreenMusic(void) +{ + Music_Loop("title", looptitle); + Music_Seek("title", 38749); // kick in + Music_Play("title"); +} + // (no longer) De-Demo'd Title Screen void F_TitleScreenTicker(boolean run) { @@ -1874,8 +1882,7 @@ void F_TitleScreenTicker(boolean run) else if (!Music_Playing("title")) { // Now start the music - Music_Loop("title", looptitle); - Music_Play("title"); + F_PlayTitleScreenMusic(); } } else if (menumessage.active) @@ -2094,6 +2101,13 @@ void F_AttractDemoTicker(void) attractcredit = false; } + INT32 val = F_AttractDemoExitFade(); + if (val >= 0) + { + // Fade down sounds with screen fade + I_SetSfxVolume(cv_soundvolume.value * (31 - val) / 31); + } + if (attractcountdown > 0 && !--attractcountdown) { // Fade will be handled without a wipe (see F_AttractDemoExitFade) diff --git a/src/f_finale.h b/src/f_finale.h index 6caf0bd4b..acd195659 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -71,6 +71,8 @@ void F_StartIntro(void); void F_StartTitleScreen(void); void F_StartEnding(void); +void F_PlayTitleScreenMusic(void); + extern INT32 finalecount; extern INT32 titlescrollxspeed; extern INT32 titlescrollyspeed; diff --git a/src/k_credits.cpp b/src/k_credits.cpp index 65a916028..dc0a6eb3a 100644 --- a/src/k_credits.cpp +++ b/src/k_credits.cpp @@ -79,6 +79,7 @@ struct credits_slide_s std::vector strings; size_t strings_height; boolean play_demo_afterwards; + int fade_out_music; }; static std::vector g_credits_slides; @@ -233,6 +234,7 @@ void F_LoadCreditsDefinitions(void) } slide.play_demo_afterwards = slide_obj.value("demo", false); + slide.fade_out_music = slide_obj.value("fade_out_music", 0); g_credits_slides.push_back( slide ); } @@ -367,6 +369,10 @@ static void F_InitCreditsSlide(void) } } #endif + else if (slide->type == CRED_TYPE_KARTKREW) + { + + } // Clear the console hud just to avoid anything getting in the way. CON_ClearHUD(); @@ -449,6 +455,9 @@ void F_ContinueCredits(void) F_CreditsReset(); demo.attract = DEMO_ATTRACT_OFF; + // Do not wipe back to credits, since F_CreditsDemoExitFade exists. + wipegamestate = GS_LEVEL; + // Returning from playing a demo. // Go to the next slide. F_CreditsNextSlide(); @@ -559,6 +568,12 @@ void F_TickCreditsDemoExit(void) g_credits.demo_exit = std::max(g_credits.demo_exit, kDemoExitTicCount - 64); } + if (INT32 val = F_CreditsDemoExitFade(); val >= 0) + { + // Fade down sounds with screen fade + I_SetSfxVolume(cv_soundvolume.value * (31 - val) / 31); + } + if (g_credits.demo_exit > kDemoExitTicCount) { G_CheckDemoStatus(); @@ -811,6 +826,11 @@ static void F_HandleCreditsTick(void) } else if (finalize_slide) { + if (slide->fade_out_music) + { + I_FadeSong(0, slide->fade_out_music, nullptr); + } + if (g_credits.current_slide >= g_credits_slides.size() - 1) { g_credits.finish_counter = 5 * TICRATE; @@ -1205,3 +1225,8 @@ void F_CreditDrawer(void) star.y += FixedMul(star.vel_y, renderdeltatics); } } + +boolean F_CreditsRunning(void) +{ + return gamestate == GS_CREDITS || demo.attract == DEMO_ATTRACT_CREDITS; +} diff --git a/src/k_credits.h b/src/k_credits.h index c2836f07d..165e0e608 100644 --- a/src/k_credits.h +++ b/src/k_credits.h @@ -38,6 +38,8 @@ void F_CreditTicker(void); void F_CreditDrawer(void); +boolean F_CreditsRunning(void); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 5e472be84..0421bc664 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -116,6 +116,7 @@ #include "k_dialogue.h" #include "k_hud.h" // K_ClearPersistentMessages #include "k_endcam.h" +#include "k_credits.h" // Replay names have time #if !defined (UNDER_CE) @@ -7651,8 +7652,11 @@ static void P_InitLevelSettings(void) g_quakes = NULL; // song credit init - S_StopMusicCredit(); - cursongcredit.trans = NUMTRANSMAPS; + if (!Music_Playing("credits")) + { + S_StopMusicCredit(); + cursongcredit.trans = NUMTRANSMAPS; + } for (i = 0; i < MAXPLAYERS; i++) { diff --git a/src/s_sound.c b/src/s_sound.c index 7a10b4926..b60e1ddf1 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -38,6 +38,7 @@ #include "v_video.h" // V_ThinStringWidth #include "music.h" #include "y_inter.h" // Y_PlayIntermissionMusic +#include "f_finale.h" // F_PlayTitleScreenMusic extern consvar_t cv_mastervolume; @@ -1224,8 +1225,7 @@ void S_AttemptToRestoreMusic(void) Music_Play("level"); break; case GS_TITLESCREEN: - Music_Loop("title", looptitle); - Music_Play("title"); + F_PlayTitleScreenMusic(); break; case GS_MENU: M_PlayMenuJam(); From 93b08c8512081495cf03fb9e96c1813a3f9f42e9 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 23 Mar 2024 17:34:47 +0000 Subject: [PATCH 4/5] Dehardcode "titlemusicstart" (position in O__TITLE the titlescreen starts on) --- src/deh_soc.c | 5 +++++ src/f_finale.c | 3 ++- src/f_finale.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/deh_soc.c b/src/deh_soc.c index 047a396af..9e39a0688 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3659,6 +3659,11 @@ void readmaincfg(MYFILE *f, boolean mainfile) titlescrollyspeed = get_number(word2); titlechanged = true; } + else if (fastcmp(word, "TITLESMUSICSTART")) + { + titlemusicstart = (UINT32)get_number(word2); + titlechanged = true; + } else if (fastcmp(word, "NUMDEMOS")) { numDemos = (UINT8)get_number(word2); diff --git a/src/f_finale.c b/src/f_finale.c index be404b80e..7efa7de39 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -56,6 +56,7 @@ INT32 finalecount; INT32 titlescrollxspeed = 16; INT32 titlescrollyspeed = 0; +UINT32 titlemusicstart = 38749; boolean titlemapinaction = false; static INT32 timetonext; // Delay between screen changes @@ -1862,7 +1863,7 @@ luahook: void F_PlayTitleScreenMusic(void) { Music_Loop("title", looptitle); - Music_Seek("title", 38749); // kick in + Music_Seek("title", titlemusicstart); // kick in Music_Play("title"); } diff --git a/src/f_finale.h b/src/f_finale.h index acd195659..25da6c384 100644 --- a/src/f_finale.h +++ b/src/f_finale.h @@ -76,6 +76,7 @@ void F_PlayTitleScreenMusic(void); extern INT32 finalecount; extern INT32 titlescrollxspeed; extern INT32 titlescrollyspeed; +extern UINT32 titlemusicstart; typedef enum { From e99951d0ebcfb837b918902d39e59e8108a72936 Mon Sep 17 00:00:00 2001 From: James R Date: Sat, 23 Mar 2024 16:21:18 -0700 Subject: [PATCH 5/5] Revert "Attract: show music credit on return to title screen" This reverts commit 7a5020470dd6a519ae45d52e6386117e1985ef33. --- src/d_main.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 51183db0c..919673989 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1145,7 +1145,6 @@ static boolean g_deferredtitle = false; // void D_StartTitle(void) { - bool fromAttract = (demo.attract == DEMO_ATTRACT_TITLE); demo.attract = DEMO_ATTRACT_OFF; Music_StopAll(); @@ -1154,10 +1153,6 @@ void D_StartTitle(void) F_StartTitleScreen(); M_ClearMenus(false); g_deferredtitle = false; - - if (fromAttract) - S_ShowMusicCredit(); // Show music credit when returning to the title screen - } void D_SetDeferredStartTitle(boolean deferred)