X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=2f0998ae79618051cb856a06e29f75cbd9daf4cf;hb=3378979a81f39e4a4082d208bf288492d87f5cd1;hp=ea3e538bcb9411cf0b0fa286ef5c0fc33220e516;hpb=be2766c926ff78b2985565fd9c12390eb5655112;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index ea3e538b..2f0998ae 100644 --- a/src/init.c +++ b/src/init.c @@ -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(); @@ -191,6 +191,9 @@ static void InitArtworkConfig() static char *dummy[1] = { NULL }; int i; + for (i=0; i -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; - i++; + if (action < 0) + action = ACTION_DEFAULT; + + 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 */ @@ -783,6 +807,11 @@ void InitElementInfo() } } +static void InitElementSoundInfo() +{ + /* soon to come */ +} + static void set_graphic_parameters(int graphic, int *parameter) { Bitmap *src_bitmap = getBitmapFromImageID(graphic); @@ -859,6 +888,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; @@ -867,12 +897,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; iparameter); /* now check if no animation frames are outside of the loaded image */ @@ -918,7 +952,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; @@ -941,7 +975,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) @@ -988,19 +1022,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; itoken); sound_effect_properties[i] = ACTION_OTHER; sound_info[i].loop = FALSE; @@ -1012,7 +1052,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; @@ -1031,9 +1071,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]; @@ -1042,9 +1082,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 */ {