removed unused option to set first level of user level sets not to be '1'
[rocksndiamonds.git] / src / libgame / setup.c
index 54e5eeeea21f6d9e51ed870c1c4fbd187a16eeb9..8662b204bb5f336ca426408be1b2fe841efa58a7 100644 (file)
@@ -202,6 +202,28 @@ char *getCurrentLevelDir()
   return getLevelDirFromTreeInfo(leveldir_current);
 }
 
+char *getNewUserLevelSubdir()
+{
+  static char *new_level_subdir = NULL;
+  char *subdir_prefix = getLoginName();
+  char subdir_suffix[10];
+  int max_suffix_number = 1000;
+  int i = 0;
+
+  while (++i < max_suffix_number)
+  {
+    sprintf(subdir_suffix, "_%d", i);
+
+    checked_free(new_level_subdir);
+    new_level_subdir = getStringCat2(subdir_prefix, subdir_suffix);
+
+    if (!directoryExists(getUserLevelDir(new_level_subdir)))
+      break;
+  }
+
+  return new_level_subdir;
+}
+
 static char *getTapeDir(char *level_subdir)
 {
   static char *tape_dir = NULL;
@@ -2627,7 +2649,7 @@ static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first)
   setString(&ti_new->name_sorting, ti_new->name);
 
   setString(&ti_new->subdir, STRING_TOP_DIRECTORY);
-  setString(&ti_new->fullpath, node_first->fullpath);
+  setString(&ti_new->fullpath, ".");
 
   ti_new->sort_priority = node_first->sort_priority;;
   ti_new->latest_engine = node_first->latest_engine;
@@ -3494,34 +3516,91 @@ void LoadLevelArtworkInfo()
   print_timestamp_done("LoadLevelArtworkInfo");
 }
 
-boolean UpdateUserLevelSet(char *level_subdir,
-                          char *level_name, char *level_author,
-                          int num_levels, int first_level_nr)
+static boolean AddUserLevelSetToLevelInfoExt(char *level_subdir_new)
+{
+  // get level info tree node of first (original) user level set
+  char *level_subdir_old = getLoginName();
+  LevelDirTree *leveldir_old = getTreeInfoFromIdentifier(leveldir_first,
+                                                        level_subdir_old);
+  if (leveldir_old == NULL)            // should not happen
+    return FALSE;
+
+  int draw_deactivation_mask = GetDrawDeactivationMask();
+
+  // override draw deactivation mask (temporarily disable drawing)
+  SetDrawDeactivationMask(REDRAW_ALL);
+
+  // load new level set config and add it next to first user level set
+  LoadLevelInfoFromLevelConf(&leveldir_old->next, NULL,
+                            leveldir_old->basepath, level_subdir_new);
+
+  // set draw deactivation mask to previous value
+  SetDrawDeactivationMask(draw_deactivation_mask);
+
+  // get level info tree node of newly added user level set
+  LevelDirTree *leveldir_new = getTreeInfoFromIdentifier(leveldir_first,
+                                                        level_subdir_new);
+  if (leveldir_new == NULL)            // should not happen
+    return FALSE;
+
+  // correct top link and parent node link of newly created tree node
+  leveldir_new->node_top    = leveldir_old->node_top;
+  leveldir_new->node_parent = leveldir_old->node_parent;
+
+  // sort level info tree to adjust position of newly added level set
+  sortTreeInfo(&leveldir_first);
+
+  return TRUE;
+}
+
+void AddUserLevelSetToLevelInfo(char *level_subdir_new)
+{
+  if (!AddUserLevelSetToLevelInfoExt(level_subdir_new))
+    Error(ERR_EXIT, "internal level set structure corrupted -- aborting");
+}
+
+boolean UpdateUserLevelSet(char *level_subdir, char *level_name,
+                          char *level_author, int num_levels)
 {
   char *filename = getPath2(getUserLevelDir(level_subdir), LEVELINFO_FILENAME);
   char *filename_tmp = getStringCat2(filename, ".tmp");
   FILE *file = NULL;
   FILE *file_tmp = NULL;
   char line[MAX_LINE_LEN];
-  boolean update_num_levels_only = FALSE;
   boolean success = FALSE;
+  LevelDirTree *leveldir = getTreeInfoFromIdentifier(leveldir_first,
+                                                    level_subdir);
+  // update values in level directory tree
+
+  if (level_name != NULL)
+    setString(&leveldir->name, level_name);
+
+  if (level_author != NULL)
+    setString(&leveldir->author, level_author);
+
+  if (num_levels != -1)
+    leveldir->levels = num_levels;
 
-  if (level_name == NULL || level_author == NULL || first_level_nr == -1)
-    update_num_levels_only = TRUE;
+  // update values that depend on other values
+
+  setString(&leveldir->name_sorting, leveldir->name);
+
+  leveldir->last_level = leveldir->first_level + leveldir->levels - 1;
+
+  // sort order of level sets may have changed
+  sortTreeInfo(&leveldir_first);
 
   if ((file     = fopen(filename,     MODE_READ)) &&
       (file_tmp = fopen(filename_tmp, MODE_WRITE)))
   {
     while (fgets(line, MAX_LINE_LEN, file))
     {
-      if (strPrefix(line, "name:") && !update_num_levels_only)
+      if (strPrefix(line, "name:") && level_name != NULL)
        fprintf(file_tmp, "%-32s%s\n", "name:", level_name);
-      else if (strPrefix(line, "author:") && !update_num_levels_only)
+      else if (strPrefix(line, "author:") && level_author != NULL)
        fprintf(file_tmp, "%-32s%s\n", "author:", level_author);
-      else if (strPrefix(line, "levels:"))
+      else if (strPrefix(line, "levels:") && num_levels != -1)
        fprintf(file_tmp, "%-32s%d\n", "levels:", num_levels);
-      else if (strPrefix(line, "first_level:") && !update_num_levels_only)
-       fprintf(file_tmp, "%-32s%d\n", "first_level:", first_level_nr);
       else
        fputs(line, file_tmp);
     }
@@ -3544,9 +3623,8 @@ boolean UpdateUserLevelSet(char *level_subdir,
   return success;
 }
 
-boolean CreateUserLevelSet(char *level_subdir,
-                          char *level_name, char *level_author,
-                          int num_levels, int first_level_nr)
+boolean CreateUserLevelSet(char *level_subdir, char *level_name,
+                          char *level_author, int num_levels)
 {
   LevelDirTree *level_info;
   char *filename;
@@ -3574,7 +3652,7 @@ boolean CreateUserLevelSet(char *level_subdir,
   setString(&level_info->name, level_name);
   setString(&level_info->author, level_author);
   level_info->levels = num_levels;
-  level_info->first_level = first_level_nr;
+  level_info->first_level = 1;
   level_info->sort_priority = LEVELCLASS_PRIVATE_START;
   level_info->readonly = FALSE;
 
@@ -3594,7 +3672,8 @@ boolean CreateUserLevelSet(char *level_subdir,
       fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i));
 
     /* just to make things nicer :) */
-    if (i == LEVELINFO_TOKEN_AUTHOR)
+    if (i == LEVELINFO_TOKEN_AUTHOR ||
+       i == LEVELINFO_TOKEN_FIRST_LEVEL)
       fprintf(file, "\n");     
   }
 
@@ -3612,7 +3691,7 @@ boolean CreateUserLevelSet(char *level_subdir,
 
 static void SaveUserLevelInfo()
 {
-  CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100, 1);
+  CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100);
 }
 
 char *getSetupValue(int type, void *value)