struct AutoPlayInfo
{
LevelDirTree *leveldir;
- boolean initialized;
+ boolean all_levelsets;
int last_level_nr;
int level_nr;
int num_levels_played;
static char tape_patch_info[MAX_OUTPUT_LINESIZE];
+static void PrintTapeReplayHeader(struct AutoPlayInfo *autoplay)
+{
+ PrintLine("=", 79);
+
+ if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
+ Print("Automatically fixing level tapes\n");
+ else if (global.autoplay_mode == AUTOPLAY_MODE_UPLOAD)
+ Print("Automatically uploading level tapes\n");
+ else
+ Print("Automatically playing level tapes\n");
+
+ PrintLine("-", 79);
+ Print("Level series identifier: '%s'\n", autoplay->leveldir->identifier);
+ Print("Level series name: '%s'\n", autoplay->leveldir->name);
+ Print("Level series author: '%s'\n", autoplay->leveldir->author);
+ Print("Number of levels: %d\n", autoplay->leveldir->levels);
+ PrintLine("=", 79);
+ Print("\n");
+}
+
static void PrintTapeReplayProgress(boolean replay_finished)
{
static unsigned int counter_last = -1;
}
}
+static void PrintTapeReplaySummary(struct AutoPlayInfo *autoplay)
+{
+ char *autoplay_status =
+ (autoplay->num_levels_played == autoplay->num_levels_solved &&
+ autoplay->num_levels_played > 0 ? " OK " : "WARN");
+ int autoplay_percent =
+ (autoplay->num_levels_played ?
+ autoplay->num_levels_solved * 100 / autoplay->num_levels_played : 0);
+ int i;
+
+ Print("\n");
+ PrintLine("=", 79);
+ Print("Number of levels played: %d\n", autoplay->num_levels_played);
+ Print("Number of levels solved: %d (%d%%)\n", autoplay->num_levels_solved,
+ (autoplay->num_levels_played ?
+ autoplay->num_levels_solved * 100 / autoplay->num_levels_played : 0));
+ if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
+ Print("Number of tapes fixed: %d\n", autoplay->num_tapes_patched);
+ PrintLine("-", 79);
+ Print("Summary (for automatic parsing by scripts):\n");
+
+ if (autoplay->tape_filename)
+ {
+ Print("TAPEFILE [%s] '%s', %d, %d, %d",
+ autoplay_status,
+ autoplay->leveldir->identifier,
+ autoplay->last_level_nr,
+ game.score_final,
+ game.score_time_final);
+ }
+ else
+ {
+ Print("LEVELDIR [%s] '%s', SOLVED %d/%d (%d%%)",
+ autoplay_status,
+ autoplay->leveldir->identifier,
+ autoplay->num_levels_solved,
+ autoplay->num_levels_played,
+ autoplay_percent);
+
+ if (autoplay->num_levels_played != autoplay->num_levels_solved)
+ {
+ Print(", FAILED:");
+ for (i = 0; i < MAX_TAPES_PER_SET; i++)
+ if (autoplay->level_failed[i])
+ Print(" %03d", i);
+ }
+ }
+
+ Print("\n");
+ PrintLine("=", 79);
+}
+
static FILE *tape_log_file;
static void OpenTapeLogfile(void)
Print("- uploading score tape to score server - uploaded.\n");
}
-void AutoPlayTapes(void)
+static void AutoPlayTapesExt(boolean initialize)
{
static struct AutoPlayInfo autoplay;
static int patch_nr = 0;
-1
};
+ boolean init_level_set = FALSE;
int i;
- if (autoplay.initialized)
+ if (!initialize)
{
if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
{
}
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;
-
- PrintLine("=", 79);
- if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
- Print("Automatically fixing level tapes\n");
- else if (global.autoplay_mode == AUTOPLAY_MODE_UPLOAD)
- Print("Automatically uploading level tapes\n");
- else
- Print("Automatically playing level tapes\n");
- PrintLine("-", 79);
- Print("Level series identifier: '%s'\n", autoplay.leveldir->identifier);
- Print("Level series name: '%s'\n", autoplay.leveldir->name);
- Print("Level series author: '%s'\n", autoplay.leveldir->author);
- Print("Number of levels: %d\n", autoplay.leveldir->levels);
- PrintLine("=", 79);
- Print("\n");
-
- 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;
- autoplay.initialized = TRUE;
+ init_level_set = 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;
}
- char *autoplay_status =
- (autoplay.num_levels_played == autoplay.num_levels_solved &&
- autoplay.num_levels_played > 0 ? " OK " : "WARN");
- int autoplay_percent =
- (autoplay.num_levels_played ?
- autoplay.num_levels_solved * 100 / autoplay.num_levels_played : 0);
-
- Print("\n");
- PrintLine("=", 79);
- Print("Number of levels played: %d\n", autoplay.num_levels_played);
- Print("Number of levels solved: %d (%d%%)\n", autoplay.num_levels_solved,
- (autoplay.num_levels_played ?
- autoplay.num_levels_solved * 100 / autoplay.num_levels_played : 0));
- if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
- Print("Number of tapes fixed: %d\n", autoplay.num_tapes_patched);
- PrintLine("-", 79);
- Print("Summary (for automatic parsing by scripts):\n");
-
- if (autoplay.tape_filename)
- {
- Print("TAPEFILE [%s] '%s', %d, %d, %d",
- autoplay_status,
- autoplay.leveldir->identifier,
- autoplay.last_level_nr,
- game.score_final,
- game.score_time_final);
- }
- else
- {
- Print("LEVELDIR [%s] '%s', SOLVED %d/%d (%d%%)",
- autoplay_status,
- autoplay.leveldir->identifier,
- autoplay.num_levels_solved,
- autoplay.num_levels_played,
- autoplay_percent);
-
- if (autoplay.num_levels_played != autoplay.num_levels_solved)
- {
- Print(", FAILED:");
- for (i = 0; i < MAX_TAPES_PER_SET; i++)
- if (autoplay.level_failed[i])
- Print(" %03d", i);
- }
- }
+ CloseAllAndExit(0);
+}
- Print("\n");
- PrintLine("=", 79);
+void AutoPlayTapes(void)
+{
+ AutoPlayTapesExt(TRUE);
+}
- CloseAllAndExit(0);
+void AutoPlayTapesContinue(void)
+{
+ AutoPlayTapesExt(FALSE);
}