X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=bd1ded0c740635fdf3400c55eb272d7c32c3418b;hb=a268c893d49b178fdcc80956484b567952868fd4;hp=3c341ec59a524266babaf0c094954dff4339206a;hpb=86e1890b2d87dd7710b320e2b306c7291d41e2a5;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 3c341ec5..bd1ded0c 100644 --- a/src/tools.c +++ b/src/tools.c @@ -5495,21 +5495,51 @@ int get_next_element(int element) } } +#if 0 +int el_act_dir2img(int element, int action, int direction) +{ + element = GFX_ELEMENT(element); + + if (direction == MV_NO_MOVING) + return element_info[element].graphic[action]; + + direction = MV_DIR_BIT(direction); + + return element_info[element].direction_graphic[action][direction]; +} +#else int el_act_dir2img(int element, int action, int direction) { element = GFX_ELEMENT(element); direction = MV_DIR_BIT(direction); /* default: MV_NO_MOVING => MV_DOWN */ + /* direction_graphic[][] == graphic[] for undefined direction graphics */ return element_info[element].direction_graphic[action][direction]; } +#endif +#if 0 +static int el_act_dir2crm(int element, int action, int direction) +{ + element = GFX_ELEMENT(element); + + if (direction == MV_NO_MOVING) + return element_info[element].crumbled[action]; + + direction = MV_DIR_BIT(direction); + + return element_info[element].direction_crumbled[action][direction]; +} +#else static int el_act_dir2crm(int element, int action, int direction) { element = GFX_ELEMENT(element); direction = MV_DIR_BIT(direction); /* default: MV_NO_MOVING => MV_DOWN */ + /* direction_graphic[][] == graphic[] for undefined direction graphics */ return element_info[element].direction_crumbled[action][direction]; } +#endif int el_act2img(int element, int action) { @@ -5720,14 +5750,22 @@ void InitGraphicInfo_EM(void) action_active ? action : action_other ? action : ACTION_DEFAULT); - int graphic = (direction == MV_NO_MOVING ? - el_act2img(effective_element, effective_action) : - el_act_dir2img(effective_element, effective_action, + int graphic = (el_act_dir2img(effective_element, effective_action, direction)); + int crumbled = (el_act_dir2crm(effective_element, effective_action, + direction)); + int base_graphic = el_act2img(effective_element, ACTION_DEFAULT); + int base_crumbled = el_act2crm(effective_element, ACTION_DEFAULT); + boolean has_crumbled_graphics = (base_crumbled != base_graphic); struct GraphicInfo *g = &graphic_info[graphic]; struct GraphicInfo_EM *g_em = &graphic_info_em_object[i][7 - j]; Bitmap *src_bitmap; int src_x, src_y; + /* ensure to get symmetric 3-frame, 2-delay animations as used in EM */ + boolean special_animation = (action != ACTION_DEFAULT && + g->anim_frames == 3 && + g->anim_delay == 2 && + g->anim_mode & ANIM_LINEAR); int sync_frame = (i == Xdrip_stretch ? 7 : i == Xdrip_stretchB ? 7 : i == Ydrip_s2 ? j + 8 : @@ -5819,6 +5857,7 @@ void InitGraphicInfo_EM(void) i == Xboom_2 && j == 5 ? 12 : i == Xboom_2 && j == 6 ? 12 : i == Xboom_2 && j == 7 ? 12 : + special_animation && j == 4 ? 3 : effective_action != action ? 0 : j); @@ -5847,8 +5886,41 @@ void InitGraphicInfo_EM(void) g_em->dst_offset_y = 0; g_em->width = TILEX; g_em->height = TILEY; + + g_em->has_crumbled_graphics = FALSE; + g_em->crumbled_bitmap = NULL; + g_em->crumbled_src_x = 0; + g_em->crumbled_src_y = 0; + g_em->crumbled_border_size = 0; +#endif + +#if 0 + if (effective_element == EL_EMC_GRASS && + effective_action == ACTION_DIGGING) + printf("::: %d\n", crumbled); +#endif + +#if 0 + if (has_crumbled_graphics && crumbled == IMG_EMPTY_SPACE) + printf("::: empty crumbled: %d [%s], %d, %d\n", + effective_element, element_info[effective_element].token_name, + effective_action, direction); #endif + /* if element can be crumbled, but certain action graphics are just empty + space (like snapping sand with the original R'n'D graphics), do not + treat these empty space graphics as crumbled graphics in EMC engine */ + if (has_crumbled_graphics && crumbled != IMG_EMPTY_SPACE) + { + getGraphicSource(crumbled, frame, &src_bitmap, &src_x, &src_y); + + g_em->has_crumbled_graphics = TRUE; + g_em->crumbled_bitmap = src_bitmap; + g_em->crumbled_src_x = src_x; + g_em->crumbled_src_y = src_y; + g_em->crumbled_border_size = graphic_info[crumbled].border_size; + } + #if 1 if (!g->double_movement && (effective_action == ACTION_FALLING || effective_action == ACTION_MOVING || @@ -5919,8 +5991,9 @@ void InitGraphicInfo_EM(void) last_i = i; } - printf("::: EMC GFX ERROR for element %d -> %d ('%s')", - i, element, element_info[element].token_name); + printf("::: EMC GFX ERROR for element %d -> %d ('%s') [%d, %d]", + i, element, element_info[element].token_name, + effective_action, direction); if (element != effective_element) printf(" [%d ('%s')]",