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;
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;
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);
}
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;
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;
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");
}
static void SaveUserLevelInfo()
{
- CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100, 1);
+ CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100);
}
char *getSetupValue(int type, void *value)