X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=cc3b23d57273030597f55e17e1c56df70179b9cb;hb=b180608242f0190c6c8b31772e4dcfce2e9af47c;hp=b49b9bfe67f7e912ffc3f81c07c9f018faeb3758;hpb=ee749a764df3dfa944c1f9de740ccbeb1cfdef40;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index b49b9bfe..cc3b23d5 100644 --- a/src/init.c +++ b/src/init.c @@ -199,12 +199,25 @@ 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; + 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) { + boolean base_redefined = + getImageListEntryFromImageID(base_graphic)->redefined; + boolean special_redefined = + getImageListEntryFromImageID(graphic)->redefined; + + /* if the base font ("font.title_1", for example) has been redefined, + but not the special font ("font.title_1.LEVELS", for example), do not + use an existing (in this case considered obsolete) special font + anymore, but use the automatically determined default font */ + if (base_redefined && !special_redefined) + continue; + font_info[font_nr].special_graphic[special] = graphic; font_info[font_nr].special_bitmap_id[special] = num_font_bitmaps; num_font_bitmaps++; @@ -772,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; } @@ -799,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; @@ -815,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; @@ -840,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; @@ -872,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 */ @@ -999,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() @@ -1035,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; @@ -1042,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) @@ -1083,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) @@ -1111,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) @@ -1301,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 */ @@ -1478,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 */ @@ -1865,6 +1950,10 @@ void InitElementPropertiesStatic() EL_GATE_2_GRAY, EL_GATE_3_GRAY, EL_GATE_4_GRAY, + EL_GATE_1_GRAY_ACTIVE, + EL_GATE_2_GRAY_ACTIVE, + EL_GATE_3_GRAY_ACTIVE, + EL_GATE_4_GRAY_ACTIVE, EL_EM_GATE_1, EL_EM_GATE_2, EL_EM_GATE_3, @@ -1873,6 +1962,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_EMC_GATE_5, EL_EMC_GATE_6, EL_EMC_GATE_7, @@ -1881,6 +1974,10 @@ void InitElementPropertiesStatic() EL_EMC_GATE_6_GRAY, EL_EMC_GATE_7_GRAY, EL_EMC_GATE_8_GRAY, + EL_EMC_GATE_5_GRAY_ACTIVE, + EL_EMC_GATE_6_GRAY_ACTIVE, + EL_EMC_GATE_7_GRAY_ACTIVE, + EL_EMC_GATE_8_GRAY_ACTIVE, EL_SWITCHGATE_OPEN, EL_SWITCHGATE_OPENING, EL_SWITCHGATE_CLOSED, @@ -2125,6 +2222,10 @@ void InitElementPropertiesStatic() EL_GATE_2_GRAY, EL_GATE_3_GRAY, EL_GATE_4_GRAY, + EL_GATE_1_GRAY_ACTIVE, + EL_GATE_2_GRAY_ACTIVE, + EL_GATE_3_GRAY_ACTIVE, + EL_GATE_4_GRAY_ACTIVE, EL_PENGUIN, EL_PIG, EL_DRAGON, @@ -2162,6 +2263,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_EMC_GATE_5, EL_EMC_GATE_6, EL_EMC_GATE_7, @@ -2170,6 +2275,10 @@ void InitElementPropertiesStatic() EL_EMC_GATE_6_GRAY, EL_EMC_GATE_7_GRAY, EL_EMC_GATE_8_GRAY, + EL_EMC_GATE_5_GRAY_ACTIVE, + EL_EMC_GATE_6_GRAY_ACTIVE, + EL_EMC_GATE_7_GRAY_ACTIVE, + EL_EMC_GATE_8_GRAY_ACTIVE, EL_SWITCHGATE_OPEN, EL_TIMEGATE_OPEN, -1 @@ -2263,6 +2372,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_EMC_GATE_5, EL_EMC_GATE_6, EL_EMC_GATE_7, @@ -2271,6 +2384,10 @@ void InitElementPropertiesStatic() EL_EMC_GATE_6_GRAY, EL_EMC_GATE_7_GRAY, EL_EMC_GATE_8_GRAY, + EL_EMC_GATE_5_GRAY_ACTIVE, + EL_EMC_GATE_6_GRAY_ACTIVE, + EL_EMC_GATE_7_GRAY_ACTIVE, + EL_EMC_GATE_8_GRAY_ACTIVE, EL_SWITCHGATE_OPEN, EL_TIMEGATE_OPEN, @@ -2419,6 +2536,7 @@ void InitElementPropertiesStatic() EL_BALLOON_SWITCH_UP, EL_BALLOON_SWITCH_DOWN, EL_BALLOON_SWITCH_ANY, + EL_BALLOON_SWITCH_NONE, EL_LAMP, EL_TIME_ORB_FULL, EL_EMC_MAGIC_BALL_SWITCH, @@ -2621,6 +2739,10 @@ void InitElementPropertiesStatic() EL_GATE_2_GRAY, EL_GATE_3_GRAY, EL_GATE_4_GRAY, + EL_GATE_1_GRAY_ACTIVE, + EL_GATE_2_GRAY_ACTIVE, + EL_GATE_3_GRAY_ACTIVE, + EL_GATE_4_GRAY_ACTIVE, EL_EM_GATE_1, EL_EM_GATE_2, EL_EM_GATE_3, @@ -2629,6 +2751,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_EXIT_CLOSED, EL_EXIT_OPENING, EL_EXIT_OPEN, @@ -2805,6 +2931,10 @@ void InitElementPropertiesStatic() EL_GATE_2_GRAY, EL_GATE_3_GRAY, EL_GATE_4_GRAY, + EL_GATE_1_GRAY_ACTIVE, + EL_GATE_2_GRAY_ACTIVE, + EL_GATE_3_GRAY_ACTIVE, + EL_GATE_4_GRAY_ACTIVE, EL_EM_GATE_1, EL_EM_GATE_2, EL_EM_GATE_3, @@ -2813,6 +2943,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_SWITCHGATE_OPEN, EL_SWITCHGATE_OPENING, EL_SWITCHGATE_CLOSED, @@ -2928,6 +3062,10 @@ void InitElementPropertiesStatic() EL_GATE_2_GRAY, EL_GATE_3_GRAY, EL_GATE_4_GRAY, + EL_GATE_1_GRAY_ACTIVE, + EL_GATE_2_GRAY_ACTIVE, + EL_GATE_3_GRAY_ACTIVE, + EL_GATE_4_GRAY_ACTIVE, EL_EM_GATE_1, EL_EM_GATE_2, EL_EM_GATE_3, @@ -2936,6 +3074,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_EMC_GATE_5, EL_EMC_GATE_6, EL_EMC_GATE_7, @@ -2944,6 +3086,10 @@ void InitElementPropertiesStatic() EL_EMC_GATE_6_GRAY, EL_EMC_GATE_7_GRAY, EL_EMC_GATE_8_GRAY, + EL_EMC_GATE_5_GRAY_ACTIVE, + EL_EMC_GATE_6_GRAY_ACTIVE, + EL_EMC_GATE_7_GRAY_ACTIVE, + EL_EMC_GATE_8_GRAY_ACTIVE, -1 }; @@ -3037,6 +3183,10 @@ void InitElementPropertiesStatic() EL_GATE_2_GRAY, EL_GATE_3_GRAY, EL_GATE_4_GRAY, + EL_GATE_1_GRAY_ACTIVE, + EL_GATE_2_GRAY_ACTIVE, + EL_GATE_3_GRAY_ACTIVE, + EL_GATE_4_GRAY_ACTIVE, EL_EM_GATE_1, EL_EM_GATE_2, EL_EM_GATE_3, @@ -3045,6 +3195,10 @@ void InitElementPropertiesStatic() EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_1_GRAY_ACTIVE, + EL_EM_GATE_2_GRAY_ACTIVE, + EL_EM_GATE_3_GRAY_ACTIVE, + EL_EM_GATE_4_GRAY_ACTIVE, EL_EMC_GATE_5, EL_EMC_GATE_6, EL_EMC_GATE_7, @@ -3053,6 +3207,10 @@ void InitElementPropertiesStatic() EL_EMC_GATE_6_GRAY, EL_EMC_GATE_7_GRAY, EL_EMC_GATE_8_GRAY, + EL_EMC_GATE_5_GRAY_ACTIVE, + EL_EMC_GATE_6_GRAY_ACTIVE, + EL_EMC_GATE_7_GRAY_ACTIVE, + EL_EMC_GATE_8_GRAY_ACTIVE, EL_DYNAMITE, EL_INVISIBLE_STEELWALL, EL_INVISIBLE_WALL,