rnd-20030126-3-src
[rocksndiamonds.git] / src / init.c
index 2b7836e2c2a8633f9e7925c15d554bc9b4e6fb64..27088af6f34530286779dc76703df458e405edb5 100644 (file)
@@ -73,7 +73,8 @@ static void InitGfx(void);
 static void InitGfxBackground(void);
 static void InitGadgets(void);
 static void InitElementProperties(void);
-static void InitElementInfo(void);
+static void InitElementGraphicInfo(void);
+static void InitElementSoundInfo(void);
 static void InitGraphicInfo(void);
 static void InitSoundInfo();
 static void Execute_Command(char *);
@@ -119,7 +120,6 @@ void OpenAll(void)
   InitEventFilter(FilterMouseMotionEvents);
 
   InitElementProperties();
-  InitElementInfo();
 
   InitGfx();
 
@@ -184,21 +184,29 @@ static void InitArtworkInfo()
 
 static void InitArtworkConfig()
 {
-  static struct ConfigInfo action_suffix[NUM_ACTIONS + 1];
-  static struct ConfigInfo direction_suffix[NUM_DIRECTIONS + 1];
-  static struct ConfigInfo empty[1];
+  static char *element_prefix[MAX_NUM_ELEMENTS + 1];
+  static char *sound_class_prefix[MAX_NUM_ELEMENTS + 1];
+  static char *action_suffix[NUM_ACTIONS + 1];
+  static char *direction_suffix[NUM_DIRECTIONS + 1];
+  static char *dummy[1] = { NULL };
   int i;
 
+  for (i=0; i<MAX_NUM_ELEMENTS; i++)
+    element_info[i].custom_description = NULL;
+
+  for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
+    element_prefix[i] = element_info[i].token_name;
+  for (i=0; i<MAX_NUM_ELEMENTS + 1; i++)
+    sound_class_prefix[i] = element_info[i].sound_class_name;
   for (i=0; i<NUM_ACTIONS + 1; i++)
-    action_suffix[i].token = element_action_info[i].suffix;
+    action_suffix[i] = element_action_info[i].suffix;
   for (i=0; i<NUM_DIRECTIONS + 1; i++)
-    direction_suffix[i].token = element_direction_info[i].suffix;
-  empty[0].token = NULL;
+    direction_suffix[i] = element_direction_info[i].suffix;
 
   InitImageList(image_config, NUM_IMAGE_FILES, image_config_suffix,
-               action_suffix, direction_suffix);
+               element_prefix, action_suffix, direction_suffix);
   InitSoundList(sound_config, NUM_SOUND_FILES, sound_config_suffix,
-               action_suffix, empty);
+               sound_class_prefix, action_suffix, dummy);
 }
 
 void InitLevelArtworkInfo()
@@ -237,7 +245,8 @@ static void InitMixer()
 
 static void ReinitializeGraphics()
 {
-  InitGraphicInfo();   /* initialize graphic info from config file */
+  InitElementGraphicInfo();    /* initialize element/graphic config info */
+  InitGraphicInfo();           /* initialize graphic info from config file */
 
   InitFontInfo(bitmap_font_initial,
               graphic_info[IMG_FONT_BIG].bitmap,
@@ -250,11 +259,28 @@ static void ReinitializeGraphics()
 
   InitGadgets();
   InitToons();
+
+
+
+  /* !!! TEST ONLY !!! */
+  {
+    Bitmap *tst_bitmap = graphic_info[IMG_SAND].bitmap;
+    Bitmap *tmp_bitmap = ZoomBitmap(tst_bitmap,
+                                   tst_bitmap->width / 2,
+                                   tst_bitmap->height / 2);
+
+    BlitBitmap(tmp_bitmap, tst_bitmap, 0, 0, 256, 224, 0, 448);
+
+    FreeBitmap(tmp_bitmap);
+  }
 }
 
 static void ReinitializeSounds()
 {
-  InitSoundInfo();     /* initialize sounds info from config file */
+  InitElementSoundInfo();      /* initialize element/sound config info */
+  InitSoundInfo();             /* initialize sounds info from config file */
+
+  InitPlaySoundLevel();                /* initialize internal game sound values */
 }
 
 static void ReinitializeMusic()
@@ -266,6 +292,8 @@ static void InitImages()
 {
   ReloadCustomImages();
   ReinitializeGraphics();
+
+  LoadCustomElementDescriptions();
 }
 
 static void InitSound()
@@ -610,6 +638,8 @@ void ReloadCustomArtwork()
     ReloadCustomImages();
     ReinitializeGraphics();
 
+    LoadCustomElementDescriptions();
+
     FreeTileClipmasks();
     InitTileClipmasks();
 
@@ -691,8 +721,10 @@ void InitGadgets()
   gadgets_initialized = TRUE;
 }
 
-void InitElementInfo()
+void InitElementGraphicInfo()
 {
+  struct PropertyMapping *property_mapping = getImageListPropertyMapping();
+  int num_property_mappings = getImageListPropertyMappingSize();
   int i, act, dir;
 
   /* set values to -1 to identify later as "uninitialized" values */
@@ -715,27 +747,38 @@ void InitElementInfo()
     element_info[i].graphic[ACTION_DEFAULT] =
       IMG_CUSTOM_START + (i - EL_CUSTOM_START);
 
-  i = 0;
-  while (element_to_graphic[i].element > -1)
+  /* initialize element/graphic mapping from static configuration */
+  for (i=0; element_to_graphic[i].element > -1; i++)
   {
     int element   = element_to_graphic[i].element;
-    int direction = element_to_graphic[i].direction;
     int action    = element_to_graphic[i].action;
+    int direction = element_to_graphic[i].direction;
     int graphic   = element_to_graphic[i].graphic;
 
     if (action < 0)
       action = 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;
+  }
+
+  /* initialize element/graphic 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 direction = property_mapping[i].ext2_index;
+    int graphic   = property_mapping[i].artwork_index;
+
+    if (action < 0)
+      action = ACTION_DEFAULT;
 
-    i++;
+    if (direction > -1)
+      element_info[element].direction_graphic[action][direction] = graphic;
+    else
+      element_info[element].graphic[action] = graphic;
   }
 
   /* now set all '-1' values to element specific default values */
@@ -778,6 +821,11 @@ void InitElementInfo()
   }
 }
 
+static void InitElementSoundInfo()
+{
+  /* soon to come */
+}
+
 static void set_graphic_parameters(int graphic, int *parameter)
 {
   Bitmap *src_bitmap = getBitmapFromImageID(graphic);
@@ -854,6 +902,7 @@ static void set_graphic_parameters(int graphic, int *parameter)
 static void InitGraphicInfo()
 {
   static boolean clipmasks_initialized = FALSE;
+  int num_images = getImageListSize();
   int i;
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
   Pixmap src_pixmap;
@@ -862,12 +911,15 @@ static void InitGraphicInfo()
   GC copy_clipmask_gc = None;
 #endif
 
-  image_files = getCurrentImageList();
+  if (graphic_info != NULL)
+    free(graphic_info);
+
+  graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo));
 
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
   if (clipmasks_initialized)
   {
-    for (i=0; i<NUM_IMAGE_FILES; i++)
+    for (i=0; i<num_images; i++)
     {
       if (graphic_info[i].clip_mask)
        XFreePixmap(display, graphic_info[i].clip_mask);
@@ -880,13 +932,14 @@ static void InitGraphicInfo()
   }
 #endif
 
-  for (i=0; i<NUM_IMAGE_FILES; i++)
+  for (i=0; i<num_images; i++)
   {
+    struct FileInfo *image = getImageListEntry(i);
     Bitmap *src_bitmap;
     int src_x, src_y;
     int first_frame, last_frame;
 
-    set_graphic_parameters(i, image_files[i].parameter);
+    set_graphic_parameters(i, image->parameter);
 
     /* now check if no animation frames are outside of the loaded image */
 
@@ -913,7 +966,7 @@ static void InitGraphicInfo()
       Error(ERR_RETURN, "custom graphic rejected for this element/action");
       Error(ERR_RETURN_LINE, "-");
 
-      set_graphic_parameters(i, image_files[i].default_parameter);
+      set_graphic_parameters(i, image->default_parameter);
     }
 
     last_frame = graphic_info[i].anim_frames - 1;
@@ -936,7 +989,7 @@ static void InitGraphicInfo()
       Error(ERR_RETURN, "custom graphic rejected for this element/action");
       Error(ERR_RETURN_LINE, "-");
 
-      set_graphic_parameters(i, image_files[i].default_parameter);
+      set_graphic_parameters(i, image->default_parameter);
     }
 
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
@@ -983,19 +1036,25 @@ static void set_sound_parameters(int sound, int *parameter)
 
 static void InitSoundInfo()
 {
-  int sound_effect_properties[NUM_SOUND_FILES];
+  int *sound_effect_properties;
+  int num_sounds = getSoundListSize();
   int i, j;
 
-  sound_files = getCurrentSoundList();
+  if (sound_info != NULL)
+    free(sound_info);
+
+  sound_effect_properties = checked_calloc(num_sounds * sizeof(int));
+  sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo));
 
   /* initialize sound effect for all elements to "no sound" */
   for (i=0; i<MAX_NUM_ELEMENTS; i++)
     for (j=0; j<NUM_ACTIONS; j++)
       element_info[i].sound[j] = SND_UNDEFINED;
 
-  for (i=0; i<NUM_SOUND_FILES; i++)
+  for (i=0; i<num_sounds; i++)
   {
-    int len_effect_text = strlen(sound_files[i].token);
+    struct FileInfo *sound = getSoundListEntry(i);
+    int len_effect_text = strlen(sound->token);
 
     sound_effect_properties[i] = ACTION_OTHER;
     sound_info[i].loop = FALSE;
@@ -1007,7 +1066,7 @@ static void InitSoundInfo()
       int len_action_text = strlen(element_action_info[j].suffix);
 
       if (len_action_text < len_effect_text &&
-         strcmp(&sound_files[i].token[len_effect_text - len_action_text],
+         strcmp(&sound->token[len_effect_text - len_action_text],
                 element_action_info[j].suffix) == 0)
       {
        sound_effect_properties[i] = element_action_info[j].value;
@@ -1026,9 +1085,9 @@ static void InitSoundInfo()
        int len_class_text = strlen(element_info[j].sound_class_name);
 
        if (len_class_text + 1 < len_effect_text &&
-           strncmp(sound_files[i].token,
+           strncmp(sound->token,
                    element_info[j].sound_class_name, len_class_text) == 0 &&
-           sound_files[i].token[len_class_text] == '.')
+           sound->token[len_class_text] == '.')
        {
          int sound_action_value = sound_effect_properties[i];
 
@@ -1037,9 +1096,11 @@ static void InitSoundInfo()
       }
     }
 
-    set_sound_parameters(i, sound_files[i].parameter);
+    set_sound_parameters(i, sound->parameter);
   }
 
+  free(sound_effect_properties);
+
 #if 0
   /* TEST ONLY */
   {