X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=d81cb8b55bdf6e66d1087b13c1c538caa9d75ad9;hb=7354588d631a24c4aceebb28b7cf4fb9e1d5bab9;hp=48f967c3b03ee2ff5688501294efc178d3174e25;hpb=05ee9c39039a7329aa0e8ff747e30526c8c61260;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 48f967c3..d81cb8b5 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -279,7 +279,7 @@ char *getNewUserLevelSubdir(void) return new_level_subdir; } -static char *getTapeDir(char *level_subdir) +char *getTapeDir(char *level_subdir) { static char *tape_dir = NULL; char *data_dir = getUserGameDataDir(); @@ -582,6 +582,19 @@ char *getTapeFilename(int nr) return filename; } +char *getTemporaryTapeFilename(void) +{ + static char *filename = NULL; + char basename[MAX_FILENAME_LEN]; + + checked_free(filename); + + sprintf(basename, "tmp.%s", TAPEFILE_EXTENSION); + filename = getPath2(getTapeDir(NULL), basename); + + return filename; +} + char *getDefaultSolutionTapeFilename(int nr) { static char *filename = NULL; @@ -1142,11 +1155,44 @@ char *getCustomMusicDirectory(void) return NULL; // cannot find specified artwork file anywhere } +void MarkTapeDirectoryUploadsAsComplete(char *level_subdir) +{ + char *filename = getPath2(getTapeDir(level_subdir), UPLOADED_FILENAME); + + touchFile(filename); + + checked_free(filename); +} + +void MarkTapeDirectoryUploadsAsIncomplete(char *level_subdir) +{ + char *filename = getPath2(getTapeDir(level_subdir), UPLOADED_FILENAME); + + unlink(filename); + + checked_free(filename); +} + +boolean CheckTapeDirectoryUploadsComplete(char *level_subdir) +{ + char *filename = getPath2(getTapeDir(level_subdir), UPLOADED_FILENAME); + boolean success = fileExists(filename); + + checked_free(filename); + + return success; +} + void InitTapeDirectory(char *level_subdir) { + boolean new_tape_dir = !directoryExists(getTapeDir(level_subdir)); + createDirectory(getUserGameDataDir(), "user data", PERMS_PRIVATE); createDirectory(getTapeDir(NULL), "main tape", PERMS_PRIVATE); createDirectory(getTapeDir(level_subdir), "level tape", PERMS_PRIVATE); + + if (new_tape_dir) + MarkTapeDirectoryUploadsAsComplete(level_subdir); } void InitScoreDirectory(char *level_subdir) @@ -1277,22 +1323,35 @@ TreeInfo *getValidLevelSeries(TreeInfo *node, TreeInfo *default_node) return getFirstValidTreeInfoEntry(default_node); } -TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node) +static TreeInfo *getValidTreeInfoEntryExt(TreeInfo *node, boolean get_next_node) { if (node == NULL) return NULL; - if (node->node_group) // enter level group (step down into tree) + if (node->node_group) // enter node group (step down into tree) return getFirstValidTreeInfoEntry(node->node_group); - else if (node->parent_link) // skip start entry of level group - { - if (node->next) // get first real level series entry - return getFirstValidTreeInfoEntry(node->next); - else // leave empty level group and go on - return getFirstValidTreeInfoEntry(node->node_parent->next); - } - else // this seems to be a regular level series + + if (node->parent_link) // skip first node (back link) of node group + get_next_node = TRUE; + + if (!get_next_node) // get current regular tree node return node; + + // get next regular tree node, or step up until one is found + while (node->next == NULL && node->node_parent != NULL) + node = node->node_parent; + + return getFirstValidTreeInfoEntry(node->next); +} + +TreeInfo *getFirstValidTreeInfoEntry(TreeInfo *node) +{ + return getValidTreeInfoEntryExt(node, FALSE); +} + +TreeInfo *getNextValidTreeInfoEntry(TreeInfo *node) +{ + return getValidTreeInfoEntryExt(node, TRUE); } TreeInfo *getTreeInfoFirstGroupEntry(TreeInfo *node) @@ -1478,9 +1537,10 @@ static boolean adjustTreeSoundsForEMC(TreeInfo *node) return settings_changed; } -void dumpTreeInfo(TreeInfo *node, int depth) +int dumpTreeInfo(TreeInfo *node, int depth) { char bullet_list[] = { '-', '*', 'o' }; + int num_leaf_nodes = 0; int i; if (depth == 0) @@ -1496,7 +1556,11 @@ void dumpTreeInfo(TreeInfo *node, int depth) 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]" : "")); + (node->node_group ? "[GROUP]" : + node->is_copy ? "[COPY]" : "")); + + if (!node->node_group && !node->parent_link) + num_leaf_nodes++; /* // use for dumping artwork info tree @@ -1505,10 +1569,15 @@ void dumpTreeInfo(TreeInfo *node, int depth) */ if (node->node_group != NULL) - dumpTreeInfo(node->node_group, depth + 1); + num_leaf_nodes += dumpTreeInfo(node->node_group, depth + 1); node = node->next; } + + if (depth == 0) + Debug("tree", "Summary: %d leaf nodes found", num_leaf_nodes); + + return num_leaf_nodes; } void sortTreeInfoBySortFunction(TreeInfo **node_first, @@ -2006,7 +2075,7 @@ unsigned int get_hash_from_key(void *key) return hash; } -static int keys_are_equal(void *key1, void *key2) +int hash_keys_are_equal(void *key1, void *key2) { return (strEqual((char *)key1, (char *)key2)); } @@ -2014,7 +2083,7 @@ static int keys_are_equal(void *key1, void *key2) SetupFileHash *newSetupFileHash(void) { SetupFileHash *new_hash = - create_hashtable(16, 0.75, get_hash_from_key, keys_are_equal); + create_hashtable(16, 0.75, get_hash_from_key, hash_keys_are_equal); if (new_hash == NULL) Fail("create_hashtable() failed -- out of memory"); @@ -3563,7 +3632,7 @@ static boolean LoadLevelInfoFromLevelConf(TreeInfo **node_first, (leveldir_new->user_defined || !leveldir_new->handicap ? leveldir_new->last_level : leveldir_new->first_level); - DrawInitText(leveldir_new->name, 150, FC_YELLOW); + DrawInitTextItem(leveldir_new->name); pushTreeInfo(node_first, leveldir_new); @@ -3679,7 +3748,7 @@ void LoadLevelInfo(void) { InitUserLevelDirectory(getLoginName()); - DrawInitText("Loading level series", 120, FC_GREEN); + DrawInitTextHead("Loading level series"); LoadLevelInfoFromLevelDir(&leveldir_first, NULL, options.level_directory); LoadLevelInfoFromLevelDir(&leveldir_first, NULL, getUserLevelDir(NULL)); @@ -3952,7 +4021,7 @@ void LoadArtworkInfo(void) { LoadArtworkInfoCache(); - DrawInitText("Looking for custom artwork", 120, FC_GREEN); + DrawInitTextHead("Looking for custom artwork"); LoadArtworkInfoFromArtworkDir(&artwork.gfx_first, NULL, options.graphics_directory, @@ -4087,7 +4156,7 @@ static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node, setArtworkInfoCacheEntry(artwork_new, level_node, type); } - DrawInitText(level_node->name, 150, FC_YELLOW); + DrawInitTextItem(level_node->name); if (level_node->node_group != NULL) { @@ -4156,7 +4225,7 @@ void LoadLevelArtworkInfo(void) { print_timestamp_init("LoadLevelArtworkInfo"); - DrawInitText("Looking for custom level artwork", 120, FC_GREEN); + DrawInitTextHead("Looking for custom level artwork"); print_timestamp_time("DrawTimeText"); @@ -4812,7 +4881,7 @@ static void SaveLevelSetup_LastSeries_Ext(boolean deactivate_last_level_series) for (i = 0; last_level_series[i] != NULL; i++) { - char token[strlen(TOKEN_STR_LAST_LEVEL_SERIES) + 10]; + char token[strlen(TOKEN_STR_LAST_LEVEL_SERIES) + 1 + 10 + 1]; sprintf(token, "%s.%03d", TOKEN_STR_LAST_LEVEL_SERIES, i);