+ if (IS_TUBE(Feld[jx][jy]))
+ {
+ int i = 0;
+ int tube_leave_directions[][2] =
+ {
+ { EL_TUBE_CROSS, MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN },
+ { EL_TUBE_VERTICAL, MV_UP | MV_DOWN },
+ { EL_TUBE_HORIZONTAL, MV_LEFT | MV_RIGHT },
+ { EL_TUBE_VERT_LEFT, MV_LEFT | MV_UP | MV_DOWN },
+ { EL_TUBE_VERT_RIGHT, MV_RIGHT | MV_UP | MV_DOWN },
+ { EL_TUBE_HORIZ_UP, MV_LEFT | MV_RIGHT | MV_UP },
+ { EL_TUBE_HORIZ_DOWN, MV_LEFT | MV_RIGHT | MV_DOWN },
+ { EL_TUBE_LEFT_UP, MV_LEFT | MV_UP },
+ { EL_TUBE_LEFT_DOWN, MV_LEFT | MV_DOWN },
+ { EL_TUBE_RIGHT_UP, MV_RIGHT | MV_UP },
+ { EL_TUBE_RIGHT_DOWN, MV_RIGHT | MV_DOWN },
+ { -1, MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN }
+ };
+
+ while (tube_leave_directions[i][0] != Feld[jx][jy])
+ {
+ i++;
+ if (tube_leave_directions[i][0] == -1) /* should not happen */
+ break;
+ }
+
+ if (!(tube_leave_directions[i][1] & move_direction))
+ return MF_NO_ACTION; /* tube has no opening in this direction */
+ }
+