X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=264060305f3ba9e64d6d7268da8a1ca472fcfbb1;hb=268045d6b06349f1cf10d5cc6f9516b5caa20dea;hp=efb56bba2cfc6d9030c5de4e1be6dc74f151f9e4;hpb=e1fdeb57afb3db322b3757d8105c66ba33cadca4;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index efb56bba..26406030 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -324,7 +324,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); } @@ -981,26 +981,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) @@ -1777,12 +1779,12 @@ static boolean token_suffix_match(char *token, char *suffix, int start_pos) #define KNOWN_TOKEN_VALUE "[KNOWN_TOKEN]" -static void read_token_parameters(struct SetupFileList *setup_file_list, +static void read_token_parameters(SetupFileHash *setup_file_hash, struct ConfigInfo *suffix_list, struct FileInfo *file_list_entry) { /* check for config token that is the base token without any suffixes */ - char *filename = getTokenValue(setup_file_list, file_list_entry->token); + char *filename = getHashEntry(setup_file_hash, file_list_entry->token); char *known_token_value = KNOWN_TOKEN_VALUE; int i; @@ -1797,23 +1799,31 @@ static void read_token_parameters(struct SetupFileList *setup_file_list, file_list_entry->redefined = TRUE; /* mark config file token as well known from default config */ - setTokenValue(setup_file_list, file_list_entry->token, known_token_value); + 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++) { char *token = getStringCat2(file_list_entry->token, suffix_list[i].token); - char *value = getTokenValue(setup_file_list, token); + char *value = getHashEntry(setup_file_hash, token); if (value != NULL) { setString(&file_list_entry->parameter[i], value); /* mark config file token as well known from default config */ - setTokenValue(setup_file_list, token, known_token_value); + setHashEntry(setup_file_hash, token, known_token_value); } free(token); @@ -1822,7 +1832,7 @@ static void read_token_parameters(struct SetupFileList *setup_file_list, static void add_dynamic_file_list_entry(struct FileInfo **list, int *num_list_entries, - struct SetupFileList *extra_file_list, + SetupFileHash *extra_file_hash, struct ConfigInfo *suffix_list, int num_suffix_list_entries, char *token) @@ -1843,7 +1853,7 @@ static void add_dynamic_file_list_entry(struct FileInfo **list, new_list_entry->filename = NULL; new_list_entry->parameter = checked_calloc(parameter_array_size); - read_token_parameters(extra_file_list, suffix_list, new_list_entry); + read_token_parameters(extra_file_hash, suffix_list, new_list_entry); } static void add_property_mapping(struct PropertyMapping **list, @@ -1867,8 +1877,346 @@ static void add_property_mapping(struct PropertyMapping **list, new_list_entry->artwork_index = artwork_index; } +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; + char **base_prefixes = artwork_info->base_prefixes; + char **ext1_suffixes = artwork_info->ext1_suffixes; + char **ext2_suffixes = artwork_info->ext2_suffixes; + char **ext3_suffixes = artwork_info->ext3_suffixes; + char **ignore_tokens = artwork_info->ignore_tokens; + int num_file_list_entries = artwork_info->num_file_list_entries; + int num_suffix_list_entries = artwork_info->num_suffix_list_entries; + int num_base_prefixes = artwork_info->num_base_prefixes; + int num_ext1_suffixes = artwork_info->num_ext1_suffixes; + 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; + SetupFileHash *setup_file_hash, *extra_file_hash; + char *known_token_value = KNOWN_TOKEN_VALUE; + int i, j, k, l; + + if (filename == NULL) + return; + +#if 0 + printf("::: LoadArtworkConfigFromFilename: '%s'\n", filename); +#endif + + if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) + return; + + /* read parameters for all known config file tokens */ + for (i=0; idynamic_file_list; + int *num_dynamic_file_list_entries = + &artwork_info->num_dynamic_file_list_entries; + struct PropertyMapping **property_mapping = + &artwork_info->property_mapping; + int *num_property_mapping_entries = + &artwork_info->num_property_mapping_entries; + int current_summarized_file_list_entry = + artwork_info->num_file_list_entries + + artwork_info->num_dynamic_file_list_entries; + char *token = HASH_ITERATION_TOKEN(itr); + int len_token = strlen(token); + int start_pos; + boolean base_prefix_found = FALSE; + boolean parameter_suffix_found = FALSE; + + /* skip all parameter definitions (handled by read_token_parameters()) */ + for (i=0; i < num_suffix_list_entries && !parameter_suffix_found; i++) + { + int len_suffix = strlen(suffix_list[i].token); + + if (token_suffix_match(token, suffix_list[i].token, -len_suffix)) + parameter_suffix_found = TRUE; + } + +#if 0 + if (IS_PARENT_PROCESS()) + { + if (parameter_suffix_found) + printf("---> skipping token '%s' (parameter token)\n", token); + else + printf("---> examining token '%s': search prefix ...\n", token); + } +#endif + + if (parameter_suffix_found) + continue; + + /* ---------- step 0: search for matching base prefix ---------- */ + + start_pos = 0; + for (i=0; i examining token '%s': search 1st suffix ...\n", token); +#endif + + /* ---------- step 1: search for matching first suffix ---------- */ + + start_pos += len_base_prefix; + for (j=0; j examining token '%s': search 2nd suffix ...\n", token); +#endif + + /* ---------- step 2: search for matching second suffix ---------- */ + + for (k=0; k examining token '%s': search 3rd suffix ...\n",token); +#endif + + /* ---------- step 3: search for matching third suffix ---------- */ + + for (l=0; lnum_dynamic_file_list_entries > 0) + { + artwork_info->dynamic_artwork_list = + checked_calloc(artwork_info->num_dynamic_file_list_entries * + artwork_info->sizeof_artwork_list_entry); + } + + 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 ((setup_file_list = loadSetupFileList(filename)) == NULL) + Error(ERR_EXIT, "loadSetupFileHash works, but loadSetupFileList fails"); + + BEGIN_HASH_ITERATION(extra_file_hash, itr) + { + if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) == 0) + dynamic_tokens_found = TRUE; + else + unknown_tokens_found = TRUE; + } + END_HASH_ITERATION(extra_file_hash, itr) + +#if DEBUG + if (dynamic_tokens_found) + { + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "dynamic token(s) found:"); + + for (list = setup_file_list; list != NULL; list = list->next) + { + 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); + } + + Error(ERR_RETURN_LINE, "-"); + } +#endif + + if (unknown_tokens_found) + { + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: unknown token(s) found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", filename); + + for (list = setup_file_list; list != NULL; list = list->next) + { + 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); + } + + Error(ERR_RETURN_LINE, "-"); + } + + freeSetupFileList(setup_file_list); + } + + freeSetupFileHash(extra_file_hash); + +#if 0 + for (i=0; i '%s'\n", file_list[i].filename); + else + printf("-> UNDEFINED [-> '%s']\n", file_list[i].default_filename); + } +#endif +} + void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) { +#if 0 struct FileInfo *file_list = artwork_info->file_list; struct ConfigInfo *suffix_list = artwork_info->suffix_list; char **base_prefixes = artwork_info->base_prefixes; @@ -1884,11 +2232,16 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) int num_ext3_suffixes = artwork_info->num_ext3_suffixes; int num_ignore_tokens = artwork_info->num_ignore_tokens; char *filename = getCustomArtworkConfigFilename(artwork_info->type); - struct SetupFileList *setup_file_list; - struct SetupFileList *extra_file_list = NULL; - struct SetupFileList *list; + SetupFileHash *setup_file_hash, *extra_file_hash; char *known_token_value = KNOWN_TOKEN_VALUE; int i, j, k, l; +#else + 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, *filename_local; + int i, j; +#endif #if 0 printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename); @@ -1931,38 +2284,68 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) artwork_info->num_property_mapping_entries = 0; } +#if 1 + /* 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); + +#if 0 + for(i=0; i '%s'\n", + file_list[i].token, file_list[i].filename); +#endif + +#if 1 + filename_local = getCustomArtworkConfigFilename(artwork_info->type); + + if (filename_local != NULL && strcmp(filename_base, filename_local) != 0) + LoadArtworkConfigFromFilename(artwork_info, filename_local); + +#if 0 + for(i=0; i '%s'\n", + file_list[i].token, file_list[i].filename); +#endif + +#endif +#endif + +#if 0 + if (filename == NULL) return; - if ((setup_file_list = loadSetupFileList(filename)) == NULL) + if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; /* read parameters for all known config file tokens */ for (i=0; inext) + extra_file_hash = newSetupFileHash(); + BEGIN_HASH_ITERATION(setup_file_hash, itr) { - if (strcmp(list->value, known_token_value) != 0) - { - if (extra_file_list == NULL) - extra_file_list = newSetupFileList(list->token, list->value); - else - setTokenValue(extra_file_list, list->token, list->value); - } + if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) != 0) + setHashEntry(extra_file_hash, + HASH_ITERATION_TOKEN(itr), HASH_ITERATION_VALUE(itr)); } + END_HASH_ITERATION(setup_file_hash, itr) - /* at this point, we do not need the config file list anymore -- free it */ - freeSetupFileList(setup_file_list); + /* 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 */ - for (list = extra_file_list; list != NULL; list = list->next) + BEGIN_HASH_ITERATION(extra_file_hash, itr) { struct FileInfo **dynamic_file_list = &artwork_info->dynamic_file_list; @@ -1975,7 +2358,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) int current_summarized_file_list_entry = artwork_info->num_file_list_entries + artwork_info->num_dynamic_file_list_entries; - char *token = list->token; + char *token = HASH_ITERATION_TOKEN(itr); int len_token = strlen(token); int start_pos; boolean base_prefix_found = FALSE; @@ -2032,7 +2415,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, - extra_file_list, + extra_file_hash, suffix_list, num_suffix_list_entries, token); @@ -2069,7 +2452,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, - extra_file_list, + extra_file_hash, suffix_list, num_suffix_list_entries, token); @@ -2111,7 +2494,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, - extra_file_list, + extra_file_hash, suffix_list, num_suffix_list_entries, token); @@ -2153,7 +2536,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) add_dynamic_file_list_entry(dynamic_file_list, num_dynamic_file_list_entries, - extra_file_list, + extra_file_hash, suffix_list, num_suffix_list_entries, token); @@ -2166,6 +2549,7 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) } } } + END_HASH_ITERATION(extra_file_hash, itr) if (artwork_info->num_dynamic_file_list_entries > 0) { @@ -2174,18 +2558,23 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) artwork_info->sizeof_artwork_list_entry); } - if (extra_file_list != NULL && options.verbose && IS_PARENT_PROCESS()) + 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; - for (list = extra_file_list; list != NULL; list = list->next) + if ((setup_file_list = loadSetupFileList(filename)) == NULL) + Error(ERR_EXIT, "loadSetupFileHash works, but loadSetupFileList fails"); + + BEGIN_HASH_ITERATION(extra_file_hash, itr) { - if (strcmp(list->value, known_token_value) == 0) + if (strcmp(HASH_ITERATION_VALUE(itr), known_token_value) == 0) dynamic_tokens_found = TRUE; else unknown_tokens_found = TRUE; } + END_HASH_ITERATION(extra_file_hash, itr) #if DEBUG if (dynamic_tokens_found) @@ -2193,9 +2582,13 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) Error(ERR_RETURN_LINE, "-"); Error(ERR_RETURN, "dynamic token(s) found:"); - for (list = extra_file_list; list != NULL; list = list->next) - if (strcmp(list->value, known_token_value) == 0) + for (list = setup_file_list; list != NULL; list = list->next) + { + 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); + } Error(ERR_RETURN_LINE, "-"); } @@ -2207,15 +2600,21 @@ void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) Error(ERR_RETURN, "warning: unknown token(s) found in config file:"); Error(ERR_RETURN, "- config file: '%s'", filename); - for (list = extra_file_list; list != NULL; list = list->next) - if (strcmp(list->value, known_token_value) != 0) - Error(ERR_RETURN, "- unknown token: '%s'", list->token); + for (list = setup_file_list; list != NULL; list = list->next) + { + 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); + } Error(ERR_RETURN_LINE, "-"); } + + freeSetupFileList(setup_file_list); } - freeSetupFileList(extra_file_list); + freeSetupFileHash(extra_file_hash); #if 0 for (i=0; i UNDEFINED [-> '%s']\n", file_list[i].default_filename); } #endif + +#endif } static void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info, @@ -2396,8 +2797,15 @@ 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 printf("DEBUG: reloading %d dynamic artwork files ...\n",