X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=00168642fb95fb9665f46805699c6194a560f7ea;hb=891c39ca37c4fea5f6cc4ca40f913a56c68ef495;hp=119533755368e60bc41368cecbd369fbdf885261;hpb=1bd9644544424ed912d886777c6e8ed387aac24a;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 11953375..00168642 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -45,30 +45,30 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] = IS_LEVELCLASS_EM(n) ? FC_YELLOW : \ IS_LEVELCLASS_SP(n) ? FC_GREEN : \ IS_LEVELCLASS_DX(n) ? FC_YELLOW : \ - IS_LEVELCLASS_CONTRIBUTION(n) ? FC_GREEN : \ - IS_LEVELCLASS_USER(n) ? FC_RED : \ + IS_LEVELCLASS_CONTRIB(n) ? FC_GREEN : \ + IS_LEVELCLASS_PRIVATE(n) ? FC_RED : \ FC_BLUE) -#define LEVELSORTING(n) (IS_LEVELCLASS_TUTORIAL(n) ? 0 : \ - IS_LEVELCLASS_CLASSICS(n) ? 1 : \ - IS_LEVELCLASS_BD(n) ? 2 : \ - IS_LEVELCLASS_EM(n) ? 3 : \ - IS_LEVELCLASS_SP(n) ? 4 : \ - IS_LEVELCLASS_DX(n) ? 5 : \ - IS_LEVELCLASS_CONTRIBUTION(n) ? 6 : \ - IS_LEVELCLASS_USER(n) ? 7 : \ +#define LEVELSORTING(n) (IS_LEVELCLASS_TUTORIAL(n) ? 0 : \ + IS_LEVELCLASS_CLASSICS(n) ? 1 : \ + IS_LEVELCLASS_BD(n) ? 2 : \ + IS_LEVELCLASS_EM(n) ? 3 : \ + IS_LEVELCLASS_SP(n) ? 4 : \ + IS_LEVELCLASS_DX(n) ? 5 : \ + IS_LEVELCLASS_CONTRIB(n) ? 6 : \ + IS_LEVELCLASS_PRIVATE(n) ? 7 : \ 9) #define ARTWORKCOLOR(n) (IS_ARTWORKCLASS_CLASSICS(n) ? FC_RED : \ - IS_ARTWORKCLASS_CONTRIBUTION(n) ? FC_YELLOW : \ + IS_ARTWORKCLASS_CONTRIB(n) ? FC_YELLOW : \ + IS_ARTWORKCLASS_PRIVATE(n) ? FC_RED : \ IS_ARTWORKCLASS_LEVEL(n) ? FC_GREEN : \ - IS_ARTWORKCLASS_USER(n) ? FC_RED : \ FC_BLUE) -#define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ? 0 : \ - IS_ARTWORKCLASS_CONTRIBUTION(n) ? 1 : \ - IS_ARTWORKCLASS_LEVEL(n) ? 2 : \ - IS_ARTWORKCLASS_USER(n) ? 3 : \ +#define ARTWORKSORTING(n) (IS_ARTWORKCLASS_CLASSICS(n) ? 0 : \ + IS_ARTWORKCLASS_LEVEL(n) ? 1 : \ + IS_ARTWORKCLASS_CONTRIB(n) ? 2 : \ + IS_ARTWORKCLASS_PRIVATE(n) ? 3 : \ 9) #define TOKEN_VALUE_POSITION 40 @@ -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); } } @@ -1405,13 +1508,14 @@ void checkSetupFileHashIdentifier(SetupFileHash *setup_file_hash, #define LEVELINFO_TOKEN_LEVELS 5 #define LEVELINFO_TOKEN_FIRST_LEVEL 6 #define LEVELINFO_TOKEN_SORT_PRIORITY 7 -#define LEVELINFO_TOKEN_LEVEL_GROUP 8 -#define LEVELINFO_TOKEN_READONLY 9 -#define LEVELINFO_TOKEN_GRAPHICS_SET 10 -#define LEVELINFO_TOKEN_SOUNDS_SET 11 -#define LEVELINFO_TOKEN_MUSIC_SET 12 +#define LEVELINFO_TOKEN_LATEST_ENGINE 8 +#define LEVELINFO_TOKEN_LEVEL_GROUP 9 +#define LEVELINFO_TOKEN_READONLY 10 +#define LEVELINFO_TOKEN_GRAPHICS_SET 11 +#define LEVELINFO_TOKEN_SOUNDS_SET 12 +#define LEVELINFO_TOKEN_MUSIC_SET 13 -#define NUM_LEVELINFO_TOKENS 13 +#define NUM_LEVELINFO_TOKENS 14 static LevelDirTree ldi; @@ -1426,6 +1530,7 @@ static struct TokenInfo levelinfo_tokens[] = { TYPE_INTEGER, &ldi.levels, "levels" }, { TYPE_INTEGER, &ldi.first_level, "first_level" }, { TYPE_INTEGER, &ldi.sort_priority, "sort_priority" }, + { TYPE_BOOLEAN, &ldi.latest_engine, "latest_engine" }, { TYPE_BOOLEAN, &ldi.level_group, "level_group" }, { TYPE_BOOLEAN, &ldi.readonly, "readonly" }, { TYPE_STRING, &ldi.graphics_set, "graphics_set" }, @@ -1459,6 +1564,7 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type) ldi->author = getStringCopy(ANONYMOUS_NAME); ldi->sort_priority = LEVELCLASS_UNDEFINED; /* default: least priority */ + ldi->latest_engine = FALSE; /* default: get from level */ ldi->parent_link = FALSE; ldi->user_defined = FALSE; ldi->color = 0; @@ -1517,6 +1623,7 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ldi, TreeInfo *parent) ldi->author = getStringCopy(parent->author); ldi->sort_priority = parent->sort_priority; + ldi->latest_engine = parent->latest_engine; ldi->parent_link = FALSE; ldi->user_defined = parent->user_defined; ldi->color = parent->color; @@ -1722,6 +1829,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent) setString(&ti_new->fullpath, node_parent->fullpath); ti_new->sort_priority = node_parent->sort_priority; + ti_new->latest_engine = node_parent->latest_engine; setString(&ti_new->class_desc, getLevelClassDescription(ti_new)); #else @@ -1733,6 +1841,7 @@ static void createParentTreeInfoNode(TreeInfo *node_parent) ti_new->fullpath = getStringCopy(node_parent->fullpath); ti_new->sort_priority = node_parent->sort_priority; + ti_new->latest_engine = node_parent->latest_engine; ti_new->class_desc = getLevelClassDescription(ti_new); #endif @@ -2088,7 +2197,7 @@ static boolean LoadArtworkInfoFromArtworkConf(TreeInfo **node_first, #else artwork_new->identifier = getStringCopy("private"); #endif - artwork_new->sort_priority = ARTWORKCLASS_USER; + artwork_new->sort_priority = ARTWORKCLASS_PRIVATE; } else { @@ -2431,7 +2540,7 @@ static void SaveUserLevelInfo() setString(&level_info->author, getRealName()); level_info->levels = 100; level_info->first_level = 1; - level_info->sort_priority = LEVELCLASS_USER_START; + level_info->sort_priority = LEVELCLASS_PRIVATE_START; level_info->readonly = FALSE; setString(&level_info->graphics_set, GFX_CLASSIC_SUBDIR); setString(&level_info->sounds_set, SND_CLASSIC_SUBDIR); @@ -2441,7 +2550,7 @@ static void SaveUserLevelInfo() ldi.author = getStringCopy(getRealName()); ldi.levels = 100; ldi.first_level = 1; - ldi.sort_priority = LEVELCLASS_USER_START; + ldi.sort_priority = LEVELCLASS_PRIVATE_START; ldi.readonly = FALSE; ldi.graphics_set = getStringCopy(GFX_CLASSIC_SUBDIR); ldi.sounds_set = getStringCopy(SND_CLASSIC_SUBDIR); @@ -2551,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))) { @@ -2585,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))) {