From 2d3d2776f858d5b2132956373abd1ce5505c1501 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 17 Dec 2022 13:47:59 +0100 Subject: [PATCH] added support for separate sound and music for info sub-screens --- build-scripts/create_element_defs.pl | 10 +++ src/conf_mus.c | 5 ++ src/conf_snd.c | 5 ++ src/libgame/sound.c | 10 +++ src/libgame/sound.h | 1 + src/screens.c | 129 ++++++++++++++++++++++++--- 6 files changed, 147 insertions(+), 13 deletions(-) diff --git a/build-scripts/create_element_defs.pl b/build-scripts/create_element_defs.pl index 84d9bc6c..b75d86ac 100755 --- a/build-scripts/create_element_defs.pl +++ b/build-scripts/create_element_defs.pl @@ -500,6 +500,11 @@ sub print_sounds_list $sound =~ s/^/CLASS_/; # add class identifier } + # dirty hack for making "ABC[DEF]" work as a "special" suffix + $sound =~ s/([^_])\[/$1_/; + $sound =~ s/\[//; + $sound =~ s/\]//; + $sound = "SND_$sound"; my $define_text = "#define $sound"; @@ -558,6 +563,11 @@ sub print_music_list my $music = $_; + # dirty hack for making "ABC[DEF]" work as a "special" suffix + $music =~ s/([^_])\[/$1_/; + $music =~ s/\[//; + $music =~ s/\]//; + $music = "MUS_$music"; my $define_text = "#define $music"; diff --git a/src/conf_mus.c b/src/conf_mus.c index d11a5bff..864cbc90 100644 --- a/src/conf_mus.c +++ b/src/conf_mus.c @@ -36,6 +36,11 @@ struct ConfigInfo music_config[] = { "background.SCORES", UNDEFINED_FILENAME }, { "background.EDITOR", UNDEFINED_FILENAME }, { "background.INFO", "rhythmloop.wav" }, + { "background.INFO[ELEMENTS]", UNDEFINED_FILENAME }, + { "background.INFO[CREDITS]", UNDEFINED_FILENAME }, + { "background.INFO[PROGRAM]", UNDEFINED_FILENAME }, + { "background.INFO[VERSION]", UNDEFINED_FILENAME }, + { "background.INFO[LEVELSET]", UNDEFINED_FILENAME }, { "background.SETUP", UNDEFINED_FILENAME }, { "background.titlescreen_initial_1", UNDEFINED_FILENAME }, diff --git a/src/conf_snd.c b/src/conf_snd.c index eacaf778..e772e3cc 100644 --- a/src/conf_snd.c +++ b/src/conf_snd.c @@ -322,6 +322,11 @@ struct ConfigInfo sound_config[] = { "background.SCORES.mode_loop", "false" }, { "background.EDITOR", UNDEFINED_FILENAME }, { "background.INFO", UNDEFINED_FILENAME }, + { "background.INFO[ELEMENTS]", UNDEFINED_FILENAME }, + { "background.INFO[CREDITS]", UNDEFINED_FILENAME }, + { "background.INFO[PROGRAM]", UNDEFINED_FILENAME }, + { "background.INFO[VERSION]", UNDEFINED_FILENAME }, + { "background.INFO[LEVELSET]", UNDEFINED_FILENAME }, { "background.SETUP", UNDEFINED_FILENAME }, { "background.titlescreen_initial_1", UNDEFINED_FILENAME }, diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 21c21fdd..6ca95ea4 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -741,6 +741,16 @@ static MusicInfo *getMusicInfoEntryFromMusicID(int pos) return mus_info[list_pos]; } +char *getSoundInfoEntryFilename(int pos) +{ + SoundInfo *snd_info = getSoundInfoEntryFromSoundID(pos); + + if (snd_info == NULL) + return NULL; + + return getBaseNamePtr(snd_info->source_filename); +} + char *getMusicInfoEntryFilename(int pos) { MusicInfo *mus_info = getMusicInfoEntryFromMusicID(pos); diff --git a/src/libgame/sound.h b/src/libgame/sound.h index 1cdf72dc..9f6c754c 100644 --- a/src/libgame/sound.h +++ b/src/libgame/sound.h @@ -124,6 +124,7 @@ int getSoundListSize(void); int getMusicListSize(void); struct FileInfo *getSoundListEntry(int); struct FileInfo *getMusicListEntry(int); +char *getSoundInfoEntryFilename(int); char *getMusicInfoEntryFilename(int); char *getCurrentlyPlayingMusicFilename(void); int getSoundListPropertyMappingSize(void); diff --git a/src/screens.c b/src/screens.c index ab3607cf..bf495c15 100644 --- a/src/screens.c +++ b/src/screens.c @@ -329,6 +329,9 @@ static void HandleHallOfFame_SelectLevel(int, int); static char *getHallOfFameRankText(int, int); static char *getHallOfFameScoreText(int, int); static char *getInfoScreenTitle_Generic(void); +static int getInfoScreenBackgroundImage_Generic(void); +static int getInfoScreenBackgroundSound_Generic(void); +static int getInfoScreenBackgroundMusic_Generic(void); static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *); @@ -2481,6 +2484,78 @@ static struct TokenInfo setup_info_input[]; static struct TokenInfo *menu_info; +static void PlayInfoSound(void) +{ + int info_sound = getInfoScreenBackgroundSound_Generic(); + char *next_sound = getSoundInfoEntryFilename(info_sound); + + if (next_sound != NULL) + PlayMenuSoundExt(info_sound); + else + PlayMenuSound(); +} + +static void PlayInfoSoundIfLoop(void) +{ + int info_sound = getInfoScreenBackgroundSound_Generic(); + char *next_sound = getSoundInfoEntryFilename(info_sound); + + if (next_sound != NULL) + PlayMenuSoundIfLoopExt(info_sound); + else + PlayMenuSoundIfLoop(); +} + +static void PlayInfoMusic(void) +{ + int info_music = getInfoScreenBackgroundMusic_Generic(); + char *curr_music = getCurrentlyPlayingMusicFilename(); + char *next_music = getMusicInfoEntryFilename(info_music); + + if (next_music != NULL) + { + // play music if info screen music differs from current music + if (!strEqual(curr_music, next_music)) + PlayMenuMusicExt(info_music); + } + else + { + // only needed if info screen was directly invoked from main menu + PlayMenuMusic(); + } +} + +static void PlayInfoSoundsAndMusic(void) +{ + PlayInfoSound(); + PlayInfoMusic(); +} + +static void FadeInfoSounds(void) +{ + FadeSounds(); +} + +static void FadeInfoMusic(void) +{ + int info_music = getInfoScreenBackgroundMusic_Generic(); + char *curr_music = getCurrentlyPlayingMusicFilename(); + char *next_music = getMusicInfoEntryFilename(info_music); + + if (next_music != NULL) + { + // fade music if info screen music differs from current music + if (!strEqual(curr_music, next_music)) + FadeMusic(); + } +} + +static void FadeInfoSoundsAndMusic(void) +{ + FadeInfoSounds(); + FadeInfoMusic(); +} + static void DrawCursorAndText_Menu_Ext(struct TokenInfo *token_info, int screen_pos, int menu_info_pos_raw, boolean active) @@ -3191,6 +3266,8 @@ static void DrawInfoScreen_Elements(void) { SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS); + FadeInfoSoundsAndMusic(); + FadeOut(REDRAW_FIELD); LoadHelpAnimInfo(); @@ -3198,6 +3275,8 @@ static void DrawInfoScreen_Elements(void) HandleInfoScreen_Elements(0, 0, MB_MENU_INITIALIZE); + PlayInfoSoundsAndMusic(); + FadeIn(REDRAW_FIELD); } @@ -3253,7 +3332,7 @@ void HandleInfoScreen_Elements(int dx, int dy, int button) if (page < 0 || page >= num_pages) { - FadeMenuSoundsAndMusic(); + FadeInfoSoundsAndMusic(); info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -3281,7 +3360,7 @@ void HandleInfoScreen_Elements(int dx, int dy, int button) if (page < num_pages) DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, FALSE); - PlayMenuSoundIfLoop(); + PlayInfoSoundIfLoop(); } } @@ -3498,6 +3577,8 @@ static void DrawInfoScreen_Version(void) SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION); + FadeInfoSoundsAndMusic(); + FadeOut(REDRAW_FIELD); ClearField(); @@ -3635,6 +3716,8 @@ static void DrawInfoScreen_Version(void) DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU); + PlayInfoSoundsAndMusic(); + FadeIn(REDRAW_FIELD); } @@ -3677,14 +3760,37 @@ static char *getInfoScreenTitle_Generic(void) ""); } -static int getInfoScreenBackground_Generic(void) +static int getInfoScreenBackgroundImage_Generic(void) { - return (info_mode == INFO_MODE_CREDITS ? IMG_BACKGROUND_INFO_CREDITS : + return (info_mode == INFO_MODE_ELEMENTS ? IMG_BACKGROUND_INFO_ELEMENTS : + info_mode == INFO_MODE_MUSIC ? IMG_BACKGROUND_INFO_MUSIC : + info_mode == INFO_MODE_CREDITS ? IMG_BACKGROUND_INFO_CREDITS : info_mode == INFO_MODE_PROGRAM ? IMG_BACKGROUND_INFO_PROGRAM : + info_mode == INFO_MODE_VERSION ? IMG_BACKGROUND_INFO_VERSION : info_mode == INFO_MODE_LEVELSET ? IMG_BACKGROUND_INFO_LEVELSET : IMG_BACKGROUND_INFO); } +static int getInfoScreenBackgroundSound_Generic(void) +{ + return (info_mode == INFO_MODE_ELEMENTS ? SND_BACKGROUND_INFO_ELEMENTS : + info_mode == INFO_MODE_CREDITS ? SND_BACKGROUND_INFO_CREDITS : + info_mode == INFO_MODE_PROGRAM ? SND_BACKGROUND_INFO_PROGRAM : + info_mode == INFO_MODE_VERSION ? SND_BACKGROUND_INFO_VERSION : + info_mode == INFO_MODE_LEVELSET ? SND_BACKGROUND_INFO_LEVELSET : + SND_BACKGROUND_INFO); +} + +static int getInfoScreenBackgroundMusic_Generic(void) +{ + return (info_mode == INFO_MODE_ELEMENTS ? MUS_BACKGROUND_INFO_ELEMENTS : + info_mode == INFO_MODE_CREDITS ? MUS_BACKGROUND_INFO_CREDITS : + info_mode == INFO_MODE_PROGRAM ? MUS_BACKGROUND_INFO_PROGRAM : + info_mode == INFO_MODE_VERSION ? MUS_BACKGROUND_INFO_VERSION : + info_mode == INFO_MODE_LEVELSET ? MUS_BACKGROUND_INFO_LEVELSET : + MUS_BACKGROUND_INFO); +} + static char *getInfoScreenFilename_Generic(int nr, boolean global) { return (info_mode == INFO_MODE_CREDITS ? getCreditsFilename(nr, global) : @@ -3768,14 +3874,16 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens, static void DrawInfoScreen_Generic(void) { - SetMainBackgroundImageIfDefined(getInfoScreenBackground_Generic()); + SetMainBackgroundImageIfDefined(getInfoScreenBackgroundImage_Generic()); - FadeMenuSoundsAndMusic(); + FadeInfoSoundsAndMusic(); FadeOut(REDRAW_FIELD); HandleInfoScreen_Generic(0, 0, MB_MENU_INITIALIZE); + PlayInfoSoundsAndMusic(); + FadeIn(REDRAW_FIELD); } @@ -3864,7 +3972,7 @@ void HandleInfoScreen_Generic(int dx, int dy, int button) if (screen_nr < 0 || screen_nr >= num_screens) { - FadeMenuSoundsAndMusic(); + FadeInfoSoundsAndMusic(); info_mode = INFO_MODE_MAIN; DrawInfoScreen(); @@ -3882,7 +3990,7 @@ void HandleInfoScreen_Generic(int dx, int dy, int button) } else { - PlayMenuSoundIfLoop(); + PlayInfoSoundIfLoop(); } } @@ -3904,11 +4012,6 @@ static void DrawInfoScreen(void) DrawInfoScreen_Generic(); else DrawInfoScreen_Main(); - - if (info_mode != INFO_MODE_MAIN && - info_mode != INFO_MODE_TITLE && - info_mode != INFO_MODE_MUSIC) - PlayMenuSoundsAndMusic(); } void DrawInfoScreen_FromMainMenu(int nr) -- 2.34.1