X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=c0dde51942e8b862dcc1aad7456cbdb5efcb599f;hb=5eabbc4d089dcf4de6ddcc78159efd6a9ecef978;hp=07f8f82234b23f2a3008e2475ce03a49e058cb25;hpb=00624d32d516d37f2634bd68598a0b0a944f3aaf;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 07f8f822..c0dde519 100644 --- a/src/tape.c +++ b/src/tape.c @@ -17,7 +17,7 @@ #include "tools.h" #include "files.h" #include "network.h" -#include "cartoons.h" +#include "anim.h" #define DEBUG_TAPE_WHEN_PLAYING FALSE @@ -200,23 +200,23 @@ static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value) video_pos[NUM_TAPE_FUNCTIONS][NUM_TAPE_FUNCTION_PARTS] = { { - { IMG_TAPE_LABEL_GFX_PLAY, &tape.label.play }, - { IMG_TAPE_SYMBOL_GFX_PLAY, &tape.symbol.play }, + { IMG_GFX_TAPE_LABEL_PLAY, &tape.label.play }, + { IMG_GFX_TAPE_SYMBOL_PLAY, &tape.symbol.play }, }, { - { IMG_TAPE_LABEL_GFX_RECORD, &tape.label.record }, - { IMG_TAPE_SYMBOL_GFX_RECORD, &tape.symbol.record }, + { IMG_GFX_TAPE_LABEL_RECORD, &tape.label.record }, + { IMG_GFX_TAPE_SYMBOL_RECORD, &tape.symbol.record }, }, { - { IMG_TAPE_LABEL_GFX_PAUSE, &tape.label.pause }, - { IMG_TAPE_SYMBOL_GFX_PAUSE, &tape.symbol.pause }, + { IMG_GFX_TAPE_LABEL_PAUSE, &tape.label.pause }, + { IMG_GFX_TAPE_SYMBOL_PAUSE, &tape.symbol.pause }, }, { - { IMG_TAPE_LABEL_GFX_DATE, &tape.label.date }, + { IMG_GFX_TAPE_LABEL_DATE, &tape.label.date }, { -1, NULL }, }, { - { IMG_TAPE_LABEL_GFX_TIME, &tape.label.time }, + { IMG_GFX_TAPE_LABEL_TIME, &tape.label.time }, { -1, NULL }, }, { @@ -225,24 +225,24 @@ static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value) { -1, NULL }, }, { - { IMG_TAPE_LABEL_GFX_FAST_FORWARD, &tape.label.fast_forward }, - { IMG_TAPE_SYMBOL_GFX_FAST_FORWARD, &tape.symbol.fast_forward }, + { IMG_GFX_TAPE_LABEL_FAST_FORWARD, &tape.label.fast_forward }, + { IMG_GFX_TAPE_SYMBOL_FAST_FORWARD, &tape.symbol.fast_forward }, }, { - { IMG_TAPE_LABEL_GFX_PAUSE_BEFORE_END, &tape.label.pause_before_end }, - { IMG_TAPE_SYMBOL_GFX_PAUSE_BEFORE_END, &tape.symbol.pause_before_end }, + { IMG_GFX_TAPE_LABEL_PAUSE_BEFORE_END, &tape.label.pause_before_end }, + { IMG_GFX_TAPE_SYMBOL_PAUSE_BEFORE_END, &tape.symbol.pause_before_end }, }, { - { IMG_TAPE_LABEL_GFX_WARP_FORWARD_BLIND, &tape.label.warp_forward_blind}, - { IMG_TAPE_SYMBOL_GFX_WARP_FORWARD_BLIND, &tape.symbol.warp_forward_blind}, + { IMG_GFX_TAPE_LABEL_WARP_FORWARD_BLIND, &tape.label.warp_forward_blind}, + { IMG_GFX_TAPE_SYMBOL_WARP_FORWARD_BLIND, &tape.symbol.warp_forward_blind}, }, { - { IMG_TAPE_LABEL_GFX_WARP_FORWARD, &tape.label.warp_forward }, - { IMG_TAPE_SYMBOL_GFX_WARP_FORWARD, &tape.symbol.warp_forward }, + { IMG_GFX_TAPE_LABEL_WARP_FORWARD, &tape.label.warp_forward }, + { IMG_GFX_TAPE_SYMBOL_WARP_FORWARD, &tape.symbol.warp_forward }, }, { - { IMG_TAPE_LABEL_GFX_SINGLE_STEP, &tape.label.single_step }, - { IMG_TAPE_SYMBOL_GFX_SINGLE_STEP, &tape.symbol.single_step }, + { IMG_GFX_TAPE_LABEL_SINGLE_STEP, &tape.label.single_step }, + { IMG_GFX_TAPE_SYMBOL_SINGLE_STEP, &tape.symbol.single_step }, }, }; @@ -435,6 +435,16 @@ void DrawVideoDisplay(unsigned int state, unsigned int value) DrawVideoDisplay_DateTime(state, value); } +void DrawVideoDisplayLabel(unsigned int state) +{ + DrawVideoDisplay(state, VIDEO_DISPLAY_LABEL_ONLY); +} + +void DrawVideoDisplaySymbol(unsigned int state) +{ + DrawVideoDisplay(state, VIDEO_DISPLAY_SYMBOL_ONLY); +} + void DrawCompleteVideoDisplay() { struct GraphicInfo *g_tape = &graphic_info[IMG_BACKGROUND_TAPE]; @@ -615,11 +625,21 @@ static void TapeAppendRecording() if (!tape.playing || !tape.pausing) return; - tape.pos[tape.counter].delay = tape.delay_played; + // stop playing tape.playing = FALSE; + tape.fast_forward = FALSE; + tape.warp_forward = FALSE; + tape.pause_before_death = FALSE; + tape.deactivate_display = FALSE; + + // start recording tape.recording = TRUE; tape.changed = TRUE; + // set current delay (for last played move) + tape.pos[tape.counter].delay = tape.delay_played; + + // set current date TapeSetDateFromNow(); DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date); @@ -709,34 +729,47 @@ void TapeTogglePause(boolean toggle_manual) { int state = 0; - if (tape.pause_before_death) - state |= VIDEO_STATE_PBEND_OFF; - else if (tape.fast_forward) - state |= VIDEO_STATE_FFWD_OFF; - 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); + state |= VIDEO_STATE_PAUSE(tape.pausing); + + if (tape.pause_before_death) + state |= VIDEO_STATE_PBEND(!tape.pausing); + else if (tape.fast_forward) + state |= VIDEO_STATE_FFWD(!tape.pausing); + if (tape.playing) state |= VIDEO_STATE_PLAY_ON; else - state |= (tape.single_step ? VIDEO_STATE_1STEP_ON : VIDEO_STATE_1STEP_OFF); + state |= VIDEO_STATE_1STEP(tape.single_step); DrawVideoDisplay(state, 0); if (tape.warp_forward) { - TapeStopWarpForward(); + if (tape.pausing) + { + TapeDeactivateDisplayOff(game_status == GAME_MODE_PLAYING); + } + else if (tape.deactivate_display) + { + TapeDeactivateDisplayOn(); + + DrawVideoDisplaySymbol(VIDEO_STATE_WARP_ON); + } + else + { + DrawVideoDisplaySymbol(VIDEO_STATE_WARP2_ON); + } if (tape.quick_resume) { tape.quick_resume = FALSE; + TapeStopWarpForward(); TapeAppendRecording(); if (!CheckEngineSnapshotSingle()) @@ -802,65 +835,39 @@ void TapeStopPlaying() byte *TapePlayAction() { + int update_delay = FRAMES_PER_SECOND / 2; + boolean update_video_display = (FrameCounter % update_delay == 0); + boolean update_draw_label_on = ((FrameCounter / update_delay) % 2 == 1); static byte action[MAX_PLAYERS]; int i; if (!tape.playing || tape.pausing) return NULL; - if (tape.pause_before_death) /* stop 10 seconds before player gets killed */ + if (tape.pause_before_death) // stop some seconds before end of tape { - if (!(FrameCounter % 20)) - { - if ((FrameCounter / 20) % 2) - DrawVideoDisplay(VIDEO_STATE_PBEND_ON, VIDEO_DISPLAY_LABEL_ONLY); - else - DrawVideoDisplay(VIDEO_STATE_PBEND_OFF, VIDEO_DISPLAY_LABEL_ONLY); - } - - if (tape.warp_forward) - { - if (tape.deactivate_display) - DrawVideoDisplay(VIDEO_STATE_WARP_ON, VIDEO_DISPLAY_SYMBOL_ONLY); - else - DrawVideoDisplay(VIDEO_STATE_WARP2_ON, VIDEO_DISPLAY_SYMBOL_ONLY); - } - if (TapeTime > tape.length_seconds - TAPE_PAUSE_SECONDS_BEFORE_DEATH) { + tape.fast_forward = FALSE; + tape.pause_before_death = FALSE; + + TapeStopWarpForward(); TapeTogglePause(TAPE_TOGGLE_MANUAL); return NULL; } } - else if (tape.fast_forward) - { - if ((FrameCounter / 20) % 2) - DrawVideoDisplay(VIDEO_STATE_FFWD_ON, VIDEO_DISPLAY_LABEL_ONLY); - else - DrawVideoDisplay(VIDEO_STATE_FFWD_OFF, VIDEO_DISPLAY_LABEL_ONLY); - if (tape.warp_forward) - { - if (tape.deactivate_display) - DrawVideoDisplay(VIDEO_STATE_WARP_ON, VIDEO_DISPLAY_SYMBOL_ONLY); - else - DrawVideoDisplay(VIDEO_STATE_WARP2_ON, VIDEO_DISPLAY_SYMBOL_ONLY); - } - } - -#if 0 - /* !!! this makes things much slower !!! */ - else if (tape.warp_forward) + if (update_video_display && !tape.deactivate_display) { - if ((FrameCounter / 20) % 2) - DrawVideoDisplay(VIDEO_STATE_WARP_ON, VIDEO_DISPLAY_LABEL_ONLY); - else - DrawVideoDisplay(VIDEO_STATE_WARP_OFF, VIDEO_DISPLAY_LABEL_ONLY); + if (tape.pause_before_death) + DrawVideoDisplayLabel(VIDEO_STATE_PBEND(update_draw_label_on)); + else if (tape.fast_forward) + DrawVideoDisplayLabel(VIDEO_STATE_FFWD(update_draw_label_on)); - DrawVideoDisplay(VIDEO_STATE_WARP_ON, VIDEO_DISPLAY_SYMBOL_ONLY); + if (tape.warp_forward) + DrawVideoDisplaySymbol(VIDEO_STATE_WARP2_ON); } -#endif if (tape.counter >= tape.length) /* end of tape reached */ { @@ -948,32 +955,36 @@ static void TapeStartWarpForward() if (!tape.fast_forward && !tape.pause_before_death) { tape.pausing = FALSE; + tape.pause_before_death = TRUE; tape.deactivate_display = TRUE; TapeDeactivateDisplayOn(); - } - if (tape.fast_forward || tape.pause_before_death) - DrawVideoDisplay(VIDEO_STATE_WARP_ON, VIDEO_DISPLAY_SYMBOL_ONLY); + DrawVideoDisplay(VIDEO_STATE_PBEND_ON, 0); + DrawVideoDisplaySymbol(VIDEO_STATE_WARP_ON); + } else - DrawVideoDisplay(VIDEO_STATE_WARP_ON, 0); + { + DrawVideoDisplaySymbol(VIDEO_STATE_WARP2_ON); + } } static void TapeStopWarpForward() { - int state = (tape.pausing ? VIDEO_STATE_PAUSE_ON : VIDEO_STATE_PAUSE_OFF); + int state = VIDEO_STATE_PAUSE(tape.pausing); + + if (tape.deactivate_display) + tape.pause_before_death = FALSE; tape.warp_forward = FALSE; tape.deactivate_display = FALSE; TapeDeactivateDisplayOff(game_status == GAME_MODE_PLAYING); - if (tape.pause_before_death) - state |= VIDEO_STATE_WARP_OFF | VIDEO_STATE_PBEND_ON; - else if (tape.fast_forward) - state |= VIDEO_STATE_WARP_OFF | VIDEO_STATE_FFWD_ON; - else - state |= VIDEO_STATE_WARP_OFF | VIDEO_STATE_PLAY_ON; + state |= VIDEO_STATE_WARP_OFF; + state |= (tape.pause_before_death ? VIDEO_STATE_PBEND_ON : + tape.fast_forward ? VIDEO_STATE_FFWD_ON : + VIDEO_STATE_PLAY_ON); DrawVideoDisplay(state, 0); } @@ -988,8 +999,7 @@ static void TapeSingleStep() tape.single_step = !tape.single_step; - DrawVideoDisplay((tape.single_step ? VIDEO_STATE_1STEP_ON : - VIDEO_STATE_1STEP_OFF), 0); + DrawVideoDisplay(VIDEO_STATE_1STEP(tape.single_step), 0); } void TapeQuickSave() @@ -1246,28 +1256,28 @@ static struct } tapebutton_info[NUM_TAPE_BUTTONS] = { { - IMG_TAPE_BUTTON_GFX_EJECT, &tape.button.eject, + IMG_GFX_TAPE_BUTTON_EJECT, &tape.button.eject, TAPE_CTRL_ID_EJECT, "eject tape" }, { /* (same position as "eject" button) */ - IMG_TAPE_BUTTON_GFX_EXTRA, &tape.button.eject, + IMG_GFX_TAPE_BUTTON_EXTRA, &tape.button.eject, TAPE_CTRL_ID_EXTRA, "extra functions" }, { - IMG_TAPE_BUTTON_GFX_STOP, &tape.button.stop, + IMG_GFX_TAPE_BUTTON_STOP, &tape.button.stop, TAPE_CTRL_ID_STOP, "stop tape" }, { - IMG_TAPE_BUTTON_GFX_PAUSE, &tape.button.pause, + IMG_GFX_TAPE_BUTTON_PAUSE, &tape.button.pause, TAPE_CTRL_ID_PAUSE, "pause tape" }, { - IMG_TAPE_BUTTON_GFX_RECORD, &tape.button.record, + IMG_GFX_TAPE_BUTTON_RECORD, &tape.button.record, TAPE_CTRL_ID_RECORD, "record tape" }, { - IMG_TAPE_BUTTON_GFX_PLAY, &tape.button.play, + IMG_GFX_TAPE_BUTTON_PLAY, &tape.button.play, TAPE_CTRL_ID_PLAY, "play tape" } }; @@ -1390,6 +1400,10 @@ static void HandleTapeButtonsExt(int id) { TapeStartWarpForward(); } + else if (tape.pausing) /* PAUSE -> WARP FORWARD PLAY */ + { + TapeTogglePause(TAPE_TOGGLE_MANUAL); + } else /* WARP FORWARD PLAY -> PLAY */ { TapeStopWarpForward(); @@ -1439,17 +1453,33 @@ static void HandleTapeButtonsExt(int id) { if (tape.pausing) /* PAUSE -> PLAY */ { + // continue playing in normal mode + tape.fast_forward = FALSE; + tape.warp_forward = FALSE; + tape.pause_before_death = FALSE; + tape.deactivate_display = FALSE; + TapeTogglePause(TAPE_TOGGLE_MANUAL); } + else if (tape.warp_forward && + !tape.fast_forward) /* WARP FORWARD PLAY -> PLAY */ + { + TapeStopWarpForward(); + } 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 */ { tape.pause_before_death = TRUE; + DrawVideoDisplay(VIDEO_STATE_FFWD_OFF | VIDEO_STATE_PBEND_ON, 0); + + if (tape.warp_forward) + DrawVideoDisplaySymbol(VIDEO_STATE_WARP2_ON); } else /* AUTO PAUSE -> NORMAL PLAY */ {