#define PG_Y2(y) (DOOR_GFX_PAGEY2 + (y))
#define VIDEO_INFO_OFF (VIDEO_STATE_DATE_OFF | \
- VIDEO_STATE_TIME_OFF)
+ VIDEO_STATE_TIME_OFF | \
+ VIDEO_STATE_FRAME_OFF)
#define VIDEO_STATE_OFF (VIDEO_STATE_PLAY_OFF | \
VIDEO_STATE_REC_OFF | \
VIDEO_STATE_PAUSE_OFF | \
VIDEO_PRESS_OFF)
#define VIDEO_INFO_ON (VIDEO_STATE_DATE_ON | \
- VIDEO_STATE_TIME_ON)
+ VIDEO_STATE_TIME_ON | \
+ VIDEO_STATE_FRAME_ON)
#define VIDEO_STATE_ON (VIDEO_STATE_PLAY_ON | \
VIDEO_STATE_REC_ON | \
VIDEO_STATE_PAUSE_ON | \
#define VIDEO_PRESS (VIDEO_PRESS_ON | VIDEO_PRESS_OFF)
#define VIDEO_ALL (VIDEO_ALL_ON | VIDEO_ALL_OFF)
-#define NUM_TAPE_FUNCTIONS 10
+#define NUM_TAPE_FUNCTIONS 11
#define NUM_TAPE_FUNCTION_PARTS 2
#define NUM_TAPE_FUNCTION_STATES 2
static struct
{
int graphic;
- struct Rect *pos;
+ struct XY *pos;
}
video_pos[NUM_TAPE_FUNCTIONS][NUM_TAPE_FUNCTION_PARTS] =
{
{ IMG_TAPE_LABEL_GFX_TIME, &tape.label.time },
{ -1, NULL },
},
+ {
+ /* (no label for displaying optional frame) */
+ { -1, NULL },
+ { -1, NULL },
+ },
{
{ IMG_TAPE_LABEL_GFX_FAST_FORWARD, &tape.label.fast_forward },
{ IMG_TAPE_SYMBOL_GFX_FAST_FORWARD, &tape.symbol.fast_forward },
{
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)
+ int graphic = video_pos[i][j].graphic;
+ struct XY *pos = video_pos[i][j].pos;
+
+ if (graphic == -1 ||
+ pos->x == -1 ||
+ pos->y == -1)
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;
+ struct GraphicInfo *gfx = &graphic_info[graphic];
Bitmap *gd_bitmap;
int gd_x, gd_y;
int skip_value =
if (gd_bitmap != NULL)
BlitBitmap(gd_bitmap, drawto, gd_x, gd_y, gfx->width, gfx->height,
VX + pos->x, VY + pos->y);
+
+ redraw_mask |= REDRAW_DOOR_2;
}
}
}
#define DATETIME_TIME_MM (1 << 7)
#define DATETIME_TIME_SS (1 << 8)
-#define DATETIME_XOFFSET_1 (1 << 9)
-#define DATETIME_XOFFSET_2 (1 << 10)
+#define DATETIME_FRAME (1 << 9)
+
+#define DATETIME_XOFFSET_1 (1 << 10)
+#define DATETIME_XOFFSET_2 (1 << 11)
#define DATETIME_DATE (DATETIME_DATE_YYYY | \
DATETIME_DATE_YY | \
{ &tape.text.time_mm, DATETIME_TIME_MM },
{ &tape.text.time_ss, DATETIME_TIME_SS },
+ { &tape.text.frame, DATETIME_FRAME },
+
{ NULL, DATETIME_NONE },
};
DrawText(xpos, ypos, s, pos->font);
}
+ else if ((type & DATETIME_FRAME) && (state & VIDEO_STATE_FRAME_ON))
+ {
+ DrawText(xpos, ypos, int2str(value, pos->size), pos->font);
+ }
}
}
{
DrawVideoDisplay_Graphics(state, value);
DrawVideoDisplay_DateTime(state, value);
-
- redraw_mask |= REDRAW_DOOR_2;
}
void DrawCompleteVideoDisplay()
DrawVideoDisplay(VIDEO_STATE_REC_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds);
+ DrawVideoDisplay(VIDEO_STATE_FRAME_ON, tape.length_frames);
if (tape.pausing)
DrawVideoDisplay(VIDEO_STATE_PAUSE_ON, 0);
DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+ DrawVideoDisplay(VIDEO_STATE_FRAME_ON, 0);
if (tape.pausing)
DrawVideoDisplay(VIDEO_STATE_PAUSE_ON, 0);
{
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds);
+ DrawVideoDisplay(VIDEO_STATE_FRAME_ON, tape.length_frames);
}
BlitBitmap(drawto, bitmap_db_door_2, gfx.vx, gfx.vy, gfx.vxsize, gfx.vysize,
tape.counter = 0;
tape.length = 0;
+ tape.length_frames = 0;
tape.length_seconds = 0;
if (leveldir_current)
DrawVideoDisplay(VIDEO_STATE_REC_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+ DrawVideoDisplay(VIDEO_STATE_FRAME_ON, 0);
MapTapeWarpButton();
tape.pos[tape.counter].delay = 0;
tape.length = tape.counter;
- tape.length_seconds = GetTapeLength();
+ tape.length_frames = GetTapeLengthFrames();
+ tape.length_seconds = GetTapeLengthSeconds();
}
void TapeStopRecording()
TapeAppendRecording();
- if (!CheckEngineSnapshot())
- SaveEngineSnapshot();
+ if (!CheckEngineSnapshotSingle())
+ SaveEngineSnapshotSingle();
+
+ // restart step/move snapshots after quick loading tape
+ SaveEngineSnapshotToListInitial();
}
}
+
+ if (game_status == GAME_MODE_PLAYING && CheckEngineSnapshotList())
+ {
+ if (tape.pausing)
+ MapUndoRedoButtons();
+ else if (!tape.single_step)
+ UnmapUndoRedoButtons();
+ }
}
void TapeStartPlaying()
DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+ DrawVideoDisplay(VIDEO_STATE_FRAME_ON, 0);
MapTapeWarpButton();
{
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, tape.length_seconds);
+ DrawVideoDisplay(VIDEO_STATE_FRAME_ON, tape.length_frames);
}
}
-unsigned int GetTapeLength()
+unsigned int GetTapeLengthFrames()
{
- unsigned int tape_length = 0;
+ unsigned int tape_length_frames = 0;
int i;
if (TAPE_IS_EMPTY(tape))
return(0);
for (i = 0; i < tape.length; i++)
- tape_length += tape.pos[i].delay;
+ tape_length_frames += tape.pos[i].delay;
- return(tape_length * GAME_FRAME_DELAY / 1000);
+ return tape_length_frames;
+}
+
+unsigned int GetTapeLengthSeconds()
+{
+ return (GetTapeLengthFrames() * GAME_FRAME_DELAY / 1000);
}
static void TapeStartWarpForward()
}
if (SaveTapeChecked(tape.level_nr))
- SaveEngineSnapshot();
+ SaveEngineSnapshotSingle();
}
void TapeQuickLoad()
if (game_status != GAME_MODE_PLAYING && game_status != GAME_MODE_MAIN)
return;
- if (CheckEngineSnapshot())
+ if (CheckEngineSnapshotSingle())
{
TapeStartGamePlaying();
- LoadEngineSnapshot();
+ LoadEngineSnapshotSingle();
DrawCompleteVideoDisplay();
TapeStopWarpForward();
TapeAppendRecording();
+ // restart step/move snapshots after quick loading tape
+ SaveEngineSnapshotToListInitial();
+
if (FrameCounter > 0)
return;
}
static struct
{
int graphic;
- struct Rect *pos;
+ struct XY *pos;
int gadget_id;
char *infotext;
} tapebutton_info[NUM_TAPE_BUTTONS] =
for (i = 0; i < NUM_TAPE_BUTTONS; i++)
{
struct GraphicInfo *gfx = &graphic_info[tapebutton_info[i].graphic];
- struct Rect *pos = tapebutton_info[i].pos;
+ struct XY *pos = tapebutton_info[i].pos;
struct GadgetInfo *gi;
int gd_x = gfx->src_x;
int gd_y = gfx->src_y;
for (i = 0; i < NUM_TAPE_BUTTONS; i++)
UnmapGadget(tape_gadget[i]);
+
+ if (tape.show_game_buttons)
+ UnmapGameButtons();
}
static void HandleTapeButtonsExt(int id)
break;
case TAPE_CTRL_ID_PLAY:
+ if (tape.recording && tape.pausing) /* PAUSE -> RECORD */
+ {
+ // ("TAPE_IS_EMPTY(tape)" is TRUE here -- probably fix this)
+
+ TapeTogglePause(TAPE_TOGGLE_MANUAL);
+ }
+
if (TAPE_IS_EMPTY(tape))
break;