X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_bd%2Fbd_gameplay.c;h=0b4f48cdac4eab23a22b7d4bae0f441309ca132d;hb=ac8ca29d0e4dec7b621225457f6eb5179655ea14;hp=b287f085be9a68b4705c925654bdd7a327e88cfd;hpb=88649b249ef0485f6c6233dfee03e3cae1eefa1f;p=rocksndiamonds.git diff --git a/src/game_bd/bd_gameplay.c b/src/game_bd/bd_gameplay.c index b287f085..0b4f48cd 100644 --- a/src/game_bd/bd_gameplay.c +++ b/src/game_bd/bd_gameplay.c @@ -17,10 +17,6 @@ #include "main_bd.h" -// universal settings -static boolean gd_no_invisible_outbox = FALSE; - - void gd_game_free(GdGame *game) { // stop sounds @@ -30,8 +26,10 @@ void gd_game_free(GdGame *game) 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); @@ -93,10 +91,15 @@ static void load_cave(GdGame *game) 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) @@ -126,6 +129,8 @@ static void load_cave(GdGame *game) 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); @@ -140,12 +145,19 @@ static void load_cave(GdGame *game) 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); @@ -192,6 +204,13 @@ GdGame *gd_game_new(const int cave, const int level) return game; } +boolean check_iteration_reached(GdGame *game) +{ + int millisecs_elapsed = 20; + + return (game->milliseconds_game + millisecs_elapsed >= game->cave->speed); +} + static void iterate_cave(GdGame *game, GdDirection player_move, boolean fire) { boolean suicide = FALSE; @@ -387,22 +406,28 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean { 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; + + // 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 + // 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; @@ -571,8 +596,8 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean // always render the cave to the gfx buffer; // however it may do nothing if animcycle was not changed. if (game->element_buffer && game->gfx_buffer) - gd_drawcave_game(game->cave, game->element_buffer, game->gfx_buffer, - game->bonus_life_flash != 0, game->animcycle, gd_no_invisible_outbox); + gd_drawcave_game(game->cave, game->element_buffer, game->last_element_buffer, game->gfx_buffer, + game->bonus_life_flash != 0, game->animcycle, setup.bd_show_invisible_outbox); game->state_counter = counter_next; @@ -603,7 +628,7 @@ void play_game_func(GdGame *game, int action) game->player_fire = fire; // tell the interrupt "20ms has passed" - state = gd_game_main_int(game, !game->out_of_window, gd_keystate[SDL_SCANCODE_F]); + state = gd_game_main_int(game, !game->out_of_window, FALSE); // state of game, returned by gd_game_main_int switch (state)