rnd-20021227-1-src
[rocksndiamonds.git] / src / libgame / misc.c
index 910a7e95ef1d18a725549daad837bbf26a3c9ded..b5dfab4b945ade852c68ec365cba847a1dc5805f 100644 (file)
@@ -436,6 +436,34 @@ char *getStringToLower(char *s)
   return s_copy;
 }
 
+static void printUsage()
+{
+  printf("\n"
+        "Usage: %s [OPTION]... [HOSTNAME [PORT]]\n"
+        "\n"
+        "Options:\n"
+        "  -d, --display HOSTNAME[:SCREEN]  specify X server display\n"
+        "  -b, --basepath DIRECTORY         alternative base DIRECTORY\n"
+        "  -l, --level DIRECTORY            alternative level DIRECTORY\n"
+        "  -g, --graphics DIRECTORY         alternative graphics DIRECTORY\n"
+        "  -s, --sounds DIRECTORY           alternative sounds DIRECTORY\n"
+        "  -m, --music DIRECTORY            alternative music DIRECTORY\n"
+        "  -n, --network                    network multiplayer game\n"
+        "      --serveronly                 only start network server\n"
+        "  -v, --verbose                    verbose mode\n"
+        "      --debug                      display debugging information\n"
+        "  -e, --execute COMMAND            execute batch COMMAND:\n"
+        "\n"
+        "Valid commands for '--execute' option:\n"
+        "  \"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 tape FILE\"                 dump tape data from FILE\n"
+        "  \"autoplay LEVELDIR\"              play level tapes for LEVELDIR\n"
+        "\n",
+        program.command_basename);
+}
+
 void GetOptions(char *argv[])
 {
   char **options_left = &argv[1];
@@ -450,11 +478,11 @@ void GetOptions(char *argv[])
   options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY;
   options.sounds_directory = RO_BASE_PATH "/" SOUNDS_DIRECTORY;
   options.music_directory = RO_BASE_PATH "/" MUSIC_DIRECTORY;
+  options.execute_command = NULL;
   options.serveronly = FALSE;
   options.network = FALSE;
   options.verbose = FALSE;
   options.debug = FALSE;
-  options.debug_command = NULL;
 
   while (*options_left)
   {
@@ -492,22 +520,7 @@ void GetOptions(char *argv[])
       Error(ERR_EXIT_HELP, "unrecognized option '%s'", option);
     else if (strncmp(option, "-help", option_len) == 0)
     {
-      printf("Usage: %s [options] [<server host> [<server port>]]\n"
-            "Options:\n"
-            "  -d, --display <host>[:<scr>]  X server display\n"
-            "  -b, --basepath <directory>    alternative base directory\n"
-            "  -l, --level <directory>       alternative level directory\n"
-            "  -g, --graphics <directory>    alternative graphics directory\n"
-            "  -s, --sounds <directory>      alternative sounds directory\n"
-            "  -m, --music <directory>       alternative music directory\n"
-            "  -n, --network                 network multiplayer game\n"
-            "      --serveronly              only start network server\n"
-            "  -v, --verbose                 verbose mode\n"
-            "      --debug                   display debugging information\n",
-            program.command_basename);
-
-      if (options.debug)
-       printf("      --debug-command <command> execute special command\n");
+      printUsage();
 
       exit(0);
     }
@@ -587,12 +600,12 @@ void GetOptions(char *argv[])
     {
       options.debug = TRUE;
     }
-    else if (strncmp(option, "-debug-command", option_len) == 0)
+    else if (strncmp(option, "-execute", option_len) == 0)
     {
       if (option_arg == NULL)
        Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str);
 
-      options.debug_command = option_arg;
+      options.execute_command = option_arg;
       if (option_arg == next_option)
        options_left++;
     }
@@ -1439,7 +1452,7 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list,
   }
 
   if (list_pos != num_file_list_entries - 1)
-    Error(ERR_EXIT, "inconsistant config list information -- please fix");
+    Error(ERR_EXIT, "inconsistant config list information (%d != %d) -- please fix", list_pos, num_file_list_entries - 1);
 
   return file_list;
 }
@@ -1550,7 +1563,13 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
 
   if (filename == NULL)
   {
-    Error(ERR_WARN, "cannot find artwork file '%s'", basename);
+    int error_mode = ERR_WARN;
+
+    /* we can get away without sounds and music, but not without graphics */
+    if (*listnode == NULL && artwork_info->type == ARTWORK_TYPE_GRAPHICS)
+      error_mode = ERR_EXIT;
+
+    Error(error_mode, "cannot find artwork file '%s'", basename);
     return;
   }
 
@@ -1597,6 +1616,17 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
     addNodeToList(&artwork_info->content_list, (*listnode)->source_filename,
                  *listnode);
   }
+  else
+  {
+    int error_mode = ERR_WARN;
+
+    /* we can get away without sounds and music, but not without graphics */
+    if (artwork_info->type == ARTWORK_TYPE_GRAPHICS)
+      error_mode = ERR_EXIT;
+
+    Error(error_mode, "cannot load artwork file '%s'", basename);
+    return;
+  }
 }
 
 static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info,
@@ -1714,7 +1744,7 @@ void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info)
 {
   int i;
 
-  if (artwork_info->artwork_list == NULL)
+  if (artwork_info == NULL || artwork_info->artwork_list == NULL)
     return;
 
 #if 0
@@ -1771,6 +1801,21 @@ void dumpErrorFile()
 #endif
 
 
+/* ========================================================================= */
+/* some generic helper functions                                             */
+/* ========================================================================= */
+
+void printf_line(char line_char, int line_length)
+{
+  int i;
+
+  for (i=0; i<line_length; i++)
+    printf("%c", line_char);
+
+  printf("\n");
+}
+
+
 /* ========================================================================= */
 /* the following is only for debugging purpose and normally not used         */
 /* ========================================================================= */