X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftape.c;h=9de9839b5f2608b77108f742418df5229e31f11d;hp=1d8a3ed02381a2f8b9383aacabe932d62e844237;hb=f1f15272242355ab7bc94028b4fa4b2e0f8152b5;hpb=80aa0e4b2b060112407417a9d2896395023a21cc diff --git a/src/tape.c b/src/tape.c index 1d8a3ed0..9de9839b 100644 --- a/src/tape.c +++ b/src/tape.c @@ -1,15 +1,13 @@ -/*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * -*----------------------------------------------------------* -* (c) 1995-2006 Artsoft Entertainment * -* Holger Schemel * -* Detmolder Strasse 189 * -* 33604 Bielefeld * -* Germany * -* e-mail: info@artsoft.org * -*----------------------------------------------------------* -* tape.c * -***********************************************************/ +// ============================================================================ +// Rocks'n'Diamonds - McDuffin Strikes Back! +// ---------------------------------------------------------------------------- +// (c) 1995-2014 by Artsoft Entertainment +// Holger Schemel +// info@artsoft.org +// http://www.artsoft.org/ +// ---------------------------------------------------------------------------- +// tape.c +// ============================================================================ #include "libgame/libgame.h" @@ -21,6 +19,8 @@ #include "network.h" #include "cartoons.h" +#define DEBUG_TAPE_WHEN_PLAYING FALSE + /* tape button identifiers */ #define TAPE_CTRL_ID_EJECT 0 #define TAPE_CTRL_ID_EXTRA 1 @@ -195,160 +195,6 @@ void DrawVideoDisplay(unsigned int state, unsigned int value) "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; -#if 0 - static struct - { - int gd_x1, gd_y1; - int gd_x2, gd_y2; - int x, y; - int width, height; - } - video_pos[NUM_TAPE_FUNCTIONS][NUM_TAPE_FUNCTION_PARTS] = - { - { - { - PG_X4(VIDEO_PLAY_LABEL_XPOS), PG_Y2(VIDEO_PLAY_LABEL_YPOS), - PG_X3(VIDEO_PLAY_LABEL_XPOS), PG_Y2(VIDEO_PLAY_LABEL_YPOS), - VIDEO_PLAY_LABEL_XPOS, VIDEO_PLAY_LABEL_YPOS, - VIDEO_PLAY_LABEL_XSIZE, VIDEO_PLAY_LABEL_YSIZE - }, - { - PG_X4(VIDEO_PLAY_SYMBOL_XPOS), PG_Y2(VIDEO_PLAY_SYMBOL_YPOS), - PG_X3(VIDEO_PLAY_SYMBOL_XPOS), PG_Y2(VIDEO_PLAY_SYMBOL_YPOS), - VIDEO_PLAY_SYMBOL_XPOS, VIDEO_PLAY_SYMBOL_YPOS, - VIDEO_PLAY_SYMBOL_XSIZE, VIDEO_PLAY_SYMBOL_YSIZE - } - }, - { - { - PG_X4(VIDEO_REC_LABEL_XPOS), PG_Y2(VIDEO_REC_LABEL_YPOS), - PG_X3(VIDEO_REC_LABEL_XPOS), PG_Y2(VIDEO_REC_LABEL_YPOS), - VIDEO_REC_LABEL_XPOS, VIDEO_REC_LABEL_YPOS, - VIDEO_REC_LABEL_XSIZE, VIDEO_REC_LABEL_YSIZE - }, - { - PG_X4(VIDEO_REC_SYMBOL_XPOS), PG_Y2(VIDEO_REC_SYMBOL_YPOS), - PG_X3(VIDEO_REC_SYMBOL_XPOS), PG_Y2(VIDEO_REC_SYMBOL_YPOS), - VIDEO_REC_SYMBOL_XPOS, VIDEO_REC_SYMBOL_YPOS, - VIDEO_REC_SYMBOL_XSIZE, VIDEO_REC_SYMBOL_YSIZE - } - }, - { - { - PG_X4(VIDEO_PAUSE_LABEL_XPOS), PG_Y2(VIDEO_PAUSE_LABEL_YPOS), - PG_X3(VIDEO_PAUSE_LABEL_XPOS), PG_Y2(VIDEO_PAUSE_LABEL_YPOS), - VIDEO_PAUSE_LABEL_XPOS, VIDEO_PAUSE_LABEL_YPOS, - VIDEO_PAUSE_LABEL_XSIZE, VIDEO_PAUSE_LABEL_YSIZE - }, - { - PG_X4(VIDEO_PAUSE_SYMBOL_XPOS), PG_Y2(VIDEO_PAUSE_SYMBOL_YPOS), - PG_X3(VIDEO_PAUSE_SYMBOL_XPOS), PG_Y2(VIDEO_PAUSE_SYMBOL_YPOS), - VIDEO_PAUSE_SYMBOL_XPOS, VIDEO_PAUSE_SYMBOL_YPOS, - VIDEO_PAUSE_SYMBOL_XSIZE, VIDEO_PAUSE_SYMBOL_YSIZE - } - }, - { - { - PG_X4(VIDEO_DATE_LABEL_XPOS), PG_Y2(VIDEO_DATE_LABEL_YPOS), - PG_X3(VIDEO_DATE_LABEL_XPOS), PG_Y2(VIDEO_DATE_LABEL_YPOS), - VIDEO_DATE_LABEL_XPOS, VIDEO_DATE_LABEL_YPOS, - VIDEO_DATE_LABEL_XSIZE, VIDEO_DATE_LABEL_YSIZE - }, - { - PG_X4(VIDEO_DATE_XPOS), PG_Y2(VIDEO_DATE_YPOS), - PG_X3(VIDEO_DATE_XPOS), PG_Y2(VIDEO_DATE_YPOS), - VIDEO_DATE_XPOS, VIDEO_DATE_YPOS, - VIDEO_DATE_XSIZE, VIDEO_DATE_YSIZE - } - }, - { - { - -1, -1, - -1, -1, - -1, -1, - -1, -1 - }, - { - PG_X4(VIDEO_TIME_XPOS), PG_Y2(VIDEO_TIME_YPOS), - PG_X3(VIDEO_TIME_XPOS), PG_Y2(VIDEO_TIME_YPOS), - VIDEO_TIME_XPOS, VIDEO_TIME_YPOS, - VIDEO_TIME_XSIZE, VIDEO_TIME_YSIZE - } - }, - { - { - PG_X6(VIDEO_FFWD_LABEL_XPOS), PG_Y1(VIDEO_FFWD_LABEL_YPOS), - PG_X3(VIDEO_LABEL_XPOS), PG_Y2(VIDEO_LABEL_YPOS), - VIDEO_LABEL_XPOS, VIDEO_LABEL_YPOS, - VIDEO_LABEL_XSIZE, VIDEO_LABEL_YSIZE - }, - { - PG_X6(VIDEO_FFWD_SYMBOL_XPOS), PG_Y1(VIDEO_FFWD_SYMBOL_YPOS), - PG_X3(VIDEO_FFWD_SYMBOL_XPOS), PG_Y2(VIDEO_SYMBOL_YPOS), - VIDEO_SYMBOL_XPOS, VIDEO_SYMBOL_YPOS, - VIDEO_FFWD_SYMBOL_XSIZE, VIDEO_FFWD_SYMBOL_YSIZE - } - }, - { - { - PG_X6(VIDEO_PBEND_LABEL_XPOS), PG_Y1(VIDEO_PBEND_LABEL_YPOS), - PG_X3(VIDEO_LABEL_XPOS), PG_Y2(VIDEO_LABEL_YPOS), - VIDEO_LABEL_XPOS, VIDEO_LABEL_YPOS, - VIDEO_LABEL_XSIZE, VIDEO_LABEL_YSIZE - }, - { - PG_X6(VIDEO_PBEND_SYMBOL_XPOS), PG_Y1(VIDEO_PBEND_SYMBOL_YPOS), - PG_X3(VIDEO_PBEND_SYMBOL_XPOS), PG_Y2(VIDEO_SYMBOL_YPOS), - VIDEO_SYMBOL_XPOS, VIDEO_SYMBOL_YPOS, - VIDEO_PBEND_SYMBOL_XSIZE, VIDEO_PBEND_SYMBOL_YSIZE - } - }, - { - { - PG_X6(VIDEO_WARP_LABEL_XPOS), PG_Y1(VIDEO_WARP_LABEL_YPOS), - PG_X3(VIDEO_LABEL_XPOS), PG_Y2(VIDEO_LABEL_YPOS), - VIDEO_LABEL_XPOS, VIDEO_LABEL_YPOS, - VIDEO_LABEL_XSIZE, VIDEO_LABEL_YSIZE - }, - { - PG_X6(VIDEO_WARP_SYMBOL_XPOS), PG_Y1(VIDEO_WARP_SYMBOL_YPOS), - PG_X3(VIDEO_WARP_SYMBOL_XPOS), PG_Y2(VIDEO_SYMBOL_YPOS), - VIDEO_SYMBOL_XPOS, VIDEO_SYMBOL_YPOS, - VIDEO_WARP_SYMBOL_XSIZE, VIDEO_WARP_SYMBOL_YSIZE - } - }, - { - { - -1, -1, - -1, -1, - -1, -1, - -1, -1 - }, - { - PG_X6(VIDEO_WARP2_SYMBOL_XPOS), PG_Y1(VIDEO_WARP2_SYMBOL_YPOS), - PG_X3(VIDEO_WARP2_SYMBOL_XPOS), PG_Y2(VIDEO_SYMBOL_YPOS), - VIDEO_SYMBOL_XPOS, VIDEO_SYMBOL_YPOS, - VIDEO_WARP2_SYMBOL_XSIZE, VIDEO_WARP2_SYMBOL_YSIZE - } - }, - { - { - -1, -1, - -1, -1, - -1, -1, - -1, -1 - }, - { - PG_X6(VIDEO_1STEP_SYMBOL_XPOS), PG_Y1(VIDEO_1STEP_SYMBOL_YPOS), - PG_X3(VIDEO_1STEP_SYMBOL_XPOS), PG_Y2(VIDEO_SYMBOL_YPOS), - VIDEO_1STEP_SYMBOL_XPOS, VIDEO_SYMBOL_YPOS, - VIDEO_1STEP_SYMBOL_XSIZE, VIDEO_1STEP_SYMBOL_YSIZE - } - }, - }; -#endif - -#if 1 static struct { int graphic; @@ -444,55 +290,20 @@ void DrawVideoDisplay(unsigned int state, unsigned int value) } } -#else - - for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++) /* on or off states */ - { - for (i = 0; i < NUM_TAPE_FUNCTIONS; i++) /* record, play, ... */ - { - for (j = 0; j < NUM_TAPE_FUNCTION_PARTS; j++) /* label or symbol */ - { - if (state & (1 << (i * 2 + k))) - { - int gd_x, gd_y; - int skip_value = - (j == 0 ? VIDEO_DISPLAY_SYMBOL_ONLY : VIDEO_DISPLAY_LABEL_ONLY); - - if (k == 1) /* on */ - { - gd_x = video_pos[i][j].gd_x1; - gd_y = video_pos[i][j].gd_y1; - } - else /* off */ - { - gd_x = video_pos[i][j].gd_x2; - gd_y = video_pos[i][j].gd_y2; - } - - if (video_pos[i][j].x != -1 && value != skip_value) - BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, - gd_x, gd_y, - video_pos[i][j].width, - video_pos[i][j].height, - VX + video_pos[i][j].x, - VY + video_pos[i][j].y); - } - } - } - } -#endif - -#if 1 if (state & VIDEO_STATE_DATE_ON) { struct TextPosInfo *pos = &tape.text.date; int tag = value % 100; - int monat = (value/100) % 100; - int jahr = (value/10000); - - DrawText(VX + pos->x, VY + pos->y, int2str(tag, 2), pos->font); - DrawText(VX + pos->x + 27, VY + pos->y, monatsname[monat], pos->font); - DrawText(VX + pos->x + 64, VY + pos->y, int2str(jahr, 2), pos->font); + int monat = (value / 100) % 100; + int jahr = (value / 10000); + int xpos1 = VX + pos->x; + int xpos2 = VX + pos->x + pos->xoffset; + int xpos3 = VX + pos->x + pos->xoffset2; + int ypos = VY + pos->y; + + DrawText(xpos1, ypos, int2str(tag, 2), pos->font); + DrawText(xpos2, ypos, monatsname[monat], pos->font); + DrawText(xpos3, ypos, int2str(jahr, 2), pos->font); } if (state & VIDEO_STATE_TIME_ON) @@ -500,62 +311,31 @@ void DrawVideoDisplay(unsigned int state, unsigned int value) struct TextPosInfo *pos = &tape.text.time; int min = value / 60; int sec = value % 60; + int xpos1 = VX + pos->x; + int xpos2 = VX + pos->x + pos->xoffset; + int ypos = VY + pos->y; - DrawText(VX + pos->x, VY + pos->y, int2str(min, 2), pos->font); - DrawText(VX + pos->x + 27, VY + pos->y, int2str(sec, 2), pos->font); - } - -#else - - if (state & VIDEO_STATE_DATE_ON) - { - int tag = value % 100; - int monat = (value/100) % 100; - int jahr = (value/10000); - - DrawText(VX + VIDEO_DATE_XPOS, VY + VIDEO_DATE_YPOS, - int2str(tag, 2), FONT_TAPE_RECORDER); - DrawText(VX + VIDEO_DATE_XPOS + 27, VY + VIDEO_DATE_YPOS, - monatsname[monat], FONT_TAPE_RECORDER); - DrawText(VX + VIDEO_DATE_XPOS + 64, VY + VIDEO_DATE_YPOS, - int2str(jahr, 2), FONT_TAPE_RECORDER); - } - - if (state & VIDEO_STATE_TIME_ON) - { - int min = value / 60; - int sec = value % 60; - - DrawText(VX + VIDEO_TIME_XPOS, VY + VIDEO_TIME_YPOS, - int2str(min, 2), FONT_TAPE_RECORDER); - DrawText(VX + VIDEO_TIME_XPOS + 27, VY + VIDEO_TIME_YPOS, - int2str(sec, 2), FONT_TAPE_RECORDER); + DrawText(xpos1, ypos, int2str(min, 2), pos->font); + DrawText(xpos2, ypos, int2str(sec, 2), pos->font); } -#endif redraw_mask |= REDRAW_DOOR_2; } void DrawCompleteVideoDisplay() { -#if 0 - printf("::: %d, %d / %d, %d [%d] [%d, %d] [%d/%d]\n", - VX, VY, EX, EY, game_status, gfx.vx, gfx.vy, - tape.date, tape.length); -#endif + struct GraphicInfo *g_tape = &graphic_info[IMG_BACKGROUND_TAPE]; - BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, - DOOR_GFX_PAGEX3, DOOR_GFX_PAGEY2, + /* draw tape background */ + BlitBitmap(g_tape->bitmap, drawto, g_tape->src_x, g_tape->src_y, gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy); - BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, - DOOR_GFX_PAGEX4 + VIDEO_CONTROL_XPOS, - DOOR_GFX_PAGEY2 + VIDEO_CONTROL_YPOS, - VIDEO_CONTROL_XSIZE, VIDEO_CONTROL_YSIZE, - gfx.vx + VIDEO_CONTROL_XPOS, gfx.vy + VIDEO_CONTROL_YPOS); + + /* draw tape buttons (forced) */ + UnmapTapeButtons(); + MapTapeButtons(); DrawVideoDisplay(VIDEO_ALL_OFF, 0); -#if 1 if (tape.recording) { DrawVideoDisplay(VIDEO_STATE_REC_ON, 0); @@ -579,16 +359,9 @@ void DrawCompleteVideoDisplay() DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date); DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds); } -#else - if (tape.date && tape.length) - { - DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date); - DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds); - } -#endif - BlitBitmap(drawto, bitmap_db_door, gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize, - DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2); + BlitBitmap(drawto, bitmap_db_door_2, gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize, + 0, 0); } void TapeDeactivateDisplayOn() @@ -734,9 +507,7 @@ static void TapeAppendRecording() DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date); DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON, 0); -#if 1 UpdateAndDisplayGameControlValues(); -#endif } void TapeHaltRecording() @@ -971,6 +742,13 @@ byte *TapePlayAction() for (i = 0; i < MAX_PLAYERS; i++) action[i] = tape.pos[tape.counter].action[i]; +#if DEBUG_TAPE_WHEN_PLAYING + printf("%05d", FrameCounter); + for (i = 0; i < MAX_PLAYERS; i++) + printf(" %08x", action[i]); + printf("\n"); +#endif + tape.set_centered_player = FALSE; tape.centered_player_nr_next = -999; @@ -1079,7 +857,7 @@ void TapeQuickSave() { if (game_status == GAME_MODE_MAIN) { - Request("No game that can be saved !", REQ_CONFIRM); + Request("No game that can be saved!", REQ_CONFIRM); return; } @@ -1092,7 +870,7 @@ void TapeQuickSave() if (TAPE_IS_EMPTY(tape)) { - Request("No tape that can be saved !", REQ_CONFIRM); + Request("No tape that can be saved!", REQ_CONFIRM); return; } @@ -1107,12 +885,12 @@ void TapeQuickLoad() if (!fileExists(filename)) { - Request("No tape for this level !", REQ_CONFIRM); + Request("No tape for this level!", REQ_CONFIRM); return; } - if (tape.recording && !Request("Stop recording and load tape ?", + if (tape.recording && !Request("Stop recording and load tape?", REQ_ASK | REQ_STAY_CLOSED)) { OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK); @@ -1157,7 +935,7 @@ void TapeQuickLoad() { int reopen_door = (game_status == GAME_MODE_PLAYING ? REQ_REOPEN : 0); - Request("No tape for this level !", REQ_CONFIRM | reopen_door); + Request("No tape for this level!", REQ_CONFIRM | reopen_door); } } @@ -1169,7 +947,7 @@ void InsertSolutionTape() LoadSolutionTape(level_nr); if (TAPE_IS_EMPTY(tape)) - Request("No solution tape for this level !", REQ_CONFIRM); + Request("No solution tape for this level!", REQ_CONFIRM); DrawCompleteVideoDisplay(); } @@ -1188,9 +966,6 @@ void AutoPlayTape() static int num_levels_solved = 0; static int num_tape_missing = 0; static boolean level_failed[MAX_TAPES_PER_SET]; -#if 0 - static boolean tape_missing[MAX_TAPES_PER_SET]; -#endif int i; if (autoplay_initialized) @@ -1237,12 +1012,7 @@ void AutoPlayTape() printf("\n"); for (i = 0; i < MAX_TAPES_PER_SET; i++) - { level_failed[i] = FALSE; -#if 0 - tape_missing[i] = FALSE; -#endif - } autoplay_initialized = TRUE; } @@ -1276,12 +1046,9 @@ void AutoPlayTape() if (tape.no_valid_file) { num_tape_missing++; -#if 0 - if (level_nr >= 0 && level_nr < MAX_TAPES_PER_SET) - tape_missing[level_nr] = TRUE; -#endif printf("(no tape)\n"); + continue; } @@ -1312,16 +1079,6 @@ void AutoPlayTape() printf(" %03d", i); } -#if 0 - if (num_tape_missing > 0) - { - printf(", NO TAPE:"); - for (i = 0; i < MAX_TAPES_PER_SET; i++) - if (tape_missing[i]) - printf(" %03d", i); - } -#endif - printf("\n"); printf_line("=", 79); @@ -1433,6 +1190,9 @@ void MapTapeButtons() if (tape.recording || tape.playing) MapTapeWarpButton(); + + if (tape.show_game_buttons) + MapGameButtons(); } void UnmapTapeButtons() @@ -1458,7 +1218,7 @@ static void HandleTapeButtonsExt(int id) LoadTape(level_nr); if (TAPE_IS_EMPTY(tape)) - Request("No tape for this level !", REQ_CONFIRM); + Request("No tape for this level!", REQ_CONFIRM); } else {