X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=240fe67f928bd47524ae85afcc7a3113a5598752;hb=1446af0fb66276d75bd2ce82d368292283e555aa;hp=0b39ff7cc44cc3dccc5e353ed84726800195a4b4;hpb=93806fb4c23f4b6ef58d9562e908a1b89ece869d;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 0b39ff7c..240fe67f 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -247,6 +247,24 @@ char *getImageFilename(char *basename) return filename; } +char *getCustomImageFilename(char *basename) +{ +#if 0 + if (strcmp(basename, "RocksFont.pcx") == 0) + { + char *dir = options.graphics_directory; + + printf("checking directory '%s' ...\n", dir); + + /* + dir = getPath2(options.graphics_directory); + */ + } +#endif + + return getImageFilename(basename); +} + void InitTapeDirectory(char *level_subdir) { createDirectory(getUserDataDir(), "user data", PERMS_PRIVATE); @@ -989,16 +1007,16 @@ static struct LevelDirInfo ldi; static struct TokenInfo levelinfo_tokens[] = { /* level directory info */ - { TYPE_STRING, &ldi.name, "name" }, - { TYPE_STRING, &ldi.name_short, "name_short" }, - { 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.level_group, "level_group" }, - { TYPE_BOOLEAN, &ldi.readonly, "readonly" } + { TYPE_STRING, &ldi.name, "name" }, + { TYPE_STRING, &ldi.name_short, "name_short" }, + { 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.level_group, "level_group" }, + { TYPE_BOOLEAN, &ldi.readonly, "readonly" } }; static void setLevelDirInfoToDefaults(struct LevelDirInfo *ldi) @@ -1150,9 +1168,106 @@ static void createParentLevelDirNode(struct LevelDirInfo *node_parent) pushLevelDirInfo(&node_parent->node_group, leveldir_new); } -static void LoadLevelInfoFromLevelDir(struct LevelDirInfo **node_first, - struct LevelDirInfo *node_parent, - char *level_directory) +/* forward declaration for recursive call by "LoadLevelInfoFromSetupFile()" */ +static void LoadLevelInfoFromLevelGroupDir(struct LevelDirInfo **, + struct LevelDirInfo *, + char *); + +static boolean LoadLevelInfoFromLevelDir(struct LevelDirInfo **node_first, + struct LevelDirInfo *node_parent, + char *level_directory, + char *directory_name) +{ + char *directory_path = getPath2(level_directory, directory_name); + char *filename = getPath2(directory_path, LEVELINFO_FILENAME); + struct SetupFileList *setup_file_list = loadSetupFileList(filename); + struct LevelDirInfo *leveldir_new = NULL; + int i; + + if (setup_file_list == NULL) + { + Error(ERR_WARN, "ignoring level directory '%s'", level_directory); + + free(directory_path); + free(filename); + + return FALSE; + } + + leveldir_new = newLevelDirInfo(); + + checkSetupFileListIdentifier(setup_file_list, getCookie("LEVELINFO")); + setLevelDirInfoToDefaultsFromParent(leveldir_new, node_parent); + + /* set all structure fields according to the token/value pairs */ + ldi = *leveldir_new; + for (i=0; iname, 150, FC_YELLOW); + + if (leveldir_new->name_short == NULL) + leveldir_new->name_short = getStringCopy(leveldir_new->name); + + if (leveldir_new->name_sorting == NULL) + leveldir_new->name_sorting = getStringCopy(leveldir_new->name); + + leveldir_new->filename = getStringCopy(directory_name); + + if (node_parent == NULL) /* top level group */ + { + leveldir_new->basepath = level_directory; + leveldir_new->fullpath = leveldir_new->filename; + } + else /* sub level group */ + { + leveldir_new->basepath = node_parent->basepath; + leveldir_new->fullpath = getPath2(node_parent->fullpath, + directory_name); + } + + if (leveldir_new->levels < 1) + leveldir_new->levels = 1; + + leveldir_new->last_level = + leveldir_new->first_level + leveldir_new->levels - 1; + + leveldir_new->user_defined = + (leveldir_new->basepath == options.level_directory ? FALSE : TRUE); + + leveldir_new->color = LEVELCOLOR(leveldir_new); + leveldir_new->class_desc = getLevelClassDescription(leveldir_new); + + leveldir_new->handicap_level = /* set handicap to default value */ + (leveldir_new->user_defined ? + leveldir_new->last_level : + leveldir_new->first_level); + + pushLevelDirInfo(node_first, leveldir_new); + + freeSetupFileList(setup_file_list); + + if (leveldir_new->level_group) + { + /* create node to link back to current level directory */ + createParentLevelDirNode(leveldir_new); + + /* step into sub-directory and look for more level series */ + LoadLevelInfoFromLevelGroupDir(&leveldir_new->node_group, + leveldir_new, directory_path); + } + + free(directory_path); + free(filename); + + return TRUE; +} + +static void LoadLevelInfoFromLevelGroupDir(struct LevelDirInfo **node_first, + struct LevelDirInfo *node_parent, + char *level_directory) { DIR *dir; struct dirent *dir_entry; @@ -1166,11 +1281,9 @@ static void LoadLevelInfoFromLevelDir(struct LevelDirInfo **node_first, while ((dir_entry = readdir(dir)) != NULL) /* loop until last dir entry */ { - struct SetupFileList *setup_file_list = NULL; struct stat file_status; char *directory_name = dir_entry->d_name; char *directory_path = getPath2(level_directory, directory_name); - char *filename = NULL; /* skip entries for current and parent directory */ if (strcmp(directory_name, ".") == 0 || @@ -1188,87 +1301,22 @@ static void LoadLevelInfoFromLevelDir(struct LevelDirInfo **node_first, continue; } - filename = getPath2(directory_path, LEVELINFO_FILENAME); - setup_file_list = loadSetupFileList(filename); - - if (setup_file_list) - { - struct LevelDirInfo *leveldir_new = newLevelDirInfo(); - int i; - - checkSetupFileListIdentifier(setup_file_list, getCookie("LEVELINFO")); - setLevelDirInfoToDefaultsFromParent(leveldir_new, node_parent); - - /* set all structure fields according to the token/value pairs */ - ldi = *leveldir_new; - for (i=0; iname, 150, FC_YELLOW); - - if (leveldir_new->name_short == NULL) - leveldir_new->name_short = getStringCopy(leveldir_new->name); - - if (leveldir_new->name_sorting == NULL) - leveldir_new->name_sorting = getStringCopy(leveldir_new->name); - - leveldir_new->filename = getStringCopy(directory_name); - - if (node_parent == NULL) /* top level group */ - { - leveldir_new->basepath = level_directory; - leveldir_new->fullpath = leveldir_new->filename; - } - else /* sub level group */ - { - leveldir_new->basepath = node_parent->basepath; - leveldir_new->fullpath = getPath2(node_parent->fullpath, - directory_name); - } - - if (leveldir_new->levels < 1) - leveldir_new->levels = 1; - - leveldir_new->last_level = - leveldir_new->first_level + leveldir_new->levels - 1; - - leveldir_new->user_defined = - (leveldir_new->basepath == options.level_directory ? FALSE : TRUE); - - leveldir_new->color = LEVELCOLOR(leveldir_new); - leveldir_new->class_desc = getLevelClassDescription(leveldir_new); - - leveldir_new->handicap_level = /* set handicap to default value */ - (leveldir_new->user_defined ? - leveldir_new->last_level : - leveldir_new->first_level); - - pushLevelDirInfo(node_first, leveldir_new); - - freeSetupFileList(setup_file_list); - valid_entry_found = TRUE; - - if (leveldir_new->level_group) - { - /* create node to link back to current level directory */ - createParentLevelDirNode(leveldir_new); - - /* step into sub-directory and look for more level series */ - LoadLevelInfoFromLevelDir(&leveldir_new->node_group, - leveldir_new, directory_path); - } - } - else - Error(ERR_WARN, "ignoring level directory '%s'", directory_path); - free(directory_path); - free(filename); + + valid_entry_found |= LoadLevelInfoFromLevelDir(node_first, node_parent, + level_directory, + directory_name); } closedir(dir); + if (!valid_entry_found) + { + /* check if this directory directly contains a file "levelinfo.conf" */ + valid_entry_found |= LoadLevelInfoFromLevelDir(node_first, node_parent, + level_directory, "."); + } + if (!valid_entry_found) Error(ERR_WARN, "cannot find any valid level series in directory '%s'", level_directory); @@ -1280,8 +1328,9 @@ void LoadLevelInfo() DrawInitText("Loading level series:", 120, FC_GREEN); - LoadLevelInfoFromLevelDir(&leveldir_first, NULL, options.level_directory); - LoadLevelInfoFromLevelDir(&leveldir_first, NULL, getUserLevelDir("")); + /* check if this directory directly contains a file "levelinfo.conf" */ + LoadLevelInfoFromLevelGroupDir(&leveldir_first,NULL,options.level_directory); + LoadLevelInfoFromLevelGroupDir(&leveldir_first,NULL,getUserLevelDir("")); leveldir_current = getFirstValidLevelSeries(leveldir_first); @@ -1335,66 +1384,78 @@ static void SaveUserLevelInfo() SetFilePermissions(filename, PERMS_PRIVATE); } -char *getSetupLine(struct TokenInfo *token_info, char *prefix, int token_nr) +char *getSetupValue(int type, void *value) { - int i; - static char entry[MAX_LINE_LEN]; - int token_type = token_info[token_nr].type; - void *setup_value = token_info[token_nr].value; - char *token_text = token_info[token_nr].text; - - /* start with the prefix, token and some spaces to format output line */ - sprintf(entry, "%s%s:", prefix, token_text); - for (i=strlen(entry); i