fixed compiler warning
[rocksndiamonds.git] / src / game_bd / bd_gameplay.c
index 9f1d96e6d30ae4f7f57077cbdda07179dc5fbb51..0b4f48cdac4eab23a22b7d4bae0f441309ca132d 100644 (file)
 #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)
@@ -116,12 +119,18 @@ static void load_cave(GdGame *game)
 
   game->cave = gd_get_prepared_cave(game->original_cave, game->level_num);
 
+  // if requested, recolor cave (cave is a copy only, so no worries)
+  if (setup.bd_random_colors)
+    gd_cave_set_random_colors(game->cave, setup.bd_default_color_type);
+
   if (game->cave->intermission && game->cave->intermission_instantlife)
     add_bonus_life(game, FALSE);
 
   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);
 
@@ -136,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);
@@ -188,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;
@@ -384,21 +407,27 @@ 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];
-         game->dir_buffer[y][x] = GD_MV_STILL;
+         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;
@@ -567,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;
 
@@ -599,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)