rnd-19990210-1
[rocksndiamonds.git] / src / tools.c
index f68804f5365fcf6ad71fdefa128500598cd22877..211a96c4c60cd04dd0b4c191c4ea80860fedf2f7 100644 (file)
@@ -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)));
+
+    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;
       else if (player->MovDir == MV_RIGHT)
        graphic = GFX_MURPHY_ANY_RIGHT;
-      else if (last_dir == MV_LEFT)
+      else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_LEFT)
        graphic = GFX_MURPHY_ANY_LEFT;
-      else if (last_dir == MV_RIGHT)
+      else if (player->MovDir & (MV_UP | MV_DOWN) && last_dir == MV_RIGHT)
        graphic = GFX_MURPHY_ANY_RIGHT;
-      else
-       graphic = GFX_SP_MURPHY;
+
+      graphic -= getGraphicAnimationPhase(2, 4, ANIM_NORMAL);
     }
 
     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
   {
@@ -636,12 +612,23 @@ void DrawPlayer(struct PlayerInfo *player)
 
       if (element == EL_FELSBROCKEN && 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;
+      }
+      else if (element == EL_SP_ZONK && sxx)
+      {
+       int phase = (player->GfxPos / (TILEX / 4));
+
+       graphic = GFX2_SP_ZONK;
 
        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 +863,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,9 +1237,29 @@ 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_SP_ZONK)
+    {
+      /*
+      graphic = GFX2_SP_ZONK + phase2 * 2;
+      */
+
+      /*
+      printf("-> %d\n", phase4);
+      */
+
+      graphic = GFX2_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 ||