added event actions (by triggering gadgets) for global animations
authorHolger Schemel <info@artsoft.org>
Fri, 8 Jun 2018 22:01:48 +0000 (00:01 +0200)
committerHolger Schemel <info@artsoft.org>
Sun, 17 Jun 2018 22:02:48 +0000 (00:02 +0200)
This change adds a new option for the "graphicsinfo.conf" file for
defining clickable global animations that trigger other actions
(currently limited to triggering active gadget buttons on the same
screen as the global animations). The new option works like this:

global.anim_1.part_1.MAIN.anim_event:            click
global.anim_1.part_1.MAIN.anim_event_action:     tape.button.record

The second option is the new one (the first one already existed).
When clicking this global animation (on the main menu screen), the
game will be started (by triggering the "record" button on the tape
recorder, which effectively starts playing the current level).

src/anim.c
src/libgame/gadgets.c
src/libgame/gadgets.h

index 054c6a00764f533e0a78d8208d0e047ab6304220..d1ae06a105391ab6b4deda15d2199ce6ec1279fa 100644 (file)
@@ -1438,6 +1438,16 @@ static void DoAnimationExt()
 #endif
 }
 
+static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part)
+{
+  int anim_event_action = part->control_info.anim_event_action;
+
+  if (anim_event_action == -1)
+    return FALSE;
+
+  return DoGadgetAction(anim_event_action);
+}
+
 static void InitGlobalAnim_Clickable()
 {
   int mode_nr;
@@ -1495,6 +1505,9 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
        if (!part->clickable)
          continue;
 
+       if (part->state != ANIM_STATE_RUNNING)
+         continue;
+
        // always handle "any" click events (clicking anywhere on screen) ...
        if (isClickablePart(part, ANIM_EVENT_ANY))
          anything_clicked = part->clicked = TRUE;
@@ -1506,9 +1519,14 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
        if (isClickedPart(part, mx, my, clicked))
        {
 #if 0
-         printf("::: %d.%d CLICKED\n", anim_nr, part_nr);
+         printf("::: %d.%d CLICKED [%d]\n", anim_nr, part_nr,
+                part->control_info.anim_event_action);
 #endif
 
+         // after executing event action, force click to be ignored
+         if (DoGlobalAnim_EventAction(part))
+           return TRUE;
+
          any_part_clicked = TRUE;
 
          if (isClickablePart(part, ANIM_EVENT_SELF))
@@ -1533,9 +1551,23 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
            {
              struct GlobalAnimPartControlInfo *part2 = &anim2->part[part2_nr];
 
+             if (part2->state != ANIM_STATE_RUNNING)
+               continue;
+
              if (isClickablePart(part2, mask))
+             {
                anything_clicked = part2->clicked = TRUE;
 
+#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;
+             }
+
 #if 0
              struct GraphicInfo *c = &part2->control_info;
 
index c793ce13c599ecc2adb7050d98fcf9f7165d9796..6a3a9ac2145d786483a7251a566b31f65086d97c 100644 (file)
@@ -2286,3 +2286,20 @@ void DumpGadgetIdentifiers()
 
   printf("Done.\n");
 }
+
+boolean DoGadgetAction(int image_id)
+{
+  struct GadgetInfo *gi;
+
+  for (gi = gadget_list_first_entry; gi != NULL; gi = gi->next)
+  {
+    if (gi->mapped && gi->image_id == image_id)
+    {
+      gi->callback_action(gi);
+
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
index 5e196192270e3e2de4d58f3f0e0938bb3806911a..5102b792dc81e3d1784a852d2de0618c625af7dc 100644 (file)
@@ -292,5 +292,6 @@ boolean HandleGadgets(int, int, int);
 boolean HandleGadgetsKeyInput(Key);
 
 void DumpGadgetIdentifiers(void);
+boolean DoGadgetAction(int);
 
 #endif /* GADGETS_H */