X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=inline;f=src%2Flibgame%2Fmisc.c;h=50a713f456be8c011b279044121e088516d57042;hb=fb8e38bdcf517d25055b236a3bb2cc1ccbf5fccc;hp=f487175728d274d820630ec09a205d9d7a2c846e;hpb=2ff21518535f914abaacf8ffc72bfbd2f319dcd5;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index f4871757..50a713f4 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -30,6 +30,7 @@ #include "setup.h" #include "random.h" #include "text.h" +#include "image.h" /* ------------------------------------------------------------------------- */ @@ -332,6 +333,7 @@ unsigned int get_random_number(int nr, unsigned int max) /* system info functions */ /* ------------------------------------------------------------------------- */ +#if !defined(PLATFORM_MSDOS) static char *get_corrected_real_name(char *real_name) { char *real_name_new = checked_malloc(MAX_USERNAME_LEN + 1); @@ -364,6 +366,7 @@ static char *get_corrected_real_name(char *real_name) return real_name_new; } +#endif char *getLoginName() { @@ -1373,32 +1376,41 @@ int get_integer_from_string(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" }, + { "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" }, + + { NULL, NULL, NULL }, }; int i, j; char *s_lower = getStringToLower(s); int result = -1; - for (i=0; i<13; i++) - for (j=0; j<3; j++) + for (i=0; number_text[i][0] != NULL; i++) + for (j=0; j < 3; j++) if (strcmp(s_lower, number_text[i][j]) == 0) result = i; if (result == -1) - result = atoi(s); + { + if (strcmp(s_lower, "false") == 0) + result = 0; + else if (strcmp(s_lower, "true") == 0) + result = 1; + else + result = atoi(s); + } free(s_lower); @@ -1515,37 +1527,77 @@ boolean fileExists(char *filename) return (access(filename, F_OK) == 0); } -boolean FileIsGraphic(char *filename) +boolean fileHasPrefix(char *basename, char *prefix) { - if (strlen(filename) > 4 && - strcmp(&filename[strlen(filename) - 4], ".pcx") == 0) + static char *basename_lower = NULL; + int basename_length, prefix_length; + + if (basename_lower != NULL) + free(basename_lower); + + if (basename == NULL || prefix == NULL) + return FALSE; + + basename_lower = getStringToLower(basename); + basename_length = strlen(basename_lower); + prefix_length = strlen(prefix); + + if (basename_length > prefix_length + 1 && + basename_lower[prefix_length] == '.' && + strncmp(basename_lower, prefix, prefix_length) == 0) return TRUE; return FALSE; } -boolean FileIsSound(char *basename) +boolean fileHasSuffix(char *basename, char *suffix) { - if (strlen(basename) > 4 && - strcmp(&basename[strlen(basename) - 4], ".wav") == 0) + static char *basename_lower = NULL; + int basename_length, suffix_length; + + if (basename_lower != NULL) + free(basename_lower); + + if (basename == NULL || suffix == NULL) + return FALSE; + + basename_lower = getStringToLower(basename); + basename_length = strlen(basename_lower); + suffix_length = strlen(suffix); + + if (basename_length > suffix_length + 1 && + basename_lower[basename_length - suffix_length - 1] == '.' && + strcmp(&basename_lower[basename_length - suffix_length], suffix) == 0) return TRUE; return FALSE; } -boolean FileIsMusic(char *basename) +boolean FileIsGraphic(char *basename) { - /* "music" can be a WAV (loop) file or (if compiled with SDL) a MOD file */ + return fileHasSuffix(basename, "pcx"); +} +boolean FileIsSound(char *basename) +{ + return fileHasSuffix(basename, "wav"); +} + +boolean FileIsMusic(char *basename) +{ if (FileIsSound(basename)) return TRUE; #if defined(TARGET_SDL) - if (strlen(basename) > 4 && - (strcmp(&basename[strlen(basename) - 4], ".mod") == 0 || - strcmp(&basename[strlen(basename) - 4], ".MOD") == 0 || - strncmp(basename, "mod.", 4) == 0 || - strncmp(basename, "MOD.", 4) == 0)) + if (fileHasPrefix(basename, "mod") || + fileHasSuffix(basename, "mod") || + fileHasSuffix(basename, "s3m") || + fileHasSuffix(basename, "it") || + fileHasSuffix(basename, "xm") || + fileHasSuffix(basename, "midi") || + fileHasSuffix(basename, "mid") || + fileHasSuffix(basename, "mp3") || + fileHasSuffix(basename, "ogg")) return TRUE; #endif @@ -1603,27 +1655,29 @@ static boolean string_has_parameter(char *s, char *s_contained) return string_has_parameter(substring, s_contained); } -int get_parameter_value(char *token, char *value_raw, int type) +int get_parameter_value(char *suffix, char *value_raw, int type) { char *value = getStringToLower(value_raw); int result = 0; /* probably a save default value */ - if (strcmp(token, ".direction") == 0) + if (strcmp(suffix, ".direction") == 0) { result = (strcmp(value, "left") == 0 ? MV_LEFT : strcmp(value, "right") == 0 ? MV_RIGHT : strcmp(value, "up") == 0 ? MV_UP : strcmp(value, "down") == 0 ? MV_DOWN : MV_NO_MOVING); } - else if (strcmp(token, ".anim_mode") == 0) + else if (strcmp(suffix, ".anim_mode") == 0) { - result = (string_has_parameter(value, "loop") ? ANIM_LOOP : - string_has_parameter(value, "linear") ? ANIM_LINEAR : - string_has_parameter(value, "pingpong") ? ANIM_PINGPONG : - string_has_parameter(value, "pingpong2") ? ANIM_PINGPONG2 : - string_has_parameter(value, "random") ? ANIM_RANDOM : - string_has_parameter(value, "none") ? ANIM_NONE : - ANIM_LOOP); + result = (string_has_parameter(value, "none") ? ANIM_NONE : + string_has_parameter(value, "loop") ? ANIM_LOOP : + string_has_parameter(value, "linear") ? ANIM_LINEAR : + string_has_parameter(value, "pingpong") ? ANIM_PINGPONG : + string_has_parameter(value, "pingpong2") ? ANIM_PINGPONG2 : + string_has_parameter(value, "random") ? ANIM_RANDOM : + string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL : + string_has_parameter(value, "vertical") ? ANIM_VERTICAL : + ANIM_DEFAULT); if (string_has_parameter(value, "reverse")) result |= ANIM_REVERSE; @@ -1641,6 +1695,20 @@ int get_parameter_value(char *token, char *value_raw, int type) return result; } +int get_auto_parameter_value(char *token, char *value_raw) +{ + char *suffix; + + if (token == NULL || value_raw == NULL) + return ARG_UNDEFINED_VALUE; + + suffix = strrchr(token, '.'); + if (suffix == NULL) + suffix = token; + + return get_parameter_value(suffix, value_raw, TYPE_INTEGER); +} + static void FreeCustomArtworkList(struct ArtworkListInfo *, struct ListNodeInfo ***, int *); @@ -1801,8 +1869,16 @@ static void read_token_parameters(SetupFileHash *setup_file_hash, /* mark config file token as well known from default config */ setHashEntry(setup_file_hash, file_list_entry->token, known_token_value); } +#if 0 else + { + if (strcmp(file_list_entry->filename, + file_list_entry->default_filename) != 0) + printf("___ resetting '%s' to default\n", file_list_entry->token); + setString(&file_list_entry->filename, file_list_entry->default_filename); + } +#endif /* check for config tokens that can be build by base token and suffixes */ for (i=0; suffix_list[i].token != NULL; i++) @@ -1869,7 +1945,8 @@ static void add_property_mapping(struct PropertyMapping **list, new_list_entry->artwork_index = artwork_index; } -void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) +static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, + char *filename) { struct FileInfo *file_list = artwork_info->file_list; struct ConfigInfo *suffix_list = artwork_info->suffix_list; @@ -1885,55 +1962,17 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) int num_ext2_suffixes = artwork_info->num_ext2_suffixes; int num_ext3_suffixes = artwork_info->num_ext3_suffixes; int num_ignore_tokens = artwork_info->num_ignore_tokens; - char *filename = getCustomArtworkConfigFilename(artwork_info->type); SetupFileHash *setup_file_hash, *extra_file_hash; char *known_token_value = KNOWN_TOKEN_VALUE; int i, j, k, l; -#if 0 - printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename); -#endif - - /* always start with reliable default values */ - for (i=0; idynamic_file_list != NULL) - { - for (i=0; inum_dynamic_file_list_entries; i++) - { - free(artwork_info->dynamic_file_list[i].token); - free(artwork_info->dynamic_file_list[i].filename); - free(artwork_info->dynamic_file_list[i].parameter); - } - - free(artwork_info->dynamic_file_list); - artwork_info->dynamic_file_list = NULL; - - FreeCustomArtworkList(artwork_info, &artwork_info->dynamic_artwork_list, - &artwork_info->num_dynamic_file_list_entries); - } - - /* free previous property mapping */ - if (artwork_info->property_mapping != NULL) - { - free(artwork_info->property_mapping); - - artwork_info->property_mapping = NULL; - artwork_info->num_property_mapping_entries = 0; - } - if (filename == NULL) return; +#if 0 + printf("::: LoadArtworkConfigFromFilename: '%s'\n", filename); +#endif + if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; @@ -2191,11 +2230,11 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) } END_HASH_ITERATION(extra_file_hash, itr) -#if DEBUG - if (dynamic_tokens_found) + if (options.debug && dynamic_tokens_found) { Error(ERR_RETURN_LINE, "-"); - Error(ERR_RETURN, "dynamic token(s) found:"); + Error(ERR_RETURN, "dynamic token(s) found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", filename); for (list = setup_file_list; list != NULL; list = list->next) { @@ -2207,7 +2246,6 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) Error(ERR_RETURN_LINE, "-"); } -#endif if (unknown_tokens_found) { @@ -2243,6 +2281,70 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) #endif } +void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) +{ + struct FileInfo *file_list = artwork_info->file_list; + int num_file_list_entries = artwork_info->num_file_list_entries; + int num_suffix_list_entries = artwork_info->num_suffix_list_entries; + char *filename_base = UNDEFINED_FILENAME, *filename_local; + int i, j; + +#if 0 + printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename); +#endif + + /* always start with reliable default values */ + for (i=0; idynamic_file_list != NULL) + { + for (i=0; inum_dynamic_file_list_entries; i++) + { + free(artwork_info->dynamic_file_list[i].token); + free(artwork_info->dynamic_file_list[i].filename); + free(artwork_info->dynamic_file_list[i].parameter); + } + + free(artwork_info->dynamic_file_list); + artwork_info->dynamic_file_list = NULL; + + FreeCustomArtworkList(artwork_info, &artwork_info->dynamic_artwork_list, + &artwork_info->num_dynamic_file_list_entries); + } + + /* free previous property mapping */ + if (artwork_info->property_mapping != NULL) + { + free(artwork_info->property_mapping); + + artwork_info->property_mapping = NULL; + artwork_info->num_property_mapping_entries = 0; + } + + if (!SETUP_OVERRIDE_ARTWORK(setup, artwork_info->type)) + { + /* first look for special artwork configured in level series config */ + filename_base = getCustomArtworkLevelConfigFilename(artwork_info->type); + + if (fileExists(filename_base)) + LoadArtworkConfigFromFilename(artwork_info, filename_base); + } + + filename_local = getCustomArtworkConfigFilename(artwork_info->type); + + if (filename_local != NULL && strcmp(filename_base, filename_local) != 0) + LoadArtworkConfigFromFilename(artwork_info, filename_local); +} + static void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info, struct ListNodeInfo **listnode) { @@ -2273,7 +2375,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename) { char *init_text[] = - { "", + { "Loading graphics:", "Loading sounds:", "Loading music:" @@ -2282,18 +2384,15 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, ListNode *node; char *filename = getCustomArtworkFilename(basename, artwork_info->type); -#if 1 - if (strcmp(basename, "RocksScreen.pcx") == 0) - printf("::: got filename '%s'\n", filename); -#endif - if (filename == NULL) { int error_mode = ERR_WARN; +#if 1 /* we can get away without sounds and music, but not without graphics */ if (*listnode == NULL && artwork_info->type == ARTWORK_TYPE_GRAPHICS) error_mode = ERR_EXIT; +#endif Error(error_mode, "cannot find artwork file '%s'", basename); return; @@ -2306,11 +2405,8 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, This usually means that this artwork does not exist in this artwork set and a fallback to the existing artwork is done. */ -#if 1 -#if 1 - if (strcmp(basename, "RocksScreen.pcx") == 0) -#endif - printf("[artwork '%s' already exists (same list entry)]\n", filename); +#if 0 + printf("[artwork '%s' already exists (same list entry)]\n", filename); #endif return; @@ -2332,6 +2428,10 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, return; } +#if 0 + printf("::: %s: '%s'\n", init_text[artwork_info->type], basename); +#endif + DrawInitText(init_text[artwork_info->type], 120, FC_GREEN); DrawInitText(basename, 150, FC_YELLOW); @@ -2349,9 +2449,11 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, { int error_mode = ERR_WARN; +#if 1 /* we can get away without sounds and music, but not without graphics */ if (artwork_info->type == ARTWORK_TYPE_GRAPHICS) error_mode = ERR_EXIT; +#endif Error(error_mode, "cannot load artwork file '%s'", basename); return; @@ -2418,9 +2520,28 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) #endif for(i=0; i '%s'\n", file_list[i].token, file_list[i].filename); +#endif + LoadArtworkToList(artwork_info, &artwork_info->artwork_list[i], file_list[i].filename, i); +#if 0 + if (artwork_info->artwork_list[i] == NULL && + strcmp(file_list[i].default_filename, file_list[i].filename) != 0) + { + Error(ERR_WARN, "trying default artwork file '%s'", + file_list[i].default_filename); + + LoadArtworkToList(artwork_info, &artwork_info->artwork_list[i], + file_list[i].default_filename, i); + } +#endif + } + #if 0 printf("DEBUG: reloading %d dynamic artwork files ...\n", num_dynamic_file_list_entries);