added new animation mode ".global_anim_sync" for game element graphics
[rocksndiamonds.git] / src / anim.c
index dec9d18ee61d49cf1667e61298111e2c9f9060d0..50075c832ab8b42b4993c7c8fa7f7871aeac831c 100644 (file)
 #define ANIM_CLASS_BIT_TITLE_INITIAL   0
 #define ANIM_CLASS_BIT_TITLE           1
 #define ANIM_CLASS_BIT_MAIN            2
-#define ANIM_CLASS_BIT_SCORES          3
-#define ANIM_CLASS_BIT_SUBMENU         4
-#define ANIM_CLASS_BIT_MENU            5
-#define ANIM_CLASS_BIT_TOONS           6
-#define ANIM_CLASS_BIT_NO_TITLE                7
+#define ANIM_CLASS_BIT_NAMES           3
+#define ANIM_CLASS_BIT_SCORES          4
+#define ANIM_CLASS_BIT_SCORESONLY      5
+#define ANIM_CLASS_BIT_SUBMENU         6
+#define ANIM_CLASS_BIT_MENU            7
+#define ANIM_CLASS_BIT_TOONS           8
+#define ANIM_CLASS_BIT_NO_TITLE                9
 
-#define NUM_ANIM_CLASSES               8
+#define NUM_ANIM_CLASSES               10
 
 #define ANIM_CLASS_NONE                        0
 #define ANIM_CLASS_TITLE_INITIAL       (1 << ANIM_CLASS_BIT_TITLE_INITIAL)
 #define ANIM_CLASS_TITLE               (1 << ANIM_CLASS_BIT_TITLE)
 #define ANIM_CLASS_MAIN                        (1 << ANIM_CLASS_BIT_MAIN)
+#define ANIM_CLASS_NAMES               (1 << ANIM_CLASS_BIT_NAMES)
 #define ANIM_CLASS_SCORES              (1 << ANIM_CLASS_BIT_SCORES)
+#define ANIM_CLASS_SCORESONLY          (1 << ANIM_CLASS_BIT_SCORESONLY)
 #define ANIM_CLASS_SUBMENU             (1 << ANIM_CLASS_BIT_SUBMENU)
 #define ANIM_CLASS_MENU                        (1 << ANIM_CLASS_BIT_MENU)
 #define ANIM_CLASS_TOONS               (1 << ANIM_CLASS_BIT_TOONS)
                                         ANIM_CLASS_SCORES      |       \
                                         ANIM_CLASS_NO_TITLE)
 
+#define ANIM_CLASS_TOONS_SCORESONLY    (ANIM_CLASS_TOONS       |       \
+                                        ANIM_CLASS_SCORES      |       \
+                                        ANIM_CLASS_SCORESONLY  |       \
+                                        ANIM_CLASS_NO_TITLE)
+
 #define ANIM_CLASS_TOONS_MENU_MAIN     (ANIM_CLASS_TOONS       |       \
                                         ANIM_CLASS_MENU        |       \
                                         ANIM_CLASS_MAIN        |       \
                                         ANIM_CLASS_SUBMENU     |       \
                                         ANIM_CLASS_NO_TITLE)
 
+#define ANIM_CLASS_TOONS_MENU_SUBMENU_2        (ANIM_CLASS_TOONS       |       \
+                                        ANIM_CLASS_MENU        |       \
+                                        ANIM_CLASS_SUBMENU     |       \
+                                        ANIM_CLASS_NAMES       |       \
+                                        ANIM_CLASS_NO_TITLE)
+
 // values for global animation states
 #define ANIM_STATE_INACTIVE            0
 #define ANIM_STATE_RESTART             (1 << 0)
@@ -109,7 +124,8 @@ struct GlobalAnimPartControlInfo
 
   unsigned int initial_anim_sync_frame;
   unsigned int anim_random_frame;
-  unsigned int step_delay, step_delay_value;
+
+  DelayCounter step_delay;
 
   int init_delay_counter;
   int anim_delay_counter;
@@ -178,14 +194,18 @@ struct GameModeAnimClass
   { GAME_MODE_TITLE_3,                 ANIM_CLASS_TITLE                },
   { GAME_MODE_TITLE_4,                 ANIM_CLASS_TITLE                },
   { GAME_MODE_TITLE_5,                 ANIM_CLASS_TITLE                },
+  { GAME_MODE_NAMES,                   ANIM_CLASS_TOONS_MENU_SUBMENU   },
   { GAME_MODE_LEVELS,                  ANIM_CLASS_TOONS_MENU_SUBMENU   },
   { GAME_MODE_LEVELNR,                 ANIM_CLASS_TOONS_MENU_SUBMENU   },
   { GAME_MODE_INFO,                    ANIM_CLASS_TOONS_MENU_SUBMENU   },
   { GAME_MODE_SETUP,                   ANIM_CLASS_TOONS_MENU_SUBMENU   },
+  { GAME_MODE_PSEUDO_NAMESONLY,                ANIM_CLASS_TOONS_MENU_SUBMENU_2 },
+  { GAME_MODE_PSEUDO_TYPENAMES,                ANIM_CLASS_TOONS_MENU_SUBMENU_2 },
   { GAME_MODE_PSEUDO_MAINONLY,         ANIM_CLASS_TOONS_MENU_MAIN      },
   { GAME_MODE_PSEUDO_TYPENAME,         ANIM_CLASS_TOONS_MENU_MAIN      },
-  { GAME_MODE_PSEUDO_SCORESOLD,                ANIM_CLASS_TOONS_SCORES         },
-  { GAME_MODE_PSEUDO_SCORESNEW,                ANIM_CLASS_TOONS_SCORES         },
+  { GAME_MODE_PSEUDO_SCORESOLD,                ANIM_CLASS_TOONS_SCORESONLY     },
+  { GAME_MODE_PSEUDO_SCORESNEW,                ANIM_CLASS_TOONS_SCORESONLY     },
+  { GAME_MODE_SCOREINFO,               ANIM_CLASS_TOONS_SCORES         },
   { GAME_MODE_EDITOR,                  ANIM_CLASS_NO_TITLE             },
   { GAME_MODE_PLAYING,                 ANIM_CLASS_NO_TITLE             },
 
@@ -201,7 +221,9 @@ struct AnimClassGameMode
   { ANIM_CLASS_BIT_TITLE_INITIAL,      GAME_MODE_TITLE_INITIAL         },
   { ANIM_CLASS_BIT_TITLE,              GAME_MODE_TITLE                 },
   { ANIM_CLASS_BIT_MAIN,               GAME_MODE_MAIN                  },
+  { ANIM_CLASS_BIT_NAMES,              GAME_MODE_NAMES                 },
   { ANIM_CLASS_BIT_SCORES,             GAME_MODE_SCORES                },
+  { ANIM_CLASS_BIT_SCORESONLY,         GAME_MODE_PSEUDO_SCORESONLY     },
   { ANIM_CLASS_BIT_SUBMENU,            GAME_MODE_PSEUDO_SUBMENU        },
   { ANIM_CLASS_BIT_MENU,               GAME_MODE_PSEUDO_MENU           },
   { ANIM_CLASS_BIT_TOONS,              GAME_MODE_PSEUDO_TOONS          },
@@ -389,7 +411,8 @@ static void InitToonControls(void)
     int sound = SND_UNDEFINED;
     int music = MUS_UNDEFINED;
     int graphic = IMG_TOON_1 + i;
-    int control = graphic;
+
+    control = graphic;
 
     part->nr = part_nr;
     part->anim_nr = anim_nr;
@@ -415,8 +438,8 @@ static void InitToonControls(void)
     part->initial_anim_sync_frame = 0;
     part->anim_random_frame = -1;
 
-    part->step_delay = 0;
-    part->step_delay_value = graphic_info[control].step_delay;
+    part->step_delay.count = 0;
+    part->step_delay.value = graphic_info[control].step_delay;
 
     part->state = ANIM_STATE_INACTIVE;
     part->last_anim_status = -1;
@@ -494,13 +517,15 @@ static void InitGlobalAnimControls(void)
          continue;
 
 #if 0
-       printf("::: mode == %d, anim = %d, part = %d [%d, %d, %d] [%d]\n",
-              m, a, p, mode_nr, anim_nr, part_nr, control);
+       Debug("anim:InitGlobalAnimControls",
+             "mode == %d, anim = %d, part = %d [%d, %d, %d] [%d]",
+             m, a, p, mode_nr, anim_nr, part_nr, control);
 #endif
 
 #if 0
-       printf("::: mode == %d, anim = %d, part = %d [%d, %d, %d] [%d]\n",
-              m, a, p, mode_nr, anim_nr, part_nr, sound);
+       Debug("anim:InitGlobalAnimControls",
+             "mode == %d, anim = %d, part = %d [%d, %d, %d] [%d]",
+             m, a, p, mode_nr, anim_nr, part_nr, sound);
 #endif
 
        part->old_nr = p;
@@ -520,8 +545,8 @@ static void InitGlobalAnimControls(void)
        part->initial_anim_sync_frame = 0;
        part->anim_random_frame = -1;
 
-       part->step_delay = 0;
-       part->step_delay_value = graphic_info[control].step_delay;
+       part->step_delay.count = 0;
+       part->step_delay.value = graphic_info[control].step_delay;
 
        part->state = ANIM_STATE_INACTIVE;
        part->last_anim_status = -1;
@@ -640,9 +665,11 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage)
     if (drawing_target == DRAW_TO_FADE_TARGET)
       after_fading = TRUE;
 
-    // special case: changing from/to this screen is done without fading
-    if (global.anim_status == GAME_MODE_PSEUDO_TYPENAME ||
-       anim_status_last   == GAME_MODE_PSEUDO_TYPENAME)
+    // special case: changing from/to these screens is done without fading
+    if (global.anim_status == GAME_MODE_PSEUDO_TYPENAME  ||
+       global.anim_status == GAME_MODE_PSEUDO_TYPENAMES ||
+       anim_status_last   == GAME_MODE_PSEUDO_TYPENAME  ||
+       anim_status_last   == GAME_MODE_PSEUDO_TYPENAMES)
       after_fading = TRUE;
 
     // ---------- part 1 ------------------------------------------------------
@@ -818,8 +845,8 @@ static void DrawGlobalAnimationsExt(int drawing_target, int drawing_stage)
 
        gfx.anim_random_frame = last_anim_random_frame;
 
-       getFixedGraphicSource(part->graphic, frame, &src_bitmap,
-                             &src_x, &src_y);
+       getGlobalAnimGraphicSource(part->graphic, frame, &src_bitmap,
+                                  &src_x, &src_y);
 
        src_x += cut_x;
        src_y += cut_y;
@@ -863,6 +890,8 @@ 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);
 }
@@ -981,7 +1010,7 @@ static void PlayGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
     PlaySound(sound);
 
 #if 0
-  printf("::: PLAY SOUND %d.%d.%d: %d\n",
+  Debug("anim:PlayGlobalAnimSound", "PLAY SOUND %d.%d.%d: %d",
         part->anim_nr, part->nr, part->mode_nr, sound);
 #endif
 }
@@ -996,8 +1025,8 @@ static void StopGlobalAnimSound(struct GlobalAnimPartControlInfo *part)
   StopSound(sound);
 
 #if 0
-  printf("::: STOP SOUND %d.%d.%d: %d\n",
-        part->anim_nr, part->nr, part->mode_nr, sound);
+  Debug("anim:StopGlobalAnimSound", "STOP SOUND %d.%d.%d: %d",
+       part->anim_nr, part->nr, part->mode_nr, sound);
 #endif
 }
 
@@ -1017,8 +1046,8 @@ static void PlayGlobalAnimMusic(struct GlobalAnimPartControlInfo *part)
     PlayMusic(music);
 
 #if 0
-  printf("::: PLAY MUSIC %d.%d.%d: %d\n",
-        part->anim_nr, part->nr, part->mode_nr, music);
+  Debug("anim:PlayGlobalAnimMusic", "PLAY MUSIC %d.%d.%d: %d",
+       part->anim_nr, part->nr, part->mode_nr, music);
 #endif
 }
 
@@ -1032,8 +1061,8 @@ static void StopGlobalAnimMusic(struct GlobalAnimPartControlInfo *part)
   StopMusic();
 
 #if 0
-  printf("::: STOP MUSIC %d.%d.%d: %d\n",
-        part->anim_nr, part->nr, part->mode_nr, music);
+  Debug("anim:StopGlobalAnimMusic", "STOP MUSIC %d.%d.%d: %d",
+       part->anim_nr, part->nr, part->mode_nr, music);
 #endif
 }
 
@@ -1148,12 +1177,12 @@ static boolean isClickedPart(struct GlobalAnimPartControlInfo *part,
 
 static boolean clickBlocked(struct GlobalAnimPartControlInfo *part)
 {
-  return (part->control_info.style & STYLE_BLOCK ? TRUE : FALSE);
+  return ((part->control_info.style & STYLE_BLOCK) ? TRUE : FALSE);
 }
 
 static boolean clickConsumed(struct GlobalAnimPartControlInfo *part)
 {
-  return (part->control_info.style & STYLE_PASSTHROUGH ? FALSE : TRUE);
+  return ((part->control_info.style & STYLE_PASSTHROUGH) ? FALSE : TRUE);
 }
 
 static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
@@ -1190,13 +1219,15 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
        *click_consumed |= clickConsumed(part);         // click was on "part"!
 
 #if DEBUG_ANIM_EVENTS
-       printf("::: => %d.%d TRIGGERED BY %s OF %d.%d\n",
-              part2->old_anim_nr + 1, part2->old_nr + 1, info_text,
-              part->old_anim_nr + 1, part->old_nr + 1);
+       Debug("anim:InitGlobalAnim_Triggered",
+             "%d.%d TRIGGERED BY %s OF %d.%d",
+             part2->old_anim_nr + 1, part2->old_nr + 1, info_text,
+             part->old_anim_nr + 1, part->old_nr + 1);
 #endif
 #if 0
-       printf("::: %d.%d TRIGGER CLICKED [%d]\n", anim2_nr, part2_nr,
-              part2->control_info.anim_event_action);
+       Debug("anim:InitGlobalAnim_Triggered",
+             "%d.%d TRIGGER CLICKED [%d]", anim2_nr, part2_nr,
+             part2->control_info.anim_event_action);
 #endif
 
        // after executing event action, ignore any further actions
@@ -1207,14 +1238,15 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
 #if 0
       struct GraphicInfo *c = &part2->control_info;
 
-      printf("::: - %d.%d: 0x%08x, 0x%08x [0x%08x]",
-            anim2_nr, part2_nr, c->init_event, c->anim_event, mask);
-
       if (isClickablePart(part2, mask))
-       printf(" <--- TRIGGERED BY %d.%d",
-              anim_nr, part_nr);
-
-      printf("\n");
+       Debug("anim:InitGlobalAnim_Triggered",
+             "%d.%d: 0x%08x, 0x%08x [0x%08x] <--- TRIGGERED BY %d.%d",
+             anim2_nr, part2_nr, c->init_event, c->anim_event, mask,
+             anim_nr, part_nr);
+      else
+       Debug("anim:InitGlobalAnim_Triggered",
+             "%d.%d: 0x%08x, 0x%08x [0x%08x]",
+             anim2_nr, part2_nr, c->init_event, c->anim_event, mask);
 #endif
     }
   }
@@ -1224,7 +1256,8 @@ static void HandleGlobalAnimDelay(struct GlobalAnimPartControlInfo *part,
                                  int delay_type, char *info_text)
 {
 #if DEBUG_ANIM_DELAY
-  printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text);
+  Debug("anim:HandleGlobalAnimDelay", "%d.%d %s",
+       part->old_anim_nr + 1, part->old_nr + 1, info_text);
 #endif
 
   DoGlobalAnim_DelayAction(part, delay_type);
@@ -1234,7 +1267,8 @@ static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part,
                                  int event_value, char *info_text)
 {
 #if DEBUG_ANIM_EVENTS
-  printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text);
+  Debug("anim:HandleGlobalAnimEvent", "%d.%d %s",
+       part->old_anim_nr + 1, part->old_nr + 1, info_text);
 #endif
 
   boolean click_consumed = FALSE;
@@ -1281,7 +1315,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
     part->anim_event_state = (c->anim_event != ANIM_EVENT_UNDEFINED);
 
     part->initial_anim_sync_frame =
-      (g->anim_global_sync ? 0 : anim_sync_frame + part->init_delay_counter);
+      (g->anim_global_sync || g->anim_global_anim_sync ? 0 :
+       anim_sync_frame + part->init_delay_counter);
 
     // do not re-initialize random animation frame after fade-in
     if (part->anim_random_frame == -1)
@@ -1499,8 +1534,7 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
   // special case to prevent expiring loop sounds when playing
   PlayGlobalAnimSoundIfLoop(part);
 
-  if (!DelayReachedExt(&part->step_delay, part->step_delay_value,
-                      anim_sync_frame))
+  if (!DelayReachedExt(&part->step_delay, anim_sync_frame))
     return ANIM_STATE_RUNNING;
 
 #if 0
@@ -1508,8 +1542,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
     static unsigned int last_counter = -1;
     unsigned int counter = Counter();
 
-    printf("::: NEXT ANIM PART [%d, %d]\n",
-          anim_sync_frame, counter - last_counter);
+    Debug("anim:HandleGlobalAnim_Part", "NEXT ANIM PART [%d, %d]",
+         anim_sync_frame, counter - last_counter);
 
     last_counter = counter;
   }
@@ -1534,21 +1568,22 @@ static void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim,
   int i;
 
 #if 0
-  printf("::: HandleGlobalAnim_Main: %d, %d => %d\n",
+  Debug("anim:HandleGlobalAnim_Main", "%d, %d => %d",
         anim->mode_nr, anim->nr, anim->num_parts);
-  printf("::: %d, %d, %d\n", global.num_toons, setup.toons, num_toons);
+  Debug("anim:HandleGlobalAnim_Main",
+       "%d, %d, %d", global.num_toons, setup.toons, num_toons);
 #endif
 
 #if 0
-  printf("::: %s(%d): %d, %d, %d [%d]\n",
-        (action == ANIM_START ? "ANIM_START" :
-         action == ANIM_CONTINUE ? "ANIM_CONTINUE" :
-         action == ANIM_STOP ? "ANIM_STOP" : "(should not happen)"),
-        anim->nr,
-        anim->state & ANIM_STATE_RESTART,
-        anim->state & ANIM_STATE_WAITING,
-        anim->state & ANIM_STATE_RUNNING,
-        anim->num_parts);
+  Debug("anim:HandleGlobalAnim_Main", "%s(%d): %d, %d, %d [%d]",
+       (action == ANIM_START ? "ANIM_START" :
+        action == ANIM_CONTINUE ? "ANIM_CONTINUE" :
+        action == ANIM_STOP ? "ANIM_STOP" : "(should not happen)"),
+       anim->nr,
+       anim->state & ANIM_STATE_RESTART,
+       anim->state & ANIM_STATE_WAITING,
+       anim->state & ANIM_STATE_RUNNING,
+       anim->num_parts);
 #endif
 
   switch (action)
@@ -1584,8 +1619,8 @@ static void HandleGlobalAnim_Main(struct GlobalAnimMainControlInfo *anim,
   if (c->anim_mode & ANIM_ALL || anim->num_parts == 0)
   {
 #if 0
-    printf("::: HandleGlobalAnim_Main: %d, %d => %d\n",
-          anim->mode_nr, anim->nr, num_parts);
+    Debug("anim:HandleGlobalAnim_Main", "%d, %d => %d",
+         anim->mode_nr, anim->nr, num_parts);
 #endif
 
     for (i = 0; i < num_parts; i++)
@@ -1682,8 +1717,7 @@ static void HandleGlobalAnim_Mode(struct GlobalAnimControlInfo *ctrl, int action
   int i;
 
 #if 0
-  printf("::: HandleGlobalAnim_Mode: %d => %d\n",
-        ctrl->nr, ctrl->num_anims);
+  Debug("anim:HandleGlobalAnim_Mode", "%d => %d", ctrl->nr, ctrl->num_anims);
 #endif
 
   for (i = 0; i < ctrl->num_anims; i++)
@@ -1693,7 +1727,7 @@ static void HandleGlobalAnim_Mode(struct GlobalAnimControlInfo *ctrl, int action
 static void HandleGlobalAnim(int action, int game_mode)
 {
 #if 0
-  printf("::: HandleGlobalAnim [mode == %d]\n", game_status);
+  Debug("anim:HandleGlobalAnim", "mode == %d", game_status);
 #endif
 
   HandleGlobalAnim_Mode(&global_anim_ctrl[game_mode], action);
@@ -1704,7 +1738,7 @@ static void DoAnimationExt(void)
   int i;
 
 #if 0
-  printf("::: DoAnimation [%d, %d]\n", anim_sync_frame, Counter());
+  Debug("anim:DoAnimationExt", "%d, %d", anim_sync_frame, Counter());
 #endif
 
   // global animations now synchronized with frame delay of screen update
@@ -1743,7 +1777,10 @@ static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part)
   if (event_action == ANIM_EVENT_ACTION_NONE)
     return FALSE;
 
-  PushUserEvent(USEREVENT_ANIM_EVENT_ACTION, event_action, 0);
+  if (event_action < MAX_IMAGE_FILES)
+    PushUserEvent(USEREVENT_ANIM_EVENT_ACTION, event_action, 0);
+  else
+    OpenURLFromHash(anim_url_hash, event_action);
 
   // check if further actions are allowed to be executed
   if (part->control_info.style & STYLE_MULTIPLE_ACTIONS)
@@ -1828,8 +1865,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
            isClickablePart(part, ANIM_EVENT_ANY))
        {
 #if DEBUG_ANIM_EVENTS
-         printf("::: => %d.%d TRIGGERED BY ANY\n",
-                part->old_anim_nr + 1, part->old_nr + 1);
+         Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY ANY",
+               part->old_anim_nr + 1, part->old_nr + 1);
 #endif
 
          anything_clicked = part->clicked = TRUE;
@@ -1841,8 +1878,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
            isClickablePart(part, ANIM_EVENT_UNCLICK_ANY))
        {
 #if DEBUG_ANIM_EVENTS
-         printf("::: => %d.%d TRIGGERED BY UNCLICK:ANY\n",
-                part->old_anim_nr + 1, part->old_nr + 1);
+         Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY UNCLICK:ANY",
+               part->old_anim_nr + 1, part->old_nr + 1);
 #endif
 
          anything_clicked = part->clicked = TRUE;
@@ -1857,8 +1894,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
            isClickedPart(part, mx, my, TRUE))
        {
 #if 0
-         printf("::: %d.%d CLICKED [%d]\n", anim_nr, part_nr,
-                part->control_info.anim_event_action);
+         Debug("anim:InitGlobalAnim_Clicked", "%d.%d CLICKED [%d]",
+               anim_nr, part_nr, part->control_info.anim_event_action);
 #endif
 
          // after executing event action, ignore any further actions
@@ -1871,8 +1908,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
          if (isClickablePart(part, ANIM_EVENT_SELF))
          {
 #if DEBUG_ANIM_EVENTS
-           printf("::: => %d.%d TRIGGERED BY SELF\n",
-                  part->old_anim_nr + 1, part->old_nr + 1);
+           Debug("anim:InitGlobalAnim_Clicked", "%d.%d TRIGGERED BY SELF",
+                 part->old_anim_nr + 1, part->old_nr + 1);
 #endif
 
            anything_clicked = part->clicked = TRUE;
@@ -1946,3 +1983,8 @@ boolean HandleGlobalAnimClicks(int mx, int my, int button, boolean force_click)
 
   return click_consumed_current;
 }
+
+int getGlobalAnimSyncFrame(void)
+{
+  return anim_sync_frame;
+}