From 5f9b6d3b52c7f8dc10c01782d466a1e8f5ca5f26 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sun, 13 Jan 2019 13:10:50 +0100 Subject: [PATCH 1/1] added generic function to add new level or artwork set to tree --- src/events.c | 7 +---- src/libgame/setup.c | 71 ++++++++++++++++++++++++++++++++++++++++++++ src/libgame/setup.h | 1 + src/libgame/system.h | 10 +++++++ 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/src/events.c b/src/events.c index ac9e2ab0..f33b3116 100644 --- a/src/events.c +++ b/src/events.c @@ -1546,12 +1546,7 @@ static void HandleDropFileEventExt(char *filename) char *top_dir = ExtractZipFileIntoDirectory(filename, directory, tree_type); if (top_dir != NULL) - { - if (tree_type == TREE_TYPE_LEVEL_DIR) - AddUserLevelSetToLevelInfo(top_dir); - else - AddUserArtworkSetToArtworkInfo(top_dir, tree_type); - } + AddUserTreeSetToTreeInfo(top_dir, tree_type); } } diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 2eca885a..7818b732 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -3944,6 +3944,77 @@ void AddUserArtworkSetToArtworkInfo(char *artwork_subdir_new, int 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); diff --git a/src/libgame/setup.h b/src/libgame/setup.h index cbd0edf5..7740c2cb 100644 --- a/src/libgame/setup.h +++ b/src/libgame/setup.h @@ -331,6 +331,7 @@ TreeInfo *getArtworkTreeInfoForUserLevelSet(int); boolean checkIfCustomArtworkExistsForCurrentLevelSet(void); void AddUserLevelSetToLevelInfo(char *); void AddUserArtworkSetToArtworkInfo(char *, int); +void AddUserTreeSetToTreeInfo(char *, int); boolean UpdateUserLevelSet(char *, char *, char *, int); boolean CreateUserLevelSet(char *, char *, char *, int, boolean); diff --git a/src/libgame/system.h b/src/libgame/system.h index aaf4604e..5249adfc 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -743,6 +743,16 @@ getUserMusicDir() : \ NULL) +#define TREE_FIRST_NODE_PTR(t) ((t) == TREE_TYPE_LEVEL_DIR ? \ + &leveldir_first : \ + (t) == TREE_TYPE_GRAPHICS_DIR ? \ + &artwork.gfx_first : \ + (t) == TREE_TYPE_SOUNDS_DIR ? \ + &artwork.snd_first : \ + (t) == TREE_TYPE_MUSIC_DIR ? \ + &artwork.mus_first : \ + NULL) + // values for artwork handling #define LEVELDIR_ARTWORK_SET_PTR(leveldir, type) \ ((type) == ARTWORK_TYPE_GRAPHICS ? \ -- 2.34.1