void HandleExposeEvent(ExposeEvent *event)
{
#ifndef TARGET_SDL
- int x = event->x, y = event->y;
- int width = event->width, height = event->height;
-
- if (setup.direct_draw && game_status==PLAYING)
- {
- int xx,yy;
- int x1 = (x-SX)/TILEX, y1 = (y-SY)/TILEY;
- int x2 = (x-SX+width)/TILEX, y2 = (y-SY+height)/TILEY;
-
- SetDrawtoField(DRAW_BACKBUFFER);
-
- for(xx=0; xx<SCR_FIELDX; xx++)
- for(yy=0; yy<SCR_FIELDY; yy++)
- if (xx>=x1 && xx<=x2 && yy>=y1 && yy<=y2)
- DrawScreenField(xx,yy);
- DrawAllPlayers();
-
- SetDrawtoField(DRAW_DIRECT);
- }
-
- if (setup.soft_scrolling && game_status == PLAYING)
- {
- int fx = FX, fy = FY;
-
- fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0);
- fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0);
-
- BlitBitmap(fieldbuffer, backbuffer, fx,fy, SXSIZE,SYSIZE, SX,SY);
- }
-
- BlitBitmap(drawto, window, x,y, width,height, x,y);
-
+ RedrawPlayfield(FALSE, event->x, event->y, event->width, event->height);
FlushDisplay();
#endif
}
int2str(TimeLeft, 3), FS_SMALL, FC_YELLOW);
UnmapGameButtons();
+ UnmapTapeButtons();
game_gadget[SOUND_CTRL_ID_MUSIC]->checked = setup.sound_music;
game_gadget[SOUND_CTRL_ID_LOOPS]->checked = setup.sound_loops;
game_gadget[SOUND_CTRL_ID_SIMPLE]->checked = setup.sound_simple;
action_delay_value =
(tape.playing && tape.fast_forward ? FfwdFrameDelay : GameFrameDelay);
+ if (tape.playing && tape.index_search)
+ action_delay_value = 0;
+
/* ---------- main game synchronization point ---------- */
WaitUntilDelayReached(&action_delay, action_delay_value);
if (tape.pausing)
return;
- if (tape.playing)
- TapePlayDelay();
- else if (tape.recording)
- TapeRecordDelay();
-
recorded_player_action = (tape.playing ? TapePlayAction() : NULL);
for (i=0; i<MAX_PLAYERS; i++)
return FALSE;
#else
if (!FrameReached(&player->move_delay, player->move_delay_value) &&
- !(tape.playing && tape.file_version < FILE_VERSION_2_0))
+ !(tape.playing && tape.game_version < FILE_VERSION_2_0))
return FALSE;
#endif
return MF_NO_ACTION;
#else
if (!FrameReached(&player->push_delay, player->push_delay_value) &&
- !(tape.playing && tape.file_version < FILE_VERSION_2_0) &&
+ !(tape.playing && tape.game_version < FILE_VERSION_2_0) &&
element != EL_SPRING)
return MF_NO_ACTION;
#endif
return MF_NO_ACTION;
#else
if (!FrameReached(&player->push_delay, player->push_delay_value) &&
- !(tape.playing && tape.file_version < FILE_VERSION_2_0) &&
+ !(tape.playing && tape.game_version < FILE_VERSION_2_0) &&
element != EL_BALLOON)
return MF_NO_ACTION;
#endif
gfx.real_sy = real_sy;
gfx.full_sxsize = full_sxsize;
gfx.full_sysize = full_sysize;
+
+ SetDrawDeactivationMask(REDRAW_NONE); /* do not deactivate drawing */
}
void InitGfxDoor1Info(int dx, int dy, int dxsize, int dysize)
gfx.scrollbuffer_height = scrollbuffer_height;
}
+void SetDrawDeactivationMask(int draw_deactivation_mask)
+{
+ gfx.draw_deactivation_mask = draw_deactivation_mask;
+}
+
/* ========================================================================= */
/* video functions */
#endif
}
+inline boolean DrawingDeactivated(int x, int y, int width, int height)
+{
+ if (gfx.draw_deactivation_mask != REDRAW_NONE)
+ {
+ if ((gfx.draw_deactivation_mask & REDRAW_FIELD) &&
+ x < gfx.sx + gfx.sxsize)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
inline void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
int src_x, int src_y,
int width, int height,
int dst_x, int dst_y)
{
+ if (DrawingDeactivated(dst_x, dst_y, width, height))
+ return;
+
#ifdef TARGET_SDL
SDLCopyArea(src_bitmap, dst_bitmap,
src_x, src_y, width, height, dst_x, dst_y, SDLCOPYAREA_OPAQUE);
inline void ClearRectangle(Bitmap *bitmap, int x, int y, int width, int height)
{
+ if (DrawingDeactivated(x, y, width, height))
+ return;
+
#ifdef TARGET_SDL
SDLFillRectangle(bitmap, x, y, width, height, 0x000000);
#else
int width, int height,
int dst_x, int dst_y)
{
+ if (DrawingDeactivated(dst_x, dst_y, width, height))
+ return;
+
#ifdef TARGET_SDL
SDLCopyArea(src_bitmap, dst_bitmap,
src_x, src_y, width, height, dst_x, dst_y, SDLCOPYAREA_MASKED);
int vx, vy;
int vxsize, vysize;
+
+ boolean draw_deactivation_mask;
};
struct ArtworkInfo
void InitGfxDoor1Info(int, int, int, int);
void InitGfxDoor2Info(int, int, int, int);
void InitGfxScrollbufferInfo(int, int);
+void SetDrawDeactivationMask(int );
inline void InitVideoDisplay(void);
inline void CloseVideoDisplay(void);
boolean pause_before_death;
boolean recording, playing, pausing;
boolean fast_forward;
+ boolean index_search;
boolean changed;
boolean player_participates[MAX_PLAYERS];
int num_participating_players;
FadeSounds();
KeyboardAutoRepeatOn();
ActivateJoystickIfAvailable();
+ SetDrawDeactivationMask(REDRAW_NONE);
/* needed if last screen was the playing screen, invoked from level editor */
if (level_editor_test_game)
/* tape button identifiers */
#define TAPE_CTRL_ID_EJECT 0
-#define TAPE_CTRL_ID_STOP 1
-#define TAPE_CTRL_ID_PAUSE 2
-#define TAPE_CTRL_ID_RECORD 3
-#define TAPE_CTRL_ID_PLAY 4
+#define TAPE_CTRL_ID_INDEX 1
+#define TAPE_CTRL_ID_STOP 2
+#define TAPE_CTRL_ID_PAUSE 3
+#define TAPE_CTRL_ID_RECORD 4
+#define TAPE_CTRL_ID_PLAY 5
-#define NUM_TAPE_BUTTONS 5
+#define NUM_TAPE_BUTTONS 6
/* forward declaration for internal use */
static void HandleTapeButtons(struct GadgetInfo *);
tape.changed = TRUE;
tape.date = 10000*(zeit2->tm_year%100) + 100*zeit2->tm_mon + zeit2->tm_mday;
tape.random_seed = InitRND(NEW_RANDOMIZE);
+ tape.game_version = GAME_VERSION_ACTUAL;
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);
+ MapTapeIndexButton();
}
void TapeStopRecording()
{
-#if 0
- int i;
-#endif
-
if (!tape.recording)
return;
-#if 0
- for(i=0; i<MAX_PLAYERS; i++)
- tape.pos[tape.counter].action[i] = 0;
-#endif
-
tape.counter++;
tape.length = tape.counter;
tape.length_seconds = GetTapeLength();
tape.recording = FALSE;
tape.pausing = FALSE;
- DrawVideoDisplay(VIDEO_STATE_REC_OFF, 0);
-}
-
-#if 0
-void TapeRecordAction(byte joy[MAX_PLAYERS])
-{
- int i;
-
- if (!tape.recording || tape.pausing)
- return;
-
- if (tape.counter >= MAX_TAPELEN-1)
- {
- TapeStopRecording();
- return;
- }
- for(i=0; i<MAX_PLAYERS; i++)
- tape.pos[tape.counter].action[i] = joy[i];
-
- tape.counter++;
- tape.pos[tape.counter].delay = 0;
+ DrawVideoDisplay(VIDEO_STATE_REC_OFF, 0);
+ MapTapeEjectButton();
}
-#else
-
void TapeRecordAction(byte action[MAX_PLAYERS])
{
int i;
tape.pos[tape.counter].delay++;
}
}
-#endif
-
-#if 0
-void TapeRecordDelay()
-{
- int i;
-
- if (!tape.recording || tape.pausing)
- return;
-
- if (tape.counter >= MAX_TAPELEN)
- {
- TapeStopRecording();
- return;
- }
-
- tape.pos[tape.counter].delay++;
-
- if (tape.pos[tape.counter].delay >= 255)
- {
- for(i=0; i<MAX_PLAYERS; i++)
- tape.pos[tape.counter].action[i] = 0;
-
- tape.counter++;
- tape.pos[tape.counter].delay = 0;
- }
-}
-
-#else
-
-void TapeRecordDelay()
-{
-}
-#endif
void TapeTogglePause()
{
state |= VIDEO_STATE_PBEND_OFF;
DrawVideoDisplay(state, 0);
+
+ if (tape.index_search)
+ {
+ SetDrawDeactivationMask(REDRAW_NONE);
+ RedrawPlayfield(TRUE, 0,0,0,0);
+ }
}
void TapeStartPlaying()
tape.playing = TRUE;
tape.pausing = FALSE;
tape.fast_forward = FALSE;
+ tape.index_search = FALSE;
+
InitRND(tape.random_seed);
DrawVideoDisplay(VIDEO_STATE_PLAY_ON, 0);
DrawVideoDisplay(VIDEO_STATE_DATE_ON, tape.date);
DrawVideoDisplay(VIDEO_STATE_TIME_ON, 0);
+ MapTapeIndexButton();
}
void TapeStopPlaying()
tape.playing = FALSE;
tape.pausing = FALSE;
- DrawVideoDisplay(VIDEO_STATE_PLAY_OFF, 0);
-}
-
-#if 0
-byte *TapePlayAction()
-{
- static byte joy[MAX_PLAYERS];
- int i;
-
- if (!tape.playing || tape.pausing)
- return(NULL);
- if (tape.counter >= tape.length)
- {
- TapeStop();
- return(NULL);
- }
-
- if (tape.delay_played == tape.pos[tape.counter].delay)
- {
- tape.delay_played = 0;
- tape.counter++;
-
- for(i=0; i<MAX_PLAYERS; i++)
- joy[i] = tape.pos[tape.counter-1].action[i];
- }
- else
- {
- for(i=0; i<MAX_PLAYERS; i++)
- joy[i] = 0;
- }
-
- return(joy);
+ DrawVideoDisplay(VIDEO_STATE_PLAY_OFF, 0);
+ MapTapeEjectButton();
}
-#else
-
byte *TapePlayAction()
{
static byte action[MAX_PLAYERS];
}
}
+ if (tape.index_search)
+ {
+ if (tape.counter >= tape.length)
+ {
+ tape.index_search = FALSE;
+
+ SetDrawDeactivationMask(REDRAW_NONE);
+ RedrawPlayfield(TRUE, 0,0,0,0);
+
+ TapeTogglePause();
+ return NULL;
+ }
+ }
+
if (tape.counter >= tape.length)
{
TapeStop();
return action;
}
-#endif
-
-#if 0
-boolean TapePlayDelay()
-{
- if (!tape.playing || tape.pausing)
- return(FALSE);
-
- if (tape.pause_before_death) /* STOP 10s BEFORE PLAYER GETS KILLED... */
- {
- if (!(FrameCounter % 20))
- {
- if ((FrameCounter / 20) % 2)
- DrawVideoDisplay(VIDEO_STATE_PBEND_ON, VIDEO_DISPLAY_LABEL_ONLY);
- else
- DrawVideoDisplay(VIDEO_STATE_PBEND_OFF, VIDEO_DISPLAY_LABEL_ONLY);
- }
-
- if (TimePlayed > tape.length_seconds - TAPE_PAUSE_SECONDS_BEFORE_DEATH)
- {
- TapeTogglePause();
- return(FALSE);
- }
- }
-
- if (tape.counter >= tape.length)
- {
- TapeStop();
- return(TRUE);
- }
-
- if (tape.delay_played < tape.pos[tape.counter].delay)
- {
- tape.delay_played++;
- return(TRUE);
- }
- else
- return(FALSE);
-}
-
-#else
-
-boolean TapePlayDelay()
-{
- return TRUE|FALSE; /* ...it doesn't matter at all */
-}
-#endif
void TapeStop()
{
#define TAPE_BUTTON_YPOS 77
#define TAPE_BUTTON_EJECT_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE)
+#define TAPE_BUTTON_INDEX_XPOS (TAPE_BUTTON_XPOS + 0 * TAPE_BUTTON_XSIZE)
#define TAPE_BUTTON_STOP_XPOS (TAPE_BUTTON_XPOS + 1 * TAPE_BUTTON_XSIZE)
#define TAPE_BUTTON_PAUSE_XPOS (TAPE_BUTTON_XPOS + 2 * TAPE_BUTTON_XSIZE)
#define TAPE_BUTTON_RECORD_XPOS (TAPE_BUTTON_XPOS + 3 * TAPE_BUTTON_XSIZE)
TAPE_CTRL_ID_EJECT,
"eject tape"
},
+ {
+ TAPE_BUTTON_INDEX_XPOS, TAPE_BUTTON_YPOS,
+ TAPE_CTRL_ID_INDEX,
+ "index mark"
+ },
{
TAPE_BUTTON_STOP_XPOS, TAPE_BUTTON_YPOS,
TAPE_CTRL_ID_STOP,
gd_x2 = DOOR_GFX_PAGEX3 + gd_xoffset;
gd_y = DOOR_GFX_PAGEY2 + gd_yoffset;
+ if (i == TAPE_CTRL_ID_INDEX)
+ {
+ gd_x1 = DOOR_GFX_PAGEX6 + gd_xoffset;
+ gd_x2 = DOOR_GFX_PAGEX5 + gd_xoffset;
+ }
+
gi = CreateGadget(GDI_CUSTOM_ID, id,
GDI_INFO_TEXT, tapebutton_info[i].infotext,
GDI_X, VX + gd_xoffset,
}
}
+void MapTapeEjectButton()
+{
+ UnmapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]);
+ MapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]);
+}
+
+void MapTapeIndexButton()
+{
+ UnmapGadget(tape_gadget[TAPE_CTRL_ID_EJECT]);
+ MapGadget(tape_gadget[TAPE_CTRL_ID_INDEX]);
+}
+
void MapTapeButtons()
{
int i;
for (i=0; i<NUM_TAPE_BUTTONS; i++)
- MapGadget(tape_gadget[i]);
+ if (i != TAPE_CTRL_ID_INDEX)
+ MapGadget(tape_gadget[i]);
+
+ if (tape.recording || tape.playing)
+ MapTapeIndexButton();
}
void UnmapTapeButtons()
DrawCompleteVideoDisplay();
break;
+ case TAPE_CTRL_ID_INDEX:
+ if (tape.recording)
+ printf("Setting index mark ...\n");
+ else if (tape.playing)
+ {
+ printf("Going to index mark ...\n");
+
+ tape.index_search = TRUE;
+ SetDrawDeactivationMask(REDRAW_FIELD);
+ }
+ break;
+
case TAPE_CTRL_ID_STOP:
TapeStop();
break;
tape.playing = FALSE;
tape.recording = TRUE;
tape.changed = TRUE;
+ tape.game_version = GAME_VERSION_ACTUAL;
DrawVideoDisplay(VIDEO_STATE_PLAY_OFF | VIDEO_STATE_REC_ON,0);
}
void TapeStartRecording(void);
void TapeStopRecording(void);
void TapeRecordAction(byte *);
-void TapeRecordDelay(void);
void TapeTogglePause(void);
void TapeStartPlaying(void);
void TapeStopPlaying(void);
byte *TapePlayAction(void);
-boolean TapePlayDelay(void);
void TapeStop(void);
void TapeErase(void);
unsigned int GetTapeLength(void);
void CreateTapeButtons();
+void MapTapeEjectButton();
+void MapTapeIndexButton();
void MapTapeButtons();
void UnmapTapeButtons();
}
}
+void RedrawPlayfield(boolean force_redraw, int x, int y, int width, int height)
+{
+ if (game_status == PLAYING)
+ {
+ if (force_redraw)
+ {
+ x = gfx.sx - TILEX;
+ y = gfx.sy - TILEY;
+ width = gfx.sxsize + 2 * TILEX;
+ height = gfx.sysize + 2 * TILEY;
+ }
+
+ if (force_redraw || setup.direct_draw)
+ {
+ int xx, yy;
+ int x1 = (x - SX) / TILEX, y1 = (y - SY) / TILEY;
+ int x2 = (x - SX + width) / TILEX, y2 = (y - SY + height) / TILEY;
+
+ if (setup.direct_draw)
+ SetDrawtoField(DRAW_BACKBUFFER);
+
+ for(xx=BX1; xx<=BX2; xx++)
+ for(yy=BY1; yy<=BY2; yy++)
+ if (xx >= x1 && xx <= x2 && yy >= y1 && yy <= y2)
+ DrawScreenField(xx, yy);
+ DrawAllPlayers();
+
+ if (setup.direct_draw)
+ SetDrawtoField(DRAW_DIRECT);
+ }
+
+ if (setup.soft_scrolling)
+ {
+ int fx = FX, fy = FY;
+
+ fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0);
+ fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0);
+
+ BlitBitmap(fieldbuffer, backbuffer, fx,fy, SXSIZE,SYSIZE, SX,SY);
+ }
+ }
+
+ BlitBitmap(drawto, window, x, y, width, height, x, y);
+}
+
void BackToFront()
{
int x,y;
if (redraw_mask & REDRAW_FIELD)
redraw_mask &= ~REDRAW_TILES;
- if (!redraw_mask)
+ if (redraw_mask == REDRAW_NONE)
return;
if (global.fps_slowdown && game_status == PLAYING)
for(y=0; y<MAX_BUF_YSIZE; y++)
redraw[x][y] = 0;
redraw_tiles = 0;
- redraw_mask = 0;
+ redraw_mask = REDRAW_NONE;
}
void FadeToFront()
#define REQUEST_WAIT_FOR (REQ_ASK | REQ_CONFIRM | REQ_PLAYER)
void SetDrawtoField(int);
+void RedrawPlayfield(boolean, int, int, int, int);
void BackToFront();
void FadeToFront();
void ClearWindow();