player_x = game->cave->player_x - game->cave->x1; // cell coordinates of player
player_y = game->cave->player_y - game->cave->y1;
+ // when wrapping around to opposite level border, use faster scrolling
+ if (game->cave->player_x == game->cave->x1 ||
+ game->cave->player_x == game->cave->x2 ||
+ game->cave->player_y == game->cave->y1 ||
+ game->cave->player_y == game->cave->y2)
+ scroll_speed *= 4;
+
// pixel size of visible part of the cave (may be smaller in intermissions)
visible_x = (game->cave->x2 - game->cave->x1 + 1) * cell_size;
visible_y = (game->cave->y2 - game->cave->y1 + 1) * cell_size;
static Bitmap *gd_tile_bitmap_original = NULL;
static int scale_down_factor_last = -1;
+ if (program.headless)
+ return;
+
// check if tile bitmap has changed (different artwork or tile size selected)
if (bitmap != gd_tile_bitmap_original || scale_down_factor != scale_down_factor_last)
{
// redraw previous game element on the cave field the new element is moving to
int tile_last = game->last_element_buffer[y][x];
- // only redraw previous game element if it is not collectible (like dirt etc.)
- if (is_collectible(tile_last))
+ // only redraw previous game element if it is diggable (like dirt etc.)
+ if (!is_diggable(tile_last))
tile_last = O_SPACE;
struct GraphicInfo_BD *g_old = &graphic_info_bd_object[tile_last][frame];
else
{
// if old tile also moving (like pushing player), do not redraw tile background
- game->last_element_buffer[old_y][old_x] |= SKIPPED;
+ // (but redraw if tile and old tile are moving/falling into different directions)
+ if (game->dir_buffer[old_y][old_x] == game->dir_buffer[y][x])
+ game->last_element_buffer[old_y][old_x] |= SKIPPED;
}
}