added enabling/disabling virtual button overlay depending on input events
[rocksndiamonds.git] / src / anim.c
index ff9a8d1f7b443d213cf63e69fe9786a835d4c752..37c7193c21c8745069ed60ce585928f6de14da56 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_SUBMENU         3
-#define ANIM_CLASS_BIT_MENU            4
-#define ANIM_CLASS_BIT_TOONS           5
+#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 NUM_ANIM_CLASSES               6
+#define NUM_ANIM_CLASSES               7
 
 #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_SCORES              (1 << ANIM_CLASS_BIT_SCORES)
 #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)
 
+#define ANIM_CLASS_TOONS_SCORES                (ANIM_CLASS_TOONS |     \
+                                        ANIM_CLASS_SCORES)
+
 #define ANIM_CLASS_TOONS_MENU_MAIN     (ANIM_CLASS_TOONS |     \
                                         ANIM_CLASS_MENU  |     \
                                         ANIM_CLASS_MAIN)
@@ -165,7 +170,8 @@ struct GameModeAnimClass
   { GAME_MODE_SETUP,                   ANIM_CLASS_TOONS_MENU_SUBMENU   },
   { GAME_MODE_PSEUDO_MAINONLY,         ANIM_CLASS_TOONS_MENU_MAIN      },
   { GAME_MODE_PSEUDO_TYPENAME,         ANIM_CLASS_TOONS_MENU_MAIN      },
-  { GAME_MODE_SCORES,                  ANIM_CLASS_TOONS                },
+  { GAME_MODE_PSEUDO_SCORESOLD,                ANIM_CLASS_TOONS_SCORES         },
+  { GAME_MODE_PSEUDO_SCORESNEW,                ANIM_CLASS_TOONS_SCORES         },
 
   { -1,                                        -1                              }
 };
@@ -179,6 +185,7 @@ 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_SCORES,             GAME_MODE_SCORES                },
   { ANIM_CLASS_BIT_SUBMENU,            GAME_MODE_PSEUDO_SUBMENU        },
   { ANIM_CLASS_BIT_MENU,               GAME_MODE_PSEUDO_MENU           },
   { ANIM_CLASS_BIT_TOONS,              GAME_MODE_PSEUDO_TOONS          },
@@ -934,32 +941,23 @@ static void StopGlobalAnimSoundAndMusic(struct GlobalAnimPartControlInfo *part)
   StopGlobalAnimMusic(part);
 }
 
-static boolean matchesAnimEventMask(int bits, int mask)
-{
-  return (bits & (mask & ANIM_EVENT_CLICK_ANIM_ALL) &&
-         bits & (mask & ANIM_EVENT_CLICK_PART_ALL));
-}
-
 static boolean isClickablePart(struct GlobalAnimPartControlInfo *part, int mask)
 {
   struct GraphicInfo *c = &part->control_info;
-
-  boolean clickable_any = FALSE;
-  boolean clickable_self = FALSE;
-  boolean clickable_triggered = FALSE;
-
-  if (mask & ANIM_EVENT_CLICK_ANY)
-    clickable_any = (c->init_event & ANIM_EVENT_CLICK_ANY ||
-                    c->anim_event & ANIM_EVENT_CLICK_ANY);
-
-  if (mask & ANIM_EVENT_CLICK_SELF)
-    clickable_self = (c->init_event & ANIM_EVENT_CLICK_SELF ||
-                     c->anim_event & ANIM_EVENT_CLICK_SELF);
-
-  clickable_triggered = (matchesAnimEventMask(c->init_event, mask) ||
-                        matchesAnimEventMask(c->anim_event, mask));
-
-  return (clickable_any || clickable_self || clickable_triggered);
+  int trigger_mask = ANIM_EVENT_ANIM_MASK | ANIM_EVENT_PART_MASK;
+  int mask_anim_only = mask & ANIM_EVENT_ANIM_MASK;
+
+  if (mask & ANIM_EVENT_ANY)
+    return (c->init_event & ANIM_EVENT_ANY ||
+           c->anim_event & ANIM_EVENT_ANY);
+  else if (mask & ANIM_EVENT_SELF)
+    return (c->init_event & ANIM_EVENT_SELF ||
+           c->anim_event & ANIM_EVENT_SELF);
+  else
+    return ((c->init_event & trigger_mask) == mask ||
+           (c->anim_event & trigger_mask) == mask ||
+           (c->init_event & trigger_mask) == mask_anim_only ||
+           (c->anim_event & trigger_mask) == mask_anim_only);
 }
 
 static boolean isClickedPart(struct GlobalAnimPartControlInfo *part,
@@ -1481,7 +1479,7 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
        if (!part->clickable)
          continue;
 
-       if (isClickablePart(part, ANIM_EVENT_CLICK_ANY))
+       if (isClickablePart(part, ANIM_EVENT_ANY))
          any_part_clicked = part->clicked = TRUE;
 
        if (isClickedPart(part, mx, my, clicked))
@@ -1490,18 +1488,16 @@ static boolean InitGlobalAnim_Clicked(int mx, int my, boolean clicked)
          printf("::: %d.%d CLICKED\n", anim_nr, part_nr);
 #endif
 
-         if (isClickablePart(part, ANIM_EVENT_CLICK_SELF))
+         if (isClickablePart(part, ANIM_EVENT_SELF))
            any_part_clicked = part->clicked = TRUE;
 
          // check if this click is defined to trigger other animations
-         int old_anim_nr = part->old_anim_nr;
-         int old_part_nr = part->old_nr;
-         int mask = ANIM_EVENT_CLICK_ANIM_1 << old_anim_nr;
-
-         if (part->is_base)
-           mask |= ANIM_EVENT_CLICK_PART_ALL;
-         else
-           mask |= ANIM_EVENT_CLICK_PART_1 << old_part_nr;
+         int gic_anim_nr = part->old_anim_nr + 1;      // X as in "anim_X"
+         int gic_part_nr = part->old_nr + 1;           // Y as in "part_Y"
+         int mask = gic_anim_nr << ANIM_EVENT_ANIM_BIT;
+
+         if (!part->is_base)
+           mask |= gic_part_nr << ANIM_EVENT_PART_BIT;
 
          int anim2_nr;