From a1bc27d0855dc6fa72c4c361fc1671b2dcc6547b Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sun, 31 Mar 2002 04:00:13 +0200 Subject: [PATCH] rnd-20020331-1-src --- src/events.c | 33 +------ src/game.c | 15 ++- src/libgame/system.c | 28 ++++++ src/libgame/system.h | 3 + src/main.h | 1 + src/screens.c | 1 + src/tape.c | 230 +++++++++++++++---------------------------- src/tape.h | 4 +- src/tools.c | 49 ++++++++- src/tools.h | 1 + 10 files changed, 168 insertions(+), 197 deletions(-) diff --git a/src/events.c b/src/events.c index ccab40ee..4bf6da2d 100644 --- a/src/events.c +++ b/src/events.c @@ -222,38 +222,7 @@ void SleepWhileUnmapped() 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=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 } diff --git a/src/game.c b/src/game.c index c0d43b8b..c8fadba4 100644 --- a/src/game.c +++ b/src/game.c @@ -802,6 +802,7 @@ void InitGame() 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; @@ -4379,6 +4380,9 @@ void GameActions() 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); @@ -4413,11 +4417,6 @@ void GameActions() if (tape.pausing) return; - if (tape.playing) - TapePlayDelay(); - else if (tape.recording) - TapeRecordDelay(); - recorded_player_action = (tape.playing ? TapePlayAction() : NULL); for (i=0; imove_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 @@ -5830,7 +5829,7 @@ int DigField(struct PlayerInfo *player, 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 @@ -6072,7 +6071,7 @@ int DigField(struct PlayerInfo *player, 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 diff --git a/src/libgame/system.c b/src/libgame/system.c index f5125c61..497f7e0b 100644 --- a/src/libgame/system.c +++ b/src/libgame/system.c @@ -157,6 +157,8 @@ void InitGfxFieldInfo(int sx, int sy, int sxsize, int sysize, 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) @@ -182,6 +184,11 @@ void InitGfxScrollbufferInfo(int scrollbuffer_width, int scrollbuffer_height) gfx.scrollbuffer_height = scrollbuffer_height; } +void SetDrawDeactivationMask(int draw_deactivation_mask) +{ + gfx.draw_deactivation_mask = draw_deactivation_mask; +} + /* ========================================================================= */ /* video functions */ @@ -318,11 +325,26 @@ inline void CloseWindow(DrawWindow *window) #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); @@ -334,6 +356,9 @@ inline void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap, 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 @@ -380,6 +405,9 @@ inline void BlitBitmapMasked(Bitmap *src_bitmap, Bitmap *dst_bitmap, 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); diff --git a/src/libgame/system.h b/src/libgame/system.h index c0fb030b..1416f231 100644 --- a/src/libgame/system.h +++ b/src/libgame/system.h @@ -238,6 +238,8 @@ struct GfxInfo int vx, vy; int vxsize, vysize; + + boolean draw_deactivation_mask; }; struct ArtworkInfo @@ -384,6 +386,7 @@ void InitGfxFieldInfo(int, int, int, int, int, int, int, int); 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); diff --git a/src/main.h b/src/main.h index eb67ec1f..c2c9346c 100644 --- a/src/main.h +++ b/src/main.h @@ -302,6 +302,7 @@ struct TapeInfo 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; diff --git a/src/screens.c b/src/screens.c index 0f313c85..b9b7c5dd 100644 --- a/src/screens.c +++ b/src/screens.c @@ -125,6 +125,7 @@ void DrawMainMenu() FadeSounds(); KeyboardAutoRepeatOn(); ActivateJoystickIfAvailable(); + SetDrawDeactivationMask(REDRAW_NONE); /* needed if last screen was the playing screen, invoked from level editor */ if (level_editor_test_game) diff --git a/src/tape.c b/src/tape.c index 44bbc57b..efa95156 100644 --- a/src/tape.c +++ b/src/tape.c @@ -22,12 +22,13 @@ /* 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 *); @@ -305,6 +306,7 @@ void TapeStartRecording() 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_TAPELEN-1) - { - TapeStopRecording(); - return; - } - for(i=0; i= MAX_TAPELEN) - { - TapeStopRecording(); - return; - } - - tape.pos[tape.counter].delay++; - - if (tape.pos[tape.counter].delay >= 255) - { - for(i=0; i= tape.length) - { - TapeStop(); - return(NULL); - } - - if (tape.delay_played == tape.pos[tape.counter].delay) - { - tape.delay_played = 0; - tape.counter++; - - for(i=0; i= tape.length) + { + tape.index_search = FALSE; + + SetDrawDeactivationMask(REDRAW_NONE); + RedrawPlayfield(TRUE, 0,0,0,0); + + TapeTogglePause(); + return NULL; + } + } + if (tape.counter >= tape.length) { TapeStop(); @@ -559,53 +489,6 @@ byte *TapePlayAction() 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() { @@ -648,6 +531,7 @@ unsigned int GetTapeLength() #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) @@ -665,6 +549,11 @@ static struct 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, @@ -705,6 +594,12 @@ void CreateTapeButtons() 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, @@ -726,12 +621,28 @@ void CreateTapeButtons() } } +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= 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; @@ -89,7 +134,7 @@ void BackToFront() 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) @@ -250,7 +295,7 @@ void BackToFront() for(y=0; y