rnd-20030113-1-src
[rocksndiamonds.git] / src / libgame / misc.c
index bde3ea638ccc744881a3d393fdf50190adf174bf..9865b9d6c6e29c7e0a724c687db73a3a8210401c 100644 (file)
@@ -458,6 +458,7 @@ static void printUsage()
         "  \"print graphicsinfo.conf\"        print default graphics config\n"
         "  \"print soundsinfo.conf\"          print default sounds config\n"
         "  \"print musicinfo.conf\"           print default music config\n"
+        "  \"dump level FILE\"                dump level data from FILE\n"
         "  \"dump tape FILE\"                 dump tape data from FILE\n"
         "  \"autoplay LEVELDIR\"              play level tapes for LEVELDIR\n"
         "\n",
@@ -1234,6 +1235,63 @@ char getCharFromKey(Key key)
 }
 
 
+/* ------------------------------------------------------------------------- */
+/* functions to translate string identifiers to integer or boolean value     */
+/* ------------------------------------------------------------------------- */
+
+int get_integer_from_string(char *s)
+{
+  static char *number_text[][3] =
+  {
+    { "0", "zero", "null", },
+    { "1", "one", "first" },
+    { "2", "two", "second" },
+    { "3", "three", "third" },
+    { "4", "four", "fourth" },
+    { "5", "five", "fifth" },
+    { "6", "six", "sixth" },
+    { "7", "seven", "seventh" },
+    { "8", "eight", "eighth" },
+    { "9", "nine", "ninth" },
+    { "10", "ten", "tenth" },
+    { "11", "eleven", "eleventh" },
+    { "12", "twelve", "twelfth" },
+  };
+
+  int i, j;
+  char *s_lower = getStringToLower(s);
+  int result = -1;
+
+  for (i=0; i<13; i++)
+    for (j=0; j<3; j++)
+      if (strcmp(s_lower, number_text[i][j]) == 0)
+       result = i;
+
+  if (result == -1)
+    result = atoi(s);
+
+  free(s_lower);
+
+  return result;
+}
+
+boolean get_boolean_from_string(char *s)
+{
+  char *s_lower = getStringToLower(s);
+  boolean result = FALSE;
+
+  if (strcmp(s_lower, "true") == 0 ||
+      strcmp(s_lower, "yes") == 0 ||
+      strcmp(s_lower, "on") == 0 ||
+      get_integer_from_string(s) == 1)
+    result = TRUE;
+
+  free(s_lower);
+
+  return result;
+}
+
+
 /* ========================================================================= */
 /* functions for generic lists                                               */
 /* ========================================================================= */
@@ -1369,6 +1427,13 @@ boolean FileIsArtworkType(char *basename, int type)
 /* functions for loading artwork configuration information                   */
 /* ========================================================================= */
 
+static int get_parameter_value(int type, char *value)
+{
+  return (type == TYPE_INTEGER ? get_integer_from_string(value) :
+         type == TYPE_BOOLEAN ? get_boolean_from_string(value) :
+         -1);
+}
+
 struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list,
                                           struct ConfigInfo *suffix_list,
                                           int num_file_list_entries)
@@ -1400,7 +1465,8 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list,
 
       for (j=0; j<num_suffix_list_entries; j++)
       {
-       int default_parameter = atoi(suffix_list[j].value);
+       int default_parameter =
+         get_parameter_value(suffix_list[j].type, suffix_list[j].value);
 
        file_list[i].default_parameter[j] = default_parameter;
        file_list[i].parameter[j] = default_parameter;
@@ -1422,7 +1488,8 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list,
          strcmp(&config_list[i].token[len_config_token - len_suffix],
                 suffix_list[j].token) == 0)
       {
-       file_list[list_pos].default_parameter[j] = atoi(config_list[i].value);
+       file_list[list_pos].default_parameter[j] =
+         get_parameter_value(suffix_list[j].type, config_list[i].value);
 
        is_file_entry = FALSE;
        break;
@@ -1500,8 +1567,13 @@ static void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
     {
       char *filename = getTokenValue(setup_file_list, file_list[i].token);
 
-      if (filename == NULL)
+      if (filename)
+       for (j=0; j<num_suffix_list_entries; j++)
+         file_list[i].parameter[j] =
+           get_parameter_value(suffix_list[j].type, suffix_list[j].value);
+      else
        filename = file_list[i].default_filename;
+
       file_list[i].filename = getStringCopy(filename);
 
       for (j=0; j<num_suffix_list_entries; j++)
@@ -1510,7 +1582,8 @@ static void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
        char *value = getTokenValue(setup_file_list, token);
 
        if (value != NULL)
-         file_list[i].parameter[j] = atoi(value);
+         file_list[i].parameter[j] =
+           get_parameter_value(suffix_list[j].type, value);
 
        free(token);
       }