From b8c4745f91cc4b85243de0cd9394b49e8cb3506e Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Wed, 11 May 2016 00:11:21 +0200 Subject: [PATCH] added music support for global animations --- src/anim.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++-------- src/init.c | 66 +++++++++++++++++++++++++++++++++++++++++++++----- src/main.h | 3 ++- 3 files changed, 122 insertions(+), 17 deletions(-) diff --git a/src/anim.c b/src/anim.c index fd6898ea..9097d88c 100644 --- a/src/anim.c +++ b/src/anim.c @@ -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; diff --git a/src/init.c b/src/init.c index 79343297..61d4d5c3 100644 --- a/src/init.c +++ b/src/init.c @@ -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() diff --git a/src/main.h b/src/main.h index 2478a9d0..b59cb950 100644 --- a/src/main.h +++ b/src/main.h @@ -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 -- 2.34.1