rnd-20040221-2-src
[rocksndiamonds.git] / src / init.c
index e0d97ccab822c581e225aa93bba967f701084be4..b7ea2825020ffc76aafe7e857ad5f41acc5d7668 100644 (file)
@@ -1569,6 +1569,92 @@ static void ReinitializeMusic()
   InitGameModeMusicInfo();     /* game mode music mapping */
 }
 
+static int get_special_property_bit(int element, int base_property_bit)
+{
+  static struct
+  {
+    int element;
+    int bit_nr;
+  } pb_can_move_into_acid[] =
+  {
+    { EL_BUG,                  0 },
+    { EL_BUG_LEFT,             0 },
+    { EL_BUG_RIGHT,            0 },
+    { EL_BUG_UP,               0 },
+    { EL_BUG_DOWN,             0 },
+    { EL_SPACESHIP,            0 },
+    { EL_SPACESHIP_LEFT,       0 },
+    { EL_SPACESHIP_RIGHT,      0 },
+    { EL_SPACESHIP_UP,         0 },
+    { EL_SPACESHIP_DOWN,       0 },
+    { EL_BD_BUTTERFLY,         1 },
+    { EL_BD_BUTTERFLY_LEFT,    1 },
+    { EL_BD_BUTTERFLY_RIGHT,   1 },
+    { EL_BD_BUTTERFLY_UP,      1 },
+    { EL_BD_BUTTERFLY_DOWN,    1 },
+    { EL_BD_FIREFLY,           1 },
+    { EL_BD_FIREFLY_LEFT,      1 },
+    { EL_BD_FIREFLY_RIGHT,     1 },
+    { EL_BD_FIREFLY_UP,                1 },
+    { EL_BD_FIREFLY_DOWN,      1 },
+    { EL_YAMYAM,               2 },
+    { EL_DARK_YAMYAM,          2 },
+    { EL_ROBOT,                        3 },
+    { EL_PACMAN,               4 },
+    { EL_PACMAN_LEFT,          4 },
+    { EL_PACMAN_RIGHT,         4 },
+    { EL_PACMAN_UP,            4 },
+    { EL_PACMAN_DOWN,          4 },
+    { EL_MOLE,                 4 },
+    { EL_MOLE_LEFT,            4 },
+    { EL_MOLE_RIGHT,           4 },
+    { EL_MOLE_UP,              4 },
+    { EL_MOLE_DOWN,            4 },
+    { EL_PENGUIN,              5 },
+    { EL_PIG,                  6 },
+    { EL_DRAGON,               6 },
+    { EL_SATELLITE,            7 },
+    { EL_SP_SNIKSNAK,          8 },
+    { EL_SP_ELECTRON,          8 },
+    { EL_BALLOON,              9 },
+
+    { -1,                      0 },
+  };
+  int i;
+
+  if (base_property_bit != EP_CAN_MOVE_INTO_ACID)
+    return -1;
+
+  for (i = 0; pb_can_move_into_acid[i].element != -1; i++)
+    if (pb_can_move_into_acid[i].element == element)
+      return pb_can_move_into_acid[i].bit_nr;
+
+  return -1;
+}
+
+void setMoveIntoAcidProperty(struct LevelInfo *level, int element, boolean set)
+{
+  int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID);
+
+  if (bit_nr > -1)
+  {
+    level->can_move_into_acid &= ~(1 << bit_nr);
+
+    if (set)
+      level->can_move_into_acid |= (1 << bit_nr);
+  }
+}
+
+boolean getMoveIntoAcidProperty(struct LevelInfo *level, int element)
+{
+  int bit_nr = get_special_property_bit(element, EP_CAN_MOVE_INTO_ACID);
+
+  if (bit_nr > -1)
+    return ((level->can_move_into_acid & (1 << bit_nr)) != 0);
+
+  return FALSE;
+}
+
 void InitElementPropertiesStatic()
 {
   static int ep_diggable[] =
@@ -2935,13 +3021,11 @@ void InitElementPropertiesStatic()
       EL_PACMAN_LEFT,          EL_PACMAN_RIGHT,
       EL_PACMAN_UP,            EL_PACMAN_DOWN
     },
-#if 1
     {
       EL_MOLE,
       EL_MOLE_LEFT,            EL_MOLE_RIGHT,
       EL_MOLE_UP,              EL_MOLE_DOWN
     },
-#endif
     {
       -1,
       -1, -1, -1, -1
@@ -3171,7 +3255,12 @@ void InitElementPropertiesEngine(int engine_version)
                                                  i == EL_BLACK_ORB));
 
     /* ---------- COULD_MOVE_INTO_ACID ------------------------------------- */
-    SET_PROPERTY(i, EP_COULD_MOVE_INTO_ACID, (CAN_MOVE(i) && i != EL_SPRING));
+    SET_PROPERTY(i, EP_COULD_MOVE_INTO_ACID, ((CAN_MOVE(i) && i != EL_SPRING)||
+                                             IS_CUSTOM_ELEMENT(i)));
+
+    /* ---------- CAN_MOVE_INTO_ACID --------------------------------------- */
+    if (getMoveIntoAcidProperty(&level, i))
+      SET_PROPERTY(i, EP_CAN_MOVE_INTO_ACID, TRUE);
 
     /* ---------- SP_PORT -------------------------------------------------- */
     SET_PROPERTY(i, EP_SP_PORT, (IS_SP_ELEMENT(i) &&
@@ -3284,69 +3373,6 @@ void InitElementPropertiesEngine(int engine_version)
     InitElementGraphicInfo();
 }
 
-int get_special_property_bit(int element, int base_property_bit)
-{
-  static struct
-  {
-    int element;
-    int bit_nr;
-  } pb_can_move_into_acid[] =
-  {
-    { EL_BUG,                  0 },
-    { EL_BUG_LEFT,             0 },
-    { EL_BUG_RIGHT,            0 },
-    { EL_BUG_UP,               0 },
-    { EL_BUG_DOWN,             0 },
-    { EL_SPACESHIP,            0 },
-    { EL_SPACESHIP_LEFT,       0 },
-    { EL_SPACESHIP_RIGHT,      0 },
-    { EL_SPACESHIP_UP,         0 },
-    { EL_SPACESHIP_DOWN,       0 },
-    { EL_BD_BUTTERFLY,         1 },
-    { EL_BD_BUTTERFLY_LEFT,    1 },
-    { EL_BD_BUTTERFLY_RIGHT,   1 },
-    { EL_BD_BUTTERFLY_UP,      1 },
-    { EL_BD_BUTTERFLY_DOWN,    1 },
-    { EL_BD_FIREFLY,           1 },
-    { EL_BD_FIREFLY_LEFT,      1 },
-    { EL_BD_FIREFLY_RIGHT,     1 },
-    { EL_BD_FIREFLY_UP,                1 },
-    { EL_BD_FIREFLY_DOWN,      1 },
-    { EL_YAMYAM,               2 },
-    { EL_DARK_YAMYAM,          2 },
-    { EL_ROBOT,                        3 },
-    { EL_PACMAN,               4 },
-    { EL_PACMAN_LEFT,          4 },
-    { EL_PACMAN_RIGHT,         4 },
-    { EL_PACMAN_UP,            4 },
-    { EL_PACMAN_DOWN,          4 },
-    { EL_MOLE,                 4 },
-    { EL_MOLE_LEFT,            4 },
-    { EL_MOLE_RIGHT,           4 },
-    { EL_MOLE_UP,              4 },
-    { EL_MOLE_DOWN,            4 },
-    { EL_PENGUIN,              5 },
-    { EL_PIG,                  6 },
-    { EL_DRAGON,               6 },
-    { EL_SATELLITE,            7 },
-    { EL_SP_SNIKSNAK,          8 },
-    { EL_SP_ELECTRON,          8 },
-    { EL_BALLOON,              9 },
-
-    { -1,                      0 },
-  };
-  int i;
-
-  if (base_property_bit != EP_CAN_MOVE_INTO_ACID)
-    return -1;
-
-  for (i = 0; pb_can_move_into_acid[i].element != -1; i++)
-    if (pb_can_move_into_acid[i].element == element)
-      return pb_can_move_into_acid[i].bit_nr;
-
-  return -1;
-}
-
 static void InitGlobal()
 {
   global.autoplay_leveldir = NULL;