added support for more event types for global animations (yet to be added)
[rocksndiamonds.git] / src / files.c
index 1820761192872aace9e9a9867fbd0a82bb0e8997..9f20487fb0e4f5aebb8bd2108b2f7e19040db114 100644 (file)
@@ -10014,6 +10014,17 @@ int GetGlobalAnimEventValue(int list_pos, int value_pos)
   return gaeli->event_value[value_pos];
 }
 
+int GetGlobalAnimEventValueCount(int list_pos)
+{
+  if (list_pos == ANIM_EVENT_UNDEFINED)
+    return 0;
+
+  struct GlobalAnimEventInfo *gaei = &global_anim_event_info;
+  struct GlobalAnimEventListInfo *gaeli = gaei->event_list[list_pos];
+
+  return gaeli->num_event_values;
+}
+
 // This function checks if a string <s> of the format "string1, string2, ..."
 // exactly contains a string <s_contained>.
 
@@ -10053,17 +10064,35 @@ static boolean string_has_parameter(char *s, char *s_contained)
 
 static int get_anim_parameter_value(char *s)
 {
-  char *pattern_1 = "click:anim_";
+  int event_value[] =
+  {
+    ANIM_EVENT_CLICK
+  };
+  char *pattern_1[] =
+  {
+    "click:anim_"
+  };
   char *pattern_2 = ".part_";
   char *matching_char = NULL;
   char *s_ptr = s;
+  int pattern_1_len = 0;
   int result = ANIM_EVENT_NONE;
+  int i;
+
+  for (i = 0; i < ARRAY_SIZE(event_value); i++)
+  {
+    matching_char = strstr(s_ptr, pattern_1[i]);
+    pattern_1_len = strlen(pattern_1[i]);
+    result = event_value[i];
+
+    if (matching_char != NULL)
+      break;
+  }
 
-  matching_char = strstr(s_ptr, pattern_1);
   if (matching_char == NULL)
     return ANIM_EVENT_NONE;
 
-  s_ptr = matching_char + strlen(pattern_1);
+  s_ptr = matching_char + pattern_1_len;
 
   // check for main animation number ("anim_X" or "anim_XX")
   if (*s_ptr >= '0' && *s_ptr <= '9')
@@ -10118,6 +10147,39 @@ static int get_anim_parameter_value(char *s)
   return result;
 }
 
+static int get_anim_parameter_values(char *s)
+{
+  int list_pos = ANIM_EVENT_UNDEFINED;
+  int event_value = ANIM_EVENT_DEFAULT;
+
+  if (string_has_parameter(s, "any"))
+    event_value |= ANIM_EVENT_ANY;
+
+  if (string_has_parameter(s, "click:self") ||
+      string_has_parameter(s, "click") ||
+      string_has_parameter(s, "self"))
+    event_value |= ANIM_EVENT_SELF;
+
+  // if animation event found, add it to global animation event list
+  if (event_value != ANIM_EVENT_NONE)
+    list_pos = AddGlobalAnimEventValue(list_pos, event_value);
+
+  while (s != NULL)
+  {
+    // add optional "click:anim_X" or "click:anim_X.part_X" parameter
+    event_value = get_anim_parameter_value(s);
+
+    // if animation event found, add it to global animation event list
+    if (event_value != ANIM_EVENT_NONE)
+      list_pos = AddGlobalAnimEventValue(list_pos, event_value);
+
+    // continue with next part of the string, starting with next comma
+    s = strchr(s + 1, ',');
+  }
+
+  return list_pos;
+}
+
 static int get_anim_action_parameter_value(char *token)
 {
   int result = getImageIDFromToken(token);
@@ -10215,19 +10277,7 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
   else if (strEqual(suffix, ".init_event") ||
           strEqual(suffix, ".anim_event"))
   {
-    result = ANIM_EVENT_DEFAULT;
-
-    if (string_has_parameter(value, "any"))
-      result |= ANIM_EVENT_ANY;
-
-    if (string_has_parameter(value, "click"))
-      result |= ANIM_EVENT_SELF;
-
-    // add optional "click:anim_X" or "click:anim_X.part_X" parameter
-    result |= get_anim_parameter_value(value);
-
-    // final result is position in global animation event list
-    result = AddGlobalAnimEventValue(ANIM_EVENT_UNDEFINED, result);
+    result = get_anim_parameter_values(value);
   }
   else if (strEqual(suffix, ".init_event_action") ||
           strEqual(suffix, ".anim_event_action"))