+ if (dx == 0 && dy == 0) /* no scrolling needed at all */
+ break;
+
+ scroll_x -= dx;
+ scroll_y -= dy;
+
+ fx += dx * TILEX / 2;
+ fy += dy * TILEY / 2;
+
+ ScrollLevel(dx, dy);
+ DrawAllPlayers();
+
+ /* scroll in two steps of half tile size to make things smoother */
+ BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY);
+ FlushDisplay();
+ Delay(wait_delay_value);
+
+ /* scroll second step to align at full tile size */
+ BackToFront();
+ Delay(wait_delay_value);
+ }
+
+ DrawPlayer(player);
+ BackToFront();
+ Delay(wait_delay_value);
+ }
+}
+#endif
+
+void RedrawPlayfield_EM(boolean force_redraw)
+{
+#if 1
+ int player_nr = getCenteredPlayer_EM();
+ boolean draw_new_player_location = FALSE;
+ boolean quick_relocation = setup.quick_switch;
+#else
+ int player_nr = 0; /* !!! FIX THIS (CENTERED TO PLAYER 1) !!! */
+#endif
+ int sx = PLAYER_SCREEN_X(player_nr);
+ int sy = PLAYER_SCREEN_Y(player_nr);
+ int i, x, y;
+
+#if 1
+ boolean scrolling = (screen_x % TILEX != 0 || screen_y % TILEY != 0);
+
+ if (!scrolling) /* screen currently aligned at tile position */
+ {
+ if (player_nr != centered_to_player)
+ {
+ centered_to_player = player_nr;
+
+ draw_new_player_location = TRUE;
+ force_redraw = TRUE;
+ }
+ }
+#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 = -999, screen_yy = -999;
+
+ while (screen_xx != screen_x || screen_yy != screen_y)
+ {
+ int screen_xx = VALID_SCREEN_X(PLAYER_SCREEN_X(player_nr));
+ int screen_yy = VALID_SCREEN_Y(PLAYER_SCREEN_Y(player_nr));
+ 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;
+
+ screen_x -= dx * TILEX;
+ screen_y -= dy * TILEY;
+
+ dxx += dx * TILEX / 2;
+ dyy += dy * TILEY / 2;
+
+ /* 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);
+ }
+ }
+
+#if 1
+ 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;
+ }
+ }
+ }
+#endif
+
+#if 1
+
+ int offset = (setup.scroll_delay ? 3 : 0) * TILEX;
+
+ /* calculate new screen scrolling position, with regard to scroll delay */
+ screen_x = VALID_SCREEN_X(sx + offset < screen_x ? sx + offset :
+ sx - offset > screen_x ? sx - offset : screen_x);
+ screen_y = VALID_SCREEN_Y(sy + offset < screen_y ? sy + offset :
+ sy - offset > screen_y ? sy - offset : screen_y);
+
+#else
+
+ if (sx > lev.width * TILEX)
+ sx = lev.width * TILEX;
+ if (sy > lev.height * TILEY)
+ sy = lev.height * TILEY;
+
+ if (sx < SCR_FIELDX * TILEX)
+ sx = SCR_FIELDX * TILEY;
+ if (sy < SCR_FIELDY * TILEY)
+ sy = SCR_FIELDY * TILEY;
+
+ screen_x = sx - (SCR_FIELDX - 1) * TILEX;
+ screen_y = sy - (SCR_FIELDY - 1) * TILEY;
+
+#endif