X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=ff0da179bf632f0185b8fd056201079c4a257180;hb=edaa850fd2d2cae7ec31961fae3d56487e710c71;hp=f9c56d1ad12c2d4168522ee4b66c37abfc83a4cf;hpb=f7d2fb71a0968d07a7f425ab864fa6befef5dcf3;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index f9c56d1a..ff0da179 100644 --- a/src/tape.c +++ b/src/tape.c @@ -698,6 +698,8 @@ void TapeErase(void) tape.property_bits = TAPE_PROPERTY_NONE; + tape.bd_replay = FALSE; + TapeSetDateFromNow(); for (i = 0; i < MAX_PLAYERS; i++) @@ -873,6 +875,9 @@ void TapeRecordAction(byte action_raw[MAX_TAPE_ACTIONS]) if (!tape.recording) // (record action even when tape is paused) return; + if (!checkGameRunning()) + return; + for (i = 0; i < MAX_TAPE_ACTIONS; i++) action[i] = action_raw[i]; @@ -1008,7 +1013,7 @@ void TapeStopPlaying(void) MapTapeEjectButton(); } -byte *TapePlayAction(void) +byte *TapePlayActionExt(boolean bd_replay) { int update_delay = FRAMES_PER_SECOND / 2; boolean update_video_display = (FrameCounter % update_delay == 0); @@ -1019,6 +1024,12 @@ byte *TapePlayAction(void) if (!tape.playing || tape.pausing) return NULL; + if (!checkGameRunning()) + return NULL; + + if (tape.bd_replay && !bd_replay) + return NULL; + if (tape.pause_before_end) // stop some seconds before end of tape { if (TapeTime > (int)tape.length_seconds - TAPE_PAUSE_SECONDS_BEFORE_DEATH) @@ -1097,7 +1108,7 @@ byte *TapePlayAction(void) } tape.delay_played++; - if (tape.delay_played >= tape.pos[tape.counter].delay) + if (tape.delay_played >= tape.pos[tape.counter].delay || tape.bd_replay) { tape.counter++; tape.delay_played = 0; @@ -1112,6 +1123,34 @@ byte *TapePlayAction(void) return action; } +byte *TapePlayAction_BD(void) +{ + return TapePlayActionExt(TRUE); +} + +byte *TapePlayAction(void) +{ + return TapePlayActionExt(FALSE); +} + +byte *TapeCorrectAction_BD(byte *action) +{ + if (tape.playing) + { + // only read next tape action if not playing native BD replay + if (!TapeIsPlaying_ReplayBD()) + action = TapePlayAction(); + } + else if (tape.recording) + { + byte tape_action[MAX_TAPE_ACTIONS] = { action[0] }; + + TapeRecordAction(tape_action); + } + + return action; +} + void TapeStop(void) { if (tape.pausing) @@ -1347,6 +1386,10 @@ void TapeRestartGame(void) if (!checkRestartGame("Restart game?")) return; + // when using BD game engine, cover screen before fading out + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + game_bd.cover_screen = TRUE; + StartGameActions(network.enabled, setup.autorecord, level.random_seed); } @@ -1373,11 +1416,18 @@ void TapeReplayAndPauseBeforeEnd(void) tape.quick_resume = TRUE; } +boolean TapeIsPlaying_ReplayBD(void) +{ + return (tape.playing && tape.bd_replay); +} + boolean hasSolutionTape(void) { boolean tape_file_exists = fileExists(getSolutionTapeFilename(level_nr)); - boolean level_has_tape = (level.game_engine_type == GAME_ENGINE_TYPE_SP && - level.native_sp_level->demo.is_available); + boolean level_has_tape = ((level.game_engine_type == GAME_ENGINE_TYPE_BD && + level.native_bd_level->replay != NULL) || + (level.game_engine_type == GAME_ENGINE_TYPE_SP && + level.native_sp_level->demo.is_available)); return (tape_file_exists || level_has_tape); }