rnd-20060808-1-src
[rocksndiamonds.git] / src / game_em / synchro_1.c
index c6f0067428dc59360b0189fab5b8d8acc594568d..5f0929875b67b59ca711d4c89839cfd2da4eec6d 100644 (file)
@@ -5,16 +5,15 @@
  * large switch statement for tiles the player interacts with.
  */
 
-#include "tile.h"
-#include "level.h"
-#include "sample.h"
-#include "display.h"
+#include "main_em.h"
 
 
 #if 0
 extern int centered_player_nr;
 #endif
 
+#define USE_CHANGED_ACID_STUFF         1
+
 extern boolean checkIfAllPlayersFitToScreen();
 
 static void check_player(struct PLAYER *);
@@ -424,7 +423,7 @@ static void kill_player(struct PLAYER *ply)
 
   switch(Cave[y][x])
   {
-#if 1
+#if USE_CHANGED_ACID_STUFF
     case Xacid_1:
     case Xacid_2:
     case Xacid_3:
@@ -452,6 +451,8 @@ static void check_player(struct PLAYER *ply)
   int anim = 0;
   int dx = 0, dy = 0;
 
+  game_em.last_player_direction[ply->num] = MV_NONE;
+
 #if 0
   printf("::: up == %d, down == %d, left == %d, right == %d, fire == %d [spin == %d, stick == %d]\n",
         ply->joy_n, ply->joy_s, ply->joy_w, ply->joy_e, ply->joy_fire,
@@ -549,13 +550,26 @@ static void check_player(struct PLAYER *ply)
     int oldy = ply->y;
     int x = oldx + dx;
     int y = oldy + dy;
-    boolean can_move = TRUE;
+    boolean players_visible_before_move;
+    boolean players_visible_after_move;
+    boolean can_move;
+
+    players_visible_before_move = checkIfAllPlayersFitToScreen();
 
     ply->x = x;
     ply->y = y;
 
+    players_visible_after_move = checkIfAllPlayersFitToScreen();
+
+    /*
+      player is allowed to move only in the following cases:
+      - it is not needed to display all players (not focussed to all players)
+      - all players are (still or again) visible after the move
+      - some players were already outside visible screen area before the move
+    */
     can_move = (game.centered_player_nr != -1 ||
-               checkIfAllPlayersFitToScreen());
+               players_visible_after_move ||
+               !players_visible_before_move);
 
     ply->x = oldx;
     ply->y = oldy;
@@ -672,7 +686,7 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
        ply->y = y;
        break;
 
-#if 1
+#if USE_CHANGED_ACID_STUFF
       case Xacid_1:
       case Xacid_2:
       case Xacid_3:
@@ -681,12 +695,12 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
       case Xacid_6:
       case Xacid_7:
       case Xacid_8:
-#endif
        if (Cave[y-1][x+1] == Xblank)
          Cave[y-1][x+1] = Yacid_splash_eB;
        if (Cave[y-1][x-1] == Xblank)
          Cave[y-1][x-1] = Yacid_splash_wB;
        play_element_sound(x, y, SAMPLE_acid, Xacid_1);
+#endif
 
       case Xboom_android:
       case Xboom_1:
@@ -706,7 +720,8 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
       case Xtank_goe:
       case Xtank_gos:
       case Xtank_gow:
-#if 0
+
+#if !USE_CHANGED_ACID_STUFF
       case Xacid_1:
       case Xacid_2:
       case Xacid_3: