X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=8662b204bb5f336ca426408be1b2fe841efa58a7;hp=d857883730534d1ce66596dbc418270bbf603380;hb=05818ea4267c3e2a196071d17d8735d6f6fe65c9;hpb=d8b93bc26350fed8eef779af50267f9cab93612e diff --git a/src/libgame/setup.c b/src/libgame/setup.c index d8578837..8662b204 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -2649,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; @@ -3516,9 +3516,51 @@ 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"); @@ -3526,6 +3568,27 @@ boolean UpdateUserLevelSet(char *level_subdir, FILE *file_tmp = NULL; char line[MAX_LINE_LEN]; 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; + + // 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))) @@ -3538,8 +3601,6 @@ boolean UpdateUserLevelSet(char *level_subdir, fprintf(file_tmp, "%-32s%s\n", "author:", level_author); else if (strPrefix(line, "levels:") && num_levels != -1) fprintf(file_tmp, "%-32s%d\n", "levels:", num_levels); - else if (strPrefix(line, "first_level:") && first_level_nr != -1) - fprintf(file_tmp, "%-32s%d\n", "first_level:", first_level_nr); else fputs(line, file_tmp); } @@ -3562,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; @@ -3592,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; @@ -3631,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)