X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=b843cbe7eba99fdda77cd76442011d9834d84221;hp=20157c6d347482e2de7db3b0904b5c9916b10a2f;hb=92a9de4ba59b13c63dafe19f4bf49aa10cd9e4d5;hpb=899e06c2695b543b93364993f12b46caa33e6cd7 diff --git a/src/game.c b/src/game.c index 20157c6d..b843cbe7 100644 --- a/src/game.c +++ b/src/game.c @@ -3402,6 +3402,7 @@ void InitGame(void) player->action = 0; player->effective_action = 0; player->programmed_action = 0; + player->snap_action = 0; player->mouse_action.lx = 0; player->mouse_action.ly = 0; @@ -11993,7 +11994,8 @@ void GameActions_RND(void) element == EL_DC_MAGIC_WALL_FULL || element == EL_DC_MAGIC_WALL_ACTIVE || element == EL_DC_MAGIC_WALL_EMPTYING) && - ABS(x-jx) + ABS(y-jy) < ABS(magic_wall_x-jx) + ABS(magic_wall_y-jy)) + ABS(x - jx) + ABS(y - jy) < + ABS(magic_wall_x - jx) + ABS(magic_wall_y - jy)) { magic_wall_x = x; magic_wall_y = y; @@ -12511,7 +12513,6 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) game.centered_player_nr == -1)) { int old_scroll_x = scroll_x, old_scroll_y = scroll_y; - int offset = game.scroll_delay_value; if (!IN_VIS_FIELD(SCREENX(jx), SCREENY(jy))) { @@ -12523,15 +12524,19 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) } else { + int offset = game.scroll_delay_value; + if (jx != old_jx) // player has moved horizontally { - if ((player->MovDir == MV_LEFT && scroll_x > jx - MIDPOSX + offset) || - (player->MovDir == MV_RIGHT && scroll_x < jx - MIDPOSX - offset)) - scroll_x = jx-MIDPOSX + (scroll_x < jx-MIDPOSX ? -offset : +offset); + int offset_x = offset * (player->MovDir == MV_LEFT ? +1 : -1); + int new_scroll_x = jx - MIDPOSX + offset_x; + + if ((player->MovDir == MV_LEFT && scroll_x > new_scroll_x) || + (player->MovDir == MV_RIGHT && scroll_x < new_scroll_x)) + scroll_x = new_scroll_x; // don't scroll over playfield boundaries - if (scroll_x < SBX_Left || scroll_x > SBX_Right) - scroll_x = (scroll_x < SBX_Left ? SBX_Left : SBX_Right); + scroll_x = MIN(MAX(SBX_Left, scroll_x), SBX_Right); // don't scroll more than one field at a time scroll_x = old_scroll_x + SIGN(scroll_x - old_scroll_x); @@ -12543,13 +12548,15 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) } else // player has moved vertically { - if ((player->MovDir == MV_UP && scroll_y > jy - MIDPOSY + offset) || - (player->MovDir == MV_DOWN && scroll_y < jy - MIDPOSY - offset)) - scroll_y = jy-MIDPOSY + (scroll_y < jy-MIDPOSY ? -offset : +offset); + int offset_y = offset * (player->MovDir == MV_UP ? +1 : -1); + int new_scroll_y = jy - MIDPOSY + offset_y; + + if ((player->MovDir == MV_UP && scroll_y > new_scroll_y) || + (player->MovDir == MV_DOWN && scroll_y < new_scroll_y)) + scroll_y = new_scroll_y; // don't scroll over playfield boundaries - if (scroll_y < SBY_Upper || scroll_y > SBY_Lower) - scroll_y = (scroll_y < SBY_Upper ? SBY_Upper : SBY_Lower); + scroll_y = MIN(MAX(SBY_Upper, scroll_y), SBY_Lower); // don't scroll more than one field at a time scroll_y = old_scroll_y + SIGN(scroll_y - old_scroll_y);