+ /* switching to "all players" only possible if all players fit to screen */
+ if (game.centered_player_nr_next == -1 && !all_players_fit_to_screen)
+ {
+ game.centered_player_nr_next = game.centered_player_nr;
+ game.set_centered_player = FALSE;
+ }
+
+ /* do not switch focus to non-existing (or non-active) player */
+ if (game.centered_player_nr_next >= 0 &&
+ !ply[game.centered_player_nr_next].alive)
+ {
+ game.centered_player_nr_next = game.centered_player_nr;
+ game.set_centered_player = FALSE;
+ }
+ }
+
+#if 1
+ /* also allow focus switching when screen is scrolled to half tile */
+#else
+ if (!scrolling) /* screen currently aligned at tile position */
+#endif
+ {
+#if 1
+ if (game.set_centered_player)
+#else
+ if (game.centered_player_nr != game.centered_player_nr_next)
+#endif
+ {
+ game.centered_player_nr = game.centered_player_nr_next;
+
+ draw_new_player_location = TRUE;
+ force_redraw = TRUE;
+
+ game.set_centered_player = FALSE;
+ }
+ }
+
+ if (game.centered_player_nr == -1)
+ {
+#if 1
+ if (draw_new_player_location || offset == 0)
+#else
+ if (draw_new_player_location)
+#endif
+ {
+ setScreenCenteredToAllPlayers(&sx, &sy);
+ }
+ else
+ {
+#if 1
+ sx = PLAYER_SCREEN_X(max_center_distance_player_nr);
+ sy = PLAYER_SCREEN_Y(max_center_distance_player_nr);
+#else
+ sx = PLAYER_SCREEN_X(game_em.last_moving_player);
+ sy = PLAYER_SCREEN_Y(game_em.last_moving_player);
+#endif
+ }
+ }
+ else
+ {
+ sx = PLAYER_SCREEN_X(game.centered_player_nr);
+ sy = PLAYER_SCREEN_Y(game.centered_player_nr);
+ }
+
+ if (draw_new_player_location && quick_relocation)
+ {
+ screen_x = VALID_SCREEN_X(sx);
+ screen_y = VALID_SCREEN_Y(sy);
+ screen_x_old = screen_x;
+ screen_y_old = screen_y;
+
+#if 0
+ offset_x = 0;
+ offset_y = 0;
+#endif
+ }
+
+ 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)
+ {
+ screen_x -= dx * TILEX;
+ dxx = dx * TILEX / 2;
+ }
+ else
+ {
+ screen_x = screen_xx;
+ dxx = 0;
+ }
+
+ if (ABS(screen_yy - screen_y) >= TILEY)
+ {
+ screen_y -= dy * TILEY;
+ dyy = dy * TILEY / 2;
+ }
+ else
+ {
+ screen_y = screen_yy;
+ dyy = 0;
+ }
+
+#else
+
+#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
+
+#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();
+
+ Delay(wait_delay_value);
+
+ /* scroll second step to align at full tile size */
+ screen_x -= dxx;
+ screen_y -= dyy;
+
+#if 0
+ SyncDisplay();
+#endif
+
+ animscreen();
+
+ for (i = 0; i < MAX_PLAYERS; i++)
+ blitplayer(&ply[i]);
+
+ blitscreen();
+
+ 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;
+ }
+ }
+ }