added music support for global animations
authorHolger Schemel <info@artsoft.org>
Tue, 10 May 2016 22:11:21 +0000 (00:11 +0200)
committerHolger Schemel <info@artsoft.org>
Tue, 10 May 2016 22:11:21 +0000 (00:11 +0200)
src/anim.c
src/init.c
src/main.h

index fd6898eadf3fdce4ed53d13df18f7c72ad64e43b..9097d88cb9f3600a1988365386315449c9917e48 100644 (file)
@@ -68,6 +68,7 @@ struct GlobalAnimPartControlInfo
   int mode_nr;
 
   int sound;
+  int music;
   int graphic;
 
   struct GraphicInfo graphic_info;
@@ -329,6 +330,7 @@ static void InitToonControls()
   {
     struct GlobalAnimPartControlInfo *part = &anim->part[part_nr];
     int sound = SND_UNDEFINED;
+    int music = MUS_UNDEFINED;
     int graphic = IMG_TOON_1 + i;
     int control = graphic;
 
@@ -336,6 +338,7 @@ static void InitToonControls()
     part->anim_nr = anim_nr;
     part->mode_nr = mode_nr;
     part->sound = sound;
+    part->music = music;
     part->graphic = graphic;
     part->graphic_info = graphic_info[graphic];
     part->control_info = graphic_info[control];
@@ -367,7 +370,7 @@ void InitGlobalAnimControls()
 {
   int i, m, a, p;
   int mode_nr, anim_nr, part_nr;
-  int sound, graphic, control;
+  int sound, music, graphic, control;
 
   anim_sync_frame = 0;
 
@@ -414,6 +417,7 @@ void InitGlobalAnimControls()
        struct GlobalAnimPartControlInfo *part = &anim->part[part_nr];
 
        sound   = global_anim_info[a].sound[p][m];
+       music   = global_anim_info[a].music[p][m];
        graphic = global_anim_info[a].graphic[p][m];
        control = global_anim_info[ctrl_id].graphic[p][m];
 
@@ -435,6 +439,7 @@ void InitGlobalAnimControls()
        part->anim_nr = anim_nr;
        part->mode_nr = mode_nr;
        part->sound = sound;
+       part->music = music;
        part->graphic = graphic;
        part->graphic_info = graphic_info[graphic];
        part->control_info = graphic_info[control];
@@ -730,7 +735,7 @@ boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part)
   return changed;
 }
 
-void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
+static void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
 {
   int sound = part->sound;
 
@@ -748,12 +753,12 @@ void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
     PlaySound(sound);
 
 #if 0
-  printf("::: PLAY %d.%d.%d: %d\n",
+  printf("::: PLAY SOUND %d.%d.%d: %d\n",
         part->anim_nr, part->nr, part->mode_nr, sound);
 #endif
 }
 
-void StopGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
+static void StopGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
 {
   int sound = part->sound;
 
@@ -763,11 +768,56 @@ void StopGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
   StopSound(sound);
 
 #if 0
-  printf("::: STOP %d.%d.%d: %d\n",
+  printf("::: STOP SOUND %d.%d.%d: %d\n",
         part->anim_nr, part->nr, part->mode_nr, sound);
 #endif
 }
 
+static void PlayGlobalAnimMusic(struct GlobalAnimPartControlInfo *part)
+{
+  int music = part->music;
+
+  if (music == MUS_UNDEFINED)
+    return;
+
+  if (!setup.sound_music)
+    return;
+
+  PlayMusic(music);
+
+#if 0
+  printf("::: PLAY MUSIC %d.%d.%d: %d\n",
+        part->anim_nr, part->nr, part->mode_nr, music);
+#endif
+}
+
+static void StopGlobalAnimMusic(struct GlobalAnimPartControlInfo *part)
+{
+  int music = part->music;
+
+  if (music == MUS_UNDEFINED)
+    return;
+
+  StopMusic();
+
+#if 0
+  printf("::: STOP MUSIC %d.%d.%d: %d\n",
+        part->anim_nr, part->nr, part->mode_nr, music);
+#endif
+}
+
+static void PlayGlobalAnimSoundAndMusic(struct GlobalAnimPartControlInfo *part)
+{
+  PlayGlobalAnimSound(part);
+  PlayGlobalAnimMusic(part);
+}
+
+static void StopGlobalAnimSoundAndMusic(struct GlobalAnimPartControlInfo *part)
+{
+  StopGlobalAnimSound(part);
+  StopGlobalAnimMusic(part);
+}
+
 int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
 {
   struct GraphicInfo *g = &part->graphic_info;
@@ -864,7 +914,7 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
       part->step_yoffset = c->step_yoffset;
 
     if (part->init_delay_counter == 0)
-      PlayGlobalAnimSound(part);
+      PlayGlobalAnimSoundAndMusic(part);
   }
 
   if (part->init_delay_counter > 0)
@@ -872,7 +922,7 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
     part->init_delay_counter--;
 
     if (part->init_delay_counter == 0)
-      PlayGlobalAnimSound(part);
+      PlayGlobalAnimSoundAndMusic(part);
 
     return ANIM_STATE_WAITING;
   }
@@ -887,7 +937,7 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
     if (part->anim_delay_counter == 0 &&
        part->post_delay_counter == 0)
     {
-      StopGlobalAnimSound(part);
+      StopGlobalAnimSoundAndMusic(part);
 
       part->post_delay_counter =
        (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random));
@@ -906,7 +956,7 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state)
 
     if (part->anim_delay_counter == 0)
     {
-      StopGlobalAnimSound(part);
+      StopGlobalAnimSoundAndMusic(part);
 
       part->post_delay_counter =
        (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random));
@@ -1001,7 +1051,7 @@ void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim, int action)
        int i;
 
        for (i = 0; i < num_parts; i++)
-         StopGlobalAnimSound(&anim->part[i]);
+         StopGlobalAnimSoundAndMusic(&anim->part[i]);
       }
 
       return;
index 79343297c96a30bc423943d940e2e2b2901cdb90..61d4d5c35cb7768204e8fd199dc3b780fa726b19 100644 (file)
@@ -654,6 +654,55 @@ void InitGlobalAnimSoundInfo()
 #endif
 }
 
+void InitGlobalAnimMusicInfo()
+{
+  struct PropertyMapping *property_mapping = getMusicListPropertyMapping();
+  int num_property_mappings = getMusicListPropertyMappingSize();
+  int i, j, k;
+
+  /* always start with reliable default values (no global animation music) */
+  for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+      for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+       global_anim_info[i].music[j][k] = MUS_UNDEFINED;
+
+  /* initialize global animation music definitions from dynamic configuration */
+  for (i = 0; i < num_property_mappings; i++)
+  {
+    int anim_nr = property_mapping[i].base_index - NUM_MUSIC_PREFIXES;
+    int part_nr = property_mapping[i].ext1_index - ACTION_PART_1;
+    int special = property_mapping[i].ext2_index;
+    int music   = property_mapping[i].artwork_index;
+
+    // music uses control definition; map it to position of graphic (artwork)
+    anim_nr -= GLOBAL_ANIM_ID_CONTROL_FIRST;
+
+    if (anim_nr < 0 || anim_nr >= NUM_GLOBAL_ANIM_TOKENS)
+      continue;
+
+    /* set animation part to base part, if not specified */
+    if (!IS_GLOBAL_ANIM_PART(part_nr))
+      part_nr = GLOBAL_ANIM_ID_PART_BASE;
+
+    /* set animation screen to default, if not specified */
+    if (!IS_SPECIAL_GFX_ARG(special))
+      special = GFX_SPECIAL_ARG_DEFAULT;
+
+    global_anim_info[anim_nr].music[part_nr][special] = music;
+  }
+
+#if 0
+  printf("::: InitGlobalAnimMusicInfo\n");
+
+  for (i = 0; i < NUM_GLOBAL_ANIMS; i++)
+    for (j = 0; j < NUM_GLOBAL_ANIM_PARTS_ALL; j++)
+      for (k = 0; k < NUM_SPECIAL_GFX_ARGS; k++)
+       if (global_anim_info[i].music[j][k] != MUS_UNDEFINED)
+         printf("::: - anim %d, part %d, mode %d => %d\n",
+                i, j, k, global_anim_info[i].music[j][k]);
+#endif
+}
+
 void InitElementGraphicInfo()
 {
   struct PropertyMapping *property_mapping = getImageListPropertyMapping();
@@ -1991,8 +2040,8 @@ static void InitGameModeMusicInfo()
   for (i = 0; i < num_property_mappings; i++)
   {
     int prefix   = property_mapping[i].base_index;
-    int gamemode = property_mapping[i].ext1_index;
-    int level    = property_mapping[i].ext2_index;
+    int gamemode = property_mapping[i].ext2_index;
+    int level    = property_mapping[i].ext3_index;
     int music    = property_mapping[i].artwork_index;
 
     if (prefix < 0 || prefix >= NUM_MUSIC_PREFIXES)
@@ -2141,6 +2190,7 @@ static void ReinitializeMusic()
 {
   InitMusicInfo();             /* music properties mapping */
   InitGameModeMusicInfo();     /* game mode music mapping */
+  InitGlobalAnimMusicInfo();   /* global animation music settings */
 }
 
 static int get_special_property_bit(int element, int property_bit_nr)
@@ -4989,7 +5039,8 @@ static void InitArtworkConfig()
                               NUM_GLOBAL_ANIM_TOKENS + 1];
   static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS +
                               NUM_GLOBAL_ANIM_TOKENS + 1];
-  static char *music_id_prefix[NUM_MUSIC_PREFIXES + 1];
+  static char *music_id_prefix[NUM_MUSIC_PREFIXES +
+                              NUM_GLOBAL_ANIM_TOKENS + 1];
   static char *action_id_suffix[NUM_ACTIONS + 1];
   static char *direction_id_suffix[NUM_DIRECTIONS_FULL + 1];
   static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1];
@@ -5065,7 +5116,10 @@ static void InitArtworkConfig()
 
   for (i = 0; i < NUM_MUSIC_PREFIXES; i++)
     music_id_prefix[i] = music_prefix_info[i].prefix;
-  music_id_prefix[NUM_MUSIC_PREFIXES] = NULL;
+  for (i = 0; i < NUM_GLOBAL_ANIM_TOKENS; i++)
+    music_id_prefix[NUM_MUSIC_PREFIXES + i] =
+      global_anim_info[i].token_name;
+  music_id_prefix[NUM_MUSIC_PREFIXES + NUM_GLOBAL_ANIM_TOKENS] = NULL;
 
   for (i = 0; i < NUM_ACTIONS; i++)
     action_id_suffix[i] = element_action_info[i].suffix;
@@ -5090,8 +5144,8 @@ static void InitArtworkConfig()
                sound_id_prefix, action_id_suffix, dummy,
                special_id_suffix, ignore_sound_tokens);
   InitMusicList(music_config, NUM_MUSIC_FILES, music_config_suffix,
-               music_id_prefix, special_id_suffix, level_id_suffix,
-               dummy, ignore_music_tokens);
+               music_id_prefix, action_id_suffix, special_id_suffix,
+               level_id_suffix, ignore_music_tokens);
 }
 
 static void InitMixer()
index 2478a9d06ed30f8b67cd565a7d4c3612992eab22..b59cb950660847385c93e4c92fb4fca105f3966f 100644 (file)
@@ -2825,8 +2825,9 @@ struct GlobalAnimInfo
   /* global animation graphic and control definitions */
   int graphic[NUM_GLOBAL_ANIM_PARTS_ALL][NUM_SPECIAL_GFX_ARGS];
 
-  /* global animation sound definitions */
+  /* global animation sound and music definitions */
   int sound[NUM_GLOBAL_ANIM_PARTS_ALL][NUM_SPECIAL_GFX_ARGS];
+  int music[NUM_GLOBAL_ANIM_PARTS_ALL][NUM_SPECIAL_GFX_ARGS];
 };
 
 struct GraphicInfo