X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_bd%2Fbd_gameplay.c;h=ffedad2cb4e093e492191c397ffa65011ab2cdd3;hb=0f4ca4876cd7e3ac7f05620a6d048f5cd7dac294;hp=8145cce6c2c2271c557943facc33ceb0acac73a3;hpb=7fb08abe58b2c84e36a5ed247d2103e08ae98aa4;p=rocksndiamonds.git diff --git a/src/game_bd/bd_gameplay.c b/src/game_bd/bd_gameplay.c index 8145cce6..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); @@ -396,7 +424,7 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean /* uncover animation */ /* to play cover sound */ - gd_sound_play(game->cave, GD_S_COVER, O_COVERED, -1, -1); + gd_sound_play(game->cave, GD_S_COVERING, O_COVERED, -1, -1); gd_sound_play_cave(game->cave); counter_next = game->state_counter; @@ -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) @@ -567,7 +617,7 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean /* starting to cover. start cover sound. */ gd_cave_clear_sounds(game->cave); - gd_sound_play(game->cave, GD_S_COVER, O_COVERED, -1, -1); + gd_sound_play(game->cave, GD_S_COVERING, O_COVERED, -1, -1); /* to play cover sound */ gd_sound_play_cave(game->cave); @@ -579,7 +629,7 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean game->state_counter < GAME_INT_COVER_ALL) { /* covering. */ - gd_sound_play(game->cave, GD_S_COVER, O_COVERED, -1, -1); + gd_sound_play(game->cave, GD_S_COVERING, O_COVERED, -1, -1); counter_next = game->state_counter;