rnd-20030423-2-src
[rocksndiamonds.git] / src / init.c
index 9ae24facf6b7dbf064384449a81610cd96064d72..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,6 +1099,27 @@ void InitElementProperties()
     -1
   };
 
+  static int ep_keygate[] =
+  {
+    EL_GATE_1,
+    EL_GATE_2,
+    EL_GATE_3,
+    EL_GATE_4,
+    EL_GATE_1_GRAY,
+    EL_GATE_2_GRAY,
+    EL_GATE_3_GRAY,
+    EL_GATE_4_GRAY,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1_GRAY,
+    EL_EM_GATE_2_GRAY,
+    EL_EM_GATE_3_GRAY,
+    EL_EM_GATE_4_GRAY,
+    -1
+  };
+
   static int ep_can_be_crumbled[] =
   {
     EL_SAND,
@@ -1110,7 +1129,7 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_solid[] =
+  static int ep_historic_solid[] =
   {
     EL_WALL,
     EL_EXPANDABLE_WALL,
@@ -1227,38 +1246,22 @@ void InitElementProperties()
     EL_EMC_STEELWALL_3,
     EL_EMC_STEELWALL_4,
     EL_CRYSTAL,
-    EL_GATE_1_CLOSED,
-    EL_GATE_2_CLOSED,
-    EL_GATE_3_CLOSED,
-    EL_GATE_4_CLOSED,
-    EL_GATE_1_OPEN,
-    EL_GATE_2_OPEN,
-    EL_GATE_3_OPEN,
-    EL_GATE_4_OPEN,
-    EL_GATE_1_GRAY_CLOSED,
-    EL_GATE_2_GRAY_CLOSED,
-    EL_GATE_3_GRAY_CLOSED,
-    EL_GATE_4_GRAY_CLOSED,
-    EL_GATE_1_GRAY_OPEN,
-    EL_GATE_2_GRAY_OPEN,
-    EL_GATE_3_GRAY_OPEN,
-    EL_GATE_4_GRAY_OPEN,
-    EL_EM_GATE_1_CLOSED,
-    EL_EM_GATE_2_CLOSED,
-    EL_EM_GATE_3_CLOSED,
-    EL_EM_GATE_4_CLOSED,
-    EL_EM_GATE_1_OPEN,
-    EL_EM_GATE_2_OPEN,
-    EL_EM_GATE_3_OPEN,
-    EL_EM_GATE_4_OPEN,
-    EL_EM_GATE_1_GRAY_CLOSED,
-    EL_EM_GATE_2_GRAY_CLOSED,
-    EL_EM_GATE_3_GRAY_CLOSED,
-    EL_EM_GATE_4_GRAY_CLOSED,
-    EL_EM_GATE_1_GRAY_OPEN,
-    EL_EM_GATE_2_GRAY_OPEN,
-    EL_EM_GATE_3_GRAY_OPEN,
-    EL_EM_GATE_4_GRAY_OPEN,
+    EL_GATE_1,
+    EL_GATE_2,
+    EL_GATE_3,
+    EL_GATE_4,
+    EL_GATE_1_GRAY,
+    EL_GATE_2_GRAY,
+    EL_GATE_3_GRAY,
+    EL_GATE_4_GRAY,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1_GRAY,
+    EL_EM_GATE_2_GRAY,
+    EL_EM_GATE_3_GRAY,
+    EL_EM_GATE_4_GRAY,
     EL_SWITCHGATE_OPEN,
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_CLOSED,
@@ -1335,38 +1338,22 @@ void InitElementProperties()
     EL_EMC_STEELWALL_3,
     EL_EMC_STEELWALL_4,
     EL_CRYSTAL,
-    EL_GATE_1_CLOSED,
-    EL_GATE_2_CLOSED,
-    EL_GATE_3_CLOSED,
-    EL_GATE_4_CLOSED,
-    EL_GATE_1_OPEN,
-    EL_GATE_2_OPEN,
-    EL_GATE_3_OPEN,
-    EL_GATE_4_OPEN,
-    EL_GATE_1_GRAY_CLOSED,
-    EL_GATE_2_GRAY_CLOSED,
-    EL_GATE_3_GRAY_CLOSED,
-    EL_GATE_4_GRAY_CLOSED,
-    EL_GATE_1_GRAY_OPEN,
-    EL_GATE_2_GRAY_OPEN,
-    EL_GATE_3_GRAY_OPEN,
-    EL_GATE_4_GRAY_OPEN,
-    EL_EM_GATE_1_CLOSED,
-    EL_EM_GATE_2_CLOSED,
-    EL_EM_GATE_3_CLOSED,
-    EL_EM_GATE_4_CLOSED,
-    EL_EM_GATE_1_OPEN,
-    EL_EM_GATE_2_OPEN,
-    EL_EM_GATE_3_OPEN,
-    EL_EM_GATE_4_OPEN,
-    EL_EM_GATE_1_GRAY_CLOSED,
-    EL_EM_GATE_2_GRAY_CLOSED,
-    EL_EM_GATE_3_GRAY_CLOSED,
-    EL_EM_GATE_4_GRAY_CLOSED,
-    EL_EM_GATE_1_GRAY_OPEN,
-    EL_EM_GATE_2_GRAY_OPEN,
-    EL_EM_GATE_3_GRAY_OPEN,
-    EL_EM_GATE_4_GRAY_OPEN,
+    EL_GATE_1,
+    EL_GATE_2,
+    EL_GATE_3,
+    EL_GATE_4,
+    EL_GATE_1_GRAY,
+    EL_GATE_2_GRAY,
+    EL_GATE_3_GRAY,
+    EL_GATE_4_GRAY,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1_GRAY,
+    EL_EM_GATE_2_GRAY,
+    EL_EM_GATE_3_GRAY,
+    EL_EM_GATE_4_GRAY,
     EL_SWITCHGATE_OPEN,
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_CLOSED,
@@ -1441,41 +1428,25 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_mauer[] =
+  static int ep_historic_wall[] =
   {
     EL_STEELWALL,
-    EL_GATE_1_CLOSED,
-    EL_GATE_2_CLOSED,
-    EL_GATE_3_CLOSED,
-    EL_GATE_4_CLOSED,
-    EL_GATE_1_OPEN,
-    EL_GATE_2_OPEN,
-    EL_GATE_3_OPEN,
-    EL_GATE_4_OPEN,
-    EL_GATE_1_GRAY_CLOSED,
-    EL_GATE_2_GRAY_CLOSED,
-    EL_GATE_3_GRAY_CLOSED,
-    EL_GATE_4_GRAY_CLOSED,
-    EL_GATE_1_GRAY_OPEN,
-    EL_GATE_2_GRAY_OPEN,
-    EL_GATE_3_GRAY_OPEN,
-    EL_GATE_4_GRAY_OPEN,
-    EL_EM_GATE_1_CLOSED,
-    EL_EM_GATE_2_CLOSED,
-    EL_EM_GATE_3_CLOSED,
-    EL_EM_GATE_4_CLOSED,
-    EL_EM_GATE_1_OPEN,
-    EL_EM_GATE_2_OPEN,
-    EL_EM_GATE_3_OPEN,
-    EL_EM_GATE_4_OPEN,
-    EL_EM_GATE_1_GRAY_CLOSED,
-    EL_EM_GATE_2_GRAY_CLOSED,
-    EL_EM_GATE_3_GRAY_CLOSED,
-    EL_EM_GATE_4_GRAY_CLOSED,
-    EL_EM_GATE_1_GRAY_OPEN,
-    EL_EM_GATE_2_GRAY_OPEN,
-    EL_EM_GATE_3_GRAY_OPEN,
-    EL_EM_GATE_4_GRAY_OPEN,
+    EL_GATE_1,
+    EL_GATE_2,
+    EL_GATE_3,
+    EL_GATE_4,
+    EL_GATE_1_GRAY,
+    EL_GATE_2_GRAY,
+    EL_GATE_3_GRAY,
+    EL_GATE_4_GRAY,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1_GRAY,
+    EL_EM_GATE_2_GRAY,
+    EL_EM_GATE_3_GRAY,
+    EL_EM_GATE_4_GRAY,
     EL_EXIT_CLOSED,
     EL_EXIT_OPENING,
     EL_EXIT_OPEN,
@@ -1768,38 +1739,22 @@ void InitElementProperties()
     EL_EM_KEY_2,
     EL_EM_KEY_3,
     EL_EM_KEY_4,
-    EL_GATE_1_CLOSED,
-    EL_GATE_2_CLOSED,
-    EL_GATE_3_CLOSED,
-    EL_GATE_4_CLOSED,
-    EL_GATE_1_OPEN,
-    EL_GATE_2_OPEN,
-    EL_GATE_3_OPEN,
-    EL_GATE_4_OPEN,
-    EL_GATE_1_GRAY_CLOSED,
-    EL_GATE_2_GRAY_CLOSED,
-    EL_GATE_3_GRAY_CLOSED,
-    EL_GATE_4_GRAY_CLOSED,
-    EL_GATE_1_GRAY_OPEN,
-    EL_GATE_2_GRAY_OPEN,
-    EL_GATE_3_GRAY_OPEN,
-    EL_GATE_4_GRAY_OPEN,
-    EL_EM_GATE_1_CLOSED,
-    EL_EM_GATE_2_CLOSED,
-    EL_EM_GATE_3_CLOSED,
-    EL_EM_GATE_4_CLOSED,
-    EL_EM_GATE_1_OPEN,
-    EL_EM_GATE_2_OPEN,
-    EL_EM_GATE_3_OPEN,
-    EL_EM_GATE_4_OPEN,
-    EL_EM_GATE_1_GRAY_CLOSED,
-    EL_EM_GATE_2_GRAY_CLOSED,
-    EL_EM_GATE_3_GRAY_CLOSED,
-    EL_EM_GATE_4_GRAY_CLOSED,
-    EL_EM_GATE_1_GRAY_OPEN,
-    EL_EM_GATE_2_GRAY_OPEN,
-    EL_EM_GATE_3_GRAY_OPEN,
-    EL_EM_GATE_4_GRAY_OPEN,
+    EL_GATE_1,
+    EL_GATE_2,
+    EL_GATE_3,
+    EL_GATE_4,
+    EL_GATE_1_GRAY,
+    EL_GATE_2_GRAY,
+    EL_GATE_3_GRAY,
+    EL_GATE_4_GRAY,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1_GRAY,
+    EL_EM_GATE_2_GRAY,
+    EL_EM_GATE_3_GRAY,
+    EL_EM_GATE_4_GRAY,
     EL_DYNAMITE,
     EL_INVISIBLE_STEELWALL,
     EL_INVISIBLE_WALL,
@@ -1976,14 +1931,14 @@ void InitElementProperties()
     EL_SOKOBAN_FIELD_EMPTY,
     EL_EXIT_OPEN,
     EL_SP_EXIT_OPEN,
-    EL_GATE_1_OPEN,
-    EL_GATE_2_OPEN,
-    EL_GATE_3_OPEN,
-    EL_GATE_4_OPEN,
-    EL_GATE_1_GRAY_OPEN,
-    EL_GATE_2_GRAY_OPEN,
-    EL_GATE_3_GRAY_OPEN,
-    EL_GATE_4_GRAY_OPEN,
+    EL_GATE_1,
+    EL_GATE_2,
+    EL_GATE_3,
+    EL_GATE_4,
+    EL_GATE_1_GRAY,
+    EL_GATE_2_GRAY,
+    EL_GATE_3_GRAY,
+    EL_GATE_4_GRAY,
     -1
   };
 
@@ -2010,14 +1965,14 @@ void InitElementProperties()
 
   static int ep_passable_over[] =
   {
-    EL_EM_GATE_1_OPEN,
-    EL_EM_GATE_2_OPEN,
-    EL_EM_GATE_3_OPEN,
-    EL_EM_GATE_4_OPEN,
-    EL_EM_GATE_1_GRAY_OPEN,
-    EL_EM_GATE_2_GRAY_OPEN,
-    EL_EM_GATE_3_GRAY_OPEN,
-    EL_EM_GATE_4_GRAY_OPEN,
+    EL_EM_GATE_1,
+    EL_EM_GATE_2,
+    EL_EM_GATE_3,
+    EL_EM_GATE_4,
+    EL_EM_GATE_1_GRAY,
+    EL_EM_GATE_2_GRAY,
+    EL_EM_GATE_3_GRAY,
+    EL_EM_GATE_4_GRAY,
     EL_SWITCHGATE_OPEN,
     EL_TIMEGATE_OPEN,
     -1
@@ -2053,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
@@ -2239,12 +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_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           },
@@ -2280,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[] =
   {
@@ -2315,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);
 
@@ -2350,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
@@ -2371,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()
@@ -2927,7 +2954,7 @@ void OpenAll()
 
   InitEventFilter(FilterMouseMotionEvents);
 
-  InitElementProperties();
+  InitElementPropertiesStatic();
 
   InitGfx();