improved handling and displaying dropped level set zip files into window
[rocksndiamonds.git] / src / libgame / setup.c
index 7818b7322eaa7a79faf4648d5a9ad85eb891b7a7..c64c95c8ee84c6d5fdb17d6b110eaded193a01a7 100644 (file)
@@ -178,7 +178,7 @@ static char *getNetworkDir(void)
   return network_dir;
 }
 
-static char *getLevelDirFromTreeInfo(TreeInfo *node)
+char *getLevelDirFromTreeInfo(TreeInfo *node)
 {
   static char *level_dir = NULL;
 
@@ -3860,116 +3860,29 @@ void LoadLevelArtworkInfo(void)
   print_timestamp_done("LoadLevelArtworkInfo");
 }
 
-static boolean AddUserLevelSetToLevelInfoExt(char *level_subdir_new)
+static boolean AddTreeSetToTreeInfoExt(TreeInfo *tree_node_old, char *tree_dir,
+                                      char *tree_subdir_new, int type)
 {
-  // get level info tree node of first (original) user level set
-  char *level_subdir_old = getLoginName();
-  LevelDirTree *leveldir_old = getTreeInfoFromIdentifier(leveldir_first,
-                                                        level_subdir_old);
-  if (leveldir_old == NULL)            // should not happen
-    return FALSE;
-
-  int draw_deactivation_mask = GetDrawDeactivationMask();
-
-  // override draw deactivation mask (temporarily disable drawing)
-  SetDrawDeactivationMask(REDRAW_ALL);
-
-  // load new level set config and add it next to first user level set
-  LoadLevelInfoFromLevelConf(&leveldir_old->next, NULL,
-                            leveldir_old->basepath, level_subdir_new);
-
-  // set draw deactivation mask to previous value
-  SetDrawDeactivationMask(draw_deactivation_mask);
-
-  // get level info tree node of newly added user level set
-  LevelDirTree *leveldir_new = getTreeInfoFromIdentifier(leveldir_first,
-                                                        level_subdir_new);
-  if (leveldir_new == NULL)            // should not happen
-    return FALSE;
-
-  // correct top link and parent node link of newly created tree node
-  leveldir_new->node_top    = leveldir_old->node_top;
-  leveldir_new->node_parent = leveldir_old->node_parent;
-
-  // sort level info tree to adjust position of newly added level set
-  sortTreeInfo(&leveldir_first);
-
-  return TRUE;
-}
-
-void AddUserLevelSetToLevelInfo(char *level_subdir_new)
-{
-  if (!AddUserLevelSetToLevelInfoExt(level_subdir_new))
-    Error(ERR_EXIT, "internal level set structure corrupted -- aborting");
-}
-
-static boolean AddUserArtworkSetToArtworkInfoExt(char *artwork_subdir_new,
-                                                int type)
-{
-  // get artwork info tree node of first artwork set
-  TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type);
-  char *artwork_user_dir = USER_ARTWORK_DIRECTORY(type);
-
-  int draw_deactivation_mask = GetDrawDeactivationMask();
-
-  // override draw deactivation mask (temporarily disable drawing)
-  SetDrawDeactivationMask(REDRAW_ALL);
-
-  // load new artwork set config and add it next to first artwork set
-  LoadArtworkInfoFromArtworkConf(&artwork_first_node->next, NULL,
-                                artwork_user_dir, artwork_subdir_new, type);
-
-  // set draw deactivation mask to previous value
-  SetDrawDeactivationMask(draw_deactivation_mask);
-
-  // get artwork info tree node of newly added artwork set
-  LevelDirTree *artwork_new = getTreeInfoFromIdentifier(artwork_first_node,
-                                                       artwork_subdir_new);
-  if (artwork_new == NULL)             // should not happen
-    return FALSE;
-
-  // correct top link and parent node link of newly created tree node
-  artwork_new->node_top    = artwork_first_node->node_top;
-  artwork_new->node_parent = artwork_first_node->node_parent;
-
-  // sort artwork info tree to adjust position of newly added artwork set
-  sortTreeInfo(&artwork_first_node);
-
-  return TRUE;
-}
-
-void AddUserArtworkSetToArtworkInfo(char *artwork_subdir_new, int type)
-{
-  if (!AddUserArtworkSetToArtworkInfoExt(artwork_subdir_new, 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
+  if (tree_node_old == NULL)
   {
-    // get artwork info tree node of first artwork set
-    tree_node_old = *tree_node_first;
+    if (type == TREE_TYPE_LEVEL_DIR)
+    {
+      // get level info tree node of personal user level set
+      tree_node_old = getTreeInfoFromIdentifier(leveldir_first, getLoginName());
+    }
+    else
+    {
+      // get artwork info tree node of first artwork set
+      tree_node_old = ARTWORK_FIRST_NODE(artwork, type);
+    }
   }
 
-  if (tree_node_old == NULL)           // should not happen
+  if (tree_dir == NULL)
+    tree_dir = TREE_USERDIR(type);
+
+  if (tree_node_old   == NULL ||
+      tree_dir        == NULL ||
+      tree_subdir_new == NULL)         // should not happen
     return FALSE;
 
   int draw_deactivation_mask = GetDrawDeactivationMask();
@@ -3980,21 +3893,27 @@ static boolean AddUserTreeSetToTreeInfoExt(char *tree_subdir_new, int type)
   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);
+    LoadLevelInfoFromLevelConf(&tree_node_old->next,
+                              tree_node_old->node_parent,
+                              tree_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);
+    LoadArtworkInfoFromArtworkConf(&tree_node_old->next,
+                                  tree_node_old->node_parent,
+                                  tree_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);
+  // get first node of level or artwork info tree
+  TreeInfo **tree_node_first = TREE_FIRST_NODE_PTR(type);
+
+  // get tree info node of newly added level or artwork set
+  TreeInfo *tree_node_new = getTreeInfoFromIdentifier(*tree_node_first,
+                                                     tree_subdir_new);
 
   if (tree_node_new == NULL)           // should not happen
     return FALSE;
@@ -4003,16 +3922,22 @@ static boolean AddUserTreeSetToTreeInfoExt(char *tree_subdir_new, int type)
   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
+  // sort tree info to adjust position of newly added tree set
   sortTreeInfo(tree_node_first);
 
   return TRUE;
 }
 
-void AddUserTreeSetToTreeInfo(char *tree_subdir_new, int type)
+void AddTreeSetToTreeInfo(TreeInfo *tree_node, char *tree_dir,
+                         char *tree_subdir_new, int type)
 {
-  if (!AddUserTreeSetToTreeInfoExt(tree_subdir_new, type))
-    Error(ERR_EXIT, "internal tree set structure corrupted -- aborting");
+  if (!AddTreeSetToTreeInfoExt(tree_node, tree_dir, tree_subdir_new, type))
+    Error(ERR_EXIT, "internal tree info structure corrupted -- aborting");
+}
+
+void AddUserLevelSetToLevelInfo(char *level_subdir_new)
+{
+  AddTreeSetToTreeInfo(NULL, NULL, level_subdir_new, TREE_TYPE_LEVEL_DIR);
 }
 
 char *getArtworkIdentifierForUserLevelSet(int type)
@@ -4411,6 +4336,11 @@ static void checkSeriesInfo(void)
 {
   static char *level_directory = NULL;
   Directory *dir;
+#if 0
+  DirectoryEntry *dir_entry;
+#endif
+
+  checked_free(level_directory);
 
   // check for more levels besides the 'levels' field of 'levelinfo.conf'
 
@@ -4426,6 +4356,35 @@ static void checkSeriesInfo(void)
     return;
   }
 
+#if 0
+  while ((dir_entry = readDirectory(dir)) != NULL)     // loop all entries
+  {
+    if (strlen(dir_entry->basename) > 4 &&
+       dir_entry->basename[3] == '.' &&
+       strEqual(&dir_entry->basename[4], LEVELFILE_EXTENSION))
+    {
+      char levelnum_str[4];
+      int levelnum_value;
+
+      strncpy(levelnum_str, dir_entry->basename, 3);
+      levelnum_str[3] = '\0';
+
+      levelnum_value = atoi(levelnum_str);
+
+      if (levelnum_value < leveldir_current->first_level)
+      {
+       Error(ERR_WARN, "additional level %d found", levelnum_value);
+       leveldir_current->first_level = levelnum_value;
+      }
+      else if (levelnum_value > leveldir_current->last_level)
+      {
+       Error(ERR_WARN, "additional level %d found", levelnum_value);
+       leveldir_current->last_level = levelnum_value;
+      }
+    }
+  }
+#endif
+
   closeDirectory(dir);
 }