rnd-20060319-2-src
[rocksndiamonds.git] / src / game_em / synchro_1.c
index c5b2c456b4910ed38eae9452f42b29d4f17d1edb..38607713370c2cf3e6e136aefc48e8dabd85d2ae 100644 (file)
@@ -5,12 +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
+
+extern boolean checkIfAllPlayersFitToScreen();
+
 static void check_player(struct PLAYER *);
 static void kill_player(struct PLAYER *);
 static boolean player_digfield(struct PLAYER *, int, int);
@@ -18,7 +21,26 @@ static boolean player_killed(struct PLAYER *);
 
 void synchro_1(void)
 {
- /* must test for death and actually kill separately */
+#if 1
+
+  int start_check_nr;
+  int i;
+
+  game_em.any_player_moving = FALSE;
+
+  /* must test for death and actually kill separately */
+
+  for (i = 0; i < MAX_PLAYERS; i++)
+  {
+    boolean ply_kill = player_killed(&ply[i]);
+
+    if (ply[i].alive && ply_kill)
+      kill_player(&ply[i]);
+  }
+
+#else
+
+  /* must test for death and actually kill separately */
   boolean ply1_kill = player_killed(&ply1);
   boolean ply2_kill = player_killed(&ply2);
 
@@ -27,10 +49,51 @@ void synchro_1(void)
   if (ply2.alive && ply2_kill)
     kill_player(&ply2);
 
+#endif
+
 #if 0
   ply1.alive = 1; /* debugging */
 #endif
 
+#if 1
+
+  for (i = 0; i < MAX_PLAYERS; i++)
+  {
+    ply[i].oldx = ply[i].x;
+    ply[i].oldy = ply[i].y;
+    ply[i].anim = SPR_still;
+  }
+
+  start_check_nr = (RandomEM & 128 ? 0 : 1) * 2 + (RandomEM & 256 ? 0 : 1);
+
+  for (i = 0; i < MAX_PLAYERS; i++)
+  {
+    int check_nr = (start_check_nr + i) % MAX_PLAYERS;
+
+    if (ply[check_nr].alive)
+      check_player(&ply[check_nr]);
+  }
+
+  for (i = 0; i < MAX_PLAYERS; i++)
+  {
+    if (!ply[i].alive)
+      continue;
+
+    if (Cave[ply[i].oldy][ply[i].oldx] == Zplayer)
+    {
+      Cave[ply[i].oldy][ply[i].oldx] = Xblank;
+      Next[ply[i].oldy][ply[i].oldx] = Xblank;
+    }
+
+    if (Cave[ply[i].y][ply[i].x] == Xblank)
+    {
+      Cave[ply[i].y][ply[i].x] = Zplayer;
+      Next[ply[i].y][ply[i].x] = Zplayer;
+    }
+  }
+
+#else
+
   ply1.oldx = ply1.x;
   ply1.oldy = ply1.y;
   ply1.anim = SPR_still;
@@ -38,7 +101,7 @@ void synchro_1(void)
   ply2.oldy = ply2.y;
   ply2.anim = SPR_still;
 
-  if (Random & 256)
+  if (RandomEM & 256)
   {
     if (ply1.alive) check_player(&ply1);
     if (ply2.alive) check_player(&ply2);
@@ -78,12 +141,18 @@ void synchro_1(void)
       Next[ply2.y][ply2.x] = Zplayer;
     }
   }
+
+#endif
 }
 
 static boolean player_killed(struct PLAYER *ply)
 {
-  register unsigned int x = ply->x;
-  register unsigned int y = ply->y;
+  int x = ply->x;
+  int y = ply->y;
+
+#if 0
+  printf("::: %d: %d, %d\n", ply->num, x, y);
+#endif
 
   if (!ply->alive)
     return FALSE;
@@ -208,8 +277,8 @@ static boolean player_killed(struct PLAYER *ply)
 
 static void kill_player(struct PLAYER *ply)
 {
-  register unsigned int x = ply->x;
-  register unsigned int y = ply->y;
+  int x = ply->x;
+  int y = ply->y;
 
   ply->alive = 0;
 
@@ -373,13 +442,15 @@ static void kill_player(struct PLAYER *ply)
 
 static void check_player(struct PLAYER *ply)
 {
-  unsigned int oldx = ply->x;
-  unsigned int oldy = ply->y;
-  register unsigned int x = oldx;
-  register unsigned int y = oldy;
-  unsigned int anim = 0;
+  int oldx = ply->x;
+  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,
@@ -471,6 +542,31 @@ static void check_player(struct PLAYER *ply)
   }
 #endif
 
+  if (dx || dy)
+  {
+    int oldx = ply->x;
+    int oldy = ply->y;
+    int x = oldx + dx;
+    int y = oldy + dy;
+    boolean can_move = TRUE;
+
+    ply->x = x;
+    ply->y = y;
+
+    can_move = (game.centered_player_nr != -1 ||
+               checkIfAllPlayersFitToScreen());
+
+    ply->x = oldx;
+    ply->y = oldy;
+
+    if (!can_move)
+    {
+      ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
+
+      return;
+    }
+  }
+
   if (dx == 0 && dy == 0)
   {
     ply->joy_stick = 0;
@@ -489,14 +585,14 @@ static void check_player(struct PLAYER *ply)
       ply->dynamite_cnt = 0;
     }
 
-    Random += 7;       /* be a bit more random if the player doesn't move */
+    RandomEM += 7;     /* be a bit more random if the player doesn't move */
 
     return;
   }
 
   ply->joy_stick = 1;
   ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
-  ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
+  ply->dynamite_cnt = 0;       /* reset dynamite timer if we move */
   ply->joy_spin = !ply->joy_spin;
 
   if (ply->joy_snap == 0)              /* player wants to move */
@@ -520,6 +616,10 @@ static void check_player(struct PLAYER *ply)
        ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
       else if (oldy != ply->y)
        ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
+
+      game_em.any_player_moving = TRUE;
+      game_em.last_moving_player = ply->num;
+      game_em.last_player_direction[ply->num] = ply->last_move_dir;
     }
   }
   else                                 /* player wants to snap */
@@ -531,10 +631,10 @@ static void check_player(struct PLAYER *ply)
 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
 {
   int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
-  unsigned int oldx = ply->x;
-  unsigned int oldy = ply->y;
-  register unsigned int x = oldx + dx;
-  register unsigned int y = oldy + dy;
+  int oldx = ply->x;
+  int oldy = ply->y;
+  int x = oldx + dx;
+  int y = oldy + dy;
   boolean result = TRUE;
 
   if (!dx && !dy)                      /* no direction specified */