added setting scroll offset to global animation position triggered by CE
authorHolger Schemel <info@artsoft.org>
Sun, 20 Aug 2023 12:17:40 +0000 (14:17 +0200)
committerHolger Schemel <info@artsoft.org>
Sun, 3 Sep 2023 20:59:58 +0000 (22:59 +0200)
src/anim.c
src/game.c

index a20ee4a3153c7881e9235b6c852f448a2ff83976..0e866110cb24cd4a6ec290dabe928f4ee60bb727 100644 (file)
@@ -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;
index 8cabb12de8c3ec028aaf681cc3196b4b00142225..8cb99586ffbcd20c26e3aca5874a012ceb58e1cb 100644 (file)
@@ -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)
   {