rnd-20070925-1-src
[rocksndiamonds.git] / src / libgame / setup.c
index 985c160a245b9f3b16f33ecedb2e9a79b4c99c9c..e8e99a382d2f1b109083b7e94705d0b2e1db2da3 100644 (file)
@@ -498,21 +498,80 @@ char *getLevelSetInfoFilename()
   return NULL;
 }
 
-char *getLevelSetTitleMessageFilename(int nr, boolean initial)
+char *getLevelSetTitleMessageBasename(int nr, boolean initial)
 {
-  static char *filename = NULL;
-  char basename[32];
+  static char basename[32];
 
   sprintf(basename, "%s_%d.txt",
          (initial ? "titlemessage_initial" : "titlemessage"), nr + 1);
 
+  return basename;
+}
+
+char *getLevelSetTitleMessageFilename(int nr, boolean initial)
+{
+  static char *filename = NULL;
+  char *basename;
+  boolean skip_setup_artwork = FALSE;
+
   checked_free(filename);
-  filename = getPath2(getCurrentLevelDir(), basename);
 
+  basename = getLevelSetTitleMessageBasename(nr, initial);
+
+  if (!gfx.override_level_graphics)
+  {
+    /* 1st try: look for special artwork in current level series directory */
+    filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename);
+    if (fileExists(filename))
+      return filename;
+
+    free(filename);
+
+    /* 2nd try: look for message file in current level set directory */
+    filename = getPath2(getCurrentLevelDir(), basename);
+    if (fileExists(filename))
+      return filename;
+
+    free(filename);
+
+    /* check if there is special artwork configured in level series config */
+    if (getLevelArtworkSet(ARTWORK_TYPE_GRAPHICS) != NULL)
+    {
+      /* 3rd try: look for special artwork configured in level series config */
+      filename = getPath2(getLevelArtworkDir(ARTWORK_TYPE_GRAPHICS), basename);
+      if (fileExists(filename))
+       return filename;
+
+      free(filename);
+
+      /* take missing artwork configured in level set config from default */
+      skip_setup_artwork = TRUE;
+    }
+  }
+
+  if (!skip_setup_artwork)
+  {
+    /* 4th try: look for special artwork in configured artwork directory */
+    filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename);
+    if (fileExists(filename))
+      return filename;
+
+    free(filename);
+  }
+
+  /* 5th try: look for default artwork in new default artwork directory */
+  filename = getPath2(getDefaultGraphicsDir(GFX_CLASSIC_SUBDIR), basename);
   if (fileExists(filename))
     return filename;
 
-  return NULL;
+  free(filename);
+
+  /* 6th try: look for default artwork in old default artwork directory */
+  filename = getPath2(options.graphics_directory, basename);
+  if (fileExists(filename))
+    return filename;
+
+  return NULL;         /* cannot find specified artwork file anywhere */
 }
 
 static char *getCorrectedArtworkBasename(char *basename)
@@ -556,7 +615,7 @@ char *getCustomImageFilename(char *basename)
 
   basename = getCorrectedArtworkBasename(basename);
 
-  if (!setup.override_level_graphics)
+  if (!gfx.override_level_graphics)
   {
     /* 1st try: look for special artwork in current level series directory */
     filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename);
@@ -602,6 +661,21 @@ char *getCustomImageFilename(char *basename)
   if (fileExists(filename))
     return filename;
 
+#if CREATE_SPECIAL_EDITION
+  free(filename);
+
+  /* !!! INSERT WARNING HERE TO REPORT MISSING ARTWORK FILES !!! */
+#if 0
+  printf("::: MISSING ARTWORK FILE '%s'\n", basename);
+#endif
+
+  /* 6th try: look for fallback artwork in old default artwork directory */
+  /* (needed to prevent errors when trying to access unused artwork files) */
+  filename = getPath2(options.graphics_directory, GFX_FALLBACK_FILENAME);
+  if (fileExists(filename))
+    return filename;
+#endif
+
   return NULL;         /* cannot find specified artwork file anywhere */
 }
 
@@ -614,7 +688,7 @@ char *getCustomSoundFilename(char *basename)
 
   basename = getCorrectedArtworkBasename(basename);
 
-  if (!setup.override_level_sounds)
+  if (!gfx.override_level_sounds)
   {
     /* 1st try: look for special artwork in current level series directory */
     filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename);
@@ -660,6 +734,16 @@ char *getCustomSoundFilename(char *basename)
   if (fileExists(filename))
     return filename;
 
+#if CREATE_SPECIAL_EDITION
+  free(filename);
+
+  /* 6th try: look for fallback artwork in old default artwork directory */
+  /* (needed to prevent errors when trying to access unused artwork files) */
+  filename = getPath2(options.sounds_directory, SND_FALLBACK_FILENAME);
+  if (fileExists(filename))
+    return filename;
+#endif
+
   return NULL;         /* cannot find specified artwork file anywhere */
 }
 
@@ -672,7 +756,7 @@ char *getCustomMusicFilename(char *basename)
 
   basename = getCorrectedArtworkBasename(basename);
 
-  if (!setup.override_level_music)
+  if (!gfx.override_level_music)
   {
     /* 1st try: look for special artwork in current level series directory */
     filename = getPath3(getCurrentLevelDir(), MUSIC_DIRECTORY, basename);
@@ -718,6 +802,16 @@ char *getCustomMusicFilename(char *basename)
   if (fileExists(filename))
     return filename;
 
+#if CREATE_SPECIAL_EDITION
+  free(filename);
+
+  /* 6th try: look for fallback artwork in old default artwork directory */
+  /* (needed to prevent errors when trying to access unused artwork files) */
+  filename = getPath2(options.music_directory, MUS_FALLBACK_FILENAME);
+  if (fileExists(filename))
+    return filename;
+#endif
+
   return NULL;         /* cannot find specified artwork file anywhere */
 }
 
@@ -756,7 +850,7 @@ char *getCustomMusicDirectory(void)
 
   checked_free(directory);
 
-  if (!setup.override_level_music)
+  if (!gfx.override_level_music)
   {
     /* 1st try: look for special artwork in current level series directory */
     directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY);
@@ -1609,11 +1703,15 @@ static void printSetupFileHash(SetupFileHash *hash)
 
 #define ALLOW_TOKEN_VALUE_SEPARATOR_BEING_WHITESPACE           1
 #define CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING           0
+#define CHECK_TOKEN__WARN_IF_ALREADY_EXISTS_IN_HASH            0
 
 static boolean token_value_separator_found = FALSE;
 #if CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING
 static boolean token_value_separator_warning = FALSE;
 #endif
+#if CHECK_TOKEN__WARN_IF_ALREADY_EXISTS_IN_HASH
+static boolean token_already_exists_warning = FALSE;
+#endif
 
 static boolean getTokenValueFromSetupLineExt(char *line,
                                             char **token_ptr, char **value_ptr,
@@ -1769,13 +1867,16 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
   void *insert_ptr = NULL;
   boolean read_continued_line = FALSE;
   FILE *file;
-  int line_nr = 0;
-  int token_count = 0;
+  int line_nr = 0, token_count = 0, include_count = 0;
 
 #if CHECK_TOKEN_VALUE_SEPARATOR__WARN_IF_MISSING
   token_value_separator_warning = FALSE;
 #endif
 
+#if CHECK_TOKEN__WARN_IF_ALREADY_EXISTS_IN_HASH
+  token_already_exists_warning = FALSE;
+#endif
+
   if (!(file = fopen(filename, MODE_READ)))
   {
     Error(ERR_WARN, "cannot open configuration file '%s'", filename);
@@ -1865,6 +1966,8 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
          free(basepath);
          free(basename);
          free(filename_include);
+
+         include_count++;
        }
        else
        {
@@ -1874,9 +1977,34 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
       else
       {
        if (is_hash)
+       {
+#if CHECK_TOKEN__WARN_IF_ALREADY_EXISTS_IN_HASH
+         char *old_value =
+           getHashEntry((SetupFileHash *)setup_file_data, token);
+
+         if (old_value != NULL)
+         {
+           if (!token_already_exists_warning)
+           {
+             Error(ERR_INFO_LINE, "-");
+             Error(ERR_WARN, "duplicate token(s) found in config file:");
+             Error(ERR_INFO, "- config file: '%s'", filename);
+
+             token_already_exists_warning = TRUE;
+           }
+
+           Error(ERR_INFO, "- token: '%s' (in line %d)", token, line_nr);
+           Error(ERR_INFO, "  old value: '%s'", old_value);
+           Error(ERR_INFO, "  new value: '%s'", value);
+         }
+#endif
+
          setHashEntry((SetupFileHash *)setup_file_data, token, value);
+       }
        else
+       {
          insert_ptr = addListEntry((SetupFileList *)insert_ptr, token, value);
+       }
 
        token_count++;
       }
@@ -1890,7 +2018,12 @@ static boolean loadSetupFileData(void *setup_file_data, char *filename,
     Error(ERR_INFO_LINE, "-");
 #endif
 
-  if (token_count == 0)
+#if CHECK_TOKEN__WARN_IF_ALREADY_EXISTS_IN_HASH
+  if (token_already_exists_warning)
+    Error(ERR_INFO_LINE, "-");
+#endif
+
+  if (token_count == 0 && include_count == 0)
     Error(ERR_WARN, "configuration file '%s' is empty", filename);
 
   if (top_recursion_level)
@@ -2854,8 +2987,10 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
                                          char *level_directory,
                                          char *directory_name)
 {
+#if 0
   static unsigned long progress_delay = 0;
   unsigned long progress_delay_value = 100;    /* (in milliseconds) */
+#endif
   char *directory_path = getPath2(level_directory, directory_name);
   char *filename = getPath2(directory_path, LEVELINFO_FILENAME);
   SetupFileHash *setup_file_hash;
@@ -2956,9 +3091,14 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
      leveldir_new->last_level : leveldir_new->first_level);
 
 #if 1
+#if 1
+  DrawInitTextExt(leveldir_new->name, 150, FC_YELLOW,
+                 leveldir_new->level_group);
+#else
   if (leveldir_new->level_group ||
       DelayReached(&progress_delay, progress_delay_value))
     DrawInitText(leveldir_new->name, 150, FC_YELLOW);
+#endif
 #else
   DrawInitText(leveldir_new->name, 150, FC_YELLOW);
 #endif
@@ -3405,8 +3545,10 @@ void LoadArtworkInfo()
 void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
                                  LevelDirTree *level_node)
 {
+#if 0
   static unsigned long progress_delay = 0;
   unsigned long progress_delay_value = 100;    /* (in milliseconds) */
+#endif
   int type = (*artwork_node)->type;
 
   /* recursively check all level directories for artwork sub-directories */
@@ -3452,6 +3594,9 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
     }
 
 #if 1
+    DrawInitTextExt(level_node->name, 150, FC_YELLOW,
+                   level_node->level_group);
+#else
     if (level_node->level_group ||
        DelayReached(&progress_delay, progress_delay_value))
       DrawInitText(level_node->name, 150, FC_YELLOW);