X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=ecbe07d0f99c10317cb665e3fc6497c74c281526;hb=a2f9307de12b6111ff7076fed2e4140619f1ac5d;hp=2f3ce540b2998eec2afea3d59f8c38cb023cb204;hpb=c4e2a358613670823800b1bfe5bee211e62dc7b2;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 2f3ce540..ecbe07d0 100644 --- a/src/tools.c +++ b/src/tools.c @@ -362,13 +362,25 @@ void FadeToFront() BackToFront(); } +void SetMainBackgroundImage(int graphic) +{ + SetMainBackgroundBitmap(graphic == IMG_UNDEFINED ? NULL : + new_graphic_info[graphic].bitmap ? + new_graphic_info[graphic].bitmap : + new_graphic_info[IMG_BACKGROUND_DEFAULT].bitmap); +} + +void SetDoorBackgroundImage(int graphic) +{ + SetDoorBackgroundBitmap(graphic == IMG_UNDEFINED ? NULL : + new_graphic_info[graphic].bitmap ? + new_graphic_info[graphic].bitmap : + new_graphic_info[IMG_BACKGROUND_DEFAULT].bitmap); +} + void DrawBackground(int dest_x, int dest_y, int width, int height) { - if (DrawingOnBackground(dest_x, dest_y) && game_status != PLAYING) - BlitBitmap(gfx.background_bitmap, backbuffer, dest_x, dest_y, - width, height, dest_x, dest_y); - else - ClearRectangle(backbuffer, dest_x, dest_y, width, height); + ClearRectangleOnBackground(backbuffer, dest_x, dest_y, width, height); redraw_mask |= REDRAW_FIELD; } @@ -745,7 +757,7 @@ void DrawPlayer(struct PlayerInfo *player) stored == EL_SP_INFOTRON ? IMG_SP_EXPLOSION_INFOTRON : IMG_SP_EXPLOSION); int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); - int phase = Frame[last_jx][last_jy] - 1; + int phase = ExplodePhase[last_jx][last_jy] - 1; int frame = getGraphicAnimationFrame(graphic, phase - delay); if (phase >= delay) @@ -776,10 +788,10 @@ void DrawPlayer(struct PlayerInfo *player) MarkTileDirty(sx,sy); } -void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, - int graphic, int mask_mode) +inline void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, + int graphic, int sync_frame, int mask_mode) { - int frame = getGraphicAnimationFrame(graphic, -1); + int frame = getGraphicAnimationFrame(graphic, sync_frame); if (mask_mode == USE_MASKING) DrawGraphicThruMaskExt(dst_bitmap, x, y, graphic, frame); @@ -787,17 +799,29 @@ void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, DrawGraphicExt(dst_bitmap, x, y, graphic, frame); } -void DrawGraphicAnimation(int x, int y, int graphic) +inline void DrawGraphicAnimation(int x, int y, int graphic) { + int lx = LEVELX(x), ly = LEVELY(y); + if (!IN_SCR_FIELD(x, y) || - (FrameCounter % new_graphic_info[graphic].anim_delay) != 0) + (GfxFrame[lx][ly] % new_graphic_info[graphic].anim_delay) != 0) return; DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY, - graphic, NO_MASKING); + graphic, GfxFrame[lx][ly], NO_MASKING); MarkTileDirty(x, y); } +void DrawLevelGraphicAnimation(int x, int y, int graphic) +{ + DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); +} + +void DrawLevelElementAnimation(int x, int y, int element) +{ + DrawGraphicAnimation(SCREENX(x), SCREENY(y), el2img(element)); +} + #if 0 void getOldGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) { @@ -1295,7 +1319,11 @@ inline static int getFramePosition(int x, int y) else if (IS_MOVING(x, y) || CAN_MOVE(element) || CAN_FALL(element)) frame_pos = ABS(MovPos[x][y]) / (TILEX / 8); #else + frame_pos = ABS(MovPos[x][y]) / (TILEX / 8); + + frame_pos = GfxFrame[x][y]; + #endif return frame_pos; @@ -1754,6 +1782,7 @@ void DrawLevel() { int x,y; + SetDrawBackgroundMask(REDRAW_NONE); ClearWindow(); for(x=BX1; x<=BX2; x++) @@ -2948,9 +2977,9 @@ int el2gfx(int element) #if DEBUG int graphic_OLD = el2gfx_OLD(element); - if (element >= MAX_ELEMENTS) + if (element >= MAX_NUM_ELEMENTS) { - Error(ERR_WARN, "el2gfx: element == %d >= MAX_ELEMENTS", element); + Error(ERR_WARN, "el2gfx: element == %d >= MAX_NUM_ELEMENTS", element); } if (graphic_NEW != graphic_OLD)