X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=b219109fb3528b85246a1059312da05891ea742f;hb=c9433eab5c4317ed4f89164b386a7d33562e29be;hp=efa9515672dd23f995194f1ab2682c5686604201;hpb=a1bc27d0855dc6fa72c4c361fc1671b2dcc6547b;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index efa95156..b219109f 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 * @@ -30,8 +30,12 @@ #define NUM_TAPE_BUTTONS 6 +/* values for tape handling */ +#define TAPE_PAUSE_SECONDS_BEFORE_DEATH 5 + /* forward declaration for internal use */ static void HandleTapeButtons(struct GadgetInfo *); +static void TapeStopIndexSearch(); static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS]; @@ -287,44 +291,112 @@ void DrawCompleteVideoDisplay() /* tape control functions */ /* ========================================================================= */ -void TapeStartRecording() +void TapeErase() { - time_t zeit1 = time(NULL); - struct tm *zeit2 = localtime(&zeit1); + time_t epoch_seconds = time(NULL); + struct tm *time = localtime(&epoch_seconds); int i; - if (!TAPE_IS_STOPPED(tape)) - TapeStop(); - - tape.level_nr = level_nr; tape.length = 0; tape.counter = 0; + + tape.level_nr = level_nr; tape.pos[tape.counter].delay = 0; - tape.recording = TRUE; - tape.playing = FALSE; - tape.pausing = FALSE; tape.changed = TRUE; - tape.date = 10000*(zeit2->tm_year%100) + 100*zeit2->tm_mon + zeit2->tm_mday; + + tape.date = 10000*(time->tm_year % 100) + 100*time->tm_mon + time->tm_mday; tape.random_seed = InitRND(NEW_RANDOMIZE); + + tape.file_version = FILE_VERSION_ACTUAL; tape.game_version = GAME_VERSION_ACTUAL; + tape.engine_version = level.game_version; for(i=0; i= MAX_TAPELEN-1) + if (tape.counter >= MAX_TAPELEN - 1) { TapeStopRecording(); return; @@ -371,17 +443,22 @@ void TapeRecordAction(byte action[MAX_PLAYERS]) } } -void TapeTogglePause() +void TapeTogglePause(boolean toggle_manual) { unsigned long state; +#if 0 if (!tape.recording && !tape.playing) return; +#endif tape.pausing = !tape.pausing; tape.fast_forward = FALSE; tape.pause_before_death = FALSE; + if (tape.single_step && toggle_manual) + tape.single_step = FALSE; + state = (tape.pausing ? VIDEO_STATE_PAUSE_ON : VIDEO_STATE_PAUSE_OFF); if (tape.playing) state |= VIDEO_STATE_PBEND_OFF; @@ -390,8 +467,15 @@ void TapeTogglePause() if (tape.index_search) { - SetDrawDeactivationMask(REDRAW_NONE); - RedrawPlayfield(TRUE, 0,0,0,0); + TapeStopIndexSearch(); + + if (tape.quick_resume) + { + tape.quick_resume = FALSE; + + TapeAppendRecording(); + TapeTogglePause(toggle_manual); + } } } @@ -403,21 +487,26 @@ void TapeStartPlaying() if (!TAPE_IS_STOPPED(tape)) TapeStop(); - tape.counter = 0; - tape.delay_played = 0; - tape.pause_before_death = FALSE; - tape.recording = FALSE; - tape.playing = TRUE; - tape.pausing = FALSE; - tape.fast_forward = FALSE; - tape.index_search = FALSE; + TapeRewind(); - InitRND(tape.random_seed); + tape.playing = TRUE; DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0); DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date); DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0); MapTapeIndexButton(); + + SetDrawDeactivationMask(REDRAW_NONE); + audio.sound_deactivated = FALSE; +} + +static void TapeStartGamePlaying() +{ + TapeStartPlaying(); + + game_status = PLAYING; + StopAnimation(); + InitGame(); } void TapeStopPlaying() @@ -428,6 +517,9 @@ void TapeStopPlaying() tape.playing = FALSE; tape.pausing = FALSE; + if (tape.index_search) + TapeStopIndexSearch(); + DrawVideoDisplay(VIDEO_STATE_PLAY_OFF, 0); MapTapeEjectButton(); } @@ -452,28 +544,18 @@ byte *TapePlayAction() if (TimePlayed > tape.length_seconds - TAPE_PAUSE_SECONDS_BEFORE_DEATH) { - TapeTogglePause(); + TapeTogglePause(TAPE_TOGGLE_MANUAL); return NULL; } } - if (tape.index_search) + if (tape.counter >= tape.length) /* end of tape reached */ { - if (tape.counter >= tape.length) - { - tape.index_search = FALSE; - - SetDrawDeactivationMask(REDRAW_NONE); - RedrawPlayfield(TRUE, 0,0,0,0); - - TapeTogglePause(); - return NULL; - } - } + if (tape.index_search) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + else + TapeStop(); - if (tape.counter >= tape.length) - { - TapeStop(); return NULL; } @@ -503,11 +585,6 @@ void TapeStop() } } -void TapeErase() -{ - tape.length = 0; -} - unsigned int GetTapeLength() { unsigned int tape_length = 0; @@ -522,6 +599,78 @@ unsigned int GetTapeLength() return(tape_length * GAME_FRAME_DELAY / 1000); } +static void TapeStartIndexSearch() +{ + tape.index_search = TRUE; + + if (!tape.fast_forward || tape.pause_before_death) + { + tape.pausing = FALSE; + + SetDrawDeactivationMask(REDRAW_FIELD | REDRAW_DOOR_1); + audio.sound_deactivated = TRUE; + } +} + +static void TapeStopIndexSearch() +{ + tape.index_search = FALSE; + + SetDrawDeactivationMask(REDRAW_NONE); + audio.sound_deactivated = FALSE; + + RedrawPlayfield(TRUE, 0,0,0,0); + DrawGameDoorValues(); +} + +static void TapeSingleStep() +{ + if (options.network) + return; + + if (!tape.pausing) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + + tape.single_step = !tape.single_step; +} + +void TapeQuickSave() +{ + if (game_status == PLAYING) + { + if (tape.recording) + TapeHaltRecording(); /* prepare tape for saving on-the-fly */ + + if (TAPE_IS_EMPTY(tape)) + Request("No tape that can be saved !", REQ_CONFIRM); + else + SaveTape(tape.level_nr); + } + else if (game_status == MAINMENU) + Request("No game that can be saved !", REQ_CONFIRM); +} + +void TapeQuickLoad() +{ + if (game_status == PLAYING || game_status == MAINMENU) + { + TapeStop(); + TapeErase(); + + LoadTape(level_nr); + if (!TAPE_IS_EMPTY(tape)) + { + TapeStartGamePlaying(); + TapeStartIndexSearch(); + + tape.quick_resume = TRUE; + } + else + Request("No tape for this level !", REQ_CONFIRM); + } +} + + /* ---------- new tape button stuff ---------------------------------------- */ /* graphic position values for tape buttons */ @@ -680,15 +829,10 @@ static void HandleTapeButtons(struct GadgetInfo *gi) break; case TAPE_CTRL_ID_INDEX: - if (tape.recording) - printf("Setting index mark ...\n"); - else if (tape.playing) - { - printf("Going to index mark ...\n"); - - tape.index_search = TRUE; - SetDrawDeactivationMask(REDRAW_FIELD); - } + if (tape.playing) + TapeStartIndexSearch(); + else if (tape.recording) + TapeSingleStep(); break; case TAPE_CTRL_ID_STOP: @@ -696,39 +840,18 @@ static void HandleTapeButtons(struct GadgetInfo *gi) break; case TAPE_CTRL_ID_PAUSE: - TapeTogglePause(); + TapeTogglePause(TAPE_TOGGLE_MANUAL); break; case TAPE_CTRL_ID_RECORD: if (TAPE_IS_STOPPED(tape)) - { - TapeStartRecording(); - -#if defined(PLATFORM_UNIX) - if (options.network) - SendToServer_StartPlaying(); - else -#endif - { - game_status = PLAYING; - StopAnimation(); - InitGame(); - } - } + TapeStartGameRecording(); else if (tape.pausing) { if (tape.playing) /* PLAYING -> PAUSING -> RECORDING */ - { - tape.pos[tape.counter].delay = tape.delay_played; - tape.playing = FALSE; - tape.recording = TRUE; - tape.changed = TRUE; - tape.game_version = GAME_VERSION_ACTUAL; - - DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON,0); - } + TapeAppendRecording(); else - TapeTogglePause(); + TapeTogglePause(TAPE_TOGGLE_MANUAL); } break; @@ -738,27 +861,25 @@ static void HandleTapeButtons(struct GadgetInfo *gi) if (TAPE_IS_STOPPED(tape)) { - TapeStartPlaying(); - - game_status = PLAYING; - StopAnimation(); - InitGame(); + TapeStartGamePlaying(); } else if (tape.playing) { if (tape.pausing) /* PAUSE -> PLAY */ - TapeTogglePause(); + { + TapeTogglePause(TAPE_TOGGLE_MANUAL); + } else if (!tape.fast_forward) /* PLAY -> FAST FORWARD PLAY */ { tape.fast_forward = TRUE; DrawVideoDisplay(VIDEO_STATE_FFWD_ON, 0); } - else if (!tape.pause_before_death) /* FFWD PLAY -> + AUTO PAUSE */ + else if (!tape.pause_before_death) /* FFWD PLAY -> AUTO PAUSE */ { tape.pause_before_death = TRUE; DrawVideoDisplay(VIDEO_STATE_PBEND_ON, VIDEO_DISPLAY_LABEL_ONLY); } - else /* -> NORMAL PLAY */ + else /* AUTO PAUSE -> NORMAL PLAY */ { tape.fast_forward = FALSE; tape.pause_before_death = FALSE;