X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=b02d08838168225d8a80c012f2a72a0eb2f1d59b;hb=c42862bb754d7a8b1ff476887669650845f7570e;hp=166ee1d46288fd2d118e8a2999a8e0cc08407dca;hpb=9583e9c55b889974e0df9a8ca1930efdf29bda29;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 166ee1d4..b02d0883 100644 --- a/src/init.c +++ b/src/init.c @@ -258,12 +258,19 @@ void InitElementSmallImages() for (i = 0; element_to_special_graphic[i].element > -1; i++) InitElementSmallImagesScaledUp(element_to_special_graphic[i].graphic); - /* initialize images from dynamic configuration */ + /* initialize images from dynamic configuration (may be elements or other) */ +#if 1 + for (i = 0; i < num_property_mappings; i++) + InitElementSmallImagesScaledUp(property_mapping[i].artwork_index); +#else + /* !!! THIS DOES NOT WORK -- "artwork_index" is graphic, not element !!! */ + /* !!! ALSO, non-element graphics might need scaling-up !!! */ for (i = 0; i < num_property_mappings; i++) if (property_mapping[i].artwork_index < MAX_NUM_ELEMENTS) InitElementSmallImagesScaledUp(property_mapping[i].artwork_index); +#endif -#if 1 +#if 0 /* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */ for (i = IMG_EMC_OBJECT; i <= IMG_EMC_SPRITE; i++) InitElementSmallImagesScaledUp(i); @@ -468,8 +475,10 @@ void InitElementGraphicInfo() if ((action > -1 || direction > -1 || crumbled == TRUE) && base_graphic != -1) { - boolean base_redefined = getImageListEntry(base_graphic)->redefined; - boolean act_dir_redefined = getImageListEntry(graphic)->redefined; + boolean base_redefined = + getImageListEntryFromImageID(base_graphic)->redefined; + boolean act_dir_redefined = + getImageListEntryFromImageID(graphic)->redefined; /* if the base graphic ("emerald", for example) has been redefined, but not the action graphic ("emerald.falling", for example), do not @@ -615,6 +624,69 @@ void InitElementGraphicInfo() } #endif +#if 1 + /* adjust graphics with 2nd tile for movement according to direction + (do this before correcting '-1' values to minimize calculations) */ + for (i = 0; i < MAX_NUM_ELEMENTS; i++) + { + for (act = 0; act < NUM_ACTIONS; act++) + { + for (dir = 0; dir < NUM_DIRECTIONS; dir++) + { + int graphic = element_info[i].direction_graphic[act][dir]; + int move_dir = (act == ACTION_FALLING ? MV_BIT_DOWN : dir); + + if (act == ACTION_FALLING) /* special case */ + graphic = element_info[i].graphic[act]; + + if (graphic != -1 && graphic_info[graphic].double_movement) + { + struct GraphicInfo *g = &graphic_info[graphic]; + int src_x_front = g->src_x; + int src_y_front = g->src_y; + int src_x_back = g->src_x + g->offset2_x; + int src_y_back = g->src_y + g->offset2_y; + boolean frames_are_ordered_diagonally = (g->offset_x != 0 && + g->offset_y != 0); + boolean front_is_left_or_upper = (src_x_front < src_x_back || + src_y_front < src_y_back); + Bitmap *dummy; + +#if 0 + printf("::: CHECKING ELEMENT %d ('%s'), ACTION '%s', DIRECTION %d\n", + i, element_info[i].token_name, + element_action_info[act].suffix, move_dir); +#endif + + /* swap frontside and backside graphic tile coordinates, if needed */ + if (!frames_are_ordered_diagonally && + ((move_dir == MV_BIT_LEFT && !front_is_left_or_upper) || + (move_dir == MV_BIT_RIGHT && front_is_left_or_upper) || + (move_dir == MV_BIT_UP && !front_is_left_or_upper) || + (move_dir == MV_BIT_DOWN && front_is_left_or_upper))) + { + /* get current (wrong) backside tile coordinates */ + getGraphicSourceExt(graphic, 0, &dummy, &src_x_back, &src_y_back, + TRUE); + + /* set frontside tile coordinates to backside tile coordinates */ + g->src_x = src_x_back; + g->src_y = src_y_back; + + /* invert tile offset to point to new backside tile coordinates */ + g->offset2_x *= -1; + g->offset2_y *= -1; + +#if 0 + printf(" CORRECTED\n"); +#endif + } + } + } + } + } +#endif + /* now set all '-1' values to element specific default values */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) { @@ -691,6 +763,7 @@ void InitElementGraphicInfo() int default_action_direction_crumbled = element_info[i].crumbled[act]; /* no graphic for current action -- use default direction graphic */ + /* !!! maybe it's better to use default _action_ graphic here !!! */ if (default_action_direction_graphic == -1) default_action_direction_graphic = (act_remove ? IMG_EMPTY : @@ -787,8 +860,10 @@ void InitElementSpecialGraphicInfo() int special = element_to_special_graphic[i].special; int graphic = element_to_special_graphic[i].graphic; int base_graphic = el2baseimg(element); - boolean base_redefined = getImageListEntry(base_graphic)->redefined; - boolean special_redefined = getImageListEntry(graphic)->redefined; + boolean base_redefined = + getImageListEntryFromImageID(base_graphic)->redefined; + boolean special_redefined = + getImageListEntryFromImageID(graphic)->redefined; /* if the base graphic ("emerald", for example) has been redefined, but not the special graphic ("emerald.EDITOR", for example), do not @@ -835,9 +910,27 @@ static int get_element_from_token(char *token) return -1; } -static void set_graphic_parameters(int graphic, char **parameter_raw) +static int get_scaled_graphic_width(int graphic) +{ + int original_width = getOriginalImageWidthFromImageID(graphic); + int scale_up_factor = graphic_info[graphic].scale_up_factor; + + return original_width * scale_up_factor; +} + +static int get_scaled_graphic_height(int graphic) { - Bitmap *src_bitmap = getBitmapFromImageID(graphic); + int original_height = getOriginalImageHeightFromImageID(graphic); + int scale_up_factor = graphic_info[graphic].scale_up_factor; + + return original_height * scale_up_factor; +} + +static void set_graphic_parameters(int graphic, int graphic_copy_from) +{ + struct FileInfo *image = getImageListEntryFromImageID(graphic_copy_from); + char **parameter_raw = image->parameter; + Bitmap *src_bitmap = getBitmapFromImageID(graphic_copy_from); int parameter[NUM_GFX_ARGS]; int anim_frames_per_row = 1, anim_frames_per_col = 1; int anim_frames_per_line = 1; @@ -863,6 +956,8 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) graphic_info[graphic].height = TILEY; graphic_info[graphic].offset_x = 0; /* one or both of these values ... */ graphic_info[graphic].offset_y = 0; /* ... will be corrected later */ + graphic_info[graphic].offset2_x = 0; /* one or both of these values ... */ + graphic_info[graphic].offset2_y = 0; /* ... will be corrected later */ graphic_info[graphic].crumbled_like = -1; /* do not use clone element */ graphic_info[graphic].diggable_like = -1; /* do not use clone element */ graphic_info[graphic].border_size = TILEX / 8; /* "CRUMBLED" border size */ @@ -898,10 +993,9 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (src_bitmap) { - /* bitmap is not scaled at this stage, so calculate final size */ - int scale_up_factor = graphic_info[graphic].scale_up_factor; - int src_bitmap_width = src_bitmap->width * scale_up_factor; - int src_bitmap_height = src_bitmap->height * scale_up_factor; + /* 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); anim_frames_per_row = src_bitmap_width / graphic_info[graphic].width; anim_frames_per_col = src_bitmap_height / graphic_info[graphic].height; @@ -929,6 +1023,28 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (parameter[GFX_ARG_YOFFSET] != ARG_UNDEFINED_VALUE) graphic_info[graphic].offset_y = parameter[GFX_ARG_YOFFSET]; + /* optionally, moving animations may have separate start and end graphics */ + graphic_info[graphic].double_movement = parameter[GFX_ARG_2ND_MOVEMENT_TILE]; + + if (parameter[GFX_ARG_2ND_VERTICAL] == ARG_UNDEFINED_VALUE) + parameter[GFX_ARG_2ND_VERTICAL] = !parameter[GFX_ARG_VERTICAL]; + + /* correct x or y offset2 dependent of vertical or horizontal frame order */ + if (parameter[GFX_ARG_2ND_VERTICAL]) /* frames are ordered vertically */ + graphic_info[graphic].offset2_y = + (parameter[GFX_ARG_2ND_OFFSET] != ARG_UNDEFINED_VALUE ? + parameter[GFX_ARG_2ND_OFFSET] : graphic_info[graphic].height); + else /* frames are ordered horizontally */ + graphic_info[graphic].offset2_x = + (parameter[GFX_ARG_2ND_OFFSET] != ARG_UNDEFINED_VALUE ? + parameter[GFX_ARG_2ND_OFFSET] : graphic_info[graphic].width); + + /* optionally, the x and y offset of 2nd graphic can be specified directly */ + if (parameter[GFX_ARG_2ND_XOFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset2_x = parameter[GFX_ARG_2ND_XOFFSET]; + if (parameter[GFX_ARG_2ND_YOFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset2_y = parameter[GFX_ARG_2ND_YOFFSET]; + /* automatically determine correct number of frames, if not defined */ if (parameter[GFX_ARG_FRAMES] != ARG_UNDEFINED_VALUE) graphic_info[graphic].anim_frames = parameter[GFX_ARG_FRAMES]; @@ -1006,8 +1122,6 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) static void InitGraphicInfo() { int fallback_graphic = IMG_CHAR_EXCLAM; - struct FileInfo *fallback_image = getImageListEntry(fallback_graphic); - Bitmap *fallback_bitmap = getBitmapFromImageID(fallback_graphic); int num_images = getImageListSize(); int i; @@ -1045,11 +1159,10 @@ static void InitGraphicInfo() 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; - int scale_up_factor, src_bitmap_width, src_bitmap_height; + int src_bitmap_width, src_bitmap_height; #if 0 printf("::: image: '%s' [%d]\n", image->token, i); @@ -1061,17 +1174,16 @@ static void InitGraphicInfo() getTokenFromImageID(i)); #endif - set_graphic_parameters(i, image->parameter); + 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 */ - /* bitmap is not scaled at this stage, so calculate final size */ - scale_up_factor = graphic_info[i].scale_up_factor; - src_bitmap_width = graphic_info[i].bitmap->width * scale_up_factor; - src_bitmap_height = graphic_info[i].bitmap->height * scale_up_factor; + /* 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); first_frame = 0; getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); @@ -1092,7 +1204,7 @@ static void InitGraphicInfo() src_x, src_y); Error(ERR_RETURN, "custom graphic rejected for this element/action"); -#if 1 +#if 0 Error(ERR_RETURN, "scale_up_factor == %d", scale_up_factor); #endif @@ -1102,8 +1214,7 @@ static void InitGraphicInfo() Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, fallback_image->default_parameter); - graphic_info[i].bitmap = fallback_bitmap; + set_graphic_parameters(i, fallback_graphic); } last_frame = graphic_info[i].anim_frames - 1; @@ -1131,8 +1242,7 @@ static void InitGraphicInfo() Error(ERR_RETURN, "fallback done to 'char_exclam' for this graphic"); Error(ERR_RETURN_LINE, "-"); - set_graphic_parameters(i, fallback_image->default_parameter); - graphic_info[i].bitmap = fallback_bitmap; + set_graphic_parameters(i, fallback_graphic); } #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -1260,6 +1370,13 @@ static void InitElementSoundInfo() default_action_sound = element_info[i].sound[ACTION_DEFAULT]; #endif +#if 1 + /* !!! needed because EL_EMPTY_SPACE treated as IS_SP_ELEMENT !!! */ + /* !!! make this better !!! */ + if (i == EL_EMPTY_SPACE) + default_action_sound = element_info[EL_DEFAULT].sound[act]; +#endif + /* 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; @@ -1603,6 +1720,8 @@ static void ReinitializeGraphics() InitElementSmallImages(); /* scale images to all needed sizes */ InitFontGraphicInfo(); /* initialize text drawing functions */ + InitGraphicInfo_EM(); /* graphic mapping for EM engine */ + SetMainBackgroundImage(IMG_BACKGROUND); SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); @@ -1788,6 +1907,7 @@ void InitElementPropertiesStatic() EL_TRAP, EL_INVISIBLE_SAND, EL_INVISIBLE_SAND_ACTIVE, + EL_EMC_GRASS, /* !!! currently not diggable, but handled by 'ep_dont_run_into' !!! */ /* (if amoeba can grow into anything diggable, maybe keep these out) */ @@ -1795,6 +1915,7 @@ void InitElementPropertiesStatic() EL_LANDMINE, EL_TRAP_ACTIVE, EL_SP_BUGGY_BASE_ACTIVE, + EL_EMC_PLANT, #endif -1 }; @@ -1815,6 +1936,10 @@ void InitElementPropertiesStatic() EL_EM_KEY_2, EL_EM_KEY_3, EL_EM_KEY_4, + EL_EM_KEY_5, + EL_EM_KEY_6, + EL_EM_KEY_7, + EL_EM_KEY_8, EL_DYNAMITE, EL_DYNABOMB_INCREASE_NUMBER, EL_DYNABOMB_INCREASE_SIZE, @@ -1832,6 +1957,8 @@ void InitElementPropertiesStatic() EL_ENVELOPE_3, EL_ENVELOPE_4, EL_SPEED_PILL, + EL_EMC_LENSES, + EL_EMC_MAGNIFIER, -1 }; @@ -1860,6 +1987,7 @@ void InitElementPropertiesStatic() EL_LANDMINE, EL_TRAP_ACTIVE, EL_SP_BUGGY_BASE_ACTIVE, + EL_EMC_PLANT, #endif -1 }; @@ -2025,6 +2153,10 @@ void InitElementPropertiesStatic() EL_STEELWALL_SLIPPERY, EL_PEARL, EL_CRYSTAL, + EL_EMC_WALL_SLIPPERY_1, + EL_EMC_WALL_SLIPPERY_2, + EL_EMC_WALL_SLIPPERY_3, + EL_EMC_WALL_SLIPPERY_4, -1 }; @@ -2053,6 +2185,7 @@ void InitElementPropertiesStatic() EL_SP_ELECTRON, EL_BALLOON, EL_SPRING, + EL_EMC_ANDROID, -1 }; @@ -2233,10 +2366,18 @@ void InitElementPropertiesStatic() EL_EM_GATE_2, EL_EM_GATE_3, EL_EM_GATE_4, + EL_EM_GATE_5, + EL_EM_GATE_6, + EL_EM_GATE_7, + EL_EM_GATE_8, EL_EM_GATE_1_GRAY, EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_5_GRAY, + EL_EM_GATE_6_GRAY, + EL_EM_GATE_7_GRAY, + EL_EM_GATE_8_GRAY, EL_SWITCHGATE_OPEN, EL_TIMEGATE_OPEN, -1 @@ -2297,6 +2438,7 @@ void InitElementPropertiesStatic() EL_SATELLITE, EL_SP_DISK_YELLOW, EL_BALLOON, + EL_EMC_ANDROID, -1 }; @@ -2325,10 +2467,18 @@ void InitElementPropertiesStatic() EL_EM_GATE_2, EL_EM_GATE_3, EL_EM_GATE_4, + EL_EM_GATE_5, + EL_EM_GATE_6, + EL_EM_GATE_7, + EL_EM_GATE_8, EL_EM_GATE_1_GRAY, EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_5_GRAY, + EL_EM_GATE_6_GRAY, + EL_EM_GATE_7_GRAY, + EL_EM_GATE_8_GRAY, EL_SWITCHGATE_OPEN, EL_TIMEGATE_OPEN, @@ -2422,6 +2572,7 @@ void InitElementPropertiesStatic() EL_SP_GRAVITY_OFF_PORT_RIGHT, EL_SP_GRAVITY_OFF_PORT_UP, EL_SP_GRAVITY_OFF_PORT_DOWN, + EL_EMC_GRASS, -1 }; @@ -2478,6 +2629,7 @@ void InitElementPropertiesStatic() EL_BALLOON_SWITCH_ANY, EL_LAMP, EL_TIME_ORB_FULL, + EL_EMC_MAGIC_BALL_SWITCH, -1 }; @@ -2988,10 +3140,18 @@ void InitElementPropertiesStatic() EL_EM_GATE_2, EL_EM_GATE_3, EL_EM_GATE_4, + EL_EM_GATE_5, + EL_EM_GATE_6, + EL_EM_GATE_7, + EL_EM_GATE_8, EL_EM_GATE_1_GRAY, EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_5_GRAY, + EL_EM_GATE_6_GRAY, + EL_EM_GATE_7_GRAY, + EL_EM_GATE_8_GRAY, -1 }; @@ -3073,6 +3233,10 @@ void InitElementPropertiesStatic() EL_EM_KEY_2, EL_EM_KEY_3, EL_EM_KEY_4, + EL_EM_KEY_5, + EL_EM_KEY_6, + EL_EM_KEY_7, + EL_EM_KEY_8, EL_GATE_1, EL_GATE_2, EL_GATE_3, @@ -3085,10 +3249,18 @@ void InitElementPropertiesStatic() EL_EM_GATE_2, EL_EM_GATE_3, EL_EM_GATE_4, + EL_EM_GATE_5, + EL_EM_GATE_6, + EL_EM_GATE_7, + EL_EM_GATE_8, EL_EM_GATE_1_GRAY, EL_EM_GATE_2_GRAY, EL_EM_GATE_3_GRAY, EL_EM_GATE_4_GRAY, + EL_EM_GATE_5_GRAY, + EL_EM_GATE_6_GRAY, + EL_EM_GATE_7_GRAY, + EL_EM_GATE_8_GRAY, EL_DYNAMITE, EL_INVISIBLE_STEELWALL, EL_INVISIBLE_WALL, @@ -3190,6 +3362,10 @@ void InitElementPropertiesStatic() EL_EMC_STEELWALL_2, EL_EMC_STEELWALL_3, EL_EMC_STEELWALL_4, + EL_EMC_WALL_SLIPPERY_1, + EL_EMC_WALL_SLIPPERY_2, + EL_EMC_WALL_SLIPPERY_3, + EL_EMC_WALL_SLIPPERY_4, EL_EMC_WALL_1, EL_EMC_WALL_2, EL_EMC_WALL_3, @@ -3198,6 +3374,14 @@ void InitElementPropertiesStatic() EL_EMC_WALL_6, EL_EMC_WALL_7, EL_EMC_WALL_8, + EL_EMC_WALL_9, + EL_EMC_WALL_10, + EL_EMC_WALL_11, + EL_EMC_WALL_12, + EL_EMC_WALL_13, + EL_EMC_WALL_14, + EL_EMC_WALL_15, + EL_EMC_WALL_16, -1 };