rnd-20030118-6-src
[rocksndiamonds.git] / src / tape.c
index 8ca52a0335e4e172751344f4cf655346c72a4533..8d1b6952c4a8c4ade26014a268c0bc762fa60ec9 100644 (file)
@@ -168,7 +168,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
   {
     int cx = DOOR_GFX_PAGEX3, cy = DOOR_GFX_PAGEY2;
 
-    BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+    BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
               cx + VIDEO_REC_LABEL_XPOS,
               cy + VIDEO_REC_LABEL_YPOS,
               VIDEO_PBEND_LABEL_XSIZE,
@@ -189,7 +189,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
        cx = DOOR_GFX_PAGEX3;   /* i gerade => STATE_OFF / PRESS_ON */
 
       if (video_pos[pos][part_label][0] && value != VIDEO_DISPLAY_SYMBOL_ONLY)
-       BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+       BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
                   cx + video_pos[pos][part_label][xpos],
                   cy + video_pos[pos][part_label][ypos],
                   video_pos[pos][part_label][xsize],
@@ -197,7 +197,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
                   VX + video_pos[pos][part_label][xpos],
                   VY + video_pos[pos][part_label][ypos]);
       if (video_pos[pos][part_symbol][0] && value != VIDEO_DISPLAY_LABEL_ONLY)
-       BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+       BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
                   cx + video_pos[pos][part_symbol][xpos],
                   cy + video_pos[pos][part_symbol][ypos],
                   video_pos[pos][part_symbol][xsize],
@@ -211,7 +211,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
   {
     int cx = DOOR_GFX_PAGEX4, cy = DOOR_GFX_PAGEY2;
 
-    BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+    BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
               cx + VIDEO_PLAY_SYMBOL_XPOS,
               cy + VIDEO_PLAY_SYMBOL_YPOS,
               VIDEO_PLAY_SYMBOL_XSIZE - 2,
@@ -224,7 +224,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
   {
     int cx = DOOR_GFX_PAGEX6, cy = DOOR_GFX_PAGEY1;
 
-    BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+    BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
               cx + VIDEO_PBEND_LABEL_XPOS,
               cy + VIDEO_PBEND_LABEL_YPOS,
               VIDEO_PBEND_LABEL_XSIZE,
@@ -268,10 +268,10 @@ void DrawVideoDisplay(unsigned long state, unsigned long value)
 
 void DrawCompleteVideoDisplay()
 {
-  BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+  BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
             DOOR_GFX_PAGEX3, DOOR_GFX_PAGEY2,
             gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy);
-  BlitBitmap(new_graphic_info[IMG_MENU_DOOR].bitmap, drawto,
+  BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
             DOOR_GFX_PAGEX4 + VIDEO_CONTROL_XPOS,
             DOOR_GFX_PAGEY2 + VIDEO_CONTROL_YPOS,
             VIDEO_CONTROL_XSIZE, VIDEO_CONTROL_YSIZE,
@@ -326,7 +326,7 @@ static void TapeRewind()
   tape.playing = FALSE;
   tape.fast_forward = FALSE;
   tape.index_search = FALSE;
-  tape.auto_play = (options.autoplay_leveldir != NULL);
+  tape.auto_play = (global.autoplay_leveldir != NULL);
   tape.auto_play_level_solved = FALSE;
   tape.quick_resume = FALSE;
   tape.single_step = FALSE;
@@ -614,7 +614,7 @@ static void TapeStartIndexSearch()
   {
     tape.pausing = FALSE;
 
-    SetDrawDeactivationMask(REDRAW_FIELD | REDRAW_DOOR_1);
+    SetDrawDeactivationMask(REDRAW_FIELD);
     audio.sound_deactivated = TRUE;
   }
 }
@@ -682,31 +682,63 @@ void TapeQuickLoad()
  * tape autoplay functions
  * ------------------------------------------------------------------------- */
 
+#define MAX_NUM_AUTOPLAY_LEVELS                1000
+
 void AutoPlayTape()
 {
   static LevelDirTree *autoplay_leveldir = NULL;
   static boolean autoplay_initialized = FALSE;
   static int autoplay_level_nr = -1;
+  static int num_levels_played = 0;
+  static int num_levels_solved = 0;
+  static boolean levels_failed[MAX_NUM_AUTOPLAY_LEVELS];
+  int i;
 
   if (autoplay_initialized)
   {
     /* just finished auto-playing tape */
     printf("%s.\n", tape.auto_play_level_solved ? "solved" : "NOT SOLVED");
+
+    num_levels_played++;
+    if (tape.auto_play_level_solved)
+      num_levels_solved++;
+    else if (level_nr >= 0 && level_nr < MAX_NUM_AUTOPLAY_LEVELS)
+      levels_failed[level_nr] = TRUE;
   }
   else
   {
+    DrawCompleteVideoDisplay();
+    audio.sound_enabled = FALSE;
+
     autoplay_leveldir = getTreeInfoFromIdentifier(leveldir_first,
-                                                 options.autoplay_leveldir);
+                                                 global.autoplay_leveldir);
 
     if (autoplay_leveldir == NULL)
       Error(ERR_EXIT, "no such level identifier: '%s'",
-           options.autoplay_leveldir);
+           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("Playing tapes of level series '%s'.\n", options.autoplay_leveldir);
+    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");
+
+    for (i=0; i<MAX_NUM_AUTOPLAY_LEVELS; i++)
+      levels_failed[i] = FALSE;
 
     autoplay_initialized = TRUE;
   }
@@ -722,27 +754,46 @@ void AutoPlayTape()
     LoadLevel(level_nr);
     if (level.no_level_file)
     {
-      printf("(no level file)\n");
+      printf("(no level)\n");
       continue;
     }
 
     LoadTape(level_nr);
     if (TAPE_IS_EMPTY(tape))
     {
-      printf("(no tape file)\n");
+      printf("(no tape)\n");
       continue;
     }
 
-    break;
-  }
+    printf("playing tape ... ");
+
+    TapeStartGamePlaying();
+    TapeStartIndexSearch();
 
-  if (autoplay_level_nr >= autoplay_leveldir->last_level)
-    CloseAllAndExit(0);
+    return;
+  }
 
-  printf("playing tape ... ");
+  printf("\n");
+  printf_line("=", 79);
+  printf("Number of levels played: %d\n", num_levels_played);
+  printf("Number of levels solved: %d (%d%%)\n", num_levels_solved,
+        (num_levels_played ? num_levels_solved * 100 / num_levels_played :0));
+  printf_line("-", 79);
+  printf("Summary (for automatic parsing by scripts):\n");
+  printf("LEVELDIR '%s', SOLVED %d/%d (%d%%)",
+        autoplay_leveldir->identifier, num_levels_solved, num_levels_played,
+        (num_levels_played ? num_levels_solved * 100 / num_levels_played :0));
+  if (num_levels_played != num_levels_solved)
+  {
+    printf(", FAILED:");
+    for (i=0; i<MAX_NUM_AUTOPLAY_LEVELS; i++)
+      if (levels_failed[i])
+       printf(" %03d", i);
+  }
+  printf("\n");
+  printf_line("=", 79);
 
-  TapeStartGamePlaying();
-  TapeStartIndexSearch();
+  CloseAllAndExit(0);
 }
 
 
@@ -806,7 +857,7 @@ void CreateTapeButtons()
 
   for (i=0; i<NUM_TAPE_BUTTONS; i++)
   {
-    Bitmap *gd_bitmap = new_graphic_info[IMG_MENU_DOOR].bitmap;
+    Bitmap *gd_bitmap = graphic_info[IMG_GLOBAL_DOOR].bitmap;
     struct GadgetInfo *gi;
     int gd_xoffset, gd_yoffset;
     int gd_x1, gd_x2, gd_y;
@@ -845,6 +896,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]);