X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=4cf1c874b3a8ca3a00c59ab75a24d21b3e0ec460;hb=796d6b9d718fe6b0abc4ef736f5b61eda464f067;hp=be46e0211fc126d8e229b777bb7ef61c42b4a897;hpb=fdd2829c52e8f4ec204e089b5d35ed5aef50e4e6;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index be46e021..4cf1c874 100644 --- a/src/tools.c +++ b/src/tools.c @@ -241,8 +241,6 @@ void SetDrawtoField(int mode) BY1 = -2; BX2 = SCR_FIELDX + 1; BY2 = SCR_FIELDY + 1; - redraw_x1 = 2; - redraw_y1 = 2; drawto_field = fieldbuffer; } @@ -254,8 +252,6 @@ void SetDrawtoField(int mode) BY1 = 0; BX2 = SCR_FIELDX - 1; BY2 = SCR_FIELDY - 1; - redraw_x1 = 0; - redraw_y1 = 0; drawto_field = backbuffer; } @@ -358,9 +354,8 @@ void DrawMaskedBorder(int redraw_mask) } } -static void BlitScreenToBitmap_RND(Bitmap *target_bitmap) +void BlitScreenToBitmap_RND(Bitmap *target_bitmap) { - DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field); int fx = FX, fy = FY; int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0); int full_lev_fieldy = lev_fieldy + (BorderElement != EL_EMPTY ? 2 : 0); @@ -414,23 +409,7 @@ static void BlitScreenToBitmap_RND(Bitmap *target_bitmap) fy = 2 * TILEY_VAR - (EVEN(lev_fieldy) ? TILEY_VAR / 2 : 0); } - if (border.draw_masked[GAME_MODE_PLAYING]) - { - if (buffer != backbuffer) - { - /* copy playfield buffer to backbuffer to add masked border */ - BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); - DrawMaskedBorder(REDRAW_FIELD); - } - - BlitBitmap(backbuffer, target_bitmap, - REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, - REAL_SX, REAL_SY); - } - else - { - BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); - } + BlitBitmap(drawto_field, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); } void BlitScreenToBitmap(Bitmap *target_bitmap) @@ -443,15 +422,10 @@ void BlitScreenToBitmap(Bitmap *target_bitmap) BlitScreenToBitmap_RND(target_bitmap); } -void BackToFront() +void BackToFront_OLD() { - int x, y; DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field); - // never redraw single tiles, always redraw the whole field - if (redraw_mask & REDRAW_TILES) - redraw_mask |= REDRAW_FIELD; - #if 0 /* !!! TEST ONLY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ /* (force full redraw) */ @@ -459,9 +433,6 @@ void BackToFront() redraw_mask |= REDRAW_FIELD; #endif - if (redraw_mask & REDRAW_FIELD) - redraw_mask &= ~REDRAW_TILES; - if (redraw_mask == REDRAW_NONE) return; @@ -471,8 +442,6 @@ void BackToFront() printf("[REDRAW_ALL]"); if (redraw_mask & REDRAW_FIELD) printf("[REDRAW_FIELD]"); - if (redraw_mask & REDRAW_TILES) - printf("[REDRAW_TILES]"); if (redraw_mask & REDRAW_DOOR_1) printf("[REDRAW_DOOR_1]"); if (redraw_mask & REDRAW_DOOR_2) @@ -482,11 +451,6 @@ void BackToFront() printf(" [%d]\n", FrameCounter); #endif - if (redraw_mask & REDRAW_TILES && - game_status == GAME_MODE_PLAYING && - border.draw_masked[GAME_MODE_PLAYING]) - redraw_mask |= REDRAW_FIELD; - if (global.fps_slowdown && game_status == GAME_MODE_PLAYING) { static boolean last_frame_skipped = FALSE; @@ -591,10 +555,20 @@ void BackToFront() DrawTextExt(window, SX + SXSIZE + SX, 0, text, FONT_TEXT_2, BLIT_OPAQUE); } - for (x = 0; x < MAX_BUF_XSIZE; x++) - for (y = 0; y < MAX_BUF_YSIZE; y++) - redraw[x][y] = 0; - redraw_tiles = 0; + redraw_mask = REDRAW_NONE; +} + +void BackToFront() +{ + if (redraw_mask == REDRAW_NONE) + return; + + // draw masked border to all viewports, if defined + DrawMaskedBorder(redraw_mask); + + // blit backbuffer to visible screen + BlitBitmap(backbuffer, window, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + redraw_mask = REDRAW_NONE; } @@ -890,14 +864,7 @@ void ClearField() void MarkTileDirty(int x, int y) { - int xx = redraw_x1 + x; - int yy = redraw_y1 + y; - - if (!redraw[xx][yy]) - redraw_tiles++; - - redraw[xx][yy] = TRUE; - redraw_mask |= REDRAW_TILES; + redraw_mask |= REDRAW_FIELD; } void SetBorderElement() @@ -2149,13 +2116,25 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } -static void setRequestPosition(int *x, int *y, boolean add_border_size) +static void setRequestCenterPosition(int *x, int *y) { - int border_size = request.border_size; int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2); int sy_center = (request.y != -1 ? request.y : SY + SYSIZE / 2); - int sx = sx_center - request.width / 2; - int sy = sy_center - request.height / 2; + + *x = sx_center; + *y = sy_center; +} + +static void setRequestPosition(int *x, int *y, boolean add_border_size) +{ + int border_size = request.border_size; + int sx_center, sy_center; + int sx, sy; + + setRequestCenterPosition(&sx_center, &sy_center); + + sx = sx_center - request.width / 2; + sy = sy_center - request.height / 2; if (add_border_size) { @@ -2294,18 +2273,22 @@ void AnimateEnvelopeRequest(int anim_mode, int action) int y = ystart + i * ystep; int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2; int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2; - int sx_center = (request.x != -1 ? request.x : SX + SXSIZE / 2); - int sy_center = (request.y != -1 ? request.y : SY + SYSIZE / 2); - int src_x = sx_center - width / 2; - int src_y = sy_center - height / 2; - int dst_x = sx_center - xsize * tile_size / 2; - int dst_y = sy_center - ysize * tile_size / 2; int xsize_size_left = (xsize - 1) * tile_size; int ysize_size_top = (ysize - 1) * tile_size; int max_xsize_pos = (max_xsize - 1) * tile_size; int max_ysize_pos = (max_ysize - 1) * tile_size; + int sx_center, sy_center; + int src_x, src_y; + int dst_x, dst_y; int xx, yy; + setRequestCenterPosition(&sx_center, &sy_center); + + src_x = sx_center - width / 2; + src_y = sy_center - height / 2; + dst_x = sx_center - xsize * tile_size / 2; + dst_y = sy_center - ysize * tile_size / 2; + BlitBitmap(bitmap_db_store, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); for (yy = 0; yy < 2; yy++) @@ -3306,9 +3289,15 @@ void WaitForEventToContinue() static int RequestHandleEvents(unsigned int req_state) { + boolean level_solved = (game_status == GAME_MODE_PLAYING && + local_player->LevelSolved_GameEnd); int last_game_status = game_status; /* save current game status */ + int width = request.width; + int height = request.height; + int sx, sy; int result; - int mx, my; + + setRequestPosition(&sx, &sy, FALSE); button_status = MB_RELEASED; @@ -3317,6 +3306,21 @@ static int RequestHandleEvents(unsigned int req_state) while (result < 0) { + if (level_solved) + { + SetDrawtoField(DRAW_FIELDBUFFER); + + HandleGameActions(); + + SetDrawtoField(DRAW_BACKBUFFER); + + if (global.use_envelope_request) + { + /* copy current state of request area to middle of playfield area */ + BlitBitmap(bitmap_db_cross, drawto, sx, sy, width, height, sx, sy); + } + } + if (PendingEvent()) { Event event; @@ -3329,11 +3333,10 @@ static int RequestHandleEvents(unsigned int req_state) case EVENT_BUTTONRELEASE: case EVENT_MOTIONNOTIFY: { + int mx, my; + if (event.type == EVENT_MOTIONNOTIFY) { - if (!PointerInWindow(window)) - continue; /* window and pointer on different screens */ - if (!button_status) continue; @@ -3437,9 +3440,13 @@ static int RequestHandleEvents(unsigned int req_state) result = 0; } - if (game_status == GAME_MODE_PLAYING && local_player->LevelSolved_GameEnd) + if (level_solved) { - HandleGameActions(); + if (global.use_envelope_request) + { + /* copy back current state of pressed buttons inside request area */ + BlitBitmap(drawto, bitmap_db_cross, sx, sy, width, height, sx, sy); + } } else {