rnd-20030620-1-src
[rocksndiamonds.git] / src / init.c
index 111008428fb635d4a2908e9e151cdc2bb0c75650..6d32cd3b46158d149470e58a04e890ffd37a147e 100644 (file)
@@ -481,19 +481,19 @@ void InitElementGraphicInfo()
   /* now set all '-1' values to element specific default values */
   for (i=0; i<MAX_NUM_ELEMENTS; i++)
   {
-    int default_action_graphic = element_info[i].graphic[ACTION_DEFAULT];
-    int default_action_direction_graphic[NUM_DIRECTIONS];
+    int default_graphic = element_info[i].graphic[ACTION_DEFAULT];
+    int default_direction_graphic[NUM_DIRECTIONS];
 
-    if (default_action_graphic == -1)
-      default_action_graphic = IMG_CHAR_QUESTION;
+    if (default_graphic == -1)
+      default_graphic = IMG_CHAR_QUESTION;
 
     for (dir=0; dir<NUM_DIRECTIONS; dir++)
     {
-      default_action_direction_graphic[dir] =
+      default_direction_graphic[dir] =
        element_info[i].direction_graphic[ACTION_DEFAULT][dir];
 
-      if (default_action_direction_graphic[dir] == -1)
-       default_action_direction_graphic[dir] = default_action_graphic;
+      if (default_direction_graphic[dir] == -1)
+       default_direction_graphic[dir] = default_graphic;
     }
 
     for (act=0; act<NUM_ACTIONS; act++)
@@ -502,18 +502,32 @@ void InitElementGraphicInfo()
                            act == ACTION_SNAPPING ||
                            act == ACTION_COLLECTING);
 
+      /* generic default action graphic (defined by "[default]" directive) */
+      int default_action_graphic = element_info[EL_DEFAULT].graphic[act];
+
+      /* look for special default action graphic (classic game specific) */
+      if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].graphic[act] != -1)
+       default_action_graphic = element_info[EL_BD_DEFAULT].graphic[act];
+      if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].graphic[act] != -1)
+       default_action_graphic = element_info[EL_SP_DEFAULT].graphic[act];
+      if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].graphic[act] != -1)
+       default_action_graphic = element_info[EL_SB_DEFAULT].graphic[act];
+
+      if (default_action_graphic == -1)
+       default_action_graphic = default_graphic;
+
       for (dir=0; dir<NUM_DIRECTIONS; dir++)
       {
-       int default_direction_graphic = element_info[i].graphic[act];
+       int default_action_direction_graphic = element_info[i].graphic[act];
 
        /* no graphic for current action -- use default direction graphic */
-       if (default_direction_graphic == -1)
-         default_direction_graphic =
-           (act_remove ? IMG_EMPTY : default_action_direction_graphic[dir]);
+       if (default_action_direction_graphic == -1)
+         default_action_direction_graphic =
+           (act_remove ? IMG_EMPTY : default_direction_graphic[dir]);
 
        if (element_info[i].direction_graphic[act][dir] == -1)
          element_info[i].direction_graphic[act][dir] =
-           default_direction_graphic;
+           default_action_direction_graphic;
       }
 
       /* no graphic for this specific action -- use default action graphic */
@@ -872,48 +886,61 @@ static void InitElementSoundInfo()
          element_info[j].sound[action] = sound;
   }
 
-  /* initialize element/sound mapping from dynamic configuration */
+  /* initialize element class/sound mapping from dynamic configuration */
   for (i=0; i < num_property_mappings; i++)
   {
-    int element = property_mapping[i].base_index;
-    int action  = property_mapping[i].ext1_index;
-    int sound   = property_mapping[i].artwork_index;
+    int element_class = property_mapping[i].base_index - MAX_NUM_ELEMENTS;
+    int action        = property_mapping[i].ext1_index;
+    int sound         = property_mapping[i].artwork_index;
 
-    if (element >= MAX_NUM_ELEMENTS)
+    if (element_class < 0 || element_class >= MAX_NUM_ELEMENTS)
       continue;
 
     if (action < 0)
       action = ACTION_DEFAULT;
 
-    element_info[element].sound[action] = sound;
+    for (j=0; j < MAX_NUM_ELEMENTS; j++)
+      if (strcmp(element_info[j].class_name,
+                element_info[element_class].class_name) == 0)
+       element_info[j].sound[action] = sound;
   }
 
-  /* initialize element class/sound mapping from dynamic configuration */
+  /* initialize element/sound mapping from dynamic configuration */
   for (i=0; i < num_property_mappings; i++)
   {
-    int element_class = property_mapping[i].base_index - MAX_NUM_ELEMENTS;
-    int action        = property_mapping[i].ext1_index;
-    int sound         = property_mapping[i].artwork_index;
+    int element = property_mapping[i].base_index;
+    int action  = property_mapping[i].ext1_index;
+    int sound   = property_mapping[i].artwork_index;
 
-    if (element_class < 0 || element_class >= MAX_NUM_ELEMENTS)
+    if (element >= MAX_NUM_ELEMENTS)
       continue;
 
     if (action < 0)
       action = ACTION_DEFAULT;
 
-    for (j=0; j < MAX_NUM_ELEMENTS; j++)
-      if (strcmp(element_info[j].class_name,
-                element_info[element_class].class_name) == 0)
-       element_info[j].sound[action] = sound;
+    element_info[element].sound[action] = sound;
   }
 
   /* now set all '-1' values to element specific default values */
   for (i=0; i<MAX_NUM_ELEMENTS; i++)
   {
-    int default_action_sound = element_info[i].sound[ACTION_DEFAULT];
-
     for (act=0; act < NUM_ACTIONS; act++)
     {
+      /* generic default action sound (defined by "[default]" directive) */
+      int default_action_sound = element_info[EL_DEFAULT].sound[act];
+
+      /* look for special default action sound (classic game specific) */
+      if (IS_BD_ELEMENT(i) && element_info[EL_BD_DEFAULT].sound[act] != -1)
+       default_action_sound = element_info[EL_BD_DEFAULT].sound[act];
+      if (IS_SP_ELEMENT(i) && element_info[EL_SP_DEFAULT].sound[act] != -1)
+       default_action_sound = element_info[EL_SP_DEFAULT].sound[act];
+      if (IS_SB_ELEMENT(i) && element_info[EL_SB_DEFAULT].sound[act] != -1)
+       default_action_sound = element_info[EL_SB_DEFAULT].sound[act];
+
+      /* look for element specific default sound (independent from action) */
+      if (element_info[i].sound[ACTION_DEFAULT] != -1)
+       default_action_sound = element_info[i].sound[ACTION_DEFAULT];
+
       /* no sound for this specific action -- use default action sound */
       if (element_info[i].sound[act] == -1)
        element_info[i].sound[act] = default_action_sound;
@@ -1077,10 +1104,6 @@ static void ReinitializeSounds()
   InitSoundInfo();             /* sound properties mapping */
   InitElementSoundInfo();      /* element game sound mapping */
 
-#if 1
-  InitElementSoundInfo();      /* element game sound mapping */
-#endif
-
   InitPlaySoundLevel();                /* internal game sound settings */
 }
 
@@ -1273,10 +1296,18 @@ void InitElementPropertiesStatic()
     EL_SWITCHGATE_OPENING,
     EL_SWITCHGATE_CLOSED,
     EL_SWITCHGATE_CLOSING,
+#if 0
+    EL_SWITCHGATE_SWITCH_UP,
+    EL_SWITCHGATE_SWITCH_DOWN,
+#endif
     EL_TIMEGATE_OPEN,
     EL_TIMEGATE_OPENING,
     EL_TIMEGATE_CLOSED,
     EL_TIMEGATE_CLOSING,
+#if 0
+    EL_TIMEGATE_SWITCH,
+    EL_TIMEGATE_SWITCH_ACTIVE,
+#endif
     EL_TUBE_ANY,
     EL_TUBE_VERTICAL,
     EL_TUBE_HORIZONTAL,
@@ -1383,7 +1414,7 @@ void InitElementPropertiesStatic()
     -1
   };
 
-  static int ep_can_smash_friends[] =
+  static int ep_can_smash_player[] =
   {
     EL_ROCK,
     EL_BD_ROCK,
@@ -1416,7 +1447,7 @@ void InitElementPropertiesStatic()
     -1
   };
 
-  static int ep_can_smash_explosives[] =
+  static int ep_can_smash_everything[] =
   {
     EL_ROCK,
     EL_BD_ROCK,
@@ -1712,6 +1743,11 @@ void InitElementPropertiesStatic()
     EL_INVISIBLE_WALL,
     /* more than one murphy in a level results in an inactive clone */
     EL_SP_MURPHY_CLONE,
+    /* runtime elements*/
+    EL_SP_DISK_RED_ACTIVE,
+    EL_SP_TERMINAL_ACTIVE,
+    EL_SP_BUGGY_BASE_ACTIVATING,
+    EL_SP_BUGGY_BASE_ACTIVE,
     -1
   };
 
@@ -2310,9 +2346,9 @@ void InitElementPropertiesStatic()
     { ep_can_change,           EP_CAN_CHANGE           },
     { ep_can_move,             EP_CAN_MOVE             },
     { ep_can_fall,             EP_CAN_FALL             },
-    { ep_can_smash_friends,    EP_CAN_SMASH_FRIENDS    },
+    { ep_can_smash_player,     EP_CAN_SMASH_PLAYER     },
     { ep_can_smash_enemies,    EP_CAN_SMASH_ENEMIES    },
-    { ep_can_smash_explosives, EP_CAN_SMASH_EXPLOSIVES },
+    { ep_can_smash_everything, EP_CAN_SMASH_EVERYTHING },
     { ep_can_explode_by_fire,  EP_CAN_EXPLODE_BY_FIRE  },
     { ep_can_explode_smashed,  EP_CAN_EXPLODE_SMASHED  },
     { ep_can_explode_impact,   EP_CAN_EXPLODE_IMPACT   },
@@ -2450,9 +2486,9 @@ void InitElementPropertiesEngine(int engine_version)
     EP_DONT_COLLIDE_WITH,
     EP_CAN_MOVE,
     EP_CAN_FALL,
-    EP_CAN_SMASH_FRIENDS,
+    EP_CAN_SMASH_PLAYER,
     EP_CAN_SMASH_ENEMIES,
-    EP_CAN_SMASH_EXPLOSIVES,
+    EP_CAN_SMASH_EVERYTHING,
     EP_PUSHABLE,
 
     EP_CAN_BE_CRUMBLED,
@@ -2562,17 +2598,17 @@ void InitElementPropertiesEngine(int engine_version)
       if (DONT_COLLIDE_WITH(i))
        SET_PROPERTY(i, EP_DONT_RUN_INTO, TRUE);
 
-      /* ---------- CAN_SMASH_ENEMIES / CAN_SMASH_FRIENDS ------------------ */
-      if (CAN_SMASH_EXPLOSIVES(i))
+      /* ---------- CAN_SMASH_ENEMIES / CAN_SMASH_PLAYER ------------------- */
+      if (CAN_SMASH_EVERYTHING(i))
        SET_PROPERTY(i, EP_CAN_SMASH_ENEMIES, TRUE);
       if (CAN_SMASH_ENEMIES(i))
-       SET_PROPERTY(i, EP_CAN_SMASH_FRIENDS, TRUE);
+       SET_PROPERTY(i, EP_CAN_SMASH_PLAYER, TRUE);
     }
 
     /* ---------- CAN_SMASH ------------------------------------------------ */
-    SET_PROPERTY(i, EP_CAN_SMASH, (CAN_SMASH_FRIENDS(i) ||
+    SET_PROPERTY(i, EP_CAN_SMASH, (CAN_SMASH_PLAYER(i) ||
                                   CAN_SMASH_ENEMIES(i) ||
-                                  CAN_SMASH_EXPLOSIVES(i)));
+                                  CAN_SMASH_EVERYTHING(i)));
 
     /* ---------- CAN_EXPLODE ---------------------------------------------- */
     SET_PROPERTY(i, EP_CAN_EXPLODE, (CAN_EXPLODE_BY_FIRE(i) ||
@@ -2623,6 +2659,7 @@ void InitElementPropertiesEngine(int engine_version)
                  engine_version > VERSION_IDENT(2,0,1)));
   }
 
+#if 0
   /* dynamically adjust element properties according to game engine version */
 #if 0
   if (engine_version < RELEASE_IDENT(2,2,0,7))
@@ -2636,6 +2673,7 @@ void InitElementPropertiesEngine(int engine_version)
       element_info[element].push_delay_random = 8;
     }
   }
+#endif
 }
 
 static void InitGlobal()
@@ -2769,6 +2807,16 @@ static void InitArtworkInfo()
   LoadArtworkInfo();
 }
 
+static char *get_string_in_brackets(char *string)
+{
+  char *string_in_brackets = checked_malloc(strlen(string) + 3);
+
+  sprintf(string_in_brackets, "[%s]", string);
+
+  return string_in_brackets;
+}
+
+#if 0
 static char *get_element_class_token(int element)
 {
   char *element_class_name = element_info[element].class_name;
@@ -2779,10 +2827,21 @@ static char *get_element_class_token(int element)
   return element_class_token;
 }
 
+static char *get_action_class_token(int action)
+{
+  char *action_class_name = &element_action_info[action].suffix[1];
+  char *action_class_token = checked_malloc(strlen(action_class_name) + 3);
+
+  sprintf(action_class_token, "[%s]", action_class_name);
+
+  return action_class_token;
+}
+#endif
+
 static void InitArtworkConfig()
 {
   static char *image_id_prefix[MAX_NUM_ELEMENTS + NUM_FONTS + 1];
-  static char *sound_id_prefix[MAX_NUM_ELEMENTS + MAX_NUM_ELEMENTS + 1];
+  static char *sound_id_prefix[2 * MAX_NUM_ELEMENTS + 1];
   static char *action_id_suffix[NUM_ACTIONS + 1];
   static char *direction_id_suffix[NUM_DIRECTIONS + 1];
   static char *special_id_suffix[NUM_SPECIAL_GFX_ARGS + 1];
@@ -2833,8 +2892,9 @@ static void InitArtworkConfig()
   for (i=0; i<MAX_NUM_ELEMENTS; i++)
     sound_id_prefix[i] = element_info[i].token_name;
   for (i=0; i<MAX_NUM_ELEMENTS; i++)
-    sound_id_prefix[MAX_NUM_ELEMENTS + i] = get_element_class_token(i);
-  sound_id_prefix[MAX_NUM_ELEMENTS + MAX_NUM_ELEMENTS] = NULL;
+    sound_id_prefix[MAX_NUM_ELEMENTS + i] =
+      get_string_in_brackets(element_info[i].class_name);
+  sound_id_prefix[2 * MAX_NUM_ELEMENTS] = NULL;
 
   for (i=0; i<NUM_ACTIONS; i++)
     action_id_suffix[i] = element_action_info[i].suffix;