rnd-20030421-1-src
[rocksndiamonds.git] / src / init.c
index 508a50af5580138576d56812052d4f5029ec8e14..9ae24facf6b7dbf064384449a81610cd96064d72 100644 (file)
@@ -363,7 +363,7 @@ void InitFontGraphicInfo()
   /* ---------- initialize font bitmap array ---------- */
 
   if (font_bitmap_info != NULL)
-    free(font_bitmap_info);
+    FreeFontInfo(font_bitmap_info);
 
   font_bitmap_info =
     checked_calloc(num_font_bitmaps * sizeof(struct FontBitmapInfo));
@@ -1110,46 +1110,6 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_pforte[] =
-  {
-    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,
-    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[] =
   {
     EL_WALL,
@@ -1267,22 +1227,38 @@ void InitElementProperties()
     EL_EMC_STEELWALL_3,
     EL_EMC_STEELWALL_4,
     EL_CRYSTAL,
-    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_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_SWITCHGATE_OPEN,
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_CLOSED,
@@ -1359,22 +1335,38 @@ void InitElementProperties()
     EL_EMC_STEELWALL_3,
     EL_EMC_STEELWALL_4,
     EL_CRYSTAL,
-    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_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_SWITCHGATE_OPEN,
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_CLOSED,
@@ -1452,22 +1444,38 @@ void InitElementProperties()
   static int ep_mauer[] =
   {
     EL_STEELWALL,
-    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_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_EXIT_CLOSED,
     EL_EXIT_OPENING,
     EL_EXIT_OPEN,
@@ -1760,22 +1768,38 @@ void InitElementProperties()
     EL_EM_KEY_2,
     EL_EM_KEY_3,
     EL_EM_KEY_4,
-    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_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_DYNAMITE,
     EL_INVISIBLE_STEELWALL,
     EL_INVISIBLE_WALL,
@@ -1949,11 +1973,74 @@ void InitElementProperties()
   {
     EL_EMPTY_SPACE,
     EL_SP_EMPTY_SPACE,
-    /* !!! EL_GATE_[1-4],    EL_GATE_[1-4]_GRAY    !!! */
-    /* !!! EL_EM_GATE_[1-4], EL_EM_GATE_[1-4]_GRAY !!! */
     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,
+    -1
+  };
+
+  static int ep_walkable_inside[] =
+  {
+    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_walkable_under[] =
+  {
+    -1
+  };
+
+  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_SWITCHGATE_OPEN,
+    EL_TIMEGATE_OPEN,
+    -1
+  };
+
+  static int ep_passable_inside[] =
+  {
+    EL_SP_PORT_LEFT,
+    EL_SP_PORT_RIGHT,
+    EL_SP_PORT_UP,
+    EL_SP_PORT_DOWN,
+    EL_SP_PORT_HORIZONTAL,
+    EL_SP_PORT_VERTICAL,
+    EL_SP_PORT_ANY,
+    EL_SP_GRAVITY_PORT_LEFT,
+    EL_SP_GRAVITY_PORT_RIGHT,
+    EL_SP_GRAVITY_PORT_UP,
+    EL_SP_GRAVITY_PORT_DOWN,
+    -1
+  };
+
+  static int ep_passable_under[] =
+  {
     -1
   };
 
@@ -2006,59 +2093,6 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_walkable_through[] =
-  {
-    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_SP_PORT_LEFT,
-    EL_SP_PORT_RIGHT,
-    EL_SP_PORT_UP,
-    EL_SP_PORT_DOWN,
-    EL_SP_PORT_HORIZONTAL,
-    EL_SP_PORT_VERTICAL,
-    EL_SP_PORT_ANY,
-    EL_SP_GRAVITY_PORT_LEFT,
-    EL_SP_GRAVITY_PORT_RIGHT,
-    EL_SP_GRAVITY_PORT_UP,
-    EL_SP_GRAVITY_PORT_DOWN,
-    EL_SWITCHGATE_OPEN,
-    EL_TIMEGATE_OPEN,
-    -1
-  };
-
-  static int ep_over_player[] =
-  {
-    EL_SP_PORT_LEFT,
-    EL_SP_PORT_RIGHT,
-    EL_SP_PORT_UP,
-    EL_SP_PORT_DOWN,
-    EL_SP_GRAVITY_PORT_LEFT,
-    EL_SP_GRAVITY_PORT_RIGHT,
-    EL_SP_GRAVITY_PORT_UP,
-    EL_SP_GRAVITY_PORT_DOWN,
-    EL_SP_PORT_HORIZONTAL,
-    EL_SP_PORT_VERTICAL,
-    EL_SP_PORT_ANY,
-    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_active_bomb[] =
   {
     EL_DYNAMITE_ACTIVE,
@@ -2121,22 +2155,6 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_walkable_under[] =
-  {
-    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_sp_element[] =
   {
     EL_SP_EMPTY,
@@ -2197,8 +2215,19 @@ void InitElementProperties()
     -1
   };
 
-  static int ep_solid_new[] =
+  static int ep_tube[] =
   {
+    EL_TUBE_LEFT_UP,
+    EL_TUBE_LEFT_DOWN,
+    EL_TUBE_RIGHT_UP,
+    EL_TUBE_RIGHT_DOWN,
+    EL_TUBE_HORIZONTAL,
+    EL_TUBE_HORIZONTAL_UP,
+    EL_TUBE_HORIZONTAL_DOWN,
+    EL_TUBE_VERTICAL,
+    EL_TUBE_VERTICAL_LEFT,
+    EL_TUBE_VERTICAL_RIGHT,
+    EL_TUBE_ANY,
     -1
   };
 
@@ -2211,7 +2240,6 @@ void InitElementProperties()
     { ep_amoebalive,           EP_AMOEBALIVE           },
     { ep_amoeboid,             EP_AMOEBOID             },
     { ep_can_be_crumbled,      EP_CAN_BE_CRUMBLED      },
-    { ep_pforte,               EP_PFORTE               },
     { ep_solid,                        EP_SOLID                },
     { ep_indestructible,       EP_INDESTRUCTIBLE       },
     { ep_slippery,             EP_SLIPPERY             },
@@ -2234,18 +2262,21 @@ void InitElementProperties()
     { ep_pushable,             EP_PUSHABLE             },
     { ep_player,               EP_PLAYER               },
     { ep_walkable_over,                EP_WALKABLE_OVER        },
+    { ep_walkable_inside,      EP_WALKABLE_INSIDE      },
+    { ep_walkable_under,       EP_WALKABLE_UNDER       },
+    { ep_passable_over,                EP_PASSABLE_OVER        },
+    { ep_passable_inside,      EP_PASSABLE_INSIDE      },
+    { ep_passable_under,       EP_PASSABLE_UNDER       },
+
     { ep_diggable,             EP_DIGGABLE             },
     { ep_collectible,          EP_COLLECTIBLE          },
-    { ep_walkable_through,     EP_WALKABLE_THROUGH     },
-    { ep_over_player,          EP_OVER_PLAYER          },
     { ep_active_bomb,          EP_ACTIVE_BOMB          },
     { ep_belt,                 EP_BELT                 },
     { ep_belt_active,          EP_BELT_ACTIVE          },
     { ep_belt_switch,          EP_BELT_SWITCH          },
-    { ep_walkable_under,       EP_WALKABLE_UNDER       },
     { ep_sp_element,           EP_SP_ELEMENT           },
     { ep_has_content,          EP_HAS_CONTENT          },
-    { ep_solid_new,            EP_SOLID_NEW            },
+    { ep_tube,                 EP_TUBE                 },
     { NULL,                    -1                      }
   };
 
@@ -2271,7 +2302,7 @@ void InitElementProperties()
     EP_PLAYER,
     EP_HAS_CONTENT,
     EP_DIGGABLE,
-    EP_WALKABLE_THROUGH,
+    EP_PASSABLE_INSIDE,
     EP_OVER_PLAYER,
     EP_ACTIVE_BOMB,
 
@@ -2299,6 +2330,28 @@ void InitElementProperties()
   for (i=EL_CHAR_START; i<=EL_CHAR_END; i++)
     SET_PROPERTY(i, EP_INACTIVE, TRUE);
 
+  /* set properties derived from other properties */
+  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+  {
+    if (IS_WALKABLE_OVER(i) || IS_WALKABLE_INSIDE(i) || IS_WALKABLE_UNDER(i))
+      SET_PROPERTY(i, EP_WALKABLE, TRUE);
+
+    if (IS_PASSABLE_OVER(i) || IS_PASSABLE_INSIDE(i) || IS_PASSABLE_UNDER(i))
+      SET_PROPERTY(i, EP_PASSABLE, TRUE);
+
+    if (IS_WALKABLE_OVER(i) || IS_PASSABLE_OVER(i))
+      SET_PROPERTY(i, EP_ACCESSIBLE_OVER, TRUE);
+
+    if (IS_WALKABLE_INSIDE(i) || IS_PASSABLE_INSIDE(i))
+      SET_PROPERTY(i, EP_ACCESSIBLE_INSIDE, TRUE);
+
+    if (IS_WALKABLE_UNDER(i) || IS_PASSABLE_UNDER(i))
+      SET_PROPERTY(i, EP_ACCESSIBLE_UNDER, TRUE);
+
+    if (IS_WALKABLE(i) || IS_PASSABLE(i))
+      SET_PROPERTY(i, EP_ACCESSIBLE, TRUE);
+  }
+
 #if 0
   /* determine inactive elements (used for engine main loop optimization) */
   for (i=0; i < MAX_NUM_ELEMENTS; i++)