rnd-20030102-2-src
[rocksndiamonds.git] / src / tape.c
index cc2ad928110c0d5d6e753fa6ab855a5ae7b8d330..709e1520ac38a26c5a1f5b33233606dbdc4bb492 100644 (file)
@@ -14,6 +14,7 @@
 #include "libgame/libgame.h"
 
 #include "tape.h"
+#include "init.h"
 #include "game.h"
 #include "tools.h"
 #include "files.h"
@@ -325,6 +326,8 @@ static void TapeRewind()
   tape.playing = FALSE;
   tape.fast_forward = FALSE;
   tape.index_search = FALSE;
+  tape.auto_play = (global.autoplay_leveldir != NULL);
+  tape.auto_play_level_solved = FALSE;
   tape.quick_resume = FALSE;
   tape.single_step = FALSE;
 
@@ -552,7 +555,7 @@ byte *TapePlayAction()
 
   if (tape.counter >= tape.length)     /* end of tape reached */
   {
-    if (tape.index_search)
+    if (tape.index_search && !tape.auto_play)
       TapeTogglePause(TAPE_TOGGLE_MANUAL);
     else
       TapeStop();
@@ -584,6 +587,9 @@ void TapeStop()
     DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
     DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds);
   }
+
+  if (tape.auto_play)
+    AutoPlayTape();    /* continue automatically playing next tape */
 }
 
 unsigned int GetTapeLength()
@@ -608,7 +614,7 @@ static void TapeStartIndexSearch()
   {
     tape.pausing = FALSE;
 
-    SetDrawDeactivationMask(REDRAW_FIELD | REDRAW_DOOR_1);
+    SetDrawDeactivationMask(REDRAW_FIELD);
     audio.sound_deactivated = TRUE;
   }
 }
@@ -672,6 +678,108 @@ void TapeQuickLoad()
 }
 
 
+/* ------------------------------------------------------------------------- *
+ * tape autoplay functions
+ * ------------------------------------------------------------------------- */
+
+void AutoPlayTape()
+{
+  static LevelDirTree *autoplay_leveldir = NULL;
+  static boolean autoplay_initialized = FALSE;
+  static int autoplay_level_nr = -1;
+  static int levels_played = 0;
+  static int levels_solved = 0;
+
+  if (autoplay_initialized)
+  {
+    /* just finished auto-playing tape */
+    printf("%s.\n", tape.auto_play_level_solved ? "solved" : "NOT SOLVED");
+
+    levels_played++;
+    if (tape.auto_play_level_solved)
+      levels_solved++;
+  }
+  else
+  {
+    DrawCompleteVideoDisplay();
+    audio.sound_enabled = FALSE;
+
+    autoplay_leveldir = getTreeInfoFromIdentifier(leveldir_first,
+                                                 global.autoplay_leveldir);
+
+    if (autoplay_leveldir == NULL)
+      Error(ERR_EXIT, "no such level identifier: '%s'",
+           global.autoplay_leveldir);
+
+    leveldir_current = autoplay_leveldir;
+
+    if (global.autoplay_level_nr != -1)
+    {
+      autoplay_leveldir->first_level = global.autoplay_level_nr;
+      autoplay_leveldir->last_level  = global.autoplay_level_nr;
+    }
+
+    autoplay_level_nr = autoplay_leveldir->first_level;
+
+    printf_line('=', 79);
+    printf("Automatically playing level tapes\n");
+    printf_line('-', 79);
+    printf("Level series identifier: '%s'\n", autoplay_leveldir->identifier);
+    printf("Level series name:       '%s'\n", autoplay_leveldir->name);
+    printf("Level series author:     '%s'\n", autoplay_leveldir->author);
+    printf("Number of levels:        %d\n",   autoplay_leveldir->levels);
+    printf_line('=', 79);
+    printf("\n");
+
+    autoplay_initialized = TRUE;
+  }
+
+  while (autoplay_level_nr <= autoplay_leveldir->last_level)
+  {
+    level_nr = autoplay_level_nr++;
+
+    TapeErase();
+
+    printf("Level %03d: ", level_nr);
+
+    LoadLevel(level_nr);
+    if (level.no_level_file)
+    {
+      printf("(no level)\n");
+      continue;
+    }
+
+    LoadTape(level_nr);
+    if (TAPE_IS_EMPTY(tape))
+    {
+      printf("(no tape)\n");
+      continue;
+    }
+
+    printf("playing tape ... ");
+
+    TapeStartGamePlaying();
+    TapeStartIndexSearch();
+
+    return;
+  }
+
+  printf("\n");
+  printf_line('=', 79);
+  printf("Number of levels played: %d\n", levels_played);
+  printf("Number of levels solved: %d (%d%%)\n", levels_solved,
+        levels_solved * 100 / levels_played);
+  printf_line('-', 79);
+  printf("Summary (for automatic parsing by scripts):\n");
+  printf("LEVELDIR '%s', SOLVED %d/%d (%d%%)\n",
+        autoplay_leveldir->identifier, levels_solved, levels_played,
+        levels_solved * 100 / levels_played);
+  printf_line('=', 79);
+
+  CloseAllAndExit(0);
+}
+
+
 /* ---------- new tape button stuff ---------------------------------------- */
 
 /* graphic position values for tape buttons */
@@ -771,6 +879,14 @@ void CreateTapeButtons()
   }
 }
 
+void FreeTapeButtons()
+{
+  int i;
+
+  for (i=0; i<NUM_TAPE_BUTTONS; i++)
+    FreeGadget(tape_gadget[i]);
+}
+
 void MapTapeEjectButton()
 {
   UnmapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]);