From 8d55afd03c67ddfe49d92701b06b288de6db939d Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Mon, 28 Jun 2021 16:41:38 +0200 Subject: [PATCH] added command to play tape and upload resulting score to server --- src/files.c | 3 +++ src/init.c | 2 ++ src/main.h | 5 ++++- src/tape.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/files.c b/src/files.c index de9c7e37..6b6078ba 100644 --- a/src/files.c +++ b/src/files.c @@ -8537,6 +8537,7 @@ static void setScoreInfoToDefaultsExt(struct ScoreInfo *scores) scores->last_added_local = -1; scores->updated = FALSE; + scores->uploaded = FALSE; scores->force_last_added = FALSE; } @@ -9380,6 +9381,8 @@ static void UploadScoreToServerExt(struct HttpRequest *request, return; } + + server_scores.uploaded = TRUE; } static void UploadScoreToServer(int level_nr, char *score_tape_filename, diff --git a/src/init.c b/src/init.c index 6ccc8822..d5120fb2 100644 --- a/src/init.c +++ b/src/init.c @@ -5068,6 +5068,7 @@ static void Execute_Command(char *command) strPrefix(command, "autoffwd ") || strPrefix(command, "autowarp ") || strPrefix(command, "autotest ") || + strPrefix(command, "autosave ") || strPrefix(command, "autofix ")) { char *str_ptr = getStringCopy(&command[8]); // read command parameters @@ -5077,6 +5078,7 @@ static void Execute_Command(char *command) strPrefix(command, "autoffwd") ? AUTOPLAY_MODE_FFWD : strPrefix(command, "autowarp") ? AUTOPLAY_MODE_WARP : strPrefix(command, "autotest") ? AUTOPLAY_MODE_TEST : + strPrefix(command, "autosave") ? AUTOPLAY_MODE_SAVE : strPrefix(command, "autofix") ? AUTOPLAY_MODE_FIX : AUTOPLAY_MODE_NONE); diff --git a/src/main.h b/src/main.h index 575be5ac..58e6c59a 100644 --- a/src/main.h +++ b/src/main.h @@ -2655,7 +2655,8 @@ enum #define AUTOPLAY_FFWD (1 << 1) #define AUTOPLAY_WARP (1 << 2) #define AUTOPLAY_TEST (1 << 3) -#define AUTOPLAY_FIX (1 << 4) +#define AUTOPLAY_SAVE (1 << 4) +#define AUTOPLAY_FIX (1 << 5) #define AUTOPLAY_WARP_NO_DISPLAY AUTOPLAY_TEST #define AUTOPLAY_MODE_NONE 0 @@ -2663,6 +2664,7 @@ enum #define AUTOPLAY_MODE_FFWD (AUTOPLAY_MODE_PLAY | AUTOPLAY_FFWD) #define AUTOPLAY_MODE_WARP (AUTOPLAY_MODE_FFWD | AUTOPLAY_WARP) #define AUTOPLAY_MODE_TEST (AUTOPLAY_MODE_WARP | AUTOPLAY_TEST) +#define AUTOPLAY_MODE_SAVE (AUTOPLAY_MODE_TEST | AUTOPLAY_SAVE) #define AUTOPLAY_MODE_FIX (AUTOPLAY_MODE_TEST | AUTOPLAY_FIX) #define AUTOPLAY_MODE_WARP_NO_DISPLAY AUTOPLAY_MODE_TEST @@ -3059,6 +3061,7 @@ struct ScoreInfo int last_added_local; boolean updated; + boolean uploaded; boolean force_last_added; struct ScoreEntry entry[MAX_SCORE_ENTRIES]; diff --git a/src/tape.c b/src/tape.c index 86e12791..14bf45bc 100644 --- a/src/tape.c +++ b/src/tape.c @@ -1313,6 +1313,65 @@ void AutoPlayTapes(void) // just finished auto-playing tape PrintTapeReplayProgress(TRUE); + if (global.autoplay_mode == AUTOPLAY_MODE_SAVE && + tape.auto_play_level_solved) + { + // set unique basename for score tape (for uploading to score server) + strcpy(tape.score_tape_basename, getScoreTapeBasename(setup.player_name)); + + // store score in first score entry + scores.last_added = 0; + + struct ScoreEntry *entry = &scores.entry[scores.last_added]; + + strncpy(entry->tape_basename, tape.score_tape_basename, MAX_FILENAME_LEN); + strncpy(entry->name, setup.player_name, MAX_PLAYER_NAME_LEN); + + entry->score = game.score_final; + entry->time = game.score_time_final; + + if (leveldir_current) + { + // the tape's level set identifier may differ from current level set + strncpy(tape.level_identifier, leveldir_current->identifier, + MAX_FILENAME_LEN); + tape.level_identifier[MAX_FILENAME_LEN] = '\0'; + + // the tape's level number may differ from current level number + tape.level_nr = level_nr; + } + + PrintNoLog("- uploading score tape to score server ... "); + + server_scores.uploaded = FALSE; + + // temporarily save score tape (as the tape filename is unknown here) + SaveScoreTape(level_nr); + SaveServerScore(level_nr); + + unsigned int upload_delay = 0; + unsigned int upload_delay_value = 10000; + + ResetDelayCounter(&upload_delay); + + // wait for score tape to be successfully uploaded (and fail on timeout) + while (!server_scores.uploaded) + { + if (DelayReached(&upload_delay, upload_delay_value)) + { + PrintNoLog("\r"); + Print("- uploading score tape to score server - TIMEOUT.\n"); + + Fail("cannot upload score tape to score server"); + } + + Delay(20); + } + + PrintNoLog("\r"); + Print("- uploading score tape to score server - uploaded.\n"); + } + if (patch_nr == 0) num_levels_played++; -- 2.34.1