rnd-20021006-1-src
[rocksndiamonds.git] / src / init.c
index c2e69b87e351f5a6487a7daabfcedc2355d4c6b3..32b2cb8e3d6504c2f426e26ba65b554695b3c855 100644 (file)
@@ -26,6 +26,9 @@
 #include "cartoons.h"
 #include "config.h"
 
+#include "conf_e2g.c"  /* include auto-generated data structure definitions */
+
+
 static char *image_filename[NUM_PICTURES] =
 {
   "RocksScreen.pcx",
@@ -556,8 +559,7 @@ void InitGadgets()
 
 void InitElementInfo()
 {
-  int i, j;
-
+#if 0
   static struct
   {
     int element;
@@ -575,7 +577,6 @@ void InitElementInfo()
     { EL_EXIT_OPENING,                 GFX_AUSGANG_ACT         },
     { EL_EXIT_OPEN,                    GFX_AUSGANG_AUF         },
     { EL_SP_EXIT_OPEN,                 GFX_SP_EXIT             },
-    { EL_PLAYER,                       GFX_SPIELFIGUR          },
     { EL_PLAYER1,                      GFX_SPIELER1            },
     { EL_PLAYER2,                      GFX_SPIELER2            },
     { EL_PLAYER3,                      GFX_SPIELER3            },
@@ -653,6 +654,7 @@ void InitElementInfo()
     { EL_PACMAN_LEFT,                  GFX_PACMAN_LEFT         },
     { EL_PACMAN_DOWN,                  GFX_PACMAN_DOWN         },
     { EL_INVISIBLE_WALL,               GFX_UNSICHTBAR          },
+    { EL_INVISIBLE_WALL_ACTIVE,                GFX_UNSICHTBAR_ON       },
     { EL_WALL_EMERALD,                 GFX_ERZ_EDEL            },
     { EL_WALL_DIAMOND,                 GFX_ERZ_DIAM            },
     { EL_LAMP,                         GFX_BIRNE_AUS           },
@@ -677,10 +679,10 @@ void InitElementInfo()
     { EL_BD_MAGIC_WALL_EMPTYING,       GFX_MAGIC_WALL_BD_EMPTY },
     { EL_BD_MAGIC_WALL_FULL,           GFX_MAGIC_WALL_BD_FULL  },
     { EL_BD_MAGIC_WALL_DEAD,           GFX_MAGIC_WALL_BD_DEAD  },
-    { EL_DYNABOMB_ACTIVE_1,            GFX_DYNABOMB            },
-    { EL_DYNABOMB_ACTIVE_2,            GFX_DYNABOMB            },
-    { EL_DYNABOMB_ACTIVE_3,            GFX_DYNABOMB            },
-    { EL_DYNABOMB_ACTIVE_4,            GFX_DYNABOMB            },
+    { EL_DYNABOMB_PLAYER1_ACTIVE,      GFX_DYNABOMB            },
+    { EL_DYNABOMB_PLAYER2_ACTIVE,      GFX_DYNABOMB            },
+    { EL_DYNABOMB_PLAYER3_ACTIVE,      GFX_DYNABOMB            },
+    { EL_DYNABOMB_PLAYER4_ACTIVE,      GFX_DYNABOMB            },
     { EL_DYNABOMB_NR,                  GFX_DYNABOMB_NR         },
     { EL_DYNABOMB_SZ,                  GFX_DYNABOMB_SZ         },
     { EL_DYNABOMB_XL,                  GFX_DYNABOMB_XL         },
@@ -701,6 +703,7 @@ void InitElementInfo()
     { EL_SP_BUGGY_BASE_ACTIVE,         GFX_SP_BUG_ACTIVE       },
     { EL_SP_ZONK,                      GFX_SP_ZONK             },
     { EL_INVISIBLE_STEELWALL,          GFX_INVISIBLE_STEEL     },
+    { EL_INVISIBLE_STEELWALL_ACTIVE,   GFX_INVISIBLE_STEEL_ON  },
     { EL_BLACK_ORB,                    GFX_BLACK_ORB           },
     { EL_EM_GATE1,                     GFX_EM_GATE_1           },
     { EL_EM_GATE2,                     GFX_EM_GATE_2           },
@@ -790,6 +793,7 @@ void InitElementInfo()
     { EL_MOLE_DOWN,                    GFX_MOLE_DOWN           },
     { EL_STEELWALL_SLANTED,            GFX_STEEL_SLANTED       },
     { EL_INVISIBLE_SAND,               GFX_SAND_INVISIBLE      },
+    { EL_INVISIBLE_SAND_ACTIVE,                GFX_SAND_INVISIBLE_ON   },
     { EL_DX_UNKNOWN_15,                        GFX_DX_UNKNOWN_15       },
     { EL_DX_UNKNOWN_42,                        GFX_DX_UNKNOWN_42       },
     { EL_TIMEGATE_OPEN,                        GFX_TIMEGATE_OPEN       },
@@ -917,21 +921,33 @@ void InitElementInfo()
       -1,                      -1
     }
   };
+#endif
 
-  /* always start with reliable default values */
+  int i, act, dir;
+
+  /* set values to -1 to identify later as "uninitialized" values */
   for(i=0; i<MAX_ELEMENTS; i++)
   {
-    for(j=0; j<NUM_GFX_ACTIONS_MAPPED; j++)
+    for(act=0; act<NUM_GFX_ACTIONS_MAPPED; act++)
     {
-      element_info[i].graphic[j] = GFX_LEERRAUM;
-      element_info[i].has_direction_graphic[j] = FALSE;
+      element_info[i].graphic[act] = -1;
+
+      for(dir=0; dir<NUM_MV_DIRECTIONS; dir++)
+       element_info[i].direction_graphic[act][dir] = -1;
     }
   }
 
+#if 0
   for (i=EL_CHAR_START; i<=EL_CHAR_END; i++)
     element_info[i].graphic[GFX_ACTION_DEFAULT] =
       GFX_CHAR_START + (i - EL_CHAR_START);
+#else
+  for (i=EL_CHAR_START; i<=EL_CHAR_END; i++)
+    element_info[i].graphic[GFX_ACTION_DEFAULT] =
+      IMG_CHAR_START + (i - EL_CHAR_START);
+#endif
 
+#if 0
   for (i=EL_SP_START; i<=EL_SP_END; i++)
   {
     int nr_element = i - EL_SP_START;
@@ -943,7 +959,9 @@ void InitElementInfo()
     element_info[i].graphic[GFX_ACTION_DEFAULT] =
       GFX_START_ROCKSSP + nr_graphic;
   }
+#endif
 
+#if 0
   /* this overrides some of the above default settings (GFX_SP_ZONK etc.) */
   i = 0;
   while (element_to_graphic[i].element > -1)
@@ -973,6 +991,73 @@ void InitElementInfo()
     element_info[element].has_direction_graphic[GFX_ACTION_DEFAULT] = TRUE;
     i++;
   }
+#else
+
+  i = 0;
+  while (element_to_graphic[i].element > -1)
+  {
+    int element   = element_to_graphic[i].element;
+    int direction = element_to_graphic[i].direction;
+    int action    = element_to_graphic[i].action;
+    int graphic   = element_to_graphic[i].graphic;
+
+    if (action > -1)
+      action = graphics_action_mapping[action];
+    else
+      action = GFX_ACTION_DEFAULT;
+
+    if (direction > -1)
+    {
+      direction = MV_DIR_BIT(direction);
+
+      element_info[element].direction_graphic[action][direction] = graphic;
+    }
+    else
+      element_info[element].graphic[action] = graphic;
+
+    i++;
+  }
+
+  /* now set all '-1' values to element specific default values */
+  for(i=0; i<MAX_ELEMENTS; i++)
+  {
+    int default_action_graphic = element_info[i].graphic[GFX_ACTION_DEFAULT];
+    int default_action_direction_graphic[NUM_MV_DIRECTIONS];
+
+    if (default_action_graphic == -1)
+      default_action_graphic = IMG_CHAR_QUESTION;
+
+    for(dir=0; dir<NUM_MV_DIRECTIONS; dir++)
+    {
+      default_action_direction_graphic[dir] =
+       element_info[i].direction_graphic[GFX_ACTION_DEFAULT][dir];
+
+      if (default_action_direction_graphic[dir] == -1)
+       default_action_direction_graphic[dir] = default_action_graphic;
+    }
+
+    for(act=0; act<NUM_GFX_ACTIONS_MAPPED; act++)
+    {
+      for(dir=0; dir<NUM_MV_DIRECTIONS; dir++)
+      {
+       int default_direction_graphic = element_info[i].graphic[act];
+
+       /* no graphic for current action -- use default direction graphic */
+       if (default_direction_graphic == -1)
+         default_direction_graphic = default_action_direction_graphic[dir];
+
+       if (element_info[i].direction_graphic[act][dir] == -1)
+         element_info[i].direction_graphic[act][dir] =
+           default_direction_graphic;
+      }
+
+      /* no graphic for this specific action -- use default action graphic */
+      if (element_info[i].graphic[act] == -1)
+       element_info[i].graphic[act] = default_action_graphic;
+    }
+  }
+
+#endif
 }
 
 static void InitGraphicInfo()
@@ -996,10 +1081,19 @@ static void InitGraphicInfo()
   {
     int *parameter = image_files[i].parameter;
 
-    /* always start with reliable default values */
     new_graphic_info[i].bitmap = getBitmapFromImageID(i);
+
     new_graphic_info[i].src_x = parameter[GFX_ARG_XPOS] * TILEX;
     new_graphic_info[i].src_y = parameter[GFX_ARG_YPOS] * TILEY;
+    new_graphic_info[i].offset_x = parameter[GFX_ARG_OFFSET];
+    new_graphic_info[i].offset_y = 0;
+
+    /* animation frames are ordered vertically instead of horizontally */
+    if (parameter[GFX_ARG_VERTICAL])
+    {
+      new_graphic_info[i].offset_x = 0;
+      new_graphic_info[i].offset_y = parameter[GFX_ARG_OFFSET];
+    }
 
     new_graphic_info[i].anim_frames = parameter[GFX_ARG_FRAMES];
 
@@ -1007,22 +1101,26 @@ static void InitGraphicInfo()
     if (new_graphic_info[i].anim_delay == 0)   /* delay must be at least 1 */
       new_graphic_info[i].anim_delay = 1;
 
-    /* basically, animation can be either normal or reverse direction */
-    if (parameter[GFX_ARG_REVERSE])
-      new_graphic_info[i].anim_mode = ANIM_REVERSE;
+    /* set mode for animation frame order */
+    if (parameter[GFX_ARG_MODE_LOOP])
+      new_graphic_info[i].anim_mode = ANIM_LOOP;
+    else if (parameter[GFX_ARG_MODE_LINEAR])
+      new_graphic_info[i].anim_mode = ANIM_LINEAR;
+    else if (parameter[GFX_ARG_MODE_PINGPONG])
+      new_graphic_info[i].anim_mode = ANIM_PINGPONG;
+    else if (parameter[GFX_ARG_MODE_PINGPONG2])
+      new_graphic_info[i].anim_mode = ANIM_PINGPONG2;
+    else if (parameter[GFX_ARG_FRAMES] > 1)
+      new_graphic_info[i].anim_mode = ANIM_LOOP;
     else
-      new_graphic_info[i].anim_mode = ANIM_NORMAL;
+      new_graphic_info[i].anim_mode = ANIM_NONE;
 
-    /* additionally, animation can be either pingpong or pingpong2 layout */
-    if (parameter[GFX_ARG_PINGPONG])
-      new_graphic_info[i].anim_mode |= ANIM_PINGPONG;
-    else if (parameter[GFX_ARG_PINGPONG2])
-      new_graphic_info[i].anim_mode |= ANIM_PINGPONG2;
+    /* set additional flag to play animation frames in reverse order */
+    if (parameter[GFX_ARG_MODE_REVERSE])
+      new_graphic_info[i].anim_mode |= ANIM_REVERSE;
 
     /* animation synchronized with global frame counter, not move position */
     new_graphic_info[i].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC];
-
-    new_graphic_info[i].anim_vertical = parameter[GFX_ARG_VERTICAL];
   }
 
 #if 0
@@ -1191,6 +1289,9 @@ void InitElementProperties()
     EL_SP_EXIT_CLOSED,
     EL_SP_EXIT_OPEN,
     EL_INVISIBLE_STEELWALL,
+    EL_INVISIBLE_STEELWALL_ACTIVE,
+    EL_INVISIBLE_WALL,
+    EL_INVISIBLE_WALL_ACTIVE,
     EL_CONVEYOR_BELT1_SWITCH_LEFT,
     EL_CONVEYOR_BELT1_SWITCH_MIDDLE,
     EL_CONVEYOR_BELT1_SWITCH_RIGHT,
@@ -1296,6 +1397,7 @@ void InitElementProperties()
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
     EL_INVISIBLE_STEELWALL,
+    EL_INVISIBLE_STEELWALL_ACTIVE,
     EL_CONVEYOR_BELT1_SWITCH_LEFT,
     EL_CONVEYOR_BELT1_SWITCH_MIDDLE,
     EL_CONVEYOR_BELT1_SWITCH_RIGHT,
@@ -1469,6 +1571,9 @@ void InitElementProperties()
     EL_SP_EXIT_CLOSED,
     EL_SP_EXIT_OPEN,
     EL_INVISIBLE_STEELWALL,
+    EL_INVISIBLE_STEELWALL_ACTIVE,
+    EL_INVISIBLE_WALL,
+    EL_INVISIBLE_WALL_ACTIVE,
     EL_STEELWALL_SLANTED,
     EL_EMC_STEELWALL1,
     EL_EMC_STEELWALL2,
@@ -1675,7 +1780,7 @@ void InitElementProperties()
     EL_EXIT_CLOSED,
     EL_EXIT_OPEN,
     EL_STEELWALL,
-    EL_PLAYER,
+    EL_PLAYER1,
     EL_BD_FIREFLY,
     EL_BD_FIREFLY_1,
     EL_BD_FIREFLY_2,
@@ -1698,7 +1803,7 @@ void InitElementProperties()
     EL_SOKOBAN_OBJECT,
     EL_SOKOBAN_FIELD_EMPTY,
     EL_SOKOBAN_FIELD_FULL,
-    EL_PLAYER,
+    EL_PLAYER1,
     EL_INVISIBLE_STEELWALL
   };
   static int ep_sb_element_num = SIZEOF_ARRAY_INT(ep_sb_element);
@@ -1751,7 +1856,9 @@ void InitElementProperties()
     EL_EM_GATE3_GRAY,
     EL_EM_GATE4_GRAY,
     EL_DYNAMITE,
+    EL_INVISIBLE_STEELWALL,
     EL_INVISIBLE_WALL,
+    EL_INVISIBLE_SAND,
     EL_LAMP,
     EL_LAMP_ACTIVE,
     EL_WALL_EMERALD,
@@ -1808,7 +1915,6 @@ void InitElementProperties()
     EL_SP_HARD_BASE4,
     EL_SP_HARD_BASE5,
     EL_SP_HARD_BASE6,
-    EL_INVISIBLE_STEELWALL,
     EL_CONVEYOR_BELT1_SWITCH_LEFT,
     EL_CONVEYOR_BELT1_SWITCH_MIDDLE,
     EL_CONVEYOR_BELT1_SWITCH_RIGHT,
@@ -1854,10 +1960,10 @@ void InitElementProperties()
     EL_BOMB,
     EL_DYNAMITE_ACTIVE,
     EL_DYNAMITE,
-    EL_DYNABOMB_ACTIVE_1,
-    EL_DYNABOMB_ACTIVE_2,
-    EL_DYNABOMB_ACTIVE_3,
-    EL_DYNABOMB_ACTIVE_4,
+    EL_DYNABOMB_PLAYER1_ACTIVE,
+    EL_DYNABOMB_PLAYER2_ACTIVE,
+    EL_DYNABOMB_PLAYER3_ACTIVE,
+    EL_DYNABOMB_PLAYER4_ACTIVE,
     EL_DYNABOMB_NR,
     EL_DYNABOMB_SZ,
     EL_DYNABOMB_XL,
@@ -1910,7 +2016,6 @@ void InitElementProperties()
 
   static int ep_player[] =
   {
-    EL_PLAYER,
     EL_PLAYER1,
     EL_PLAYER2,
     EL_PLAYER3,
@@ -1934,7 +2039,8 @@ void InitElementProperties()
     EL_SP_BASE,
     EL_SP_BUGGY_BASE,
     EL_TRAP,
-    EL_INVISIBLE_SAND
+    EL_INVISIBLE_SAND,
+    EL_INVISIBLE_SAND_ACTIVE
   };
   static int ep_eatable_num = SIZEOF_ARRAY_INT(ep_eatable);
 
@@ -2044,10 +2150,10 @@ void InitElementProperties()
   static int ep_active_bomb[] =
   {
     EL_DYNAMITE_ACTIVE,
-    EL_DYNABOMB_ACTIVE_1,
-    EL_DYNABOMB_ACTIVE_2,
-    EL_DYNABOMB_ACTIVE_3,
-    EL_DYNABOMB_ACTIVE_4
+    EL_DYNABOMB_PLAYER1_ACTIVE,
+    EL_DYNABOMB_PLAYER2_ACTIVE,
+    EL_DYNABOMB_PLAYER3_ACTIVE,
+    EL_DYNABOMB_PLAYER4_ACTIVE
   };
   static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb);