X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=5784ac496183c72cf174fecd4649a923f3648908;hp=defacd4e5ff9130afa3ff01b33b1fd476a5293a1;hb=cb69ffb72a904eb0704c7f0e6c593bfee19562df;hpb=eb307f1cc053ffdead7e4b50503b6b54f9a9c412 diff --git a/src/libgame/setup.c b/src/libgame/setup.c index defacd4e..5784ac49 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -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; @@ -2353,28 +2375,28 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ti, TreeInfo *parent) ti->imported_by = getStringCopy(parent->imported_by); ti->tested_by = getStringCopy(parent->tested_by); - ti->graphics_set_ecs = NULL; - ti->graphics_set_aga = NULL; - ti->graphics_set = NULL; - ti->sounds_set = NULL; - ti->music_set = NULL; + ti->graphics_set_ecs = getStringCopy(parent->graphics_set_ecs); + ti->graphics_set_aga = getStringCopy(parent->graphics_set_aga); + ti->graphics_set = getStringCopy(parent->graphics_set); + ti->sounds_set = getStringCopy(parent->sounds_set); + ti->music_set = getStringCopy(parent->music_set); ti->graphics_path = getStringCopy(UNDEFINED_FILENAME); ti->sounds_path = getStringCopy(UNDEFINED_FILENAME); ti->music_path = getStringCopy(UNDEFINED_FILENAME); - ti->level_filename = NULL; - ti->level_filetype = NULL; + ti->level_filename = getStringCopy(parent->level_filename); + ti->level_filetype = getStringCopy(parent->level_filetype); ti->special_flags = getStringCopy(parent->special_flags); - ti->levels = 0; - ti->first_level = 0; - ti->last_level = 0; + ti->levels = parent->levels; + ti->first_level = parent->first_level; + ti->last_level = parent->last_level; ti->level_group = FALSE; - ti->handicap_level = 0; + ti->handicap_level = parent->handicap_level; ti->readonly = parent->readonly; - ti->handicap = TRUE; - ti->skip_levels = FALSE; + ti->handicap = parent->handicap; + ti->skip_levels = parent->skip_levels; } } @@ -3494,20 +3516,76 @@ void LoadLevelArtworkInfo() print_timestamp_done("LoadLevelArtworkInfo"); } -static void SaveUserLevelInfo() +boolean UpdateUserLevelSet(char *level_subdir, + char *level_name, char *level_author, + int num_levels, int first_level_nr) +{ + 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; + + if (level_name == NULL || level_author == NULL || first_level_nr == -1) + update_num_levels_only = TRUE; + + 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) + fprintf(file_tmp, "%-32s%s\n", "name:", level_name); + else if (strPrefix(line, "author:") && !update_num_levels_only) + fprintf(file_tmp, "%-32s%s\n", "author:", level_author); + else if (strPrefix(line, "levels:")) + 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); + } + + success = TRUE; + } + + if (file) + fclose(file); + + if (file_tmp) + fclose(file_tmp); + + if (success) + success = (rename(filename_tmp, filename) == 0); + + free(filename); + free(filename_tmp); + + return success; +} + +boolean CreateUserLevelSet(char *level_subdir, + char *level_name, char *level_author, + int num_levels, int first_level_nr) { LevelDirTree *level_info; char *filename; FILE *file; int i; - filename = getPath2(getUserLevelDir(getLoginName()), LEVELINFO_FILENAME); + // create user level sub-directory, if needed + createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE); + + filename = getPath2(getUserLevelDir(level_subdir), LEVELINFO_FILENAME); if (!(file = fopen(filename, MODE_WRITE))) { Error(ERR_WARN, "cannot write level info file '%s'", filename); free(filename); - return; + + return FALSE; } level_info = newTreeInfo(); @@ -3515,10 +3593,12 @@ static void SaveUserLevelInfo() /* always start with reliable default values */ setTreeInfoToDefaults(level_info, TREE_TYPE_LEVEL_DIR); - setString(&level_info->name, getLoginName()); - setString(&level_info->author, getRealName()); - level_info->levels = 100; - level_info->first_level = 1; + 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->sort_priority = LEVELCLASS_PRIVATE_START; + level_info->readonly = FALSE; token_value_position = TOKEN_VALUE_POSITION_SHORT; @@ -3530,7 +3610,9 @@ static void SaveUserLevelInfo() if (i == LEVELINFO_TOKEN_NAME || i == LEVELINFO_TOKEN_AUTHOR || i == LEVELINFO_TOKEN_LEVELS || - i == LEVELINFO_TOKEN_FIRST_LEVEL) + i == LEVELINFO_TOKEN_FIRST_LEVEL || + i == LEVELINFO_TOKEN_SORT_PRIORITY || + i == LEVELINFO_TOKEN_READONLY) fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i)); /* just to make things nicer :) */ @@ -3546,6 +3628,13 @@ static void SaveUserLevelInfo() freeTreeInfo(level_info); free(filename); + + return TRUE; +} + +static void SaveUserLevelInfo() +{ + CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100, 1); } char *getSetupValue(int type, void *value)