rnd-20040224-1-src
[rocksndiamonds.git] / src / init.c
index 142c21bc6bdfc63dbff6c31f1382dfa8cc152480..ed480b14b4aca78fbb7eb8b797988e0941b57724 100644 (file)
@@ -1569,6 +1569,94 @@ 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[] =
+  {
+    /* all element that can move */
+    { 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       },
+    { EL_SPRING,               10      },
+
+    { -1,                      -1      },
+  };
+  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[] =
@@ -1826,6 +1914,7 @@ void InitElementPropertiesStatic()
 
   static int ep_can_move[] =
   {
+    /* same elements as in 'pb_can_move_into_acid' */
     EL_BUG,
     EL_SPACESHIP,
     EL_BD_BUTTERFLY,
@@ -2935,6 +3024,11 @@ void InitElementPropertiesStatic()
       EL_PACMAN_LEFT,          EL_PACMAN_RIGHT,
       EL_PACMAN_UP,            EL_PACMAN_DOWN
     },
+    {
+      EL_MOLE,
+      EL_MOLE_LEFT,            EL_MOLE_RIGHT,
+      EL_MOLE_UP,              EL_MOLE_DOWN
+    },
     {
       -1,
       -1, -1, -1, -1
@@ -3021,6 +3115,7 @@ void InitElementPropertiesEngine(int engine_version)
     EP_ACTIVE_BOMB,
 
     EP_ACCESSIBLE,
+
     -1
   };
 
@@ -3030,6 +3125,12 @@ void InitElementPropertiesEngine(int engine_version)
   InitElementPropertiesStatic();
 #endif
 
+  /* important: after initialization in InitElementPropertiesStatic(), the
+     elements are not again initialized to a default value; therefore all
+     changes have to make sure that they leave the element with a defined
+     property (which means that conditional property changes must be set to
+     a reliable default value before) */
+
   /* set all special, combined or engine dependent element properties */
   for (i = 0; i < MAX_NUM_ELEMENTS; i++)
   {
@@ -3039,8 +3140,7 @@ void InitElementPropertiesEngine(int engine_version)
 #endif
 
     /* ---------- INACTIVE ------------------------------------------------- */
-    if (i >= EL_CHAR_START && i <= EL_CHAR_END)
-      SET_PROPERTY(i, EP_INACTIVE, TRUE);
+    SET_PROPERTY(i, EP_INACTIVE, (i >= EL_CHAR_START && i <= EL_CHAR_END));
 
     /* ---------- WALKABLE, PASSABLE, ACCESSIBLE --------------------------- */
     SET_PROPERTY(i, EP_WALKABLE, (IS_WALKABLE_OVER(i) ||
@@ -3092,9 +3192,11 @@ void InitElementPropertiesEngine(int engine_version)
                                             !IS_DIGGABLE(i) &&
                                             !IS_COLLECTIBLE(i)));
 
+#if 1
     /* ---------- PROTECTED ------------------------------------------------ */
     if (IS_ACCESSIBLE_INSIDE(i))
       SET_PROPERTY(i, EP_PROTECTED, TRUE);
+#endif
 
     /* ---------- DRAGONFIRE_PROOF ----------------------------------------- */
 
@@ -3127,6 +3229,8 @@ void InitElementPropertiesEngine(int engine_version)
 
     if (IS_CUSTOM_ELEMENT(i))
     {
+      /* these are additional properties which are initially false when set */
+
       /* ---------- DONT_COLLIDE_WITH / DONT_RUN_INTO ---------------------- */
       if (DONT_TOUCH(i))
        SET_PROPERTY(i, EP_DONT_COLLIDE_WITH, TRUE);
@@ -3162,6 +3266,14 @@ void InitElementPropertiesEngine(int engine_version)
     SET_PROPERTY(i, EP_CAN_EXPLODE_BY_EXPLOSION, (CAN_EXPLODE_BY_FIRE(i) ||
                                                  i == EL_BLACK_ORB));
 
+    /* ---------- COULD_MOVE_INTO_ACID ------------------------------------- */
+    SET_PROPERTY(i, EP_COULD_MOVE_INTO_ACID, (CAN_MOVE(i) ||
+                                             IS_CUSTOM_ELEMENT(i)));
+
+    /* ---------- CAN_MOVE_INTO_ACID --------------------------------------- */
+    if (!IS_CUSTOM_ELEMENT(i))
+      SET_PROPERTY(i, EP_CAN_MOVE_INTO_ACID,getMoveIntoAcidProperty(&level,i));
+
     /* ---------- SP_PORT -------------------------------------------------- */
     SET_PROPERTY(i, EP_SP_PORT, (IS_SP_ELEMENT(i) &&
                                 IS_PASSABLE_INSIDE(i)));
@@ -3260,6 +3372,8 @@ void InitElementPropertiesEngine(int engine_version)
     {
       int element = EL_CUSTOM_START + i;
 
+      element_info[element].access_direction = MV_ALL_DIRECTIONS;
+
       element_info[element].explosion_delay = 18;
       element_info[element].ignition_delay = 8;
     }