+ boolean num_checked_players = 0;
+ int i;
+
+ for (i = 0; i < MAX_PLAYERS; i++)
+ {
+ if (ply[i].alive)
+ {
+ int sx = PLAYER_SCREEN_X(i);
+ int sy = PLAYER_SCREEN_Y(i);
+
+ if (num_checked_players == 0)
+ {
+ *sx1 = *sx2 = sx;
+ *sy1 = *sy2 = sy;
+ }
+ else
+ {
+ *sx1 = MIN(*sx1, sx);
+ *sy1 = MIN(*sy1, sy);
+ *sx2 = MAX(*sx2, sx);
+ *sy2 = MAX(*sy2, sy);
+ }
+
+ num_checked_players++;
+ }
+ }
+}
+
+boolean checkIfAllPlayersFitToScreen(void)
+{
+ int sx1 = 0, sy1 = 0, sx2 = 0, sy2 = 0;
+
+ setMinimalPlayerBoundaries(&sx1, &sy1, &sx2, &sy2);
+
+ return (sx2 - sx1 <= SCR_FIELDX * TILEX &&
+ sy2 - sy1 <= SCR_FIELDY * TILEY);
+}
+
+static void setScreenCenteredToAllPlayers(int *sx, int *sy)
+{
+ int sx1 = screen_x, sy1 = screen_y, sx2 = screen_x, sy2 = screen_y;
+
+ setMinimalPlayerBoundaries(&sx1, &sy1, &sx2, &sy2);
+
+ *sx = (sx1 + sx2) / 2;
+ *sy = (sy1 + sy2) / 2;
+}
+
+static void setMaxCenterDistanceForAllPlayers(int *max_dx, int *max_dy,
+ int center_x, int center_y)
+{
+ int sx1 = center_x, sy1 = center_y, sx2 = center_x, sy2 = center_y;
+
+ setMinimalPlayerBoundaries(&sx1, &sy1, &sx2, &sy2);
+
+ *max_dx = MAX(ABS(sx1 - center_x), ABS(sx2 - center_x));
+ *max_dy = MAX(ABS(sy1 - center_y), ABS(sy2 - center_y));
+}
+
+static boolean checkIfAllPlayersAreVisible(int center_x, int center_y)
+{
+ int max_dx, max_dy;
+
+ setMaxCenterDistanceForAllPlayers(&max_dx, &max_dy, center_x, center_y);
+
+ return (max_dx <= SCR_FIELDX * TILEX / 2 &&
+ max_dy <= SCR_FIELDY * TILEY / 2);
+}
+
+void RedrawPlayfield_EM(boolean force_redraw)
+{
+ boolean draw_new_player_location = FALSE;
+ boolean draw_new_player_location_wrap = FALSE;
+ boolean quick_relocation = setup.quick_switch;
+ int max_center_distance_player_nr =
+ getMaxCenterDistancePlayerNr(screen_x, screen_y);
+ int stepsize = TILEX / 8;
+ int offset_raw = game.scroll_delay_value;
+ int offset_x = MIN(offset_raw, (SCR_FIELDX - 2) / 2) * TILEX;
+ int offset_y = MIN(offset_raw, (SCR_FIELDY - 2) / 2) * TILEY;
+ int screen_x_old = screen_x;
+ int screen_y_old = screen_y;
+ int x, y, sx, sy;
+ int i;
+
+ if (game.set_centered_player)
+ {
+ boolean all_players_fit_to_screen = checkIfAllPlayersFitToScreen();
+
+ /* 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;
+ }
+ }
+
+ /* also allow focus switching when screen is scrolled to half tile */
+ if (game.set_centered_player)
+ {
+ game.centered_player_nr = game.centered_player_nr_next;
+
+ draw_new_player_location = TRUE;
+ draw_new_player_location_wrap = game.set_centered_player_wrap;
+ force_redraw = TRUE;
+
+ game.set_centered_player = FALSE;
+ game.set_centered_player_wrap = FALSE;
+ }
+
+ if (game.centered_player_nr == -1)
+ {
+ if (draw_new_player_location || offset_raw == 0)
+ {
+ setScreenCenteredToAllPlayers(&sx, &sy);
+ }
+ else
+ {
+ sx = PLAYER_SCREEN_X(max_center_distance_player_nr);
+ sy = PLAYER_SCREEN_Y(max_center_distance_player_nr);
+ }
+ }
+ 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 (draw_new_player_location && !quick_relocation)
+ {
+ unsigned int frame_delay_value_old = GetVideoFrameDelay();
+ int wait_delay_value = frame_delay_value_old;
+ int screen_xx = VALID_SCREEN_X(sx);
+ int screen_yy = VALID_SCREEN_Y(sy);
+
+ if (draw_new_player_location_wrap)
+ {
+ // when wrapping around (horizontally), keep vertical player position
+ screen_yy = screen_y;