+ centered_player_nr_next = centered_player_nr;
+ }
+
+#if 0
+ if (!scrolling) /* screen currently aligned at tile position */
+#endif
+ {
+ if (centered_player_nr != centered_player_nr_next)
+ {
+ centered_player_nr = centered_player_nr_next;
+
+ draw_new_player_location = TRUE;
+ force_redraw = TRUE;
+ }
+ }
+
+ if (centered_player_nr == -1)
+ {
+ if (draw_new_player_location)
+ {
+ setScreenCenteredToAllPlayers(&sx, &sy);
+ }
+ else
+ {
+ sx = PLAYER_SCREEN_X(game_em.last_moving_player);
+ sy = PLAYER_SCREEN_Y(game_em.last_moving_player);
+ }
+ }
+ else
+ {
+ sx = PLAYER_SCREEN_X(centered_player_nr);
+ sy = PLAYER_SCREEN_Y(centered_player_nr);
+ }
+
+ if (draw_new_player_location && !quick_relocation)
+ {
+#if 1
+ unsigned long game_frame_delay_value = getGameFrameDelay_EM(20);
+#else
+ unsigned long game_frame_delay_value = getGameFrameDelay_EM(25);
+#endif
+ int wait_delay_value = game_frame_delay_value;
+ int screen_xx = VALID_SCREEN_X(sx);
+ int screen_yy = VALID_SCREEN_Y(sy);
+
+ while (screen_x != screen_xx || screen_y != screen_yy)
+ {
+ int dx = (screen_xx < screen_x ? +1 : screen_xx > screen_x ? -1 : 0);
+ int dy = (screen_yy < screen_y ? +1 : screen_yy > screen_y ? -1 : 0);
+ int dxx = 0, dyy = 0;
+
+ if (dx == 0 && dy == 0) /* no scrolling needed at all */
+ break;
+
+#if 1
+ if (ABS(screen_xx - screen_x) >= TILEX ||
+ ABS(screen_yy - screen_y) >= TILEY)
+ {
+ screen_x -= dx * TILEX;
+ screen_y -= dy * TILEY;
+
+ dxx = dx * TILEX / 2;
+ dyy = dy * TILEY / 2;
+ }
+ else
+ {
+ screen_x = screen_xx;
+ screen_y = screen_yy;
+
+ dxx = 0;
+ dyy = 0;
+ }
+#else
+ screen_x -= dx * TILEX;
+ screen_y -= dy * TILEY;
+
+ dxx += dx * TILEX / 2;
+ dyy += dy * TILEY / 2;
+#endif
+
+ /* scroll in two steps of half tile size to make things smoother */
+ screen_x += dxx;
+ screen_y += dyy;
+
+ animscreen();
+
+ for (i = 0; i < MAX_PLAYERS; i++)
+ blitplayer(&ply[i]);
+
+ blitscreen();
+ FlushDisplay();
+ Delay(wait_delay_value);
+
+ /* scroll second step to align at full tile size */
+ screen_x -= dxx;
+ screen_y -= dyy;
+
+ SyncDisplay();
+
+ animscreen();
+
+ for (i = 0; i < MAX_PLAYERS; i++)
+ blitplayer(&ply[i]);
+
+ blitscreen();
+ FlushDisplay();
+ Delay(wait_delay_value);
+ }
+
+ screen_x_old = screen_x;
+ screen_y_old = screen_y;
+ }
+
+ if (force_redraw)
+ {
+ for (y = 0; y < MAX_BUF_YSIZE; y++)
+ {
+ for (x = 0; x < MAX_BUF_XSIZE; x++)
+ {
+ screentiles[y][x] = -1;
+ crumbled_state[y][x] = 0;
+ }
+ }
+ }
+
+ /* calculate new screen scrolling position, with regard to scroll delay */
+ screen_x = VALID_SCREEN_X(sx + offset_x < screen_x ? sx + offset_x :
+ sx - offset_x > screen_x ? sx - offset_x :
+ screen_x);
+ screen_y = VALID_SCREEN_Y(sy + offset_y < screen_y ? sy + offset_y :
+ sy - offset_y > screen_y ? sy - offset_y :
+ screen_y);
+
+ /* prevent scrolling further than player step size screen when scrolling */
+ if (ABS(screen_x - screen_x_old) > TILEX / 8 ||
+ ABS(screen_y - screen_y_old) > TILEY / 8)
+ {
+ int dx = SIGN(screen_x - screen_x_old);
+ int dy = SIGN(screen_y - screen_y_old);
+
+ screen_x = screen_x_old + dx * TILEX / 8;
+ screen_y = screen_y_old + dy * TILEY / 8;
+ }
+
+ /* prevent scrolling away from the other players when focus on all players */
+ if (centered_player_nr == -1)
+ {
+ all_players_visible = checkIfAllPlayersAreVisible();
+
+ if (!all_players_visible)
+ {
+ screen_x = screen_x_old;
+ screen_y = screen_y_old;
+ }
+ }
+
+ /* prevent scrolling (for screen correcting) if no player is moving */
+ if (!game_em.any_player_moving)
+ {
+ screen_x = screen_x_old;
+ screen_y = screen_y_old;
+ }
+ else
+ {
+ /* prevent scrolling against the players move direction */
+ int player_nr = game_em.last_moving_player;
+ int player_move_dir = game_em.last_player_direction[player_nr];
+ int dx = SIGN(screen_x - screen_x_old);
+ int dy = SIGN(screen_y - screen_y_old);
+
+ if ((dx < 0 && player_move_dir == MV_RIGHT) ||
+ (dx > 0 && player_move_dir == MV_LEFT))
+ screen_x = screen_x_old;
+
+ if ((dy < 0 && player_move_dir == MV_DOWN) ||
+ (dy > 0 && player_move_dir == MV_UP))
+ screen_y = screen_y_old;
+ }