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
+
BlitBitmap(graphic_info[IMG_GLOBAL_DOOR].bitmap, drawto,
DOOR_GFX_PAGEX3, DOOR_GFX_PAGEY2,
gfx.vxsize, gfx.vysize, gfx.vx, gfx.vy);
gfx.vx + VIDEO_CONTROL_XPOS, gfx.vy + VIDEO_CONTROL_YPOS);
DrawVideoDisplay(VIDEO_ALL_OFF, 0);
+
+#if 1
+ if (tape.recording)
+ {
+ DrawVideoDisplay(VIDEO_STATE_REC_ON, 0);
+ DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
+ DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds);
+
+ if (tape.pausing)
+ DrawVideoDisplay(VIDEO_STATE_PAUSE_ON, 0);
+ }
+ else if (tape.playing)
+ {
+ DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0);
+ DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
+ DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+
+ if (tape.pausing)
+ DrawVideoDisplay(VIDEO_STATE_PAUSE_ON, 0);
+ }
+ else if (tape.date && tape.length)
+ {
+ 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);
/* tape control functions */
/* ========================================================================= */
-static void TapeSetDate()
+void TapeSetDateFromEpochSeconds(time_t epoch_seconds)
{
- time_t epoch_seconds = time(NULL);
- struct tm *now = localtime(&epoch_seconds);
+ struct tm *lt = localtime(&epoch_seconds);
- tape.date = 10000 * (now->tm_year % 100) + 100 * now->tm_mon + now->tm_mday;
+ tape.date = 10000 * (lt->tm_year % 100) + 100 * lt->tm_mon + lt->tm_mday;
+}
+
+void TapeSetDateFromNow()
+{
+ TapeSetDateFromEpochSeconds(time(NULL));
}
void TapeErase()
{
int i;
- tape.length = 0;
tape.counter = 0;
+ tape.length = 0;
+ tape.length_seconds = 0;
if (leveldir_current)
setString(&tape.level_identifier, leveldir_current->identifier);
tape.pos[tape.counter].delay = 0;
tape.changed = TRUE;
- tape.random_seed = InitRND(NEW_RANDOMIZE);
+ tape.random_seed = InitRND(level.random_seed);
tape.file_version = FILE_VERSION_ACTUAL;
tape.game_version = GAME_VERSION_ACTUAL;
tape.engine_version = level.game_version;
- TapeSetDate();
+ TapeSetDateFromNow();
for (i = 0; i < MAX_PLAYERS; i++)
tape.player_participates[i] = FALSE;
DrawVideoDisplay(VIDEO_STATE_REC_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+
MapTapeWarpButton();
SetDrawDeactivationMask(REDRAW_NONE);
static void TapeStartGameRecording()
{
- TapeStartRecording(NEW_RANDOMIZE);
+ TapeStartRecording(level.random_seed);
#if defined(NETWORK_AVALIABLE)
if (options.network)
tape.recording = TRUE;
tape.changed = TRUE;
- TapeSetDate();
+ TapeSetDateFromNow();
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON, 0);
+
+#if 1
+ UpdateAndDisplayGameControlValues();
+#endif
}
void TapeHaltRecording()
tape.quick_resume = FALSE;
TapeAppendRecording();
+
+ if (!CheckEngineSnapshot())
+ SaveEngineSnapshot();
}
}
}
DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+
MapTapeWarpButton();
SetDrawDeactivationMask(REDRAW_NONE);
TapeHaltRecording(); /* prepare tape for saving on-the-fly */
if (TAPE_IS_EMPTY(tape))
+ {
Request("No tape that can be saved !", REQ_CONFIRM);
- else
- SaveTape(tape.level_nr);
- SaveEngineSnapshot();
+ return;
+ }
+
+ if (SaveTapeChecked(tape.level_nr))
+ SaveEngineSnapshot();
}
void TapeQuickLoad()
LoadEngineSnapshot();
+ DrawCompleteVideoDisplay();
+
tape.playing = TRUE;
tape.pausing = TRUE;
GDI_STATE, GD_BUTTON_UNPRESSED,
GDI_DESIGN_UNPRESSED, gd_bitmap, gd_x1, gd_y,
GDI_DESIGN_PRESSED, gd_bitmap, gd_x2, gd_y,
+ GDI_DIRECT_DRAW, FALSE,
GDI_EVENT_MASK, GD_EVENT_RELEASED,
GDI_CALLBACK_ACTION, HandleTapeButtons,
GDI_END);
UnmapGadget(tape_gadget[i]);
}
-static void HandleTapeButtons(struct GadgetInfo *gi)
+static void HandleTapeButtonsExt(int id)
{
- int id = gi->custom_id;
-
if (game_status != GAME_MODE_MAIN && game_status != GAME_MODE_PLAYING)
return;
{
case TAPE_CTRL_ID_EJECT:
TapeStop();
+
if (TAPE_IS_EMPTY(tape))
{
LoadTape(level_nr);
+
if (TAPE_IS_EMPTY(tape))
Request("No tape for this level !", REQ_CONFIRM);
}
else
{
if (tape.changed)
- SaveTape(tape.level_nr);
+ SaveTapeChecked(tape.level_nr);
+
TapeErase();
}
+
DrawCompleteVideoDisplay();
break;
}
else if (tape.recording)
TapeSingleStep();
+
break;
case TAPE_CTRL_ID_STOP:
break;
}
}
+
+static void HandleTapeButtons(struct GadgetInfo *gi)
+{
+ HandleTapeButtonsExt(gi->custom_id);
+}
+
+void HandleTapeButtonKeys(Key key)
+{
+ boolean use_extra = (tape.recording || tape.playing);
+
+ if (key == setup.shortcut.tape_eject)
+ HandleTapeButtonsExt(use_extra ? TAPE_CTRL_ID_EXTRA : TAPE_CTRL_ID_EJECT);
+ else if (key == setup.shortcut.tape_stop)
+ HandleTapeButtonsExt(TAPE_CTRL_ID_STOP);
+ else if (key == setup.shortcut.tape_pause)
+ HandleTapeButtonsExt(TAPE_CTRL_ID_PAUSE);
+ else if (key == setup.shortcut.tape_record)
+ HandleTapeButtonsExt(TAPE_CTRL_ID_RECORD);
+ else if (key == setup.shortcut.tape_play)
+ HandleTapeButtonsExt(TAPE_CTRL_ID_PLAY);
+}