X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibgame%2Fsetup.c;h=7818b7322eaa7a79faf4648d5a9ad85eb891b7a7;hb=5f9b6d3b52c7f8dc10c01782d466a1e8f5ca5f26;hp=eec6cb5a6ca1f6b5d187037bc32dcf35ebc172e5;hpb=f11d2545f41637e871283f7624dccc8243d05138;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index eec6cb5a..7818b732 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -3118,28 +3118,37 @@ static boolean CheckZipFileForDirectory(char *zip_filename, char *directory, return TRUE; } -boolean ExtractZipFileIntoDirectory(char *zip_filename, char *directory, - int tree_type) +char *ExtractZipFileIntoDirectory(char *zip_filename, char *directory, + int tree_type) { boolean zip_file_valid = CheckZipFileForDirectory(zip_filename, directory, tree_type); - Error(ERR_DEBUG, "zip file '%s': %s", zip_filename, - (zip_file_valid ? "EXTRACT" : "REJECT")); - if (!zip_file_valid) - return FALSE; + { + Error(ERR_WARN, "zip file '%s' rejected!", zip_filename); + + return NULL; + } char **zip_entries = zip_extract(zip_filename, directory); - boolean zip_file_extracted = (zip_entries != NULL); + if (zip_entries == NULL) + { + Error(ERR_WARN, "zip file '%s' could not be extracted!", zip_filename); - if (zip_file_extracted) - Error(ERR_DEBUG, "zip file successfully extracted!"); - else - Error(ERR_DEBUG, "zip file could not be extracted!"); + return NULL; + } - return zip_file_extracted; + Error(ERR_INFO, "zip file '%s' successfully extracted!", zip_filename); + + // first zip file entry contains top level directory + char *top_dir = zip_entries[0]; + + // remove trailing directory separator from top level directory + top_dir[strlen(top_dir) - 1] = '\0'; + + return top_dir; } static void ProcessZipFilesInDirectory(char *directory, int tree_type) @@ -3171,10 +3180,9 @@ static void ProcessZipFilesInDirectory(char *directory, int tree_type) if (!fileExists(zip_filename_extracted) && !fileExists(zip_filename_rejected)) { - boolean zip_file_extracted = ExtractZipFileIntoDirectory(zip_filename, - directory, - tree_type); - char *marker_filename = (zip_file_extracted ? zip_filename_extracted : + char *top_dir = ExtractZipFileIntoDirectory(zip_filename, directory, + tree_type); + char *marker_filename = (top_dir != NULL ? zip_filename_extracted : zip_filename_rejected); FILE *marker_file; @@ -3895,6 +3903,118 @@ void AddUserLevelSetToLevelInfo(char *level_subdir_new) Error(ERR_EXIT, "internal level set structure corrupted -- aborting"); } +static boolean AddUserArtworkSetToArtworkInfoExt(char *artwork_subdir_new, + int type) +{ + // get artwork info tree node of first artwork set + TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type); + char *artwork_user_dir = USER_ARTWORK_DIRECTORY(type); + + int draw_deactivation_mask = GetDrawDeactivationMask(); + + // override draw deactivation mask (temporarily disable drawing) + SetDrawDeactivationMask(REDRAW_ALL); + + // load new artwork set config and add it next to first artwork set + LoadArtworkInfoFromArtworkConf(&artwork_first_node->next, NULL, + artwork_user_dir, artwork_subdir_new, type); + + // set draw deactivation mask to previous value + SetDrawDeactivationMask(draw_deactivation_mask); + + // get artwork info tree node of newly added artwork set + LevelDirTree *artwork_new = getTreeInfoFromIdentifier(artwork_first_node, + artwork_subdir_new); + if (artwork_new == NULL) // should not happen + return FALSE; + + // correct top link and parent node link of newly created tree node + artwork_new->node_top = artwork_first_node->node_top; + artwork_new->node_parent = artwork_first_node->node_parent; + + // sort artwork info tree to adjust position of newly added artwork set + sortTreeInfo(&artwork_first_node); + + return TRUE; +} + +void AddUserArtworkSetToArtworkInfo(char *artwork_subdir_new, int type) +{ + if (!AddUserArtworkSetToArtworkInfoExt(artwork_subdir_new, type)) + Error(ERR_EXIT, "internal artwork set structure corrupted -- aborting"); +} + +static boolean AddUserTreeSetToTreeInfoExt(char *tree_subdir_new, int type) +{ + TreeInfo **tree_node_first, *tree_node_old, *tree_node_new; + char *tree_user_dir = TREE_USERDIR(type); + + if (tree_user_dir == NULL) // should not happen + return FALSE; + + // get first node of level or artwork tree + tree_node_first = TREE_FIRST_NODE_PTR(type); + + if (tree_node_first == NULL) // should not happen + return FALSE; + + if (type == TREE_TYPE_LEVEL_DIR) + { + // get level info tree node of personal user level set + tree_node_old = getTreeInfoFromIdentifier(*tree_node_first, getLoginName()); + } + else + { + // get artwork info tree node of first artwork set + tree_node_old = *tree_node_first; + } + + if (tree_node_old == NULL) // should not happen + return FALSE; + + int draw_deactivation_mask = GetDrawDeactivationMask(); + + // override draw deactivation mask (temporarily disable drawing) + SetDrawDeactivationMask(REDRAW_ALL); + + if (type == TREE_TYPE_LEVEL_DIR) + { + // load new level set config and add it next to first user level set + LoadLevelInfoFromLevelConf(&tree_node_old->next, NULL, + tree_user_dir, tree_subdir_new); + } + else + { + // load new artwork set config and add it next to first artwork set + LoadArtworkInfoFromArtworkConf(&tree_node_old->next, NULL, + tree_user_dir, tree_subdir_new, type); + } + + // set draw deactivation mask to previous value + SetDrawDeactivationMask(draw_deactivation_mask); + + // get tree info tree node of newly added tree set + tree_node_new = getTreeInfoFromIdentifier(*tree_node_first, tree_subdir_new); + + if (tree_node_new == NULL) // should not happen + return FALSE; + + // correct top link and parent node link of newly created tree node + tree_node_new->node_top = tree_node_old->node_top; + tree_node_new->node_parent = tree_node_old->node_parent; + + // sort tree info tree to adjust position of newly added tree set + sortTreeInfo(tree_node_first); + + return TRUE; +} + +void AddUserTreeSetToTreeInfo(char *tree_subdir_new, int type) +{ + if (!AddUserTreeSetToTreeInfoExt(tree_subdir_new, type)) + Error(ERR_EXIT, "internal tree set structure corrupted -- aborting"); +} + char *getArtworkIdentifierForUserLevelSet(int type) { char *classic_artwork_set = getClassicArtworkSet(type);