+/*
+ checkDiagonalPushing()
+ -----------------------------------------------------------------------------
+ check if diagonal input device direction results in pushing of object
+ (by checking if the alternative direction is walkable, diggable, ...)
+*/
+
+static boolean checkDiagonalPushing(struct PlayerInfo *player,
+ int x, int y, int real_dx, int real_dy)
+{
+ int jx = player->jx, jy = player->jy;
+ int dx = x - jx, dy = y - jy;
+
+ if (real_dx && real_dy) /* diagonal direction input => do check */
+ {
+ /* diagonal direction: check alternative direction */
+ 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 0
+ if (IS_HISTORIC_SOLID(element) !=
+ (!(IS_WALKABLE(element) ||
+ IS_DIGGABLE(element) ||
+ IS_COLLECTIBLE(element))))
+ printf("::: %d ['%s'] [%d, %d]\n",
+ element,
+ element_info[element].token_name,
+ game.engine_version, tape.engine_version);
+#endif
+
+ 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 */
+}
+
+/*
+ DigField()
+ -----------------------------------------------------------------------------
+ x, y: field next to player (non-diagonal) to try to dig to
+ real_dx, real_dy: direction as read from input device (can be diagonal)
+*/
+