X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=f6688b1ddf71d0b6fa3536f7ca48e09fea146a73;hb=2d603d06ca862f3ca0721b66f62da188faf866c4;hp=0f0221aa56caafefb11de21ca000b6e54499b5d7;hpb=b201bc433fb5ad1a9f0b7780ac6a73a3617f6dd6;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 0f0221aa..f6688b1d 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -79,10 +79,32 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] = IS_LEVELCLASS_USER(n) ? 7 : \ 9) -#define TOKEN_VALUE_POSITION 30 +#define TOKEN_VALUE_POSITION 40 +#define TOKEN_COMMENT_POSITION 60 #define MAX_COOKIE_LEN 256 +#define ARTWORKINFO_FILENAME(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \ + GRAPHICSINFO_FILENAME : \ + (type) == TREE_TYPE_SOUNDS_DIR ? \ + SOUNDSINFO_FILENAME : \ + (type) == TREE_TYPE_MUSIC_DIR ? \ + MUSICINFO_FILENAME : "") + +#define ARTWORK_DIRECTORY(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \ + GRAPHICS_DIRECTORY : \ + (type) == TREE_TYPE_SOUNDS_DIR ? \ + SOUNDS_DIRECTORY : \ + (type) == TREE_TYPE_MUSIC_DIR ? \ + MUSIC_DIRECTORY : "") + +#define OPTIONS_ARTWORK_DIRECTORY(type) ((type) == TREE_TYPE_GRAPHICS_DIR ? \ + options.graphics_directory : \ + (type) == TREE_TYPE_SOUNDS_DIR ? \ + options.sounds_directory : \ + (type) == TREE_TYPE_MUSIC_DIR ? \ + options.music_directory : "") + /* ------------------------------------------------------------------------- */ /* file functions */ @@ -166,23 +188,27 @@ static char *getLevelSetupDir(char *level_subdir) return levelsetup_dir; } -static char *getCurrentLevelDir() +static char *getLevelDirFromTreeInfo(TreeInfo *node) { static char *level_dir = NULL; + if (node == NULL) + return options.level_directory; + if (level_dir) free(level_dir); - if (leveldir_current == NULL) - return options.level_directory; - - level_dir = getPath2((leveldir_current->user_defined ? - getUserLevelDir(NULL) : options.level_directory), - leveldir_current->fullpath); + level_dir = getPath2((node->user_defined ? getUserLevelDir(NULL) : + options.level_directory), node->fullpath); return level_dir; } +static char *getCurrentLevelDir() +{ + return getLevelDirFromTreeInfo(leveldir_current); +} + static char *getDefaultGraphicsDir(char *graphics_subdir) { static char *graphics_dir = NULL; @@ -359,32 +385,101 @@ char *getCustomImageFilename(char *basename) basename = getCorrectedImageBasename(basename); - /* 1st try: look for special artwork in current level series directory */ - filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename); + if (!setup.override_level_graphics) + { + /* 1st try: look for special artwork in current level series directory */ + filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename); + if (fileExists(filename)) + return filename; + } + + /* 2nd try: look for special artwork in configured artwork directory */ + filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename); if (fileExists(filename)) return filename; - /* 2nd try: look for special artwork in private artwork directory */ - filename = getPath2(getUserGraphicsDir(), basename); + /* 3rd try: look for default artwork in new default artwork directory */ + filename = getPath2(getDefaultGraphicsDir(GRAPHICS_SUBDIR), basename); if (fileExists(filename)) return filename; - /* 3rd try: look for special artwork in configured artwork directory */ - filename = getPath2(getSetupArtworkDir(artwork.gfx_current), basename); + /* 4th try: look for default artwork in old default artwork directory */ + filename = getPath2(options.graphics_directory, basename); if (fileExists(filename)) return filename; - /* 4th try: look for default artwork in new default artwork directory */ - filename = getPath2(getDefaultGraphicsDir("gfx_classic"), basename); + return NULL; /* cannot find specified artwork file anywhere */ +} + +char *getCustomSoundFilename(char *basename) +{ + static char *filename = NULL; + + if (filename != NULL) + free(filename); + + if (!setup.override_level_sounds) + { + /* 1st try: look for special artwork in current level series directory */ + filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename); + if (fileExists(filename)) + return filename; + } + + /* 2nd try: look for special artwork in configured artwork directory */ + filename = getPath2(getSetupArtworkDir(artwork.snd_current), basename); if (fileExists(filename)) return filename; - /* 5th try: look for default artwork in old default artwork directory */ - filename = getPath2(options.graphics_directory, basename); + /* 3rd try: look for default artwork in new default artwork directory */ + filename = getPath2(getDefaultSoundsDir(SOUNDS_SUBDIR), basename); + if (fileExists(filename)) + return filename; + + /* 4th try: look for default artwork in old default artwork directory */ + filename = getPath2(options.sounds_directory, basename); if (fileExists(filename)) return filename; - return NULL; /* cannot find image file */ + return NULL; /* cannot find specified artwork file anywhere */ +} + +char *getCustomSoundConfigFilename() +{ + return getCustomSoundFilename(SOUNDSINFO_FILENAME); +} + +char *getCustomMusicDirectory(void) +{ + static char *directory = NULL; + + if (directory != NULL) + free(directory); + + if (!setup.override_level_music) + { + /* 1st try: look for special artwork in current level series directory */ + directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY); + if (fileExists(directory)) + return directory; + } + + /* 2nd try: look for special artwork in configured artwork directory */ + directory = getStringCopy(getSetupArtworkDir(artwork.mus_current)); + if (fileExists(directory)) + return directory; + + /* 3rd try: look for default artwork in new default artwork directory */ + directory = getStringCopy(getDefaultMusicDir(MUSIC_SUBDIR)); + if (fileExists(directory)) + return directory; + + /* 4th try: look for default artwork in old default artwork directory */ + directory = getStringCopy(options.music_directory); + if (fileExists(directory)) + return directory; + + return NULL; /* cannot find specified artwork file anywhere */ } void InitTapeDirectory(char *level_subdir) @@ -421,50 +516,6 @@ void InitLevelSetupDirectory(char *level_subdir) createDirectory(getLevelSetupDir(level_subdir), "level setup",PERMS_PRIVATE); } -void ReadChunk_VERS(FILE *file, int *file_version, int *game_version) -{ - int file_version_major, file_version_minor, file_version_patch; - int game_version_major, game_version_minor, game_version_patch; - - file_version_major = fgetc(file); - file_version_minor = fgetc(file); - file_version_patch = fgetc(file); - fgetc(file); /* not used */ - - game_version_major = fgetc(file); - game_version_minor = fgetc(file); - game_version_patch = fgetc(file); - fgetc(file); /* not used */ - - *file_version = VERSION_IDENT(file_version_major, - file_version_minor, - file_version_patch); - - *game_version = VERSION_IDENT(game_version_major, - game_version_minor, - game_version_patch); -} - -void WriteChunk_VERS(FILE *file, int file_version, int game_version) -{ - int file_version_major = VERSION_MAJOR(file_version); - int file_version_minor = VERSION_MINOR(file_version); - int file_version_patch = VERSION_PATCH(file_version); - int game_version_major = VERSION_MAJOR(game_version); - int game_version_minor = VERSION_MINOR(game_version); - int game_version_patch = VERSION_PATCH(game_version); - - fputc(file_version_major, file); - fputc(file_version_minor, file); - fputc(file_version_patch, file); - fputc(0, file); /* not used */ - - fputc(game_version_major, file); - fputc(game_version_minor, file); - fputc(game_version_patch, file); - fputc(0, file); /* not used */ -} - /* ------------------------------------------------------------------------- */ /* some functions to handle lists of level directories */ @@ -499,23 +550,23 @@ boolean validLevelSeries(TreeInfo *node) return (node != NULL && !node->node_group && !node->parent_link); } -TreeInfo *getFirstValidLevelSeries(TreeInfo *node) +TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node) { if (node == NULL) { - if (leveldir_first) /* start with first level directory entry */ - return getFirstValidLevelSeries(leveldir_first); + if (node->node_top) /* start with first tree entry */ + return getFirstValidTreeInfoEntry(*node->node_top); else return NULL; } else if (node->node_group) /* enter level group (step down into tree) */ - return getFirstValidLevelSeries(node->node_group); + return getFirstValidTreeInfoEntry(node->node_group); else if (node->parent_link) /* skip start entry of level group */ { if (node->next) /* get first real level series entry */ - return getFirstValidLevelSeries(node->next); + return getFirstValidTreeInfoEntry(node->next); else /* leave empty level group and go on */ - return getFirstValidLevelSeries(node->node_parent->next); + return getFirstValidTreeInfoEntry(node->node_parent->next); } else /* this seems to be a regular level series */ return node; @@ -615,7 +666,8 @@ void dumpTreeInfo(TreeInfo *node, int depth) for (i=0; i<(depth + 1) * 3; i++) printf(" "); - printf("filename == '%s' [%s]\n", node->filename, node->name); + printf("filename == '%s' (%s) [%s]\n", + node->filename, node->name, node->name_short); if (node->node_group != NULL) dumpTreeInfo(node->node_group, depth + 1); @@ -908,11 +960,12 @@ char *getFormattedSetupEntry(char *token, char *value) int i; static char entry[MAX_LINE_LEN]; + /* start with the token and some spaces to format output line */ sprintf(entry, "%s:", token); for (i=strlen(entry); ifilename = getStringCopy(directory_name); + checkSetupFileListIdentifier(setup_file_list, getCookie("LEVELINFO")); /* set all structure fields according to the token/value pairs */ @@ -1354,6 +1409,12 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, getTokenValue(setup_file_list, levelinfo_tokens[i].text)); *leveldir_new = ldi; + if (strcmp(leveldir_new->name, ANONYMOUS_NAME) == 0) + { + free(leveldir_new->name); + leveldir_new->name = getStringCopy(leveldir_new->filename); + } + DrawInitText(leveldir_new->name, 150, FC_YELLOW); if (leveldir_new->name_short == NULL) @@ -1362,8 +1423,6 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, 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; @@ -1450,6 +1509,11 @@ static void LoadLevelInfoFromLevelDir(TreeInfo **node_first, free(directory_path); + if (strcmp(directory_name, GRAPHICS_DIRECTORY) == 0 || + strcmp(directory_name, SOUNDS_DIRECTORY) == 0 || + strcmp(directory_name, MUSIC_DIRECTORY) == 0) + continue; + valid_entry_found |= LoadLevelInfoFromLevelConf(node_first, node_parent, level_directory, directory_name); @@ -1478,7 +1542,8 @@ void LoadLevelInfo() LoadLevelInfoFromLevelDir(&leveldir_first, NULL, options.level_directory); LoadLevelInfoFromLevelDir(&leveldir_first, NULL, getUserLevelDir(NULL)); - leveldir_current = getFirstValidLevelSeries(leveldir_first); + /* before sorting, the first entries will be from the user directory */ + leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); if (leveldir_first == NULL) Error(ERR_EXIT, "cannot find any valid level series in any directory"); @@ -1496,18 +1561,13 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, char *directory_name, int type) { char *directory_path = getPath2(base_directory, directory_name); - char *filename = - getPath2(directory_path, - (type == TREE_TYPE_GRAPHICS_DIR ? GRAPHICSINFO_FILENAME : - type == TREE_TYPE_SOUNDS_DIR ? SOUNDSINFO_FILENAME : - type == TREE_TYPE_MUSIC_DIR ? MUSICINFO_FILENAME : "")); + char *filename = getPath2(directory_path, ARTWORKINFO_FILENAME(type)); struct SetupFileList *setup_file_list = NULL; TreeInfo *artwork_new = NULL; - char *check_dir = NULL; int i; - if (access(getUserLevelDir(filename), F_OK) == 0) /* file exists */ - loadSetupFileList(filename); + if (access(filename, F_OK) == 0) /* file exists */ + setup_file_list = loadSetupFileList(filename); if (setup_file_list == NULL) /* no config file -- look for artwork files */ { @@ -1515,15 +1575,13 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, struct dirent *dir_entry; boolean valid_file_found = FALSE; - if ((dir = opendir(base_directory)) != NULL) + if ((dir = opendir(directory_path)) != NULL) { while ((dir_entry = readdir(dir)) != NULL) { char *entry_name = dir_entry->d_name; - if ((type == TREE_TYPE_GRAPHICS_DIR && FileIsGraphic(entry_name)) || - (type == TREE_TYPE_SOUNDS_DIR && FileIsSound(entry_name)) || - (type == TREE_TYPE_MUSIC_DIR && FileIsMusic(entry_name))) + if (FileIsArtworkType(entry_name, type)) { valid_file_found = TRUE; break; @@ -1535,7 +1593,8 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, if (!valid_file_found) { - Error(ERR_WARN, "ignoring artwork directory '%s'", base_directory); + if (strcmp(directory_name, ".") != 0) + Error(ERR_WARN, "ignoring artwork directory '%s'", directory_path); free(directory_path); free(filename); @@ -1566,6 +1625,12 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, getTokenValue(setup_file_list, levelinfo_tokens[i].text)); *artwork_new = ldi; + if (strcmp(artwork_new->name, ANONYMOUS_NAME) == 0) + { + free(artwork_new->name); + artwork_new->name = getStringCopy(artwork_new->filename); + } + DrawInitText(artwork_new->name, 150, FC_YELLOW); if (artwork_new->name_short == NULL) @@ -1577,20 +1642,17 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, if (node_parent == NULL) /* top level group */ { - artwork_new->basepath = base_directory; - artwork_new->fullpath = artwork_new->filename; + artwork_new->basepath = getStringCopy(base_directory); + artwork_new->fullpath = getStringCopy(artwork_new->filename); } else /* sub level group */ { - artwork_new->basepath = node_parent->basepath; + artwork_new->basepath = getStringCopy(node_parent->basepath); artwork_new->fullpath = getPath2(node_parent->fullpath, directory_name); } - check_dir = (type == TREE_TYPE_GRAPHICS_DIR ? options.graphics_directory : - type == TREE_TYPE_SOUNDS_DIR ? options.sounds_directory : - type == TREE_TYPE_MUSIC_DIR ? options.music_directory : ""); artwork_new->user_defined = - (artwork_new->basepath == check_dir ? FALSE : TRUE); + (artwork_new->basepath == OPTIONS_ARTWORK_DIRECTORY(type) ? FALSE : TRUE); /* (may use ".sort_priority" from "setup_file_list" above) */ artwork_new->color = LEVELCOLOR(artwork_new); @@ -1604,9 +1666,18 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, if (strcmp(artwork_new->filename, ".") == 0) { if (artwork_new->user_defined) + { artwork_new->name = getStringCopy("private"); + artwork_new->sort_priority = LEVELCLASS_USER; + } else - artwork_new->name = getStringCopy("default"); + { + artwork_new->name = getStringCopy("classic"); + artwork_new->sort_priority = LEVELCLASS_CLASSICS; + } + + artwork_new->color = LEVELCOLOR(artwork_new); + artwork_new->class_desc = getLevelClassDescription(artwork_new); } else artwork_new->name = getStringCopy(artwork_new->filename); @@ -1635,12 +1706,7 @@ static void LoadArtworkInfoFromArtworkDir(TreeInfo **node_first, if ((dir = opendir(base_directory)) == NULL) { - if ((type == TREE_TYPE_GRAPHICS_DIR && - base_directory == options.graphics_directory) || - (type == TREE_TYPE_SOUNDS_DIR && - base_directory == options.sounds_directory) || - (type == TREE_TYPE_MUSIC_DIR && - base_directory == options.music_directory)) + if (base_directory == OPTIONS_ARTWORK_DIRECTORY(type)) Error(ERR_WARN, "cannot read directory '%s'", base_directory); return; } @@ -1712,9 +1778,96 @@ void LoadArtworkInfo() TREE_TYPE_MUSIC_DIR); /* before sorting, the first entries will be from the user directory */ - artwork.gfx_current = artwork.gfx_first; - artwork.snd_current = artwork.snd_first; - artwork.mus_current = artwork.mus_first; + artwork.gfx_current = + getTreeInfoFromFilename(artwork.gfx_first, setup.graphics_set); + if (artwork.gfx_current == NULL) + artwork.gfx_current = getFirstValidTreeInfoEntry(artwork.gfx_first); + + artwork.snd_current = + getTreeInfoFromFilename(artwork.snd_first, setup.sounds_set); + if (artwork.snd_current == NULL) + artwork.snd_current = getFirstValidTreeInfoEntry(artwork.snd_first); + + artwork.mus_current = + getTreeInfoFromFilename(artwork.mus_first, setup.music_set); + if (artwork.mus_current == NULL) + artwork.mus_current = getFirstValidTreeInfoEntry(artwork.mus_first); + + artwork.graphics_set_current_name = artwork.gfx_current->name; + artwork.sounds_set_current_name = artwork.snd_current->name; + artwork.music_set_current_name = artwork.mus_current->name; + +#if 0 + printf("graphics set == %s\n\n", artwork.graphics_set_current_name); + printf("sounds set == %s\n\n", artwork.sounds_set_current_name); + printf("music set == %s\n\n", artwork.music_set_current_name); +#endif + + sortTreeInfo(&artwork.gfx_first, compareTreeInfoEntries); + sortTreeInfo(&artwork.snd_first, compareTreeInfoEntries); + sortTreeInfo(&artwork.mus_first, compareTreeInfoEntries); + +#if 0 + dumpTreeInfo(artwork.gfx_first, 0); + dumpTreeInfo(artwork.snd_first, 0); + dumpTreeInfo(artwork.mus_first, 0); +#endif +} + +void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, + LevelDirTree *level_node) +{ + /* recursively check all level directories for artwork sub-directories */ + + while (level_node) + { + char *path = getPath2(getLevelDirFromTreeInfo(level_node), + ARTWORK_DIRECTORY((*artwork_node)->type)); + +#if 0 + if (!level_node->parent_link) + printf("CHECKING '%s' ['%s', '%s'] ...\n", path, + level_node->filename, level_node->name); +#endif + + if (!level_node->parent_link) + { + TreeInfo *topnode_last = *artwork_node; + + LoadArtworkInfoFromArtworkDir(artwork_node, NULL, path, + (*artwork_node)->type); + + if (topnode_last != *artwork_node) + { + free((*artwork_node)->name); + free((*artwork_node)->name_sorting); + free((*artwork_node)->name_short); + + (*artwork_node)->name = getStringCopy(level_node->name); + (*artwork_node)->name_sorting = getStringCopy(level_node->name); + (*artwork_node)->name_short = getStringCopy(level_node->filename); + + (*artwork_node)->sort_priority = level_node->sort_priority; + (*artwork_node)->color = LEVELCOLOR((*artwork_node)); + } + } + + free(path); + + if (level_node->node_group != NULL) + LoadArtworkInfoFromLevelInfo(artwork_node, level_node->node_group); + + level_node = level_node->next; + } +} + +void LoadLevelArtworkInfo() +{ + DrawInitText("Looking for custom level artwork:", 120, FC_GREEN); + + LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, leveldir_first); + LoadArtworkInfoFromLevelInfo(&artwork.snd_first, leveldir_first); + LoadArtworkInfoFromLevelInfo(&artwork.mus_first, leveldir_first); sortTreeInfo(&artwork.gfx_first, compareTreeInfoEntries); sortTreeInfo(&artwork.snd_first, compareTreeInfoEntries); @@ -1771,6 +1924,9 @@ char *getSetupValue(int type, void *value) { static char value_string[MAX_LINE_LEN]; + if (value == NULL) + return NULL; + switch (type) { case TYPE_BOOLEAN: @@ -1812,19 +1968,18 @@ char *getSetupValue(int type, void *value) char *getSetupLine(struct TokenInfo *token_info, char *prefix, int token_nr) { int i; - static char entry[MAX_LINE_LEN]; + char *line; + static char token_string[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; char *value_string = getSetupValue(token_type, setup_value); - /* start with the prefix, token and some spaces to format output line */ - sprintf(entry, "%s%s:", prefix, token_text); - for (i=strlen(entry); i/levelsetup.conf */ @@ -1868,7 +2025,7 @@ void LoadLevelSetup_LastSeries() leveldir_current = getTreeInfoFromFilename(leveldir_first, last_level_series); if (leveldir_current == NULL) - leveldir_current = leveldir_first; + leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); checkSetupFileListIdentifier(level_setup_list, getCookie("LEVELSETUP"));