server_scores.uploaded = FALSE;
}
-static void AutoPlayTapes_WaitForUpload(void)
+static boolean AutoPlayTapes_WaitForUpload(void)
{
unsigned int upload_delay = 0;
unsigned int upload_delay_value = 10000;
PrintNoLog("\r");
Print("- uploading score tape to score server - TIMEOUT.\n");
- Fail("cannot upload score tape to score server");
+ if (program.headless)
+ Fail("cannot upload score tape to score server");
+
+ return FALSE;
}
UPDATE_BUSY_STATE();
PrintNoLog("\r");
Print("- uploading score tape to score server - uploaded.\n");
+
+ return TRUE;
}
static int AutoPlayTapesExt(boolean initialize)
-1
};
+ LevelDirTree *leveldir_current_last = leveldir_current;
boolean init_level_set = FALSE;
+ int level_nr_last = level_nr;
int i;
if (!initialize)
// save score tape to upload to server; may be required for some reasons:
// * level set identifier in solution tapes may differ from level set
+ // * level set identifier is missing (old-style tape without INFO chunk)
// * solution tape may have native format (like Supaplex solution files)
SaveScoreTape(level_nr);
- SaveServerScore(level_nr);
+ SaveServerScore(level_nr, TRUE);
AutoPlayTapes_WaitForUpload();
}
{
autoplay.tape_filename = global.autoplay_leveldir;
+ if (!fileExists(autoplay.tape_filename))
+ Fail("tape file '%s' does not exist", autoplay.tape_filename);
+
LoadTapeFromFilename(autoplay.tape_filename);
if (tape.no_valid_file)
- {
- if (!fileExists(autoplay.tape_filename))
- Fail("tape file '%s' does not exist", autoplay.tape_filename);
- else
- Fail("cannot load tape file '%s'", autoplay.tape_filename);
- }
+ Fail("cannot load tape file '%s'", autoplay.tape_filename);
+
+ if (tape.no_info_chunk && !options.identifier)
+ Fail("cannot get levelset from tape file '%s'", autoplay.tape_filename);
+
+ if (tape.no_info_chunk && !options.level_nr)
+ Fail("cannot get level nr from tape file '%s'", autoplay.tape_filename);
global.autoplay_leveldir = tape.level_identifier;
+ if (options.identifier != NULL)
+ global.autoplay_leveldir = options.identifier;
+
+ if (options.level_nr != NULL)
+ tape.level_nr = atoi(options.level_nr);
+
if (tape.level_nr >= 0 && tape.level_nr < MAX_TAPES_PER_SET)
global.autoplay_level[tape.level_nr] = TRUE;
if (global.autoplay_mode == AUTOPLAY_MODE_FIX)
options.mytapes = TRUE;
+ // set timestamp for batch tape upload
+ global.autoplay_time = time(NULL);
+
num_tapes = 0;
init_level_set = TRUE;
if (!global.autoplay_all && !global.autoplay_level[level_nr])
continue;
+ char *tape_filename = (autoplay.tape_filename ? autoplay.tape_filename :
+ options.mytapes ? getTapeFilename(level_nr) :
+ getSolutionTapeFilename(level_nr));
+
+ // speed things up in case of missing tapes (by skipping loading level)
+ if (!fileExists(tape_filename))
+ {
+ autoplay.num_tape_missing++;
+
+ Print("Tape %03d: (no tape found)\n", level_nr);
+
+ continue;
+ }
+
TapeErase();
TapeRewind(); // needed to reset "tape.auto_play_level_solved"
{
autoplay.num_tape_missing++;
- Print("Tape %03d: (no tape found)\n", level_nr);
+ Print("Tape %03d: (invalid tape)\n", level_nr);
continue;
}
if (!fileExists(autoplay.tape_filename))
{
- // non-standard solution tape -- save to temporary file
+ // non-standard or incorrect solution tape -- save to temporary file
autoplay.tape_filename = getTemporaryTapeFilename();
SaveTapeToFilename(autoplay.tape_filename);
}
}
- SaveServerScoreFromFile(level_nr, autoplay.tape_filename);
+ SaveServerScoreFromFile(level_nr, TRUE, autoplay.tape_filename);
- AutoPlayTapes_WaitForUpload();
+ boolean success = AutoPlayTapes_WaitForUpload();
if (use_temporary_tape_file)
unlink(autoplay.tape_filename);
// required for uploading multiple tapes
autoplay.tape_filename = NULL;
+ if (!success)
+ {
+ num_tapes = -1;
+
+ break;
+ }
+
continue;
}
return num_tapes;
}
- if (program.headless)
+ if (global.autoplay_mode == AUTOPLAY_MODE_UPLOAD)
+ {
+ Print("\n");
+ PrintLine("=", 79);
+
+ if (num_tapes >= 0)
+ Print("SUMMARY: %d tapes uploaded.\n", num_tapes);
+ else
+ Print("SUMMARY: Uploading tapes failed.\n");
+
+ PrintLine("=", 79);
+ }
+
+ // clear timestamp for batch tape upload (required after interactive upload)
+ global.autoplay_time = 0;
+
+ // exit if running headless or if visually auto-playing tapes
+ if (program.headless || global.autoplay_mode != AUTOPLAY_MODE_UPLOAD)
CloseAllAndExit(0);
+ // when running interactively, restore last selected level set and number
+ leveldir_current = leveldir_current_last;
+ level_nr = level_nr_last;
+
return num_tapes;
}