added event actions (active screen elements) for global animations
authorHolger Schemel <info@artsoft.org>
Sun, 10 Jun 2018 21:21:00 +0000 (23:21 +0200)
committerHolger Schemel <info@artsoft.org>
Sun, 17 Jun 2018 22:02:49 +0000 (00:02 +0200)
This change adds more event actions to the "anim_event_action" option
for clickable global animations, this time adding active screen elements
(currently limited to a selection of screen elements in the main menu).

For example, you can now use:

global.anim_1.part_1.MAIN.anim_event:            click
global.anim_1.part_1.MAIN.anim_event_action:     menu.button_game

When clicking this global animation (on the main menu screen), the
game will be started (by triggering the "start game" menu button).

To dump a list of all available event actions for global animations,
blindly type the "cheat mode" style shortcut ":dump-event-actions" or
":dea" in the main menu.

src/anim.c
src/events.c
src/screens.c
src/screens.h

index 0043a3e9c864c6b516e6183540c9dff26426de0d..a38a1c3dca867fd5bc10cb0841aea26829c3dc87 100644 (file)
@@ -1450,7 +1450,8 @@ static boolean DoGlobalAnim_EventAction(struct GlobalAnimPartControlInfo *part)
   if (anim_event_action == -1)
     return FALSE;
 
-  return DoGadgetAction(anim_event_action);
+  return (DoGadgetAction(anim_event_action) ||
+         DoScreenAction(anim_event_action));
 }
 
 static void InitGlobalAnim_Clickable()
index 22cfdcd12ebadba2d7084591f3d6ec9bac91ab12..b21f3706fef27c21a7d176820c7a117733aa0066 100644 (file)
@@ -1762,11 +1762,12 @@ static void HandleKeysSpecial(Key key)
   }
 
   /* special key shortcuts for all game modes */
-  if (is_string_suffix(cheat_input, ":dump-gadget-ids") ||
-      is_string_suffix(cheat_input, ":dgi") ||
-      is_string_suffix(cheat_input, ":DGI"))
+  if (is_string_suffix(cheat_input, ":dump-event-actions") ||
+      is_string_suffix(cheat_input, ":dea") ||
+      is_string_suffix(cheat_input, ":DEA"))
   {
     DumpGadgetIdentifiers();
+    DumpScreenIdentifiers();
   }
 }
 
index 89b9d3d48c515478dc2894924fd96ef9de463004..80c10ca96f67415c723070b7d8bc723ee42e1a37 100644 (file)
@@ -8308,3 +8308,50 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       break;
   }
 }
+
+void DumpScreenIdentifiers()
+{
+  int i;
+
+  Print("Active screen elements on current screen:\n");
+
+  for (i = 0; main_controls[i].nr != -1; i++)
+  {
+    struct MainControlInfo *mci = &main_controls[i];
+
+    if (mci->button_graphic != -1)
+    {
+      char *token = getTokenFromImageID(mci->button_graphic);
+
+      Print("- '%s'\n", token);
+    }
+  }
+
+  Print("Done.\n");
+}
+
+boolean DoScreenAction(int image_id)
+{
+  int i;
+
+  if (game_status != GAME_MODE_MAIN)
+    return FALSE;
+
+  for (i = 0; main_controls[i].nr != -1; i++)
+  {
+    struct MainControlInfo *mci = &main_controls[i];
+    struct MenuPosInfo *pos = mci->pos_button;
+
+    if (mci->button_graphic == image_id)
+    {
+      int x = mSX + pos->x;
+      int y = mSY + pos->y;
+
+      HandleMainMenu(x, y, 0, 0, MB_MENU_CHOICE);
+
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
index 418c41f4f07afe4f1ad1d1878339d3d997cff224..f314fb3b589441116b7ccdb151bfb0eab2855cae 100644 (file)
@@ -42,4 +42,7 @@ void FreeScreenGadgets();
 
 void setHideRelatedSetupEntries();
 
+void DumpScreenIdentifiers(void);
+boolean DoScreenAction(int);
+
 #endif /* SCREENS_H */