added graphical panel values for time and health (mainly for MM engine)
[rocksndiamonds.git] / src / libgame / misc.c
index e51f1f67d1ea625ac144be3676f9e382b50a06d4..72e4f051bf47a44f17b66d28be20fa693e151274 100644 (file)
@@ -571,7 +571,7 @@ char *getLoginName()
     if (GetUserName(login_name, &buffer_size) == 0)
       strcpy(login_name, ANONYMOUS_NAME);
   }
-#else
+#elif defined(PLATFORM_UNIX) && !defined(PLATFORM_ANDROID)
   if (login_name == NULL)
   {
     struct passwd *pwd;
@@ -581,6 +581,8 @@ char *getLoginName()
     else
       login_name = getStringCopy(pwd->pw_name);
   }
+#else
+  login_name = ANONYMOUS_NAME;
 #endif
 
   return login_name;
@@ -985,6 +987,7 @@ void GetOptions(int argc, char *argv[],
   options.sounds_directory   = getPath2(ro_base_path, SOUNDS_DIRECTORY);
   options.music_directory    = getPath2(ro_base_path, MUSIC_DIRECTORY);
   options.docs_directory     = getPath2(ro_base_path, DOCS_DIRECTORY);
+  options.conf_directory     = getPath2(ro_base_path, CONF_DIRECTORY);
 
   options.execute_command = NULL;
   options.special_flags = NULL;
@@ -1002,6 +1005,12 @@ void GetOptions(int argc, char *argv[],
   if (*options_left == NULL)   /* no options given -- enable verbose mode */
     options.verbose = TRUE;
 #endif
+#endif
+
+#if DEBUG
+#if defined(PLATFORM_ANDROID)
+  options.debug = TRUE;
+#endif
 #endif
 
   while (*options_left)
@@ -1063,6 +1072,7 @@ void GetOptions(int argc, char *argv[],
       options.sounds_directory   = getPath2(ro_base_path, SOUNDS_DIRECTORY);
       options.music_directory    = getPath2(ro_base_path, MUSIC_DIRECTORY);
       options.docs_directory     = getPath2(ro_base_path, DOCS_DIRECTORY);
+      options.conf_directory     = getPath2(ro_base_path, CONF_DIRECTORY);
     }
     else if (strncmp(option, "-levels", option_len) == 0)
     {
@@ -1210,6 +1220,10 @@ void Error(int mode, char *format, ...)
                      ANDROID_LOG_UNKNOWN);
 #endif
 
+  /* display debug messages only when running in debug mode */
+  if (mode & ERR_DEBUG && !options.debug)
+    return;
+
   /* display warnings only when running in verbose mode */
   if (mode & ERR_WARN && !options.verbose)
     return;
@@ -1611,8 +1625,14 @@ void translate_keyname(Key *keysym, char **x11name, char **name, int mode)
     { KSYM_Page_Down,  "XK_Page_Down",         "page down" },
 
 #if defined(TARGET_SDL2)
+    { KSYM_Select,     "XK_Select",            "select" },
     { KSYM_Menu,       "XK_Menu",              "menu" },        /* menu key */
     { KSYM_Back,       "XK_Back",              "back" },        /* back key */
+    { KSYM_PlayPause,  "XK_PlayPause",         "play/pause" },
+#if defined(PLATFORM_ANDROID)
+    { KSYM_Rewind,     "XK_Rewind",            "rewind" },
+    { KSYM_FastForward,        "XK_FastForward",       "fast forward" },
+#endif
 #endif
 
     /* ASCII 0x20 to 0x40 keys (except numbers) */
@@ -2655,6 +2675,30 @@ char *get_special_base_token(struct ArtworkListInfo *artwork_info, char *token)
     { "global.anim_6"  },
     { "global.anim_7"  },
     { "global.anim_8"  },
+    { "global.anim_9"  },
+    { "global.anim_10" },
+    { "global.anim_11" },
+    { "global.anim_12" },
+    { "global.anim_13" },
+    { "global.anim_14" },
+    { "global.anim_15" },
+    { "global.anim_16" },
+    { "global.anim_17" },
+    { "global.anim_18" },
+    { "global.anim_19" },
+    { "global.anim_20" },
+    { "global.anim_21" },
+    { "global.anim_22" },
+    { "global.anim_23" },
+    { "global.anim_24" },
+    { "global.anim_25" },
+    { "global.anim_26" },
+    { "global.anim_27" },
+    { "global.anim_28" },
+    { "global.anim_29" },
+    { "global.anim_30" },
+    { "global.anim_31" },
+    { "global.anim_32" },
 
     { NULL             }
   };
@@ -2716,25 +2760,6 @@ static boolean string_has_parameter(char *s, char *s_contained)
   return string_has_parameter(substring, s_contained);
 }
 
-static boolean string_has_anim_parameter(char *s, char *s_contained)
-{
-  char *s_copy = getStringCopy(s);
-  boolean has_parameter = FALSE;
-  int len_s_copy = strlen(s_copy);
-  int i;
-
-  // replace all "anim" and "part" numbers with 'X'
-  for (i = 0; i < len_s_copy; i++)
-    if (s_copy[i] >= '1' && s_copy[i] <= '8')
-      s_copy[i] = 'X';
-
-  has_parameter = string_has_parameter(s_copy, s_contained);
-
-  checked_free(s_copy);
-
-  return has_parameter;
-}
-
 int get_anim_parameter_value(char *s)
 {
   char *pattern_1 = "click:anim_";
@@ -2745,47 +2770,61 @@ int get_anim_parameter_value(char *s)
 
   matching_char = strstr(s_ptr, pattern_1);
   if (matching_char == NULL)
-    return result;
+    return ANIM_EVENT_NONE;
 
   s_ptr = matching_char + strlen(pattern_1);
-  if (*s_ptr == '\0')
-    return result;
 
-  // check for "click:anim_X"
-  if (*s_ptr >= '1' && *s_ptr <= '8')
+  // check for main animation number ("anim_X" or "anim_XX")
+  if (*s_ptr >= '0' && *s_ptr <= '9')
   {
-    result |= ANIM_EVENT_CLICK_ANIM_1 << (*s_ptr - '1');
-    s_ptr++;
+    int gic_anim_nr = (*s_ptr++ - '0');
 
-    // check for "click:anim_X.part_X"
-    if (strPrefix(s_ptr, pattern_2))
+    if (*s_ptr >= '0' && *s_ptr <= '9')
+      gic_anim_nr = 10 * gic_anim_nr + (*s_ptr++ - '0');
+
+    if (gic_anim_nr < 1 || gic_anim_nr > MAX_GLOBAL_ANIMS)
+      return ANIM_EVENT_NONE;
+
+    result |= gic_anim_nr << ANIM_EVENT_ANIM_BIT;
+  }
+  else
+  {
+    // invalid main animation number specified
+
+    return ANIM_EVENT_NONE;
+  }
+
+  // check for animation part number ("part_X" or "part_XX") (optional)
+  if (strPrefix(s_ptr, pattern_2))
+  {
+    s_ptr += strlen(pattern_2);
+
+    if (*s_ptr >= '0' && *s_ptr <= '9')
     {
-      s_ptr += strlen(pattern_2);
+      int gic_part_nr = (*s_ptr++ - '0');
 
-      if (*s_ptr >= '1' && *s_ptr <= '8')
-      {
-       result |= ANIM_EVENT_CLICK_PART_1 << (*s_ptr - '1');
-       s_ptr++;
-      }
+      if (*s_ptr >= '0' && *s_ptr <= '9')
+       gic_part_nr = 10 * gic_part_nr + (*s_ptr++ - '0');
+
+      if (gic_part_nr < 1 || gic_part_nr > MAX_GLOBAL_ANIM_PARTS)
+       return ANIM_EVENT_NONE;
+
+      result |= gic_part_nr << ANIM_EVENT_PART_BIT;
     }
     else
     {
-      // no "part_X" specified -- trigger by click on any part
-      result |= ANIM_EVENT_CLICK_PART_ALL;
+      // invalid animation part number specified
+
+      return ANIM_EVENT_NONE;
     }
   }
 
   /* discard result if next character is neither delimiter nor whitespace */
   if (!(*s_ptr == ',' || *s_ptr == '\0' ||
        *s_ptr == ' ' || *s_ptr == '\t'))
-    return get_anim_parameter_value(s_ptr);
+    return ANIM_EVENT_NONE;
 
-  /* check if string contains another parameter string after a comma */
-  s_ptr = strchr(s_ptr, ',');
-  if (s_ptr == NULL)   /* string does not contain a comma */
-    return result;
-
-  return result | get_anim_parameter_value(s_ptr);
+  return result;
 }
 
 int get_parameter_value(char *value_raw, char *suffix, int type)
@@ -2861,14 +2900,13 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
     result = ANIM_EVENT_DEFAULT;
 
     if (string_has_parameter(value, "any"))
-      result |= ANIM_EVENT_CLICK_ANY;
+      result |= ANIM_EVENT_ANY;
 
     if (string_has_parameter(value, "click"))
-      result |= ANIM_EVENT_CLICK_SELF;
+      result |= ANIM_EVENT_SELF;
 
-    if (string_has_anim_parameter(value, "click:anim_X") ||
-       string_has_anim_parameter(value, "click:anim_X.part_X"))
-      result |= get_anim_parameter_value(value);
+    // add optional "click:anim_X" or "click:anim_X.part_X" parameter
+    result |= get_anim_parameter_value(value);
   }
   else if (strEqual(suffix, ".class"))
   {
@@ -2884,6 +2922,9 @@ int get_parameter_value(char *value_raw, char *suffix, int type)
 
     if (string_has_parameter(value, "inner_corners"))
       result |= STYLE_INNER_CORNERS;
+
+    if (string_has_parameter(value, "reverse"))
+      result |= STYLE_REVERSE;
   }
   else if (strEqual(suffix, ".fade_mode"))
   {