rnd-20030703-1-src
[rocksndiamonds.git] / src / init.c
index 77cf39a00fdba9c92f5f0203782b86aaf47ba1ee..7e4b1727863b3c5ffd3b1cd59a9da024e5fdae19 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 */
@@ -631,7 +645,7 @@ static void set_graphic_parameters(int graphic, char **parameter_raw)
     anim_frames_per_col = src_bitmap->height / graphic_info[graphic].height;
   }
 
-  /* correct x or y offset dependant of vertical or horizontal frame order */
+  /* correct x or y offset dependent of vertical or horizontal frame order */
   if (parameter[GFX_ARG_VERTICAL])     /* frames are ordered vertically */
   {
     graphic_info[graphic].offset_y =
@@ -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 */
 }
 
@@ -1503,6 +1526,9 @@ void InitElementPropertiesStatic()
     EL_GATE_2_GRAY,
     EL_GATE_3_GRAY,
     EL_GATE_4_GRAY,
+    EL_PENGUIN,
+    EL_PIG,
+    EL_DRAGON,
     -1
   };
 
@@ -1720,6 +1746,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
   };
 
@@ -2215,7 +2246,9 @@ void InitElementPropertiesStatic()
     EL_DYNABOMB_INCREASE_NUMBER,
     EL_DYNABOMB_INCREASE_SIZE,
     EL_DYNABOMB_INCREASE_POWER,
+#if 0
     EL_SOKOBAN_OBJECT,
+#endif
     EL_SOKOBAN_FIELD_EMPTY,
     EL_SOKOBAN_FIELD_FULL,
     EL_WALL_EMERALD_RED,
@@ -2245,7 +2278,9 @@ void InitElementPropertiesStatic()
     EL_SP_PORT_VERTICAL,
     EL_SP_PORT_ANY,
     EL_SP_DISK_RED,
+#if 0
     EL_SP_DISK_YELLOW,
+#endif
     EL_SP_CHIP_SINGLE,
     EL_SP_CHIP_LEFT,
     EL_SP_CHIP_RIGHT,
@@ -2486,7 +2521,7 @@ void InitElementPropertiesEngine(int engine_version)
   InitElementPropertiesStatic();
 #endif
 
-  /* set all special, combined or engine dependant element properties */
+  /* set all special, combined or engine dependent element properties */
   for (i=0; i < MAX_NUM_ELEMENTS; i++)
   {
 #if 0
@@ -2631,6 +2666,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))
@@ -2644,6 +2680,7 @@ void InitElementPropertiesEngine(int engine_version)
       element_info[element].push_delay_random = 8;
     }
   }
+#endif
 }
 
 static void InitGlobal()
@@ -2777,6 +2814,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;
@@ -2787,10 +2834,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];
@@ -2841,8 +2899,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;
@@ -3074,7 +3133,7 @@ void ReloadCustomArtwork()
 
   /* custom level artwork configured in level series configuration file
      always overrides custom level artwork stored in level series directory
-     and (level independant) custom artwork configured in setup menue */
+     and (level independent) custom artwork configured in setup menue */
   if (leveldir_current->graphics_set != NULL)
     gfx_new_identifier = leveldir_current->graphics_set;
   if (leveldir_current->sounds_set != NULL)
@@ -3239,7 +3298,7 @@ void CloseAllAndExit(int exit_value)
   FreeTileClipmasks();
 
   CloseVideoDisplay();
-  ClosePlatformDependantStuff();
+  ClosePlatformDependentStuff();
 
   exit(exit_value);
 }