X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=8a8924e3c58646f4f34309a3eafad5e496dc6d1d;hb=8b1c89610ce8f31d4ff571b96811fa68f62a89c6;hp=6086cf25befdd3b1feaf61269286a47c2919b88a;hpb=fad52d7c153cd0947830fe96825fa185cf211324;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 6086cf25..8a8924e3 100644 --- a/src/tools.c +++ b/src/tools.c @@ -3039,6 +3039,17 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, BlitBitmap(bitmap, request.bitmap, sx, sy, xsize, ysize, 0, 0); + // create masked surface for request bitmap, if needed + if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + { + SDL_Surface *surface = request.bitmap->surface; + SDL_Surface *surface_masked = request.bitmap->surface_masked; + + SDLBlitSurface(surface, surface_masked, 0, 0, xsize, ysize, 0, 0); + SDL_SetColorKey(surface_masked, SET_TRANSPARENT_PIXEL, + SDL_MapRGB(surface_masked->format, 0x00, 0x00, 0x00)); + } + SDLFreeBitmapTextures(request.bitmap); SDLCreateBitmapTextures(request.bitmap); @@ -3052,11 +3063,15 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, void DrawEnvelopeRequestToScreen(int drawing_target) { if (global.use_envelope_request && - game.request_active_or_moving && + game.request_active && drawing_target == DRAW_TO_SCREEN) { - BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize, - request.sx, request.sy); + if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + BlitToScreenMasked(request.bitmap, 0, 0, request.xsize, request.ysize, + request.sx, request.sy); + else + BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize, + request.sx, request.sy); } } @@ -3127,8 +3142,9 @@ static void setRequestPosition(int *x, int *y, boolean add_border_size) setRequestPositionExt(x, y, request.width, request.height, add_border_size); } -static void DrawEnvelopeRequest(char *text) +static void DrawEnvelopeRequest(char *text, unsigned int req_state) { + DrawBuffer *drawto_last = drawto; char *text_final = text; char *text_door_style = NULL; int graphic = IMG_BACKGROUND_REQUEST; @@ -3153,7 +3169,7 @@ static void DrawEnvelopeRequest(char *text) int sx_offset = border_size; int sy_offset = border_size; int sx, sy; - int i, x, y; + int x, y; if (request.centered) sx_offset = (request.width - text_width) / 2; @@ -3187,7 +3203,10 @@ static void DrawEnvelopeRequest(char *text) setRequestPosition(&sx, &sy, FALSE); - ClearRectangle(backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE); + // draw complete envelope request to temporary bitmap + drawto = bitmap_db_store_1; + + ClearRectangle(drawto, sx, sy, width, height); for (y = 0; y < y_steps; y++) for (x = 0; x < x_steps; x++) @@ -3204,13 +3223,31 @@ static void DrawEnvelopeRequest(char *text) ResetFontStatus(); - for (i = 0; i < NUM_TOOL_BUTTONS; i++) - RedrawGadget(tool_gadget[i]); + if (req_state & REQ_ASK) + { + MapGadget(tool_gadget[TOOL_CTRL_ID_YES]); + MapGadget(tool_gadget[TOOL_CTRL_ID_NO]); + MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]); + MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]); + } + else if (req_state & REQ_CONFIRM) + { + MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]); + MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]); + } + else if (req_state & REQ_PLAYER) + { + MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]); + MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]); + MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]); + MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]); + } - // store readily prepared envelope request for later use when animating - BlitBitmap(backbuffer, bitmap_db_store_2, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); + // restore pointer to drawing buffer + drawto = drawto_last; - PrepareEnvelopeRequestToScreen(bitmap_db_store_2, sx, sy, width, height); + // prepare complete envelope request from temporary bitmap + PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy, width, height); if (text_door_style) free(text_door_style); @@ -3218,8 +3255,8 @@ static void DrawEnvelopeRequest(char *text) static void AnimateEnvelopeRequest(int anim_mode, int action) { - int graphic = IMG_BACKGROUND_REQUEST; - boolean draw_masked = graphic_info[graphic].draw_masked; + boolean game_just_ended = (game_status == GAME_MODE_PLAYING && + checkGameEnded()); int delay_value_normal = request.step_delay; int delay_value_fast = delay_value_normal / 2; boolean ffwd_delay = (tape.playing && tape.fast_forward); @@ -3268,11 +3305,12 @@ static void AnimateEnvelopeRequest(int anim_mode, int action) int dst_x, dst_y; int xx, yy; + if (game_just_ended) + HandleGameActions(); + setRequestPosition(&src_x, &src_y, FALSE); setRequestPositionExt(&dst_x, &dst_y, width, height, FALSE); - BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - for (yy = 0; yy < 2; yy++) { for (xx = 0; xx < 2; xx++) @@ -3284,16 +3322,15 @@ static void AnimateEnvelopeRequest(int anim_mode, int action) int xx_size = (xx ? tile_size : xsize_size_left); int yy_size = (yy ? tile_size : ysize_size_top); - if (draw_masked) - BlitBitmapMasked(bitmap_db_store_2, backbuffer, - src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy); - else - BlitBitmap(bitmap_db_store_2, backbuffer, - src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy); + // draw partial (animated) envelope request to temporary bitmap + BlitBitmap(bitmap_db_store_1, bitmap_db_store_2, + src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy); } } - PrepareEnvelopeRequestToScreen(backbuffer, dst_x, dst_y, width, height); + // prepare partial (animated) envelope request from temporary bitmap + PrepareEnvelopeRequestToScreen(bitmap_db_store_2, dst_x, dst_y, + width, height); redraw_mask |= REDRAW_FIELD; @@ -3316,44 +3353,12 @@ static void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL: anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode); - if (game_status == GAME_MODE_PLAYING) - BlitScreenToBitmap(backbuffer); - - SetDrawtoField(DRAW_TO_BACKBUFFER); - - // SetDrawBackgroundMask(REDRAW_NONE); - - if (action == ACTION_OPENING) - { - BlitBitmap(backbuffer, bitmap_db_store_1, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - - if (req_state & REQ_ASK) - { - MapGadget(tool_gadget[TOOL_CTRL_ID_YES]); - MapGadget(tool_gadget[TOOL_CTRL_ID_NO]); - MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]); - MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]); - } - else if (req_state & REQ_CONFIRM) - { - MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]); - MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]); - } - else if (req_state & REQ_PLAYER) - { - MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]); - MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]); - MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]); - MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]); - } - - DrawEnvelopeRequest(text); - } - game.envelope_active = TRUE; // needed for RedrawPlayfield() events if (action == ACTION_OPENING) { + DrawEnvelopeRequest(text, req_state); + PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE); if (anim_mode == ANIM_DEFAULT) @@ -3373,20 +3378,6 @@ static void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) } game.envelope_active = FALSE; - - if (action == ACTION_CLOSING) - BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); - - // SetDrawBackgroundMask(last_draw_background_mask); - - redraw_mask |= REDRAW_FIELD; - - BackToFront(); - - if (action == ACTION_CLOSING && - game_status == GAME_MODE_PLAYING && - level.game_engine_type == GAME_ENGINE_TYPE_RND) - SetDrawtoField(DRAW_TO_FIELDBUFFER); } static void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize) @@ -4518,12 +4509,6 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) int sx, sy; int result; - // when showing request dialog after game ended, deactivate game panel - if (game_just_ended) - game.panel.active = FALSE; - - game.request_active = TRUE; - setRequestPosition(&sx, &sy, FALSE); button_status = MB_RELEASED; @@ -4533,8 +4518,6 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) while (result < 0) { - boolean event_handled = FALSE; - if (game_just_ended) { SetDrawtoField(draw_buffer_game); @@ -4542,12 +4525,6 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) HandleGameActions(); SetDrawtoField(DRAW_TO_BACKBUFFER); - - if (global.use_envelope_request) - { - // copy current state of request area to middle of playfield area - BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy); - } } if (PendingEvent()) @@ -4556,14 +4533,13 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) while (NextValidEvent(&event)) { - event_handled = TRUE; - switch (event.type) { case EVENT_BUTTONPRESS: case EVENT_BUTTONRELEASE: case EVENT_MOTIONNOTIFY: { + DrawBuffer *drawto_last = drawto; int mx, my; if (event.type == EVENT_MOTIONNOTIFY) @@ -4586,9 +4562,25 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) button_status = MB_RELEASED; } + if (global.use_envelope_request) + { + // draw changed button states to temporary bitmap + drawto = bitmap_db_store_1; + } + // this sets 'request_gadget_id' HandleGadgets(mx, my, button_status); + if (global.use_envelope_request) + { + // restore pointer to drawing buffer + drawto = drawto_last; + + // prepare complete envelope request from temporary bitmap + PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy, + width, height); + } + switch (request_gadget_id) { case TOOL_CTRL_ID_YES: @@ -4812,27 +4804,11 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) } } - if (event_handled) - { - if (game_just_ended) - { - if (global.use_envelope_request) - { - // copy back current state of pressed buttons inside request area - BlitBitmap(drawto, bitmap_db_store_2, sx, sy, width, height, sx, sy); - } - } - - PrepareEnvelopeRequestToScreen(drawto, sx, sy, width, height); - } - BackToFront(); } SetDrawtoField(draw_buffer_last); - game.request_active = FALSE; - return result; } @@ -5107,10 +5083,16 @@ static boolean RequestEnvelope(char *text, unsigned int req_state) boolean Request(char *text, unsigned int req_state) { + boolean game_just_ended = (game_status == GAME_MODE_PLAYING && + checkGameEnded()); boolean overlay_enabled = GetOverlayEnabled(); boolean result; - game.request_active_or_moving = TRUE; + // when showing request dialog after game ended, deactivate game panel + if (game_just_ended) + game.panel.active = FALSE; + + game.request_active = TRUE; SetOverlayEnabled(FALSE); @@ -5121,7 +5103,7 @@ boolean Request(char *text, unsigned int req_state) SetOverlayEnabled(overlay_enabled); - game.request_active_or_moving = FALSE; + game.request_active = FALSE; return result; }