rnd-20010121-1-src
[rocksndiamonds.git] / src / game.c
index 7fa685050df85dd100f8e5e026387703ee7487f0..65fff98e2ae17ea72b48b3aa81b902dbcf7aacab 100644 (file)
 
 /* for Explode() */
 #define EX_PHASE_START         0
-#define EX_NORMAL              0
-#define EX_CENTER              1
-#define EX_BORDER              2
+#define EX_NO_EXPLOSION                0
+#define EX_NORMAL              1
+#define EX_CENTER              2
+#define EX_BORDER              3
 
 /* special positions in the game control window (relative to control window) */
 #define XX_LEVEL               37
@@ -533,6 +534,7 @@ void InitGame()
   game.timegate_time_left = 0;
   game.switchgate_pos = 0;
   game.balloon_dir = MV_NO_MOVING;
+  game.explosions_delayed = TRUE;
 
   for (i=0; i<4; i++)
   {
@@ -554,6 +556,7 @@ void InitGame()
       AmoebaNr[x][y] = 0;
       JustStopped[x][y] = 0;
       Stop[x][y] = FALSE;
+      ExplodeField[x][y] = EX_NO_EXPLOSION;
     }
   }
 
@@ -692,9 +695,9 @@ void InitGame()
     for (i=0; i<ep_slippery_num; i++)
     {
       if (game.version >= GAME_VERSION_2_0)
-       Elementeigenschaften1[ep_slippery[i]] |= EP_BIT_SLIPPERY;
+       Elementeigenschaften2[ep_slippery[i]] |= EP_BIT_SLIPPERY_GEMS;
       else
-       Elementeigenschaften1[ep_slippery[i]] &= ~EP_BIT_SLIPPERY;
+       Elementeigenschaften2[ep_slippery[i]] &= ~EP_BIT_SLIPPERY_GEMS;
     }
   }
 
@@ -1201,20 +1204,12 @@ void RemoveMovingField(int x, int y)
        Feld[oldx][oldy] == EL_MAGIC_WALL_EMPTYING ||
        Feld[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTYING ||
        Feld[oldx][oldy] == EL_AMOEBA_DRIPPING))
-  {
-    Feld[oldx][oldy] = (Feld[oldx][oldy] == EL_QUICKSAND_EMPTYING ?
-                       EL_MORAST_LEER :
-                       Feld[oldx][oldy] == EL_MAGIC_WALL_EMPTYING ?
-                       EL_MAGIC_WALL_EMPTY :
-                       Feld[oldx][oldy] == EL_MAGIC_WALL_BD_EMPTYING ?
-                       EL_MAGIC_WALL_BD_EMPTY :
-                       Feld[oldx][oldy] == EL_AMOEBA_DRIPPING ?
-                       EL_AMOEBE_NASS : 0);
-    Store[oldx][oldy] = Store2[oldx][oldy] = 0;
-  }
+    Feld[oldx][oldy] = get_next_element(Feld[oldx][oldy]);
   else
     Feld[oldx][oldy] = EL_LEERRAUM;
 
+  Store[oldx][oldy] = Store2[oldx][oldy] = 0;
+
   Feld[newx][newy] = EL_LEERRAUM;
   MovPos[oldx][oldy] = MovDir[oldx][oldy] = MovDelay[oldx][oldy] = 0;
   MovPos[newx][newy] = MovDir[newx][newy] = MovDelay[newx][newy] = 0;
@@ -1288,6 +1283,12 @@ void Explode(int ex, int ey, int phase, int mode)
   int half_phase = (num_phase / 2) * delay;
   int first_phase_after_start = EX_PHASE_START + 1;
 
+  if (game.explosions_delayed)
+  {
+    ExplodeField[ex][ey] = mode;
+    return;
+  }
+
   if (phase == EX_PHASE_START)         /* initialize 'Store[][]' field */
   {
     int center_element = Feld[ex][ey];
@@ -2584,9 +2585,10 @@ void StartMoving(int x, int y)
             element != EL_DX_SUPABOMB)
 #endif
 #else
-    else if (IS_SLIPPERY(Feld[x][y+1]) &&
+    else if ((IS_SLIPPERY(Feld[x][y+1]) ||
+             (IS_SLIPPERY_GEMS(Feld[x][y+1]) && IS_GEM(element))) &&
             !IS_FALLING(x, y+1) && !JustStopped[x][y+1] &&
-            element != EL_DX_SUPABOMB)
+            element != EL_DX_SUPABOMB && element != EL_SP_DISK_ORANGE)
 #endif
     {
       boolean left  = (x>0 && IS_FREE(x-1, y) &&
@@ -2999,58 +3001,53 @@ void ContinueMoving(int x, int y)
 
     if (element == EL_QUICKSAND_FILLING)
     {
-      element = Feld[newx][newy] = EL_MORAST_VOLL;
+      element = Feld[newx][newy] = get_next_element(element);
       Store[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (element == EL_QUICKSAND_EMPTYING)
     {
-      Feld[x][y] = EL_MORAST_LEER;
+      Feld[x][y] = get_next_element(element);
       element = Feld[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (element == EL_MAGIC_WALL_FILLING)
     {
-      element = Feld[newx][newy] =
-       (game.magic_wall_active ? EL_MAGIC_WALL_FULL : EL_MAGIC_WALL_DEAD);
+      element = Feld[newx][newy] = get_next_element(element);
+      if (!game.magic_wall_active)
+       element = Feld[newx][newy] = EL_MAGIC_WALL_DEAD;
       Store[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (element == EL_MAGIC_WALL_EMPTYING)
     {
-      Feld[x][y] = (game.magic_wall_active ? EL_MAGIC_WALL_EMPTY :
-                   EL_MAGIC_WALL_DEAD);
+      Feld[x][y] = get_next_element(element);
+      if (!game.magic_wall_active)
+       Feld[x][y] = EL_MAGIC_WALL_DEAD;
       element = Feld[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (element == EL_MAGIC_WALL_BD_FILLING)
     {
-      element = Feld[newx][newy] =
-       (game.magic_wall_active ? EL_MAGIC_WALL_BD_FULL :
-        EL_MAGIC_WALL_BD_DEAD);
+      element = Feld[newx][newy] = get_next_element(element);
+      if (!game.magic_wall_active)
+       element = Feld[newx][newy] = EL_MAGIC_WALL_BD_DEAD;
       Store[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (element == EL_MAGIC_WALL_BD_EMPTYING)
     {
-      Feld[x][y] = (game.magic_wall_active ? EL_MAGIC_WALL_BD_EMPTY :
-                   EL_MAGIC_WALL_BD_DEAD);
+      Feld[x][y] = get_next_element(element);
+      if (!game.magic_wall_active)
+       Feld[x][y] = EL_MAGIC_WALL_BD_DEAD;
       element = Feld[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (element == EL_AMOEBA_DRIPPING)
     {
-      Feld[x][y] = EL_AMOEBE_NASS;
+      Feld[x][y] = get_next_element(element);
       element = Feld[newx][newy] = Store[x][y];
-      Store[x][y] = 0;
     }
     else if (Store[x][y] == EL_SALZSAEURE)
     {
-      Store[x][y] = 0;
-      Feld[newx][newy] = EL_SALZSAEURE;
-      element = EL_SALZSAEURE;
+      element = Feld[newx][newy] = EL_SALZSAEURE;
     }
 
+    Store[x][y] = 0;
     MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0;
     MovDelay[newx][newy] = 0;
 
@@ -4424,15 +4421,17 @@ void GameActions()
     {
       StartMoving(x, y);
 
-      if (IS_GEM(element))
+      if (IS_GEM(element) || element == EL_SP_INFOTRON)
        EdelsteinFunkeln(x, y);
     }
     else if (IS_MOVING(x, y))
       ContinueMoving(x, y);
     else if (IS_ACTIVE_BOMB(element))
       CheckDynamite(x, y);
-    else if (element == EL_EXPLODING)
+#if 0
+    else if (element == EL_EXPLODING && !game.explosions_delayed)
       Explode(x, y, Frame[x][y], EX_NORMAL);
+#endif
     else if (element == EL_AMOEBING)
       AmoebeWaechst(x, y);
     else if (element == EL_DEAMOEBING)
@@ -4522,6 +4521,27 @@ void GameActions()
     }
   }
 
+#if 0
+  if (game.explosions_delayed)
+#endif
+  {
+    game.explosions_delayed = FALSE;
+
+    for (y=0; y<lev_fieldy; y++) for (x=0; x<lev_fieldx; x++)
+    {
+      element = Feld[x][y];
+
+      if (ExplodeField[x][y])
+       Explode(x, y, EX_PHASE_START, ExplodeField[x][y]);
+      else if (element == EL_EXPLODING)
+       Explode(x, y, Frame[x][y], EX_NORMAL);
+
+      ExplodeField[x][y] = EX_NO_EXPLOSION;
+    }
+
+    game.explosions_delayed = TRUE;
+  }
+
   if (game.magic_wall_active)
   {
     if (!(game.magic_wall_time_left % 4))