renamed variable
[rocksndiamonds.git] / src / anim.c
index 824f86b5a159e441fc90c03112b0e45cc36cae0c..ff44369c1576c827007e44e8460f02affb2538be 100644 (file)
@@ -828,7 +828,8 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part
   int viewport_height;
   boolean changed = FALSE;
 
-  if (part->last_anim_status == global.anim_status)
+  if (part->last_anim_status == global.anim_status &&
+      part->control_info.class != get_hash_from_key("pointer"))
     return FALSE;
 
   part->last_anim_status = global.anim_status;
@@ -845,6 +846,15 @@ static boolean SetGlobalAnimPart_Viewport(struct GlobalAnimPartControlInfo *part
 
     part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2;
   }
+  else if (part->control_info.class == get_hash_from_key("pointer"))
+  {
+    viewport_x = gfx.mouse_x + part->control_info.x;
+    viewport_y = gfx.mouse_y + part->control_info.y;
+    viewport_width  = part->graphic_info.width;
+    viewport_height = part->graphic_info.height;
+
+    part->drawing_stage = DRAW_GLOBAL_ANIM_STAGE_2;
+  }
   else if (part->control_info.class == get_hash_from_key("door_1"))
   {
     viewport_x = DX;
@@ -1013,6 +1023,8 @@ static boolean checkGlobalAnimEvent(int anim_event, int mask)
     return (anim_event & ANIM_EVENT_ANY);
   else if (mask & ANIM_EVENT_SELF)
     return (anim_event & ANIM_EVENT_SELF);
+  else if (mask & ANIM_EVENT_UNCLICK_ANY)
+    return (anim_event & ANIM_EVENT_UNCLICK_ANY);
   else
     return (anim_event == mask ||
            anim_event == mask_anim_only);
@@ -1185,6 +1197,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
     part->anim_delay_counter =
       (c->anim_delay_fixed + GetSimpleRandom(c->anim_delay_random));
 
+    part->post_delay_counter = 0;
+
     part->init_event_state = (c->init_event != ANIM_EVENT_UNDEFINED);
     part->anim_event_state = (c->anim_event != ANIM_EVENT_UNDEFINED);
 
@@ -1254,10 +1268,13 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
       part->step_yoffset = 0;
     }
 
-    if (c->x != ARG_UNDEFINED_VALUE)
-      part->x = c->x;
-    if (c->y != ARG_UNDEFINED_VALUE)
-      part->y = c->y;
+    if (part->control_info.class != get_hash_from_key("pointer"))
+    {
+      if (c->x != ARG_UNDEFINED_VALUE)
+       part->x = c->x;
+      if (c->y != ARG_UNDEFINED_VALUE)
+       part->y = c->y;
+    }
 
     if (c->position == POS_LAST &&
        anim->last_x > -g->width  && anim->last_x < part->viewport_width &&
@@ -1618,20 +1635,20 @@ static void DoAnimationExt(void)
 
 static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part)
 {
-  int anim_event_action = part->control_info.anim_event_action;
+  int event_action = (part->init_event_state ?
+                     part->control_info.init_event_action :
+                     part->control_info.anim_event_action);
 
-  if (anim_event_action == -1)
+  if (event_action == ANIM_EVENT_ACTION_NONE)
     return FALSE;
 
-  boolean action_executed = (DoGadgetAction(anim_event_action) ||
-                            DoScreenAction(anim_event_action) ||
-                            DoKeysymAction(anim_event_action));
+  PushUserEvent(USEREVENT_ANIM_EVENT_ACTION, event_action, 0);
 
   // check if further actions are allowed to be executed
   if (part->control_info.style & STYLE_MULTIPLE_ACTIONS)
     return FALSE;
 
-  return action_executed;
+  return TRUE;
 }
 
 static void InitGlobalAnim_Clickable(void)
@@ -1662,7 +1679,11 @@ static void InitGlobalAnim_Clickable(void)
   }
 }
 
-static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
+#define ANIM_CLICKED_RESET     0
+#define ANIM_CLICKED_PRESSED   1
+#define ANIM_CLICKED_RELEASED  2
+
+static boolean InitGlobalAnim_Clicked(int mx, int my, int clicked_event)
 {
   boolean anything_clicked = FALSE;
   boolean any_part_clicked = FALSE;
@@ -1686,7 +1707,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
       {
        struct GlobalAnimPartControlInfo *part = &anim->part[part_nr];
 
-       if (!clicked)
+       if (clicked_event == ANIM_CLICKED_RESET)
        {
          part->clicked = FALSE;
 
@@ -1700,7 +1721,8 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
          continue;
 
        // always handle "any" click events (clicking anywhere on screen) ...
-       if (isClickablePart(part, ANIM_EVENT_ANY))
+       if (clicked_event == ANIM_CLICKED_PRESSED &&
+           isClickablePart(part, ANIM_EVENT_ANY))
        {
 #if DEBUG_ANIM_EVENTS
          printf("::: => %d.%d TRIGGERED BY ANY\n",
@@ -1711,11 +1733,25 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
          anything_clicked = clickConsumed(part);
        }
 
+       // always handle "unclick:any" events (releasing anywhere on screen) ...
+       if (clicked_event == ANIM_CLICKED_RELEASED &&
+           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);
+#endif
+
+         part->clicked = TRUE;
+         anything_clicked = clickConsumed(part);
+       }
+
        // ... but only handle the first (topmost) clickable animation
        if (any_part_clicked)
          continue;
 
-       if (isClickedPart(part, mx, my, clicked))
+       if (clicked_event == ANIM_CLICKED_PRESSED &&
+           isClickedPart(part, mx, my, TRUE))
        {
 #if 0
          printf("::: %d.%d CLICKED [%d]\n", anim_nr, part_nr,
@@ -1758,10 +1794,10 @@ static void ResetGlobalAnim_Clickable(void)
 
 static void ResetGlobalAnim_Clicked(void)
 {
-  InitGlobalAnim_Clicked(-1, -1, FALSE);
+  InitGlobalAnim_Clicked(-1, -1, ANIM_CLICKED_RESET);
 }
 
-boolean HandleGlobalAnimClicks(int mx, int my, int button)
+boolean HandleGlobalAnimClicks(int mx, int my, int button, boolean force_click)
 {
   static boolean click_consumed = FALSE;
   static int last_button = 0;
@@ -1769,6 +1805,9 @@ boolean HandleGlobalAnimClicks(int mx, int my, int button)
   boolean release_event;
   boolean click_consumed_current = click_consumed;
 
+  if (button != 0 && force_click)
+    last_button = 0;
+
   // check if button state has changed since last invocation
   press_event   = (button != 0 && last_button == 0);
   release_event = (button == 0 && last_button != 0);
@@ -1776,12 +1815,15 @@ boolean HandleGlobalAnimClicks(int mx, int my, int button)
 
   if (press_event)
   {
-    click_consumed = InitGlobalAnim_Clicked(mx, my, TRUE);
+    click_consumed = InitGlobalAnim_Clicked(mx, my, ANIM_CLICKED_PRESSED);
     click_consumed_current = click_consumed;
   }
 
   if (release_event)
+  {
+    InitGlobalAnim_Clicked(mx, my, ANIM_CLICKED_RELEASED);
     click_consumed = FALSE;
+  }
 
   return click_consumed_current;
 }