#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
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()
static void TapeSingleStep()
{
- if (options.network)
+ if (network.enabled)
return;
if (!tape.pausing)
}
}
-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;
}
{
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"
}
};
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;
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,
MapTapeWarpButton();
if (tape.show_game_buttons)
- MapGameButtons();
+ MapGameButtonsOnTape();
}
void UnmapTapeButtons()
UnmapGadget(tape_gadget[i]);
if (tape.show_game_buttons)
- UnmapGameButtons();
+ UnmapGameButtonsOnTape();
}
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;
break;
+ case TAPE_CTRL_ID_INSERT_SOLUTION:
+ InsertSolutionTape();
+
+ break;
+
+ case TAPE_CTRL_ID_PLAY_SOLUTION:
+ PlaySolutionTape();
+
+ break;
+
default:
break;
}