added setting global animation position from CE triggering that animation
authorHolger Schemel <info@artsoft.org>
Sun, 20 Aug 2023 11:31:23 +0000 (13:31 +0200)
committerHolger Schemel <info@artsoft.org>
Sun, 3 Sep 2023 20:59:58 +0000 (22:59 +0200)
src/anim.c
src/anim.h
src/files.c
src/game.c
src/libgame/system.h

index d570be06ae39e8adb013f78a3f3439d3a1595d5f..219c79fd4c97b88ff074a77db45fee1052a25672 100644 (file)
@@ -1360,7 +1360,8 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
   }
 }
 
-static void InitGlobalAnim_Triggered_ByCustomElement(int nr, int page)
+static void InitGlobalAnim_Triggered_ByCustomElement(int nr, int page,
+                                                    int x, int y)
 {
   struct GlobalAnimControlInfo *ctrl = &global_anim_ctrl[GAME_MODE_PLAYING];
 
@@ -1383,6 +1384,14 @@ static void InitGlobalAnim_Triggered_ByCustomElement(int nr, int page)
 
       if (isClickablePart(part2, mask))
       {
+       struct GraphicInfo *c = &part2->control_info;
+
+       if (c->position == POS_CE)
+       {
+         part2->x = c->x + x;
+         part2->y = c->y + y;
+       }
+
        part2->triggered = TRUE;
 
 #if 0
@@ -2148,11 +2157,12 @@ int getGlobalAnimSyncFrame(void)
   return anim_sync_frame;
 }
 
-void HandleGlobalAnimEventByElementChange(int element, int page)
+void HandleGlobalAnimEventByElementChange(int element, int page, int x, int y)
 {
   if (!IS_CUSTOM_ELEMENT(element))
     return;
 
   // custom element stored as 0 to 255, change page stored as 1 to 32
-  InitGlobalAnim_Triggered_ByCustomElement(element - EL_CUSTOM_START, page + 1);
+  InitGlobalAnim_Triggered_ByCustomElement(element - EL_CUSTOM_START, page + 1,
+                                          x, y);
 }
index 5224be131a38b0133f3ea9515b66720f8e446454..0bde9a0bfec7f3063c53d04bbb2a21f21c9a20da 100644 (file)
@@ -22,7 +22,7 @@ void DrawGlobalAnimations(int, int);
 void RestartGlobalAnimsByStatus(int);
 
 boolean HandleGlobalAnimClicks(int, int, int, boolean);
-void HandleGlobalAnimEventByElementChange(int, int);
+void HandleGlobalAnimEventByElementChange(int, int, int, int);
 
 int getGlobalAnimSyncFrame(void);
 
index 13141d7f8d3c9f1eee7eaeca0fdcc901de96a6af..77fe2cdb69971e9cc49c81417c76514938b73dba 100644 (file)
@@ -11829,6 +11829,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
              strEqual(value, "lower")  ? POS_LOWER :
              strEqual(value, "bottom") ? POS_BOTTOM :
              strEqual(value, "any")    ? POS_ANY :
+             strEqual(value, "ce")     ? POS_CE :
              strEqual(value, "last")   ? POS_LAST : POS_UNDEFINED);
   }
   else if (strEqual(suffix, ".align"))
index 299fd72bdd934957fc06ca6e9343f1ad315c60aa..8cabb12de8c3ec028aaf681cc3196b4b00142225 100644 (file)
@@ -10716,7 +10716,14 @@ 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)
-    HandleGlobalAnimEventByElementChange(element, page);
+  {
+    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);
+  }
 
   if (change->explode)
   {
index e429d2336a6c8406cb7ef38c0eab3cea22bafd93..05f9f08ac9b66540d6e342c576c0ca2ff4a93f69 100644 (file)
 #define POS_LOWER              5
 #define POS_BOTTOM             6
 #define POS_ANY                        7
-#define POS_LAST               8
+#define POS_CE                 8
+#define POS_LAST               9
 
 // values for text alignment
 #define ALIGN_LEFT             (1 << 0)