rnd-20030306-3-src
[rocksndiamonds.git] / src / tools.c
index 2e0cd128aedf43fb2a5c724fddb5a9aeadfb307b..979eead935e254fe9a62febb76a90bb2a6290194 100644 (file)
@@ -542,6 +542,7 @@ void DrawPlayer(struct PlayerInfo *player)
   int graphic;
   int frame = 0;
   boolean player_is_moving = (last_jx != jx || last_jy != jy ? TRUE : FALSE);
+  int current_action = ACTION_DEFAULT;
 
   if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy)))
     return;
@@ -559,6 +560,13 @@ void DrawPlayer(struct PlayerInfo *player)
   if (element == EL_EXPLOSION)
     return;
 
+  current_action = (player->Pushing ? ACTION_PUSHING :
+                   player->is_digging ? ACTION_DIGGING :
+                   player->is_moving ? ACTION_MOVING :
+                   player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
+
+  InitPlayerGfxAnimation(player, current_action, player->MovDir);
+
   /* ----------------------------------------------------------------------- */
   /* draw things in the field the player is leaving, if needed               */
   /* ----------------------------------------------------------------------- */
@@ -607,20 +615,71 @@ void DrawPlayer(struct PlayerInfo *player)
 
   if (Store[jx][jy])
     DrawLevelElement(jx, jy, Store[jx][jy]);
-  else if (!IS_ACTIVE_BOMB(element))
-    DrawLevelField(jx, jy);
-  else
+  else if (IS_ACTIVE_BOMB(element))
     DrawLevelElement(jx, jy, EL_EMPTY);
+  else
+  {
+    if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED)
+    {
+      int old_element = GfxElement[jx][jy];
+      int old_graphic =
+       el_act_dir2img(old_element, ACTION_DIGGING, player->MovDir);
+      int frame = getGraphicAnimationFrame(old_graphic, player->StepFrame);
+
+#if 0
+      Bitmap *src_bitmap;
+      int src_x, src_y;
+      int width = TILEX, height = TILEY;
+      int cx = 0, cy = 0;
+
+      if (player->MovDir == MV_UP)
+      {
+       cy = player->GfxPos;
+       height -= cy;
+      }
+      else if (player->MovDir == MV_DOWN)
+      {
+       cy = 0;
+       height = TILEY - player->GfxPos;
+      }
+      else if (player->MovDir == MV_LEFT)
+      {
+       cx = player->GfxPos;
+       width -= cx;
+      }
+      else if (player->MovDir == MV_RIGHT)
+      {
+       cx = 0;
+       width = TILEX - player->GfxPos;
+      }
+
+      getGraphicSource(old_graphic, frame, &src_bitmap, &src_x, &src_y);
+
+      BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy,
+                width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy);
+#else
+#if 0
+      printf("::: %d, %d, %d, %d => %d, %d [%d, %d, %d]\n",
+            old_element, ACTION_DIGGING, player->MovDir, player->Frame,
+            old_graphic, frame,
+            player->MovPos, player->GfxPos, player->StepFrame);
+#endif
+
+      DrawGraphic(sx, sy, old_graphic, frame);
+#endif
+    }
+    else
+    {
+      GfxElement[jx][jy] = EL_UNDEFINED;
+
+      DrawLevelField(jx, jy);
+    }
+  }
 
   /* ----------------------------------------------------------------------- */
   /* draw player himself                                                     */
   /* ----------------------------------------------------------------------- */
 
-  player->GfxAction = (player->Pushing ? ACTION_PUSHING :
-                      player->is_digging ? ACTION_DIGGING :
-                      player->is_moving ? ACTION_MOVING :
-                      player->snapped ? ACTION_SNAPPING : ACTION_DEFAULT);
-
   if (player->use_murphy_graphic)
   {
     static int last_horizontal_dir = MV_LEFT;
@@ -1045,7 +1104,7 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
     frame = getGraphicAnimationFrame(graphic, -1);
   }
 
-  if (element == EL_WALL_GROWING)
+  if (element == EL_EXPANDABLE_WALL)
   {
     boolean left_stopped = FALSE, right_stopped = FALSE;
 
@@ -1058,17 +1117,17 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
       graphic = IMG_WALL;
     else if (left_stopped)
     {
-      graphic = IMG_WALL_GROWING_ACTIVE_RIGHT;
+      graphic = IMG_EXPANDABLE_WALL_GROWING_RIGHT;
       frame = graphic_info[graphic].anim_frames - 1;
     }
     else if (right_stopped)
     {
-      graphic = IMG_WALL_GROWING_ACTIVE_LEFT;
+      graphic = IMG_EXPANDABLE_WALL_GROWING_LEFT;
       frame = graphic_info[graphic].anim_frames - 1;
     }
   }
 #if 0
-  else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING)
+  else if (IS_AMOEBOID(element) || element == EL_AMOEBA_DROPPING)
   {
     graphic = (element == EL_BD_AMOEBA ? IMG_BD_AMOEBA_PART1 :
               element == EL_AMOEBA_WET ? IMG_AMOEBA_WET_PART1 :
@@ -1081,9 +1140,9 @@ void DrawScreenElementExt(int x, int y, int dx, int dy, int element,
 #endif
 
 #if 0
-  if (IS_AMOEBOID(element) || element == EL_AMOEBA_DRIPPING)
+  if (IS_AMOEBOID(element) || element == EL_AMOEBA_DROPPING)
   {
-    if (Feld[lx][ly] == EL_AMOEBA_DRIPPING)
+    if (Feld[lx][ly] == EL_AMOEBA_DROPPING)
       printf("---> %d -> %d / %d [%d]\n",
             element, graphic, frame, GfxRandom[lx][ly]);
   }
@@ -1161,6 +1220,9 @@ void DrawCrumbledSand(int x, int y)
   element = Feld[lx][ly];
 
   if (element == EL_SAND ||
+#if 1
+      (element == EL_EMPTY_SPACE && GfxElement[lx][ly] == EL_SAND) ||
+#endif
       element == EL_LANDMINE ||
       element == EL_TRAP ||
       element == EL_TRAP_ACTIVE)
@@ -1186,6 +1248,9 @@ void DrawCrumbledSand(int x, int y)
        element = Feld[lxx][lyy];
 
       if (element == EL_SAND ||
+#if 1
+         (element == EL_EMPTY_SPACE && GfxElement[lxx][lyy] == EL_SAND) ||
+#endif
          element == EL_LANDMINE ||
          element == EL_TRAP ||
          element == EL_TRAP_ACTIVE)
@@ -1231,6 +1296,9 @@ void DrawCrumbledSand(int x, int y)
 
       if (!IN_LEV_FIELD(lxx, lyy) ||
          (Feld[lxx][lyy] != EL_SAND &&
+#if 1
+          !(Feld[lxx][lyy] == EL_EMPTY_SPACE && GfxElement[lxx][lyy] == EL_SAND) &&
+#endif
           Feld[lxx][lyy] != EL_LANDMINE &&
           Feld[lxx][lyy] != EL_TRAP &&
           Feld[lxx][lyy] != EL_TRAP_ACTIVE) ||
@@ -1322,7 +1390,7 @@ void DrawScreenField(int x, int y)
     if (element == EL_QUICKSAND_EMPTYING ||
        element == EL_MAGIC_WALL_EMPTYING ||
        element == EL_BD_MAGIC_WALL_EMPTYING ||
-       element == EL_AMOEBA_DRIPPING)
+       element == EL_AMOEBA_DROPPING)
       cut_mode = CUT_ABOVE;
     else if (element == EL_QUICKSAND_FILLING ||
             element == EL_MAGIC_WALL_FILLING ||
@@ -1364,7 +1432,7 @@ void DrawScreenField(int x, int y)
     if (element_old == EL_QUICKSAND_EMPTYING ||
        element_old == EL_MAGIC_WALL_EMPTYING ||
        element_old == EL_BD_MAGIC_WALL_EMPTYING ||
-       element_old == EL_AMOEBA_DRIPPING)
+       element_old == EL_AMOEBA_DROPPING)
       cut_mode = CUT_ABOVE;
 
     DrawScreenElement(x, y, EL_EMPTY);
@@ -2313,7 +2381,7 @@ void CreateToolButtons()
     {
       int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
 
-      getMiniGraphicSource(PLAYER_NR_GFX(IMG_PLAYER1, player_nr),
+      getMiniGraphicSource(PLAYER_NR_GFX(IMG_PLAYER_1, player_nr),
                           &deco_bitmap, &deco_x, &deco_y);
       deco_xpos = (toolbutton_info[i].width - MINI_TILEX) / 2;
       deco_ypos = (toolbutton_info[i].height - MINI_TILEY) / 2;
@@ -2375,7 +2443,7 @@ int get_next_element(int element)
     case EL_MAGIC_WALL_EMPTYING:       return EL_MAGIC_WALL_ACTIVE;
     case EL_BD_MAGIC_WALL_FILLING:     return EL_BD_MAGIC_WALL_FULL;
     case EL_BD_MAGIC_WALL_EMPTYING:    return EL_BD_MAGIC_WALL_ACTIVE;
-    case EL_AMOEBA_DRIPPING:           return EL_AMOEBA_WET;
+    case EL_AMOEBA_DROPPING:           return EL_AMOEBA_WET;
 
     default:                           return element;
   }