rnd-20050424-1-src
[rocksndiamonds.git] / src / libgame / setup.c
index 7942ee7907f5ec0f05a4319f79c9b5b225b6a048..63ac0d59b3d67ede1f1027dfad61931a27142439 100644 (file)
@@ -41,10 +41,11 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
 
 #define LEVELCOLOR(n)  (IS_LEVELCLASS_TUTORIAL(n) ?            FC_BLUE :    \
                         IS_LEVELCLASS_CLASSICS(n) ?            FC_RED :     \
-                        IS_LEVELCLASS_BD(n) ?                  FC_GREEN :   \
+                        IS_LEVELCLASS_BD(n) ?                  FC_YELLOW :  \
                         IS_LEVELCLASS_EM(n) ?                  FC_YELLOW :  \
-                        IS_LEVELCLASS_SP(n) ?                  FC_GREEN :   \
+                        IS_LEVELCLASS_SP(n) ?                  FC_YELLOW :  \
                         IS_LEVELCLASS_DX(n) ?                  FC_YELLOW :  \
+                        IS_LEVELCLASS_SB(n) ?                  FC_YELLOW :  \
                         IS_LEVELCLASS_CONTRIB(n) ?             FC_GREEN :   \
                         IS_LEVELCLASS_PRIVATE(n) ?             FC_RED :     \
                         FC_BLUE)
@@ -55,14 +56,15 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] =
                         IS_LEVELCLASS_EM(n) ?                  3 :     \
                         IS_LEVELCLASS_SP(n) ?                  4 :     \
                         IS_LEVELCLASS_DX(n) ?                  5 :     \
-                        IS_LEVELCLASS_CONTRIB(n) ?             6 :     \
-                        IS_LEVELCLASS_PRIVATE(n) ?             7 :     \
+                        IS_LEVELCLASS_SB(n) ?                  6 :     \
+                        IS_LEVELCLASS_CONTRIB(n) ?             7 :     \
+                        IS_LEVELCLASS_PRIVATE(n) ?             8 :     \
                         9)
 
 #define ARTWORKCOLOR(n)        (IS_ARTWORKCLASS_CLASSICS(n) ?          FC_RED :     \
-                        IS_ARTWORKCLASS_CONTRIB(n) ?           FC_YELLOW :  \
+                        IS_ARTWORKCLASS_CONTRIB(n) ?           FC_GREEN :   \
                         IS_ARTWORKCLASS_PRIVATE(n) ?           FC_RED :     \
-                        IS_ARTWORKCLASS_LEVEL(n) ?             FC_GREEN :   \
+                        IS_ARTWORKCLASS_LEVEL(n) ?             FC_YELLOW :  \
                         FC_BLUE)
 
 #define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ?       0 :     \
@@ -148,7 +150,7 @@ static char *getLevelDirFromTreeInfo(TreeInfo *node)
 
   checked_free(level_dir);
 
-  level_dir = getPath2((node->user_defined ? getUserLevelDir(NULL) :
+  level_dir = getPath2((node->in_user_dir ? getUserLevelDir(NULL) :
                        options.level_directory), node->fullpath);
 
   return level_dir;
@@ -357,7 +359,7 @@ char *getTapeFilename(int nr)
   checked_free(filename);
 
   sprintf(basename, "%03d.%s", nr, TAPEFILE_EXTENSION);
-  filename = getPath2(getTapeDir(leveldir_current->filename), basename);
+  filename = getPath2(getTapeDir(leveldir_current->subdir), basename);
 
   return filename;
 }
@@ -383,7 +385,7 @@ char *getScoreFilename(int nr)
   checked_free(filename);
 
   sprintf(basename, "%03d.%s", nr, SCOREFILE_EXTENSION);
-  filename = getPath2(getScoreDir(leveldir_current->filename), basename);
+  filename = getPath2(getScoreDir(leveldir_current->subdir), basename);
 
   return filename;
 }
@@ -404,7 +406,12 @@ char *getEditorSetupFilename()
   static char *filename = NULL;
 
   checked_free(filename);
+  filename = getPath2(getCurrentLevelDir(), EDITORSETUP_FILENAME);
 
+  if (fileExists(filename))
+    return filename;
+
+  checked_free(filename);
   filename = getPath2(getSetupDir(), EDITORSETUP_FILENAME);
 
   return filename;
@@ -438,8 +445,8 @@ char *getLevelSetInfoFilename()
   char *basenames[] =
   {
     "README",
-    "README.txt",
     "README.TXT",
+    "README.txt",
     "Readme",
     "Readme.txt",
     "readme",
@@ -452,8 +459,8 @@ char *getLevelSetInfoFilename()
   for (i = 0; basenames[i] != NULL; i++)
   {
     checked_free(filename);
-
     filename = getPath2(getCurrentLevelDir(), basenames[i]);
+
     if (fileExists(filename))
       return filename;
   }
@@ -928,11 +935,11 @@ void dumpTreeInfo(TreeInfo *node, int depth)
       printf(" ");
 
 #if 1
-    printf("filename == '%s' ['%s', '%s'] [%d])\n",
-          node->filename, node->fullpath, node->basepath, node->user_defined);
+    printf("subdir == '%s' ['%s', '%s'] [%d])\n",
+          node->subdir, node->fullpath, node->basepath, node->in_user_dir);
 #else
-    printf("filename == '%s' (%s) [%s] (%d)\n",
-          node->filename, node->name, node->identifier, node->sort_priority);
+    printf("subdir == '%s' (%s) [%s] (%d)\n",
+          node->subdir, node->name, node->identifier, node->sort_priority);
 #endif
 
     if (node->node_group != NULL)
@@ -1573,41 +1580,47 @@ void checkSetupFileHashIdentifier(SetupFileHash *setup_file_hash,
 #define LEVELINFO_TOKEN_NAME_SORTING   2
 #define LEVELINFO_TOKEN_AUTHOR         3
 #define LEVELINFO_TOKEN_IMPORTED_FROM  4
-#define LEVELINFO_TOKEN_LEVELS         5
-#define LEVELINFO_TOKEN_FIRST_LEVEL    6
-#define LEVELINFO_TOKEN_SORT_PRIORITY  7
-#define LEVELINFO_TOKEN_LATEST_ENGINE  8
-#define LEVELINFO_TOKEN_LEVEL_GROUP    9
-#define LEVELINFO_TOKEN_READONLY       10
-#define LEVELINFO_TOKEN_GRAPHICS_SET   11
-#define LEVELINFO_TOKEN_SOUNDS_SET     12
-#define LEVELINFO_TOKEN_MUSIC_SET      13
-#define LEVELINFO_TOKEN_FILENAME       14
-#define LEVELINFO_TOKEN_FILETYPE       15
-
-#define NUM_LEVELINFO_TOKENS           16
+#define LEVELINFO_TOKEN_IMPORTED_BY    5
+#define LEVELINFO_TOKEN_LEVELS         6
+#define LEVELINFO_TOKEN_FIRST_LEVEL    7
+#define LEVELINFO_TOKEN_SORT_PRIORITY  8
+#define LEVELINFO_TOKEN_LATEST_ENGINE  9
+#define LEVELINFO_TOKEN_LEVEL_GROUP    10
+#define LEVELINFO_TOKEN_READONLY       11
+#define LEVELINFO_TOKEN_GRAPHICS_SET   12
+#define LEVELINFO_TOKEN_SOUNDS_SET     13
+#define LEVELINFO_TOKEN_MUSIC_SET      14
+#define LEVELINFO_TOKEN_FILENAME       15
+#define LEVELINFO_TOKEN_FILETYPE       16
+#define LEVELINFO_TOKEN_HANDICAP       17
+#define LEVELINFO_TOKEN_SKIP_LEVELS    18
+
+#define NUM_LEVELINFO_TOKENS           19
 
 static LevelDirTree ldi;
 
 static struct TokenInfo levelinfo_tokens[] =
 {
   /* level directory info */
-  { TYPE_STRING,  &ldi.identifier,     "identifier"    },
-  { TYPE_STRING,  &ldi.name,           "name"          },
-  { TYPE_STRING,  &ldi.name_sorting,   "name_sorting"  },
-  { TYPE_STRING,  &ldi.author,         "author"        },
-  { TYPE_STRING,  &ldi.imported_from,  "imported_from" },
-  { TYPE_INTEGER, &ldi.levels,         "levels"        },
-  { TYPE_INTEGER, &ldi.first_level,    "first_level"   },
-  { TYPE_INTEGER, &ldi.sort_priority,  "sort_priority" },
-  { TYPE_BOOLEAN, &ldi.latest_engine,  "latest_engine" },
-  { TYPE_BOOLEAN, &ldi.level_group,    "level_group"   },
-  { TYPE_BOOLEAN, &ldi.readonly,       "readonly"      },
-  { TYPE_STRING,  &ldi.graphics_set,   "graphics_set"  },
-  { TYPE_STRING,  &ldi.sounds_set,     "sounds_set"    },
-  { TYPE_STRING,  &ldi.music_set,      "music_set"     }
-  { TYPE_STRING,  &ldi.filename,       "filename"      }
-  { TYPE_STRING,  &ldi.filetype,       "filetype"      }
+  { TYPE_STRING,       &ldi.identifier,        "identifier"    },
+  { TYPE_STRING,       &ldi.name,              "name"          },
+  { TYPE_STRING,       &ldi.name_sorting,      "name_sorting"  },
+  { TYPE_STRING,       &ldi.author,            "author"        },
+  { TYPE_STRING,       &ldi.imported_from,     "imported_from" },
+  { TYPE_STRING,       &ldi.imported_by,       "imported_by"   },
+  { TYPE_INTEGER,      &ldi.levels,            "levels"        },
+  { TYPE_INTEGER,      &ldi.first_level,       "first_level"   },
+  { TYPE_INTEGER,      &ldi.sort_priority,     "sort_priority" },
+  { TYPE_BOOLEAN,      &ldi.latest_engine,     "latest_engine" },
+  { TYPE_BOOLEAN,      &ldi.level_group,       "level_group"   },
+  { TYPE_BOOLEAN,      &ldi.readonly,          "readonly"      },
+  { TYPE_STRING,       &ldi.graphics_set,      "graphics_set"  },
+  { TYPE_STRING,       &ldi.sounds_set,        "sounds_set"    },
+  { TYPE_STRING,       &ldi.music_set,         "music_set"     },
+  { TYPE_STRING,       &ldi.level_filename,    "filename"      },
+  { TYPE_STRING,       &ldi.level_filetype,    "filetype"      },
+  { TYPE_BOOLEAN,      &ldi.handicap,          "handicap"      },
+  { TYPE_BOOLEAN,      &ldi.skip_levels,       "skip_levels"   }
 };
 
 static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
@@ -1627,7 +1640,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   ldi->cl_first = -1;
   ldi->cl_cursor = -1;
 
-  ldi->filename = NULL;
+  ldi->subdir = NULL;
   ldi->fullpath = NULL;
   ldi->basepath = NULL;
   ldi->identifier = NULL;
@@ -1638,6 +1651,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   ldi->sort_priority = LEVELCLASS_UNDEFINED;   /* default: least priority */
   ldi->latest_engine = FALSE;                  /* default: get from level */
   ldi->parent_link = FALSE;
+  ldi->in_user_dir = FALSE;
   ldi->user_defined = FALSE;
   ldi->color = 0;
   ldi->class_desc = NULL;
@@ -1645,6 +1659,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
   if (ldi->type == TREE_TYPE_LEVEL_DIR)
   {
     ldi->imported_from = NULL;
+    ldi->imported_by = NULL;
 
     ldi->graphics_set = NULL;
     ldi->sounds_set = NULL;
@@ -1653,8 +1668,8 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
     ldi->sounds_path = getStringCopy(UNDEFINED_FILENAME);
     ldi->music_path = getStringCopy(UNDEFINED_FILENAME);
 
-    ldi->filename = NULL;
-    ldi->filetype = NULL;
+    ldi->level_filename = NULL;
+    ldi->level_filetype = NULL;
 
     ldi->levels = 0;
     ldi->first_level = 0;
@@ -1662,6 +1677,8 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type)
     ldi->level_group = FALSE;
     ldi->handicap_level = 0;
     ldi->readonly = TRUE;
+    ldi->handicap = TRUE;
+    ldi->skip_levels = FALSE;
   }
 }
 
@@ -1689,7 +1706,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->cl_first = -1;
   ldi->cl_cursor = -1;
 
-  ldi->filename = NULL;
+  ldi->subdir = NULL;
   ldi->fullpath = NULL;
   ldi->basepath = NULL;
   ldi->identifier = NULL;
@@ -1700,6 +1717,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->sort_priority = parent->sort_priority;
   ldi->latest_engine = parent->latest_engine;
   ldi->parent_link = FALSE;
+  ldi->in_user_dir = parent->in_user_dir;
   ldi->user_defined = parent->user_defined;
   ldi->color = parent->color;
   ldi->class_desc = getStringCopy(parent->class_desc);
@@ -1707,6 +1725,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   if (ldi->type == TREE_TYPE_LEVEL_DIR)
   {
     ldi->imported_from = getStringCopy(parent->imported_from);
+    ldi->imported_by = getStringCopy(parent->imported_by);
 
     ldi->graphics_set = NULL;
     ldi->sounds_set = NULL;
@@ -1715,8 +1734,8 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
     ldi->sounds_path = getStringCopy(UNDEFINED_FILENAME);
     ldi->music_path = getStringCopy(UNDEFINED_FILENAME);
 
-    ldi->filename = NULL;
-    ldi->filetype = NULL;
+    ldi->level_filename = NULL;
+    ldi->level_filetype = NULL;
 
     ldi->levels = 0;
     ldi->first_level = 0;
@@ -1724,9 +1743,10 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
     ldi->level_group = FALSE;
     ldi->handicap_level = 0;
     ldi->readonly = TRUE;
+    ldi->handicap = TRUE;
+    ldi->skip_levels = FALSE;
   }
 
-
 #else
 
   /* first copy all values from the parent structure ... */
@@ -1739,7 +1759,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
      other structure's pointer may point to them!
   */
 
-  ldi->filename = NULL;
+  ldi->subdir = NULL;
   ldi->fullpath = NULL;
   ldi->basepath = NULL;
   ldi->identifier = NULL;
@@ -1748,6 +1768,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
   ldi->author = getStringCopy(parent->author);
 
   ldi->imported_from = getStringCopy(parent->imported_from);
+  ldi->imported_by = getStringCopy(parent->imported_by);
   ldi->class_desc = getStringCopy(parent->class_desc);
 
   ldi->graphics_set = NULL;
@@ -1770,7 +1791,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent)
 
 static void freeTreeInfo(TreeInfo *ldi)
 {
-  checked_free(ldi->filename);
+  checked_free(ldi->subdir);
   checked_free(ldi->fullpath);
   checked_free(ldi->basepath);
   checked_free(ldi->identifier);
@@ -1783,6 +1804,9 @@ static void freeTreeInfo(TreeInfo *ldi)
 
   if (ldi->type == TREE_TYPE_LEVEL_DIR)
   {
+    checked_free(ldi->imported_from);
+    checked_free(ldi->imported_by);
+
     checked_free(ldi->graphics_set);
     checked_free(ldi->sounds_set);
     checked_free(ldi->music_set);
@@ -1790,6 +1814,9 @@ static void freeTreeInfo(TreeInfo *ldi)
     checked_free(ldi->graphics_path);
     checked_free(ldi->sounds_path);
     checked_free(ldi->music_path);
+
+    checked_free(ldi->level_filename);
+    checked_free(ldi->level_filetype);
   }
 }
 
@@ -1888,7 +1915,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
   setString(&ti_new->name, ".. (parent directory)");
   setString(&ti_new->name_sorting, ti_new->name);
 
-  setString(&ti_new->filename, "..");
+  setString(&ti_new->subdir, "..");
   setString(&ti_new->fullpath, node_parent->fullpath);
 
   ti_new->sort_priority = node_parent->sort_priority;
@@ -1900,7 +1927,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent)
   ti_new->name = ".. (parent directory)";
   ti_new->name_sorting = getStringCopy(ti_new->name);
 
-  ti_new->filename = "..";
+  ti_new->subdir = "..";
   ti_new->fullpath = getStringCopy(node_parent->fullpath);
 
   ti_new->sort_priority = node_parent->sort_priority;
@@ -1943,7 +1970,7 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
   else
     setTreeInfoToDefaults(leveldir_new, TREE_TYPE_LEVEL_DIR);
 
-  leveldir_new->filename = getStringCopy(directory_name);
+  leveldir_new->subdir = getStringCopy(directory_name);
 
   checkSetupFileHashIdentifier(setup_file_hash, getCookie("LEVELINFO"));
 
@@ -1956,19 +1983,19 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
 
 #if 1
   if (strcmp(leveldir_new->name, ANONYMOUS_NAME) == 0)
-    setString(&leveldir_new->name, leveldir_new->filename);
+    setString(&leveldir_new->name, leveldir_new->subdir);
 #else
   if (strcmp(leveldir_new->name, ANONYMOUS_NAME) == 0)
   {
     free(leveldir_new->name);
-    leveldir_new->name = getStringCopy(leveldir_new->filename);
+    leveldir_new->name = getStringCopy(leveldir_new->subdir);
   }
 #endif
 
   DrawInitText(leveldir_new->name, 150, FC_YELLOW);
 
   if (leveldir_new->identifier == NULL)
-    leveldir_new->identifier = getStringCopy(leveldir_new->filename);
+    leveldir_new->identifier = getStringCopy(leveldir_new->subdir);
 
   if (leveldir_new->name_sorting == NULL)
     leveldir_new->name_sorting = getStringCopy(leveldir_new->name);
@@ -1976,7 +2003,7 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
   if (node_parent == NULL)             /* top level group */
   {
     leveldir_new->basepath = getStringCopy(level_directory);
-    leveldir_new->fullpath = getStringCopy(leveldir_new->filename);
+    leveldir_new->fullpath = getStringCopy(leveldir_new->subdir);
   }
   else                                 /* sub level group */
   {
@@ -1991,13 +2018,16 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
     leveldir_new->first_level + leveldir_new->levels - 1;
 
 #if 1
-  leveldir_new->user_defined =
+  leveldir_new->in_user_dir =
     (strcmp(leveldir_new->basepath, options.level_directory) != 0);
 #else
-  leveldir_new->user_defined =
+  leveldir_new->in_user_dir =
     (leveldir_new->basepath == options.level_directory ? FALSE : TRUE);
 #endif
 
+  leveldir_new->user_defined =
+    (leveldir_new->in_user_dir && IS_LEVELCLASS_PRIVATE(leveldir_new));
+
   leveldir_new->color = LEVELCOLOR(leveldir_new);
 #if 1
   setString(&leveldir_new->class_desc, getLevelClassDescription(leveldir_new));
@@ -2006,9 +2036,8 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first,
 #endif
 
   leveldir_new->handicap_level =       /* set handicap to default value */
-    (leveldir_new->user_defined ?
-     leveldir_new->last_level :
-     leveldir_new->first_level);
+    (leveldir_new->user_defined || !leveldir_new->handicap ?
+     leveldir_new->last_level : leveldir_new->first_level);
 
   pushTreeInfo(node_first, leveldir_new);
 
@@ -2169,7 +2198,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
   else
     setTreeInfoToDefaults(artwork_new, type);
 
-  artwork_new->filename = getStringCopy(directory_name);
+  artwork_new->subdir = getStringCopy(directory_name);
 
   if (setup_file_hash) /* (before defining ".color" and ".class_desc") */
   {
@@ -2186,12 +2215,12 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
 
 #if 1
     if (strcmp(artwork_new->name, ANONYMOUS_NAME) == 0)
-      setString(&artwork_new->name, artwork_new->filename);
+      setString(&artwork_new->name, artwork_new->subdir);
 #else
     if (strcmp(artwork_new->name, ANONYMOUS_NAME) == 0)
     {
       free(artwork_new->name);
-      artwork_new->name = getStringCopy(artwork_new->filename);
+      artwork_new->name = getStringCopy(artwork_new->subdir);
     }
 #endif
 
@@ -2200,7 +2229,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
 #endif
 
     if (artwork_new->identifier == NULL)
-      artwork_new->identifier = getStringCopy(artwork_new->filename);
+      artwork_new->identifier = getStringCopy(artwork_new->subdir);
 
     if (artwork_new->name_sorting == NULL)
       artwork_new->name_sorting = getStringCopy(artwork_new->name);
@@ -2209,7 +2238,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
   if (node_parent == NULL)             /* top level group */
   {
     artwork_new->basepath = getStringCopy(base_directory);
-    artwork_new->fullpath = getStringCopy(artwork_new->filename);
+    artwork_new->fullpath = getStringCopy(artwork_new->subdir);
   }
   else                                 /* sub level group */
   {
@@ -2218,10 +2247,10 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
   }
 
 #if 1
-  artwork_new->user_defined =
+  artwork_new->in_user_dir =
     (strcmp(artwork_new->basepath, OPTIONS_ARTWORK_DIRECTORY(type)) != 0);
 #else
-  artwork_new->user_defined =
+  artwork_new->in_user_dir =
     (artwork_new->basepath == OPTIONS_ARTWORK_DIRECTORY(type) ? FALSE : TRUE);
 #endif
 
@@ -2251,7 +2280,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
     }
 #endif
 
-    if (strcmp(artwork_new->filename, ".") == 0)
+    if (strcmp(artwork_new->subdir, ".") == 0)
     {
       if (artwork_new->user_defined)
       {
@@ -2284,9 +2313,9 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first,
     else
     {
 #if 1
-      setString(&artwork_new->identifier, artwork_new->filename);
+      setString(&artwork_new->identifier, artwork_new->subdir);
 #else
-      artwork_new->identifier = getStringCopy(artwork_new->filename);
+      artwork_new->identifier = getStringCopy(artwork_new->subdir);
 #endif
     }
 
@@ -2375,7 +2404,7 @@ static TreeInfo *getDummyArtworkInfo(int type)
   setTreeInfoToDefaults(artwork_new, type);
 
 #if 1
-  setString(&artwork_new->filename, UNDEFINED_FILENAME);
+  setString(&artwork_new->subdir,   UNDEFINED_FILENAME);
   setString(&artwork_new->fullpath, UNDEFINED_FILENAME);
   setString(&artwork_new->basepath, UNDEFINED_FILENAME);
 
@@ -2383,7 +2412,7 @@ static TreeInfo *getDummyArtworkInfo(int type)
   setString(&artwork_new->name,         UNDEFINED_FILENAME);
   setString(&artwork_new->name_sorting, UNDEFINED_FILENAME);
 #else
-  artwork_new->filename = getStringCopy(UNDEFINED_FILENAME);
+  artwork_new->subdir   = getStringCopy(UNDEFINED_FILENAME);
   artwork_new->fullpath = getStringCopy(UNDEFINED_FILENAME);
   artwork_new->basepath = getStringCopy(UNDEFINED_FILENAME);
 
@@ -2488,7 +2517,7 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
 #if 0
     if (!level_node->parent_link)
       printf("CHECKING '%s' ['%s', '%s'] ...\n", path,
-            level_node->filename, level_node->name);
+            level_node->subdir, level_node->name);
 #endif
 
     if (!level_node->parent_link)
@@ -2504,7 +2533,7 @@ void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
        free((*artwork_node)->name);
        free((*artwork_node)->name_sorting);
 
-       (*artwork_node)->identifier   = getStringCopy(level_node->filename);
+       (*artwork_node)->identifier   = getStringCopy(level_node->subdir);
        (*artwork_node)->name         = getStringCopy(level_node->name);
        (*artwork_node)->name_sorting = getStringCopy(level_node->name);
 
@@ -2626,7 +2655,10 @@ static void SaveUserLevelInfo()
   for (i = 0; i < NUM_LEVELINFO_TOKENS; i++)
     if (i != LEVELINFO_TOKEN_IDENTIFIER &&
        i != LEVELINFO_TOKEN_NAME_SORTING &&
-       i != LEVELINFO_TOKEN_IMPORTED_FROM)
+       i != LEVELINFO_TOKEN_IMPORTED_FROM &&
+       i != LEVELINFO_TOKEN_IMPORTED_BY &&
+       i != LEVELINFO_TOKEN_FILENAME &&
+       i != LEVELINFO_TOKEN_FILETYPE)
       fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
 
   fclose(file);
@@ -2759,7 +2791,7 @@ void SaveLevelSetup_LastSeries()
   /* ----------------------------------------------------------------------- */
 
   char *filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME);
-  char *level_subdir = leveldir_current->filename;
+  char *level_subdir = leveldir_current->subdir;
   FILE *file;
 
   InitUserDataDirectory();
@@ -2791,7 +2823,7 @@ static void checkSeriesInfo()
 
   /* check for more levels besides the 'levels' field of 'levelinfo.conf' */
 
-  level_directory = getPath2((leveldir_current->user_defined ?
+  level_directory = getPath2((leveldir_current->in_user_dir ?
                              getUserLevelDir(NULL) :
                              options.level_directory),
                             leveldir_current->fullpath);
@@ -2838,7 +2870,7 @@ void LoadLevelSetup_SeriesInfo()
 {
   char *filename;
   SetupFileHash *level_setup_hash = NULL;
-  char *level_subdir = leveldir_current->filename;
+  char *level_subdir = leveldir_current->subdir;
 
   /* always start with reliable default values */
   level_nr = leveldir_current->first_level;
@@ -2849,7 +2881,7 @@ void LoadLevelSetup_SeriesInfo()
   /* ~/.<program>/levelsetup/<level series>/levelsetup.conf                  */
   /* ----------------------------------------------------------------------- */
 
-  level_subdir = leveldir_current->filename;
+  level_subdir = leveldir_current->subdir;
 
   filename = getPath2(getLevelSetupDir(level_subdir), LEVELSETUP_FILENAME);
 
@@ -2880,7 +2912,7 @@ void LoadLevelSetup_SeriesInfo()
       if (level_nr > leveldir_current->last_level + 1)
        level_nr = leveldir_current->last_level;
 
-      if (leveldir_current->user_defined)
+      if (leveldir_current->user_defined || !leveldir_current->handicap)
        level_nr = leveldir_current->last_level;
 
       leveldir_current->handicap_level = level_nr;
@@ -2899,7 +2931,7 @@ void LoadLevelSetup_SeriesInfo()
 void SaveLevelSetup_SeriesInfo()
 {
   char *filename;
-  char *level_subdir = leveldir_current->filename;
+  char *level_subdir = leveldir_current->subdir;
   char *level_nr_str = int2str(level_nr, 0);
   char *handicap_level_str = int2str(leveldir_current->handicap_level, 0);
   FILE *file;