{
// relocation _without_ centering of screen
- // apply distance between old and new player position to scroll position
- int shifted_scroll_x = scroll_x + (x - old_x);
- int shifted_scroll_y = scroll_y + (y - old_y);
+ if (IN_LEV_FIELD(old_x, old_y))
+ {
+ // apply distance between old and new player position to scroll position
+ int shifted_scroll_x = scroll_x + (x - old_x);
+ int shifted_scroll_y = scroll_y + (y - old_y);
- // make sure that shifted scroll position does not scroll beyond screen
- new_scroll_x = SCROLL_POSITION_X(shifted_scroll_x + MIDPOSX);
- new_scroll_y = SCROLL_POSITION_Y(shifted_scroll_y + MIDPOSY);
+ // make sure that shifted scroll position does not scroll beyond screen
+ new_scroll_x = SCROLL_POSITION_X(shifted_scroll_x + MIDPOSX);
+ new_scroll_y = SCROLL_POSITION_Y(shifted_scroll_y + MIDPOSY);
+ }
+ else
+ {
+ // player not on playfield before -- scroll to initial player position
+ new_scroll_x = SCROLL_POSITION_X(x);
+ new_scroll_y = SCROLL_POSITION_Y(y);
+ }
// special case for teleporting from one end of the playfield to the other
// (this kludge prevents the destination area to be shifted by half a tile