X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=f1223d0dd238b0098f845f54b57f574d09b903c4;hb=6a7a0a43f66ae9add076ccc55b859197567f879a;hp=37b7db1214cf19b8acc6bdc2b233c7dbb1561e4f;hpb=1d189cb5b9d8266d6b1cee2ed6b5b42044cd13aa;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 37b7db12..f1223d0d 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -534,8 +534,8 @@ char *getProgramConfigFilename(char *command_filename) if (strSuffix(command_filename_1, ".exe")) command_filename_1[strlen(command_filename_1) - 4] = '\0'; - char *ro_base_path = getProgramMainDataPath(command_filename, RO_BASE_PATH); - char *conf_directory = getPath2(ro_base_path, CONF_DIRECTORY); + char *base_path = getProgramMainDataPath(command_filename, BASE_PATH); + char *conf_directory = getPath2(base_path, CONF_DIRECTORY); char *command_basepath = getBasePath(command_filename); char *command_basename = getBaseNameNoSuffix(command_filename); @@ -545,7 +545,7 @@ char *getProgramConfigFilename(char *command_filename) config_filename_2 = getStringCat2(command_filename_2, ".conf"); config_filename_3 = getPath2(conf_directory, SETUP_FILENAME); - checked_free(ro_base_path); + checked_free(base_path); checked_free(conf_directory); checked_free(command_basepath); @@ -582,7 +582,20 @@ char *getTapeFilename(int nr) return filename; } -char *getSolutionTapeFilename(int nr) +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; char basename[MAX_FILENAME_LEN]; @@ -592,17 +605,32 @@ char *getSolutionTapeFilename(int nr) sprintf(basename, "%03d.%s", nr, TAPEFILE_EXTENSION); filename = getPath2(getSolutionTapeDir(), basename); - if (!fileExists(filename)) - { - static char *filename_sln = NULL; + return filename; +} + +char *getSokobanSolutionTapeFilename(int nr) +{ + static char *filename = NULL; + char basename[MAX_FILENAME_LEN]; + + checked_free(filename); + + sprintf(basename, "%03d.sln", nr); + filename = getPath2(getSolutionTapeDir(), basename); + + return filename; +} - checked_free(filename_sln); +char *getSolutionTapeFilename(int nr) +{ + char *filename = getDefaultSolutionTapeFilename(nr); - sprintf(basename, "%03d.sln", nr); - filename_sln = getPath2(getSolutionTapeDir(), basename); + if (!fileExists(filename)) + { + char *filename2 = getSokobanSolutionTapeFilename(nr); - if (fileExists(filename_sln)) - return filename_sln; + if (fileExists(filename2)) + return filename2; } return filename; @@ -1262,22 +1290,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) @@ -1463,9 +1504,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) @@ -1483,6 +1525,9 @@ void dumpTreeInfo(TreeInfo *node, int depth) (node->node_parent ? node->node_parent->identifier : "-"), (node->node_group ? "[GROUP]" : "")); + if (!node->node_group && !node->parent_link) + num_leaf_nodes++; + /* // use for dumping artwork info tree Debug("tree", "subdir == '%s' ['%s', '%s'] [%d])", @@ -1490,10 +1535,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,