fixed problems with current level set node being a tree node copy
authorHolger Schemel <info@artsoft.org>
Thu, 25 Feb 2021 18:55:50 +0000 (19:55 +0100)
committerHolger Schemel <info@artsoft.org>
Thu, 25 Feb 2021 19:05:15 +0000 (20:05 +0100)
When selecting the current level set from the "last played level sets"
sub-menu, using the corresponding tree node from this sub-tree instead
of the "original" tree node of that level set may cause a number of
problems:

When using a level template stored in the parent level set directory,
it will not be detected as there is no corresponding parent tree node
if a tree node from the "last played level sets" sub-tree is used.

When toggling between the "original" tree node and the node copy from
the "last played level sets" sub-tree, custom artwork will always be
reloaded, as the level set tree node is treated as "has changed".

This change fixes these problems by always making sure that the
"original" tree node is used after selecting a new level set, but
causes the level set selection menu to always start with the
"original" tree node, even if the last level set selection was made
from the "last played level sets" menu.

src/libgame/setup.c
src/libgame/setup.h
src/screens.c

index 581aac21420c1ce6cb6a12f1a660ca31b52f68c9..ed3497437c1ccd91acbe5f3265c5618248d8cdae 100644 (file)
@@ -1154,7 +1154,21 @@ int numTreeInfo(TreeInfo *node)
 
 boolean validLevelSeries(TreeInfo *node)
 {
-  return (node != NULL && !node->node_group && !node->parent_link);
+  // in a number of cases, tree node is no valid level set
+  if (node == NULL || node->node_group || node->parent_link || node->is_copy)
+    return FALSE;
+
+  return TRUE;
+}
+
+TreeInfo *getValidLevelSeries(TreeInfo *node, TreeInfo *default_node)
+{
+  if (validLevelSeries(node))
+    return node;
+  else if (node->is_copy)
+    return getTreeInfoFromIdentifier(leveldir_first, node->identifier);
+  else
+    return getFirstValidTreeInfoEntry(default_node);
 }
 
 TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node)
@@ -1244,7 +1258,7 @@ static TreeInfo *getTreeInfoFromIdentifierExt(TreeInfo *node, char *identifier,
       if (node_group)
        return node_group;
     }
-    else if (!node->parent_link)
+    else if (!node->parent_link && !node->is_copy)
     {
       if (strEqual(identifier, node->identifier))
        return node;
index 2d290b80948d4a74c010e2f954bf781658f5af70..baf447946a5a977932dffc66449084e5235808c7 100644 (file)
@@ -294,6 +294,7 @@ void pushTreeInfo(TreeInfo **, TreeInfo *);
 void removeTreeInfo(TreeInfo **);
 int numTreeInfo(TreeInfo *);
 boolean validLevelSeries(TreeInfo *);
+TreeInfo *getValidLevelSeries(TreeInfo *, TreeInfo *);
 TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *);
 TreeInfo *getTreeInfoFirstGroupEntry(TreeInfo *);
 int numTreeInfoInGroup(TreeInfo *);
index c82f2a962d6d5463c2d85565ac4d90dddf276286..601c05de45e3ff278c40ea8e637e5d7960caa8ab 100644 (file)
@@ -1630,9 +1630,8 @@ void DrawMainMenu(void)
     return;
   }
 
-  // leveldir_current may be invalid (level group, parent link)
-  if (!validLevelSeries(leveldir_current))
-    leveldir_current = getFirstValidTreeInfoEntry(leveldir_last_valid);
+  // leveldir_current may be invalid (level group, parent link, node copy)
+  leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid);
 
   if (leveldir_current != leveldir_last_valid)
   {