gd_cave_map_free(game->element_buffer);
if (game->last_element_buffer)
gd_cave_map_free(game->last_element_buffer);
- if (game->dir_buffer)
- gd_cave_map_free(game->dir_buffer);
+ if (game->dir_buffer_from)
+ gd_cave_map_free(game->dir_buffer_from);
+ if (game->dir_buffer_to)
+ gd_cave_map_free(game->dir_buffer_to);
if (game->gfx_buffer)
gd_cave_map_free(game->gfx_buffer);
gd_cave_map_free(game->last_element_buffer);
game->last_element_buffer = NULL;
- // delete direction buffer
- if (game->dir_buffer)
- gd_cave_map_free(game->dir_buffer);
- game->dir_buffer = NULL;
+ // delete direction buffer (from)
+ if (game->dir_buffer_from)
+ gd_cave_map_free(game->dir_buffer_from);
+ game->dir_buffer_from = NULL;
+
+ // delete direction buffer (to)
+ if (game->dir_buffer_to)
+ gd_cave_map_free(game->dir_buffer_to);
+ game->dir_buffer_to = NULL;
// delete gfx buffer
if (game->gfx_buffer)
game->milliseconds_anim = 0;
game->milliseconds_game = 0; // set game timer to zero, too
+ game->cycle_counter = 0;
+
// create new element buffer
game->element_buffer = gd_cave_map_new(game->cave, int);
for (x = 0; x < game->cave->w; x++)
game->last_element_buffer[y][x] = O_NONE;
- // create new direction buffer
- game->dir_buffer = gd_cave_map_new(game->cave, int);
+ // create new direction buffer (from)
+ game->dir_buffer_from = gd_cave_map_new(game->cave, int);
+
+ for (y = 0; y < game->cave->h; y++)
+ for (x = 0; x < game->cave->w; x++)
+ game->dir_buffer_from[y][x] = GD_MV_STILL;
+
+ // create new direction buffer (to)
+ game->dir_buffer_to = gd_cave_map_new(game->cave, int);
for (y = 0; y < game->cave->h; y++)
for (x = 0; x < game->cave->w; x++)
- game->dir_buffer[y][x] = GD_MV_STILL;
+ game->dir_buffer_to[y][x] = GD_MV_STILL;
// create new gfx buffer
game->gfx_buffer = gd_cave_map_new(game->cave, int);
{
for (x = 0; x < game->cave->w; x++)
{
- game->last_element_buffer[y][x] = game->element_buffer[y][x] & ~SKIPPED;
- game->dir_buffer[y][x] = GD_MV_STILL;
+ game->last_element_buffer[y][x] = game->element_buffer[y][x];
+ game->dir_buffer_from[y][x] = GD_MV_STILL;
+ game->dir_buffer_to[y][x] = GD_MV_STILL;
}
}
- // store last maximum number of cycles (to force redraw if changed)
+ // store last maximum number of cycle frames (to force redraw if changed)
game->itermax_last = game->itermax;
- // update maximum number of cycles (frame) per cave iteration
- game->itermax = game->itercycle;
+ // store maximum number of cycle frames separately for even and odd cycles
+ game->itermax2[game->cycle_counter % 2] = game->itercycle;
- // reset cycle (frame) counter for the next cave iteration
+ // update maximum number of cycle frames per cave iteration
+ game->itermax = game->itermax2[!(game->cycle_counter % 2)];
+
+ // reset cycle frame counter for the next cave iteration
game->itercycle = 0;
iterate_cave(game, game->player_move, game->player_fire);
+ game->cycle_counter++;
+
if (game->player_move == GD_MV_STILL)
{
game->player_move_stick = FALSE;