X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=1f857f6bc095190c1d27eff371dd68a85bb66d41;hb=2d235297197dd0c325184f7fc401d9c5c41c2616;hp=51ed27939397bced7e7dca0a97b0aa2def554cab;hpb=e81cc7dec1526e1e876ba9ce1e2064fe40d417e3;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 51ed2793..1f857f6b 100644 --- a/src/tools.c +++ b/src/tools.c @@ -123,6 +123,14 @@ void SetDrawtoField(int mode) void RedrawPlayfield(boolean force_redraw, int x, int y, int width, int height) { + if (game_status == GAME_MODE_PLAYING && + level.game_engine_type == GAME_ENGINE_TYPE_EM) + { + RedrawPlayfield_EM(); + + return; + } + if (game_status == GAME_MODE_PLAYING && !game.envelope_active) { if (force_redraw) @@ -2219,6 +2227,12 @@ boolean Request(char *text, unsigned int req_state) } } +#if 1 + if (game_status == GAME_MODE_PLAYING && + level.game_engine_type == GAME_ENGINE_TYPE_EM) + BlitScreenToBitmap_EM(backbuffer); +#endif + #if 1 /* disable deactivated drawing when quick-loading level tape recording */ if (tape.playing && tape.deactivate_display) @@ -5495,7 +5509,7 @@ int get_next_element(int element) } } -#if 1 +#if 0 int el_act_dir2img(int element, int action, int direction) { element = GFX_ELEMENT(element); @@ -5513,11 +5527,12 @@ 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 1 +#if 0 static int el_act_dir2crm(int element, int action, int direction) { element = GFX_ELEMENT(element); @@ -5535,6 +5550,7 @@ 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 @@ -5588,8 +5604,17 @@ int el2preimg(int element) int getGameFrameDelay_EM(int native_em_game_frame_delay) { - return (GameFrameDelay == GAME_FRAME_DELAY ? native_em_game_frame_delay : - GameFrameDelay); + int game_frame_delay_value; + + game_frame_delay_value = + (tape.playing && tape.fast_forward ? FfwdFrameDelay : + GameFrameDelay == GAME_FRAME_DELAY ? native_em_game_frame_delay : + GameFrameDelay); + + if (tape.playing && tape.warp_forward && !tape.pausing) + game_frame_delay_value = 0; + + return game_frame_delay_value; } unsigned int InitRND(long seed) @@ -5687,7 +5712,6 @@ void InitGraphicInfo_EM(void) int effective_element = (j > 5 && i == Yacid_splash_eB ? EL_EMPTY : j > 5 && i == Yacid_splash_wB ? EL_EMPTY : j < 7 ? element : - i == Ynut_sB ? element : i == Xdrip_stretch ? element : i == Xdrip_stretchB ? element : i == Ydrip_s1 ? element : @@ -5712,11 +5736,12 @@ void InitGraphicInfo_EM(void) i == Yspring_kill_w ? EL_SPRING : i == Yemerald_stone ? EL_EMERALD : i == Ydiamond_stone ? EL_ROCK : + i == Xsand_stonein_4 ? EL_EMPTY : + i == Xsand_stoneout_2 ? EL_ROCK : is_backside ? EL_EMPTY : action_removing ? EL_EMPTY : element); int effective_action = (j < 7 ? action : - i == Ynut_sB ? action : i == Xdrip_stretch ? action : i == Xdrip_stretchB ? action : i == Ydrip_s1 ? action : @@ -5754,6 +5779,7 @@ void InitGraphicInfo_EM(void) 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; @@ -5808,22 +5834,22 @@ void InitGraphicInfo_EM(void) i == Xsand_stonein_2 ? j + 9 : i == Xsand_stonein_3 ? j + 17 : i == Xsand_stonein_4 ? j + 25 : - i == Xsand_stoneout_1 && j == 0 ? 1 : - i == Xsand_stoneout_1 && j == 1 ? 1 : - i == Xsand_stoneout_1 && j == 2 ? 2 : - i == Xsand_stoneout_1 && j == 3 ? 4 : - i == Xsand_stoneout_1 && j == 4 ? 4 : - i == Xsand_stoneout_1 && j == 5 ? 6 : - i == Xsand_stoneout_1 && j == 6 ? 8 : - i == Xsand_stoneout_1 && j == 7 ? 8 : - i == Xsand_stoneout_2 && j == 0 ? 10 : - i == Xsand_stoneout_2 && j == 1 ? 12 : - i == Xsand_stoneout_2 && j == 2 ? 14 : - i == Xsand_stoneout_2 && j == 3 ? 16 : - i == Xsand_stoneout_2 && j == 4 ? 18 : - i == Xsand_stoneout_2 && j == 5 ? 22 : - i == Xsand_stoneout_2 && j == 6 ? 26 : - i == Xsand_stoneout_2 && j == 7 ? 30 : + i == Xsand_stoneout_1 && j == 0 ? 0 : + i == Xsand_stoneout_1 && j == 1 ? 0 : + i == Xsand_stoneout_1 && j == 2 ? 1 : + i == Xsand_stoneout_1 && j == 3 ? 2 : + i == Xsand_stoneout_1 && j == 4 ? 2 : + i == Xsand_stoneout_1 && j == 5 ? 3 : + i == Xsand_stoneout_1 && j == 6 ? 4 : + i == Xsand_stoneout_1 && j == 7 ? 4 : + i == Xsand_stoneout_2 && j == 0 ? 5 : + i == Xsand_stoneout_2 && j == 1 ? 6 : + i == Xsand_stoneout_2 && j == 2 ? 7 : + i == Xsand_stoneout_2 && j == 3 ? 8 : + i == Xsand_stoneout_2 && j == 4 ? 9 : + i == Xsand_stoneout_2 && j == 5 ? 11 : + i == Xsand_stoneout_2 && j == 6 ? 13 : + i == Xsand_stoneout_2 && j == 7 ? 15 : i == Xboom_bug && j == 1 ? 2 : i == Xboom_bug && j == 2 ? 2 : i == Xboom_bug && j == 3 ? 4 : @@ -5891,15 +5917,31 @@ void InitGraphicInfo_EM(void) g_em->crumbled_border_size = 0; #endif - if (base_crumbled != base_graphic && crumbled != IMG_EMPTY_SPACE) +#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) { - struct GraphicInfo *g_crumbled = &graphic_info[crumbled]; + getGraphicSource(crumbled, frame, &src_bitmap, &src_x, &src_y); g_em->has_crumbled_graphics = TRUE; - g_em->crumbled_bitmap = g_crumbled->bitmap; - g_em->crumbled_src_x = g_crumbled->src_x; - g_em->crumbled_src_y = g_crumbled->src_y; - g_em->crumbled_border_size = g_crumbled->border_size; + 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 @@ -5950,8 +5992,12 @@ void InitGraphicInfo_EM(void) #endif /* create unique graphic identifier to decide if tile must be redrawn */ + /* bit 31 - 16 (16 bit): EM style element + bit 15 - 12 ( 4 bit): EM style frame + bit 11 - 6 ( 6 bit): graphic width + bit 5 - 0 ( 6 bit): graphic height */ g_em->unique_identifier = - (i << 16) | (frame << 8) | g_em->width | g_em->height; + (i << 16) | (j << 12) | (g_em->width << 6) | g_em->height; #if DEBUG_EM_GFX if (g_em->bitmap != debug_bitmap || @@ -5972,9 +6018,9 @@ void InitGraphicInfo_EM(void) last_i = i; } - printf("::: EMC GFX ERROR for element %d -> %d ('%s') [%d, %d]", + printf("::: EMC GFX ERROR for element %d -> %d ('%s', '%s', %d)", i, element, element_info[element].token_name, - effective_action, direction); + element_action_info[effective_action].suffix, direction); if (element != effective_element) printf(" [%d ('%s')]",