int mode_nr;
int sound;
+ int music;
int graphic;
struct GraphicInfo graphic_info;
{
struct GlobalAnimPartControlInfo *part = &anim->part[part_nr];
int sound = SND_UNDEFINED;
+ int music = MUS_UNDEFINED;
int graphic = IMG_TOON_1 + i;
int control = graphic;
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];
{
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;
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];
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];
return changed;
}
-void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
+static void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
{
int sound = part->sound;
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;
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;
part->step_yoffset = c->step_yoffset;
if (part->init_delay_counter == 0)
- PlayGlobalAnimSound(part);
+ PlayGlobalAnimSoundAndMusic(part);
}
if (part->init_delay_counter > 0)
part->init_delay_counter--;
if (part->init_delay_counter == 0)
- PlayGlobalAnimSound(part);
+ PlayGlobalAnimSoundAndMusic(part);
return ANIM_STATE_WAITING;
}
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));
if (part->anim_delay_counter == 0)
{
- StopGlobalAnimSound(part);
+ StopGlobalAnimSoundAndMusic(part);
part->post_delay_counter =
(c->post_delay_fixed + GetSimpleRandom(c->post_delay_random));
int i;
for (i = 0; i < num_parts; i++)
- StopGlobalAnimSound(&anim->part[i]);
+ StopGlobalAnimSoundAndMusic(&anim->part[i]);
}
return;
#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();
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)
{
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)
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];
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;
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()
/* 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