X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=3881d202338a5d3ab1971a35cf080fab644b2241;hb=ea6e4698905d7440a265e323d03cf13fc323c44b;hp=bcd8197cfdecbdf474267dedb232941e9339db11;hpb=1e5cae5e3ab889c3bcba80a065c6d7ba1e6d28a2;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index bcd8197c..3881d202 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -52,12 +52,6 @@ void printf_line(char *line_string, int line_length) fprintf_line(stdout, line_string, line_length); } -void printf_line_with_prefix(char *prefix, char *line_string, int line_length) -{ - fprintf(stdout, "%s", prefix); - fprintf_line(stdout, line_string, line_length); -} - /* int2str() returns a number converted to a string; the used memory is static, but will be overwritten by later calls, @@ -212,6 +206,14 @@ static void sleep_milliseconds(unsigned long milliseconds_delay) { boolean do_busy_waiting = (milliseconds_delay < 5 ? TRUE : FALSE); +#if 0 +#if defined(PLATFORM_MSDOS) + /* don't use select() to perform waiting operations under DOS + environment; always use a busy loop for waiting instead */ + do_busy_waiting = TRUE; +#endif +#endif + if (do_busy_waiting) { /* we want to wait only a few ms -- if we assume that we have a @@ -739,8 +741,10 @@ void GetOptions(char *argv[], void (*print_usage_function)(void)) if (option_arg == next_option) options_left++; +#if 1 /* when doing batch processing, always enable verbose mode (warnings) */ options.verbose = TRUE; +#endif } else if (*option == '-') { @@ -931,25 +935,6 @@ inline void swap_number_pairs(int *x1, int *y1, int *x2, int *y2) *y2 = help_y; } -/* the "put" variants of the following file access functions check for the file - pointer being != NULL and return the number of bytes they have or would have - written; this allows for chunk writing functions to first determine the size - of the (not yet written) chunk, write the correct chunk size and finally - write the chunk itself */ - -int getFile8BitInteger(FILE *file) -{ - return fgetc(file); -} - -int putFile8BitInteger(FILE *file, int value) -{ - if (file != NULL) - fputc(value, file); - - return 1; -} - int getFile16BitInteger(FILE *file, int byte_order) { if (byte_order == BYTE_ORDER_BIG_ENDIAN) @@ -960,23 +945,18 @@ int getFile16BitInteger(FILE *file, int byte_order) (fgetc(file) << 8)); } -int putFile16BitInteger(FILE *file, int value, int byte_order) +void putFile16BitInteger(FILE *file, int value, int byte_order) { - if (file != NULL) + if (byte_order == BYTE_ORDER_BIG_ENDIAN) { - if (byte_order == BYTE_ORDER_BIG_ENDIAN) - { - fputc((value >> 8) & 0xff, file); - fputc((value >> 0) & 0xff, file); - } - else /* BYTE_ORDER_LITTLE_ENDIAN */ - { - fputc((value >> 0) & 0xff, file); - fputc((value >> 8) & 0xff, file); - } + fputc((value >> 8) & 0xff, file); + fputc((value >> 0) & 0xff, file); + } + else /* BYTE_ORDER_LITTLE_ENDIAN */ + { + fputc((value >> 0) & 0xff, file); + fputc((value >> 8) & 0xff, file); } - - return 2; } int getFile32BitInteger(FILE *file, int byte_order) @@ -993,27 +973,22 @@ int getFile32BitInteger(FILE *file, int byte_order) (fgetc(file) << 24)); } -int putFile32BitInteger(FILE *file, int value, int byte_order) +void putFile32BitInteger(FILE *file, int value, int byte_order) { - if (file != NULL) + if (byte_order == BYTE_ORDER_BIG_ENDIAN) { - if (byte_order == BYTE_ORDER_BIG_ENDIAN) - { - fputc((value >> 24) & 0xff, file); - fputc((value >> 16) & 0xff, file); - fputc((value >> 8) & 0xff, file); - fputc((value >> 0) & 0xff, file); - } - else /* BYTE_ORDER_LITTLE_ENDIAN */ - { - fputc((value >> 0) & 0xff, file); - fputc((value >> 8) & 0xff, file); - fputc((value >> 16) & 0xff, file); - fputc((value >> 24) & 0xff, file); - } + fputc((value >> 24) & 0xff, file); + fputc((value >> 16) & 0xff, file); + fputc((value >> 8) & 0xff, file); + fputc((value >> 0) & 0xff, file); + } + else /* BYTE_ORDER_LITTLE_ENDIAN */ + { + fputc((value >> 0) & 0xff, file); + fputc((value >> 8) & 0xff, file); + fputc((value >> 16) & 0xff, file); + fputc((value >> 24) & 0xff, file); } - - return 4; } boolean getFileChunk(FILE *file, char *chunk_name, int *chunk_size, @@ -1070,22 +1045,6 @@ void putFileVersion(FILE *file, int version) fputc(version_build, file); } -void ReadBytesFromFile(FILE *file, byte *buffer, unsigned long bytes) -{ - int i; - - for(i = 0; i < bytes && !feof(file); i++) - buffer[i] = fgetc(file); -} - -void WriteBytesToFile(FILE *file, byte *buffer, unsigned long bytes) -{ - int i; - - for(i = 0; i < bytes; i++) - fputc(buffer[i], file); -} - void ReadUnusedBytesFromFile(FILE *file, unsigned long bytes) { while (bytes-- && !feof(file)) @@ -1525,6 +1484,10 @@ void addNodeToList(ListNode **node_first, char *key, void *content) { ListNode *node_new = newListNode(); +#if 0 + printf("LIST: adding node with key '%s'\n", key); +#endif + node_new->key = getStringCopy(key); node_new->content = content; node_new->next = *node_first; @@ -1537,8 +1500,17 @@ void deleteNodeFromList(ListNode **node_first, char *key, if (node_first == NULL || *node_first == NULL) return; +#if 0 + printf("[CHECKING LIST KEY '%s' == '%s']\n", + (*node_first)->key, key); +#endif + if (strcmp((*node_first)->key, key) == 0) { +#if 0 + printf("[DELETING LIST ENTRY]\n"); +#endif + free((*node_first)->key); if (destructor_function) destructor_function((*node_first)->content); @@ -1588,6 +1560,10 @@ boolean fileExists(char *filename) if (filename == NULL) return FALSE; +#if 0 + printf("checking file '%s'\n", filename); +#endif + return (access(filename, F_OK) == 0); } @@ -1744,7 +1720,7 @@ static boolean string_has_parameter(char *s, char *s_contained) return string_has_parameter(substring, s_contained); } -int get_parameter_value(char *value_raw, char *suffix, 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 */ @@ -1754,20 +1730,18 @@ int get_parameter_value(char *value_raw, char *suffix, int type) 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_NONE); + strcmp(value, "down") == 0 ? MV_DOWN : MV_NO_MOVING); } else if (strcmp(suffix, ".anim_mode") == 0) { - 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, "ce_value") ? ANIM_CE_VALUE : - string_has_parameter(value, "ce_score") ? ANIM_CE_SCORE : - string_has_parameter(value, "horizontal") ? ANIM_HORIZONTAL : - string_has_parameter(value, "vertical") ? ANIM_VERTICAL : + 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")) @@ -1797,7 +1771,7 @@ int get_auto_parameter_value(char *token, char *value_raw) if (suffix == NULL) suffix = token; - return get_parameter_value(value_raw, suffix, TYPE_INTEGER); + return get_parameter_value(suffix, value_raw, TYPE_INTEGER); } static void FreeCustomArtworkList(struct ArtworkListInfo *, @@ -1916,6 +1890,11 @@ static boolean token_suffix_match(char *token, char *suffix, int start_pos) int len_token = strlen(token); int len_suffix = strlen(suffix); +#if 0 + if (IS_PARENT_PROCESS()) + printf(":::::::::: check '%s' for '%s' ::::::::::\n", token, suffix); +#endif + if (start_pos < 0) /* compare suffix from end of string */ start_pos += len_token; @@ -1958,6 +1937,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++) @@ -1987,6 +1976,11 @@ static void add_dynamic_file_list_entry(struct FileInfo **list, struct FileInfo *new_list_entry; int parameter_array_size = num_suffix_list_entries * sizeof(char *); +#if 0 + if (IS_PARENT_PROCESS()) + printf("===> found dynamic definition '%s'\n", token); +#endif + (*num_list_entries)++; *list = checked_realloc(*list, *num_list_entries * sizeof(struct FileInfo)); new_list_entry = &(*list)[*num_list_entries - 1]; @@ -2048,6 +2042,10 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, if (filename == NULL) return; +#if 0 + printf("::: LoadArtworkConfigFromFilename: '%s'\n", filename); +#endif + if ((setup_file_hash = loadSetupFileHash(filename)) == NULL) return; @@ -2066,6 +2064,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, /* at this point, we do not need the setup file hash anymore -- free it */ freeSetupFileHash(setup_file_hash); +#if 1 /* map deprecated to current tokens (using prefix match and replace) */ BEGIN_HASH_ITERATION(valid_file_hash, itr) { @@ -2086,6 +2085,7 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, } } END_HASH_ITERATION(valid_file_hash, itr) +#endif /* read parameters for all known config file tokens */ for (i = 0; i < num_file_list_entries; i++) @@ -2143,6 +2143,16 @@ static void LoadArtworkConfigFromFilename(struct ArtworkListInfo *artwork_info, 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; @@ -2481,14 +2491,25 @@ static void deleteArtworkListEntry(struct ArtworkListInfo *artwork_info, { char *filename = (*listnode)->source_filename; +#if 0 + printf("[decrementing reference counter of artwork '%s']\n", filename); +#endif + if (--(*listnode)->num_references <= 0) + { +#if 0 + printf("[deleting artwork '%s']\n", filename); +#endif + deleteNodeFromList(&artwork_info->content_list, filename, artwork_info->free_artwork); + } *listnode = NULL; } } +#if 1 static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, struct ListNodeInfo **listnode, struct FileInfo *file_list_entry) @@ -2504,6 +2525,12 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, char *basename = file_list_entry->filename; char *filename = getCustomArtworkFilename(basename, artwork_info->type); +#if 0 + if (strcmp(file_list_entry->token, "background.DOOR") == 0) + printf("::: replaceArtworkListEntry: '%s' => '%s'\n", + basename, filename); +#endif + if (filename == NULL) { Error(ERR_WARN, "cannot find artwork file '%s'", basename); @@ -2564,6 +2591,110 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, return; } +#if 0 + if (strcmp(file_list_entry->token, "background.DOOR") == 0) + printf("::: replaceArtworkListEntry: LOAD IT'\n"); +#endif + +#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); + + if ((*listnode = artwork_info->load_artwork(filename)) != NULL) + { +#if 0 + printf("[adding new artwork '%s']\n", filename); +#endif + + (*listnode)->num_references = 1; + addNodeToList(&artwork_info->content_list, (*listnode)->source_filename, + *listnode); + } + else + { + 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; + } +} + +#else + +static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, + struct ListNodeInfo **listnode, + char *basename) +{ + char *init_text[] = + { + "Loading graphics:", + "Loading sounds:", + "Loading music:" + }; + + ListNode *node; + char *filename = getCustomArtworkFilename(basename, artwork_info->type); + + if (filename == NULL) + { + int error_mode = ERR_WARN; + +#if 1 + /* !!! NEW ARTWORK FALLBACK CODE !!! NEARLY UNTESTED !!! */ + /* before failing, try fallback to default artwork */ +#else + /* 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; + } + + /* check if the old and the new artwork file are the same */ + if (*listnode && strcmp((*listnode)->source_filename, filename) == 0) + { + /* The old and new artwork are the same (have the same filename and path). + This usually means that this artwork does not exist in this artwork set + and a fallback to the existing artwork is done. */ + +#if 0 + printf("[artwork '%s' already exists (same list entry)]\n", filename); +#endif + + return; + } + + /* delete existing artwork file entry */ + deleteArtworkListEntry(artwork_info, listnode); + + /* check if the new artwork file already exists in the list of artworks */ + if ((node = getNodeFromKey(artwork_info->content_list, filename)) != NULL) + { +#if 0 + printf("[artwork '%s' already exists (other list entry)]\n", filename); +#endif + + *listnode = (struct ListNodeInfo *)node->content; + (*listnode)->num_references++; + + 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); @@ -2581,15 +2712,19 @@ 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; } } +#endif +#if 1 static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, struct ListNodeInfo **listnode, struct FileInfo *file_list_entry) @@ -2598,6 +2733,12 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename); #endif +#if 0 + if (strcmp(file_list_entry->token, "background.DOOR") == 0) + printf("::: -> '%s' -> '%s'\n", + file_list_entry->token, file_list_entry->filename); +#endif + if (strcmp(file_list_entry->filename, UNDEFINED_FILENAME) == 0) { deleteArtworkListEntry(artwork_info, listnode); @@ -2607,6 +2748,86 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, replaceArtworkListEntry(artwork_info, listnode, file_list_entry); } +#else + +static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, + struct ListNodeInfo **listnode, + char *basename) +{ +#if 0 + printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename); +#endif + + if (strcmp(basename, UNDEFINED_FILENAME) == 0) + { + deleteArtworkListEntry(artwork_info, listnode); + return; + } + + replaceArtworkListEntry(artwork_info, listnode, basename); +} +#endif + +#if 1 +static void LoadArtworkToList(struct ArtworkListInfo *artwork_info, + struct ListNodeInfo **listnode, + struct FileInfo *file_list_entry) +{ +#if 0 + if (artwork_info->artwork_list == NULL || + list_pos >= artwork_info->num_file_list_entries) + return; +#endif + +#if 0 + printf("loading artwork '%s' ... [%d]\n", + file_list_entry->filename, getNumNodes(artwork_info->content_list)); +#endif + +#if 1 + LoadCustomArtwork(artwork_info, listnode, file_list_entry); +#else + LoadCustomArtwork(artwork_info, &artwork_info->artwork_list[list_pos], + basename); +#endif + +#if 0 + printf("loading artwork '%s' done [%d]\n", + basename, getNumNodes(artwork_info->content_list)); +#endif +} + +#else + +static void LoadArtworkToList(struct ArtworkListInfo *artwork_info, + struct ListNodeInfo **listnode, + char *basename, int list_pos) +{ +#if 0 + if (artwork_info->artwork_list == NULL || + list_pos >= artwork_info->num_file_list_entries) + return; +#endif + +#if 0 + printf("loading artwork '%s' ... [%d]\n", + basename, getNumNodes(artwork_info->content_list)); +#endif + +#if 1 + LoadCustomArtwork(artwork_info, listnode, basename); +#else + LoadCustomArtwork(artwork_info, &artwork_info->artwork_list[list_pos], + basename); +#endif + +#if 0 + printf("loading artwork '%s' done [%d]\n", + basename, getNumNodes(artwork_info->content_list)); +#endif +} +#endif + void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) { struct FileInfo *file_list = artwork_info->file_list; @@ -2616,13 +2837,86 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) artwork_info->num_dynamic_file_list_entries; int i; +#if 0 + printf("DEBUG: reloading %d static artwork files ...\n", + num_file_list_entries); +#endif + for (i = 0; i < num_file_list_entries; i++) - LoadCustomArtwork(artwork_info, &artwork_info->artwork_list[i], + { +#if 0 + if (strcmp(file_list[i].token, "background.DOOR") == 0) + printf("::: '%s' -> '%s'\n", file_list[i].token, file_list[i].filename); +#endif + +#if 1 + LoadArtworkToList(artwork_info, &artwork_info->artwork_list[i], &file_list[i]); +#else + LoadArtworkToList(artwork_info, &artwork_info->artwork_list[i], + file_list[i].filename, i); +#endif + +#if 0 + if (strcmp(file_list[i].token, "background.DOOR") == 0) + { + Bitmap *bitmap = getBitmapFromImageID(i); + + printf("::: BITMAP: %08lx\n", bitmap); + +#if 0 + BlitBitmap(bitmap, window, 0, 0, 100, 280, 0, 0); +#endif + } +#endif + +#if 0 + /* !!! NEW ARTWORK FALLBACK CODE !!! NEARLY UNTESTED !!! */ + if (artwork_info->artwork_list[i] == NULL && + strcmp(file_list[i].filename, UNDEFINED_FILENAME) != 0 && + strcmp(file_list[i].default_filename, file_list[i].filename) != 0 && + strcmp(file_list[i].default_filename, UNDEFINED_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); + + /* even the fallback to default artwork was not successful -- fail now */ + if (artwork_info->artwork_list[i] == NULL && + artwork_info->type == ARTWORK_TYPE_GRAPHICS) + Error(ERR_EXIT, "cannot find artwork file '%s' or default file '%s'", + file_list[i].filename, file_list[i].default_filename); + + file_list[i].fallback_to_default = TRUE; + } +#endif + } + +#if 0 + printf("DEBUG: reloading %d dynamic artwork files ...\n", + num_dynamic_file_list_entries); +#endif for (i = 0; i < num_dynamic_file_list_entries; i++) - LoadCustomArtwork(artwork_info, &artwork_info->dynamic_artwork_list[i], + { +#if 1 + LoadArtworkToList(artwork_info, &artwork_info->dynamic_artwork_list[i], &dynamic_file_list[i]); +#else + LoadArtworkToList(artwork_info, &artwork_info->dynamic_artwork_list[i], + dynamic_file_list[i].filename, i); +#endif + +#if 0 + printf("::: '%s', '0x%08x'\n", + dynamic_file_list[i].filename, + dynamic_file_list[i].default_filename); +#endif + + /* dynamic artwork does not have default filename! */ + } #if 0 dumpList(artwork_info->content_list); @@ -2651,11 +2945,21 @@ void FreeCustomArtworkLists(struct ArtworkListInfo *artwork_info) if (artwork_info == NULL) return; +#if 0 + printf("%s: FREEING ARTWORK ...\n", + IS_CHILD_PROCESS() ? "CHILD" : "PARENT"); +#endif + FreeCustomArtworkList(artwork_info, &artwork_info->artwork_list, &artwork_info->num_file_list_entries); FreeCustomArtworkList(artwork_info, &artwork_info->dynamic_artwork_list, &artwork_info->num_dynamic_file_list_entries); + +#if 0 + printf("%s: FREEING ARTWORK -- DONE\n", + IS_CHILD_PROCESS() ? "CHILD" : "PARENT"); +#endif }