{
LevelDirTree *leveldir;
boolean initialized;
+ boolean all_levelsets;
int last_level_nr;
int level_nr;
int num_levels_played;
-1
};
+ boolean init_level_set = FALSE;
int i;
if (autoplay.initialized)
}
else
{
+ if (strEqual(global.autoplay_leveldir, "ALL"))
+ {
+ autoplay.all_levelsets = TRUE;
+
+ // tape mass-uploading only allowed for private tapes
+ if (global.autoplay_mode == AUTOPLAY_MODE_UPLOAD)
+ options.mytapes = TRUE;
+ }
+
if ((global.autoplay_mode == AUTOPLAY_MODE_SAVE ||
global.autoplay_mode == AUTOPLAY_MODE_UPLOAD) &&
!options.mytapes &&
global.autoplay_all = FALSE;
}
- autoplay.leveldir = getTreeInfoFromIdentifier(leveldir_first,
- global.autoplay_leveldir);
+ if (autoplay.all_levelsets)
+ {
+ // start auto-playing first level set
+ autoplay.leveldir = getFirstValidTreeInfoEntry(leveldir_first);
+ }
+ else
+ {
+ // auto-play selected level set
+ autoplay.leveldir = getTreeInfoFromIdentifier(leveldir_first,
+ global.autoplay_leveldir);
+
+ }
if (autoplay.leveldir == NULL)
Fail("no such level identifier: '%s'", global.autoplay_leveldir);
- leveldir_current = autoplay.leveldir;
-
- if (autoplay.leveldir->first_level < 0)
- autoplay.leveldir->first_level = 0;
- if (autoplay.leveldir->last_level >= MAX_TAPES_PER_SET)
- autoplay.leveldir->last_level = MAX_TAPES_PER_SET - 1;
-
- autoplay.level_nr = autoplay.leveldir->first_level;
-
- PrintTapeReplayHeader(&autoplay);
-
- for (i = 0; i < MAX_TAPES_PER_SET; i++)
- autoplay.level_failed[i] = FALSE;
-
// only private tapes may be modified
if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
options.mytapes = TRUE;
+ init_level_set = TRUE;
+
autoplay.initialized = TRUE;
}
while (1)
{
+ if (init_level_set)
+ {
+ leveldir_current = autoplay.leveldir;
+
+ if (autoplay.leveldir->first_level < 0)
+ autoplay.leveldir->first_level = 0;
+ if (autoplay.leveldir->last_level >= MAX_TAPES_PER_SET)
+ autoplay.leveldir->last_level = MAX_TAPES_PER_SET - 1;
+
+ autoplay.level_nr = autoplay.leveldir->first_level;
+
+ autoplay.num_levels_played = 0;
+ autoplay.num_levels_solved = 0;
+ autoplay.num_tapes_patched = 0;
+ autoplay.num_tape_missing = 0;
+
+ for (i = 0; i < MAX_TAPES_PER_SET; i++)
+ autoplay.level_failed[i] = FALSE;
+
+ PrintTapeReplayHeader(&autoplay);
+
+ init_level_set = FALSE;
+ }
+
if (global.autoplay_mode != AUTOPLAY_MODE_FIX || patch_nr == 0)
level_nr = autoplay.level_nr++;
+ // check if all tapes for this level set have been processed
if (level_nr > autoplay.leveldir->last_level)
- break;
+ {
+ PrintTapeReplaySummary(&autoplay);
+
+ if (!autoplay.all_levelsets)
+ break;
+
+ // continue with next level set
+ autoplay.leveldir = getNextValidTreeInfoEntry(autoplay.leveldir);
+
+ // all level sets processed
+ if (autoplay.leveldir == NULL)
+ break;
+
+ init_level_set = TRUE;
+
+ continue;
+ }
// set patch info (required for progress output)
strcpy(tape_patch_info, "");
continue;
TapeErase();
+ TapeRewind(); // needed to reset "tape.auto_play_level_solved"
LoadLevel(level_nr);
return;
}
- PrintTapeReplaySummary(&autoplay);
-
CloseAllAndExit(0);
}