X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=963426033e02a9bb58a0013533e58364ff239137;hb=8c6f354ceb0f49857489ef2df0303e155e7f6846;hp=01948ed9e7f14ddf55f27698cb9e171dbbca544d;hpb=681721dddc91bcdaef50002d1e861cc8d484e938;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 01948ed9..96342603 100644 --- a/src/tape.c +++ b/src/tape.c @@ -18,15 +18,20 @@ #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 *); @@ -77,7 +82,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 @@ -304,6 +309,7 @@ void TapeStartRecording() tape.changed = TRUE; tape.date = 10000*(zeit2->tm_year%100) + 100*zeit2->tm_mon + zeit2->tm_mday; tape.random_seed = InitRND(NEW_RANDOMIZE); + tape.game_version = GAME_VERSION_ACTUAL; for(i=0; i 0) /* already stored action */ + { + boolean changed_events = FALSE; - if (!tape.recording || tape.pausing) - return; + for(i=0; i= MAX_TAPELEN) - { - TapeStopRecording(); - return; + if (changed_events || tape.pos[tape.counter].delay >= 255) + { + tape.counter++; + tape.pos[tape.counter].delay = 0; + } + else + tape.pos[tape.counter].delay++; } - tape.pos[tape.counter].delay++; - - if (tape.pos[tape.counter].delay >= 255) + 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); + return NULL; } } - if (tape.counter >= tape.length) + if (tape.counter >= tape.length) /* end of tape reached */ { - TapeStop(); - return(TRUE); + if (tape.index_search) + TapeTogglePause(); + 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() @@ -535,6 +536,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 +554,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, @@ -592,6 +599,12 @@ void CreateTapeButtons() gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset; gd_y = DOOR_GFX_PAGEY2 + gd_yoffset; + if (i == TAPE_CTRL_ID_INDEX) + { + gd_x1 = DOOR_GFX_PAGEX6 + gd_xoffset; + gd_x2 = DOOR_GFX_PAGEX5 + gd_xoffset; + } + gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_INFO_TEXT, tapebutton_info[i].infotext, GDI_X, VX + gd_xoffset, @@ -613,12 +626,28 @@ void CreateTapeButtons() } } +void MapTapeEjectButton() +{ + UnmapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]); + MapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]); +} + +void MapTapeIndexButton() +{ + UnmapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]); + MapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]); +} + void MapTapeButtons() { int i; for (i=0; i PAUSING -> RECORDING */ { + if (tape.game_version != GAME_VERSION_ACTUAL && + !Request("This may break old version tape ! Append anyway ?", + REQ_ASK)) + break; + 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); } @@ -703,6 +753,7 @@ static void HandleTapeButtons(struct GadgetInfo *gi) TapeStartPlaying(); game_status = PLAYING; + StopAnimation(); InitGame(); } else if (tape.playing)