X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=32ae11215a1a87626d9acdac70e99d6ea62cafaf;hp=ed3497437c1ccd91acbe5f3265c5618248d8cdae;hb=3bb225da5092d0741870829d9f8f8642070d29c5;hpb=483d088f2bd4dd2ee267aff416503b2c667a69d3 diff --git a/src/libgame/setup.c b/src/libgame/setup.c index ed349743..32ae1121 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -49,6 +49,16 @@ static char *levelclass_desc[NUM_LEVELCLASS_DESC] = #define MAX_COOKIE_LEN 256 +#define TREE_NODE_TYPE_DEFAULT 0 +#define TREE_NODE_TYPE_PARENT 1 +#define TREE_NODE_TYPE_GROUP 2 +#define TREE_NODE_TYPE_COPY 3 + +#define TREE_NODE_TYPE(ti) (ti->node_group ? TREE_NODE_TYPE_GROUP : \ + ti->parent_link ? TREE_NODE_TYPE_PARENT : \ + ti->is_copy ? TREE_NODE_TYPE_COPY : \ + TREE_NODE_TYPE_DEFAULT) + static void setTreeInfoToDefaults(TreeInfo *, int); static TreeInfo *getTreeInfoCopy(TreeInfo *ti); @@ -1240,29 +1250,25 @@ TreeInfo *getTreeInfoFromPos(TreeInfo *node, int pos) } static TreeInfo *getTreeInfoFromIdentifierExt(TreeInfo *node, char *identifier, - boolean include_node_groups) + int node_type_wanted) { if (identifier == NULL) return NULL; while (node) { + if (TREE_NODE_TYPE(node) == node_type_wanted && + strEqual(identifier, node->identifier)) + return node; + if (node->node_group) { - if (include_node_groups && strEqual(identifier, node->identifier)) - return node; - TreeInfo *node_group = getTreeInfoFromIdentifierExt(node->node_group, identifier, - include_node_groups); + node_type_wanted); if (node_group) return node_group; } - else if (!node->parent_link && !node->is_copy) - { - if (strEqual(identifier, node->identifier)) - return node; - } node = node->next; } @@ -1272,7 +1278,7 @@ static TreeInfo *getTreeInfoFromIdentifierExt(TreeInfo *node, char *identifier, TreeInfo *getTreeInfoFromIdentifier(TreeInfo *node, char *identifier) { - return getTreeInfoFromIdentifierExt(node, identifier, FALSE); + return getTreeInfoFromIdentifierExt(node, identifier, TREE_NODE_TYPE_DEFAULT); } static TreeInfo *cloneTreeNode(TreeInfo **node_top, TreeInfo *node_parent, @@ -4540,7 +4546,6 @@ static void InitLastPlayedLevels_ParentNode(void) void UpdateLastPlayedLevels_TreeInfo(void) { char **last_level_series = setup.level_setup.last_level_series; - boolean reset_leveldir_current = FALSE; LevelDirTree *leveldir_last; TreeInfo **node_new = NULL; int i; @@ -4550,13 +4555,9 @@ void UpdateLastPlayedLevels_TreeInfo(void) InitLastPlayedLevels_ParentNode(); - // check if current level set is from "last played" sub-tree to be rebuilt - reset_leveldir_current = strEqual(leveldir_current->node_parent->identifier, - TOKEN_STR_LAST_LEVEL_SERIES); - leveldir_last = getTreeInfoFromIdentifierExt(leveldir_first, TOKEN_STR_LAST_LEVEL_SERIES, - TRUE); + TREE_NODE_TYPE_GROUP); if (leveldir_last == NULL) return; @@ -4587,10 +4588,6 @@ void UpdateLastPlayedLevels_TreeInfo(void) node_new = &((*node_new)->next); } - - if (reset_leveldir_current) - leveldir_current = getTreeInfoFromIdentifier(leveldir_first, - last_level_series[0]); } static void UpdateLastPlayedLevels_List(void) @@ -4612,6 +4609,35 @@ static void UpdateLastPlayedLevels_List(void) setString(&last_level_series[0], leveldir_current->identifier); } +static TreeInfo *StoreOrRestoreLastPlayedLevels(TreeInfo *node, boolean store) +{ + static char *identifier = NULL; + + if (store) + { + setString(&identifier, (node && node->is_copy ? node->identifier : NULL)); + + return NULL; // not used + } + else + { + TreeInfo *node_new = getTreeInfoFromIdentifierExt(leveldir_first, + identifier, + TREE_NODE_TYPE_COPY); + return (node_new != NULL ? node_new : node); + } +} + +void StoreLastPlayedLevels(TreeInfo *node) +{ + StoreOrRestoreLastPlayedLevels(node, TRUE); +} + +void RestoreLastPlayedLevels(TreeInfo **node) +{ + *node = StoreOrRestoreLastPlayedLevels(*node, FALSE); +} + void LoadLevelSetup_LastSeries(void) { // --------------------------------------------------------------------------