rnd-20130916-1-src
[rocksndiamonds.git] / src / game_em / synchro_1.c
index 38607713370c2cf3e6e136aefc48e8dabd85d2ae..ef4d0f2c82e73d1e88e7fa7ba87dc22557b90163 100644 (file)
@@ -12,6 +12,8 @@
 extern int centered_player_nr;
 #endif
 
+#define USE_CHANGED_ACID_STUFF         1
+
 extern boolean checkIfAllPlayersFitToScreen();
 
 static void check_player(struct PLAYER *);
@@ -294,7 +296,9 @@ static void kill_player(struct PLAYER *ply)
     case Xbug_gow:
       Cave[y-1][x] = Xboom_bug;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
 
@@ -308,7 +312,9 @@ static void kill_player(struct PLAYER *ply)
     case Xtank_gow:
       Cave[y-1][x] = Xboom_bomb;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
   }
@@ -325,7 +331,9 @@ static void kill_player(struct PLAYER *ply)
     case Xbug_gow:
       Cave[y][x+1] = Xboom_bug;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
 
@@ -339,7 +347,9 @@ static void kill_player(struct PLAYER *ply)
     case Xtank_gow:
       Cave[y][x+1] = Xboom_bomb;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
   }
@@ -356,7 +366,9 @@ static void kill_player(struct PLAYER *ply)
     case Xbug_gow:
       Cave[y+1][x] = Xboom_bug;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
 
@@ -370,7 +382,9 @@ static void kill_player(struct PLAYER *ply)
     case Xtank_gow:
       Cave[y+1][x] = Xboom_bomb;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
   }
@@ -387,7 +401,9 @@ static void kill_player(struct PLAYER *ply)
     case Xbug_gow:
       Cave[y][x-1] = Xboom_bug;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
 
@@ -401,7 +417,9 @@ static void kill_player(struct PLAYER *ply)
     case Xtank_gow:
       Cave[y][x-1] = Xboom_bomb;
 #if 0
+#if PLAY_ELEMENT_SOUND
       play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
 #endif
       break;
   }
@@ -411,17 +429,22 @@ static void kill_player(struct PLAYER *ply)
     case Xexit_1:
     case Xexit_2:
     case Xexit_3:
+      lev.exit_x = x;
+      lev.exit_y = y;
       play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
       break;
 
     default:
+#if PLAY_ELEMENT_SOUND
+      play_element_sound(x, y, SAMPLE_boom, Zplayer);
+#endif
       play_element_sound(x, y, SAMPLE_die, Zplayer);
       break;
   }
 
   switch(Cave[y][x])
   {
-#if 1
+#if USE_CHANGED_ACID_STUFF
     case Xacid_1:
     case Xacid_2:
     case Xacid_3:
@@ -446,7 +469,6 @@ static void check_player(struct PLAYER *ply)
   int oldy = ply->y;
   int x = oldx;
   int y = oldy;
-  int anim = 0;
   int dx = 0, dy = 0;
 
   game_em.last_player_direction[ply->num] = MV_NONE;
@@ -462,26 +484,22 @@ static void check_player(struct PLAYER *ply)
   {
     x--;
     dx = -1;
-    anim = 3;
   }
   else if (ply->joy_e)         /* east */
   {
     x++;
     dx = 1;
-    anim = 1;
   }
 
   if (ply->joy_n)              /* north */
   {
     y--;
     dy = -1;
-    anim = 0;
   }
   else if (ply->joy_s)         /* south */
   {
     y++;
     dy = 1;
-    anim = 2;
   }
 
 #else
@@ -492,25 +510,21 @@ static void check_player(struct PLAYER *ply)
     {
       y--;
       dy = -1;
-      anim = 0;
     }
     else if (ply->joy_e)       /* east */
     {
       x++;
       dx = 1;
-      anim = 1;
     }
     else if (ply->joy_s)       /* south */
     {
       y++;
       dy = 1;
-      anim = 2;
     }
     else if (ply->joy_w)       /* west */
     {
       x--;
       dx = -1;
-      anim = 3;
     }
   }
   else
@@ -519,25 +533,21 @@ static void check_player(struct PLAYER *ply)
     {
       x--;
       dx = -1;
-      anim = 3;
     }
     else if (ply->joy_s)       /* south */
     {
       y++;
       dy = 1;
-      anim = 2;
     }
     else if (ply->joy_e)       /* east */
     {
       x++;
       dx = 1;
-      anim = 1;
     }
     else if (ply->joy_n)       /* north */
     {
       y--;
       dy = -1;
-      anim = 0;
     }
   }
 #endif
@@ -548,13 +558,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;
@@ -671,7 +694,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:
@@ -680,12 +703,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:
@@ -705,7 +728,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:
@@ -1229,7 +1253,10 @@ static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
       case Xexit_1:
       case Xexit_2:
       case Xexit_3:
+#if 0
+       /* !!! already played in kill_player !!! */
        play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
+#endif
 
        lev.home--;