X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=inline;f=src%2Flibgame%2Fmisc.c;h=0d5a658e848b0bfef7f41385c9392a8a77ae4e3e;hb=2622581d611b8b727b1f7c4cffd3d72bcd9065bf;hp=11c0c185f1b04c3c21bc67434107e5b0b7aa24c9;hpb=6945f3749927053ee70b47133b2998557a452f75;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 11c0c185..0d5a658e 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,26 +984,28 @@ void putFileChunk(FILE *file, char *chunk_name, int chunk_size, int getFileVersion(FILE *file) { - int version_major, version_minor, version_patch; + int version_major, version_minor, version_patch, version_release; - version_major = fgetc(file); - version_minor = fgetc(file); - version_patch = fgetc(file); - fgetc(file); /* not used */ + version_major = fgetc(file); + version_minor = fgetc(file); + version_patch = fgetc(file); + version_release = fgetc(file); - return VERSION_IDENT(version_major, version_minor, version_patch); + return RELEASE_IDENT(version_major, version_minor, version_patch, + version_release); } 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_major = VERSION_MAJOR(version); + int version_minor = VERSION_MINOR(version); + int version_patch = VERSION_PATCH(version); + int version_release = VERSION_RELEASE(version); - fputc(version_major, file); - fputc(version_minor, file); - fputc(version_patch, file); - fputc(0, file); /* not used */ + fputc(version_major, file); + fputc(version_minor, file); + fputc(version_patch, file); + fputc(version_release, file); } void ReadUnusedBytesFromFile(FILE *file, unsigned long bytes) @@ -1513,37 +1518,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 @@ -1799,8 +1844,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 +1920,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,112 +1937,43 @@ 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; - SetupFileHash *extra_file_hash = NULL; -#if 0 - SetupFileHash *list; -#endif + 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; - printf("::: THIS 0\n"); +#if 0 + printf("::: LoadArtworkConfigFromFilename: '%s'\n", filename); +#endif if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; - printf("::: THIS 1 [%d]\n", num_file_list_entries); - /* read parameters for all known config file tokens */ for (i=0; inext) - { - if (strcmp(list->value, known_token_value) != 0) - { - if (extra_file_hash == NULL) - extra_file_hash = newSetupFileHash(list->token, list->value); - else - setHashEntry(extra_file_hash, list->token, list->value); - } - } -#else + extra_file_hash = newSetupFileHash(); BEGIN_HASH_ITERATION(setup_file_hash, itr) { if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) != 0) - { - if (extra_file_hash == NULL) - extra_file_hash = newSetupFileHash(); - setHashEntry(extra_file_hash, HASH_ITERATION_TOKEN(itr), HASH_ITERATION_VALUE(itr)); - } } END_HASH_ITERATION(setup_file_hash, itr) -#endif - /* at this point, we do not need the config file list anymore -- free it */ + /* at this point, we do not need the config file hash anymore -- free it */ freeSetupFileHash(setup_file_hash); /* now try to determine valid, dynamically defined config tokens */ -#if 0 - for (list = extra_file_hash; list != NULL; list = list->next) -#endif - BEGIN_HASH_ITERATION(extra_file_hash, itr) { struct FileInfo **dynamic_file_list = @@ -2204,12 +2189,12 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) if (extra_file_hash != NULL && options.verbose && IS_PARENT_PROCESS()) { + SetupFileList *setup_file_list, *list; boolean dynamic_tokens_found = FALSE; boolean unknown_tokens_found = FALSE; -#if 0 - for (list = extra_file_hash; list != NULL; list = list->next) -#endif + if ((setup_file_list = loadSetupFileList(filename)) == NULL) + Error(ERR_EXIT, "loadSetupFileHash works, but loadSetupFileList fails"); BEGIN_HASH_ITERATION(extra_file_hash, itr) { @@ -2220,26 +2205,22 @@ 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:"); - -#if 0 - for (list = extra_file_hash; list != NULL; list = list->next) -#endif + Error(ERR_RETURN, "dynamic token(s) found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", filename); - BEGIN_HASH_ITERATION(extra_file_hash, itr) + for (list = setup_file_list; list != NULL; list = list->next) { - if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) == 0) - Error(ERR_RETURN, "- dynamic token: '%s'",HASH_ITERATION_TOKEN(itr)); + char *value = getHashEntry(extra_file_hash, list->token); + + if (value != NULL && strcmp(value, known_token_value) == 0) + Error(ERR_RETURN, "- dynamic token: '%s'", list->token); } - END_HASH_ITERATION(extra_file_hash, itr) Error(ERR_RETURN_LINE, "-"); } -#endif if (unknown_tokens_found) { @@ -2247,19 +2228,18 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) Error(ERR_RETURN, "warning: unknown token(s) found in config file:"); Error(ERR_RETURN, "- config file: '%s'", filename); -#if 0 - for (list = extra_file_hash; list != NULL; list = list->next) -#endif - - BEGIN_HASH_ITERATION(extra_file_hash, itr) + for (list = setup_file_list; list != NULL; list = list->next) { - if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) != 0) - Error(ERR_RETURN, "- unknown token: '%s'",HASH_ITERATION_TOKEN(itr)); + char *value = getHashEntry(extra_file_hash, list->token); + + if (value != NULL && strcmp(value, known_token_value) != 0) + Error(ERR_RETURN, "- dynamic token: '%s'", list->token); } - END_HASH_ITERATION(extra_file_hash, itr) Error(ERR_RETURN_LINE, "-"); } + + freeSetupFileList(setup_file_list); } freeSetupFileHash(extra_file_hash); @@ -2276,6 +2256,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) { @@ -2306,7 +2350,7 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename) { char *init_text[] = - { "", + { "Loading graphics:", "Loading sounds:", "Loading music:" @@ -2319,9 +2363,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; @@ -2357,6 +2403,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); @@ -2374,9 +2424,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; @@ -2443,9 +2495,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);