X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibgame%2Fsetup.c;h=6886e101d343e5e63d14bcb640f70d7806019be2;hb=3e76edd9591c599d4ec9b3a179e07c23c0aa135c;hp=ee7733fcd5216b97df49d184b9a0b1e87d2b8892;hpb=a4fa40cbdd9ef5a4c9a4c18e34298fa9ec49f53d;p=rocksndiamonds.git diff --git a/src/libgame/setup.c b/src/libgame/setup.c index ee7733fc..6886e101 100644 --- a/src/libgame/setup.c +++ b/src/libgame/setup.c @@ -1326,7 +1326,9 @@ static char *getCustomMusicDirectoryExt(boolean check_music) { // 2nd try: look for special artwork configured in level series config directory = getStringCopy(getLevelArtworkDir(TREE_TYPE_MUSIC_DIR)); - if (directoryExists_CheckMusic(directory, check_music)) + + // directory also valid if no unconfigured music found (no game music) + if (directoryExists_CheckMusic(directory, FALSE)) return directory; free(directory); @@ -1340,7 +1342,9 @@ static char *getCustomMusicDirectoryExt(boolean check_music) { // 3rd try: look for special artwork in configured artwork directory directory = getStringCopy(getSetupArtworkDir(artwork.mus_current)); - if (directoryExists_CheckMusic(directory, check_music)) + + // directory also valid if no unconfigured music found (no game music) + if (directoryExists_CheckMusic(directory, FALSE)) return directory; free(directory); @@ -2765,6 +2769,7 @@ SetupFileHash *loadSetupFileHash(char *filename) // ============================================================================ #define TOKEN_STR_LAST_LEVEL_SERIES "last_level_series" +#define TOKEN_STR_LAST_PLAYED_MENU_USED "last_played_menu_used" #define TOKEN_STR_LAST_PLAYED_LEVEL "last_played_level" #define TOKEN_STR_HANDICAP_LEVEL "handicap_level" #define TOKEN_STR_LAST_USER "last_user" @@ -5006,33 +5011,51 @@ static void UpdateLastPlayedLevels_List(void) setString(&last_level_series[0], leveldir_current->identifier); } -static TreeInfo *StoreOrRestoreLastPlayedLevels(TreeInfo *node, boolean store) +#define LAST_PLAYED_MODE_SET 1 +#define LAST_PLAYED_MODE_SET_FORCED 2 +#define LAST_PLAYED_MODE_GET 3 + +static TreeInfo *StoreOrRestoreLastPlayedLevels(TreeInfo *node, int mode) { static char *identifier = NULL; - if (store) + if (mode == LAST_PLAYED_MODE_SET) { setString(&identifier, (node && node->is_copy ? node->identifier : NULL)); - - return NULL; // not used } - else + else if (mode == LAST_PLAYED_MODE_SET_FORCED) + { + setString(&identifier, (node ? node->identifier : NULL)); + } + else if (mode == LAST_PLAYED_MODE_GET) { TreeInfo *node_new = getTreeInfoFromIdentifierExt(leveldir_first, identifier, TREE_NODE_TYPE_COPY); return (node_new != NULL ? node_new : node); } + + return NULL; // not used } void StoreLastPlayedLevels(TreeInfo *node) { - StoreOrRestoreLastPlayedLevels(node, TRUE); + StoreOrRestoreLastPlayedLevels(node, LAST_PLAYED_MODE_SET); +} + +void ForcedStoreLastPlayedLevels(TreeInfo *node) +{ + StoreOrRestoreLastPlayedLevels(node, LAST_PLAYED_MODE_SET_FORCED); } void RestoreLastPlayedLevels(TreeInfo **node) { - *node = StoreOrRestoreLastPlayedLevels(*node, FALSE); + *node = StoreOrRestoreLastPlayedLevels(*node, LAST_PLAYED_MODE_GET); +} + +boolean CheckLastPlayedLevels(void) +{ + return (StoreOrRestoreLastPlayedLevels(NULL, LAST_PLAYED_MODE_GET) != NULL); } void LoadLevelSetup_LastSeries(void) @@ -5070,6 +5093,13 @@ void LoadLevelSetup_LastSeries(void) if (leveldir_current == NULL) leveldir_current = getFirstValidTreeInfoEntry(leveldir_first); + char *last_played_menu_used = + getHashEntry(level_setup_hash, TOKEN_STR_LAST_PLAYED_MENU_USED); + + // store if last level set was selected from "last played" menu + if (strEqual(last_played_menu_used, "true")) + ForcedStoreLastPlayedLevels(leveldir_current); + for (i = 0; i < MAX_LEVELDIR_HISTORY; i++) { char token[strlen(TOKEN_STR_LAST_LEVEL_SERIES) + 10]; @@ -5132,7 +5162,14 @@ static void SaveLevelSetup_LastSeries_Ext(boolean deactivate_last_level_series) fprintf(file, "# %s\n# ", "the following level set may have caused a problem and was deactivated"); fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_LAST_LEVEL_SERIES, - leveldir_current->identifier)); + leveldir_current->identifier)); + + // store if last level set was selected from "last played" menu + boolean last_played_menu_used = CheckLastPlayedLevels(); + char *setup_value = getSetupValue(TYPE_BOOLEAN, &last_played_menu_used); + + fprintf(file, "%s\n\n", getFormattedSetupEntry(TOKEN_STR_LAST_PLAYED_MENU_USED, + setup_value)); for (i = 0; last_level_series[i] != NULL; i++) {