From c3f3b0337a6d011fdf9bcdab618b8307061879e8 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sun, 20 Aug 2023 14:17:40 +0200 Subject: [PATCH] added setting scroll offset to global animation position triggered by CE --- src/anim.c | 36 ++++++++++++++++++++++++++++++++---- src/game.c | 9 +-------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/anim.c b/src/anim.c index a20ee4a3..0e866110 100644 --- a/src/anim.c +++ b/src/anim.c @@ -122,6 +122,9 @@ struct GlobalAnimPartControlInfo int x, y; int step_xoffset, step_yoffset; + int tile_x, tile_y; + int tile_xoffset, tile_yoffset; + unsigned int initial_anim_sync_frame; unsigned int anim_random_frame; @@ -1396,8 +1399,14 @@ static void InitGlobalAnim_Triggered_ByCustomElement(int nr, int page, if (c->position == POS_CE) { - part2->x = c->x + x; - part2->y = c->y + y; + // store CE tile and offset position to handle scrolling + part2->tile_x = x; + part2->tile_y = y; + part2->tile_xoffset = c->x; + part2->tile_yoffset = c->y; + + // restart animation (by using current sync frame) + part2->initial_anim_sync_frame = anim_sync_frame; } part2->triggered = TRUE; @@ -1713,8 +1722,27 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part, } #endif - part->x += part->step_xoffset; - part->y += part->step_yoffset; + if (c->position == POS_CE) + { + // calculate playfield position (with scrolling) for related CE tile + 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 x = sx - fx; + int y = sy - fy; + + part->tile_xoffset += part->step_xoffset; + part->tile_yoffset += part->step_yoffset; + + part->x = x + part->tile_xoffset; + part->y = y + part->tile_yoffset; + } + else + { + part->x += part->step_xoffset; + part->y += part->step_yoffset; + } anim->last_x = part->x; anim->last_y = part->y; diff --git a/src/game.c b/src/game.c index 8cabb12d..8cb99586 100644 --- a/src/game.c +++ b/src/game.c @@ -10716,14 +10716,7 @@ static boolean ChangeElement(int x, int y, int element, int page) ChangeCount[x][y]++; // count number of changes in the same frame if (ei->has_anim_event) - { - int fx = getFieldbufferOffsetX_RND(ScreenMovDir, ScreenGfxPos); - int fy = getFieldbufferOffsetY_RND(ScreenMovDir, ScreenGfxPos); - int sx = FX + SCREENX(x) * TILEX_VAR; - int sy = FY + SCREENY(y) * TILEY_VAR; - - HandleGlobalAnimEventByElementChange(element, page, sx - fx, sy - fy); - } + HandleGlobalAnimEventByElementChange(element, page, x, y); if (change->explode) { -- 2.34.1