moved code to remove tree info node to separate function
[rocksndiamonds.git] / src / libgame / setup.c
index 2bc46d413a2ebbcbacbfdb9132e4b0212efaa327..4a630aa60fe066abbb9fb7e5c1265223e1323772 100644 (file)
@@ -1163,6 +1163,16 @@ void pushTreeInfo(TreeInfo **node_first, TreeInfo *node_new)
   *node_first = node_new;
 }
 
+void removeTreeInfo(TreeInfo **node_first)
+{
+  TreeInfo *node_old = *node_first;
+
+  *node_first = node_old->next;
+  node_old->next = NULL;
+
+  freeTreeInfo(node_old);
+}
+
 int numTreeInfo(TreeInfo *node)
 {
   int num = 0;
@@ -1388,16 +1398,23 @@ static boolean adjustTreeSoundsForEMC(TreeInfo *node)
 
 void dumpTreeInfo(TreeInfo *node, int depth)
 {
+  char bullet_list[] = { '-', '*', 'o' };
   int i;
 
-  Debug("tree", "Dumping TreeInfo:");
+  if (depth == 0)
+    Debug("tree", "Dumping TreeInfo:");
 
   while (node)
   {
-    for (i = 0; i < (depth + 1) * 3; i++)
+    char bullet = bullet_list[depth % ARRAY_SIZE(bullet_list)];
+
+    for (i = 0; i < depth * 2; i++)
       DebugContinued("", " ");
 
-    DebugContinued("tree", "'%s' / '%s'\n", node->identifier, node->name);
+    DebugContinued("tree", "%c '%s' ['%s] [PARENT: '%s'] %s\n",
+                  bullet, node->name, node->identifier,
+                  (node->node_parent ? node->node_parent->identifier : "-"),
+                  (node->node_group ? "[GROUP]" : ""));
 
     /*
     // use for dumping artwork info tree
@@ -3907,6 +3924,7 @@ void LoadArtworkInfo(void)
 }
 
 static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
+                                        ArtworkDirTree *node_parent,
                                         LevelDirTree *level_node)
 {
   int type = (*artwork_node)->type;
@@ -3956,7 +3974,33 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node,
     DrawInitText(level_node->name, 150, FC_YELLOW);
 
     if (level_node->node_group != NULL)
-      LoadArtworkInfoFromLevelInfo(artwork_node, level_node->node_group);
+    {
+      TreeInfo *artwork_new = newTreeInfo();
+
+      if (node_parent)
+       setTreeInfoToDefaultsFromParent(artwork_new, node_parent);
+      else
+       setTreeInfoToDefaults(artwork_new, type);
+
+      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);
+
+      pushTreeInfo(artwork_node, artwork_new);
+
+      // create node to link back to current custom artwork directory
+      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);
+
+      // if sub-tree has no custom artwork at all, remove it
+      if (artwork_new->node_group->next == NULL)
+       removeTreeInfo(artwork_node);
+    }
 
     level_node = level_node->next;
   }
@@ -3970,11 +4014,11 @@ void LoadLevelArtworkInfo(void)
 
   print_timestamp_time("DrawTimeText");
 
-  LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, leveldir_first_all);
+  LoadArtworkInfoFromLevelInfo(&artwork.gfx_first, NULL, leveldir_first_all);
   print_timestamp_time("LoadArtworkInfoFromLevelInfo (gfx)");
-  LoadArtworkInfoFromLevelInfo(&artwork.snd_first, leveldir_first_all);
+  LoadArtworkInfoFromLevelInfo(&artwork.snd_first, NULL, leveldir_first_all);
   print_timestamp_time("LoadArtworkInfoFromLevelInfo (snd)");
-  LoadArtworkInfoFromLevelInfo(&artwork.mus_first, leveldir_first_all);
+  LoadArtworkInfoFromLevelInfo(&artwork.mus_first, NULL, leveldir_first_all);
   print_timestamp_time("LoadArtworkInfoFromLevelInfo (mus)");
 
   SaveArtworkInfoCache();
@@ -4420,7 +4464,7 @@ static void InitLastPlayedLevels_ParentNode(void)
 
   pushTreeInfo(leveldir_top, leveldir_new);
 
-  /* create node to link back to current level directory */
+  // create node to link back to current level directory
   createParentTreeInfoNode(leveldir_new);
 }
 
@@ -4508,7 +4552,7 @@ void LoadLevelSetup_LastSeries(void)
   leveldir_current = getFirstValidTreeInfoEntry(leveldir_first);
 
   // start with empty history of last played level sets
-  setup.level_setup.last_level_series[0] = NULL;
+  setString(&setup.level_setup.last_level_series[0], NULL);
 
   if (!strEqual(DEFAULT_LEVELSET, UNDEFINED_LEVELSET))
   {
@@ -4540,11 +4584,11 @@ void LoadLevelSetup_LastSeries(void)
       leveldir_last = getTreeInfoFromIdentifier(leveldir_first,
                                                last_level_series);
       if (leveldir_last != NULL)
-       setup.level_setup.last_level_series[pos++] =
-         getStringCopy(last_level_series);
+       setString(&setup.level_setup.last_level_series[pos++],
+                 last_level_series);
     }
 
-    setup.level_setup.last_level_series[pos] = NULL;
+    setString(&setup.level_setup.last_level_series[pos], NULL);
 
     freeSetupFileHash(level_setup_hash);
   }