X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=cc2ad928110c0d5d6e753fa6ab855a5ae7b8d330;hb=75ebfce89c39bc740367807c4c16f469135ba6d5;hp=05d5956cb117dcf5a25061652a424587f1c6f05c;hpb=2ae6ae8ed951e87fcba7c363705cd6ddea8de91c;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 05d5956c..cc2ad928 100644 --- a/src/tape.c +++ b/src/tape.c @@ -1,7 +1,7 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* (c) 1995-2000 Artsoft Entertainment * +* (c) 1995-2002 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -18,18 +18,24 @@ #include "tools.h" #include "files.h" #include "network.h" +#include "cartoons.h" /* tape button identifiers */ #define TAPE_CTRL_ID_EJECT 0 -#define TAPE_CTRL_ID_STOP 1 -#define TAPE_CTRL_ID_PAUSE 2 -#define TAPE_CTRL_ID_RECORD 3 -#define TAPE_CTRL_ID_PLAY 4 +#define TAPE_CTRL_ID_INDEX 1 +#define TAPE_CTRL_ID_STOP 2 +#define TAPE_CTRL_ID_PAUSE 3 +#define TAPE_CTRL_ID_RECORD 4 +#define TAPE_CTRL_ID_PLAY 5 -#define NUM_TAPE_BUTTONS 5 +#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]; @@ -77,7 +83,7 @@ static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS]; #define VIDEO_TIME_YSIZE 16 /* special */ -#define VIDEO_PBEND_LABEL_XPOS 6 +#define VIDEO_PBEND_LABEL_XPOS 5 #define VIDEO_PBEND_LABEL_YPOS 220 #define VIDEO_PBEND_LABEL_XSIZE 35 #define VIDEO_PBEND_LABEL_YSIZE 30 @@ -161,7 +167,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_MENU_DOOR].bitmap, drawto, cx + VIDEO_REC_LABEL_XPOS, cy + VIDEO_REC_LABEL_YPOS, VIDEO_PBEND_LABEL_XSIZE, @@ -182,7 +188,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_MENU_DOOR].bitmap, drawto, cx + video_pos[pos][part_label][xpos], cy + video_pos[pos][part_label][ypos], video_pos[pos][part_label][xsize], @@ -190,7 +196,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_MENU_DOOR].bitmap, drawto, cx + video_pos[pos][part_symbol][xpos], cy + video_pos[pos][part_symbol][ypos], video_pos[pos][part_symbol][xsize], @@ -204,7 +210,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_MENU_DOOR].bitmap, drawto, cx + VIDEO_PLAY_SYMBOL_XPOS, cy + VIDEO_PLAY_SYMBOL_YPOS, VIDEO_PLAY_SYMBOL_XSIZE - 2, @@ -217,7 +223,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_MENU_DOOR].bitmap, drawto, cx + VIDEO_PBEND_LABEL_XPOS, cy + VIDEO_PBEND_LABEL_YPOS, VIDEO_PBEND_LABEL_XSIZE, @@ -261,9 +267,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_MENU_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_MENU_DOOR].bitmap, drawto, DOOR_GFX_PAGEX4 + VIDEO_CONTROL_XPOS, DOOR_GFX_PAGEY2 + VIDEO_CONTROL_YPOS, VIDEO_CONTROL_XSIZE, VIDEO_CONTROL_YSIZE, @@ -276,7 +283,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); } @@ -285,113 +292,192 @@ 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) - { - TapeStopRecording(); - return; - } + TapeHaltRecording(); - for(i=0; i= MAX_TAPELEN) + if (tape.counter >= MAX_TAPELEN - 1) { TapeStopRecording(); return; } - tape.pos[tape.counter].delay++; + if (tape.pos[tape.counter].delay > 0) /* already stored action */ + { + boolean changed_events = FALSE; - if (tape.pos[tape.counter].delay >= 255) + for(i=0; i= 255) + { + tape.counter++; + tape.pos[tape.counter].delay = 0; + } + else + tape.pos[tape.counter].delay++; + } + + if (tape.pos[tape.counter].delay == 0) /* store new action */ { for(i=0; i= tape.length) - { - TapeStop(); - return(NULL); - } - - if (tape.delay_played == tape.pos[tape.counter].delay) - { - tape.delay_played = 0; - tape.counter++; - - for(i=0; i tape.length_seconds - TAPE_PAUSE_SECONDS_BEFORE_DEATH) { - TapeTogglePause(); - return(FALSE); + TapeTogglePause(TAPE_TOGGLE_MANUAL); + return NULL; } } - if (tape.counter >= tape.length) + if (tape.counter >= tape.length) /* end of tape reached */ { - TapeStop(); - return(TRUE); + if (tape.index_search) + TapeTogglePause(TAPE_TOGGLE_MANUAL); + else + TapeStop(); + + return NULL; } - if (tape.delay_played < tape.pos[tape.counter].delay) + for(i=0; i= tape.pos[tape.counter].delay) { - tape.delay_played++; - return(TRUE); + tape.counter++; + tape.delay_played = 0; } - else - return(FALSE); + + return action; } void TapeStop() @@ -507,11 +586,6 @@ void TapeStop() } } -void TapeErase() -{ - tape.length = 0; -} - unsigned int GetTapeLength() { unsigned int tape_length = 0; @@ -526,6 +600,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 */ @@ -535,6 +681,7 @@ unsigned int GetTapeLength() #define TAPE_BUTTON_YPOS 77 #define TAPE_BUTTON_EJECT_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE) +#define TAPE_BUTTON_INDEX_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE) #define TAPE_BUTTON_STOP_XPOS (TAPE_BUTTON_XPOS + 1 * TAPE_BUTTON_XSIZE) #define TAPE_BUTTON_PAUSE_XPOS (TAPE_BUTTON_XPOS + 2 * TAPE_BUTTON_XSIZE) #define TAPE_BUTTON_RECORD_XPOS (TAPE_BUTTON_XPOS + 3 * TAPE_BUTTON_XSIZE) @@ -552,6 +699,11 @@ static struct TAPE_CTRL_ID_EJECT, "eject tape" }, + { + TAPE_BUTTON_INDEX_XPOS, TAPE_BUTTON_YPOS, + TAPE_CTRL_ID_INDEX, + "index mark" + }, { TAPE_BUTTON_STOP_XPOS, TAPE_BUTTON_YPOS, TAPE_CTRL_ID_STOP, @@ -580,7 +732,7 @@ void CreateTapeButtons() for (i=0; i PAUSING -> RECORDING */ - { - tape.pos[tape.counter].delay = tape.delay_played; - tape.playing = FALSE; - tape.recording = TRUE; - tape.changed = TRUE; - - DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON,0); - } + TapeAppendRecording(); else - TapeTogglePause(); + TapeTogglePause(TAPE_TOGGLE_MANUAL); } break; @@ -700,26 +862,25 @@ static void HandleTapeButtons(struct GadgetInfo *gi) if (TAPE_IS_STOPPED(tape)) { - TapeStartPlaying(); - - game_status = PLAYING; - 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;