X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=3a96d18312479c7785fafa2e4195d733dceec8a5;hb=994cb017022c658f115e3c9fc927d8a0cc83832c;hp=b219109fb3528b85246a1059312da05891ea742f;hpb=c9433eab5c4317ed4f89164b386a7d33562e29be;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index b219109f..3a96d183 100644 --- a/src/tape.c +++ b/src/tape.c @@ -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(new_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(new_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(new_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(new_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(new_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(new_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(new_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,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 */ @@ -731,7 +840,7 @@ void CreateTapeButtons() for (i=0; i