}
/* ----------------------------------------------------------------------- */
- /* 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)
{
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 */
{