X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=084bb3883182f0dde63b9505be2f3cb4b4689c26;hp=4fc58a407b3933a9d6cdd23f69ad54fdf7f06a09;hb=a765d70dda7da4500e7005ffa5913e24cd32c0fa;hpb=89ce36da9108b04faf263cd2624db2a2d9fc8f27 diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 4fc58a40..084bb388 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -799,7 +799,7 @@ void InitLevelSetupDirectory(char *level_subdir) /* ------------------------------------------------------------------------- */ -/* some functions to handle lists of level directories */ +/* some functions to handle lists of level and artwork directories */ /* ------------------------------------------------------------------------- */ TreeInfo *newTreeInfo() @@ -927,6 +927,43 @@ TreeInfo *getTreeInfoFromIdentifier(TreeInfo *node, char *identifier) return NULL; } +TreeInfo *cloneTreeNode(TreeInfo **node_top, TreeInfo *node_parent, + TreeInfo *node, boolean skip_sets_without_levels) +{ + TreeInfo *node_new; + + if (node == NULL) + return NULL; + + if (!node->parent_link && !node->level_group && + skip_sets_without_levels && node->levels == 0) + return cloneTreeNode(node_top, node_parent, node->next, + skip_sets_without_levels); + + node_new = newTreeInfo(); + + *node_new = *node; /* copy complete node */ + + node_new->node_top = node_top; /* correct top node link */ + node_new->node_parent = node_parent; /* correct parent node link */ + + if (node->level_group) + node_new->node_group = cloneTreeNode(node_top, node_new, node->node_group, + skip_sets_without_levels); + + node_new->next = cloneTreeNode(node_top, node_parent, node->next, + skip_sets_without_levels); + + return node_new; +} + +void cloneTree(TreeInfo **ti_new, TreeInfo *ti, boolean skip_empty_sets) +{ + TreeInfo *ti_cloned = cloneTreeNode(ti_new, NULL, ti, skip_empty_sets); + + *ti_new = ti_cloned; +} + void dumpTreeInfo(TreeInfo *node, int depth) { int i; @@ -1989,6 +2026,8 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, (leveldir_new->user_defined || !leveldir_new->handicap ? leveldir_new->last_level : leveldir_new->first_level); +#if 0 + /* !!! don't skip sets without levels (else artwork base sets are missing) */ #if 1 if (leveldir_new->levels < 1 && !leveldir_new->level_group) { @@ -2000,6 +2039,7 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, return FALSE; } +#endif #endif pushTreeInfo(node_first, leveldir_new); @@ -2093,6 +2133,11 @@ void LoadLevelInfo() LoadLevelInfoFromLevelDir(&leveldir_first, NULL, options.level_directory); LoadLevelInfoFromLevelDir(&leveldir_first, NULL, getUserLevelDir(NULL)); +#if 1 + leveldir_first_all = leveldir_first; + cloneTree(&leveldir_first, leveldir_first_all, TRUE); +#endif + /* before sorting, the first entries will be from the user directory */ leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); @@ -2448,9 +2493,9 @@ void LoadLevelArtworkInfo() { DrawInitText("Looking for custom level artwork:", 120, FC_GREEN); - LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, leveldir_first); - LoadArtworkInfoFromLevelInfo(&artwork.snd_first, leveldir_first); - LoadArtworkInfoFromLevelInfo(&artwork.mus_first, leveldir_first); + LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, leveldir_first_all); + LoadArtworkInfoFromLevelInfo(&artwork.snd_first, leveldir_first_all); + LoadArtworkInfoFromLevelInfo(&artwork.mus_first, leveldir_first_all); /* needed for reloading level artwork not known at ealier stage */