X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=inline;f=src%2Flibgame%2Fsetup.c;h=2372886f92d3b02af60f605f6dc93a7c6c4b46b7;hb=2c611010f9bd58f6b2d61ed6e4d5c5730a191a7e;hp=3e044e96b44630cdb556e5a13a874175db06a1c3;hpb=8eab6de858ae8837b169d5b7238da426c55645e9;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 3e044e96..2372886f 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -2900,12 +2900,11 @@ static TreeInfo *createParentTreeInfoNode(TreeInfo *node_parent) static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first) { - TreeInfo *ti_new, *ti_new2; - if (node_first == NULL) return NULL; - ti_new = newTreeInfo(); + TreeInfo *ti_new = newTreeInfo(); + setTreeInfoToDefaults(ti_new, TREE_TYPE_LEVEL_DIR); ti_new->node_parent = NULL; @@ -2926,7 +2925,7 @@ static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first) ti_new->node_group = node_first; ti_new->level_group = TRUE; - ti_new2 = createParentTreeInfoNode(ti_new); + TreeInfo *ti_new2 = createParentTreeInfoNode(ti_new); setString(&ti_new2->name, ".. (main menu)"); setString(&ti_new2->name_sorting, ti_new2->name); @@ -3923,9 +3922,33 @@ void LoadArtworkInfo(void) #endif } -static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, - ArtworkDirTree *node_parent, - LevelDirTree *level_node) +static void MoveArtworkInfoIntoSubTree(ArtworkDirTree **artwork_node) +{ + ArtworkDirTree *artwork_new = newTreeInfo(); + char *top_node_name = "dedicated custom artwork"; + + setTreeInfoToDefaults(artwork_new, (*artwork_node)->type); + + artwork_new->level_group = TRUE; + + setString(&artwork_new->identifier, top_node_name); + setString(&artwork_new->name, top_node_name); + setString(&artwork_new->name_sorting, top_node_name); + + // create node to link back to current custom artwork directory + createParentTreeInfoNode(artwork_new); + + // move existing custom artwork tree into newly created sub-tree + artwork_new->node_group->next = *artwork_node; + + // change custom artwork tree to contain only newly created node + *artwork_node = artwork_new; +} + +static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node, + ArtworkDirTree *node_parent, + LevelDirTree *level_node, + boolean empty_level_set_mode) { int type = (*artwork_node)->type; @@ -3933,8 +3956,10 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, while (level_node) { + boolean empty_level_set = (level_node->levels == 0); + // check all tree entries for artwork, but skip parent link entries - if (!level_node->parent_link) + if (!level_node->parent_link && empty_level_set == empty_level_set_mode) { TreeInfo *artwork_new = getArtworkInfoCacheEntry(level_node, type); boolean cached = (artwork_new != NULL); @@ -3985,8 +4010,21 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, artwork_new->level_group = TRUE; setString(&artwork_new->identifier, level_node->subdir); - setString(&artwork_new->name, level_node->name); - setString(&artwork_new->name_sorting, level_node->name_sorting); + + if (node_parent == NULL) // check for top tree node + { + char *top_node_name = (empty_level_set_mode ? + "artwork-only level sets" : + "artwork from level sets"); + + setString(&artwork_new->name, top_node_name); + setString(&artwork_new->name_sorting, top_node_name); + } + else + { + setString(&artwork_new->name, level_node->name); + setString(&artwork_new->name_sorting, level_node->name_sorting); + } pushTreeInfo(artwork_node, artwork_new); @@ -3994,8 +4032,9 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, createParentTreeInfoNode(artwork_new); // recursively step into sub-directory and look for more custom artwork - LoadArtworkInfoFromLevelInfo(&artwork_new->node_group, artwork_new, - level_node->node_group); + LoadArtworkInfoFromLevelInfoExt(&artwork_new->node_group, artwork_new, + level_node->node_group, + empty_level_set_mode); // if sub-tree has no custom artwork at all, remove it if (artwork_new->node_group->next == NULL) @@ -4006,6 +4045,14 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, } } +static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node) +{ + MoveArtworkInfoIntoSubTree(artwork_node); + + LoadArtworkInfoFromLevelInfoExt(artwork_node, NULL, leveldir_first_all, TRUE); + LoadArtworkInfoFromLevelInfoExt(artwork_node, NULL, leveldir_first_all, FALSE); +} + void LoadLevelArtworkInfo(void) { print_timestamp_init("LoadLevelArtworkInfo"); @@ -4014,11 +4061,11 @@ void LoadLevelArtworkInfo(void) print_timestamp_time("DrawTimeText"); - LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, NULL, leveldir_first_all); + LoadArtworkInfoFromLevelInfo(&artwork.gfx_first); print_timestamp_time("LoadArtworkInfoFromLevelInfo (gfx)"); - LoadArtworkInfoFromLevelInfo(&artwork.snd_first, NULL, leveldir_first_all); + LoadArtworkInfoFromLevelInfo(&artwork.snd_first); print_timestamp_time("LoadArtworkInfoFromLevelInfo (snd)"); - LoadArtworkInfoFromLevelInfo(&artwork.mus_first, NULL, leveldir_first_all); + LoadArtworkInfoFromLevelInfo(&artwork.mus_first); print_timestamp_time("LoadArtworkInfoFromLevelInfo (mus)"); SaveArtworkInfoCache();