X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=7e87a76e1153dbf6551d0a44da71cf69d4d4be1a;hp=69eecdb54140b75ef1422a42c7739aecee79c294;hb=2c459683357975006225050ef9498af29b7fc01a;hpb=ce0ddd8fa8de5b935099390718980e59d4d10a09 diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 69eecdb5..7e87a76e 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -178,7 +178,7 @@ static char *getNetworkDir(void) return network_dir; } -static char *getLevelDirFromTreeInfo(TreeInfo *node) +char *getLevelDirFromTreeInfo(TreeInfo *node) { static char *level_dir = NULL; @@ -494,22 +494,41 @@ char *getProgramMainDataPath(char *command_filename, char *base_path) char *getProgramConfigFilename(char *command_filename) { - char *command_filename_1 = getStringCopy(command_filename); + static char *config_filename_1 = NULL; + static char *config_filename_2 = NULL; + static char *config_filename_3 = NULL; + static boolean initialized = FALSE; - // strip trailing executable suffix from command filename - if (strSuffix(command_filename_1, ".exe")) - command_filename_1[strlen(command_filename_1) - 4] = '\0'; + if (!initialized) + { + char *command_filename_1 = getStringCopy(command_filename); + + // strip trailing executable suffix from 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 *command_basepath = getBasePath(command_filename); + char *command_basename = getBaseNameNoSuffix(command_filename); + char *command_filename_2 = getPath2(command_basepath, command_basename); + + config_filename_1 = getStringCat2(command_filename_1, ".conf"); + config_filename_2 = getStringCat2(command_filename_2, ".conf"); + config_filename_3 = getPath2(conf_directory, SETUP_FILENAME); + + checked_free(ro_base_path); + checked_free(conf_directory); - char *ro_base_path = getProgramMainDataPath(command_filename, RO_BASE_PATH); - char *conf_directory = getPath2(ro_base_path, CONF_DIRECTORY); + checked_free(command_basepath); + checked_free(command_basename); - char *command_basepath = getBasePath(command_filename); - char *command_basename = getBaseNameNoSuffix(command_filename); - char *command_filename_2 = getPath2(command_basepath, command_basename); + checked_free(command_filename_1); + checked_free(command_filename_2); - char *config_filename_1 = getStringCat2(command_filename_1, ".conf"); - char *config_filename_2 = getStringCat2(command_filename_2, ".conf"); - char *config_filename_3 = getPath2(conf_directory, SETUP_FILENAME); + initialized = TRUE; + } // 1st try: look for config file that exactly matches the binary filename if (fileExists(config_filename_1)) @@ -3860,32 +3879,29 @@ void LoadLevelArtworkInfo(void) print_timestamp_done("LoadLevelArtworkInfo"); } -static boolean AddUserTreeSetToTreeInfoExt(char *tree_subdir_new, int type) +static boolean AddTreeSetToTreeInfoExt(TreeInfo *tree_node_old, char *tree_dir, + char *tree_subdir_new, int type) { - TreeInfo **tree_node_first, *tree_node_old, *tree_node_new; - char *tree_user_dir = TREE_USERDIR(type); - - if (tree_user_dir == NULL) // should not happen - return FALSE; - - // get first node of level or artwork tree - tree_node_first = TREE_FIRST_NODE_PTR(type); - - if (tree_node_first == NULL) // should not happen - return FALSE; - - if (type == TREE_TYPE_LEVEL_DIR) - { - // get level info tree node of personal user level set - tree_node_old = getTreeInfoFromIdentifier(*tree_node_first, getLoginName()); - } - else + if (tree_node_old == NULL) { - // get artwork info tree node of first artwork set - tree_node_old = *tree_node_first; + if (type == TREE_TYPE_LEVEL_DIR) + { + // get level info tree node of personal user level set + tree_node_old = getTreeInfoFromIdentifier(leveldir_first, getLoginName()); + } + else + { + // get artwork info tree node of first artwork set + tree_node_old = ARTWORK_FIRST_NODE(artwork, type); + } } - if (tree_node_old == NULL) // should not happen + if (tree_dir == NULL) + tree_dir = TREE_USERDIR(type); + + if (tree_node_old == NULL || + tree_dir == NULL || + tree_subdir_new == NULL) // should not happen return FALSE; int draw_deactivation_mask = GetDrawDeactivationMask(); @@ -3896,21 +3912,27 @@ static boolean AddUserTreeSetToTreeInfoExt(char *tree_subdir_new, int type) if (type == TREE_TYPE_LEVEL_DIR) { // load new level set config and add it next to first user level set - LoadLevelInfoFromLevelConf(&tree_node_old->next, NULL, - tree_user_dir, tree_subdir_new); + LoadLevelInfoFromLevelConf(&tree_node_old->next, + tree_node_old->node_parent, + tree_dir, tree_subdir_new); } else { // load new artwork set config and add it next to first artwork set - LoadArtworkInfoFromArtworkConf(&tree_node_old->next, NULL, - tree_user_dir, tree_subdir_new, type); + LoadArtworkInfoFromArtworkConf(&tree_node_old->next, + tree_node_old->node_parent, + tree_dir, tree_subdir_new, type); } // set draw deactivation mask to previous value SetDrawDeactivationMask(draw_deactivation_mask); - // get tree info tree node of newly added tree set - tree_node_new = getTreeInfoFromIdentifier(*tree_node_first, tree_subdir_new); + // get first node of level or artwork info tree + TreeInfo **tree_node_first = TREE_FIRST_NODE_PTR(type); + + // get tree info node of newly added level or artwork set + TreeInfo *tree_node_new = getTreeInfoFromIdentifier(*tree_node_first, + tree_subdir_new); if (tree_node_new == NULL) // should not happen return FALSE; @@ -3919,21 +3941,22 @@ static boolean AddUserTreeSetToTreeInfoExt(char *tree_subdir_new, int type) tree_node_new->node_top = tree_node_old->node_top; tree_node_new->node_parent = tree_node_old->node_parent; - // sort tree info tree to adjust position of newly added tree set + // sort tree info to adjust position of newly added tree set sortTreeInfo(tree_node_first); return TRUE; } -void AddUserTreeSetToTreeInfo(char *tree_subdir_new, int type) +void AddTreeSetToTreeInfo(TreeInfo *tree_node, char *tree_dir, + char *tree_subdir_new, int type) { - if (!AddUserTreeSetToTreeInfoExt(tree_subdir_new, type)) - Error(ERR_EXIT, "internal tree set structure corrupted -- aborting"); + if (!AddTreeSetToTreeInfoExt(tree_node, tree_dir, tree_subdir_new, type)) + Error(ERR_EXIT, "internal tree info structure corrupted -- aborting"); } void AddUserLevelSetToLevelInfo(char *level_subdir_new) { - AddUserTreeSetToTreeInfo(level_subdir_new, TREE_TYPE_LEVEL_DIR); + AddTreeSetToTreeInfo(NULL, NULL, level_subdir_new, TREE_TYPE_LEVEL_DIR); } char *getArtworkIdentifierForUserLevelSet(int type) @@ -3963,8 +3986,17 @@ TreeInfo *getArtworkTreeInfoForUserLevelSet(int type) { char *artwork_set = getArtworkIdentifierForUserLevelSet(type); TreeInfo *artwork_first_node = ARTWORK_FIRST_NODE(artwork, type); + TreeInfo *ti = getTreeInfoFromIdentifier(artwork_first_node, artwork_set); + + if (ti == NULL) + { + ti = getTreeInfoFromIdentifier(artwork_first_node, + ARTWORK_DEFAULT_SUBDIR(type)); + if (ti == NULL) + Error(ERR_EXIT, "cannot find default graphics -- should not happen"); + } - return getTreeInfoFromIdentifier(artwork_first_node, artwork_set); + return ti; } boolean checkIfCustomArtworkExistsForCurrentLevelSet(void) @@ -4332,6 +4364,11 @@ static void checkSeriesInfo(void) { static char *level_directory = NULL; Directory *dir; +#if 0 + DirectoryEntry *dir_entry; +#endif + + checked_free(level_directory); // check for more levels besides the 'levels' field of 'levelinfo.conf' @@ -4347,6 +4384,35 @@ static void checkSeriesInfo(void) return; } +#if 0 + while ((dir_entry = readDirectory(dir)) != NULL) // loop all entries + { + if (strlen(dir_entry->basename) > 4 && + dir_entry->basename[3] == '.' && + strEqual(&dir_entry->basename[4], LEVELFILE_EXTENSION)) + { + char levelnum_str[4]; + int levelnum_value; + + strncpy(levelnum_str, dir_entry->basename, 3); + levelnum_str[3] = '\0'; + + levelnum_value = atoi(levelnum_str); + + if (levelnum_value < leveldir_current->first_level) + { + Error(ERR_WARN, "additional level %d found", levelnum_value); + leveldir_current->first_level = levelnum_value; + } + else if (levelnum_value > leveldir_current->last_level) + { + Error(ERR_WARN, "additional level %d found", levelnum_value); + leveldir_current->last_level = levelnum_value; + } + } + } +#endif + closeDirectory(dir); }