X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=e28f068e467df5a93d88eb2f8f06fd53d67be701;hb=891c39ca37c4fea5f6cc4ca40f913a56c68ef495;hp=b66404ab0e7409a01d88279564cc3bb6ddec85c5;hpb=47572a41886623747cb380fc127a814d00028c6f;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index b66404ab..e28f068e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -529,6 +529,43 @@ 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); +} + +static boolean equalGraphics(int graphic1, int graphic2) +{ + struct GraphicInfo *g1 = &graphic_info[graphic1]; + struct GraphicInfo *g2 = &graphic_info[graphic2]; + + return (g1->bitmap == g2->bitmap && + g1->src_x == g2->src_x && + g1->src_y == g2->src_y && + g1->anim_frames == g2->anim_frames && + g1->anim_delay == g2->anim_delay && + g1->anim_mode == g2->anim_mode); +} + void DrawAllPlayers() { int i; @@ -571,6 +608,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))) @@ -589,11 +628,19 @@ void DrawPlayer(struct PlayerInfo *player) if (element == EL_EXPLOSION) return; - action = (player->is_pushing ? ACTION_PUSHING : + action = (player->is_pushing ? ACTION_PUSHING : player->is_digging ? ACTION_DIGGING : player->is_collecting ? ACTION_COLLECTING : player->is_moving ? ACTION_MOVING : - player->is_snapping ? ACTION_SNAPPING : ACTION_DEFAULT); + player->is_snapping ? ACTION_SNAPPING : + player->is_sleeping ? ACTION_SLEEPING : + player->is_bored ? ACTION_BORING : + player->is_waiting ? ACTION_WAITING : ACTION_DEFAULT); + + if (player->is_bored || player->is_sleeping) + { + /* ... */ + } #if 0 printf("::: '%s'\n", element_action_info[action].suffix); @@ -672,6 +719,17 @@ 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 && equalGraphics(graphic, last_player_graphic)) + player->Frame = last_player_frame; + +#else + if (player->use_murphy_graphic) { static int last_horizontal_dir = MV_LEFT; @@ -691,6 +749,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)