rnd-20041129-3-src
authorHolger Schemel <info@artsoft.org>
Mon, 29 Nov 2004 17:05:46 +0000 (18:05 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:48:30 +0000 (10:48 +0200)
src/conftime.h
src/game_em/graphics.c
src/init.c
src/tools.c

index 8415f4ba7ea7f3c16a8adc29fa541cede1c6e36a..95d114b26fa81b2d60cb44d78b6ad65a7aee6e96 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2004-11-29 13:13]"
+#define COMPILE_DATE_STRING "[2004-11-29 18:02]"
index bdb40a02f722216fc250130c90b85ac126d61d82..bc8092e4524c4f0b666ab8828115cbee57a4e3fa 100644 (file)
@@ -67,6 +67,145 @@ void blitscreen(void)
   }
 }
 
+static void DrawLevelField_EM(int x, int y, int sx, int sy,
+                             boolean draw_masked)
+{
+  int tile = Draw[y][x];
+  struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
+  int src_x = g->src_x + g->src_offset_x;
+  int src_y = g->src_y + g->src_offset_y;
+  int dst_x = sx * TILEX + g->dst_offset_x;
+  int dst_y = sy * TILEY + g->dst_offset_y;
+
+  if (draw_masked)
+  {
+    if (g->width > 0 && g->height > 0)
+    {
+      SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
+                   dst_x - src_x, dst_y - src_y);
+      BlitBitmapMasked(g->bitmap, screenBitmap,
+                      src_x, src_y, g->width, g->height, dst_x, dst_y);
+    }
+  }
+  else
+  {
+    if (g->width != TILEX || g->height != TILEY)
+      ClearRectangle(screenBitmap, sx * TILEX, sy * TILEY, TILEX, TILEY);
+
+    if (g->width > 0 && g->height > 0)
+      BlitBitmap(g->bitmap, screenBitmap,
+                src_x, src_y, g->width, g->height, dst_x, dst_y);
+  }
+}
+
+static void DrawLevelFieldCrumbled_EM(int x, int y, int sx, int sy,
+                                     int crm, boolean draw_masked)
+{
+  int tile = Draw[y][x];
+  struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
+  unsigned int i;
+
+  if (crm == 0)                /* no crumbled edges for this tile */
+    return;
+
+  for (i = 0; i < 4; i++)
+  {
+    if (crm & (1 << i))
+    {
+      int width, height, cx, cy;
+
+      if (i == 1 || i == 2)
+      {
+       width = g->crumbled_border_size;
+       height = TILEY;
+       cx = (i == 2 ? TILEX - g->crumbled_border_size : 0);
+       cy = 0;
+      }
+      else
+      {
+       width = TILEX;
+       height = g->crumbled_border_size;
+       cx = 0;
+       cy = (i == 3 ? TILEY - g->crumbled_border_size : 0);
+      }
+
+      if (width > 0 && height > 0)
+      {
+       int src_x = g->crumbled_src_x + cx;
+       int src_y = g->crumbled_src_y + cy;
+       int dst_x = sx * TILEX + cx;
+       int dst_y = sy * TILEY + cy;
+
+       if (draw_masked)
+       {
+         SetClipOrigin(g->crumbled_bitmap, g->crumbled_bitmap->stored_clip_gc,
+                       dst_x - src_x, dst_y - src_y);
+         BlitBitmapMasked(g->crumbled_bitmap, screenBitmap,
+                          src_x, src_y, width, height, dst_x, dst_y);
+       }
+       else
+         BlitBitmap(g->crumbled_bitmap, screenBitmap,
+                    src_x, src_y, width, height, dst_x, dst_y);
+      }
+    }
+  }
+}
+
+static void DrawLevelPlayer_EM(int x1, int y1, int player_nr, int anim,
+                              boolean draw_masked)
+{
+  struct GraphicInfo_EM *g = &graphic_info_em_player[player_nr][anim][frame];
+
+  int src_x = g->src_x, src_y = g->src_y;
+  int dst_x, dst_y;
+
+  if (draw_masked)
+  {
+    /* draw the player to current location */
+    dst_x = x1;
+    dst_y = y1;
+    SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
+                 dst_x - src_x, dst_y - src_y);
+    BlitBitmapMasked(g->bitmap, screenBitmap,
+                    src_x, src_y, TILEX, TILEY, dst_x, dst_y);
+
+    /* draw the player to opposite wrap-around column */
+    dst_x = x1 - MAX_BUF_XSIZE * TILEX;
+    dst_y = y1;
+    SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
+                 dst_x - src_x, dst_y - src_y);
+    BlitBitmapMasked(g->bitmap, screenBitmap,
+                    g->src_x, g->src_y, TILEX, TILEY, dst_x, dst_y);
+
+    /* draw the player to opposite wrap-around row */
+    dst_x = x1;
+    dst_y = y1 - MAX_BUF_YSIZE * TILEY;
+    SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
+                 dst_x - src_x, dst_y - src_y);
+    BlitBitmapMasked(g->bitmap, screenBitmap,
+                    g->src_x, g->src_y, TILEX, TILEY, dst_x, dst_y);
+  }
+  else
+  {
+    /* draw the player to current location */
+    dst_x = x1;
+    dst_y = y1;
+    BlitBitmap(g->bitmap, screenBitmap,
+              g->src_x, g->src_y, TILEX, TILEY, dst_x, dst_y);
+
+    /* draw the player to opposite wrap-around column */
+    dst_x = x1 - MAX_BUF_XSIZE * TILEX;
+    dst_y = y1;
+    BlitBitmap(g->bitmap, screenBitmap,
+              g->src_x, g->src_y, TILEX, TILEY, dst_x, dst_y);
+
+    /* draw the player to opposite wrap-around row */
+    dst_x = x1;
+    dst_y = y1 - MAX_BUF_YSIZE * TILEY;
+    BlitBitmap(g->bitmap, screenBitmap,
+              g->src_x, g->src_y, TILEX, TILEY, dst_x, dst_y);
+  }
+}
 
 /* draw differences between game tiles and screen tiles
  *
@@ -92,16 +231,13 @@ static void animscreen(void)
   {
     for (x = left; x < left + MAX_BUF_XSIZE; x++)
     {
-      int dx = x % MAX_BUF_XSIZE;
-      int dy = y % MAX_BUF_YSIZE;    
+      int sx = x % MAX_BUF_XSIZE;
+      int sy = y % MAX_BUF_YSIZE;    
       int tile = Draw[y][x];
       struct GraphicInfo_EM *g = &graphic_info_em_object[tile][frame];
-      unsigned int obj;
+      unsigned int obj = g->unique_identifier;
       unsigned int crm = 0;
 
-#if 1
-
-#if 1
       /* re-calculate crumbled state of this tile */
       if (g->has_crumbled_graphics)
       {
@@ -121,151 +257,15 @@ static void animscreen(void)
            crm |= (1 << i);
        }
       }
-#else
-      /* re-calculate crumbled state of this tile */
-      if (tile == Xgrass ||
-         tile == Xdirt ||
-         tile == Xfake_grass ||
-         tile == Xfake_grassB)
-      {
-       for (i = 0; i < 4; i++)
-       {
-         int xx = x + xy[i][0];
-         int yy = y + xy[i][1];
-         int tile2;
-
-         if (xx < 0 || xx >= EM_MAX_CAVE_WIDTH ||
-             yy < 0 || yy >= EM_MAX_CAVE_HEIGHT)
-           continue;
-
-         tile2 = Draw[yy][xx];
-
-         if (tile2 == Xgrass ||
-             tile2 == Xdirt ||
-             tile2 == Xfake_grass ||
-             tile2 == Xfake_grassB ||
-             tile2 == Ygrass_nB ||
-             tile2 == Ygrass_eB ||
-             tile2 == Ygrass_sB ||
-             tile2 == Ygrass_wB ||
-             tile2 == Ydirt_nB ||
-             tile2 == Ydirt_eB ||
-             tile2 == Ydirt_sB ||
-             tile2 == Ydirt_wB)
-           continue;
-
-         crm |= (1 << i);
-       }
-      }
-#endif
-
-      /* create unique graphic identifier to decide if tile must be redrawn */
-      obj = g->unique_identifier;
 
-      if (screentiles[dy][dx] != obj || crumbled_state[dy][dx] != crm)
+      if (screentiles[sy][sx] != obj || crumbled_state[sy][sx] != crm)
       {
-       int dst_x = dx * TILEX;
-       int dst_y = dy * TILEY;
-
-       if (g->width != TILEX || g->height != TILEY)
-         ClearRectangle(screenBitmap, dst_x, dst_y, TILEX, TILEY);
-
-       if (g->width > 0 && g->height > 0)
-         BlitBitmap(g->bitmap, screenBitmap,
-                    g->src_x + g->src_offset_x, g->src_y + g->src_offset_y,
-                    g->width, g->height,
-                    dst_x + g->dst_offset_x, dst_y + g->dst_offset_y);
-
-#if 1
-       /* add crumbling graphic, if needed */
-       if (crm)
-       {
-         for (i = 0; i < 4; i++)
-         {
-           if (crm & (1 << i))
-           {
-             int width, height, cx, cy;
-
-             if (i == 1 || i == 2)
-             {
-               width = g->crumbled_border_size;
-               height = TILEY;
-               cx = (i == 2 ? TILEX - g->crumbled_border_size : 0);
-               cy = 0;
-             }
-             else
-             {
-               width = TILEX;
-               height = g->crumbled_border_size;
-               cx = 0;
-               cy = (i == 3 ? TILEY - g->crumbled_border_size : 0);
-             }
-
-             if (width > 0 && height > 0)
-               BlitBitmap(g->crumbled_bitmap, screenBitmap,
-                          g->crumbled_src_x + cx, g->crumbled_src_y + cy,
-                          width, height, dst_x + cx, dst_y + cy);
-           }
-         }
-       }
-#else
-       /* add crumbling graphic, if needed */
-       if (crm)
-       {
-         int crumbled_border_size;
-
-         tile = (tile == Xgrass ? Ygrass_crumbled :
-                 tile == Xdirt ? Ydirt_crumbled :
-                 tile == Xfake_grass ? Yfake_grass_crumbled :
-                 tile == Xfake_grassB ? Yfake_grassB_crumbled : 0);
-         g = &graphic_info_em_object[tile][frame];
-         crumbled_border_size = g->border_size;
-
-         for (i = 0; i < 4; i++)
-         {
-           if (crm & (1 << i))
-           {
-             int width, height, cx, cy;
-
-             if (i == 1 || i == 2)
-             {
-               width = crumbled_border_size;
-               height = TILEY;
-               cx = (i == 2 ? TILEX - crumbled_border_size : 0);
-               cy = 0;
-             }
-             else
-             {
-               width = TILEX;
-               height = crumbled_border_size;
-               cx = 0;
-               cy = (i == 3 ? TILEY - crumbled_border_size : 0);
-             }
-
-             if (width > 0 && height > 0)
-               BlitBitmap(g->bitmap, screenBitmap,
-                          g->src_x + cx, g->src_y + cy, width, height,
-                          dst_x + cx, dst_y + cy);
-           }
-         }
-       }
-#endif
+       DrawLevelField_EM(x, y, sx, sy, FALSE);
+       DrawLevelFieldCrumbled_EM(x, y, sx, sy, crm, FALSE);
 
-       screentiles[dy][dx] = obj;
-       crumbled_state[dy][dx] = crm;
+       screentiles[sy][sx] = obj;
+       crumbled_state[sy][sx] = crm;
       }
-#else
-      obj = map_obj[frame][tile];
-
-      if (screentiles[dy][dx] != obj)
-      {
-       BlitBitmap(objBitmap, screenBitmap,
-                  (obj / 512) * TILEX, (obj % 512) * TILEY / 16,
-                  TILEX, TILEY, dx * TILEX, dy * TILEY);
-
-       screentiles[dy][dx] = obj;
-      }
-#endif
     }
   }
 }
@@ -278,27 +278,11 @@ static void animscreen(void)
 
 static void blitplayer(struct PLAYER *ply)
 {
-  int dx, dy;
-  int old_x, old_y, new_x, new_y;
-  int src_x, src_y, dst_x, dst_y;
   unsigned int x1, y1, x2, y2;
-#if 1
-  unsigned short spr;
-#else
-  unsigned short obj, spr;
-#endif
 
   if (!ply->alive)
     return;
 
-  /* some casts to "int" are needed because of negative calculation values */
-  dx = (int)ply->x - (int)ply->oldx;
-  dy = (int)ply->y - (int)ply->oldy;
-  old_x = (int)ply->oldx + (7 - (int)frame) * dx / 8;
-  old_y = (int)ply->oldy + (7 - (int)frame) * dy / 8;
-  new_x = old_x + SIGN(dx);
-  new_y = old_y + SIGN(dy);
-
   /* x1/y1 are left/top and x2/y2 are right/down part of the player movement */
   x1 = (frame * ply->oldx + (8 - frame) * ply->x) * TILEX / 8;
   y1 = (frame * ply->oldy + (8 - frame) * ply->y) * TILEY / 8;
@@ -308,165 +292,56 @@ static void blitplayer(struct PLAYER *ply)
   if ((unsigned int)(x2 - screen_x) < ((MAX_BUF_XSIZE - 1) * TILEX - 1) &&
       (unsigned int)(y2 - screen_y) < ((MAX_BUF_YSIZE - 1) * TILEY - 1))
   {
-    struct GraphicInfo_EM *g;
-    int tile;
+    /* some casts to "int" are needed because of negative calculation values */
+    int dx = (int)ply->x - (int)ply->oldx;
+    int dy = (int)ply->y - (int)ply->oldy;
+    int old_x = (int)ply->oldx + (7 - (int)frame) * dx / 8;
+    int old_y = (int)ply->oldy + (7 - (int)frame) * dy / 8;
+    int new_x = old_x + SIGN(dx);
+    int new_y = old_y + SIGN(dy);
+    int old_sx = old_x % MAX_BUF_XSIZE;
+    int old_sy = old_y % MAX_BUF_XSIZE;
+    int new_sx = new_x % MAX_BUF_XSIZE;
+    int new_sy = new_y % MAX_BUF_XSIZE;
+    int old_crm = crumbled_state[old_sy][old_sx];
+    int new_crm = crumbled_state[new_sy][new_sx];
+
+    /* only diggable elements can be crumbled in the classic EM engine */
+    boolean player_is_digging = (crumbled_state[new_sy][new_sx] != 0);
 
-    spr = map_spr[ply->num][frame][ply->anim];
     x1 %= MAX_BUF_XSIZE * TILEX;
     y1 %= MAX_BUF_YSIZE * TILEY;
     x2 %= MAX_BUF_XSIZE * TILEX;
     y2 %= MAX_BUF_YSIZE * TILEY;
 
-#if 1
-
-#if 1
-    g = &graphic_info_em_player[ply->num][ply->anim][frame];
-
-    /* draw the player to current location */
-    BlitBitmap(g->bitmap, screenBitmap,
-              g->src_x, g->src_y, TILEX, TILEY,
-              x1, y1);
-
-    /* draw the player to opposite wrap-around column */
-    BlitBitmap(g->bitmap, screenBitmap,
-              g->src_x, g->src_y, TILEX, TILEY,
-              x1 - MAX_BUF_XSIZE * TILEX, y1);
-
-    /* draw the player to opposite wrap-around row */
-    BlitBitmap(g->bitmap, screenBitmap,
-              g->src_x, g->src_y, TILEX, TILEY,
-              x1, y1 - MAX_BUF_YSIZE * TILEY);
-#else
-    /* draw the player to current location */
-    BlitBitmap(sprBitmap, screenBitmap,
-              (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY,
-              x1, y1);
-
-    /* draw the player to opposite wrap-around column */
-    BlitBitmap(sprBitmap, screenBitmap,
-              (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY,
-              x1 - MAX_BUF_XSIZE * TILEX, y1);
-
-    /* draw the player to opposite wrap-around row */
-    BlitBitmap(sprBitmap, screenBitmap,
-              (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY,
-              x1, y1 - MAX_BUF_YSIZE * TILEY);
-#endif
-
-    /* draw the field the player is moving from (masked over the player) */
-#if 0
-    obj = screentiles[y1 / TILEY][x1 / TILEX];
-    src_x = (obj / 512) * TILEX;
-    src_y = (obj % 512) * TILEY / 16;
-    dst_x = (x1 / TILEX) * TILEX;
-    dst_y = (y1 / TILEY) * TILEY;
-#endif
-
-#if 1
-    tile = Draw[old_y][old_x];
-    g = &graphic_info_em_object[tile][frame];
-
-    if (g->width > 0 && g->height > 0)
-    {
-      src_x = g->src_x + g->src_offset_x;
-      src_y = g->src_y + g->src_offset_y;
-      dst_x = old_x % MAX_BUF_XSIZE * TILEX + g->dst_offset_x;
-      dst_y = old_y % MAX_BUF_YSIZE * TILEY + g->dst_offset_y;
-
-      SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
-                   dst_x - src_x, dst_y - src_y);
-      BlitBitmapMasked(g->bitmap, screenBitmap,
-                      src_x, src_y, g->width, g->height, dst_x, dst_y);
-    }
-#else
-    SetClipOrigin(objBitmap, objBitmap->stored_clip_gc,
-                 dst_x - src_x, dst_y - src_y);
-    BlitBitmapMasked(objBitmap, screenBitmap,
-                    src_x, src_y, TILEX, TILEY, dst_x, dst_y);
-#endif
-
-    /* draw the field the player is moving to (masked over the player) */
-#if 0
-    obj = screentiles[y2 / TILEY][x2 / TILEX];
-    src_x = (obj / 512) * TILEX;
-    src_y = (obj % 512) * TILEY / 16;
-    dst_x = (x2 / TILEX) * TILEX;
-    dst_y = (y2 / TILEY) * TILEY;
-#endif
-
-#if 1
-    tile = Draw[new_y][new_x];
-    g = &graphic_info_em_object[tile][frame];
-
-    if (g->width > 0 && g->height > 0)
+    if (player_is_digging)
     {
-      src_x = g->src_x + g->src_offset_x;
-      src_y = g->src_y + g->src_offset_y;
-      dst_x = new_x % MAX_BUF_XSIZE * TILEX + g->dst_offset_x;
-      dst_y = new_y % MAX_BUF_YSIZE * TILEY + g->dst_offset_y;
-
-      SetClipOrigin(g->bitmap, g->bitmap->stored_clip_gc,
-                   dst_x - src_x, dst_y - src_y);
-      BlitBitmapMasked(g->bitmap, screenBitmap,
-                      src_x, src_y, g->width, g->height, dst_x, dst_y);
-    }
-#else
-    SetClipOrigin(objBitmap, objBitmap->stored_clip_gc,
-                 dst_x - src_x, dst_y - src_y);
-    BlitBitmapMasked(objBitmap, screenBitmap,
-                    src_x, src_y, TILEX, TILEY, dst_x, dst_y);
-#endif
+      /* draw the field the player is moving from (under the player) */
+      DrawLevelField_EM(old_x, old_y, old_sx, old_sy, FALSE);
+      DrawLevelFieldCrumbled_EM(old_x, old_y, old_sx, old_sy, old_crm, FALSE);
 
-#else
+      /* draw the field the player is moving to (under the player) */
+      DrawLevelField_EM(new_x, new_y, new_sx, new_sy, FALSE);
+      DrawLevelFieldCrumbled_EM(new_x, new_y, new_sx, new_sy, new_crm, FALSE);
 
-    if (objmaskBitmap)
-    {
-      obj = screentiles[y1 / TILEY][x1 / TILEX];
-      XCopyArea(display, objmaskBitmap, spriteBitmap, spriteGC,
-               (obj / 512) * TILEX, (obj % 512) * TILEY / 16, TILEX, TILEY,
-               -(x1 % TILEX), -(y1 % TILEY));
-
-      obj = screentiles[y2 / TILEY][x2 / TILEX];
-      XCopyArea(display, objmaskBitmap, spriteBitmap, spriteGC,
-               (obj / 512) * TILEX, (obj % 512) * TILEY / 16, TILEX, TILEY,
-               (MAX_BUF_XSIZE * TILEX - x1) % TILEX,
-               (MAX_BUF_YSIZE * TILEY - y1) % TILEY);
-    }
-    else if (sprmaskBitmap)
-    {
-      XCopyArea(display, sprmaskBitmap, spriteBitmap, spriteGC,
-               (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY, 0, 0);
+      /* draw the player (masked) over the element he is just digging away */
+      DrawLevelPlayer_EM(x1, y1, ply->num, ply->anim, TRUE);
     }
     else
     {
-      XFillRectangle(display, spriteBitmap, spriteGC, 0, 0, TILEX, TILEY);
-    }
+      /* draw the player under the element which is on the same field */
+      DrawLevelPlayer_EM(x1, y1, ply->num, ply->anim, FALSE);
 
-    SetClipMask(sprBitmap, sprBitmap->stored_clip_gc, spriteBitmap);
+      /* draw the field the player is moving from (masked over the player) */
+      DrawLevelField_EM(old_x, old_y, old_sx, old_sy, TRUE);
 
-    SetClipOrigin(sprBitmap, sprBitmap->stored_clip_gc, x, y);
-    BlitBitmapMasked(sprBitmap, screenBitmap,
-                    (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY,
-                    x1, y1);
-
-    SetClipOrigin(sprBitmap, sprBitmap->stored_clip_gc,
-                 x - MAX_BUF_XSIZE * TILEX, y);
-    BlitBitmapMasked(sprBitmap, screenBitmap,
-                    (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY,
-                    x1 - MAX_BUF_XSIZE * TILEX, y1);
-
-    SetClipOrigin(sprBitmap, sprBitmap->stored_clip_gc,
-                 x1, y1 - MAX_BUF_YSIZE * TILEY);
-    BlitBitmapMasked(sprBitmap, screenBitmap,
-                    (spr / 8) * TILEX, (spr % 8) * TILEY, TILEX, TILEY,
-                    x1, y1 - MAX_BUF_YSIZE * TILEY);
-
-    SetClipMask(sprBitmap, sprBitmap->stored_clip_gc, None);
-#endif
+      /* draw the field the player is moving to (masked over the player) */
+      DrawLevelField_EM(new_x, new_y, new_sx, new_sy, TRUE);
+    }
 
     /* mark screen tiles as dirty */
-    screentiles[y1 / TILEY][x1 / TILEX] = -1;
-    screentiles[y2 / TILEY][x2 / TILEX] = -1;
+    screentiles[old_sy][old_sx] = -1;
+    screentiles[new_sy][new_sx] = -1;
   }
 }
 
index 26be1fcdaefd587020b51058cb9bbb45274d71ea..e07ea102e26ee56ab13af0f8f23aa7edd36a7c28 100644 (file)
@@ -806,40 +806,51 @@ void InitElementGraphicInfo()
 
       for (dir = 0; dir < NUM_DIRECTIONS; dir++)
       {
+       /* use action graphic as the default direction graphic, if undefined */
        int default_action_direction_graphic = element_info[i].graphic[act];
        int default_action_direction_crumbled = element_info[i].crumbled[act];
 
        /* no graphic for current action -- use default direction graphic */
-       /* !!! maybe it's better to use default _action_ graphic here !!! */
        if (default_action_direction_graphic == -1)
          default_action_direction_graphic =
            (act_remove ? default_remove_graphic :
             act_turning ?
             element_info[i].direction_graphic[ACTION_TURNING][dir] :
+            default_action_graphic != default_graphic ?
+            default_action_graphic :
             default_direction_graphic[dir]);
+
+       if (element_info[i].direction_graphic[act][dir] == -1)
+         element_info[i].direction_graphic[act][dir] =
+           default_action_direction_graphic;
+
 #if 1
        if (default_action_direction_crumbled == -1)
-         default_action_direction_crumbled = default_action_direction_graphic;
+         default_action_direction_crumbled =
+           element_info[i].direction_graphic[act][dir];
 #else
        if (default_action_direction_crumbled == -1)
          default_action_direction_crumbled =
            (act_remove ? default_remove_graphic :
             act_turning ?
             element_info[i].direction_crumbled[ACTION_TURNING][dir] :
+            default_action_crumbled != default_crumbled ?
+            default_action_crumbled :
             default_direction_crumbled[dir]);
 #endif
 
-       if (element_info[i].direction_graphic[act][dir] == -1)
-         element_info[i].direction_graphic[act][dir] =
-           default_action_direction_graphic;
-#if 1
-       if (element_info[i].direction_crumbled[act][dir] == -1)
-         element_info[i].direction_crumbled[act][dir] =
-           element_info[i].direction_graphic[act][dir];
-#else
        if (element_info[i].direction_crumbled[act][dir] == -1)
          element_info[i].direction_crumbled[act][dir] =
            default_action_direction_crumbled;
+
+#if 0
+       if (i == EL_EMC_GRASS &&
+           act == ACTION_DIGGING &&
+           dir == MV_BIT_DOWN)
+         printf("::: direction_crumbled == %d, %d, %d\n",
+                element_info[i].direction_crumbled[act][dir],
+                default_action_direction_crumbled,
+                element_info[i].crumbled[act]);
 #endif
       }
 
index 51ed27939397bced7e7dca0a97b0aa2def554cab..bd1ded0c740635fdf3400c55eb272d7c32c3418b 100644 (file)
@@ -5495,7 +5495,7 @@ int get_next_element(int element)
   }
 }
 
-#if 1
+#if 0
 int el_act_dir2img(int element, int action, int direction)
 {
   element = GFX_ELEMENT(element);
@@ -5513,11 +5513,12 @@ int el_act_dir2img(int element, int action, int direction)
   element = GFX_ELEMENT(element);
   direction = MV_DIR_BIT(direction);   /* default: MV_NO_MOVING => MV_DOWN */
 
+  /* direction_graphic[][] == graphic[] for undefined direction graphics */
   return element_info[element].direction_graphic[action][direction];
 }
 #endif
 
-#if 1
+#if 0
 static int el_act_dir2crm(int element, int action, int direction)
 {
   element = GFX_ELEMENT(element);
@@ -5535,6 +5536,7 @@ static int el_act_dir2crm(int element, int action, int direction)
   element = GFX_ELEMENT(element);
   direction = MV_DIR_BIT(direction);   /* default: MV_NO_MOVING => MV_DOWN */
 
+  /* direction_graphic[][] == graphic[] for undefined direction graphics */
   return element_info[element].direction_crumbled[action][direction];
 }
 #endif
@@ -5754,6 +5756,7 @@ void InitGraphicInfo_EM(void)
                                     direction));
       int base_graphic = el_act2img(effective_element, ACTION_DEFAULT);
       int base_crumbled = el_act2crm(effective_element, ACTION_DEFAULT);
+      boolean has_crumbled_graphics = (base_crumbled != base_graphic);
       struct GraphicInfo *g = &graphic_info[graphic];
       struct GraphicInfo_EM *g_em = &graphic_info_em_object[i][7 - j];
       Bitmap *src_bitmap;
@@ -5891,15 +5894,31 @@ void InitGraphicInfo_EM(void)
       g_em->crumbled_border_size = 0;
 #endif
 
-      if (base_crumbled != base_graphic && crumbled != IMG_EMPTY_SPACE)
+#if 0
+      if (effective_element == EL_EMC_GRASS &&
+         effective_action == ACTION_DIGGING)
+       printf("::: %d\n", crumbled);
+#endif
+
+#if 0
+      if (has_crumbled_graphics && crumbled == IMG_EMPTY_SPACE)
+       printf("::: empty crumbled: %d [%s], %d, %d\n",
+              effective_element, element_info[effective_element].token_name,
+              effective_action, direction);
+#endif
+
+      /* if element can be crumbled, but certain action graphics are just empty
+        space (like snapping sand with the original R'n'D graphics), do not
+        treat these empty space graphics as crumbled graphics in EMC engine */
+      if (has_crumbled_graphics && crumbled != IMG_EMPTY_SPACE)
       {
-       struct GraphicInfo *g_crumbled = &graphic_info[crumbled];
+       getGraphicSource(crumbled, frame, &src_bitmap, &src_x, &src_y);
 
        g_em->has_crumbled_graphics = TRUE;
-       g_em->crumbled_bitmap = g_crumbled->bitmap;
-       g_em->crumbled_src_x = g_crumbled->src_x;
-       g_em->crumbled_src_y = g_crumbled->src_y;
-       g_em->crumbled_border_size = g_crumbled->border_size;
+       g_em->crumbled_bitmap = src_bitmap;
+       g_em->crumbled_src_x = src_x;
+       g_em->crumbled_src_y = src_y;
+       g_em->crumbled_border_size = graphic_info[crumbled].border_size;
       }
 
 #if 1