rnd-20050314-1-src
[rocksndiamonds.git] / src / game_em / graphics.c
index bc8092e4524c4f0b666ab8828115cbee57a4e3fa..06f974a2e935777387583b68373e7897e55b2ff6 100644 (file)
@@ -22,51 +22,56 @@ static unsigned int crumbled_state[MAX_BUF_YSIZE][MAX_BUF_XSIZE];
  * perhaps use mit-shm to speed this up
  */
 
-void blitscreen(void)
+void BlitScreenToBitmap_EM(Bitmap *target_bitmap)
 {
   unsigned int x = screen_x % (MAX_BUF_XSIZE * TILEX);
   unsigned int y = screen_y % (MAX_BUF_YSIZE * TILEY);
 
   if (x < 2 * TILEX && y < 2 * TILEY)
   {
-    BlitBitmap(screenBitmap, window, x, y,
+    BlitBitmap(screenBitmap, target_bitmap, x, y,
               SCR_FIELDX * TILEX, SCR_FIELDY * TILEY, SX, SY);
   }
   else if (x < 2 * TILEX && y >= 2 * TILEY)
   {
-    BlitBitmap(screenBitmap, window, x, y,
+    BlitBitmap(screenBitmap, target_bitmap, x, y,
               SCR_FIELDX * TILEX, MAX_BUF_YSIZE * TILEY - y,
               SX, SY);
-    BlitBitmap(screenBitmap, window, x, 0,
+    BlitBitmap(screenBitmap, target_bitmap, x, 0,
               SCR_FIELDX * TILEX, y - 2 * TILEY,
               SX, SY + MAX_BUF_YSIZE * TILEY - y);
   }
   else if (x >= 2 * TILEX && y < 2 * TILEY)
   {
-    BlitBitmap(screenBitmap, window, x, y,
+    BlitBitmap(screenBitmap, target_bitmap, x, y,
               MAX_BUF_XSIZE * TILEX - x, SCR_FIELDY * TILEY,
               SX, SY);
-    BlitBitmap(screenBitmap, window, 0, y,
+    BlitBitmap(screenBitmap, target_bitmap, 0, y,
               x - 2 * TILEX, SCR_FIELDY * TILEY,
               SX + MAX_BUF_XSIZE * TILEX - x, SY);
   }
   else
   {
-    BlitBitmap(screenBitmap, window, x, y,
+    BlitBitmap(screenBitmap, target_bitmap, x, y,
               MAX_BUF_XSIZE * TILEX - x, MAX_BUF_YSIZE * TILEY - y,
               SX, SY);
-    BlitBitmap(screenBitmap, window, 0, y,
+    BlitBitmap(screenBitmap, target_bitmap, 0, y,
               x - 2 * TILEX, MAX_BUF_YSIZE * TILEY - y,
               SX + MAX_BUF_XSIZE * TILEX - x, SY);
-    BlitBitmap(screenBitmap, window, x, 0,
+    BlitBitmap(screenBitmap, target_bitmap, x, 0,
               MAX_BUF_XSIZE * TILEX - x, y - 2 * TILEY,
               SX, SY + MAX_BUF_YSIZE * TILEY - y);
-    BlitBitmap(screenBitmap, window, 0, 0,
+    BlitBitmap(screenBitmap, target_bitmap, 0, 0,
               x - 2 * TILEX, y - 2 * TILEY,
               SX + MAX_BUF_XSIZE * TILEX - x, SY + MAX_BUF_YSIZE * TILEY - y);
   }
 }
 
+void blitscreen(void)
+{
+  BlitScreenToBitmap_EM(window);
+}
+
 static void DrawLevelField_EM(int x, int y, int sx, int sy,
                              boolean draw_masked)
 {
@@ -76,25 +81,27 @@ static void DrawLevelField_EM(int x, int y, int sx, int sy,
   int src_y = g->src_y + g->src_offset_y;
   int dst_x = sx * TILEX + g->dst_offset_x;
   int dst_y = sy * TILEY + g->dst_offset_y;
+  int width = g->width;
+  int height = g->height;
 
   if (draw_masked)
   {
-    if (g->width > 0 && g->height > 0)
+    if (width > 0 && height > 0)
     {
       SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
                    dst_x - src_x, dst_y - src_y);
       BlitBitmapMasked(g->bitmap, screenBitmap,
-                      src_x, src_y, g->width, g->height, dst_x, dst_y);
+                      src_x, src_y, width, height, dst_x, dst_y);
     }
   }
   else
   {
-    if (g->width != TILEX || g->height != TILEY)
+    if ((width != TILEX || height != TILEY) && !g->preserve_background)
       ClearRectangle(screenBitmap, sx * TILEX, sy * TILEY, TILEX, TILEY);
 
-    if (g->width > 0 && g->height > 0)
+    if (width > 0 && height > 0)
       BlitBitmap(g->bitmap, screenBitmap,
-                src_x, src_y, g->width, g->height, dst_x, dst_y);
+                src_x, src_y, width, height, dst_x, dst_y);
   }
 }
 
@@ -258,6 +265,7 @@ static void animscreen(void)
        }
       }
 
+      /* only redraw screen tiles if they (or their crumbled state) changed */
       if (screentiles[sy][sx] != obj || crumbled_state[sy][sx] != crm)
       {
        DrawLevelField_EM(x, y, sx, sy, FALSE);
@@ -303,11 +311,13 @@ static void blitplayer(struct PLAYER *ply)
     int old_sy = old_y % MAX_BUF_XSIZE;
     int new_sx = new_x % MAX_BUF_XSIZE;
     int new_sy = new_y % MAX_BUF_XSIZE;
+#if 0
     int old_crm = crumbled_state[old_sy][old_sx];
+#endif
     int new_crm = crumbled_state[new_sy][new_sx];
 
     /* only diggable elements can be crumbled in the classic EM engine */
-    boolean player_is_digging = (crumbled_state[new_sy][new_sx] != 0);
+    boolean player_is_digging = (new_crm != 0);
 
     x1 %= MAX_BUF_XSIZE * TILEX;
     y1 %= MAX_BUF_YSIZE * TILEY;
@@ -316,9 +326,11 @@ static void blitplayer(struct PLAYER *ply)
 
     if (player_is_digging)
     {
+#if 0
       /* draw the field the player is moving from (under the player) */
       DrawLevelField_EM(old_x, old_y, old_sx, old_sy, FALSE);
       DrawLevelFieldCrumbled_EM(old_x, old_y, old_sx, old_sy, old_crm, FALSE);
+#endif
 
       /* draw the field the player is moving to (under the player) */
       DrawLevelField_EM(new_x, new_y, new_sx, new_sy, FALSE);
@@ -326,6 +338,11 @@ static void blitplayer(struct PLAYER *ply)
 
       /* draw the player (masked) over the element he is just digging away */
       DrawLevelPlayer_EM(x1, y1, ply->num, ply->anim, TRUE);
+
+#if 1
+      /* draw the field the player is moving from (masked over the player) */
+      DrawLevelField_EM(old_x, old_y, old_sx, old_sy, TRUE);
+#endif
     }
     else
     {
@@ -362,11 +379,16 @@ void game_initscreen(void)
     }
   }
 
-  DrawGameDoorValues_EM(lev.required, ply1.dynamite, lev.score,
-                       DISPLAY_TIME(lev.time + 4));
+#if 1
+  DrawAllGameValues(lev.required, ply1.dynamite, lev.score,
+                   lev.time, ply1.keys | ply2.keys);
+#else
+  DrawAllGameValues(lev.required, ply1.dynamite, lev.score,
+                   DISPLAY_TIME(lev.time + 4), ply1.keys | ply2.keys);
+#endif
 }
 
-void game_animscreen(void)
+void RedrawPlayfield_EM()
 {
   unsigned int x,y;
 
@@ -395,3 +417,19 @@ void game_animscreen(void)
 
   FlushDisplay();
 }
+
+void game_animscreen(void)
+{
+  RedrawPlayfield_EM();
+}
+
+void DrawGameDoorValues_EM()
+{
+#if 1
+  DrawAllGameValues(lev.required, ply1.dynamite, lev.score,
+                   lev.time, ply1.keys | ply2.keys);
+#else
+  DrawAllGameValues(lev.required, ply1.dynamite, lev.score,
+                   DISPLAY_TIME(lev.time), ply1.keys | ply2.keys);
+#endif
+}