rnd-20070331-1-src
[rocksndiamonds.git] / src / game_em / graphics.c
index 21ca0964ec8bfbeebc4bc190137ee2db6f07710d..68f1c297bf6dfae913ddef9b5c8b061ef5ba6db1 100644 (file)
@@ -27,6 +27,7 @@
                                  (8 - frame) * ply[p].y) * TILEY / 8   \
                                 - ((SCR_FIELDY - 1) * TILEY) / 2)
 
+#define USE_EXTENDED_GRAPHICS_ENGINE           0
 
 int frame;                     /* current screen frame */
 int screen_x;                  /* current scroll position */
@@ -148,6 +149,12 @@ static void DrawLevelField_EM(int x, int y, int sx, int sy,
 {
   int tile = Draw[y][x];
   struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
+
+#if USE_EXTENDED_GRAPHICS_ENGINE
+  getGraphicSourceObjectExt_EM(tile, frame, &g->bitmap, &g->src_x, &g->src_y,
+                              x - 2, y - 2);
+#endif
+
   int src_x = g->src_x + g->src_offset_x;
   int src_y = g->src_y + g->src_offset_y;
   int dst_x = sx * TILEX + g->dst_offset_x;
@@ -248,6 +255,11 @@ static void DrawLevelPlayer_EM(int x1, int y1, int player_nr, int anim,
 {
   struct GraphicInfo_EM *g = &graphic_info_em_player[player_nr][anim][frame];
 
+#if USE_EXTENDED_GRAPHICS_ENGINE
+  getGraphicSourcePlayerExt_EM(player_nr, anim, frame,
+                              &g->bitmap, &g->src_x, &g->src_y);
+#endif
+
   int src_x = g->src_x, src_y = g->src_y;
   int dst_x, dst_y;
 
@@ -357,7 +369,11 @@ static void animscreen(void)
       }
 
       /* only redraw screen tiles if they (or their crumbled state) changed */
+#if USE_EXTENDED_GRAPHICS_ENGINE
+      // if (screentiles[sy][sx] != obj || crumbled_state[sy][sx] != crm)
+#else
       if (screentiles[sy][sx] != obj || crumbled_state[sy][sx] != crm)
+#endif
       {
        DrawLevelField_EM(x, y, sx, sy, FALSE);
        DrawLevelFieldCrumbled_EM(x, y, sx, sy, crm, FALSE);
@@ -452,9 +468,14 @@ static void blitplayer(struct PLAYER *ply)
       DrawLevelField_EM(new_x, new_y, new_sx, new_sy, TRUE);
     }
 
-    /* mark screen tiles as dirty */
+    /* redraw screen tiles in the next frame (player may have left the tiles) */
     screentiles[old_sy][old_sx] = -1;
     screentiles[new_sy][new_sx] = -1;
+
+    /* mark screen tiles as dirty (force screen refresh with changed content) */
+    redraw[old_sx][old_sy] = TRUE;
+    redraw[new_sx][new_sy] = TRUE;
+    redraw_tiles += 2;
   }
 }
 
@@ -501,7 +522,7 @@ void DrawRelocatePlayer(struct PlayerInfo *player, boolean quick_relocation)
 
   if (quick_relocation)
   {
-    int offset = (setup.scroll_delay ? 3 : 0);
+    int offset = game.scroll_delay_value;
 
     if (!IN_VIS_FIELD(SCREENX(jx), SCREENY(jy)))
     {
@@ -705,7 +726,7 @@ void RedrawPlayfield_EM(boolean force_redraw)
   int player_nr = game_em.last_moving_player;
 #endif
   int stepsize = TILEX / 8;
-  int offset = (setup.scroll_delay ? 3 : 0) * TILEX;
+  int offset = game.scroll_delay_value * TILEX;
   int offset_x = offset;
   int offset_y = offset;
   int screen_x_old = screen_x;