- // redraw game element on the cave field the element is moving from
- blit_bitmap(tile_bitmap_from, dest, g_from->src_x, g_from->src_y, cell_size, cell_size,
- sx + dx * cell_size, sy + dy * cell_size);
+ struct GraphicInfo_BD *g = &graphic_info_bd_object[tile_from][frame];
+ Bitmap *tile_bitmap = gd_get_tile_bitmap(g->bitmap);
+ int dx = (dir_from == GD_MV_LEFT ? -1 : dir_from == GD_MV_RIGHT ? +1 : 0);
+ int dy = (dir_from == GD_MV_UP ? -1 : dir_from == GD_MV_DOWN ? +1 : 0);
+ int xsize = (dx != 0 ? shift : cell_size);
+ int ysize = (dy != 0 ? shift : cell_size);
+ int gx = g->src_x + (dx < 0 ? cell_size - shift : 0);
+ int gy = g->src_y + (dy < 0 ? cell_size - shift : 0);
+ int tx = sx + (dx < 0 ? 0 : dx > 0 ? cell_size - shift : 0);
+ int ty = sy + (dy < 0 ? 0 : dy > 0 ? cell_size - shift : 0);
+
+ if (el_walkable(tile))
+ blit_bitmap = BlitBitmapMasked;
+
+ blit_bitmap(tile_bitmap, dest, gx, gy, xsize, ysize, tx, ty);
+
+ // when using dynamic scheduling (mainly BD1 levels), redraw tile in next frame
+ game->gfx_buffer[y][x] |= GD_REDRAW;
+ }
+
+ // ---------- 3rd step: draw element that is moving towards this tile ----------
+
+ if (is_moving_to)
+ {
+ struct GraphicInfo_BD *g = &graphic_info_bd_object[tile_to][frame];
+ Bitmap *tile_bitmap = gd_get_tile_bitmap(g->bitmap);
+ int dx = (dir_to == GD_MV_LEFT ? +1 : dir_to == GD_MV_RIGHT ? -1 : 0);
+ int dy = (dir_to == GD_MV_UP ? +1 : dir_to == GD_MV_DOWN ? -1 : 0);
+ int xsize = (dx != 0 ? cell_size - shift : cell_size);
+ int ysize = (dy != 0 ? cell_size - shift : cell_size);
+ int gx = g->src_x + (dx < 0 ? shift : 0);
+ int gy = g->src_y + (dy < 0 ? shift : 0);
+ int tx = sx + (dx < 0 ? 0 : dx > 0 ? shift : 0);
+ int ty = sy + (dy < 0 ? 0 : dy > 0 ? shift : 0);
+
+ if (is_moving_from)
+ blit_bitmap = BlitBitmapMasked;
+
+ blit_bitmap(tile_bitmap, dest, gx, gy, xsize, ysize, tx, ty);
+
+ // when using dynamic scheduling (mainly BD1 levels), redraw tile in next frame
+ game->gfx_buffer[y][x] |= GD_REDRAW;