X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fanim.c;h=83d8b17179eb00940cc01104ce5bbdf72bbcf281;hb=b9ba431d402269785dbda83e4a6ee3ce35f2e2fe;hp=fd6898eadf3fdce4ed53d13df18f7c72ad64e43b;hpb=f1f974498c1691431a5755d917f674c7cf56eb53;p=rocksndiamonds.git diff --git a/src/anim.c b/src/anim.c index fd6898ea..83d8b171 100644 --- a/src/anim.c +++ b/src/anim.c @@ -56,9 +56,10 @@ #define ANIM_STATE_RUNNING (1 << 2) /* values for global animation control */ -#define ANIM_START 0 -#define ANIM_CONTINUE 1 -#define ANIM_STOP 2 +#define ANIM_NO_ACTION 0 +#define ANIM_START 1 +#define ANIM_CONTINUE 2 +#define ANIM_STOP 3 struct GlobalAnimPartControlInfo @@ -68,6 +69,7 @@ struct GlobalAnimPartControlInfo int mode_nr; int sound; + int music; int graphic; struct GraphicInfo graphic_info; @@ -329,6 +331,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 +339,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 +371,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 +418,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 +440,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]; @@ -511,10 +517,18 @@ void InitGlobalAnimations() InitGlobalAnimControls(); } -void DrawGlobalAnimationsExt(int drawing_stage) +void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) { + int game_mode_anim_action[NUM_GAME_MODES]; int mode_nr; + if (!setup.toons) + return; + + // always start with reliable default values (no animation actions) + for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) + game_mode_anim_action[mode_nr] = ANIM_NO_ACTION; + if (global.anim_status != anim_status_last) { boolean before_fading = (global.anim_status == GAME_MODE_PSEUDO_FADING); @@ -527,14 +541,14 @@ void DrawGlobalAnimationsExt(int drawing_stage) // (special handling of animations for "current screen" and "all screens") // stop animations for last screen - HandleGlobalAnim(ANIM_STOP, anim_status_last); + game_mode_anim_action[anim_status_last] = ANIM_STOP; // start animations for current screen - HandleGlobalAnim(ANIM_START, global.anim_status); + game_mode_anim_action[global.anim_status] = ANIM_START; // start animations for all screens after loading new artwork set if (anim_status_last == GAME_MODE_LOADING) - HandleGlobalAnim(ANIM_START, GAME_MODE_DEFAULT); + game_mode_anim_action[GAME_MODE_DEFAULT] = ANIM_START; // ---------- part 2 ------------------------------------------------------ // start or stop global animations by change of animation class @@ -549,20 +563,25 @@ void DrawGlobalAnimationsExt(int drawing_stage) // stop animations for changed screen class before fading to new screen if (before_fading && anim_class_last && !anim_class_next) - HandleGlobalAnim(ANIM_STOP, anim_class_game_mode); + game_mode_anim_action[anim_class_game_mode] = ANIM_STOP; // start animations for changed screen class after fading to new screen if (after_fading && !anim_class_last && anim_class_next) - HandleGlobalAnim(ANIM_START, anim_class_game_mode); + game_mode_anim_action[anim_class_game_mode] = ANIM_START; } if (after_fading) anim_classes_last = anim_classes_next; anim_status_last = global.anim_status; + + // start or stop animations determined to be started or stopped above + for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) + if (game_mode_anim_action[mode_nr] != ANIM_NO_ACTION) + HandleGlobalAnim(game_mode_anim_action[mode_nr], mode_nr); } - if (!setup.toons || global.anim_status == GAME_MODE_LOADING) + if (global.anim_status == GAME_MODE_LOADING) return; if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1) @@ -662,9 +681,9 @@ void DrawGlobalAnimationsExt(int drawing_stage) } } -void DrawGlobalAnimations(int drawing_stage) +void DrawGlobalAnimations(int drawing_target, int drawing_stage) { - DrawGlobalAnimationsExt(drawing_stage); + DrawGlobalAnimationsExt(drawing_target, drawing_stage); } boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part) @@ -730,7 +749,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 +767,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 +782,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 +928,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 +936,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 +951,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 +970,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 +1065,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;