X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsetup.c;h=7d17464164e4f33f8e09b7fd0e0b45a80c0f9c53;hb=60905b7f08ae9a2c88299731a8ce490c31d8b6e0;hp=7e87a76e1153dbf6551d0a44da71cf69d4d4be1a;hpb=2c459683357975006225050ef9498af29b7fc01a;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index 7e87a76e..7d174641 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -457,7 +457,7 @@ char *getProgramMainDataPath(char *command_filename, char *base_path) { // check if the program's main data base directory is configured if (!strEqual(base_path, ".")) - return base_path; + return getStringCopy(base_path); /* if the program is configured to start from current directory (default), determine program package directory from program binary (some versions @@ -1093,7 +1093,8 @@ void InitUserLevelDirectory(char *level_subdir) createDirectory(getUserLevelDir(NULL), "main user level", PERMS_PRIVATE); createDirectory(getUserLevelDir(level_subdir), "user level", PERMS_PRIVATE); - SaveUserLevelInfo(); + if (setup.internal.create_user_levelset) + SaveUserLevelInfo(); } } @@ -1301,21 +1302,59 @@ static boolean adjustTreeGraphicsForEMC(TreeInfo *node) while (node) { - if (node->graphics_set_ecs && !setup.prefer_aga_graphics && - !strEqual(node->graphics_set, node->graphics_set_ecs)) + boolean want_ecs = (setup.prefer_aga_graphics == FALSE); + boolean want_aga = (setup.prefer_aga_graphics == TRUE); + boolean has_only_ecs = (!node->graphics_set && !node->graphics_set_aga); + boolean has_only_aga = (!node->graphics_set && !node->graphics_set_ecs); + char *graphics_set = NULL; + + if (node->graphics_set_ecs && (want_ecs || has_only_ecs)) + graphics_set = node->graphics_set_ecs; + + if (node->graphics_set_aga && (want_aga || has_only_aga)) + graphics_set = node->graphics_set_aga; + + if (graphics_set && !strEqual(node->graphics_set, graphics_set)) { - setString(&node->graphics_set, node->graphics_set_ecs); + setString(&node->graphics_set, graphics_set); settings_changed = TRUE; } - else if (node->graphics_set_aga && setup.prefer_aga_graphics && - !strEqual(node->graphics_set, node->graphics_set_aga)) + + if (node->node_group != NULL) + settings_changed |= adjustTreeGraphicsForEMC(node->node_group); + + node = node->next; + } + + return settings_changed; +} + +static boolean adjustTreeSoundsForEMC(TreeInfo *node) +{ + boolean settings_changed = FALSE; + + while (node) + { + boolean want_default = (setup.prefer_lowpass_sounds == FALSE); + boolean want_lowpass = (setup.prefer_lowpass_sounds == TRUE); + boolean has_only_default = (!node->sounds_set && !node->sounds_set_lowpass); + boolean has_only_lowpass = (!node->sounds_set && !node->sounds_set_default); + char *sounds_set = NULL; + + if (node->sounds_set_default && (want_default || has_only_default)) + sounds_set = node->sounds_set_default; + + if (node->sounds_set_lowpass && (want_lowpass || has_only_lowpass)) + sounds_set = node->sounds_set_lowpass; + + if (sounds_set && !strEqual(node->sounds_set, sounds_set)) { - setString(&node->graphics_set, node->graphics_set_aga); + setString(&node->sounds_set, sounds_set); settings_changed = TRUE; } if (node->node_group != NULL) - settings_changed |= adjustTreeGraphicsForEMC(node->node_group); + settings_changed |= adjustTreeSoundsForEMC(node->node_group); node = node->next; } @@ -2313,15 +2352,18 @@ SetupFileHash *loadSetupFileHash(char *filename) #define LEVELINFO_TOKEN_GRAPHICS_SET_ECS 17 #define LEVELINFO_TOKEN_GRAPHICS_SET_AGA 18 #define LEVELINFO_TOKEN_GRAPHICS_SET 19 -#define LEVELINFO_TOKEN_SOUNDS_SET 20 -#define LEVELINFO_TOKEN_MUSIC_SET 21 -#define LEVELINFO_TOKEN_FILENAME 22 -#define LEVELINFO_TOKEN_FILETYPE 23 -#define LEVELINFO_TOKEN_SPECIAL_FLAGS 24 -#define LEVELINFO_TOKEN_HANDICAP 25 -#define LEVELINFO_TOKEN_SKIP_LEVELS 26 - -#define NUM_LEVELINFO_TOKENS 27 +#define LEVELINFO_TOKEN_SOUNDS_SET_DEFAULT 20 +#define LEVELINFO_TOKEN_SOUNDS_SET_LOWPASS 21 +#define LEVELINFO_TOKEN_SOUNDS_SET 22 +#define LEVELINFO_TOKEN_MUSIC_SET 23 +#define LEVELINFO_TOKEN_FILENAME 24 +#define LEVELINFO_TOKEN_FILETYPE 25 +#define LEVELINFO_TOKEN_SPECIAL_FLAGS 26 +#define LEVELINFO_TOKEN_HANDICAP 27 +#define LEVELINFO_TOKEN_SKIP_LEVELS 28 +#define LEVELINFO_TOKEN_USE_EMC_TILES 29 + +#define NUM_LEVELINFO_TOKENS 30 static LevelDirTree ldi; @@ -2348,13 +2390,16 @@ static struct TokenInfo levelinfo_tokens[] = { TYPE_STRING, &ldi.graphics_set_ecs, "graphics_set.ecs" }, { TYPE_STRING, &ldi.graphics_set_aga, "graphics_set.aga" }, { TYPE_STRING, &ldi.graphics_set, "graphics_set" }, + { TYPE_STRING, &ldi.sounds_set_default,"sounds_set.default" }, + { TYPE_STRING, &ldi.sounds_set_lowpass,"sounds_set.lowpass" }, { TYPE_STRING, &ldi.sounds_set, "sounds_set" }, { TYPE_STRING, &ldi.music_set, "music_set" }, { TYPE_STRING, &ldi.level_filename, "filename" }, { TYPE_STRING, &ldi.level_filetype, "filetype" }, { TYPE_STRING, &ldi.special_flags, "special_flags" }, { TYPE_BOOLEAN, &ldi.handicap, "handicap" }, - { TYPE_BOOLEAN, &ldi.skip_levels, "skip_levels" } + { TYPE_BOOLEAN, &ldi.skip_levels, "skip_levels" }, + { TYPE_BOOLEAN, &ldi.use_emc_tiles, "use_emc_tiles" } }; static struct TokenInfo artworkinfo_tokens[] = @@ -2427,6 +2472,8 @@ static void setTreeInfoToDefaults(TreeInfo *ti, int type) ti->graphics_set_ecs = NULL; ti->graphics_set_aga = NULL; ti->graphics_set = NULL; + ti->sounds_set_default = NULL; + ti->sounds_set_lowpass = NULL; ti->sounds_set = NULL; ti->music_set = NULL; ti->graphics_path = getStringCopy(UNDEFINED_FILENAME); @@ -2446,6 +2493,8 @@ static void setTreeInfoToDefaults(TreeInfo *ti, int type) ti->readonly = TRUE; ti->handicap = TRUE; ti->skip_levels = FALSE; + + ti->use_emc_tiles = FALSE; } } @@ -2504,6 +2553,8 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ti, TreeInfo *parent) ti->graphics_set_ecs = getStringCopy(parent->graphics_set_ecs); ti->graphics_set_aga = getStringCopy(parent->graphics_set_aga); ti->graphics_set = getStringCopy(parent->graphics_set); + ti->sounds_set_default = getStringCopy(parent->sounds_set_default); + ti->sounds_set_lowpass = getStringCopy(parent->sounds_set_lowpass); ti->sounds_set = getStringCopy(parent->sounds_set); ti->music_set = getStringCopy(parent->music_set); ti->graphics_path = getStringCopy(UNDEFINED_FILENAME); @@ -2523,6 +2574,8 @@ static void setTreeInfoToDefaultsFromParent(TreeInfo *ti, TreeInfo *parent) ti->readonly = parent->readonly; ti->handicap = parent->handicap; ti->skip_levels = parent->skip_levels; + + ti->use_emc_tiles = parent->use_emc_tiles; } } @@ -2562,6 +2615,8 @@ static TreeInfo *getTreeInfoCopy(TreeInfo *ti) ti_copy->graphics_set_ecs = getStringCopy(ti->graphics_set_ecs); ti_copy->graphics_set_aga = getStringCopy(ti->graphics_set_aga); ti_copy->graphics_set = getStringCopy(ti->graphics_set); + ti_copy->sounds_set_default = getStringCopy(ti->sounds_set_default); + ti_copy->sounds_set_lowpass = getStringCopy(ti->sounds_set_lowpass); ti_copy->sounds_set = getStringCopy(ti->sounds_set); ti_copy->music_set = getStringCopy(ti->music_set); ti_copy->graphics_path = getStringCopy(ti->graphics_path); @@ -2588,6 +2643,8 @@ static TreeInfo *getTreeInfoCopy(TreeInfo *ti) ti_copy->handicap = ti->handicap; ti_copy->skip_levels = ti->skip_levels; + ti_copy->use_emc_tiles = ti->use_emc_tiles; + ti_copy->color = ti->color; ti_copy->class_desc = getStringCopy(ti->class_desc); ti_copy->handicap_level = ti->handicap_level; @@ -2629,6 +2686,8 @@ void freeTreeInfo(TreeInfo *ti) checked_free(ti->graphics_set_ecs); checked_free(ti->graphics_set_aga); checked_free(ti->graphics_set); + checked_free(ti->sounds_set_default); + checked_free(ti->sounds_set_lowpass); checked_free(ti->sounds_set); checked_free(ti->music_set); @@ -3421,6 +3480,16 @@ boolean AdjustGraphicsForEMC(void) return settings_changed; } +boolean AdjustSoundsForEMC(void) +{ + boolean settings_changed = FALSE; + + settings_changed |= adjustTreeSoundsForEMC(leveldir_first_all); + settings_changed |= adjustTreeSoundsForEMC(leveldir_first); + + return settings_changed; +} + void LoadLevelInfo(void) { InitUserLevelDirectory(getLoginName()); @@ -3440,6 +3509,7 @@ void LoadLevelInfo(void) cloneTree(&leveldir_first, leveldir_first_all, TRUE); AdjustGraphicsForEMC(); + AdjustSoundsForEMC(); // before sorting, the first entries will be from the user directory leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); @@ -3888,6 +3958,11 @@ static boolean AddTreeSetToTreeInfoExt(TreeInfo *tree_node_old, char *tree_dir, { // get level info tree node of personal user level set tree_node_old = getTreeInfoFromIdentifier(leveldir_first, getLoginName()); + + // this may happen if "setup.internal.create_user_levelset" is FALSE + // or if file "levelinfo.conf" is missing in personal user level set + if (tree_node_old == NULL) + tree_node_old = leveldir_first->node_group; } else {