X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=0996d10dfea85596e4fdc50b8fb39e380af069e8;hb=e1fdeb57afb3db322b3757d8105c66ba33cadca4;hp=f140d8fdd8a6b189379a83f0c0fbf75267dea17c;hpb=0cccb6d03df991d9c978ef3f7e16aadf3470a49b;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index f140d8fd..0996d10d 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -170,7 +170,7 @@ static char *getTapeDir(char *level_subdir) static char *getScoreDir(char *level_subdir) { static char *score_dir = NULL; - char *data_dir = options.rw_base_directory; + char *data_dir = getCommonDataDir(); char *score_subdir = SCORES_DIRECTORY; if (score_dir) @@ -341,13 +341,13 @@ static char *getLevelArtworkDir(int type) char *artwork_path; if (leveldir_current == NULL) - return NOT_AVAILABLE; + return UNDEFINED_FILENAME; artwork_path = (type == TREE_TYPE_GRAPHICS_DIR ? leveldir_current->graphics_path : type == TREE_TYPE_SOUNDS_DIR ? leveldir_current->sounds_path : type == TREE_TYPE_MUSIC_DIR ? leveldir_current->music_path : - NOT_AVAILABLE); + UNDEFINED_FILENAME); return artwork_path; } @@ -408,7 +408,7 @@ char *getSetupFilename() static char *getCorrectedImageBasename(char *basename) { - char *result = basename; + char *basename_corrected = basename; #if defined(PLATFORM_MSDOS) if (program.filename_prefix != NULL) @@ -416,20 +416,25 @@ static char *getCorrectedImageBasename(char *basename) int prefix_len = strlen(program.filename_prefix); if (strncmp(basename, program.filename_prefix, prefix_len) == 0) - result = &basename[prefix_len]; - } -#endif + basename_corrected = &basename[prefix_len]; - return result; -} + /* if corrected filename is still longer than standard MS-DOS filename + size (8 characters + 1 dot + 3 characters file extension), shorten + filename by writing file extension after 8th basename character */ + if (strlen(basename_corrected) > 8+1+3) + { + static char *msdos_filename = NULL; -static boolean fileExists(char *filename) -{ -#if 0 - printf("checking file '%s'\n", filename); + if (msdos_filename != NULL) + free(msdos_filename); + + msdos_filename = getStringCopy(basename_corrected); + strncpy(&msdos_filename[8], &basename[strlen(basename) - 1+3], 1+3 + 1); + } + } #endif - return (access(filename, F_OK) == 0); + return basename_corrected; } char *getCustomImageFilename(char *basename) @@ -448,10 +453,14 @@ char *getCustomImageFilename(char *basename) if (fileExists(filename)) return filename; + free(filename); + /* 2nd try: look for special artwork in current level series directory */ filename = getPath3(getCurrentLevelDir(), GRAPHICS_DIRECTORY, basename); if (fileExists(filename)) return filename; + + free(filename); } /* 3rd try: look for special artwork in configured artwork directory */ @@ -459,11 +468,15 @@ char *getCustomImageFilename(char *basename) if (fileExists(filename)) return filename; + free(filename); + /* 4th try: look for default artwork in new default artwork directory */ filename = getPath2(getDefaultGraphicsDir(GRAPHICS_SUBDIR), basename); if (fileExists(filename)) return filename; + free(filename); + /* 5th try: look for default artwork in old default artwork directory */ filename = getPath2(options.graphics_directory, basename); if (fileExists(filename)) @@ -486,10 +499,14 @@ char *getCustomSoundFilename(char *basename) if (fileExists(filename)) return filename; + free(filename); + /* 2nd try: look for special artwork in current level series directory */ filename = getPath3(getCurrentLevelDir(), SOUNDS_DIRECTORY, basename); if (fileExists(filename)) return filename; + + free(filename); } /* 3rd try: look for special artwork in configured artwork directory */ @@ -497,11 +514,15 @@ char *getCustomSoundFilename(char *basename) if (fileExists(filename)) return filename; + free(filename); + /* 4th try: look for default artwork in new default artwork directory */ filename = getPath2(getDefaultSoundsDir(SOUNDS_SUBDIR), basename); if (fileExists(filename)) return filename; + free(filename); + /* 5th try: look for default artwork in old default artwork directory */ filename = getPath2(options.sounds_directory, basename); if (fileExists(filename)) @@ -510,9 +531,19 @@ char *getCustomSoundFilename(char *basename) return NULL; /* cannot find specified artwork file anywhere */ } -char *getCustomSoundConfigFilename() +char *getCustomArtworkFilename(char *basename, int type) +{ + if (type == ARTWORK_TYPE_GRAPHICS) + return getCustomImageFilename(basename); + else if (type == ARTWORK_TYPE_SOUNDS) + return getCustomSoundFilename(basename); + else + return UNDEFINED_FILENAME; +} + +char *getCustomArtworkConfigFilename(int type) { - return getCustomSoundFilename(SOUNDSINFO_FILENAME); + return getCustomArtworkFilename(ARTWORKINFO_FILENAME(type), type); } char *getCustomMusicDirectory(void) @@ -529,10 +560,14 @@ char *getCustomMusicDirectory(void) if (fileExists(directory)) return directory; + free(directory); + /* 2nd try: look for special artwork in current level series directory */ directory = getPath2(getCurrentLevelDir(), MUSIC_DIRECTORY); if (fileExists(directory)) return directory; + + free(directory); } /* 3rd try: look for special artwork in configured artwork directory */ @@ -540,11 +575,15 @@ char *getCustomMusicDirectory(void) if (fileExists(directory)) return directory; + free(directory); + /* 4th try: look for default artwork in new default artwork directory */ directory = getStringCopy(getDefaultMusicDir(MUSIC_SUBDIR)); if (fileExists(directory)) return directory; + free(directory); + /* 5th try: look for default artwork in old default artwork directory */ directory = getStringCopy(options.music_directory); if (fileExists(directory)) @@ -562,6 +601,7 @@ void InitTapeDirectory(char *level_subdir) void InitScoreDirectory(char *level_subdir) { + createDirectory(getCommonDataDir(), "common data", PERMS_PUBLIC); createDirectory(getScoreDir(NULL), "main score", PERMS_PUBLIC); createDirectory(getScoreDir(level_subdir), "level score", PERMS_PUBLIC); } @@ -837,15 +877,33 @@ char *getUserDataDir(void) { static char *userdata_dir = NULL; - if (!userdata_dir) + if (userdata_dir == NULL) + userdata_dir = getPath2(getHomeDir(), program.userdata_directory); + + return userdata_dir; +} + +char *getCommonDataDir(void) +{ + static char *common_data_dir = NULL; + +#if defined(PLATFORM_WIN32) + if (common_data_dir == NULL) { - char *home_dir = getHomeDir(); - char *data_dir = program.userdata_directory; + char *dir = checked_malloc(MAX_PATH + 1); - userdata_dir = getPath2(home_dir, data_dir); + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_DOCUMENTS, NULL, 0, dir)) + && strcmp(dir, "") != 0) /* empty for Windows 95/98 */ + common_data_dir = getPath2(dir, program.userdata_directory); + else + common_data_dir = options.rw_base_directory; } +#else + if (common_data_dir == NULL) + common_data_dir = options.rw_base_directory; +#endif - return userdata_dir; + return common_data_dir; } char *getSetupDir() @@ -965,58 +1023,6 @@ boolean checkCookieString(const char *cookie, const char *template) /* setup file list handling functions */ /* ------------------------------------------------------------------------- */ -int get_string_integer_value(char *s) -{ - static char *number_text[][3] = - { - { "0", "zero", "null", }, - { "1", "one", "first" }, - { "2", "two", "second" }, - { "3", "three", "third" }, - { "4", "four", "fourth" }, - { "5", "five", "fifth" }, - { "6", "six", "sixth" }, - { "7", "seven", "seventh" }, - { "8", "eight", "eighth" }, - { "9", "nine", "ninth" }, - { "10", "ten", "tenth" }, - { "11", "eleven", "eleventh" }, - { "12", "twelve", "twelfth" }, - }; - - int i, j; - char *s_lower = getStringToLower(s); - int result = -1; - - for (i=0; i<13; i++) - for (j=0; j<3; j++) - if (strcmp(s_lower, number_text[i][j]) == 0) - result = i; - - if (result == -1) - result = atoi(s); - - free(s_lower); - - return result; -} - -boolean get_string_boolean_value(char *s) -{ - char *s_lower = getStringToLower(s); - boolean result = FALSE; - - if (strcmp(s_lower, "true") == 0 || - strcmp(s_lower, "yes") == 0 || - strcmp(s_lower, "on") == 0 || - get_string_integer_value(s) == 1) - result = TRUE; - - free(s_lower); - - return result; -} - char *getFormattedSetupEntry(char *token, char *value) { int i; @@ -1035,7 +1041,7 @@ char *getFormattedSetupEntry(char *token, char *value) void freeSetupFileList(struct SetupFileList *setup_file_list) { - if (!setup_file_list) + if (setup_file_list == NULL) return; if (setup_file_list->token) @@ -1047,15 +1053,12 @@ void freeSetupFileList(struct SetupFileList *setup_file_list) free(setup_file_list); } -static struct SetupFileList *newSetupFileList(char *token, char *value) +struct SetupFileList *newSetupFileList(char *token, char *value) { struct SetupFileList *new = checked_malloc(sizeof(struct SetupFileList)); - new->token = checked_malloc(strlen(token) + 1); - strcpy(new->token, token); - - new->value = checked_malloc(strlen(value) + 1); - strcpy(new->value, value); + new->token = getStringCopy(token); + new->value = getStringCopy(value); new->next = NULL; @@ -1064,7 +1067,7 @@ static struct SetupFileList *newSetupFileList(char *token, char *value) char *getTokenValue(struct SetupFileList *setup_file_list, char *token) { - if (!setup_file_list) + if (setup_file_list == NULL) return NULL; if (strcmp(setup_file_list->token, token) == 0) @@ -1073,17 +1076,18 @@ char *getTokenValue(struct SetupFileList *setup_file_list, char *token) return getTokenValue(setup_file_list->next, token); } -static void setTokenValue(struct SetupFileList *setup_file_list, - char *token, char *value) +void setTokenValue(struct SetupFileList *setup_file_list, + char *token, char *value) { - if (!setup_file_list) + if (setup_file_list == NULL) return; if (strcmp(setup_file_list->token, token) == 0) { - free(setup_file_list->value); - setup_file_list->value = checked_malloc(strlen(value) + 1); - strcpy(setup_file_list->value, value); + if (setup_file_list->value) + free(setup_file_list->value); + + setup_file_list->value = getStringCopy(value); } else if (setup_file_list->next == NULL) setup_file_list->next = newSetupFileList(token, value); @@ -1111,7 +1115,6 @@ struct SetupFileList *loadSetupFileList(char *filename) char *token, *value, *line_ptr; struct SetupFileList *setup_file_list = newSetupFileList("", ""); struct SetupFileList *first_valid_list_entry; - FILE *file; if (!(file = fopen(filename, MODE_READ))) @@ -1299,9 +1302,9 @@ static void setTreeInfoToDefaults(TreeInfo *ldi, int type) ldi->graphics_set = NULL; ldi->sounds_set = NULL; ldi->music_set = NULL; - ldi->graphics_path = getStringCopy(NOT_AVAILABLE); - ldi->sounds_path = getStringCopy(NOT_AVAILABLE); - ldi->music_path = getStringCopy(NOT_AVAILABLE); + ldi->graphics_path = getStringCopy(UNDEFINED_FILENAME); + ldi->sounds_path = getStringCopy(UNDEFINED_FILENAME); + ldi->music_path = getStringCopy(UNDEFINED_FILENAME); ldi->levels = 0; ldi->first_level = 0; ldi->last_level = 0; @@ -1363,7 +1366,7 @@ void setSetupInfo(struct TokenInfo *token_info, { case TYPE_BOOLEAN: case TYPE_SWITCH: - *(boolean *)setup_value = get_string_boolean_value(token_value); + *(boolean *)setup_value = get_boolean_from_string(token_value); break; case TYPE_KEY: @@ -1375,7 +1378,7 @@ void setSetupInfo(struct TokenInfo *token_info, break; case TYPE_INTEGER: - *(int *)setup_value = get_string_integer_value(token_value); + *(int *)setup_value = get_integer_from_string(token_value); break; case TYPE_STRING: @@ -1852,16 +1855,16 @@ static TreeInfo *getDummyArtworkInfo(int type) setTreeInfoToDefaults(artwork_new, type); - artwork_new->filename = getStringCopy(NOT_AVAILABLE); - artwork_new->fullpath = getStringCopy(NOT_AVAILABLE); - artwork_new->basepath = getStringCopy(NOT_AVAILABLE); + artwork_new->filename = getStringCopy(UNDEFINED_FILENAME); + artwork_new->fullpath = getStringCopy(UNDEFINED_FILENAME); + artwork_new->basepath = getStringCopy(UNDEFINED_FILENAME); if (artwork_new->name != NULL) free(artwork_new->name); - artwork_new->identifier = getStringCopy(NOT_AVAILABLE); - artwork_new->name = getStringCopy(NOT_AVAILABLE); - artwork_new->name_sorting = getStringCopy(NOT_AVAILABLE); + artwork_new->identifier = getStringCopy(UNDEFINED_FILENAME); + artwork_new->name = getStringCopy(UNDEFINED_FILENAME); + artwork_new->name_sorting = getStringCopy(UNDEFINED_FILENAME); return artwork_new; } @@ -2050,6 +2053,9 @@ static void SaveUserLevelInfo() ldi.first_level = 1; ldi.sort_priority = LEVELCLASS_USER_START; ldi.readonly = FALSE; + ldi.graphics_set = getStringCopy(GRAPHICS_SUBDIR); + ldi.sounds_set = getStringCopy(SOUNDS_SUBDIR); + ldi.music_set = getStringCopy(MUSIC_SUBDIR); fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER, getCookie("LEVELINFO")));