X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=fbb3079302ec7e5a67aa8b7986827f3596112b00;hp=b66404ab0e7409a01d88279564cc3bb6ddec85c5;hb=8c167a3d4c65f4baf5b4abbebab48d575c248221;hpb=42164ca7e4355ad0d1590a3539be2719c2e8c9e6 diff --git a/src/tools.c b/src/tools.c index b66404ab..fbb30793 100644 --- a/src/tools.c +++ b/src/tools.c @@ -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)