X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=bde3ea638ccc744881a3d393fdf50190adf174bf;hb=14089dac2cbe56e563863e1e5adb8847944fd262;hp=5d4a4acc4b2474792327e10fdf44dde90f3fb0c2;hpb=fffaec4e69e54c74cf5eea689191e81b8c19b85a;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 5d4a4acc..bde3ea63 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -403,6 +403,14 @@ char *getPath3(char *path1, char *path2, char *path3) return complete_path; } +static char *getStringCat2(char *s1, char *s2) +{ + char *complete_string = checked_malloc(strlen(s1) + strlen(s2) + 1); + + sprintf(complete_string, "%s%s", s1, s2); + return complete_string; +} + char *getStringCopy(char *s) { char *s_copy; @@ -428,6 +436,34 @@ char *getStringToLower(char *s) return s_copy; } +static void printUsage() +{ + printf("\n" + "Usage: %s [OPTION]... [HOSTNAME [PORT]]\n" + "\n" + "Options:\n" + " -d, --display HOSTNAME[:SCREEN] specify X server display\n" + " -b, --basepath DIRECTORY alternative base DIRECTORY\n" + " -l, --level DIRECTORY alternative level DIRECTORY\n" + " -g, --graphics DIRECTORY alternative graphics DIRECTORY\n" + " -s, --sounds DIRECTORY alternative sounds DIRECTORY\n" + " -m, --music DIRECTORY alternative music DIRECTORY\n" + " -n, --network network multiplayer game\n" + " --serveronly only start network server\n" + " -v, --verbose verbose mode\n" + " --debug display debugging information\n" + " -e, --execute COMMAND execute batch COMMAND:\n" + "\n" + "Valid commands for '--execute' option:\n" + " \"print graphicsinfo.conf\" print default graphics config\n" + " \"print soundsinfo.conf\" print default sounds config\n" + " \"print musicinfo.conf\" print default music config\n" + " \"dump tape FILE\" dump tape data from FILE\n" + " \"autoplay LEVELDIR\" play level tapes for LEVELDIR\n" + "\n", + program.command_basename); +} + void GetOptions(char *argv[]) { char **options_left = &argv[1]; @@ -442,11 +478,11 @@ void GetOptions(char *argv[]) options.graphics_directory = RO_BASE_PATH "/" GRAPHICS_DIRECTORY; options.sounds_directory = RO_BASE_PATH "/" SOUNDS_DIRECTORY; options.music_directory = RO_BASE_PATH "/" MUSIC_DIRECTORY; + options.execute_command = NULL; options.serveronly = FALSE; options.network = FALSE; options.verbose = FALSE; options.debug = FALSE; - options.debug_command = NULL; while (*options_left) { @@ -484,22 +520,7 @@ void GetOptions(char *argv[]) Error(ERR_EXIT_HELP, "unrecognized option '%s'", option); else if (strncmp(option, "-help", option_len) == 0) { - printf("Usage: %s [options] [ []]\n" - "Options:\n" - " -d, --display [:] X server display\n" - " -b, --basepath alternative base directory\n" - " -l, --level alternative level directory\n" - " -g, --graphics alternative graphics directory\n" - " -s, --sounds alternative sounds directory\n" - " -m, --music alternative music directory\n" - " -n, --network network multiplayer game\n" - " --serveronly only start network server\n" - " -v, --verbose verbose mode\n" - " --debug display debugging information\n", - program.command_basename); - - if (options.debug) - printf(" --debug-command execute special command\n"); + printUsage(); exit(0); } @@ -579,12 +600,12 @@ void GetOptions(char *argv[]) { options.debug = TRUE; } - else if (strncmp(option, "-debug-command", option_len) == 0) + else if (strncmp(option, "-execute", option_len) == 0) { if (option_arg == NULL) Error(ERR_EXIT_HELP, "option '%s' requires an argument", option_str); - options.debug_command = option_arg; + options.execute_command = option_arg; if (option_arg == next_option) options_left++; } @@ -1349,27 +1370,60 @@ boolean FileIsArtworkType(char *basename, int type) /* ========================================================================= */ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, - char *suffix_list[], - int num_list_entries) + struct ConfigInfo *suffix_list, + int num_file_list_entries) { - struct FileInfo *file_list = - checked_calloc(num_list_entries * sizeof(struct FileInfo)); + struct FileInfo *file_list; + int num_file_list_entries_found = 0; + int num_suffix_list_entries = 0; int list_pos = 0; int i, j; + file_list = checked_calloc(num_file_list_entries * sizeof(struct FileInfo)); + + for (i=0; suffix_list[i].token != NULL; i++) + num_suffix_list_entries++; + + /* always start with reliable default values */ + for (i=0; i 0) + { + int parameter_array_size = num_suffix_list_entries * sizeof(int); + + file_list[i].default_parameter = checked_calloc(parameter_array_size); + file_list[i].parameter = checked_calloc(parameter_array_size); + + for (j=0; j= num_list_entries) - Error(ERR_EXIT, "inconsistant config list information -- please fix"); + if (i > 0) + list_pos++; + + if (list_pos >= num_file_list_entries) + break; + + /* simple sanity check if this is really a file definition */ + if (strcmp(&config_list[i].value[len_config_value - 4], ".pcx") != 0 && + strcmp(&config_list[i].value[len_config_value - 4], ".wav") != 0 && + strcmp(config_list[i].value, UNDEFINED_FILENAME) != 0) + { + Error(ERR_RETURN, "Configuration directive '%s' -> '%s':", + config_list[i].token, config_list[i].value); + Error(ERR_EXIT, "This seems to be no valid definition -- please fix"); + } file_list[list_pos].token = config_list[i].token; file_list[list_pos].default_filename = config_list[i].value; - - list_pos++; } } - if (list_pos != num_list_entries) - Error(ERR_EXIT, "inconsistant config list information -- please fix"); + num_file_list_entries_found = list_pos + 1; + if (num_file_list_entries_found != num_file_list_entries) + { + Error(ERR_RETURN, "inconsistant config list information:"); + Error(ERR_RETURN, "- should be: %d (according to 'src/conf_gfx.h')", + num_file_list_entries); + Error(ERR_RETURN, "- found to be: %d (according to 'src/conf_gfx.c')", + num_file_list_entries_found); + Error(ERR_EXIT, "please fix"); + } return file_list; } static void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) { - int num_list_entries = artwork_info->num_list_entries; struct FileInfo *file_list = artwork_info->file_list; + struct ConfigInfo *suffix_list = artwork_info->suffix_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 = getCustomArtworkConfigFilename(artwork_info->type); struct SetupFileList *setup_file_list; - int i; + int i, j; #if 0 printf("GOT CUSTOM ARTWORK CONFIG FILE '%s'\n", filename); #endif /* always start with reliable default values */ - for (i=0; itype); + + if (filename == NULL) + { + int error_mode = ERR_WARN; + + /* 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; + + 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) @@ -1490,20 +1608,43 @@ static void replaceArtworkListEntry(struct ArtworkListInfo *artwork_info, *listnode = (struct ListNodeInfo *)node->content; (*listnode)->num_references++; + + return; } - else if ((*listnode = artwork_info->load_artwork(filename)) != NULL) + + 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; + + /* we can get away without sounds and music, but not without graphics */ + if (artwork_info->type == ARTWORK_TYPE_GRAPHICS) + error_mode = ERR_EXIT; + + Error(error_mode, "cannot load artwork file '%s'", basename); + return; + } } static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, struct ListNodeInfo **listnode, char *basename) { +#if 0 char *filename = getCustomArtworkFilename(basename, artwork_info->type); +#endif #if 0 printf("GOT CUSTOM ARTWORK FILE '%s'\n", filename); @@ -1515,6 +1656,7 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, return; } +#if 0 if (filename == NULL) { Error(ERR_WARN, "cannot find artwork file '%s'", basename); @@ -1522,13 +1664,16 @@ static void LoadCustomArtwork(struct ArtworkListInfo *artwork_info, } replaceArtworkListEntry(artwork_info, listnode, filename); +#else + replaceArtworkListEntry(artwork_info, listnode, basename); +#endif } static void LoadArtworkToList(struct ArtworkListInfo *artwork_info, char *basename, int list_pos) { if (artwork_info->artwork_list == NULL || - list_pos >= artwork_info->num_list_entries) + list_pos >= artwork_info->num_file_list_entries) return; #if 0 @@ -1547,6 +1692,7 @@ static void LoadArtworkToList(struct ArtworkListInfo *artwork_info, void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) { +#if 0 static struct { char *text; @@ -1559,32 +1705,40 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) { "Loading sounds:", TRUE }, { "Loading music:", TRUE } }; +#endif - int num_list_entries = artwork_info->num_list_entries; + int num_file_list_entries = artwork_info->num_file_list_entries; struct FileInfo *file_list = artwork_info->file_list; int i; LoadArtworkConfig(artwork_info); +#if 0 if (draw_init[artwork_info->type].do_it) DrawInitText(draw_init[artwork_info->type].text, 120, FC_GREEN); +#endif #if 0 - printf("DEBUG: reloading %d sounds ...\n", num_list_entries); + printf("DEBUG: reloading %d artwork files ...\n", num_file_list_entries); #endif - for(i=0; itype].do_it) DrawInitText(file_list[i].token, 150, FC_YELLOW); +#endif - if (file_list[i].filename) - LoadArtworkToList(artwork_info, file_list[i].filename, i); - else - LoadArtworkToList(artwork_info, file_list[i].default_filename, i); + LoadArtworkToList(artwork_info, file_list[i].filename, i); + +#if 0 + printf("DEBUG: loading artwork file '%s'...\n", file_list[i].filename); +#endif } +#if 0 draw_init[artwork_info->type].do_it = FALSE; +#endif /* printf("list size == %d\n", getNumNodes(artwork_info->content_list)); @@ -1599,7 +1753,7 @@ void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info) { int i; - if (artwork_info->artwork_list == NULL) + if (artwork_info == NULL || artwork_info->artwork_list == NULL) return; #if 0 @@ -1607,7 +1761,7 @@ void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info) IS_CHILD_PROCESS(audio.mixer_pid) ? "CHILD" : "PARENT"); #endif - for(i=0; inum_list_entries; i++) + for(i=0; inum_file_list_entries; i++) deleteArtworkListEntry(artwork_info, &artwork_info->artwork_list[i]); #if 0 @@ -1618,7 +1772,7 @@ void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info) free(artwork_info->artwork_list); artwork_info->artwork_list = NULL; - artwork_info->num_list_entries = 0; + artwork_info->num_file_list_entries = 0; } @@ -1656,6 +1810,21 @@ void dumpErrorFile() #endif +/* ========================================================================= */ +/* some generic helper functions */ +/* ========================================================================= */ + +void printf_line(char line_char, int line_length) +{ + int i; + + for (i=0; i