X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fanim.c;h=060bb60e8f9e7995644742030e8a410cdd5d7205;hb=fd4817380a5fba31a5745366b2f223f98ac4c169;hp=9611fa67d2cbd4139aaba70cd6ebf0d8c8d4c4fd;hpb=971aa79cbc79ec491c79b81a54fed862e04b3f27;p=rocksndiamonds.git diff --git a/src/anim.c b/src/anim.c index 9611fa67..060bb60e 100644 --- a/src/anim.c +++ b/src/anim.c @@ -17,6 +17,7 @@ #include "files.h" #include "events.h" #include "screens.h" +#include "tape.h" #define DEBUG_ANIM_DELAY 0 @@ -114,6 +115,8 @@ struct GlobalAnimPartControlInfo struct GraphicInfo graphic_info; struct GraphicInfo control_info; + boolean class_playfield; + int viewport_x; int viewport_y; int viewport_width; @@ -372,6 +375,27 @@ static int compareGlobalAnimMainControlInfo(const void *obj1, const void *obj2) return compare_result; } +static boolean isPausedOnPlayfield(struct GlobalAnimPartControlInfo *part) +{ + // only pause playfield animations when playing + if (game_status != GAME_MODE_PLAYING) + return FALSE; + + // do not pause animations when game ended (and engine is running) + if (checkGameEnded()) + return FALSE; + + // only pause animations on playfield + if (!part->class_playfield) + return FALSE; + + // only pause animations when engine is paused or request dialog is open(ing) + if (!tape.pausing && !game.request_active_or_moving) + return FALSE; + + return TRUE; +} + static void InitToonControls(void) { int mode_nr_toons = GAME_MODE_PSEUDO_TOONS; @@ -921,6 +945,10 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage) if (part->drawing_stage != drawing_stage) continue; + // if game is paused, also pause playfield animations + if (isPausedOnPlayfield(part)) + part->initial_anim_sync_frame++; + sync_frame = anim_sync_frame - part->initial_anim_sync_frame; // re-initialize random animation frame after animation delay @@ -974,8 +1002,6 @@ void DrawGlobalAnimations(int drawing_target, int drawing_stage) ResetGlobalAnim_Clicked(); } - DrawEnvelopeRequestToScreen(drawing_target, drawing_stage); - if (gfx.cursor_mode_override != last_cursor_mode_override) SetMouseCursor(gfx.cursor_mode); } @@ -996,6 +1022,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_1; + part->class_playfield = FALSE; + if (part->control_info.class == get_hash_from_key("window") || part->control_info.class == get_hash_from_key("border")) { @@ -1057,6 +1085,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part viewport_y = REAL_SY; viewport_width = FULL_SXSIZE; viewport_height = FULL_SYSIZE; + + part->class_playfield = TRUE; } if (viewport_x != part->viewport_x || @@ -1467,6 +1497,10 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, struct GraphicInfo *c = &part->control_info; boolean viewport_changed = SetGlobalAnimPart_Viewport(part); + // if game is paused, also pause playfield animations + if (isPausedOnPlayfield(part)) + return state; + if (viewport_changed) state |= ANIM_STATE_RESTART; @@ -1732,10 +1766,13 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, if (c->position == POS_CE) { // calculate playfield position (with scrolling) for related CE tile + // (do not use FX/FY, which are incorrect during envelope requests) + int FX0 = 2 * TILEX_VAR; // same as FX during DRAW_TO_FIELDBUFFER + int FY0 = 2 * TILEY_VAR; // same as FY during DRAW_TO_FIELDBUFFER int fx = getFieldbufferOffsetX_RND(ScreenMovDir, ScreenGfxPos); int fy = getFieldbufferOffsetY_RND(ScreenMovDir, ScreenGfxPos); - int sx = FX + SCREENX(part->tile_x) * TILEX_VAR; - int sy = FY + SCREENY(part->tile_y) * TILEY_VAR; + int sx = FX0 + SCREENX(part->tile_x) * TILEX_VAR; + int sy = FY0 + SCREENY(part->tile_y) * TILEY_VAR; int cx = SX - REAL_SX; int cy = SY - REAL_SY; int x = sx - fx + cx;