fixed checking artwork set for compatibility code for new score screens
[rocksndiamonds.git] / src / tape.c
index 68ffadcf92677d6d126deb3075b6b5e1f417fdeb..e9b7f4cc65e7018d43d4a08ae7c2799739b32164 100644 (file)
@@ -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,82 @@ 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 = getScoreTapeFilename(entry->tape_basename, level_nr);
+  boolean download_tape = (!fileExists(tape_filename));
+
+  if (download_tape && entry->id == -1)
+    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();
+
+  LoadScoreTape(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 +2502,7 @@ static void HandleTapeButtonsExt(int id)
       break;
 
     case TAPE_CTRL_ID_STOP:
-      TapeStop();
+      TapeStopTape();
 
       break;