added separate custom artwork sub-tree for artwork-only level sets
[rocksndiamonds.git] / src / libgame / setup.c
index 4a630aa60fe066abbb9fb7e5c1265223e1323772..23579d277ba5b92503aac35cfabdcd26625613de 100644 (file)
@@ -2912,7 +2912,7 @@ static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first)
   ti_new->parent_link = FALSE;
 
   setString(&ti_new->identifier, node_first->identifier);
-  setString(&ti_new->name, "level sets");
+  setString(&ti_new->name, INFOTEXT_LEVEL_DIR);
   setString(&ti_new->name_sorting, ti_new->name);
 
   setString(&ti_new->subdir, STRING_TOP_DIRECTORY);
@@ -2921,7 +2921,7 @@ static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first)
   ti_new->sort_priority = node_first->sort_priority;;
   ti_new->latest_engine = node_first->latest_engine;
 
-  setString(&ti_new->class_desc, "level sets");
+  setString(&ti_new->class_desc, INFOTEXT_LEVEL_DIR);
 
   ti_new->node_group = node_first;
   ti_new->level_group = TRUE;
@@ -3923,9 +3923,10 @@ void LoadArtworkInfo(void)
 #endif
 }
 
-static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
-                                        ArtworkDirTree *node_parent,
-                                        LevelDirTree *level_node)
+static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node,
+                                           ArtworkDirTree *node_parent,
+                                           LevelDirTree *level_node,
+                                           boolean empty_level_set_mode)
 {
   int type = (*artwork_node)->type;
 
@@ -3933,8 +3934,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 +3988,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 +4010,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 +4023,12 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
   }
 }
 
+static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **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 +4037,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();