X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_bd%2Fbd_gameplay.c;h=ffedad2cb4e093e492191c397ffa65011ab2cdd3;hb=0f4ca4876cd7e3ac7f05620a6d048f5cd7dac294;hp=e367d9fb34e55d8b1bc735c3bdad58ef0e7f40e0;hpb=39b7d2aa3bad6aea82451547e22b7354c0328679;p=rocksndiamonds.git diff --git a/src/game_bd/bd_gameplay.c b/src/game_bd/bd_gameplay.c index e367d9fb..ffedad2c 100644 --- a/src/game_bd/bd_gameplay.c +++ b/src/game_bd/bd_gameplay.c @@ -31,6 +31,10 @@ void gd_game_free(GdGame *game) if (game->element_buffer) 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->gfx_buffer) gd_cave_map_free(game->gfx_buffer); @@ -140,6 +144,16 @@ static void load_cave(GdGame *game) gd_cave_map_free(game->element_buffer); game->element_buffer = NULL; + /* delete last element buffer */ + if (game->last_element_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 gfx buffer */ if (game->gfx_buffer) gd_cave_map_free(game->gfx_buffer); @@ -171,6 +185,20 @@ static void load_cave(GdGame *game) for (x = 0; x < game->cave->w; x++) game->element_buffer[y][x] = O_NONE; + /* create new last element buffer */ + game->last_element_buffer = gd_cave_map_new(game->cave, int); + + for (y = 0; y < game->cave->h; y++) + 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); + + for (y = 0; y < game->cave->h; y++) + for (x = 0; x < game->cave->w; x++) + game->dir_buffer[y][x] = GD_MV_STILL; + /* create new gfx buffer */ game->gfx_buffer = gd_cave_map_new(game->cave, int); @@ -455,6 +483,9 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean if (allow_iterate) game->milliseconds_game += millisecs_elapsed; + /* increment cycle (frame) counter for the current cave iteration */ + game->itercycle++; + if (game->milliseconds_game >= cavespeed) { GdPlayerState pl; @@ -462,6 +493,25 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean game->milliseconds_game -= cavespeed; pl = game->cave->player_state; + /* initialize buffers for last cave element and direction for next iteration */ + for (y = 0; y < game->cave->h; y++) + { + for (x = 0; x < game->cave->w; x++) + { + game->last_element_buffer[y][x] = game->element_buffer[y][x]; + game->dir_buffer[y][x] = GD_MV_STILL; + } + } + + /* store last maximum number of cycles (to force redraw if changed) */ + game->itermax_last = game->itermax; + + /* update maximum number of cycles (frame) per cave iteration */ + game->itermax = game->itercycle; + + /* reset cycle (frame) counter for the next cave iteration */ + game->itercycle = 0; + iterate_cave(game, game->player_move, game->player_fire); if (game->player_move == GD_MV_STILL)