X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=974765111a020583fdfddb12566c784b84a37c0a;hb=a3bc2ca4c0acf21291d20b5affed89f149b85862;hp=31a555d67a2177b7fdc186f9dbe3989ed44f5829;hpb=d5224fde97c235c903f631a4eccb9904c2ddf9c3;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 31a555d6..97476511 100644 --- a/src/tools.c +++ b/src/tools.c @@ -483,7 +483,13 @@ void DrawLevelGraphicAnimation(int x, int y, int graphic) void DrawLevelElementAnimation(int x, int y, int element) { +#if 1 + int graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]); + + DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); +#else DrawGraphicAnimation(SCREENX(x), SCREENY(y), el2img(element)); +#endif } inline void DrawLevelGraphicAnimationIfNeeded(int x, int y, int graphic) @@ -594,6 +600,9 @@ void DrawPlayer(struct PlayerInfo *player) if (player->Pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy))) { +#if 1 + DrawLevelElement(next_jx, next_jy, EL_EMPTY); +#else if (player->GfxPos) { if (Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL) @@ -603,6 +612,7 @@ void DrawPlayer(struct PlayerInfo *player) } else DrawLevelField(next_jx, next_jy); +#endif } } @@ -694,14 +704,28 @@ void DrawPlayer(struct PlayerInfo *player) { int px = SCREENX(next_jx), py = SCREENY(next_jy); + if (Back[next_jx][next_jy]) + DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]); + +#if 1 + if ((sxx || syy) && element == EL_SOKOBAN_OBJECT) + DrawGraphicShiftedThruMask(px, py, sxx, syy, IMG_SOKOBAN_OBJECT, 0, + NO_CUTTING); +#else if ((sxx || syy) && (element == EL_SOKOBAN_FIELD_EMPTY || Feld[next_jx][next_jy] == EL_SOKOBAN_FIELD_FULL)) DrawGraphicShiftedThruMask(px, py, sxx, syy, IMG_SOKOBAN_OBJECT, 0, NO_CUTTING); +#endif else { +#if 1 + int element = Feld[jx][jy]; +#else int element = Feld[next_jx][next_jy]; +#endif + int graphic = el2img(element); int frame = 0; @@ -733,10 +757,14 @@ void DrawPlayer(struct PlayerInfo *player) if (player_is_moving && last_element == EL_EXPLOSION) { +#if 1 + int graphic = el_act2img(GfxElement[last_jx][last_jy], ACTION_EXPLODING); +#else int stored = Store[last_jx][last_jy]; int graphic = (game.emulation != EMU_SUPAPLEX ? IMG_EXPLOSION : stored == EL_SP_INFOTRON ? IMG_SP_EXPLOSION_INFOTRON : IMG_SP_EXPLOSION); +#endif int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); int phase = ExplodePhase[last_jx][last_jy] - 1; int frame = getGraphicAnimationFrame(graphic, phase - delay); @@ -925,11 +953,7 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame, { Bitmap *src_bitmap; GC drawing_gc; - int src_x; - int src_y; - int offset_x; - int offset_y; - + int src_x, src_y; int width = TILEX, height = TILEY; int cx = 0, cy = 0; int dest_x, dest_y; @@ -1004,16 +1028,20 @@ void DrawGraphicShifted(int x,int y, int dx,int dy, int graphic, int frame, MarkTileDirty(x, y + SIGN(dy)); } +#if 1 + getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); +#else src_bitmap = graphic_info[graphic].bitmap; src_x = graphic_info[graphic].src_x; src_y = graphic_info[graphic].src_y; offset_x = graphic_info[graphic].offset_x; offset_y = graphic_info[graphic].offset_y; - drawing_gc = src_bitmap->stored_clip_gc; - src_x += frame * offset_x; src_y += frame * offset_y; +#endif + + drawing_gc = src_bitmap->stored_clip_gc; src_x += cx; src_y += cy; @@ -1185,7 +1213,7 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame) element = (GfxElement[x][y] != EL_UNDEFINED ? GfxElement[x][y] : Feld[x][y]); /* crumble field itself */ - if (CAN_BE_CRUMBLED(element)) + if (CAN_BE_CRUMBLED(element) && !IS_MOVING(x, y)) { if (!IN_SCR_FIELD(sx, sy)) return; @@ -1199,7 +1227,8 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame) element = (IN_LEV_FIELD(xx, yy) ? Feld[xx][yy] : EL_STEELWALL); - if (CAN_BE_CRUMBLED(element)) /* neighbour is of same type */ + /* check if neighbour field is of same type */ + if (CAN_BE_CRUMBLED(element) && !IS_MOVING(xx, yy)) continue; if (i == 1 || i == 2) @@ -1236,7 +1265,8 @@ static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame) if (!IN_LEV_FIELD(xx, yy) || !IN_SCR_FIELD(sxx, syy) || - !CAN_BE_CRUMBLED(Feld[xx][yy])) + !CAN_BE_CRUMBLED(Feld[xx][yy]) || + IS_MOVING(xx, yy)) continue; if (i == 1 || i == 2) @@ -1455,6 +1485,7 @@ void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) int src_x = mini_startx + graphic_info[graphic].src_x / 8; int src_y = mini_starty + graphic_info[graphic].src_y / 8; +#if 0 if (src_x + MICRO_TILEX > src_bitmap->width || src_y + MICRO_TILEY > src_bitmap->height) { @@ -1465,6 +1496,7 @@ void getMicroGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) src_x += (TILEX / 2 - MICRO_TILEX / 2); src_y += (TILEY / 2 - MICRO_TILEY / 2); } +#endif *bitmap = src_bitmap; *x = src_x; @@ -2390,6 +2422,7 @@ int get_next_element(int element) int el_act_dir2img(int element, int action, int direction) { + element = GFX_ELEMENT(element); direction = MV_DIR_BIT(direction); return element_info[element].direction_graphic[action][direction]; @@ -2397,25 +2430,35 @@ int el_act_dir2img(int element, int action, int direction) int el_act2img(int element, int action) { + element = GFX_ELEMENT(element); + return element_info[element].graphic[action]; } int el_dir2img(int element, int direction) { + element = GFX_ELEMENT(element); + return el_act_dir2img(element, ACTION_DEFAULT, direction); } int el2img(int element) { + element = GFX_ELEMENT(element); + return element_info[element].graphic[ACTION_DEFAULT]; } int el2edimg(int element) { + element = GFX_ELEMENT(element); + return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR]; } int el2preimg(int element) { + element = GFX_ELEMENT(element); + return element_info[element].special_graphic[GFX_SPECIAL_ARG_PREVIEW]; }