X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=e1840b1d375e92491492ed31752ecaaf59c07b48;hb=869fe83e41f2fa6459b33d15816c730874326f08;hp=aca52f7db36ab9fa5ffea8c302a6428d0dfb76e4;hpb=7c3347a9ee92b20ca85fb6d8f8f6ac9aa27eb83e;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index aca52f7d..e1840b1d 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -96,6 +96,7 @@ static SetupFileHash *artworkinfo_cache_old = NULL; static SetupFileHash *artworkinfo_cache_new = NULL; static SetupFileHash *optional_tokens_hash = NULL; static boolean use_artworkinfo_cache = TRUE; +static boolean update_artworkinfo_cache = FALSE; // ---------------------------------------------------------------------------- @@ -1163,6 +1164,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; @@ -2872,7 +2883,7 @@ static TreeInfo *createParentTreeInfoNode(TreeInfo *node_parent) ti_new->parent_link = TRUE; setString(&ti_new->identifier, node_parent->identifier); - setString(&ti_new->name, ".. (parent directory)"); + setString(&ti_new->name, BACKLINK_TEXT_PARENT); setString(&ti_new->name_sorting, ti_new->name); setString(&ti_new->subdir, STRING_PARENT_DIRECTORY); @@ -2890,19 +2901,19 @@ static TreeInfo *createParentTreeInfoNode(TreeInfo *node_parent) static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first) { - TreeInfo *ti_new, *ti_new2; - if (node_first == NULL) return NULL; - ti_new = newTreeInfo(); - setTreeInfoToDefaults(ti_new, TREE_TYPE_LEVEL_DIR); + TreeInfo *ti_new = newTreeInfo(); + int type = node_first->type; + + setTreeInfoToDefaults(ti_new, type); ti_new->node_parent = NULL; ti_new->parent_link = FALSE; setString(&ti_new->identifier, node_first->identifier); - setString(&ti_new->name, "level sets"); + setString(&ti_new->name, TREE_INFOTEXT(type)); setString(&ti_new->name_sorting, ti_new->name); setString(&ti_new->subdir, STRING_TOP_DIRECTORY); @@ -2911,19 +2922,32 @@ 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, TREE_INFOTEXT(type)); ti_new->node_group = node_first; ti_new->level_group = TRUE; - ti_new2 = createParentTreeInfoNode(ti_new); + TreeInfo *ti_new2 = createParentTreeInfoNode(ti_new); - setString(&ti_new2->name, ".. (main menu)"); + setString(&ti_new2->name, TREE_BACKLINK_TEXT(type)); setString(&ti_new2->name_sorting, ti_new2->name); return ti_new; } +static void setTreeInfoParentNodes(TreeInfo *node, TreeInfo *node_parent) +{ + while (node) + { + if (node->node_group) + setTreeInfoParentNodes(node->node_group, node); + + node->node_parent = node_parent; + + node = node->next; + } +} + // ---------------------------------------------------------------------------- // functions for handling level and custom artwork info cache @@ -2949,10 +2973,15 @@ static void LoadArtworkInfoCache(void) if (artworkinfo_cache_new == NULL) artworkinfo_cache_new = newSetupFileHash(); + + update_artworkinfo_cache = FALSE; } static void SaveArtworkInfoCache(void) { + if (!update_artworkinfo_cache) + return; + char *filename = getPath2(getCacheDir(), ARTWORKINFO_CACHE_FILE); InitCacheDirectory(); @@ -2997,6 +3026,9 @@ static boolean modifiedFileTimestamp(char *filename, char *timestamp_string) if (timestamp_string == NULL) return TRUE; + if (!fileExists(filename)) // file does not exist + return (atoi(timestamp_string) != 0); + if (stat(filename, &file_status) != 0) // cannot stat file return TRUE; @@ -3913,9 +3945,33 @@ void LoadArtworkInfo(void) #endif } -static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, - ArtworkDirTree *node_parent, - LevelDirTree *level_node) +static void MoveArtworkInfoIntoSubTree(ArtworkDirTree **artwork_node) +{ + ArtworkDirTree *artwork_new = newTreeInfo(); + char *top_node_name = "dedicated custom artwork"; + + setTreeInfoToDefaults(artwork_new, (*artwork_node)->type); + + artwork_new->level_group = TRUE; + + setString(&artwork_new->identifier, top_node_name); + setString(&artwork_new->name, top_node_name); + setString(&artwork_new->name_sorting, top_node_name); + + // create node to link back to current custom artwork directory + createParentTreeInfoNode(artwork_new); + + // move existing custom artwork tree into newly created sub-tree + artwork_new->node_group->next = *artwork_node; + + // change custom artwork tree to contain only newly created node + *artwork_node = artwork_new; +} + +static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node, + ArtworkDirTree *node_parent, + LevelDirTree *level_node, + boolean empty_level_set_mode) { int type = (*artwork_node)->type; @@ -3923,8 +3979,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); @@ -3951,6 +4009,8 @@ static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node, artwork_new->sort_priority = level_node->sort_priority; artwork_new->color = LEVELCOLOR(artwork_new); + + update_artworkinfo_cache = TRUE; } free(path); @@ -3975,8 +4035,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); @@ -3984,23 +4057,35 @@ 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) - { - *artwork_node = artwork_new->next; - artwork_new->next = NULL; - - freeTreeInfo(artwork_new); - } + removeTreeInfo(artwork_node); } level_node = level_node->next; } } +static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node) +{ + // move peviously loaded artwork tree into separate sub-tree + MoveArtworkInfoIntoSubTree(artwork_node); + + // load artwork from level sets into separate sub-trees + LoadArtworkInfoFromLevelInfoExt(artwork_node, NULL, leveldir_first_all, TRUE); + LoadArtworkInfoFromLevelInfoExt(artwork_node, NULL, leveldir_first_all, FALSE); + + // add top tree node over all three separate sub-trees + *artwork_node = createTopTreeInfoNode(*artwork_node); + + // set all parent links (back links) in complete artwork tree + setTreeInfoParentNodes(*artwork_node, NULL); +} + void LoadLevelArtworkInfo(void) { print_timestamp_init("LoadLevelArtworkInfo"); @@ -4009,11 +4094,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();