+#if 1
+ int jx, jy, dx, dy, xx, yy;
+
+ if (real_dx == 0 || real_dy == 0) /* no diagonal direction => push */
+ return TRUE;
+
+ /* diagonal direction: check alternative direction */
+ jx = player->jx;
+ jy = player->jy;
+ dx = x - jx;
+ dy = y - jy;
+ xx = jx + (dx == 0 ? real_dx : 0);
+ yy = jy + (dy == 0 ? real_dy : 0);
+
+ return (!IN_LEV_FIELD(xx, yy) || IS_SOLID(Feld[xx][yy]));
+#else
+
+ if (real_dx && real_dy) /* diagonal direction input => do check */
+ {
+ /* diagonal direction: check alternative direction */
+ int jx = player->jx, jy = player->jy;
+ int dx = x - jx, dy = y - jy;
+ int xx = jx + (dx == 0 ? real_dx : 0);
+ int yy = jy + (dy == 0 ? real_dy : 0);
+
+ if (IN_LEV_FIELD(xx, yy))
+ {
+ int element = Feld[xx][yy];
+
+ if (game.engine_version < VERSION_IDENT(2,2,0))
+ return IS_HISTORIC_SOLID(element);
+ else
+ return !(IS_WALKABLE(element) ||
+ IS_DIGGABLE(element) ||
+ IS_COLLECTIBLE(element));
+ }
+ }
+
+ return TRUE; /* no diagonal direction input => push object */