added event actions (by simulating keyboard input) for global animations
[rocksndiamonds.git] / src / anim.c
index 0a4946a2a1da9a739a0c80f44f8edf0690d82efb..0a278aa35cb36a97983be9ea1cc7b62934bb3799 100644 (file)
@@ -14,6 +14,8 @@
 #include "anim.h"
 #include "main.h"
 #include "tools.h"
+#include "events.h"
+#include "screens.h"
 
 
 /* values for global toon animation definition */
@@ -1003,10 +1005,8 @@ static boolean isClickedPart(struct GlobalAnimPartControlInfo *part,
   return TRUE;
 }
 
-static boolean setPartClicked(struct GlobalAnimPartControlInfo *part)
+static boolean clickConsumed(struct GlobalAnimPartControlInfo *part)
 {
-  part->clicked = TRUE;
-
   return (part->control_info.style & STYLE_PASSTHROUGH ? FALSE : TRUE);
 }
 
@@ -1452,7 +1452,15 @@ static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part)
   if (anim_event_action == -1)
     return FALSE;
 
-  return DoGadgetAction(anim_event_action);
+  boolean action_executed = (DoGadgetAction(anim_event_action) ||
+                            DoScreenAction(anim_event_action) ||
+                            DoKeysymAction(anim_event_action));
+
+  // check if further actions are allowed to be executed
+  if (part->control_info.style & STYLE_MULTIPLE_ACTIONS)
+    return FALSE;
+
+  return action_executed;
 }
 
 static void InitGlobalAnim_Clickable()
@@ -1483,6 +1491,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
 {
   boolean anything_clicked = FALSE;
   boolean any_part_clicked = FALSE;
+  boolean any_event_action = FALSE;
   int mode_nr;
 
   // check game modes in reverse draw order (to stop when clicked)
@@ -1517,7 +1526,10 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
 
        // always handle "any" click events (clicking anywhere on screen) ...
        if (isClickablePart(part, ANIM_EVENT_ANY))
-         anything_clicked = setPartClicked(part);
+       {
+         part->clicked = TRUE;
+         anything_clicked = clickConsumed(part);
+       }
 
        // ... but only handle the first (topmost) clickable animation
        if (any_part_clicked)
@@ -1530,14 +1542,18 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
                 part->control_info.anim_event_action);
 #endif
 
-         // after executing event action, force click to be ignored
-         if (DoGlobalAnim_EventAction(part))
-           return TRUE;
+         // after executing event action, ignore any further actions
+         if (!any_event_action && DoGlobalAnim_EventAction(part))
+           any_event_action = TRUE;
 
-         any_part_clicked = TRUE;
+         // determine if mouse clicks should be blocked from other animations
+         any_part_clicked = clickConsumed(part);
 
          if (isClickablePart(part, ANIM_EVENT_SELF))
-           anything_clicked = setPartClicked(part);
+         {
+           part->clicked = TRUE;
+           anything_clicked = clickConsumed(part);
+         }
 
          // check if this click is defined to trigger other animations
          int gic_anim_nr = part->old_anim_nr + 1;      // X as in "anim_X"
@@ -1563,16 +1579,17 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
 
              if (isClickablePart(part2, mask))
              {
-               setPartClicked(part2);
+               part2->clicked = TRUE;
+               anything_clicked = clickConsumed(part); // click was on "part"!
 
 #if 0
                printf("::: %d.%d TRIGGER CLICKED [%d]\n", anim2_nr, part2_nr,
                       part2->control_info.anim_event_action);
 #endif
 
-               // after executing event action, force click to be ignored
-               if (DoGlobalAnim_EventAction(part2))
-                 return TRUE;
+               // after executing event action, ignore any further actions
+               if (!any_event_action && DoGlobalAnim_EventAction(part2))
+                 any_event_action = TRUE;
              }
 
 #if 0
@@ -1594,7 +1611,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
     }
   }
 
-  return anything_clicked;
+  return (anything_clicked || any_event_action);
 }
 
 static void ResetGlobalAnim_Clickable()