X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftape.c;h=4f1239171c65ed91e7aa58b494bedddd9be5a9a8;hp=e9868159579e224e92bdeef232337bbc1b1bd744;hb=abe44529b439ad39b4d8dbf19cbd67c9b9844279;hpb=61eaa25861d6a0d0ac8f52a50f28b25d857d0efd diff --git a/src/tape.c b/src/tape.c index e9868159..4f123917 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" @@ -186,7 +184,7 @@ static struct GadgetInfo *tape_gadget[NUM_TAPE_BUTTONS]; /* video display functions */ /* ========================================================================= */ -void DrawVideoDisplay(unsigned long state, unsigned long value) +void DrawVideoDisplay(unsigned int state, unsigned int value) { int i, j, k; static char *monatsname[12] = @@ -194,6 +192,8 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" }; + +#if 0 static struct { int gd_x1, gd_y1; @@ -344,9 +344,103 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) } }, }; +#endif -#if 0 - /* !!! ADD NEW STUFF HERE :-) !!! */ +#if 1 + static struct + { + int graphic; + struct Rect *pos; + } + 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_TAPE_LABEL_GFX_RECORD, &tape.label.record }, + { IMG_TAPE_SYMBOL_GFX_RECORD, &tape.symbol.record }, + }, + { + { IMG_TAPE_LABEL_GFX_PAUSE, &tape.label.pause }, + { IMG_TAPE_SYMBOL_GFX_PAUSE, &tape.symbol.pause }, + }, + { + { IMG_TAPE_LABEL_GFX_DATE, &tape.label.date }, + { -1, NULL }, + }, + { + { IMG_TAPE_LABEL_GFX_TIME, &tape.label.time }, + { -1, NULL }, + }, + { + { IMG_TAPE_LABEL_GFX_FAST_FORWARD, &tape.label.fast_forward }, + { IMG_TAPE_SYMBOL_GFX_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_TAPE_LABEL_GFX_WARP_FORWARD_BLIND, &tape.label.warp_forward_blind}, + { IMG_TAPE_SYMBOL_GFX_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_TAPE_LABEL_GFX_SINGLE_STEP, &tape.label.single_step }, + { IMG_TAPE_SYMBOL_GFX_SINGLE_STEP, &tape.symbol.single_step }, + }, + }; + + 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 (video_pos[i][j].graphic == -1 || + video_pos[i][j].pos->x < 0 || + video_pos[i][j].pos->y < 0) + continue; + + if (state & (1 << (i * 2 + k))) + { + struct GraphicInfo *gfx_bg = &graphic_info[IMG_BACKGROUND_TAPE]; + struct GraphicInfo *gfx = &graphic_info[video_pos[i][j].graphic]; + struct Rect *pos = video_pos[i][j].pos; + Bitmap *gd_bitmap; + int gd_x, gd_y; + int skip_value = + (j == 0 ? VIDEO_DISPLAY_SYMBOL_ONLY : VIDEO_DISPLAY_LABEL_ONLY); + + if (value == skip_value) + continue; + + if (k == 1) /* on */ + { + gd_bitmap = gfx->bitmap; + gd_x = gfx->src_x; + gd_y = gfx->src_y; + } + else /* off */ + { + gd_bitmap = gfx_bg->bitmap; + gd_x = gfx_bg->src_x + pos->x; + gd_y = gfx_bg->src_y + pos->y; + } + + /* some tape graphics may be undefined -- only draw if defined */ + if (gd_bitmap != NULL) + BlitBitmap(gd_bitmap, drawto, gd_x, gd_y, gfx->width, gfx->height, + VX + pos->x, VY + pos->y); + } + } + } + } #else @@ -386,6 +480,31 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) } #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); + } + + if (state & VIDEO_STATE_TIME_ON) + { + struct TextPosInfo *pos = &tape.text.time; + int min = value / 60; + int sec = value % 60; + + 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; @@ -410,6 +529,7 @@ void DrawVideoDisplay(unsigned long state, unsigned long value) DrawText(VX + VIDEO_TIME_XPOS + 27, VY + VIDEO_TIME_YPOS, int2str(sec, 2), FONT_TAPE_RECORDER); } +#endif redraw_mask |= REDRAW_DOOR_2; } @@ -422,6 +542,52 @@ void DrawCompleteVideoDisplay() tape.date, tape.length); #endif +#if 1 + + struct GraphicInfo *g_tape = &graphic_info[IMG_BACKGROUND_TAPE]; + + /* draw tape background */ + BlitBitmap(g_tape->bitmap, drawto, g_tape->src_x, g_tape->src_y, + gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy); + + /* draw tape buttons (forced) */ + UnmapTapeButtons(); + MapTapeButtons(); + +#else + +#if 1 + struct GraphicInfo *g_tape = &graphic_info[IMG_BACKGROUND_TAPE]; + int tape_button_graphics[] = + { + IMG_TAPE_BUTTON_GFX_EJECT, + IMG_TAPE_BUTTON_GFX_STOP, + IMG_TAPE_BUTTON_GFX_PAUSE, + IMG_TAPE_BUTTON_GFX_RECORD, + IMG_TAPE_BUTTON_GFX_PLAY + }; + struct Rect *tape_button_positions[] = + { + &tape.button.eject, + &tape.button.stop, + &tape.button.pause, + &tape.button.record, + &tape.button.play + }; + int i; + + BlitBitmap(g_tape->bitmap, drawto, g_tape->src_x, g_tape->src_y, + gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy); + + for (i = 0; i < SIZEOF_ARRAY_INT(tape_button_graphics); i++) + { + struct GraphicInfo *g = &graphic_info[tape_button_graphics[i]]; + struct Rect *pos = tape_button_positions[i]; + + BlitBitmap(g->bitmap, drawto, g->src_x, g->src_y, + g->width, g->height, gfx.vx + pos->x, gfx.vy + pos->y); + } +#else BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto, DOOR_GFX_PAGEX3, DOOR_GFX_PAGEY2, gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy); @@ -430,6 +596,9 @@ void DrawCompleteVideoDisplay() DOOR_GFX_PAGEY2 + VIDEO_CONTROL_YPOS, VIDEO_CONTROL_XSIZE, VIDEO_CONTROL_YSIZE, gfx.vx + VIDEO_CONTROL_XPOS, gfx.vy + VIDEO_CONTROL_YPOS); +#endif + +#endif DrawVideoDisplay(VIDEO_ALL_OFF, 0); @@ -465,8 +634,13 @@ void DrawCompleteVideoDisplay() } #endif +#if 1 + BlitBitmap(drawto, bitmap_db_door_2, gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize, + 0, 0); +#else BlitBitmap(drawto, bitmap_db_door, gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize, DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY2); +#endif } void TapeDeactivateDisplayOn() @@ -555,12 +729,12 @@ static void TapeRewind() InitRND(tape.random_seed); } -static void TapeSetRandomSeed(long random_seed) +static void TapeSetRandomSeed(int random_seed) { tape.random_seed = InitRND(random_seed); } -void TapeStartRecording(long random_seed) +void TapeStartRecording(int random_seed) { if (!TAPE_IS_STOPPED(tape)) TapeStop(); @@ -957,7 +1131,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; } @@ -970,7 +1144,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; } @@ -985,12 +1159,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); @@ -1003,6 +1177,10 @@ void TapeQuickLoad() if (CheckEngineSnapshot()) { +#if 0 + printf("::: MARK 1\n"); +#endif + TapeStartGamePlaying(); LoadEngineSnapshot(); @@ -1019,6 +1197,10 @@ void TapeQuickLoad() return; } +#if 0 + printf("::: MARK 2\n"); +#endif + TapeStop(); TapeErase(); @@ -1035,7 +1217,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); } } @@ -1047,7 +1229,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(); } @@ -1066,7 +1248,9 @@ 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) @@ -1115,7 +1299,9 @@ void AutoPlayTape() for (i = 0; i < MAX_TAPES_PER_SET; i++) { level_failed[i] = FALSE; +#if 0 tape_missing[i] = FALSE; +#endif } autoplay_initialized = TRUE; @@ -1150,8 +1336,10 @@ 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; @@ -1305,6 +1493,9 @@ void MapTapeButtons() if (tape.recording || tape.playing) MapTapeWarpButton(); + + if (tape.show_game_buttons) + MapGameButtons(); } void UnmapTapeButtons() @@ -1330,7 +1521,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 {