X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=56f7de4b48eb3ec2738eedefd7fd5b88d9fa0151;hb=4dd13e13723d0f55916fc013dc621fbdf2691a09;hp=0d1f8b910314491db687c2059f612c7dc9e81e57;hpb=0d2143d53f76e2780260996fae2b9f3ce4f29913;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 0d1f8b91..56f7de4b 100644 --- a/src/tools.c +++ b/src/tools.c @@ -43,6 +43,7 @@ extern boolean wait_for_vsync; #define NUM_TOOL_BUTTONS 7 /* forward declaration for internal use */ +static int getGraphicAnimationPhase(int, int, int); static void UnmapToolButtons(); static void HandleToolButtons(struct GadgetInfo *); @@ -479,7 +480,7 @@ void DrawPlayer(struct PlayerInfo *player) if (last_jx != jx || last_jy != jy) { - if (Store[last_jx][last_jy]) + if (Store[last_jx][last_jy] && IS_DRAWABLE(Feld[last_jx][last_jy])) { DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]); DrawLevelFieldThruMask(last_jx, last_jy); @@ -520,30 +521,12 @@ void DrawPlayer(struct PlayerInfo *player) if (game_emulation == EMU_SUPAPLEX) { -#if 0 - if (player->MovDir == MV_LEFT) - graphic = - (player->Pushing ? GFX_MURPHY_PUSH_LEFT : GFX_MURPHY_LEFT); - else if (player->MovDir == MV_RIGHT) - graphic = - (player->Pushing ? GFX_MURPHY_PUSH_RIGHT : GFX_MURPHY_RIGHT); - else if (player->MovDir == MV_UP) - graphic = GFX_MURPHY_UP; - else if (player->MovDir == MV_DOWN) - graphic = GFX_MURPHY_DOWN; - else /* MV_NO_MOVING */ - graphic = GFX_SP_MURPHY; - - - /* - if (player->snapped) - graphic = GFX_SPIELER1_PUSH_LEFT; - else - graphic = GFX_SPIELER1_PUSH_RIGHT; - */ -#endif + static int last_dir = MV_LEFT; + boolean action_moving = + ((player->action & (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)) && + !(player->action & ~(MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN))); - static last_dir = MV_LEFT; + graphic = GFX_SP_MURPHY; if (player->Pushing) { @@ -551,12 +534,10 @@ void DrawPlayer(struct PlayerInfo *player) graphic = GFX_MURPHY_PUSH_LEFT; else if (player->MovDir == MV_RIGHT) graphic = GFX_MURPHY_PUSH_RIGHT; - else if (last_dir == MV_LEFT) - graphic = GFX_MURPHY_ANY_LEFT; - else if (last_dir == MV_RIGHT) - graphic = GFX_MURPHY_ANY_RIGHT; - else - graphic = GFX_SP_MURPHY; + else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT) + graphic = GFX_MURPHY_PUSH_LEFT; + else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT) + graphic = GFX_MURPHY_PUSH_RIGHT; } else if (player->snapped) { @@ -568,28 +549,23 @@ void DrawPlayer(struct PlayerInfo *player) graphic = GFX_MURPHY_SNAP_UP; else if (player->MovDir == MV_DOWN) graphic = GFX_MURPHY_SNAP_DOWN; - else - graphic = GFX_SP_MURPHY; } - else + else if (action_moving) { if (player->MovDir == MV_LEFT) - graphic = GFX_MURPHY_ANY_LEFT; + graphic = GFX_MURPHY_GO_LEFT; else if (player->MovDir == MV_RIGHT) - graphic = GFX_MURPHY_ANY_RIGHT; - else if (last_dir == MV_LEFT) - graphic = GFX_MURPHY_ANY_LEFT; - else if (last_dir == MV_RIGHT) - graphic = GFX_MURPHY_ANY_RIGHT; - else - graphic = GFX_SP_MURPHY; + graphic = GFX_MURPHY_GO_RIGHT; + else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT) + graphic = GFX_MURPHY_GO_LEFT; + else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT) + graphic = GFX_MURPHY_GO_RIGHT; + + graphic += getGraphicAnimationPhase(3, 2, ANIM_OSCILLATE); } if (player->MovDir == MV_LEFT || player->MovDir == MV_RIGHT) last_dir = player->MovDir; - - if (!player->Pushing && !player->snapped && player->MovDir != MV_NO_MOVING) - graphic -= player->Frame % 2; } else { @@ -634,14 +610,14 @@ void DrawPlayer(struct PlayerInfo *player) int element = Feld[next_jx][next_jy]; int graphic = el2gfx(element); - if (element == EL_FELSBROCKEN && sxx) + if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK) && sxx) { - int phase = (player->GfxPos / (TILEX/4)); + int phase = (player->GfxPos / (TILEX / 4)); if (player->MovDir == MV_LEFT) graphic += phase; else - graphic += (phase+4)%4; + graphic += (phase + 4) % 4; } DrawGraphicShifted(px, py, sxx, syy, graphic, NO_CUTTING, NO_MASKING); @@ -876,6 +852,9 @@ void DrawGraphicThruMaskExt(Drawable d, int dest_x, int dest_y, int graphic) Pixmap src_pixmap; GC drawing_gc; + if (graphic == GFX_LEERRAUM) + return; + getGraphicSource(graphic, &pixmap_nr, &src_x, &src_y); src_pixmap = pix[pixmap_nr]; drawing_gc = clip_gc[pixmap_nr]; @@ -1247,10 +1226,35 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element, { graphic += !phase2; } - else if ((element == EL_FELSBROCKEN || IS_GEM(element)) && !cut_mode) + else if ((element == EL_FELSBROCKEN || element == EL_SP_ZONK || + IS_GEM(element)) && !cut_mode) { - if (element != EL_SP_INFOTRON) + if (element == EL_FELSBROCKEN || element == EL_SP_ZONK) + { + if (dir == MV_LEFT) + graphic += (4 - phase4) % 4; + else if (dir == MV_RIGHT) + graphic += phase4; + else + graphic += phase2 * 2; + } + else if (element != EL_SP_INFOTRON) + graphic += phase2; + + /* + if (element == EL_SP_ZONK) + { + if (dir == MV_LEFT) + graphic += (4 - phase4) % 4; + else if (dir == MV_RIGHT) + graphic += phase4; + else + graphic += phase2 * 2; + } + else if (element != EL_SP_INFOTRON) graphic += phase2 * (element == EL_FELSBROCKEN ? 2 : 1); + */ + } else if (element == EL_SIEB_LEER || element == EL_SIEB2_LEER || element == EL_SIEB_VOLL || element == EL_SIEB2_VOLL) @@ -2430,8 +2434,8 @@ void CreateToolButtons() for (i=0; i