X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fanim.c;h=3b69da7cd88ff69e3ee3dcf3d7c2f091b38caa93;hb=b6c5148b52b3c52038faef5ad80ef28bc9f623d7;hp=9097d88cb9f3600a1988365386315449c9917e48;hpb=b8c4745f91cc4b85243de0cd9394b49e8cb3506e;p=rocksndiamonds.git diff --git a/src/anim.c b/src/anim.c index 9097d88c..3b69da7c 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 @@ -516,10 +517,21 @@ 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; + + if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1) + DoAnimationExt(); + + // 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); @@ -532,14 +544,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 @@ -554,25 +566,27 @@ 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) - DoAnimationExt(); - for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) { struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[mode_nr]; @@ -667,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)