rnd-20030829-R-src
[rocksndiamonds.git] / src / libgame / misc.c
index f487175728d274d820630ec09a205d9d7a2c846e..70b2a5d6b802ccbcbe16894a44e5778ced15cfaf 100644 (file)
@@ -30,6 +30,7 @@
 #include "setup.h"
 #include "random.h"
 #include "text.h"
+#include "image.h"
 
 
 /* ------------------------------------------------------------------------- */
@@ -332,6 +333,7 @@ unsigned int get_random_number(int nr, unsigned int max)
 /* system info functions                                                     */
 /* ------------------------------------------------------------------------- */
 
+#if !defined(PLATFORM_MSDOS)
 static char *get_corrected_real_name(char *real_name)
 {
   char *real_name_new = checked_malloc(MAX_USERNAME_LEN + 1);
@@ -364,6 +366,7 @@ static char *get_corrected_real_name(char *real_name)
 
   return real_name_new;
 }
+#endif
 
 char *getLoginName()
 {
@@ -1801,8 +1804,16 @@ static void read_token_parameters(SetupFileHash *setup_file_hash,
     /* mark config file token as well known from default config */
     setHashEntry(setup_file_hash, file_list_entry->token, known_token_value);
   }
+#if 0
   else
+  {
+    if (strcmp(file_list_entry->filename,
+              file_list_entry->default_filename) != 0)
+      printf("___ resetting '%s' to default\n", file_list_entry->token);
+
     setString(&file_list_entry->filename, file_list_entry->default_filename);
+  }
+#endif
 
   /* check for config tokens that can be build by base token and suffixes */
   for (i=0; suffix_list[i].token != NULL; i++)
@@ -1869,7 +1880,8 @@ static void add_property_mapping(struct PropertyMapping **list,
   new_list_entry->artwork_index = artwork_index;
 }
 
-void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
+static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info,
+                                         char *filename)
 {
   struct FileInfo *file_list = artwork_info->file_list;
   struct ConfigInfo *suffix_list = artwork_info->suffix_list;
@@ -1885,55 +1897,17 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
   int num_ext2_suffixes = artwork_info->num_ext2_suffixes;
   int num_ext3_suffixes = artwork_info->num_ext3_suffixes;
   int num_ignore_tokens = artwork_info->num_ignore_tokens;
-  char *filename = getCustomArtworkConfigFilename(artwork_info->type);
   SetupFileHash *setup_file_hash, *extra_file_hash;
   char *known_token_value = KNOWN_TOKEN_VALUE;
   int i, j, k, l;
 
-#if 0
-  printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename);
-#endif
-
-  /* always start with reliable default values */
-  for (i=0; i<num_file_list_entries; i++)
-  {
-    setString(&file_list[i].filename, file_list[i].default_filename);
-
-    for (j=0; j<num_suffix_list_entries; j++)
-      setString(&file_list[i].parameter[j], file_list[i].default_parameter[j]);
-
-    file_list[i].redefined = FALSE;
-  }
-
-  /* free previous dynamic artwork file array */
-  if (artwork_info->dynamic_file_list != NULL)
-  {
-    for (i=0; i<artwork_info->num_dynamic_file_list_entries; i++)
-    {
-      free(artwork_info->dynamic_file_list[i].token);
-      free(artwork_info->dynamic_file_list[i].filename);
-      free(artwork_info->dynamic_file_list[i].parameter);
-    }
-
-    free(artwork_info->dynamic_file_list);
-    artwork_info->dynamic_file_list = NULL;
-
-    FreeCustomArtworkList(artwork_info, &artwork_info->dynamic_artwork_list,
-                         &artwork_info->num_dynamic_file_list_entries);
-  }
-
-  /* free previous property mapping */
-  if (artwork_info->property_mapping != NULL)
-  {
-    free(artwork_info->property_mapping);
-
-    artwork_info->property_mapping = NULL;
-    artwork_info->num_property_mapping_entries = 0;
-  }
-
   if (filename == NULL)
     return;
 
+#if 0
+  printf("::: LoadArtworkConfigFromFilename: '%s'\n", filename);
+#endif
+
   if ((setup_file_hash = loadSetupFileHash(filename)) == NULL)
     return;
 
@@ -2191,11 +2165,11 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
     }
     END_HASH_ITERATION(extra_file_hash, itr)
 
-#if DEBUG
-    if (dynamic_tokens_found)
+    if (options.debug && dynamic_tokens_found)
     {
       Error(ERR_RETURN_LINE, "-");
-      Error(ERR_RETURN, "dynamic token(s) found:");
+      Error(ERR_RETURN, "dynamic token(s) found in config file:");
+      Error(ERR_RETURN, "- config file: '%s'", filename);
 
       for (list = setup_file_list; list != NULL; list = list->next)
       {
@@ -2207,7 +2181,6 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
 
       Error(ERR_RETURN_LINE, "-");
     }
-#endif
 
     if (unknown_tokens_found)
     {
@@ -2243,6 +2216,70 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
 #endif
 }
 
+void LoadArtworkConfig(struct ArtworkListInfo *artwork_info)
+{
+  struct FileInfo *file_list = artwork_info->file_list;
+  int num_file_list_entries = artwork_info->num_file_list_entries;
+  int num_suffix_list_entries = artwork_info->num_suffix_list_entries;
+  char *filename_base = UNDEFINED_FILENAME, *filename_local;
+  int i, j;
+
+#if 0
+  printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename);
+#endif
+
+  /* always start with reliable default values */
+  for (i=0; i<num_file_list_entries; i++)
+  {
+    setString(&file_list[i].filename, file_list[i].default_filename);
+
+    for (j=0; j<num_suffix_list_entries; j++)
+      setString(&file_list[i].parameter[j], file_list[i].default_parameter[j]);
+
+    file_list[i].redefined = FALSE;
+  }
+
+  /* free previous dynamic artwork file array */
+  if (artwork_info->dynamic_file_list != NULL)
+  {
+    for (i=0; i<artwork_info->num_dynamic_file_list_entries; i++)
+    {
+      free(artwork_info->dynamic_file_list[i].token);
+      free(artwork_info->dynamic_file_list[i].filename);
+      free(artwork_info->dynamic_file_list[i].parameter);
+    }
+
+    free(artwork_info->dynamic_file_list);
+    artwork_info->dynamic_file_list = NULL;
+
+    FreeCustomArtworkList(artwork_info, &artwork_info->dynamic_artwork_list,
+                         &artwork_info->num_dynamic_file_list_entries);
+  }
+
+  /* free previous property mapping */
+  if (artwork_info->property_mapping != NULL)
+  {
+    free(artwork_info->property_mapping);
+
+    artwork_info->property_mapping = NULL;
+    artwork_info->num_property_mapping_entries = 0;
+  }
+
+  if (!SETUP_OVERRIDE_ARTWORK(setup, artwork_info->type))
+  {
+    /* first look for special artwork configured in level series config */
+    filename_base = getCustomArtworkLevelConfigFilename(artwork_info->type);
+
+    if (fileExists(filename_base))
+      LoadArtworkConfigFromFilename(artwork_info, filename_base);
+  }
+
+  filename_local = getCustomArtworkConfigFilename(artwork_info->type);
+
+  if (filename_local != NULL && strcmp(filename_base, filename_local) != 0)
+    LoadArtworkConfigFromFilename(artwork_info, filename_local);
+}
+
 static void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info,
                                   struct ListNodeInfo **listnode)
 {
@@ -2273,7 +2310,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
                                    char *basename)
 {
   char *init_text[] =
-  { "",
+  {
     "Loading graphics:",
     "Loading sounds:",
     "Loading music:"
@@ -2282,18 +2319,15 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
   ListNode *node;
   char *filename = getCustomArtworkFilename(basename, artwork_info->type);
 
-#if 1
-    if (strcmp(basename, "RocksScreen.pcx") == 0)
-      printf("::: got filename '%s'\n", filename);
-#endif
-
   if (filename == NULL)
   {
     int error_mode = ERR_WARN;
 
+#if 1
     /* 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;
+#endif
 
     Error(error_mode, "cannot find artwork file '%s'", basename);
     return;
@@ -2306,11 +2340,8 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
        This usually means that this artwork does not exist in this artwork set
        and a fallback to the existing artwork is done. */
 
-#if 1
-#if 1
-    if (strcmp(basename, "RocksScreen.pcx") == 0)
-#endif
-      printf("[artwork '%s' already exists (same list entry)]\n", filename);
+#if 0
+    printf("[artwork '%s' already exists (same list entry)]\n", filename);
 #endif
 
     return;
@@ -2332,6 +2363,10 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
       return;
   }
 
+#if 0
+  printf("::: %s: '%s'\n", init_text[artwork_info->type], basename);
+#endif
+
   DrawInitText(init_text[artwork_info->type], 120, FC_GREEN);
   DrawInitText(basename, 150, FC_YELLOW);
 
@@ -2349,9 +2384,11 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info,
   {
     int error_mode = ERR_WARN;
 
+#if 1
     /* we can get away without sounds and music, but not without graphics */
     if (artwork_info->type == ARTWORK_TYPE_GRAPHICS)
       error_mode = ERR_EXIT;
+#endif
 
     Error(error_mode, "cannot load artwork file '%s'", basename);
     return;
@@ -2418,9 +2455,28 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info)
 #endif
 
   for(i=0; i<num_file_list_entries; i++)
+  {
+#if 0
+    if (strcmp(file_list[i].token, "background") == 0)
+      printf("::: '%s' -> '%s'\n", file_list[i].token, file_list[i].filename);
+#endif
+
     LoadArtworkToList(artwork_info, &artwork_info->artwork_list[i],
                      file_list[i].filename, i);
 
+#if 0
+    if (artwork_info->artwork_list[i] == NULL &&
+       strcmp(file_list[i].default_filename, file_list[i].filename) != 0)
+    {
+      Error(ERR_WARN, "trying default artwork file '%s'",
+           file_list[i].default_filename);
+
+      LoadArtworkToList(artwork_info, &artwork_info->artwork_list[i],
+                       file_list[i].default_filename, i);
+    }
+#endif
+  }
+
 #if 0
   printf("DEBUG: reloading %d dynamic artwork files ...\n",
         num_dynamic_file_list_entries);