improved smooth movement animation for classic BD scheduling types
[rocksndiamonds.git] / src / game_bd / bd_gameplay.c
index 7a4d889c051d49dcc237bef31f3181496f00f2d8..085dad08f6f0201c9aa6f65d79982df4ab521514 100644 (file)
@@ -122,6 +122,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);
 
@@ -188,6 +190,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;
@@ -388,17 +397,22 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean
        }
       }
 
-      // 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;
@@ -599,7 +613,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)