rnd-20030417-3-src
[rocksndiamonds.git] / src / tools.c
index b29cb819122cbc032a244d5f96c1f78151120222..ab66bdf21921c5f72f565bc67fea60ec5f2cafbb 100644 (file)
@@ -745,16 +745,20 @@ void DrawPlayer(struct PlayerInfo *player)
   }
 
   /* ----------------------------------------------------------------------- */
-  /* draw elements that stay over the player                                 */
+  /* draw elements the player is just walking/passing through/under          */
   /* ----------------------------------------------------------------------- */
 
   /* handle the field the player is leaving ... */
-  if (player_is_moving && IS_OVER_PLAYER(last_element))
+  if (player_is_moving && IS_ACCESSIBLE_INSIDE(last_element))
     DrawLevelField(last_jx, last_jy);
+  else if (player_is_moving && IS_ACCESSIBLE_UNDER(last_element))
+    DrawLevelFieldThruMask(last_jx, last_jy);
 
   /* ... and the field the player is entering */
-  if (IS_OVER_PLAYER(element))
+  if (IS_ACCESSIBLE_INSIDE(element))
     DrawLevelField(jx, jy);
+  else if (IS_ACCESSIBLE_UNDER(element))
+    DrawLevelFieldThruMask(jx, jy);
 
   if (setup.direct_draw)
   {
@@ -779,13 +783,17 @@ void getGraphicSource(int graphic, int frame, Bitmap **bitmap, int *x, int *y)
 
   if (g->offset_y == 0)                /* frames are ordered horizontally */
   {
-    *x = g->src_x + (frame % g->anim_frames_per_line) * g->offset_x;
-    *y = g->src_y + (frame / g->anim_frames_per_line) * g->height;
+    int max_width = g->anim_frames_per_line * g->width;
+
+    *x = (g->src_x + frame * g->offset_x) % max_width;
+    *y = g->src_y + (g->src_x + frame * g->offset_x) / max_width * g->height;
   }
   else if (g->offset_x == 0)   /* frames are ordered vertically */
   {
-    *x = g->src_x + (frame / g->anim_frames_per_line) * g->width;
-    *y = g->src_y + (frame % g->anim_frames_per_line) * g->offset_y;
+    int max_height = g->anim_frames_per_line * g->height;
+
+    *x = g->src_x + (g->src_y + frame * g->offset_y) / max_height * g->width;
+    *y = (g->src_y + frame * g->offset_y) % max_height;
   }
   else                         /* frames are ordered diagonally */
   {