* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include <glib.h>
-
#include "main_bd.h"
/* quit, global variable which is set to true if the application should quit */
boolean gd_quit = FALSE;
-const guint8 *gd_keystate;
+const byte *gd_keystate;
static int cell_size = 0;
boolean out_of_window;
int player_x, player_y, visible_x, visible_y;
boolean changed;
- int scroll_divisor;
/* max scrolling speed depends on the speed of the cave. */
/* game moves cell_size_game * 1s / cave time pixels in a second. */
/* caught up with the desired position. smaller is better. */
int scroll_speed = cell_size * 20 / game->cave->speed;
+ if (!setup.bd_scroll_delay)
+ exact_scroll = TRUE;
+
if (immediate)
scroll_speed = cell_size * MAX(game->cave->w, game->cave->h);
/* cell_size contains the scaled size, but we need the original. */
changed = FALSE;
- /* some sort of scrolling speed.
- with larger cells, the divisor must be smaller, so the scrolling faster. */
- scroll_divisor = 256 / cell_size;
-
- /* fine scrolling is 50hz (normal would be 25hz only) */
- scroll_divisor *= 2;
-
if (cave_scroll(visible_x, play_area_w, player_x * cell_size + cell_size / 2 - play_area_w / 2,
exact_scroll, &scroll_x, &scroll_desired_x, scroll_speed))
changed = TRUE;
return (gd_elements[element & O_MASK].properties & P_COLLECTIBLE) != 0;
}
+/* returns true if the element is exploding */
+static inline boolean is_explosion(const int element)
+{
+ return (gd_elements[element & O_MASK].properties & P_EXPLOSION) != 0;
+}
+
static void gd_drawcave_tile(Bitmap *dest, GdGame *game, int x, int y, boolean draw_masked)
{
void (*blit_bitmap)(Bitmap *, Bitmap *, int, int, int, int, int, int) =
int tile = game->element_buffer[y][x];
int frame = game->animcycle;
struct GraphicInfo_BD *g = &graphic_info_bd_object[tile][frame];
- boolean use_smooth_movements = TRUE;
+ boolean use_smooth_movements =
+ ((setup.bd_smooth_movements == TRUE) ||
+ (setup.bd_smooth_movements == AUTO && !use_native_bd_graphics_engine()));
+
+ // do not use smooth movement animation for exploding game elements (like player)
+ if (is_explosion(tile) && dir != GD_MV_STILL)
+ use_smooth_movements = FALSE;
+
+ // do not use smooth movement animation for player entering exit (engine stopped)
+ if (cave->player_state == GD_PL_EXITED)
+ use_smooth_movements = FALSE;
#if DO_GFX_SANITY_CHECK
if (use_native_bd_graphics_engine() && !setup.small_game_graphics && !program.headless)