X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=a19bcace92430800df871f8918dafb0a9974fdb0;hb=39af00f43cf5c4cea174d0e90633877df08a2f7c;hp=10656e46a208fdcc0cf746b226c3345374eece9f;hpb=0eaa7d33772143903b8a93abac8f1dce5422fa66;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 10656e46..a19bcace 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" /* ------------------------------------------------------------------------- */ @@ -324,7 +325,7 @@ unsigned int init_random_number(int nr, long seed) unsigned int get_random_number(int nr, unsigned int max) { - return (random_linux_libc(nr) % max); + return (max > 0 ? random_linux_libc(nr) % max : 0); } @@ -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() { @@ -981,14 +984,13 @@ void putFileChunk(FILE *file, char *chunk_name, int chunk_size, int getFileVersion(FILE *file) { - int version_major, version_minor, version_patch; - - version_major = fgetc(file); - version_minor = fgetc(file); - version_patch = fgetc(file); - fgetc(file); /* not used */ + int version_major = fgetc(file); + int version_minor = fgetc(file); + int version_patch = fgetc(file); + int version_build = fgetc(file); - return VERSION_IDENT(version_major, version_minor, version_patch); + return VERSION_IDENT(version_major, version_minor, version_patch, + version_build); } void putFileVersion(FILE *file, int version) @@ -996,11 +998,12 @@ void putFileVersion(FILE *file, int version) int version_major = VERSION_MAJOR(version); int version_minor = VERSION_MINOR(version); int version_patch = VERSION_PATCH(version); + int version_build = VERSION_BUILD(version); fputc(version_major, file); fputc(version_minor, file); fputc(version_patch, file); - fputc(0, file); /* not used */ + fputc(version_build, file); } void ReadUnusedBytesFromFile(FILE *file, unsigned long bytes) @@ -1371,32 +1374,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); @@ -1513,37 +1525,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) +{ + return fileHasSuffix(basename, "pcx"); +} + +boolean FileIsSound(char *basename) { - /* "music" can be a WAV (loop) file or (if compiled with SDL) a MOD file */ + 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 @@ -1601,27 +1653,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; @@ -1639,6 +1693,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 *); @@ -1799,8 +1867,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++) @@ -1867,7 +1943,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; @@ -1883,55 +1960,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; @@ -2189,11 +2228,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) { @@ -2205,7 +2244,6 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) Error(ERR_RETURN_LINE, "-"); } -#endif if (unknown_tokens_found) { @@ -2241,6 +2279,73 @@ 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 + + DrawInitText("Loading artwork config:", 120, FC_GREEN); + DrawInitText(ARTWORKINFO_FILENAME(artwork_info->type), 150, FC_YELLOW); + + /* 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) { @@ -2271,7 +2376,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename) { char *init_text[] = - { "", + { "Loading graphics:", "Loading sounds:", "Loading music:" @@ -2284,9 +2389,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 (*listnode == NULL && artwork_info->type == ARTWORK_TYPE_GRAPHICS) error_mode = ERR_EXIT; +#endif Error(error_mode, "cannot find artwork file '%s'", basename); return; @@ -2322,6 +2429,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); @@ -2339,9 +2450,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; @@ -2408,9 +2521,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);