rnd-20031115-1-src
[rocksndiamonds.git] / src / init.c
index 86b4ecaec8e64acd0d09510a9fcb2a485dea11a5..6db9d2463deae2799248ff3d5cc1058540cf8da5 100644 (file)
@@ -24,6 +24,7 @@
 #include "network.h"
 #include "netserv.h"
 #include "cartoons.h"
+#include "config.h"
 
 #include "conf_e2g.c"  /* include auto-generated data structure definitions */
 #include "conf_esg.c"  /* include auto-generated data structure definitions */
@@ -291,8 +292,13 @@ void InitFontGraphicInfo()
   /* ---------- initialize font graphic definitions ---------- */
 
   /* always start with reliable default values (normal font graphics) */
+#if 1
+  for (i=0; i < NUM_FONTS; i++)
+    font_info[i].graphic = IMG_FONT_INITIAL_1;
+#else
   for (i=0; i < NUM_FONTS; i++)
     font_info[i].graphic = FONT_INITIAL_1;
+#endif
 
   /* initialize normal font/graphic mapping from static configuration */
   for (i=0; font_to_graphic[i].font_nr > -1; i++)
@@ -554,22 +560,24 @@ void InitElementGraphicInfo()
   {
     for (act=0; act<NUM_ACTIONS; act++)
     {
-      if (graphic_info[element_info[i].graphic[act]].bitmap == NULL)
+      int graphic;
+
+      graphic = element_info[i].graphic[act];
+      if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
        element_info[i].graphic[act] = -1;
 
-      if (graphic_info[element_info[i].crumbled[act]].bitmap == NULL)
+      graphic = element_info[i].crumbled[act];
+      if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
        element_info[i].crumbled[act] = -1;
 
       for (dir=0; dir<NUM_DIRECTIONS; dir++)
       {
-       int graphic;
-
        graphic = element_info[i].direction_graphic[act][dir];
-       if (graphic_info[graphic].bitmap == NULL)
+       if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
          element_info[i].direction_graphic[act][dir] = -1;
 
        graphic = element_info[i].direction_crumbled[act][dir];
-       if (graphic_info[graphic].bitmap == NULL)
+       if (graphic > 0 && graphic_info[graphic].bitmap == NULL)
          element_info[i].direction_crumbled[act][dir] = -1;
       }
     }
@@ -607,6 +615,10 @@ void InitElementGraphicInfo()
       boolean act_remove = ((IS_DIGGABLE(i)    && act == ACTION_DIGGING)  ||
                            (IS_SNAPPABLE(i)   && act == ACTION_SNAPPING) ||
                            (IS_COLLECTIBLE(i) && act == ACTION_COLLECTING));
+      boolean act_turning = (act == ACTION_TURNING_FROM_LEFT ||
+                            act == ACTION_TURNING_FROM_RIGHT ||
+                            act == ACTION_TURNING_FROM_UP ||
+                            act == ACTION_TURNING_FROM_DOWN);
 
       /* generic default action graphic (defined by "[default]" directive) */
       int default_action_graphic = element_info[EL_DEFAULT].graphic[act];
@@ -640,10 +652,16 @@ void InitElementGraphicInfo()
        /* no graphic for current action -- use default direction graphic */
        if (default_action_direction_graphic == -1)
          default_action_direction_graphic =
-           (act_remove ? IMG_EMPTY : default_direction_graphic[dir]);
+           (act_remove ? IMG_EMPTY :
+            act_turning ?
+            element_info[i].direction_graphic[ACTION_TURNING][dir] :
+            default_direction_graphic[dir]);
        if (default_action_direction_crumbled == -1)
          default_action_direction_crumbled =
-           (act_remove ? IMG_EMPTY : default_direction_crumbled[dir]);
+           (act_remove ? IMG_EMPTY :
+            act_turning ?
+            element_info[i].direction_crumbled[ACTION_TURNING][dir] :
+            default_direction_crumbled[dir]);
 
        if (element_info[i].direction_graphic[act][dir] == -1)
          element_info[i].direction_graphic[act][dir] =
@@ -656,12 +674,44 @@ void InitElementGraphicInfo()
       /* no graphic for this specific action -- use default action graphic */
       if (element_info[i].graphic[act] == -1)
        element_info[i].graphic[act] =
-         (act_remove ? IMG_EMPTY : default_action_graphic);
+         (act_remove ? IMG_EMPTY :
+          act_turning ? element_info[i].graphic[ACTION_TURNING] :
+          default_action_graphic);
       if (element_info[i].crumbled[act] == -1)
        element_info[i].crumbled[act] =
-         (act_remove ? IMG_EMPTY : default_action_crumbled);
+         (act_remove ? IMG_EMPTY :
+          act_turning ? element_info[i].crumbled[ACTION_TURNING] :
+          default_action_crumbled);
+    }
+  }
+
+#if 1
+  /* set animation mode to "none" for each graphic with only 1 frame */
+  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+  {
+    for (act=0; act<NUM_ACTIONS; act++)
+    {
+      int graphic = element_info[i].graphic[act];
+      int crumbled = element_info[i].crumbled[act];
+
+      if (graphic_info[graphic].anim_frames == 1)
+       graphic_info[graphic].anim_mode = ANIM_NONE;
+      if (graphic_info[crumbled].anim_frames == 1)
+       graphic_info[crumbled].anim_mode = ANIM_NONE;
+
+      for (dir=0; dir<NUM_DIRECTIONS; dir++)
+      {
+       graphic = element_info[i].direction_graphic[act][dir];
+       crumbled = element_info[i].direction_crumbled[act][dir];
+
+       if (graphic_info[graphic].anim_frames == 1)
+         graphic_info[graphic].anim_mode = ANIM_NONE;
+       if (graphic_info[crumbled].anim_frames == 1)
+         graphic_info[crumbled].anim_mode = ANIM_NONE;
+      }
     }
   }
+#endif
 
 #if 0
 #if DEBUG
@@ -773,6 +823,7 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
   graphic_info[graphic].offset_y = 0;  /* ... will be corrected later */
   graphic_info[graphic].crumbled_like = -1;    /* do not use clone element */
   graphic_info[graphic].diggable_like = -1;    /* do not use clone element */
+  graphic_info[graphic].border_size = TILEX / 8;  /* "CRUMBLED" border size */
 
   /* optional x and y tile position of animation frame sequence */
   if (parameter[GFX_ARG_XPOS] != ARG_UNDEFINED_VALUE)
@@ -839,8 +890,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
     graphic_info[graphic].anim_delay = 1;
 
   graphic_info[graphic].anim_mode = parameter[GFX_ARG_ANIM_MODE];
+#if 0
   if (graphic_info[graphic].anim_frames == 1)
     graphic_info[graphic].anim_mode = ANIM_NONE;
+#endif
 
   /* automatically determine correct start frame, if not defined */
   if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE)
@@ -862,6 +915,10 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
   if (parameter[GFX_ARG_DIGGABLE_LIKE] != ARG_UNDEFINED_VALUE)
     graphic_info[graphic].diggable_like = parameter[GFX_ARG_DIGGABLE_LIKE];
 
+  /* optional border size for "crumbling" diggable graphics */
+  if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE)
+    graphic_info[graphic].border_size = parameter[GFX_ARG_BORDER_SIZE];
+
   /* this is only used for toon animations */
   graphic_info[graphic].step_offset = parameter[GFX_ARG_STEP_OFFSET];
   graphic_info[graphic].step_delay  = parameter[GFX_ARG_STEP_DELAY];
@@ -869,6 +926,9 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
   /* this is only used for drawing font characters */
   graphic_info[graphic].draw_x = parameter[GFX_ARG_DRAW_XOFFSET];
   graphic_info[graphic].draw_y = parameter[GFX_ARG_DRAW_YOFFSET];
+
+  /* this is only used for drawing envelope graphics */
+  graphic_info[graphic].draw_masked = parameter[GFX_ARG_DRAW_MASKED];
 }
 
 static void InitGraphicInfo()
@@ -892,6 +952,10 @@ static void InitGraphicInfo()
 
   graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo));
 
+#if 0
+  printf("::: graphic_info: %d entries\n", num_images);
+#endif
+
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
   if (clipmasks_initialized)
   {
@@ -1349,7 +1413,10 @@ void InitElementPropertiesStatic()
     EL_SHIELD_NORMAL,
     EL_SHIELD_DEADLY,
     EL_EXTRA_TIME,
-    EL_ENVELOPE,
+    EL_ENVELOPE_1,
+    EL_ENVELOPE_2,
+    EL_ENVELOPE_3,
+    EL_ENVELOPE_4,
     EL_SPEED_PILL,
     -1
   };
@@ -1376,9 +1443,9 @@ void InitElementPropertiesStatic()
 
     /* !!! maybe this should better be handled by 'ep_diggable' !!! */
 #if 1
-    EL_SP_BUGGY_BASE_ACTIVE,
-    EL_TRAP_ACTIVE,
     EL_LANDMINE,
+    EL_TRAP_ACTIVE,
+    EL_SP_BUGGY_BASE_ACTIVE,
 #endif
     -1
   };
@@ -1706,6 +1773,7 @@ void InitElementPropertiesStatic()
     EL_SOKOBAN_FIELD_EMPTY,
     EL_EXIT_OPEN,
     EL_SP_EXIT_OPEN,
+    EL_SP_EXIT_OPENING,
     EL_GATE_1,
     EL_GATE_2,
     EL_GATE_3,
@@ -1777,6 +1845,16 @@ void InitElementPropertiesStatic()
     -1
   };
 
+  static int ep_droppable[] =
+  {
+    -1
+  };
+
+  static int ep_can_explode_1x1[] =
+  {
+    -1
+  };
+
   static int ep_pushable[] =
   {
     EL_ROCK,
@@ -1796,15 +1874,6 @@ void InitElementPropertiesStatic()
     -1
   };
 
-  static int ep_can_be_crumbled[] =
-  {
-    EL_SAND,
-    EL_LANDMINE,
-    EL_TRAP,
-    EL_TRAP_ACTIVE,
-    -1
-  };
-
   static int ep_player[] =
   {
     EL_PLAYER_1,
@@ -1890,6 +1959,9 @@ void InitElementPropertiesStatic()
 
   static int ep_sp_element[] =
   {
+    /* should always be valid */
+    EL_EMPTY,
+
     EL_SP_EMPTY,
     EL_SP_ZONK,
     EL_SP_BASE,
@@ -1940,6 +2012,8 @@ void InitElementPropertiesStatic()
     EL_SP_TERMINAL_ACTIVE,
     EL_SP_BUGGY_BASE_ACTIVATING,
     EL_SP_BUGGY_BASE_ACTIVE,
+    EL_SP_EXIT_OPENING,
+    EL_SP_EXIT_CLOSING,
     -1
   };
 
@@ -2526,6 +2600,20 @@ void InitElementPropertiesStatic()
     -1
   };
 
+  static int ep_em_slippery_wall[] =
+  {
+    -1
+  };
+
+  static int ep_gfx_crumbled[] =
+  {
+    EL_SAND,
+    EL_LANDMINE,
+    EL_TRAP,
+    EL_TRAP_ACTIVE,
+    -1
+  };
+
   static struct
   {
     int *elements;
@@ -2554,10 +2642,10 @@ void InitElementPropertiesStatic()
     { ep_passable_over,                EP_PASSABLE_OVER        },
     { ep_passable_inside,      EP_PASSABLE_INSIDE      },
     { ep_passable_under,       EP_PASSABLE_UNDER       },
+    { ep_droppable,            EP_DROPPABLE            },
+    { ep_can_explode_1x1,      EP_CAN_EXPLODE_1X1      },
     { ep_pushable,             EP_PUSHABLE             },
 
-    { ep_can_be_crumbled,      EP_CAN_BE_CRUMBLED      },
-
     { ep_player,               EP_PLAYER               },
     { ep_can_pass_magic_wall,  EP_CAN_PASS_MAGIC_WALL  },
     { ep_switchable,           EP_SWITCHABLE           },
@@ -2582,6 +2670,10 @@ void InitElementPropertiesStatic()
     { ep_active_bomb,          EP_ACTIVE_BOMB          },
     { ep_inactive,             EP_INACTIVE             },
 
+    { ep_em_slippery_wall,     EP_EM_SLIPPERY_WALL     },
+
+    { ep_gfx_crumbled,         EP_GFX_CRUMBLED         },
+
     { NULL,                    -1                      }
   };
 
@@ -2670,7 +2762,6 @@ void InitElementPropertiesEngine(int engine_version)
     EP_BELT_SWITCH,
     EP_WALKABLE_UNDER,
     EP_EM_SLIPPERY_WALL,
-    EP_CAN_BE_CRUMBLED,
   };
 #endif
 
@@ -2687,8 +2778,6 @@ void InitElementPropertiesEngine(int engine_version)
     EP_CAN_SMASH_EVERYTHING,
     EP_PUSHABLE,
 
-    EP_CAN_BE_CRUMBLED,
-
     EP_PLAYER,
     EP_GEM,
     EP_FOOD_DARK_YAMYAM,
@@ -2765,7 +2854,7 @@ void InitElementPropertiesEngine(int engine_version)
       SET_PROPERTY(i, EP_WALL, TRUE);
 
     /* ---------- SOLID_FOR_PUSHING ---------------------------------------- */
-    if (engine_version < VERSION_IDENT(2,2,0))
+    if (engine_version < VERSION_IDENT(2,2,0,0))
       SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, IS_HISTORIC_SOLID(i));
     else
       SET_PROPERTY(i, EP_SOLID_FOR_PUSHING, (!IS_WALKABLE(i) &&
@@ -2783,7 +2872,7 @@ void InitElementPropertiesEngine(int engine_version)
     /* ---------- EXPLOSION_PROOF ------------------------------------------ */
     if (i == EL_FLAMES)
       SET_PROPERTY(i, EP_EXPLOSION_PROOF, TRUE);
-    else if (engine_version < VERSION_IDENT(2,2,0))
+    else if (engine_version < VERSION_IDENT(2,2,0,0))
       SET_PROPERTY(i, EP_EXPLOSION_PROOF, IS_INDESTRUCTIBLE(i));
     else
       SET_PROPERTY(i, EP_EXPLOSION_PROOF, (IS_INDESTRUCTIBLE(i) &&
@@ -2819,22 +2908,15 @@ void InitElementPropertiesEngine(int engine_version)
     SET_PROPERTY(i, EP_CAN_EXPLODE_3X3, (CAN_EXPLODE(i) &&
                                         !CAN_EXPLODE_1X1(i)));
 
-    /* ---------- CAN_BE_CRUMBLED ------------------------------------------ */
-    SET_PROPERTY(i, EP_CAN_BE_CRUMBLED,
-                element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY);
-
-#if 0
-    if (CAN_BE_CRUMBLED(i))
-      printf("::: '%s' can be crumbled [%d]\n",
-            element_info[i].token_name,
-            element_info[i].crumbled[ACTION_DEFAULT]);
-#endif
-
     /* ---------- CAN_CHANGE ----------------------------------------------- */
     SET_PROPERTY(i, EP_CAN_CHANGE, FALSE);     /* default: cannot change */
     for (j=0; j < element_info[i].num_change_pages; j++)
       if (element_info[i].change_page[j].can_change)
        SET_PROPERTY(i, EP_CAN_CHANGE, TRUE);
+
+    /* ---------- GFX_CRUMBLED --------------------------------------------- */
+    SET_PROPERTY(i, EP_GFX_CRUMBLED,
+                element_info[i].crumbled[ACTION_DEFAULT] != IMG_EMPTY);
   }
 
 #if 0
@@ -2877,22 +2959,31 @@ void InitElementPropertiesEngine(int engine_version)
     /* "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)));
+                 engine_version > VERSION_IDENT(2,0,1,0)));
   }
 
-#if 0
-  /* dynamically adjust element properties according to game engine version */
-#if 0
-  if (engine_version < RELEASE_IDENT(2,2,0,7))
-#endif
+#if 1
+  /* set default push delay values (corrected since version 3.0.7-1) */
+  if (engine_version < VERSION_IDENT(3,0,7,1))
   {
-    for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
-    {
-      int element = EL_CUSTOM_START + i;
+    game.default_push_delay_fixed = 2;
+    game.default_push_delay_random = 8;
+  }
+  else
+  {
+    game.default_push_delay_fixed = 8;
+    game.default_push_delay_random = 8;
+  }
 
-      element_info[element].push_delay_fixed = 2;
-      element_info[element].push_delay_random = 8;
-    }
+  /* set uninitialized push delay values of custom elements in older levels */
+  for (i=0; i < NUM_CUSTOM_ELEMENTS; i++)
+  {
+    int element = EL_CUSTOM_START + i;
+
+    if (element_info[element].push_delay_fixed == -1)
+      element_info[element].push_delay_fixed = game.default_push_delay_fixed;
+    if (element_info[element].push_delay_random == -1)
+      element_info[element].push_delay_random = game.default_push_delay_random;
   }
 #endif
 }
@@ -3205,8 +3296,8 @@ void InitGfx()
 
   InitFontGraphicInfo();
 
-  DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW);
-  DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED);
+  DrawInitText(getProgramInitString(), 20, FC_YELLOW);
+  DrawInitText(PROGRAM_COPYRIGHT_STRING, 50, FC_RED);
 
   DrawInitText("Loading graphics:", 120, FC_GREEN);