(condition)))
#define ELEMENT_CAN_ENTER_FIELD(e, x, y) \
- ELEMENT_CAN_ENTER_FIELD_GENERIC(e, x, y, 1)
+ ELEMENT_CAN_ENTER_FIELD_GENERIC(e, x, y, 0)
#define ELEMENT_CAN_ENTER_FIELD_OR_ACID(e, x, y) \
ELEMENT_CAN_ENTER_FIELD_GENERIC(e, x, y, (Feld[x][y] == EL_ACID))
{
if (element_info[element].move_direction_initial != MV_NO_MOVING)
MovDir[x][y] = element_info[element].move_direction_initial;
- else if (element_info[element].move_pattern == MV_ALL_DIRECTIONS)
+ else if (element_info[element].move_pattern == MV_ALL_DIRECTIONS ||
+ element_info[element].move_pattern == MV_TURNING_LEFT ||
+ element_info[element].move_pattern == MV_TURNING_RIGHT)
MovDir[x][y] = 1 << RND(4);
else if (element_info[element].move_pattern == MV_HORIZONTAL)
MovDir[x][y] = (RND(2) ? MV_LEFT : MV_RIGHT);
}
}
}
- else if (element_info[element].move_pattern == MV_ALL_DIRECTIONS)
+ else if (element_info[element].move_pattern == MV_ALL_DIRECTIONS ||
+ element_info[element].move_pattern == MV_TURNING_LEFT ||
+ element_info[element].move_pattern == MV_TURNING_RIGHT)
{
boolean can_turn_left = ELEMENT_CAN_ENTER_FIELD(element, left_x, left_y);
boolean can_turn_right = ELEMENT_CAN_ENTER_FIELD(element, right_x,right_y);
- if (can_turn_left && can_turn_right)
+ if (element_info[element].move_pattern == MV_TURNING_LEFT)
+ MovDir[x][y] = left_dir;
+ else if (element_info[element].move_pattern == MV_TURNING_RIGHT)
+ MovDir[x][y] = right_dir;
+ else if (can_turn_left && can_turn_right)
MovDir[x][y] = (RND(3) ? (RND(2) ? left_dir : right_dir) : back_dir);
else if (can_turn_left)
MovDir[x][y] = (RND(2) ? left_dir : back_dir);
JustStopped[x][y])
#endif
{
- /*
- printf("::: %d\n", MovDir[x][y]);
- */
+ /* calling "Impact()" here is not only completely unneccessary
+ (because it already gets called from "ContinueMoving()" in
+ all relevant situations), but also completely bullshit, because
+ "JustStopped" also indicates a finished *horizontal* movement;
+ we must keep this trash for backwards compatibility with older
+ tapes */
Impact(x, y);
}
}
}
- /* not "else if" because of EL_SPRING */
+ /* not "else if" because of elements that can fall and move (EL_SPRING) */
if (CAN_MOVE(element) && !started_moving)
{
int newx, newy;
if (element != EL_YAMYAM &&
element != EL_DARK_YAMYAM &&
element != EL_PACMAN &&
- !(element_info[element].move_pattern & MV_ANY_DIRECTION))
+ !(element_info[element].move_pattern & MV_ANY_DIRECTION) &&
+ element_info[element].move_pattern != MV_TURNING_LEFT &&
+ element_info[element].move_pattern != MV_TURNING_RIGHT)
{
TurnRound(x, y);
#if 1
#if 0
+ /* 2.1.1 (does not work correctly for spring) */
if (!CAN_MOVE(element))
MovDir[newx][newy] = 0;
#else
#if 0
+ /* (does not work for falling objects that slide horizontally) */
if (CAN_FALL(element) && MovDir[newx][newy] == MV_DOWN)
MovDir[newx][newy] = 0;
#else
+ /*
if (!CAN_MOVE(element) ||
(element == EL_SPRING && MovDir[newx][newy] == MV_DOWN))
MovDir[newx][newy] = 0;
+ */
+
+ if (!CAN_MOVE(element) ||
+ (CAN_FALL(element) && MovDir[newx][newy] == MV_DOWN))
+ MovDir[newx][newy] = 0;
#endif
#endif