X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=8d919bc8fb7a44aaa2c712a9d21f79e2a1459f09;hb=28fe42eb060d7c9169a9b344678494e7d366a6b0;hp=daacf61cd23a4721fe491e711f3edf0091b8b9dd;hpb=5261391294502f3d757f9ac7a244dbb6d6a177c9;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index daacf61c..8d919bc8 100644 --- a/src/game.c +++ b/src/game.c @@ -40,6 +40,7 @@ #define USE_NEW_SPRING_BUMPER (USE_NEW_STUFF * 1) #define USE_STOP_CHANGED_ELEMENTS (USE_NEW_STUFF * 1) #define USE_ELEMENT_TOUCHING_BUGFIX (USE_NEW_STUFF * 1) +#define USE_NEW_CONTINUOUS_SNAPPING (USE_NEW_STUFF * 1) #define USE_QUICKSAND_IMPACT_BUGFIX (USE_NEW_STUFF * 0) @@ -98,6 +99,11 @@ #define DX_TIME2 (DX + XX_TIME2) #define DY_TIME (DY + YY_TIME) +/* values for delayed check of falling and moving elements and for collision */ +#define CHECK_DELAY_MOVING 3 +#define CHECK_DELAY_FALLING 3 +#define CHECK_DELAY_COLLISION 2 + /* values for initial player move delay (initial delay counter value) */ #define INITIAL_MOVE_DELAY_OFF -1 #define INITIAL_MOVE_DELAY_ON 0 @@ -1828,6 +1834,7 @@ void InitGame() player->is_pushing = FALSE; player->is_switching = FALSE; player->is_dropping = FALSE; + player->is_dropping_pressed = FALSE; player->is_bored = FALSE; player->is_sleeping = FALSE; @@ -1876,6 +1883,7 @@ void InitGame() player->push_delay_value = game.initial_push_delay_value; player->drop_delay = 0; + player->drop_pressed_delay = 0; player->last_jx = player->last_jy = 0; player->jx = player->jy = 0; @@ -3146,23 +3154,21 @@ void DrawRelocatePlayer(struct PlayerInfo *player, boolean quick_relocation) } else { - int scroll_xx = -999, scroll_yy = -999; + int scroll_xx = (player->jx < SBX_Left + MIDPOSX ? SBX_Left : + player->jx > SBX_Right + MIDPOSX ? SBX_Right : + player->jx - MIDPOSX); + + int scroll_yy = (player->jy < SBY_Upper + MIDPOSY ? SBY_Upper : + player->jy > SBY_Lower + MIDPOSY ? SBY_Lower : + player->jy - MIDPOSY); ScrollScreen(NULL, SCROLL_GO_ON); /* scroll last frame to full tile */ - while (scroll_xx != scroll_x || scroll_yy != scroll_y) + while (scroll_x != scroll_xx || scroll_y != scroll_yy) { int dx = 0, dy = 0; int fx = FX, fy = FY; - scroll_xx = (player->jx < SBX_Left + MIDPOSX ? SBX_Left : - player->jx > SBX_Right + MIDPOSX ? SBX_Right : - player->jx - MIDPOSX); - - scroll_yy = (player->jy < SBY_Upper + MIDPOSY ? SBY_Upper : - player->jy > SBY_Lower + MIDPOSY ? SBY_Lower : - player->jy - MIDPOSY); - dx = (scroll_xx < scroll_x ? +1 : scroll_xx > scroll_x ? -1 : 0); dy = (scroll_yy < scroll_y ? +1 : scroll_yy > scroll_y ? -1 : 0); @@ -6486,13 +6492,13 @@ void ContinueMoving(int x, int y) int nextx = newx + dx, nexty = newy + dy; boolean check_collision_again = IN_LEV_FIELD_AND_IS_FREE(nextx, nexty); - WasJustMoving[newx][newy] = 3; + WasJustMoving[newx][newy] = CHECK_DELAY_MOVING; if (CAN_FALL(element) && direction == MV_DOWN) - WasJustFalling[newx][newy] = 3; + WasJustFalling[newx][newy] = CHECK_DELAY_FALLING; if ((!CAN_FALL(element) || direction == MV_DOWN) && check_collision_again) - CheckCollision[newx][newy] = 2; + CheckCollision[newx][newy] = CHECK_DELAY_COLLISION; } if (DONT_TOUCH(element)) /* object may be nasty to player or others */ @@ -8706,8 +8712,8 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action) int down = player_action & JOY_DOWN; int button1 = player_action & JOY_BUTTON_1; int button2 = player_action & JOY_BUTTON_2; - int dx = (left ? -1 : right ? 1 : 0); - int dy = (up ? -1 : down ? 1 : 0); + int dx = (left ? -1 : right ? 1 : 0); + int dy = (up ? -1 : down ? 1 : 0); if (!player->active || tape.pausing) return 0; @@ -8752,6 +8758,8 @@ static byte PlayerActions(struct PlayerInfo *player, byte player_action) player->is_moving = FALSE; player->is_dropping = FALSE; + player->is_dropping_pressed = FALSE; + player->drop_pressed_delay = 0; return 0; } @@ -8802,6 +8810,9 @@ void AdvanceFrameAndPlayerCounters(int player_nr) if (stored_player[i].drop_delay > 0) stored_player[i].drop_delay--; + + if (stored_player[i].is_dropping_pressed) + stored_player[i].drop_pressed_delay++; } } @@ -9930,6 +9941,8 @@ boolean MovePlayer(struct PlayerInfo *player, int dx, int dy) player->is_snapping = FALSE; player->is_switching = FALSE; player->is_dropping = FALSE; + player->is_dropping_pressed = FALSE; + player->drop_pressed_delay = 0; } else { @@ -11581,6 +11594,8 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) dx == +1 ? MV_RIGHT : dy == -1 ? MV_UP : dy == +1 ? MV_DOWN : MV_NONE); + boolean can_continue_snapping = (level.continuous_snapping && + WasJustFalling[x][y] < CHECK_DELAY_FALLING); if (player->MovPos != 0 && game.engine_version >= VERSION_IDENT(2,2,0,0)) return FALSE; @@ -11608,8 +11623,14 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) return FALSE; } +#if USE_NEW_CONTINUOUS_SNAPPING + /* prevent snapping with already pressed snap key when not allowed */ + if (player->is_snapping && !can_continue_snapping) + return FALSE; +#else if (player->is_snapping) return FALSE; +#endif player->MovDir = snap_direction; @@ -11621,6 +11642,8 @@ boolean SnapField(struct PlayerInfo *player, int dx, int dy) } player->is_dropping = FALSE; + player->is_dropping_pressed = FALSE; + player->drop_pressed_delay = 0; if (DigField(player, jx, jy, x, y, 0, 0, DF_SNAP) == MP_NO_ACTION) return FALSE; @@ -11656,6 +11679,8 @@ boolean DropElement(struct PlayerInfo *player) EL_DYNABOMB_PLAYER_1_ACTIVE + player->index_nr : EL_UNDEFINED); + player->is_dropping_pressed = TRUE; + /* do not drop an element on top of another element; when holding drop key pressed without moving, dropped element must move away before the next element can be dropped (this is especially important if the next element @@ -11683,6 +11708,10 @@ boolean DropElement(struct PlayerInfo *player) if (new_element == EL_UNDEFINED) return FALSE; + /* check if drop key was pressed long enough for EM style dynamite */ + if (new_element == EL_EM_DYNAMITE && player->drop_pressed_delay < 40) + return FALSE; + /* check if anything can be dropped at the current position */ if (IS_ACTIVE_BOMB(old_element) || old_element == EL_EXPLOSION) return FALSE; @@ -11764,12 +11793,15 @@ boolean DropElement(struct PlayerInfo *player) nexty = dropy + GET_DY_FROM_DIR(move_direction); ChangeCount[dropx][dropy] = 0; /* allow at least one more change */ - CheckCollision[dropx][dropy] = 2; + CheckCollision[dropx][dropy] = CHECK_DELAY_COLLISION; } player->drop_delay = GET_NEW_DROP_DELAY(drop_element); player->is_dropping = TRUE; + player->drop_pressed_delay = 0; + player->is_dropping_pressed = FALSE; + player->drop_x = dropx; player->drop_y = dropy;