X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fanim.c;h=b9ea8becc2a44d2b84ea4e32e8424a95e96a7e87;hp=3b69da7cd88ff69e3ee3dcf3d7c2f091b38caa93;hb=b9cb8d24d6b501098d657ec1715574b2718c02f6;hpb=b6c5148b52b3c52038faef5ad80ef28bc9f623d7 diff --git a/src/anim.c b/src/anim.c index 3b69da7c..b9ea8bec 100644 --- a/src/anim.c +++ b/src/anim.c @@ -184,6 +184,8 @@ static int anim_class_game_modes[NUM_ANIM_CLASSES]; static int anim_status_last = GAME_MODE_DEFAULT; static int anim_classes_last = ANIM_CLASS_NONE; +static boolean drawing_to_fading_buffer = FALSE; + /* ========================================================================= */ /* generic animation frame calculation */ @@ -519,13 +521,17 @@ void InitGlobalAnimations() void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) { + Bitmap *fade_bitmap = + (drawing_target == DRAW_TO_FADE_SOURCE ? gfx.fade_bitmap_source : + drawing_target == DRAW_TO_FADE_TARGET ? gfx.fade_bitmap_target : NULL); int game_mode_anim_action[NUM_GAME_MODES]; int mode_nr; if (!setup.toons) return; - if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1) + if (drawing_stage == DRAW_GLOBAL_ANIM_STAGE_1 && + drawing_target == DRAW_TO_SCREEN) DoAnimationExt(); // always start with reliable default values (no animation actions) @@ -539,6 +545,9 @@ void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) int anim_classes_next = game_mode_anim_classes[global.anim_status_next]; int i; + if (drawing_target == DRAW_TO_FADE_TARGET) + after_fading = TRUE; + // ---------- part 1 ------------------------------------------------------ // start or stop global animations by change of game mode // (special handling of animations for "current screen" and "all screens") @@ -573,15 +582,27 @@ void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) game_mode_anim_action[anim_class_game_mode] = ANIM_START; } - if (after_fading) - anim_classes_last = anim_classes_next; + if (drawing_target == DRAW_TO_SCREEN) + { + if (after_fading) + anim_classes_last = anim_classes_next; - anim_status_last = global.anim_status; + 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); + // 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); + } + else if (drawing_target == DRAW_TO_FADE_TARGET) + { + drawing_to_fading_buffer = TRUE; + + // start animations determined to be (temporary) started above + for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) + if (game_mode_anim_action[mode_nr] == ANIM_START) + HandleGlobalAnim(ANIM_START, mode_nr); + } } if (global.anim_status == GAME_MODE_LOADING) @@ -592,6 +613,16 @@ void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[mode_nr]; int anim_nr; + // when preparing source fading buffer, only draw animations to be stopped + if (drawing_target == DRAW_TO_FADE_SOURCE && + game_mode_anim_action[mode_nr] != ANIM_STOP) + continue; + + // when preparing target fading buffer, only draw animations to be started + if (drawing_target == DRAW_TO_FADE_TARGET && + game_mode_anim_action[mode_nr] != ANIM_START) + continue; + #if 0 if (mode_nr != GFX_SPECIAL_ARG_DEFAULT && mode_nr != game_status) @@ -674,11 +705,25 @@ void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) src_x += cut_x; src_y += cut_y; - BlitToScreenMasked(src_bitmap, src_x, src_y, width, height, + if (drawing_target == DRAW_TO_SCREEN) + BlitToScreenMasked(src_bitmap, src_x, src_y, width, height, + dst_x, dst_y); + else + BlitBitmapMasked(src_bitmap, fade_bitmap, src_x, src_y, width, height, dst_x, dst_y); } } } + + if (drawing_target == DRAW_TO_FADE_TARGET) + { + // stop animations determined to be (temporary) started above + for (mode_nr = 0; mode_nr < NUM_GAME_MODES; mode_nr++) + if (game_mode_anim_action[mode_nr] == ANIM_START) + HandleGlobalAnim(ANIM_STOP, mode_nr); + + drawing_to_fading_buffer = FALSE; + } } void DrawGlobalAnimations(int drawing_target, int drawing_stage) @@ -822,6 +867,10 @@ static void StopGlobalAnimMusic(struct GlobalAnimPartControlInfo *part) static void PlayGlobalAnimSoundAndMusic(struct GlobalAnimPartControlInfo *part) { + // when drawing animations to fading buffer, do not play sounds or music + if (drawing_to_fading_buffer) + return; + PlayGlobalAnimSound(part); PlayGlobalAnimMusic(part); } @@ -843,6 +892,11 @@ int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, int state) if (state & ANIM_STATE_RESTART) { + // when drawing animations to fading buffer, only start fixed animations + if (drawing_to_fading_buffer && (c->x == ARG_UNDEFINED_VALUE || + c->y == ARG_UNDEFINED_VALUE)) + return ANIM_STATE_INACTIVE; + ResetDelayCounterExt(&part->step_delay, anim_sync_frame); part->init_delay_counter = @@ -1204,7 +1258,7 @@ static void DoAnimationExt() for (i = 0; i < NUM_GAME_MODES; i++) HandleGlobalAnim(ANIM_CONTINUE, i); -#if 1 +#if 0 // force screen redraw in next frame to continue drawing global animations redraw_mask = REDRAW_ALL; #endif