X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=cd07263f007f2e4842c1395e13a5c17f6d6adecf;hb=150d316a89345044484cdcb2d875c682008fff64;hp=68ffadcf92677d6d126deb3075b6b5e1f417fdeb;hpb=1e56877fb87c1004b98e6c5fbb1132da2178b46e;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 68ffadcf..cd07263f 100644 --- a/src/tape.c +++ b/src/tape.c @@ -18,6 +18,8 @@ #include "files.h" #include "network.h" #include "anim.h" +#include "api.h" + #define DEBUG_TAPE_WHEN_PLAYING FALSE @@ -1088,6 +1090,27 @@ void TapeStop(void) } } +static void TapeStopGameOrTape(boolean stop_game) +{ + if (score_info_tape_play || (!tape.playing && stop_game)) + RequestQuitGame(FALSE); + else + TapeStop(); +} + +void TapeStopGame(void) +{ + if (game_status == GAME_MODE_MAIN) + return; + + TapeStopGameOrTape(TRUE); +} + +void TapeStopTape(void) +{ + TapeStopGameOrTape(FALSE); +} + unsigned int GetTapeLengthFrames(void) { unsigned int tape_length_frames = 0; @@ -1271,6 +1294,13 @@ static boolean checkRestartGame(char *message) void TapeRestartGame(void) { + if (score_info_tape_play) + { + TapeStartGamePlaying(); + + return; + } + if (!checkRestartGame("Restart game?")) return; @@ -1279,6 +1309,9 @@ void TapeRestartGame(void) void TapeReplayAndPauseBeforeEnd(void) { + if (score_info_tape_play) + return; + if (TAPE_IS_EMPTY(tape) && !tape.recording) { Request("No tape for this level!", REQ_CONFIRM); @@ -1345,6 +1378,94 @@ boolean PlaySolutionTape(void) return TRUE; } +static boolean PlayScoreTape_WaitForDownload(void) +{ + unsigned int download_delay = 0; + unsigned int download_delay_value = 10000; + + ResetDelayCounter(&download_delay); + + // wait for score tape to be successfully downloaded (and fail on timeout) + while (!server_scores.tape_downloaded) + { + if (DelayReached(&download_delay, download_delay_value)) + return FALSE; + + UPDATE_BUSY_STATE_NOT_LOADING(); + + Delay(20); + } + + return TRUE; +} + +boolean PlayScoreTape(int entry_nr) +{ + struct ScoreEntry *entry = &scores.entry[entry_nr]; + char *tape_filename = + (entry->id == -1 ? + getScoreTapeFilename(entry->tape_basename, level_nr) : + getScoreCacheTapeFilename(entry->tape_basename, level_nr)); + boolean download_tape = (!fileExists(tape_filename)); + + if (download_tape && entry->id == -1) + { + FadeSkipNextFadeIn(); + + Request("Cannot find score tape!", REQ_CONFIRM); + + return FALSE; + } + + server_scores.tape_downloaded = FALSE; + + if (download_tape) + ApiGetScoreTapeAsThread(level_nr, entry->id, entry->tape_basename); + + SetGameStatus(GAME_MODE_PLAYING); + + FadeOut(REDRAW_FIELD); + + if (download_tape && !PlayScoreTape_WaitForDownload()) + { + SetGameStatus(GAME_MODE_SCOREINFO); + ClearField(); + + Request("Cannot download score tape from score server!", REQ_CONFIRM); + + return FALSE; + } + + if (!TAPE_IS_STOPPED(tape)) + TapeStop(); + + // if tape recorder already contains a tape, remove it without asking + TapeErase(); + + if (entry->id == -1) + LoadScoreTape(entry->tape_basename, level_nr); + else + LoadScoreCacheTape(entry->tape_basename, level_nr); + + if (TAPE_IS_EMPTY(tape)) + { + SetGameStatus(GAME_MODE_SCOREINFO); + ClearField(); + + Request("Cannot load score tape for this level!", REQ_CONFIRM); + + return FALSE; + } + + FadeSkipNextFadeOut(); + + TapeStartGamePlaying(); + + score_info_tape_play = TRUE; + + return TRUE; +} + static boolean checkTapesFromSameLevel(struct TapeInfo *t1, struct TapeInfo *t2) { return (strEqual(t1->level_identifier, t2->level_identifier) && @@ -2393,7 +2514,7 @@ static void HandleTapeButtonsExt(int id) break; case TAPE_CTRL_ID_STOP: - TapeStop(); + TapeStopTape(); break;