X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftape.c;h=689f2bf2e0dfbae9fdeacaed1392a639da5c282a;hb=5ef9148d1f605af02e872264519eda261a3e88ca;hp=55c414fd1b0233982caae45c2600d0489208762b;hpb=ede9654611727236d92fb50575bb937231acff71;p=rocksndiamonds.git diff --git a/src/tape.c b/src/tape.c index 55c414fd..689f2bf2 100644 --- a/src/tape.c +++ b/src/tape.c @@ -28,8 +28,10 @@ #define TAPE_CTRL_ID_PAUSE 3 #define TAPE_CTRL_ID_RECORD 4 #define TAPE_CTRL_ID_PLAY 5 +#define TAPE_CTRL_ID_INSERT_SOLUTION 6 +#define TAPE_CTRL_ID_PLAY_SOLUTION 7 -#define NUM_TAPE_BUTTONS 6 +#define NUM_TAPE_BUTTONS 8 /* values for tape handling */ #define TAPE_PAUSE_SECONDS_BEFORE_DEATH 5 @@ -598,18 +600,7 @@ void TapeStartRecording(int random_seed) static void TapeStartGameRecording() { - TapeStartRecording(level.random_seed); - -#if defined(NETWORK_AVALIABLE) - if (options.network) - { - SendToServer_StartPlaying(); - - return; - } -#endif - - InitGame(); + StartGameActions(network.enabled, TRUE, level.random_seed); } static void TapeAppendRecording() @@ -988,7 +979,7 @@ static void TapeStopWarpForward() static void TapeSingleStep() { - if (options.network) + if (network.enabled) return; if (!tape.pausing) @@ -1088,27 +1079,52 @@ void TapeQuickLoad() } } -void InsertSolutionTape() +boolean hasSolutionTape() { + boolean tape_file_exists = fileExists(getSolutionTapeFilename(level_nr)); boolean level_has_tape = (level.game_engine_type == GAME_ENGINE_TYPE_SP && level.native_sp_level->demo.is_available); - if (!fileExists(getSolutionTapeFilename(level_nr)) && !level_has_tape) + return (tape_file_exists || level_has_tape); +} + +boolean InsertSolutionTape() +{ + if (!hasSolutionTape()) { Request("No solution tape for this level!", REQ_CONFIRM); - return; + return FALSE; } + if (!TAPE_IS_STOPPED(tape)) + TapeStop(); + // if tape recorder already contains a tape, remove it without asking TapeErase(); LoadSolutionTape(level_nr); + DrawCompleteVideoDisplay(); + if (TAPE_IS_EMPTY(tape)) + { Request("Loading solution tape for this level failed!", REQ_CONFIRM); - DrawCompleteVideoDisplay(); + return FALSE; + } + + return TRUE; +} + +boolean PlaySolutionTape() +{ + if (!InsertSolutionTape()) + return FALSE; + + TapeStartGamePlaying(); + + return TRUE; } @@ -1284,6 +1300,14 @@ static struct { IMG_GFX_TAPE_BUTTON_PLAY, &tape.button.play, TAPE_CTRL_ID_PLAY, "play tape" + }, + { + IMG_GFX_TAPE_BUTTON_INSERT_SOLUTION,&tape.button.insert_solution, + TAPE_CTRL_ID_INSERT_SOLUTION, "insert solution tape" + }, + { + IMG_GFX_TAPE_BUTTON_PLAY_SOLUTION, &tape.button.play_solution, + TAPE_CTRL_ID_PLAY_SOLUTION, "play solution tape" } }; @@ -1293,7 +1317,8 @@ void CreateTapeButtons() for (i = 0; i < NUM_TAPE_BUTTONS; i++) { - struct GraphicInfo *gfx = &graphic_info[tapebutton_info[i].graphic]; + int graphic = tapebutton_info[i].graphic; + struct GraphicInfo *gfx = &graphic_info[graphic]; struct XY *pos = tapebutton_info[i].pos; struct GadgetInfo *gi; int gd_x = gfx->src_x; @@ -1303,6 +1328,7 @@ void CreateTapeButtons() int id = i; gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, tapebutton_info[i].infotext, GDI_X, VX + pos->x, GDI_Y, VY + pos->y, @@ -1356,7 +1382,7 @@ void MapTapeButtons() MapTapeWarpButton(); if (tape.show_game_buttons) - MapGameButtons(); + MapGameButtonsOnTape(); } void UnmapTapeButtons() @@ -1367,7 +1393,7 @@ void UnmapTapeButtons() UnmapGadget(tape_gadget[i]); if (tape.show_game_buttons) - UnmapGameButtons(); + UnmapGameButtonsOnTape(); } void RedrawTapeButtons() @@ -1378,7 +1404,7 @@ void RedrawTapeButtons() RedrawGadget(tape_gadget[i]); if (tape.show_game_buttons) - RedrawGameButtons(); + RedrawGameButtonsOnTape(); // RedrawGadget() may have set REDRAW_ALL if buttons are defined off-area redraw_mask &= ~REDRAW_ALL; @@ -1514,6 +1540,16 @@ static void HandleTapeButtonsExt(int id) break; + case TAPE_CTRL_ID_INSERT_SOLUTION: + InsertSolutionTape(); + + break; + + case TAPE_CTRL_ID_PLAY_SOLUTION: + PlaySolutionTape(); + + break; + default: break; }