X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=8d1b6952c4a8c4ade26014a268c0bc762fa60ec9;hb=ee0895b12e544444db37febb1242bcc8a72d6ad8;hp=14341da9338f33adfe147a11a27196f34a6e05cf;hpb=2d603d06ca862f3ca0721b66f62da188faf866c4;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 14341da9..8d1b6952 100644 --- a/src/tape.c +++ b/src/tape.c @@ -1,7 +1,7 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-2001 Artsoft Entertainment * +* (c) 1995-2002 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -14,6 +14,7 @@ #include "libgame/libgame.h" #include "tape.h" +#include "init.h" #include "game.h" #include "tools.h" #include "files.h" @@ -167,7 +168,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) { int cx = DOOR_GFX_PAGEX3, cy = DOOR_GFX_PAGEY2; - BlitBitmap(pix[PIX_DOOR], drawto, + BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, cx + VIDEO_REC_LABEL_XPOS, cy + VIDEO_REC_LABEL_YPOS, VIDEO_PBEND_LABEL_XSIZE, @@ -188,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(pix[PIX_DOOR], 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], @@ -196,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(pix[PIX_DOOR], 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], @@ -210,7 +211,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) { int cx = DOOR_GFX_PAGEX4, cy = DOOR_GFX_PAGEY2; - BlitBitmap(pix[PIX_DOOR], drawto, + BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, cx + VIDEO_PLAY_SYMBOL_XPOS, cy + VIDEO_PLAY_SYMBOL_YPOS, VIDEO_PLAY_SYMBOL_XSIZE - 2, @@ -223,7 +224,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) { int cx = DOOR_GFX_PAGEX6, cy = DOOR_GFX_PAGEY1; - BlitBitmap(pix[PIX_DOOR], drawto, + BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, cx + VIDEO_PBEND_LABEL_XPOS, cy + VIDEO_PBEND_LABEL_YPOS, VIDEO_PBEND_LABEL_XSIZE, @@ -267,9 +268,10 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) void DrawCompleteVideoDisplay() { - BlitBitmap(pix[PIX_DOOR], drawto, DOOR_GFX_PAGEX3, DOOR_GFX_PAGEY2, + BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, + DOOR_GFX_PAGEX3, DOOR_GFX_PAGEY2, gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy); - BlitBitmap(pix[PIX_DOOR], 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, @@ -282,7 +284,7 @@ void DrawCompleteVideoDisplay() DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds); } - BlitBitmap(drawto, pix[PIX_DB_DOOR], gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize, + BlitBitmap(drawto, bitmap_db_door, gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2); } @@ -324,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; @@ -551,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(); @@ -583,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() @@ -607,7 +614,7 @@ static void TapeStartIndexSearch() { tape.pausing = FALSE; - SetDrawDeactivationMask(REDRAW_FIELD | REDRAW_DOOR_1); + SetDrawDeactivationMask(REDRAW_FIELD); audio.sound_deactivated = TRUE; } } @@ -671,6 +678,125 @@ 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, + 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"); + + for (i=0; ilast_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", 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