X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=c8f9e5d2dd7f9ac1861ade040d05cd2a66a394de;hb=cd9add1d9479d1938d05ca9df4f31c3f99bd5f3e;hp=37a01c4df16245f65940ec38f9e843476aec4933;hpb=01295e7cfce6354e2fad160ba0ce2880546d7a60;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 37a01c4d..c8f9e5d2 100644 --- a/src/tools.c +++ b/src/tools.c @@ -690,7 +690,7 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) { int phase; - if (mode == ANIM_PINGPONG) + if (mode & ANIM_PINGPONG) { int max_anim_frames = 2 * frames - 2; @@ -700,7 +700,7 @@ static int getGraphicAnimationPhase(int frames, int delay, int mode) else phase = (FrameCounter % (delay * frames)) / delay; - if (mode == ANIM_REVERSE) + if (mode & ANIM_REVERSE) phase = -phase; return phase; @@ -765,9 +765,13 @@ void DrawGraphicAnimationExt(int x, int y, int graphic, void DrawNewGraphicAnimationExt(int x, int y, int graphic, int mask_mode) { +#if 0 int delay = new_graphic_info[graphic].anim_delay; if (!(FrameCounter % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#else + if (IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#endif { int frame = getNewGraphicAnimationFrame(graphic, -1); @@ -1468,6 +1472,21 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, DrawGraphic(x, y, graphic); } +inline static int getFramePosition(int x, int y) +{ + int element = Feld[x][y]; + int frame_pos = -1; + + if (element == EL_QUICKSAND_FULL || + element == EL_MAGIC_WALL_FULL || + element == EL_BD_MAGIC_WALL_FULL) + frame_pos = -1; + else if (IS_MOVING(x, y) || CAN_MOVE(element) || CAN_FALL(element)) + frame_pos = ABS(MovPos[x][y]) / (TILEX / 8); + + return frame_pos; +} + inline static int getGfxAction(int x, int y) { int gfx_action = GFX_ACTION_DEFAULT; @@ -1481,11 +1500,11 @@ inline static int getGfxAction(int x, int y) } void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, - int cut_mode, int mask_mode) + int cut_mode, int mask_mode) { int ux = LEVELX(x), uy = LEVELY(y); int move_dir = MovDir[ux][uy]; - int move_pos = ABS(MovPos[ux][uy]) / (TILEX / 8); + int move_pos = getFramePosition(ux, uy); int gfx_action = getGfxAction(ux, uy); int graphic = el_dir_act2img(element, move_dir, gfx_action); int frame = getNewGraphicAnimationFrame(graphic, move_pos); @@ -1494,17 +1513,23 @@ void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, { boolean left_stopped = FALSE, right_stopped = FALSE; - if (!IN_LEV_FIELD(ux-1, uy) || IS_MAUER(Feld[ux-1][uy])) + if (!IN_LEV_FIELD(ux - 1, uy) || IS_MAUER(Feld[ux - 1][uy])) left_stopped = TRUE; - if (!IN_LEV_FIELD(ux+1, uy) || IS_MAUER(Feld[ux+1][uy])) + if (!IN_LEV_FIELD(ux + 1, uy) || IS_MAUER(Feld[ux + 1][uy])) right_stopped = TRUE; if (left_stopped && right_stopped) graphic = IMG_WALL; else if (left_stopped) + { graphic = IMG_WALL_GROWING_ACTIVE_RIGHT; + frame = new_graphic_info[graphic].anim_frames - 1; + } else if (right_stopped) + { graphic = IMG_WALL_GROWING_ACTIVE_LEFT; + frame = new_graphic_info[graphic].anim_frames - 1; + } } #if 0 else if ((element == EL_ROCK || @@ -1531,12 +1556,17 @@ void DrawNewScreenElementExt(int x, int y, int dx, int dy, int element, graphic += phase2; } } +#endif else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING) { - graphic = (element == EL_AMOEBA_DEAD ? GFX_AMOEBE_TOT : GFX_AMOEBE_LEBT); + graphic = (element == EL_BD_AMOEBA ? IMG_BD_AMOEBA_PART1 : + element == EL_AMOEBA_WET ? IMG_AMOEBA_WET_PART1 : + element == EL_AMOEBA_DRY ? IMG_AMOEBA_DRY_PART1 : + element == EL_AMOEBA_FULL ? IMG_AMOEBA_FULL_PART1 : + IMG_AMOEBA_DEAD_PART1); + graphic += (x + 2 * y + 4) % 4; } -#endif if (dx || dy) DrawNewGraphicShifted(x, y, dx, dy, graphic, frame, cut_mode, mask_mode); @@ -2085,7 +2115,7 @@ void DrawLevel() for(x=BX1; x<=BX2; x++) for(y=BY1; y<=BY2; y++) - DrawScreenField(x, y); + DrawNewScreenField(x, y); redraw_mask |= REDRAW_FIELD; }