replaced glib function calls to g_string_*()
[rocksndiamonds.git] / src / game_bd / bd_gameplay.c
index 8145cce6c2c2271c557943facc33ceb0acac73a3..ec757454f4f125945fb27e86a1d6bf9c6900bf9a 100644 (file)
@@ -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);
 
@@ -369,8 +397,8 @@ static GdGameState gd_game_main_int(GdGame *game, boolean allow_iterate, boolean
 
     /* if we have a story... */
 #if 0
-    if (game->show_story && game->original_cave && game->original_cave->story->len != 0)
-      Info("Cave Story: %s", game->original_cave->story->str);
+    if (game->show_story && game->original_cave && game->original_cave->story != NULL)
+      Info("Cave Story: %s", game->original_cave->story);
 #endif
 
     counter_next = GAME_INT_START_UNCOVER;
@@ -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;