added support for separate sound and music for info sub-screens
authorHolger Schemel <info@artsoft.org>
Sat, 17 Dec 2022 12:47:59 +0000 (13:47 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 17 Dec 2022 12:47:59 +0000 (13:47 +0100)
build-scripts/create_element_defs.pl
src/conf_mus.c
src/conf_snd.c
src/libgame/sound.c
src/libgame/sound.h
src/screens.c

index 84d9bc6c6ad14289d5d5476eb1a66b048e2f5a76..b75d86ac79c6752c99a3068df90604f530f9a6c4 100755 (executable)
@@ -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";
index d11a5bff1b4a402e5a7f9e545547fbbcaadac3b3..864cbc908018c556d4ad21a74fb182c4b2fbf92b 100644 (file)
@@ -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              },
index eacaf778e52e2fff8bdc97946fdf0970fae12917..e772e3cca83a6ebb7df04461c350f98cbf1317cd 100644 (file)
@@ -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              },
index 21c21fddeebb8e0aba8fa20366e16e20251e9611..6ca95ea47de709bce3727f24bed5315fe753550c 100644 (file)
@@ -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);
index 1cdf72dc3109aa6c5cd7a810ee3e4197133bb062..9f6c754c0e37f2d04e5bd1a71d12c718fc558204 100644 (file)
@@ -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);
index ab3607cf7cc0142fdd7fb592da89beaac7b98e67..bf495c1586ede1346c618dfd2c205cd6dca0ac6d 100644 (file)
@@ -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)