+ { 0,-1 },
+ { -1,0 },
+ { +1,0 },
+ { 0,+1 }
+ };
+
+ for(i=0;i<4;i++)
+ {
+ int ex = x + xy[i%4][0];
+ int ey = y + xy[i%4][1];
+
+ if (IN_LEV_FIELD(ex,ey) && Feld[ex][ey] == EL_AUSGANG_AUF)
+ {
+ attr_x = ex;
+ attr_y = ey;
+ break;
+ }
+ }
+ }
+
+ MovDir[x][y] = MV_NO_MOVING;
+ if (attr_x<x)
+ MovDir[x][y] |= (AllPlayersGone ? MV_RIGHT : MV_LEFT);
+ else if (attr_x>x)
+ MovDir[x][y] |= (AllPlayersGone ? MV_LEFT : MV_RIGHT);
+ if (attr_y<y)
+ MovDir[x][y] |= (AllPlayersGone ? MV_DOWN : MV_UP);
+ else if (attr_y>y)
+ MovDir[x][y] |= (AllPlayersGone ? MV_UP : MV_DOWN);
+
+ if (element==EL_ROBOT)
+ {
+ int newx, newy;
+
+ if ((MovDir[x][y]&(MV_LEFT|MV_RIGHT)) && (MovDir[x][y]&(MV_UP|MV_DOWN)))
+ MovDir[x][y] &= (RND(2) ? (MV_LEFT|MV_RIGHT) : (MV_UP|MV_DOWN));
+ Moving2Blocked(x,y,&newx,&newy);
+
+ if (IN_LEV_FIELD(newx,newy) && IS_FREE_OR_PLAYER(newx,newy))
+ MovDelay[x][y] = 8+8*!RND(3);
+ else
+ MovDelay[x][y] = 16;
+ }
+ else
+ {
+ int newx, newy;
+
+ MovDelay[x][y] = 1;
+
+ if ((MovDir[x][y]&(MV_LEFT|MV_RIGHT)) && (MovDir[x][y]&(MV_UP|MV_DOWN)))
+ {
+ boolean first_horiz = RND(2);
+ int new_move_dir = MovDir[x][y];
+
+ MovDir[x][y] =
+ new_move_dir & (first_horiz ? (MV_LEFT|MV_RIGHT) : (MV_UP|MV_DOWN));
+ Moving2Blocked(x,y,&newx,&newy);
+
+ if (IN_LEV_FIELD(newx,newy) &&
+ (IS_FREE(newx,newy) ||
+ Feld[newx][newy] == EL_SALZSAEURE ||
+ ((element == EL_MAULWURF || element==EL_PINGUIN) &&
+ (Feld[newx][newy] == EL_AUSGANG_AUF ||
+ IS_MAMPF3(Feld[newx][newy])))))
+ return;
+
+ MovDir[x][y] =
+ new_move_dir & (!first_horiz ? (MV_LEFT|MV_RIGHT) : (MV_UP|MV_DOWN));
+ Moving2Blocked(x,y,&newx,&newy);
+
+ if (IN_LEV_FIELD(newx,newy) &&
+ (IS_FREE(newx,newy) ||
+ Feld[newx][newy] == EL_SALZSAEURE ||
+ ((element == EL_MAULWURF || element==EL_PINGUIN) &&
+ (Feld[newx][newy] == EL_AUSGANG_AUF ||
+ IS_MAMPF3(Feld[newx][newy])))))
+ return;
+
+ MovDir[x][y] = old_move_dir;
+ return;
+ }
+ }
+ }
+}
+
+static boolean JustBeingPushed(int x, int y)
+{
+ int i;
+
+ for(i=0; i<MAX_PLAYERS; i++)
+ {
+ struct PlayerInfo *player = &stored_player[i];
+
+ if (player->active && !player->gone &&
+ player->Pushing && player->MovPos)
+ {
+ int next_jx = player->jx + (player->jx - player->last_jx);
+ int next_jy = player->jy + (player->jy - player->last_jy);
+
+ if (x == next_jx && y == next_jy)
+ return(TRUE);
+ }
+ }
+
+ return(FALSE);
+}
+
+void StartMoving(int x, int y)
+{
+ int element = Feld[x][y];
+
+ if (Stop[x][y])
+ return;
+
+ if (CAN_FALL(element) && y<lev_fieldy-1)
+ {
+ if ((x>0 && IS_PLAYER(x-1,y)) || (x<lev_fieldx-1 && IS_PLAYER(x+1,y)))
+ if (JustBeingPushed(x,y))
+ return;
+
+ if (element==EL_MORAST_VOLL)
+ {
+ if (IS_FREE(x,y+1))
+ {
+ InitMovingField(x,y,MV_DOWN);
+ Feld[x][y] = EL_FELSBROCKEN;
+ Store[x][y] = EL_MORAST_LEER;
+ }
+ else if (Feld[x][y+1]==EL_MORAST_LEER)
+ {
+ if (!MovDelay[x][y])
+ MovDelay[x][y] = TILEY + 1;
+
+ if (MovDelay[x][y])
+ {
+ MovDelay[x][y]--;
+ if (MovDelay[x][y])
+ return;
+ }
+
+ Feld[x][y] = EL_MORAST_LEER;
+ Feld[x][y+1] = EL_MORAST_VOLL;
+ }
+ }
+ else if (element==EL_FELSBROCKEN && Feld[x][y+1]==EL_MORAST_LEER)
+ {
+ InitMovingField(x,y,MV_DOWN);
+ Store[x][y] = EL_MORAST_VOLL;
+ }
+ else if (element==EL_SIEB_VOLL)
+ {
+ if (IS_FREE(x,y+1))
+ {
+ InitMovingField(x,y,MV_DOWN);
+ Feld[x][y] = EL_CHANGED(Store2[x][y]);