rnd-20070424-1-src
[rocksndiamonds.git] / src / files.c
index aa9cdb4cc5558fd4122b90e53eb1fec18ab8f4a2..57368d34ceb73de23b0a82aa4ae49de96e23764b 100644 (file)
@@ -1694,7 +1694,8 @@ static int getFileTypeFromBasename(char *basename)
     return LEVEL_FILE_TYPE_SP;
 
   /* check for typical filename of a Diamond Caves II level package file */
-  if (strEqualSuffix(basename, ".dc2"))
+  if (strEqualSuffix(basename, ".dc") ||
+      strEqualSuffix(basename, ".dc2"))
     return LEVEL_FILE_TYPE_DC;
 
   /* ---------- try to determine file type from filesize ---------- */
@@ -5758,12 +5759,10 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level,
     return;
   }
 
+  // fseek(file, 0x0000, SEEK_SET);
+
   if (level_file_info->packed)
   {
-    int position_first_level = 0x00fa;
-    int extra_bytes = 4;
-    int skip_bytes;
-
     /* read "magic bytes" from start of file */
     fgets(magic_bytes, num_magic_bytes + 1, file);
 
@@ -5772,38 +5771,56 @@ static void LoadLevelFromFileInfo_DC(struct LevelInfo *level,
     {
       level->no_valid_file = TRUE;
 
-      Error(ERR_WARN, "unknown level file '%s' -- using empty level", filename);
+      Error(ERR_WARN, "unknown DC level file '%s' -- using empty level",
+           filename);
 
       return;
     }
 
-    /* advance file stream to first level inside the level package */
-    skip_bytes = position_first_level - num_magic_bytes - extra_bytes;
+    if (strEqualPrefix(magic_bytes, "DC2Win95") ||
+       strEqualPrefix(magic_bytes, "DC2Win98"))
+    {
+      int position_first_level = 0x00fa;
+      int extra_bytes = 4;
+      int skip_bytes;
 
-    /* each block of level data is followed by block of non-level data */
-    num_levels_to_skip *= 2;
+      /* advance file stream to first level inside the level package */
+      skip_bytes = position_first_level - num_magic_bytes - extra_bytes;
 
-    /* at least skip header bytes, therefore use ">= 0" instead of "> 0" */
-    while (num_levels_to_skip >= 0)
-    {
-      /* advance file stream to next level inside the level package */
-      if (fseek(file, skip_bytes, SEEK_CUR) != 0)
+      /* each block of level data is followed by block of non-level data */
+      num_levels_to_skip *= 2;
+
+      /* at least skip header bytes, therefore use ">= 0" instead of "> 0" */
+      while (num_levels_to_skip >= 0)
       {
-       level->no_valid_file = TRUE;
+       /* advance file stream to next level inside the level package */
+       if (fseek(file, skip_bytes, SEEK_CUR) != 0)
+       {
+         level->no_valid_file = TRUE;
 
-       Error(ERR_WARN, "cannot fseek in file '%s' -- using empty level",
-             filename);
+         Error(ERR_WARN, "cannot fseek in file '%s' -- using empty level",
+               filename);
 
-       return;
-      }
+         return;
+       }
 
-      /* skip apparently unused extra bytes following each level */
-      ReadUnusedBytesFromFile(file, extra_bytes);
+       /* skip apparently unused extra bytes following each level */
+       ReadUnusedBytesFromFile(file, extra_bytes);
 
-      /* read size of next level in level package */
-      skip_bytes = getFile32BitLE(file);
+       /* read size of next level in level package */
+       skip_bytes = getFile32BitLE(file);
 
-      num_levels_to_skip--;
+       num_levels_to_skip--;
+      }
+    }
+    else
+    {
+      level->no_valid_file = TRUE;
+
+      Error(ERR_WARN, "unknown DC2 level file '%s' -- using empty level",
+           filename);
+
+      return;
     }
   }
 
@@ -8747,7 +8764,7 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename)
   }
 
   /* special case: initialize with default values that may be overwritten */
-  /* (eg, init "menu.draw_xoffset.INFO[MUSIC]" from "menu.draw_xoffset.INFO") */
+  /* (eg, init "menu.draw_xoffset.INFO[XXX]" from "menu.draw_xoffset.INFO") */
   for (i = 0; i < NUM_SPECIAL_GFX_INFO_ARGS; i++)
   {
     char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset.INFO");
@@ -8759,6 +8776,19 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename)
       menu.draw_yoffset_info[i] = get_integer_from_string(value_2);
   }
 
+  /* special case: initialize with default values that may be overwritten */
+  /* (eg, init "menu.draw_xoffset.SETUP[XXX]" from "menu.draw_xoffset.SETUP") */
+  for (i = 0; i < NUM_SPECIAL_GFX_SETUP_ARGS; i++)
+  {
+    char *value_1 = getHashEntry(setup_file_hash, "menu.draw_xoffset.SETUP");
+    char *value_2 = getHashEntry(setup_file_hash, "menu.draw_yoffset.SETUP");
+
+    if (value_1 != NULL)
+      menu.draw_xoffset_setup[i] = get_integer_from_string(value_1);
+    if (value_2 != NULL)
+      menu.draw_yoffset_setup[i] = get_integer_from_string(value_2);
+  }
+
   /* special case: initialize with default values that may be overwritten */
   /* (eg, init "menu.enter_screen.SCORES.xyz" from "menu.enter_screen.xyz") */
   for (i = 0; i < NUM_SPECIAL_GFX_ARGS; i++)
@@ -8842,18 +8872,9 @@ static void LoadSpecialMenuDesignSettingsFromFilename(char *filename)
   freeSetupFileHash(setup_file_hash);
 }
 
-void LoadSpecialMenuDesignSettings()
+static void LoadSpecialMenuDesignSettings_SpecialPreProcessing()
 {
-  char *filename_base = UNDEFINED_FILENAME, *filename_local;
-  int i, j;
-
-  /* always start with reliable default values from static default config */
-  for (i = 0; image_config_vars[i].token != NULL; i++)
-    for (j = 0; image_config[j].token != NULL; j++)
-      if (strEqual(image_config_vars[i].token, image_config[j].token))
-       *image_config_vars[i].value =
-         get_token_parameter_value(image_config_vars[i].token,
-                                   image_config[j].value);
+  int i;
 
   /* the following initializes hierarchical values from static configuration */
 
@@ -8883,6 +8904,29 @@ void LoadSpecialMenuDesignSettings()
     menu.enter_screen[i] = menu.enter_screen[GFX_SPECIAL_ARG_DEFAULT];
     menu.leave_screen[i] = menu.leave_screen[GFX_SPECIAL_ARG_DEFAULT];
   }
+}
+
+static void LoadSpecialMenuDesignSettings_SpecialPostProcessing()
+{
+  /* special case: initialize later added SETUP list size from LEVELS value */
+  if (menu.list_size[GAME_MODE_SETUP] == -1)
+    menu.list_size[GAME_MODE_SETUP] = menu.list_size[GAME_MODE_LEVELS];
+}
+
+void LoadSpecialMenuDesignSettings()
+{
+  char *filename_base = UNDEFINED_FILENAME, *filename_local;
+  int i, j;
+
+  /* always start with reliable default values from static default config */
+  for (i = 0; image_config_vars[i].token != NULL; i++)
+    for (j = 0; image_config[j].token != NULL; j++)
+      if (strEqual(image_config_vars[i].token, image_config[j].token))
+       *image_config_vars[i].value =
+         get_token_parameter_value(image_config_vars[i].token,
+                                   image_config[j].value);
+
+  LoadSpecialMenuDesignSettings_SpecialPreProcessing();
 
   if (!SETUP_OVERRIDE_ARTWORK(setup, ARTWORK_TYPE_GRAPHICS))
   {
@@ -8897,6 +8941,8 @@ void LoadSpecialMenuDesignSettings()
 
   if (filename_local != NULL && !strEqual(filename_base, filename_local))
     LoadSpecialMenuDesignSettingsFromFilename(filename_local);
+
+  LoadSpecialMenuDesignSettings_SpecialPostProcessing();
 }
 
 void LoadUserDefinedEditorElementList(int **elements, int *num_elements)