rnd-20030423-2-src
[rocksndiamonds.git] / src / init.c
index 5a16867bac61e49d7ca9ed0949a60231fe75590c..6b6ed64e88fd46f06ea5e5f64aafb95b0fc3a223 100644 (file)
@@ -1078,10 +1078,8 @@ static void ReinitializeMusic()
   /* currently nothing to do */
 }
 
-void InitElementProperties()
+void InitElementPropertiesStatic()
 {
-  int i, j;
-
   static int ep_amoebalive[] =
   {
     EL_AMOEBA_WET,
@@ -1101,16 +1099,7 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_can_be_crumbled[] =
-  {
-    EL_SAND,
-    EL_LANDMINE,
-    EL_TRAP,
-    EL_TRAP_ACTIVE,
-    -1
-  };
-
-  static int ep_pforte[] =
+  static int ep_keygate[] =
   {
     EL_GATE_1,
     EL_GATE_2,
@@ -1128,29 +1117,19 @@ void InitElementProperties()
     EL_EM_GATE_2_GRAY,
     EL_EM_GATE_3_GRAY,
     EL_EM_GATE_4_GRAY,
-    EL_SWITCHGATE_OPEN,
-    EL_SWITCHGATE_OPENING,
-    EL_SWITCHGATE_CLOSED,
-    EL_SWITCHGATE_CLOSING,
-    EL_TIMEGATE_OPEN,
-    EL_TIMEGATE_OPENING,
-    EL_TIMEGATE_CLOSED,
-    EL_TIMEGATE_CLOSING,
-    EL_TUBE_ANY,
-    EL_TUBE_VERTICAL,
-    EL_TUBE_HORIZONTAL,
-    EL_TUBE_VERTICAL_LEFT,
-    EL_TUBE_VERTICAL_RIGHT,
-    EL_TUBE_HORIZONTAL_UP,
-    EL_TUBE_HORIZONTAL_DOWN,
-    EL_TUBE_LEFT_UP,
-    EL_TUBE_LEFT_DOWN,
-    EL_TUBE_RIGHT_UP,
-    EL_TUBE_RIGHT_DOWN,
     -1
   };
 
-  static int ep_solid[] =
+  static int ep_can_be_crumbled[] =
+  {
+    EL_SAND,
+    EL_LANDMINE,
+    EL_TRAP,
+    EL_TRAP_ACTIVE,
+    -1
+  };
+
+  static int ep_historic_solid[] =
   {
     EL_WALL,
     EL_EXPANDABLE_WALL,
@@ -1449,7 +1428,7 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_mauer[] =
+  static int ep_historic_wall[] =
   {
     EL_STEELWALL,
     EL_GATE_1,
@@ -1952,8 +1931,6 @@ void InitElementProperties()
     EL_SOKOBAN_FIELD_EMPTY,
     EL_EXIT_OPEN,
     EL_SP_EXIT_OPEN,
-#if 1
-    /* !!! CHANGE THIS TO "EL_GATE_1_OPEN" etc. !!! */
     EL_GATE_1,
     EL_GATE_2,
     EL_GATE_3,
@@ -1962,7 +1939,6 @@ void InitElementProperties()
     EL_GATE_2_GRAY,
     EL_GATE_3_GRAY,
     EL_GATE_4_GRAY,
-#endif
     -1
   };
 
@@ -2032,8 +2008,9 @@ void InitElementProperties()
     EL_TRAP,
     EL_INVISIBLE_SAND,
     EL_INVISIBLE_SAND_ACTIVE,
-#if 0
+#if 1
     EL_LANDMINE,
+    EL_TRAP_ACTIVE,
     EL_SP_BUGGY_BASE_ACTIVE,
 #endif
     -1
@@ -2218,13 +2195,13 @@ void InitElementProperties()
   {
     { ep_amoebalive,           EP_AMOEBALIVE           },
     { ep_amoeboid,             EP_AMOEBOID             },
+    { ep_keygate,              EP_KEYGATE              },
     { ep_can_be_crumbled,      EP_CAN_BE_CRUMBLED      },
-    { ep_pforte,               EP_PFORTE               },
-    { ep_solid,                        EP_SOLID                },
+    { ep_historic_solid,       EP_HISTORIC_SOLID       },
     { ep_indestructible,       EP_INDESTRUCTIBLE       },
     { ep_slippery,             EP_SLIPPERY             },
     { ep_enemy,                        EP_ENEMY                },
-    { ep_mauer,                        EP_MAUER                },
+    { ep_historic_wall,                EP_HISTORIC_WALL        },
     { ep_can_fall,             EP_CAN_FALL             },
     { ep_can_smash,            EP_CAN_SMASH            },
     { ep_can_change,           EP_CAN_CHANGE           },
@@ -2260,6 +2237,22 @@ void InitElementProperties()
     { NULL,                    -1                      }
   };
 
+  int i, j;
+
+  /* always start with reliable default values (element has no properties) */
+  for (i=0; i < MAX_NUM_ELEMENTS; i++)
+    for (j=0; j < NUM_ELEMENT_PROPERTIES; j++)
+      SET_PROPERTY(i, j, FALSE);
+
+  /* set all base element properties from above array definitions */
+  for (i=0; element_properties[i].elements != NULL; i++)
+    for (j=0; (element_properties[i].elements)[j] != -1; j++)
+      SET_PROPERTY((element_properties[i].elements)[j],
+                  element_properties[i].property, TRUE);
+}
+
+void InitElementPropertiesEngine(int engine_version)
+{
 #if 0
   static int active_properties[] =
   {
@@ -2295,24 +2288,42 @@ void InitElementProperties()
   };
 #endif
 
-  /* always start with reliable default values (no properties) */
-  for (i=0; i<MAX_NUM_ELEMENTS; i++)
-    for (j=0; j<NUM_EP_BITFIELDS; j++)
-      Properties[i][j] = EP_BITMASK_DEFAULT;
-
-  /* set all predefined element properties from above arrays */
-  for (i=0; element_properties[i].elements != NULL; i++)
-    for (j=0; (element_properties[i].elements)[j] != -1; j++)
-      SET_PROPERTY((element_properties[i].elements)[j],
-                  element_properties[i].property, TRUE);
+  static int no_wall_properties[] =
+  {
+    EP_AMOEBALIVE,
+    EP_AMOEBOID,
+    EP_CAN_BE_CRUMBLED,
+    EP_ENEMY,
+    EP_CAN_FALL,
+    EP_CAN_SMASH,
+    EP_CAN_MOVE,
+    EP_COULD_MOVE,
+    EP_DONT_GO_TO,
+    EP_FOOD_DARK_YAMYAM,
+    EP_GEM,
+    EP_FOOD_PENGUIN,
+    EP_PUSHABLE,
+    EP_PLAYER,
+    EP_ACCESSIBLE,
+    EP_DIGGABLE,
+    EP_COLLECTIBLE,
+    EP_ACTIVE_BOMB,
+    EP_BELT,
+    EP_BELT_ACTIVE,
+    EP_TUBE,
+    -1
+  };
 
-  /* set properties of character elements */
-  for (i=EL_CHAR_START; i<=EL_CHAR_END; i++)
-    SET_PROPERTY(i, EP_INACTIVE, TRUE);
+  int i, j;
 
-  /* set properties derived from other properties */
-  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+  /* set all special, combined or engine dependant element properties */
+  for (i=0; i < MAX_NUM_ELEMENTS; i++)
   {
+    /* ---------- INACTIVE ------------------------------------------------- */
+    if (i >= EL_CHAR_START && i <= EL_CHAR_END)
+      SET_PROPERTY(i, EP_INACTIVE, TRUE);
+
+    /* ---------- WALKABLE, PASSABLE, ACCESSIBLE --------------------------- */
     if (IS_WALKABLE_OVER(i) || IS_WALKABLE_INSIDE(i) || IS_WALKABLE_UNDER(i))
       SET_PROPERTY(i, EP_WALKABLE, TRUE);
 
@@ -2330,6 +2341,39 @@ void InitElementProperties()
 
     if (IS_WALKABLE(i) || IS_PASSABLE(i))
       SET_PROPERTY(i, EP_ACCESSIBLE, TRUE);
+
+    /* ---------- WALL ----------------------------------------------------- */
+    SET_PROPERTY(i, EP_WALL, TRUE);    /* default: element is wall */
+
+    for (j=0; no_wall_properties[j] != -1; j++)
+      if (HAS_PROPERTY(i, no_wall_properties[j]) ||
+         i >= EL_FIRST_RUNTIME_UNREAL)
+       SET_PROPERTY(i, EP_WALL, FALSE);
+
+    if (IS_HISTORIC_WALL(i))
+      SET_PROPERTY(i, EP_WALL, TRUE);
+
+    /* ---------- SOLID ---------------------------------------------------- */
+    if (engine_version < VERSION_IDENT(2,2,0))
+      SET_PROPERTY(i, EP_SOLID, IS_HISTORIC_SOLID(i));
+    else
+      SET_PROPERTY(i, EP_SOLID, (!IS_WALKABLE(i) &&
+                                !IS_DIGGABLE(i) &&
+                                !IS_COLLECTIBLE(i)));
+
+    /* ---------- DRAGONFIRE_PROOF ----------------------------------------- */
+    if (IS_HISTORIC_SOLID(i) || i == EL_EXPLOSION)
+      SET_PROPERTY(i, EP_DRAGONFIRE_PROOF, TRUE);
+
+    /* ---------- EXPLOSION_PROOF ------------------------------------------ */
+    if (i == EL_FLAMES)
+      SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE);
+    else if (engine_version < VERSION_IDENT(2,2,0))
+      SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i));
+    else
+      SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) &&
+                                          !IS_WALKABLE_OVER(i) &&
+                                          !IS_WALKABLE_UNDER(i)));
   }
 
 #if 0
@@ -2351,26 +2395,29 @@ void InitElementProperties()
   }
 #endif
 
-#if 0
-  for (i=0; i < MAX_NUM_ELEMENTS; i++)
+  /* dynamically adjust element properties according to game engine version */
   {
-    boolean element_is_solid = TRUE;
-
-    if (IS_DIGGABLE(i) ||
-       IS_COLLECTIBLE(i) ||
-       CAN_FALL(i) ||
-       CAN_MOVE(i) ||
-       IS_PUSHABLE(i))
-      element_is_solid = FALSE;
-
-    if (IS_INDESTRUCTIBLE(i))
-      element_is_solid = TRUE;
-
-    if (element_is_solid != HAS_PROPERTY(i, EP_SOLID))
-      printf("::: '%s' should %s solid\n", element_info[i].token_name,
-            (HAS_PROPERTY(i, EP_SOLID) ? "NOT be" : "be"));
+    static int ep_em_slippery_wall[] =
+    {
+      EL_STEELWALL,
+      EL_WALL,
+      EL_EXPANDABLE_WALL,
+      EL_EXPANDABLE_WALL_HORIZONTAL,
+      EL_EXPANDABLE_WALL_VERTICAL,
+      EL_EXPANDABLE_WALL_ANY,
+      -1
+    };
+
+    /* special EM style gems behaviour */
+    for (i=0; ep_em_slippery_wall[i] != -1; i++)
+      SET_PROPERTY(ep_em_slippery_wall[i], EP_EM_SLIPPERY_WALL,
+                  level.em_slippery_gems);
+
+    /* "EL_EXPANDABLE_WALL_GROWING" wasn't slippery for EM gems in 2.0.1 */
+    SET_PROPERTY(EL_EXPANDABLE_WALL_GROWING, EP_EM_SLIPPERY_WALL,
+                (level.em_slippery_gems &&
+                 engine_version > VERSION_IDENT(2,0,1)));
   }
-#endif
 }
 
 static void InitGlobal()
@@ -2907,7 +2954,7 @@ void OpenAll()
 
   InitEventFilter(FilterMouseMotionEvents);
 
-  InitElementProperties();
+  InitElementPropertiesStatic();
 
   InitGfx();