fixed invisible envelope request if request background is masked
[rocksndiamonds.git] / src / tools.c
index c1605b4397cac8c50d59d692dbe3f23eaf0e2ad2..eb039fdd0fe836f9273cec8a7a0e4cf94a90825c 100644 (file)
@@ -634,6 +634,10 @@ void DrawMaskedBorderToTarget(int draw_target)
       gfx.masked_border_bitmap_ptr = gfx.fade_bitmap_target;
     }
 
+    // always use global border for PLAYING when restarting the game
+    if (global.border_status == GAME_MODE_PSEUDO_RESTARTING)
+      global.border_status = GAME_MODE_PLAYING;
+
     DrawMaskedBorderExt(REDRAW_ALL, draw_target);
 
     global.border_status = last_border_status;
@@ -976,6 +980,10 @@ static void SetScreenStates_BeforeFadingOut(void)
 static void SetScreenStates_AfterFadingOut(void)
 {
   global.border_status = game_status;
+
+  // always use global border for PLAYING when restarting the game
+  if (global.border_status == GAME_MODE_PSEUDO_RESTARTING)
+    global.border_status = GAME_MODE_PLAYING;
 }
 
 void FadeIn(int fade_mask)
@@ -3011,8 +3019,7 @@ void ShowEnvelope(int envelope_nr)
 static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy,
                                           int xsize, int ysize)
 {
-  if (!global.use_envelope_request ||
-      request.sort_priority <= 0)
+  if (!global.use_envelope_request)
     return;
 
   if (request.bitmap == NULL ||
@@ -3032,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);
 
@@ -3042,16 +3060,18 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy,
   request.ysize = ysize;
 }
 
-void DrawEnvelopeRequestToScreen(int drawing_target, int drawing_stage)
+void DrawEnvelopeRequestToScreen(int drawing_target)
 {
   if (global.use_envelope_request &&
       game.request_active_or_moving &&
-      request.sort_priority > 0 &&
-      drawing_target == DRAW_TO_SCREEN &&
-      drawing_stage == DRAW_GLOBAL_ANIM_STAGE_2)
+      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);
   }
 }
 
@@ -3205,6 +3225,24 @@ static void DrawEnvelopeRequest(char *text)
   // store readily prepared envelope request for later use when animating
   BlitBitmap(backbuffer, bitmap_db_store_2, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
 
+  // create masked surface for request bitmap, if needed
+  if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked)
+  {
+    if (bitmap_db_store_2->surface_masked == NULL)
+    {
+      if ((bitmap_db_store_2->surface_masked =
+          SDLGetNativeSurface(bitmap_db_store_2->surface)) == NULL)
+       Fail("SDLGetNativeSurface() failed");
+    }
+
+    SDL_Surface *surface        = bitmap_db_store_2->surface;
+    SDL_Surface *surface_masked = bitmap_db_store_2->surface_masked;
+
+    SDLBlitSurface(surface, surface_masked, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+    SDL_SetColorKey(surface_masked, SET_TRANSPARENT_PIXEL,
+                   SDL_MapRGB(surface_masked->format, 0x00, 0x00, 0x00));
+  }
+
   PrepareEnvelopeRequestToScreen(bitmap_db_store_2, sx, sy, width, height);
 
   if (text_door_style)
@@ -4541,7 +4579,10 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game)
       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 (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked)
+         BlitBitmapMasked(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy);
+       else
+         BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy);
       }
     }