rnd-20060816-1-src
[rocksndiamonds.git] / src / game_em / graphics.c
index 649a258a86bc98a7694f162db566e9e9bd49fe2c..9aff1644d4b8e75f5b4e80efe588d5d48d19ccb2 100644 (file)
@@ -690,7 +690,8 @@ void RedrawPlayfield_EM(boolean force_redraw)
   int game.centered_player_nr_next = getCenteredPlayerNr_EM();
 #endif
 #if 1
-  int player_nr = getMaxCenterDistancePlayerNr(screen_x, screen_y);
+  int max_center_distance_player_nr =
+    getMaxCenterDistancePlayerNr(screen_x, screen_y);
 #else
   int player_nr = game_em.last_moving_player;
 #endif
@@ -757,8 +758,8 @@ void RedrawPlayfield_EM(boolean force_redraw)
     else
     {
 #if 1
-      sx = PLAYER_SCREEN_X(player_nr);
-      sy = PLAYER_SCREEN_Y(player_nr);
+      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);
@@ -911,7 +912,36 @@ void RedrawPlayfield_EM(boolean force_redraw)
                            sy - offset_y > screen_y ? sy - offset_y :
                            screen_y);
 
+#if 0
+  printf("::: (%d, %d) => (%d, %d) [(%d, %d), (%d, %d)] [%d, %d] [%d / %d]\n",
+        screen_x_old, screen_y_old,
+        screen_x, screen_y,
+        ply[max_center_distance_player_nr].oldx,
+        ply[max_center_distance_player_nr].x,
+        ply[max_center_distance_player_nr].oldy,
+        ply[max_center_distance_player_nr].y,
+        sx, sy,
+        ABS(screen_x - screen_x_old),
+        ABS(screen_y - screen_y_old));
+#endif
+
 #if 1
+
+#if 1
+  /* prevent scrolling further than double player step size when scrolling */
+  if (ABS(screen_x - screen_x_old) > 2 * stepsize)
+  {
+    int dx = SIGN(screen_x - screen_x_old);
+
+    screen_x = screen_x_old + dx * 2 * stepsize;
+  }
+  if (ABS(screen_y - screen_y_old) > 2 * stepsize)
+  {
+    int dy = SIGN(screen_y - screen_y_old);
+
+    screen_y = screen_y_old + dy * 2 * stepsize;
+  }
+#else
   /* prevent scrolling further than double player step size when scrolling */
   if (ABS(screen_x - screen_x_old) > 2 * stepsize ||
       ABS(screen_y - screen_y_old) > 2 * stepsize)
@@ -922,6 +952,8 @@ void RedrawPlayfield_EM(boolean force_redraw)
     screen_x = screen_x_old + dx * 2 * stepsize;
     screen_y = screen_y_old + dy * 2 * stepsize;
   }
+#endif
+
 #else
   /* prevent scrolling further than player step size when scrolling */
   if (ABS(screen_x - screen_x_old) > stepsize ||
@@ -976,6 +1008,8 @@ void RedrawPlayfield_EM(boolean force_redraw)
 #if 0
     int player_nr = game_em.last_moving_player;
 #endif
+    int player_nr = (game.centered_player_nr == -1 ?
+                    max_center_distance_player_nr : game.centered_player_nr);
     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);
@@ -1008,12 +1042,47 @@ void game_animscreen(void)
 
 void DrawGameDoorValues_EM()
 {
+#if 1
+  int dynamite_state;
+  int key_state;
+#else
   int dynamite_state = ply[0].dynamite;                /* !!! ONLY PLAYER 1 !!! */
-  int all_keys_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+  int key_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+#endif
+
+#if 1
+  if (game.centered_player_nr == -1)
+  {
+#if 1
+    int i;
+
+    dynamite_state = 0;
+    key_state = 0;
+
+    for (i = 0; i < MAX_PLAYERS; i++)
+    {
+      dynamite_state += ply[i].dynamite;
+      key_state |= ply[i].keys;
+    }
+
+#else
+
+    dynamite_state = ply[0].dynamite;          /* !!! ONLY PLAYER 1 !!! */
+    key_state = ply[0].keys | ply[1].keys | ply[2].keys | ply[3].keys;
+#endif
+  }
+  else
+  {
+    int player_nr = game.centered_player_nr;
+
+    dynamite_state = ply[player_nr].dynamite;
+    key_state = ply[player_nr].keys;
+  }
+#endif
 
 #if 1
   DrawAllGameValues(lev.required, dynamite_state, lev.score,
-                   lev.time, all_keys_state);
+                   lev.time, key_state);
 #else
   DrawAllGameValues(lev.required, ply1.dynamite, lev.score,
                    DISPLAY_TIME(lev.time), ply1.keys | ply2.keys);