X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Finit.c;h=73d76eaad433c3f009e2dedfd366699f1af58060;hb=d3ffb1e08b58d32e36682e8376c26dd5585bb421;hp=5c0e99c80c124e764983a8331fe7f72a43f08dbd;hpb=678dcec784272f09249c29949dc91a146246856a;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 5c0e99c8..73d76eaa 100644 --- a/src/init.c +++ b/src/init.c @@ -199,17 +199,13 @@ void InitFontGraphicInfo() /* initialize special font/graphic mapping from static configuration */ for (i = 0; font_to_graphic[i].font_nr > -1; i++) { - int font_nr = font_to_graphic[i].font_nr; - int special = font_to_graphic[i].special; - int graphic = font_to_graphic[i].graphic; -#if 1 - int base_graphic = - font_info[font_nr].special_graphic[GFX_SPECIAL_ARG_DEFAULT]; -#endif + int font_nr = font_to_graphic[i].font_nr; + int special = font_to_graphic[i].special; + int graphic = font_to_graphic[i].graphic; + int base_graphic = font2baseimg(font_nr); if (special >= 0 && special < NUM_SPECIAL_GFX_ARGS) { -#if 1 boolean base_redefined = getImageListEntryFromImageID(base_graphic)->redefined; boolean special_redefined = @@ -221,7 +217,6 @@ void InitFontGraphicInfo() anymore, but use the automatically determined default font */ if (base_redefined && !special_redefined) continue; -#endif font_info[font_nr].special_graphic[special] = graphic; font_info[font_nr].special_bitmap_id[special] = num_font_bitmaps; @@ -790,14 +785,38 @@ void InitElementSpecialGraphicInfo() element_info[i].graphic[ACTION_DEFAULT]; } -static int get_element_from_token(char *token) +static int get_graphic_parameter_value(char *value_raw, char *suffix, int type) { int i; + int x = 0; + if (type != TYPE_TOKEN) + return get_parameter_value(value_raw, suffix, type); + + if (strcmp(value_raw, ARG_UNDEFINED) == 0) + return ARG_UNDEFINED_VALUE; + + /* !!! OPTIMIZE THIS BY USING HASH !!! */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) - if (strcmp(element_info[i].token_name, token) == 0) + if (strcmp(element_info[i].token_name, value_raw) == 0) return i; + /* !!! OPTIMIZE THIS BY USING HASH !!! */ + for (i = 0; image_config[i].token != NULL; i++) + { + int len_config_value = strlen(image_config[i].value); + + if (strcmp(&image_config[i].value[len_config_value - 4], ".pcx") != 0 && + strcmp(&image_config[i].value[len_config_value - 4], ".wav") != 0 && + strcmp(image_config[i].value, UNDEFINED_FILENAME) != 0) + continue; + + if (strcmp(image_config[i].token, value_raw) == 0) + return x; + + x++; + } + return -1; } @@ -817,11 +836,11 @@ static int get_scaled_graphic_height(int graphic) return original_height * scale_up_factor; } -static void set_graphic_parameters(int graphic, int graphic_copy_from) +static void set_graphic_parameters(int graphic) { - struct FileInfo *image = getImageListEntryFromImageID(graphic_copy_from); + struct FileInfo *image = getImageListEntryFromImageID(graphic); char **parameter_raw = image->parameter; - Bitmap *src_bitmap = getBitmapFromImageID(graphic_copy_from); + Bitmap *src_bitmap = getBitmapFromImageID(graphic); int parameter[NUM_GFX_ARGS]; int anim_frames_per_row = 1, anim_frames_per_col = 1; int anim_frames_per_line = 1; @@ -833,18 +852,15 @@ static void set_graphic_parameters(int graphic, int graphic_copy_from) /* get integer values from string parameters */ for (i = 0; i < NUM_GFX_ARGS; i++) - { - parameter[i] = - get_parameter_value(image_config_suffix[i].token, parameter_raw[i], - image_config_suffix[i].type); - - if (image_config_suffix[i].type == TYPE_TOKEN) - parameter[i] = get_element_from_token(parameter_raw[i]); - } + parameter[i] = get_graphic_parameter_value(parameter_raw[i], + image_config_suffix[i].token, + image_config_suffix[i].type); graphic_info[graphic].bitmap = src_bitmap; /* start with reliable default values */ + graphic_info[graphic].src_image_width = 0; + graphic_info[graphic].src_image_height = 0; graphic_info[graphic].src_x = 0; graphic_info[graphic].src_y = 0; graphic_info[graphic].width = TILEX; @@ -858,6 +874,7 @@ static void set_graphic_parameters(int graphic, int graphic_copy_from) graphic_info[graphic].diggable_like = -1; /* do not use clone element */ graphic_info[graphic].border_size = TILEX / 8; /* "CRUMBLED" border size */ graphic_info[graphic].scale_up_factor = 1; /* default: no scaling up */ + graphic_info[graphic].clone_from = -1; /* do not use clone graphic */ graphic_info[graphic].anim_delay_fixed = 0; graphic_info[graphic].anim_delay_random = 0; graphic_info[graphic].post_delay_fixed = 0; @@ -890,11 +907,14 @@ static void set_graphic_parameters(int graphic, int graphic_copy_from) if (src_bitmap) { /* get final bitmap size (with scaling, but without small images) */ - int src_bitmap_width = get_scaled_graphic_width(graphic); - int src_bitmap_height = get_scaled_graphic_height(graphic); + int src_image_width = get_scaled_graphic_width(graphic); + int src_image_height = get_scaled_graphic_height(graphic); + + anim_frames_per_row = src_image_width / graphic_info[graphic].width; + anim_frames_per_col = src_image_height / graphic_info[graphic].height; - anim_frames_per_row = src_bitmap_width / graphic_info[graphic].width; - anim_frames_per_col = src_bitmap_height / graphic_info[graphic].height; + graphic_info[graphic].src_image_width = src_image_width; + graphic_info[graphic].src_image_height = src_image_height; } /* correct x or y offset dependent of vertical or horizontal frame order */ @@ -1017,6 +1037,49 @@ static void set_graphic_parameters(int graphic, int graphic_copy_from) /* this is only used for drawing envelope graphics */ graphic_info[graphic].draw_masked = parameter[GFX_ARG_DRAW_MASKED]; + + /* optional graphic for cloning all graphics settings */ + if (parameter[GFX_ARG_CLONE_FROM] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].clone_from = parameter[GFX_ARG_CLONE_FROM]; +} + +static void set_cloned_graphic_parameters(int graphic) +{ + int fallback_graphic = IMG_CHAR_EXCLAM; + int max_num_images = getImageListSize(); + int clone_graphic = graphic_info[graphic].clone_from; + int num_references_followed = 1; + + while (graphic_info[clone_graphic].clone_from != -1 && + num_references_followed < max_num_images) + { + clone_graphic = graphic_info[clone_graphic].clone_from; + + num_references_followed++; + } + + if (num_references_followed >= max_num_images) + { + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: error found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", getTokenFromImageID(graphic)); + Error(ERR_RETURN, "error: loop discovered when resolving cloned graphics"); + Error(ERR_RETURN, "custom graphic rejected for this element/action"); + + if (graphic == fallback_graphic) + Error(ERR_EXIT, "fatal error: no fallback graphic available"); + + Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); + Error(ERR_RETURN_LINE, "-"); + + graphic_info[graphic] = graphic_info[fallback_graphic]; + } + else + { + graphic_info[graphic] = graphic_info[clone_graphic]; + graphic_info[graphic].clone_from = clone_graphic; + } } static void InitGraphicInfo() @@ -1053,6 +1116,15 @@ static void InitGraphicInfo() } #endif + /* first set all graphic paramaters ... */ + for (i = 0; i < num_images; i++) + set_graphic_parameters(i); + + /* ... then copy these parameters for cloned graphics */ + for (i = 0; i < num_images; i++) + if (graphic_info[i].clone_from != -1) + set_cloned_graphic_parameters(i); + for (i = 0; i < num_images; i++) { Bitmap *src_bitmap; @@ -1060,39 +1132,32 @@ static void InitGraphicInfo() int first_frame, last_frame; int src_bitmap_width, src_bitmap_height; -#if 0 - printf("::: image # %d: '%s' ['%s']\n", - i, image->token, getTokenFromImageID(i)); -#endif - - set_graphic_parameters(i, i); - /* now check if no animation frames are outside of the loaded image */ if (graphic_info[i].bitmap == NULL) continue; /* skip check for optional images that are undefined */ /* get final bitmap size (with scaling, but without small images) */ - src_bitmap_width = get_scaled_graphic_width(i); - src_bitmap_height = get_scaled_graphic_height(i); + src_bitmap_width = graphic_info[i].src_image_width; + src_bitmap_height = graphic_info[i].src_image_height; + + /* check if first animation frame is inside specified bitmap */ first_frame = 0; getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); + if (src_x < 0 || src_y < 0 || src_x + TILEX > src_bitmap_width || src_y + TILEY > src_bitmap_height) { Error(ERR_RETURN_LINE, "-"); Error(ERR_RETURN, "warning: error found in config file:"); - Error(ERR_RETURN, "- config file: '%s'", - getImageConfigFilename()); - Error(ERR_RETURN, "- config token: '%s'", - getTokenFromImageID(i)); - Error(ERR_RETURN, "- image file: '%s'", - src_bitmap->source_filename); + Error(ERR_RETURN, "- config file: '%s'", getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", getTokenFromImageID(i)); + Error(ERR_RETURN, "- image file: '%s'", src_bitmap->source_filename); Error(ERR_RETURN, - "error: first animation frame out of bounds (%d, %d)", - src_x, src_y); + "error: first animation frame out of bounds (%d, %d) [%d, %d]", + src_x, src_y, src_bitmap_width, src_bitmap_height); Error(ERR_RETURN, "custom graphic rejected for this element/action"); if (i == fallback_graphic) @@ -1101,26 +1166,26 @@ static void InitGraphicInfo() Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, fallback_graphic); + graphic_info[i] = graphic_info[fallback_graphic]; } + /* check if last animation frame is inside specified bitmap */ + last_frame = graphic_info[i].anim_frames - 1; getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y); + if (src_x < 0 || src_y < 0 || src_x + TILEX > src_bitmap_width || src_y + TILEY > src_bitmap_height) { Error(ERR_RETURN_LINE, "-"); Error(ERR_RETURN, "warning: error found in config file:"); - Error(ERR_RETURN, "- config file: '%s'", - getImageConfigFilename()); - Error(ERR_RETURN, "- config token: '%s'", - getTokenFromImageID(i)); - Error(ERR_RETURN, "- image file: '%s'", - src_bitmap->source_filename); + Error(ERR_RETURN, "- config file: '%s'", getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", getTokenFromImageID(i)); + Error(ERR_RETURN, "- image file: '%s'", src_bitmap->source_filename); Error(ERR_RETURN, - "error: last animation frame (%d) out of bounds (%d, %d)", - last_frame, src_x, src_y); + "error: last animation frame (%d) out of bounds (%d, %d) [%d, %d]", + last_frame, src_x, src_y, src_bitmap_width, src_bitmap_height); Error(ERR_RETURN, "custom graphic rejected for this element/action"); if (i == fallback_graphic) @@ -1129,7 +1194,7 @@ static void InitGraphicInfo() Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, fallback_graphic); + graphic_info[i] = graphic_info[fallback_graphic]; } #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -1319,7 +1384,8 @@ static void set_sound_parameters(int sound, char **parameter_raw) /* get integer values from string parameters */ for (i = 0; i < NUM_SND_ARGS; i++) parameter[i] = - get_parameter_value(sound_config_suffix[i].token, parameter_raw[i], + get_parameter_value(parameter_raw[i], + sound_config_suffix[i].token, sound_config_suffix[i].type); /* explicit loop mode setting in configuration overrides default value */ @@ -1496,7 +1562,8 @@ static void set_music_parameters(int music, char **parameter_raw) /* get integer values from string parameters */ for (i = 0; i < NUM_MUS_ARGS; i++) parameter[i] = - get_parameter_value(music_config_suffix[i].token, parameter_raw[i], + get_parameter_value(parameter_raw[i], + music_config_suffix[i].token, music_config_suffix[i].type); /* explicit loop mode setting in configuration overrides default value */