X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=1d5a83bfffabcc9c064861e4c20c6ad292026282;hb=c5f483ea6c651aba3f9834ee47ba94e2c1bf9055;hp=d6ec2eeb175c322233dfb856b9c0b8bde9cb727a;hpb=3742724070e341b044fdfedfd0bb5780d64fb554;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index d6ec2eeb..1d5a83bf 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -114,22 +114,6 @@ static char *getLevelClassDescription(TreeInfo *ti) return "Unknown Level Class"; } -static char *getUserLevelDir(char *level_subdir) -{ - static char *userlevel_dir = NULL; - char *data_dir = getUserGameDataDir(); - char *userlevel_subdir = LEVELS_DIRECTORY; - - checked_free(userlevel_dir); - - if (level_subdir != NULL) - userlevel_dir = getPath3(data_dir, userlevel_subdir, level_subdir); - else - userlevel_dir = getPath2(data_dir, userlevel_subdir); - - return userlevel_dir; -} - static char *getScoreDir(char *level_subdir) { static char *score_dir = NULL; @@ -197,6 +181,22 @@ static char *getLevelDirFromTreeInfo(TreeInfo *node) return level_dir; } +char *getUserLevelDir(char *level_subdir) +{ + static char *userlevel_dir = NULL; + char *data_dir = getUserGameDataDir(); + char *userlevel_subdir = LEVELS_DIRECTORY; + + checked_free(userlevel_dir); + + if (level_subdir != NULL) + userlevel_dir = getPath3(data_dir, userlevel_subdir, level_subdir); + else + userlevel_dir = getPath2(data_dir, userlevel_subdir); + + return userlevel_dir; +} + char *getCurrentLevelDir() { return getLevelDirFromTreeInfo(leveldir_current); @@ -464,27 +464,35 @@ char *getProgramMainDataPath(char *command_filename, char *base_path) return main_data_path; } -char *getProgramConfigFilename(char *command_filename_ptr) +char *getProgramConfigFilename(char *command_filename) { - char *command_filename_1 = getStringCopy(command_filename_ptr); + char *command_filename_1 = getStringCopy(command_filename); // strip trailing executable suffix from command filename if (strSuffix(command_filename_1, ".exe")) command_filename_1[strlen(command_filename_1) - 4] = '\0'; - char *command_basepath = getBasePath(command_filename_ptr); - char *command_basename = getBaseNameNoSuffix(command_filename_ptr); + char *ro_base_path = getProgramMainDataPath(command_filename, RO_BASE_PATH); + char *conf_directory = getPath2(ro_base_path, CONF_DIRECTORY); + + char *command_basepath = getBasePath(command_filename); + char *command_basename = getBaseNameNoSuffix(command_filename); char *command_filename_2 = getPath2(command_basepath, command_basename); char *config_filename_1 = getStringCat2(command_filename_1, ".conf"); char *config_filename_2 = getStringCat2(command_filename_2, ".conf"); + char *config_filename_3 = getPath2(conf_directory, SETUP_FILENAME); // 1st try: look for config file that exactly matches the binary filename if (fileExists(config_filename_1)) return config_filename_1; - // 2nd try: return config filename that matches binary filename without suffix - return config_filename_2; + // 2nd try: look for config file that matches binary filename without suffix + if (fileExists(config_filename_2)) + return config_filename_2; + + // 3rd try: return setup config filename in global program config directory + return config_filename_3; } char *getTapeFilename(int nr) @@ -1567,7 +1575,7 @@ char *getCookie(char *file_type) sprintf(cookie, "%s_%s_FILE_VERSION_%d.%d", program.cookie_prefix, file_type, - program.version_major, program.version_minor); + program.version_super, program.version_major); return cookie; } @@ -1592,7 +1600,7 @@ int getFileVersionFromCookieString(const char *cookie) const int len_pattern1 = strlen(pattern1); const int len_pattern2 = strlen(pattern2); const int len_pattern = len_pattern1 + len_pattern2; - int version_major, version_minor; + int version_super, version_major; if (len_cookie <= len_pattern) return -1; @@ -1608,10 +1616,10 @@ int getFileVersionFromCookieString(const char *cookie) ptr_cookie2[2] < '0' || ptr_cookie2[2] > '9') return -1; - version_major = ptr_cookie2[0] - '0'; - version_minor = ptr_cookie2[2] - '0'; + version_super = ptr_cookie2[0] - '0'; + version_major = ptr_cookie2[2] - '0'; - return VERSION_IDENT(version_major, version_minor, 0, 0); + return VERSION_IDENT(version_super, version_major, 0, 0); } boolean checkCookieString(const char *cookie, const char *template) @@ -2228,27 +2236,30 @@ SetupFileHash *loadSetupFileHash(char *filename) #define LEVELINFO_TOKEN_NAME_SORTING 2 #define LEVELINFO_TOKEN_AUTHOR 3 #define LEVELINFO_TOKEN_YEAR 4 -#define LEVELINFO_TOKEN_IMPORTED_FROM 5 -#define LEVELINFO_TOKEN_IMPORTED_BY 6 -#define LEVELINFO_TOKEN_TESTED_BY 7 -#define LEVELINFO_TOKEN_LEVELS 8 -#define LEVELINFO_TOKEN_FIRST_LEVEL 9 -#define LEVELINFO_TOKEN_SORT_PRIORITY 10 -#define LEVELINFO_TOKEN_LATEST_ENGINE 11 -#define LEVELINFO_TOKEN_LEVEL_GROUP 12 -#define LEVELINFO_TOKEN_READONLY 13 -#define LEVELINFO_TOKEN_GRAPHICS_SET_ECS 14 -#define LEVELINFO_TOKEN_GRAPHICS_SET_AGA 15 -#define LEVELINFO_TOKEN_GRAPHICS_SET 16 -#define LEVELINFO_TOKEN_SOUNDS_SET 17 -#define LEVELINFO_TOKEN_MUSIC_SET 18 -#define LEVELINFO_TOKEN_FILENAME 19 -#define LEVELINFO_TOKEN_FILETYPE 20 -#define LEVELINFO_TOKEN_SPECIAL_FLAGS 21 -#define LEVELINFO_TOKEN_HANDICAP 22 -#define LEVELINFO_TOKEN_SKIP_LEVELS 23 - -#define NUM_LEVELINFO_TOKENS 24 +#define LEVELINFO_TOKEN_PROGRAM_TITLE 5 +#define LEVELINFO_TOKEN_PROGRAM_COPYRIGHT 6 +#define LEVELINFO_TOKEN_PROGRAM_COMPANY 7 +#define LEVELINFO_TOKEN_IMPORTED_FROM 8 +#define LEVELINFO_TOKEN_IMPORTED_BY 9 +#define LEVELINFO_TOKEN_TESTED_BY 10 +#define LEVELINFO_TOKEN_LEVELS 11 +#define LEVELINFO_TOKEN_FIRST_LEVEL 12 +#define LEVELINFO_TOKEN_SORT_PRIORITY 13 +#define LEVELINFO_TOKEN_LATEST_ENGINE 14 +#define LEVELINFO_TOKEN_LEVEL_GROUP 15 +#define LEVELINFO_TOKEN_READONLY 16 +#define LEVELINFO_TOKEN_GRAPHICS_SET_ECS 17 +#define LEVELINFO_TOKEN_GRAPHICS_SET_AGA 18 +#define LEVELINFO_TOKEN_GRAPHICS_SET 19 +#define LEVELINFO_TOKEN_SOUNDS_SET 20 +#define LEVELINFO_TOKEN_MUSIC_SET 21 +#define LEVELINFO_TOKEN_FILENAME 22 +#define LEVELINFO_TOKEN_FILETYPE 23 +#define LEVELINFO_TOKEN_SPECIAL_FLAGS 24 +#define LEVELINFO_TOKEN_HANDICAP 25 +#define LEVELINFO_TOKEN_SKIP_LEVELS 26 + +#define NUM_LEVELINFO_TOKENS 27 static LevelDirTree ldi; @@ -2260,6 +2271,9 @@ static struct TokenInfo levelinfo_tokens[] = { TYPE_STRING, &ldi.name_sorting, "name_sorting" }, { TYPE_STRING, &ldi.author, "author" }, { TYPE_STRING, &ldi.year, "year" }, + { TYPE_STRING, &ldi.program_title, "program_title" }, + { TYPE_STRING, &ldi.program_copyright, "program_copyright" }, + { TYPE_STRING, &ldi.program_company, "program_company" }, { TYPE_STRING, &ldi.imported_from, "imported_from" }, { TYPE_STRING, &ldi.imported_by, "imported_by" }, { TYPE_STRING, &ldi.tested_by, "tested_by" }, @@ -2289,6 +2303,9 @@ static struct TokenInfo artworkinfo_tokens[] = { TYPE_STRING, &ldi.name, "name" }, { TYPE_STRING, &ldi.name_sorting, "name_sorting" }, { TYPE_STRING, &ldi.author, "author" }, + { TYPE_STRING, &ldi.program_title, "program_title" }, + { TYPE_STRING, &ldi.program_copyright, "program_copyright" }, + { TYPE_STRING, &ldi.program_company, "program_company" }, { TYPE_INTEGER, &ldi.sort_priority, "sort_priority" }, { TYPE_STRING, &ldi.basepath, "basepath" }, { TYPE_STRING, &ldi.fullpath, "fullpath" }, @@ -2325,6 +2342,10 @@ static void setTreeInfoToDefaults(TreeInfo *ti, int type) ti->author = getStringCopy(ANONYMOUS_NAME); ti->year = NULL; + ti->program_title = NULL; + ti->program_copyright = NULL; + ti->program_company = NULL; + ti->sort_priority = LEVELCLASS_UNDEFINED; /* default: least priority */ ti->latest_engine = FALSE; /* default: get from level */ ti->parent_link = FALSE; @@ -2398,6 +2419,10 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ti, TreeInfo *parent) ti->author = getStringCopy(parent->author); ti->year = getStringCopy(parent->year); + ti->program_title = getStringCopy(parent->program_title); + ti->program_copyright = getStringCopy(parent->program_copyright); + ti->program_company = getStringCopy(parent->program_company); + ti->sort_priority = parent->sort_priority; ti->latest_engine = parent->latest_engine; ti->parent_link = FALSE; @@ -2463,6 +2488,11 @@ static TreeInfo *getTreeInfoCopy(TreeInfo *ti) ti_copy->name_sorting = getStringCopy(ti->name_sorting); ti_copy->author = getStringCopy(ti->author); ti_copy->year = getStringCopy(ti->year); + + ti_copy->program_title = getStringCopy(ti->program_title); + ti_copy->program_copyright = getStringCopy(ti->program_copyright); + ti_copy->program_company = getStringCopy(ti->program_company); + ti_copy->imported_from = getStringCopy(ti->imported_from); ti_copy->imported_by = getStringCopy(ti->imported_by); ti_copy->tested_by = getStringCopy(ti->tested_by); @@ -2520,6 +2550,10 @@ void freeTreeInfo(TreeInfo *ti) checked_free(ti->author); checked_free(ti->year); + checked_free(ti->program_title); + checked_free(ti->program_copyright); + checked_free(ti->program_company); + checked_free(ti->class_desc); checked_free(ti->infotext); @@ -2595,6 +2629,10 @@ void setSetupInfo(struct TokenInfo *token_info, *(char **)setup_value = getStringCopy(token_value); break; + case TYPE_PLAYER: + *(int *)setup_value = get_player_nr_from_string(token_value); + break; + default: break; } @@ -2812,22 +2850,13 @@ static TreeInfo *getArtworkInfoCacheEntry(LevelDirTree *level_node, int type) char *token = getCacheToken(token_prefix, artworkinfo_tokens[i].text); char *value = getHashEntry(artworkinfo_cache_old, token); - setSetupInfo(artworkinfo_tokens, i, value); - - /* check if cache entry for this item is invalid or incomplete */ - if (value == NULL) - { - Error(ERR_WARN, "cache entry '%s' invalid", token); - - cached = FALSE; - } + /* if defined, use value from cache, else keep default value */ + if (value != NULL) + setSetupInfo(artworkinfo_tokens, i, value); } *artwork_info = ldi; - } - if (cached) - { char *filename_levelinfo = getPath2(getLevelDirFromTreeInfo(level_node), LEVELINFO_FILENAME); char *filename_artworkinfo = getPath2(getSetupArtworkDir(artwork_info), @@ -3598,6 +3627,51 @@ void AddUserLevelSetToLevelInfo(char *level_subdir_new) Error(ERR_EXIT, "internal level set structure corrupted -- aborting"); } +char *getArtworkIdentifierForUserLevelSet(int type) +{ + char *classic_artwork_set = getClassicArtworkSet(type); + + /* check for custom artwork configured in "levelinfo.conf" */ + char *leveldir_artwork_set = + *LEVELDIR_ARTWORK_SET_PTR(leveldir_current, type); + boolean has_leveldir_artwork_set = + (leveldir_artwork_set != NULL && !strEqual(leveldir_artwork_set, + classic_artwork_set)); + + /* check for custom artwork in sub-directory "graphics" etc. */ + TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type); + char *leveldir_identifier = leveldir_current->identifier; + boolean has_artwork_subdir = + (getTreeInfoFromIdentifier(artwork_first_node, + leveldir_identifier) != NULL); + + return (has_leveldir_artwork_set ? leveldir_artwork_set : + has_artwork_subdir ? leveldir_identifier : + classic_artwork_set); +} + +TreeInfo *getArtworkTreeInfoForUserLevelSet(int type) +{ + char *artwork_set = getArtworkIdentifierForUserLevelSet(type); + TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type); + + return getTreeInfoFromIdentifier(artwork_first_node, artwork_set); +} + +boolean checkIfCustomArtworkExistsForCurrentLevelSet() +{ + char *graphics_set = + getArtworkIdentifierForUserLevelSet(ARTWORK_TYPE_GRAPHICS); + char *sounds_set = + getArtworkIdentifierForUserLevelSet(ARTWORK_TYPE_SOUNDS); + char *music_set = + getArtworkIdentifierForUserLevelSet(ARTWORK_TYPE_MUSIC); + + return (!strEqual(graphics_set, GFX_CLASSIC_SUBDIR) || + !strEqual(sounds_set, SND_CLASSIC_SUBDIR) || + !strEqual(music_set, MUS_CLASSIC_SUBDIR)); +} + boolean UpdateUserLevelSet(char *level_subdir, char *level_name, char *level_author, int num_levels) { @@ -3663,7 +3737,8 @@ boolean UpdateUserLevelSet(char *level_subdir, char *level_name, } boolean CreateUserLevelSet(char *level_subdir, char *level_name, - char *level_author, int num_levels) + char *level_author, int num_levels, + boolean use_artwork_set) { LevelDirTree *level_info; char *filename; @@ -3695,6 +3770,16 @@ boolean CreateUserLevelSet(char *level_subdir, char *level_name, level_info->sort_priority = LEVELCLASS_PRIVATE_START; level_info->readonly = FALSE; + if (use_artwork_set) + { + level_info->graphics_set = + getStringCopy(getArtworkIdentifierForUserLevelSet(ARTWORK_TYPE_GRAPHICS)); + level_info->sounds_set = + getStringCopy(getArtworkIdentifierForUserLevelSet(ARTWORK_TYPE_SOUNDS)); + level_info->music_set = + getStringCopy(getArtworkIdentifierForUserLevelSet(ARTWORK_TYPE_MUSIC)); + } + token_value_position = TOKEN_VALUE_POSITION_SHORT; fprintFileHeader(file, LEVELINFO_FILENAME); @@ -3707,12 +3792,16 @@ boolean CreateUserLevelSet(char *level_subdir, char *level_name, i == LEVELINFO_TOKEN_LEVELS || i == LEVELINFO_TOKEN_FIRST_LEVEL || i == LEVELINFO_TOKEN_SORT_PRIORITY || - i == LEVELINFO_TOKEN_READONLY) + i == LEVELINFO_TOKEN_READONLY || + (use_artwork_set && (i == LEVELINFO_TOKEN_GRAPHICS_SET || + i == LEVELINFO_TOKEN_SOUNDS_SET || + i == LEVELINFO_TOKEN_MUSIC_SET))) fprintf(file, "%s\n", getSetupLine(levelinfo_tokens, "", i)); /* just to make things nicer :) */ if (i == LEVELINFO_TOKEN_AUTHOR || - i == LEVELINFO_TOKEN_FIRST_LEVEL) + i == LEVELINFO_TOKEN_FIRST_LEVEL || + (use_artwork_set && i == LEVELINFO_TOKEN_READONLY)) fprintf(file, "\n"); } @@ -3730,7 +3819,7 @@ boolean CreateUserLevelSet(char *level_subdir, char *level_name, static void SaveUserLevelInfo() { - CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100); + CreateUserLevelSet(getLoginName(), getLoginName(), getRealName(), 100, FALSE); } char *getSetupValue(int type, void *value) @@ -3787,6 +3876,10 @@ char *getSetupValue(int type, void *value) strcpy(value_string, *(char **)value); break; + case TYPE_PLAYER: + sprintf(value_string, "player_%d", *(int *)value + 1); + break; + default: value_string[0] = '\0'; break;