#include "main_bd.h"
-// universal settings
-static boolean gd_no_invisible_outbox = FALSE;
-
-
void gd_game_free(GdGame *game)
{
// stop sounds
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);
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)
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);
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);
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;
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;
// 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;
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)
{
case GD_GAME_CAVE_LOADED:
- // select colors, prepare drawing etc.
+ // scroll to start position
gd_scroll_to_origin();
// fill whole screen with black - cave might be smaller than previous!