X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=00168642fb95fb9665f46805699c6194a560f7ea;hb=891c39ca37c4fea5f6cc4ca40f913a56c68ef495;hp=2c7dcfd7c8742db7418d6da057c59b644dc1ba83;hpb=a2c9a458aaa4ac568f07ecd25b19fbca3f766e6b;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 2c7dcfd7..00168642 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -405,6 +405,30 @@ char *getSetupFilename() return filename; } +char *getEditorSetupFilename() +{ + static char *filename = NULL; + + if (filename != NULL) + free(filename); + + filename = getPath2(getSetupDir(), EDITORSETUP_FILENAME); + + return filename; +} + +char *getElementInfoFilename() +{ + static char *filename = NULL; + + if (filename != NULL) + free(filename); + + filename = getPath2(getCurrentLevelDir(), ELEMENTINFO_FILENAME); + + return filename; +} + static char *getCorrectedArtworkBasename(char *basename) { char *basename_corrected = basename; @@ -556,12 +580,73 @@ char *getCustomSoundFilename(char *basename) return NULL; /* cannot find specified artwork file anywhere */ } +char *getCustomMusicFilename(char *basename) +{ + static char *filename = NULL; + boolean skip_setup_artwork = FALSE; + + if (filename != NULL) + free(filename); + + basename = getCorrectedArtworkBasename(basename); + + if (!setup.override_level_music) + { + /* 1st try: look for special artwork in current level series directory */ + filename = getPath3(getCurrentLevelDir(), MUSIC_DIRECTORY, basename); + if (fileExists(filename)) + return filename; + + free(filename); + + /* check if there is special artwork configured in level series config */ + if (getLevelArtworkSet(ARTWORK_TYPE_MUSIC) != NULL) + { + /* 2nd try: look for special artwork configured in level series config */ + filename = getPath2(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR), basename); + if (fileExists(filename)) + return filename; + + free(filename); + + /* take missing artwork configured in level set config from default */ + skip_setup_artwork = TRUE; + } + } + + if (!skip_setup_artwork) + { + /* 3rd try: look for special artwork in configured artwork directory */ + filename = getPath2(getSetupArtworkDir(artwork.mus_current), basename); + if (fileExists(filename)) + return filename; + + free(filename); + } + + /* 4th try: look for default artwork in new default artwork directory */ + filename = getPath2(getDefaultMusicDir(MUS_CLASSIC_SUBDIR), basename); + if (fileExists(filename)) + return filename; + + free(filename); + + /* 5th try: look for default artwork in old default artwork directory */ + filename = getPath2(options.music_directory, basename); + if (fileExists(filename)) + return filename; + + return NULL; /* cannot find specified artwork file anywhere */ +} + char *getCustomArtworkFilename(char *basename, int type) { if (type == ARTWORK_TYPE_GRAPHICS) return getCustomImageFilename(basename); else if (type == ARTWORK_TYPE_SOUNDS) return getCustomSoundFilename(basename); + else if (type == ARTWORK_TYPE_MUSIC) + return getCustomMusicFilename(basename); else return UNDEFINED_FILENAME; } @@ -1053,7 +1138,7 @@ int getFileVersionFromCookieString(const char *cookie) version_major = ptr_cookie2[0] - '0'; version_minor = ptr_cookie2[2] - '0'; - return VERSION_IDENT(version_major, version_minor, 0); + return VERSION_IDENT(version_major, version_minor, 0, 0); } boolean checkCookieString(const char *cookie, const char *template) @@ -1149,6 +1234,17 @@ SetupFileList *setListEntry(SetupFileList *list, char *token, char *value) return setListEntry(list->next, token, value); } +SetupFileList *addListEntry(SetupFileList *list, char *token, char *value) +{ + if (list == NULL) + return NULL; + + if (list->next == NULL) + return (list->next = newSetupFileList(token, value)); + else + return addListEntry(list->next, token, value); +} + #ifdef DEBUG static void printSetupFileList(SetupFileList *list) { @@ -1214,6 +1310,9 @@ SetupFileHash *newSetupFileHash() SetupFileHash *new_hash = create_hashtable(16, 0.75, get_hash_from_key, keys_are_equal); + if (new_hash == NULL) + Error(ERR_EXIT, "create_hashtable() failed -- out of memory"); + return new_hash; } @@ -1267,7 +1366,7 @@ static void *loadSetupFileData(char *filename, boolean use_hash) int line_len; char line[MAX_LINE_LEN]; char *token, *value, *line_ptr; - void *setup_file_data, *insert_ptr; + void *setup_file_data, *insert_ptr = NULL; FILE *file; if (use_hash) @@ -1326,7 +1425,11 @@ static void *loadSetupFileData(char *filename, boolean use_hash) if (line_ptr < line + line_len) value = line_ptr + 1; else +#if 1 + value = "true"; /* treat tokens without value as "true" */ +#else value = "\0"; +#endif /* cut leading whitespaces from value */ for (; *value; value++) @@ -1338,7 +1441,7 @@ static void *loadSetupFileData(char *filename, boolean use_hash) if (use_hash) setHashEntry((SetupFileHash *)setup_file_data, token, value); else - insert_ptr = setListEntry((SetupFileList *)insert_ptr, token, value); + insert_ptr = addListEntry((SetupFileList *)insert_ptr, token, value); } } @@ -2557,17 +2660,15 @@ char *getSetupLine(struct TokenInfo *token_info, char *prefix, int token_nr) void LoadLevelSetup_LastSeries() { - char *filename; - SetupFileHash *level_setup_hash = NULL; - - /* always start with reliable default values */ - leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); - /* ----------------------------------------------------------------------- */ /* ~/./levelsetup.conf */ /* ----------------------------------------------------------------------- */ - filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME); + char *filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME); + SetupFileHash *level_setup_hash = NULL; + + /* always start with reliable default values */ + leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); if ((level_setup_hash = loadSetupFileHash(filename))) { @@ -2591,17 +2692,15 @@ void LoadLevelSetup_LastSeries() void SaveLevelSetup_LastSeries() { - char *filename; - char *level_subdir = leveldir_current->filename; - FILE *file; - /* ----------------------------------------------------------------------- */ /* ~/./levelsetup.conf */ /* ----------------------------------------------------------------------- */ - InitUserDataDirectory(); + char *filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME); + char *level_subdir = leveldir_current->filename; + FILE *file; - filename = getPath2(getSetupDir(), LEVELSETUP_FILENAME); + InitUserDataDirectory(); if (!(file = fopen(filename, MODE_WRITE))) {