added several new event types that can trigger global animations
authorHolger Schemel <info@artsoft.org>
Thu, 14 Mar 2019 01:15:36 +0000 (02:15 +0100)
committerHolger Schemel <info@artsoft.org>
Thu, 14 Mar 2019 07:32:36 +0000 (08:32 +0100)
This change adds the following new global animations event types,
which can be used like the already existing "click:anim_X.part_Y":

* init:anim_X.part_Y  - triggers when animation is initialized
* start:anim_X.part_Y - triggers when animation is started
* end:anim_X.part_Y   - triggers when animation ends
* post:anim_X.part_Y  - triggers when animation post delay ends

The second part ".part_Y" is optional; if missing, events for every
animation part will trigger the animation for which this event is
defined.

The "init" event will trigger even if the animation is not yet
displayed, but starts waiting for its "init_delay" or "init_event",
while the "start" event will trigger when the first frame of the
animation is displayed.

The "end" event will trigger when the last frame of the animation is
displayed (either because the animation has stopped due to a click
event, due to the "anim_delay" being finished or because the animation
has completely moved off the screen), while the "post" event will
trigger when the "post_delay" is completely finished.

src/anim.c
src/files.c
src/libgame/system.h

index cb2dc8816789d722f60e419e35dc54fd784d7bb5..fcf7ef36f13633a155a261af15213d1bae404508 100644 (file)
@@ -1133,6 +1133,21 @@ static void InitGlobalAnim_Triggered(struct GlobalAnimPartControlInfo *part,
   }
 }
 
+static void HandleGlobalAnimEvent(struct GlobalAnimPartControlInfo *part,
+                                 int event_value, char *info_text)
+{
+#if DEBUG_ANIM_EVENTS
+  printf("::: %d.%d %s\n", part->old_anim_nr + 1, part->old_nr + 1, info_text);
+#endif
+
+  boolean anything_clicked = FALSE;
+  boolean any_event_action = FALSE;
+
+  // check if this event is defined to trigger other animations
+  InitGlobalAnim_Triggered(part, &anything_clicked, &any_event_action,
+                          event_value);
+}
+
 static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
                                 int state)
 {
@@ -1249,7 +1264,15 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
 
     if (part->init_delay_counter == 0 &&
        !part->init_event_state)
+    {
       PlayGlobalAnimSoundAndMusic(part);
+
+      HandleGlobalAnimEvent(part, ANIM_EVENT_START, "START [ANIM]");
+    }
+    else
+    {
+      HandleGlobalAnimEvent(part, ANIM_EVENT_INIT, "START [INIT_DELAY/EVENT]");
+    }
   }
 
   if (part->clicked &&
@@ -1282,6 +1305,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
       part->init_event_state = FALSE;
 
       PlayGlobalAnimSoundAndMusic(part);
+
+      HandleGlobalAnimEvent(part, ANIM_EVENT_START, "START [ANIM]");
     }
 
     return ANIM_STATE_WAITING;
@@ -1308,6 +1333,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
     {
       StopGlobalAnimSoundAndMusic(part);
 
+      HandleGlobalAnimEvent(part, ANIM_EVENT_END, "END [ANIM/OFF-SCREEN]");
+
       part->post_delay_counter =
        (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random));
 
@@ -1329,6 +1356,8 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
 
       StopGlobalAnimSoundAndMusic(part);
 
+      HandleGlobalAnimEvent(part, ANIM_EVENT_END, "END [ANIM_DELAY/EVENT]");
+
       part->post_delay_counter =
        (c->post_delay_fixed + GetSimpleRandom(c->post_delay_random));
 
@@ -1345,7 +1374,11 @@ static int HandleGlobalAnim_Part(struct GlobalAnimPartControlInfo *part,
     part->post_delay_counter--;
 
     if (part->post_delay_counter == 0)
+    {
+      HandleGlobalAnimEvent(part, ANIM_EVENT_POST, "END [POST_DELAY]");
+
       return ANIM_STATE_RESTART;
+    }
 
     return ANIM_STATE_WAITING;
   }
index 9f20487fb0e4f5aebb8bd2108b2f7e19040db114..5ec5f7f063e83c9454f7e2d85b3be2b8fb5b2414 100644 (file)
@@ -10066,11 +10066,19 @@ static int get_anim_parameter_value(char *s)
 {
   int event_value[] =
   {
-    ANIM_EVENT_CLICK
+    ANIM_EVENT_CLICK,
+    ANIM_EVENT_INIT,
+    ANIM_EVENT_START,
+    ANIM_EVENT_END,
+    ANIM_EVENT_POST
   };
   char *pattern_1[] =
   {
-    "click:anim_"
+    "click:anim_",
+    "init:anim_",
+    "start:anim_",
+    "end:anim_",
+    "post:anim_"
   };
   char *pattern_2 = ".part_";
   char *matching_char = NULL;
index d0584d4b922d331048d2cbea3ca265ccdb8fe928..8bcafb8269c1517ecaf30a8734f9db2668059351 100644 (file)
 #define ANIM_EVENT_SELF                (1 << 16)
 #define ANIM_EVENT_ANY         (1 << 17)
 #define ANIM_EVENT_CLICK       (1 << 18)
+#define ANIM_EVENT_INIT                (1 << 19)
+#define ANIM_EVENT_START       (1 << 20)
+#define ANIM_EVENT_END         (1 << 21)
+#define ANIM_EVENT_POST                (1 << 22)
 
 // anim number: bits 0-7
 // part number: bits 8-15