rnd-20130916-1-src
[rocksndiamonds.git] / src / game_em / synchro_1.c
index c6f0067428dc59360b0189fab5b8d8acc594568d..ef4d0f2c82e73d1e88e7fa7ba87dc22557b90163 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 *);
@@ -297,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;
 
@@ -311,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;
   }
@@ -328,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;
 
@@ -342,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;
   }
@@ -359,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;
 
@@ -373,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;
   }
@@ -390,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;
 
@@ -404,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;
   }
@@ -414,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:
@@ -449,9 +469,10 @@ 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;
+
 #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,
@@ -463,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
@@ -493,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
@@ -520,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
@@ -549,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;
@@ -672,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:
@@ -681,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:
@@ -706,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:
@@ -1230,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--;