X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Ftape.c;h=8ca52a0335e4e172751344f4cf655346c72a4533;hb=30d133ac6c0358f7c895df1af02ff4cca730707f;hp=cc2ad928110c0d5d6e753fa6ab855a5ae7b8d330;hpb=e0d86c9bfb88170026ce642f02a7f6f41735b2ce;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index cc2ad928..8ca52a03 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" @@ -325,6 +326,8 @@ static void TapeRewind() tape.playing = FALSE; tape.fast_forward = FALSE; tape.index_search = FALSE; + tape.auto_play = (options.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() @@ -672,6 +678,74 @@ void TapeQuickLoad() } +/* ------------------------------------------------------------------------- * + * tape autoplay functions + * ------------------------------------------------------------------------- */ + +void AutoPlayTape() +{ + static LevelDirTree *autoplay_leveldir = NULL; + static boolean autoplay_initialized = FALSE; + static int autoplay_level_nr = -1; + + if (autoplay_initialized) + { + /* just finished auto-playing tape */ + printf("%s.\n", tape.auto_play_level_solved ? "solved" : "NOT SOLVED"); + } + else + { + autoplay_leveldir = getTreeInfoFromIdentifier(leveldir_first, + options.autoplay_leveldir); + + if (autoplay_leveldir == NULL) + Error(ERR_EXIT, "no such level identifier: '%s'", + options.autoplay_leveldir); + + leveldir_current = autoplay_leveldir; + + autoplay_level_nr = autoplay_leveldir->first_level; + + printf("Playing tapes of level series '%s'.\n", options.autoplay_leveldir); + + 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 file)\n"); + continue; + } + + LoadTape(level_nr); + if (TAPE_IS_EMPTY(tape)) + { + printf("(no tape file)\n"); + continue; + } + + break; + } + + if (autoplay_level_nr >= autoplay_leveldir->last_level) + CloseAllAndExit(0); + + printf("playing tape ... "); + + TapeStartGamePlaying(); + TapeStartIndexSearch(); +} + + /* ---------- new tape button stuff ---------------------------------------- */ /* graphic position values for tape buttons */