X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=fbb3079302ec7e5a67aa8b7986827f3596112b00;hb=8c167a3d4c65f4baf5b4abbebab48d575c248221;hp=d98a4c1bb7085590176e46f3ed4f07274bc452e1;hpb=1bd9644544424ed912d886777c6e8ed387aac24a;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index d98a4c1b..fbb30793 100644 --- a/src/tools.c +++ b/src/tools.c @@ -486,7 +486,7 @@ 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]); + int graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]); DrawGraphicAnimation(SCREENX(x), SCREENY(y), graphic); #else @@ -518,7 +518,7 @@ void DrawLevelElementAnimationIfNeeded(int x, int y, int element) if (!IN_LEV_FIELD(x, y) || !IN_SCR_FIELD(sx, sy)) return; - graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]); + graphic = el_act_dir2img(element, GfxAction[x][y], GfxDir[x][y]); if (!IS_NEW_FRAME(GfxFrame[x][y], graphic)) return; @@ -529,6 +529,30 @@ void DrawLevelElementAnimationIfNeeded(int x, int y, int element) DrawLevelFieldCrumbledSand(x, y); } +static int getPlayerGraphic(struct PlayerInfo *player, int move_dir) +{ + if (player->use_murphy_graphic) + { + /* this works only because currently only one player can be "murphy" ... */ + static int last_horizontal_dir = MV_LEFT; + int graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, move_dir); + + if (move_dir == MV_LEFT || move_dir == MV_RIGHT) + last_horizontal_dir = move_dir; + + if (graphic == IMG_SP_MURPHY) /* undefined => use special graphic */ + { + int direction = (player->is_snapping ? move_dir : last_horizontal_dir); + + graphic = el_act_dir2img(EL_SP_MURPHY, player->GfxAction, direction); + } + + return graphic; + } + else + return el_act_dir2img(player->element_nr, player->GfxAction, move_dir); +} + void DrawAllPlayers() { int i; @@ -571,6 +595,8 @@ void DrawPlayer(struct PlayerInfo *player) int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy]; int graphic; int action = ACTION_DEFAULT; + int last_player_graphic = getPlayerGraphic(player, move_dir); + int last_player_frame = player->Frame; int frame = 0; if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy))) @@ -672,6 +698,18 @@ void DrawPlayer(struct PlayerInfo *player) /* draw player himself */ /* ----------------------------------------------------------------------- */ +#if 1 + + graphic = getPlayerGraphic(player, move_dir); + + /* in the case of changed player action or direction, prevent the current + animation frame from being restarted for identical animations */ + if (player->Frame == 0 && + graphic_info[graphic].bitmap == graphic_info[last_player_graphic].bitmap) + player->Frame = last_player_frame; + +#else + if (player->use_murphy_graphic) { static int last_horizontal_dir = MV_LEFT; @@ -691,6 +729,8 @@ void DrawPlayer(struct PlayerInfo *player) else graphic = el_act_dir2img(player->element_nr, player->GfxAction, move_dir); +#endif + frame = getGraphicAnimationFrame(graphic, player->Frame); if (player->GfxPos) @@ -1072,7 +1112,7 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, { SetRandomAnimationValue(lx, ly); - graphic = el_act_dir2img(element, GfxAction[lx][ly], MovDir[lx][ly]); + graphic = el_act_dir2img(element, GfxAction[lx][ly], GfxDir[lx][ly]); frame = getGraphicAnimationFrame(graphic, GfxFrame[lx][ly]); } else /* border element */