X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=d0f7751bbbca9183bf1fed4ec03edb5008671678;hb=818bda3a0148d769381987629ebb8908bdad4826;hp=2069cb1d35397dedc14306ddfea9fe845a658514;hpb=87c8124b5296a3f5debfcb1273f4aa3beb563e8e;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 2069cb1d..d0f7751b 100644 --- a/src/game.c +++ b/src/game.c @@ -828,7 +828,6 @@ void InitGame() player->actual_frame_counter = 0; player->last_move_dir = MV_NO_MOVING; - player->is_moving = FALSE; player->is_moving = FALSE; player->is_waiting = FALSE; @@ -1505,8 +1504,10 @@ static void ResetGfxAnimation(int x, int y) void InitMovingField(int x, int y, int direction) { int element = Feld[x][y]; - int newx = x + (direction == MV_LEFT ? -1 : direction == MV_RIGHT ? +1 : 0); - int newy = y + (direction == MV_UP ? -1 : direction == MV_DOWN ? +1 : 0); + int dx = (direction == MV_LEFT ? -1 : direction == MV_RIGHT ? +1 : 0); + int dy = (direction == MV_UP ? -1 : direction == MV_DOWN ? +1 : 0); + int newx = x + dx; + int newy = y + dy; if (!JustStopped[x][y] || direction != MovDir[x][y]) ResetGfxAnimation(x, y); @@ -3313,11 +3314,17 @@ void StartMoving(int x, int y) GfxAction[x][y + 1] = ACTION_ACTIVE; #endif } +#if 1 else if (CAN_SMASH(element) && Feld[x][y + 1] == EL_BLOCKED && JustStopped[x][y]) { + /* + printf("::: %d\n", MovDir[x][y]); + */ + Impact(x, y); } +#endif else if (IS_FREE(x, y + 1) && element == EL_SPRING && use_spring_bug) { if (MovDir[x][y] == MV_NO_MOVING) @@ -3351,7 +3358,7 @@ void StartMoving(int x, int y) element != EL_DX_SUPABOMB) #endif #else - else if ((IS_SLIPPERY(Feld[x][y + 1]) || + else if (((IS_SLIPPERY(Feld[x][y + 1]) && !IS_PLAYER(x, y + 1)) || (IS_EM_SLIPPERY_WALL(Feld[x][y + 1]) && IS_GEM(element))) && !IS_FALLING(x, y + 1) && !JustStopped[x][y + 1] && element != EL_DX_SUPABOMB && element != EL_SP_DISK_ORANGE) @@ -3371,6 +3378,11 @@ void StartMoving(int x, int y) InitMovingField(x, y, left ? MV_LEFT : MV_RIGHT); started_moving = TRUE; + +#if 0 + if (element == EL_BOMB) + printf("::: SLIP DOWN [%d]\n", FrameCounter); +#endif } } else if (IS_BELT_ACTIVE(Feld[x][y + 1])) @@ -3778,6 +3790,17 @@ void ContinueMoving(int x, int y) int horiz_move = (dx != 0); int newx = x + dx, newy = y + dy; int step = (horiz_move ? dx : dy) * TILEX / MOVE_DELAY_NORMAL_SPEED; + struct PlayerInfo *player = (IS_PLAYER(x, y) ? PLAYERINFO(x, y) : NULL); +#if 0 + boolean pushing = (player != NULL && player->Pushing && player->MovPos != 0); +#else + boolean pushing = (player != NULL && player->Pushing && player->is_moving); +#endif + +#if 0 + if (player && player->is_moving && player->MovPos == 0) + printf("::: !!!\n"); +#endif if (element == EL_AMOEBA_DROP || element == EL_AMOEBA_DROPPING) step /= 2; @@ -3804,6 +3827,26 @@ void ContinueMoving(int x, int y) MovPos[x][y] += step; +#if 1 + if (pushing) /* special case: moving object pushed by player */ +#if 1 + MovPos[x][y] = SIGN(MovPos[x][y]) * (TILEX - ABS(PLAYERINFO(x,y)->MovPos)); +#else + MovPos[x][y] = SIGN(MovPos[x][y]) * (TILEX - ABS(PLAYERINFO(x,y)->GfxPos)); +#endif +#endif + +#if 0 + if (element == EL_SPRING) + printf("::: spring moves %d [%d: %d, %d, %d/%d]\n", + MovPos[x][y], + pushing, + (player?player->Pushing:-42), + (player?player->is_moving:-42), + (player?player->MovPos:-42), + (player?player->GfxPos:-42)); +#endif + if (ABS(MovPos[x][y]) >= TILEX) /* object reached its destination */ { Feld[x][y] = EL_EMPTY; @@ -3917,8 +3960,14 @@ void ContinueMoving(int x, int y) DrawLevelField(x, y); DrawLevelField(newx, newy); - Stop[newx][newy] = TRUE; - JustStopped[newx][newy] = 3; +#if 0 + if (game.engine_version >= RELEASE_IDENT(2,2,0,7) || !pushing) +#endif + Stop[newx][newy] = TRUE; /* ignore this element until the next frame */ +#if 1 + if (!pushing) +#endif + JustStopped[newx][newy] = 3; if (DONT_TOUCH(element)) /* object may be nasty to player or others */ { @@ -4961,16 +5010,12 @@ static void CheckPlayerElementChange(int x, int y, int element, if (!CAN_CHANGE(element) || !HAS_CHANGE_EVENT(element, trigger_event)) return; - if (trigger_event == CE_PUSHED_BY_PLAYER) - { -#if 0 - /* !!! does not work -- debug !!! */ - ChangeDelay[x][y] = 2; /* give one frame (+1) to start pushing */ - ChangeElement(x, y); +#if 1 + ChangeDelay[x][y] = 1; + ChangeElement(x, y); +#else + ChangeElementDoIt(x, y, element_info[element].change.successor); #endif - } - else - ChangeElementDoIt(x, y, element_info[element].change.successor); } static void PlayerActions(struct PlayerInfo *player, byte player_action) @@ -5139,6 +5184,30 @@ void GameActions() stored_player[i].Frame++; #endif +#if 1 + if (game.engine_version < RELEASE_IDENT(2,2,0,7)) + { + for (i=0; ijx; + int y = player->jy; + + if (player->active && player->Pushing && player->is_moving && + IS_MOVING(x, y)) + { + ContinueMoving(x, y); + + /* continue moving after pushing (this is actually a bug) */ + if (!IS_MOVING(x, y)) + { + Stop[x][y] = FALSE; + } + } + } + } +#endif + for (y=0; yjx, jy = player->jy; int dx = x - jx, dy = y - jy; int move_direction = (dx == -1 ? MV_LEFT : @@ -6328,7 +6398,14 @@ int DigField(struct PlayerInfo *player, } if (IS_MOVING(x, y) || IS_PLAYER(x, y)) + { +#if 0 + if (FrameCounter == 437) + printf("::: ---> IS_MOVING %d\n", MovDir[x][y]); +#endif + return MF_NO_ACTION; + } #if 0 if (IS_TUBE(Feld[jx][jy]) || IS_TUBE(Back[jx][jy])) @@ -6708,6 +6785,10 @@ int DigField(struct PlayerInfo *player, if (dy) return MF_NO_ACTION; + if (CAN_FALL(element) && IN_LEV_FIELD(x, y + 1) && IS_FREE(x, y + 1) && + !(element == EL_SPRING && use_spring_bug)) + return MF_NO_ACTION; + player->Pushing = TRUE; #if 0 @@ -6722,8 +6803,14 @@ int DigField(struct PlayerInfo *player, if (!checkDiagonalPushing(player, x, y, real_dx, real_dy)) return MF_NO_ACTION; + if (player->push_delay == 0) player->push_delay = FrameCounter; + +#if 0 + printf("want push... %d [%d]\n", FrameCounter, player->push_delay_value); +#endif + #if 0 if (!FrameReached(&player->push_delay, player->push_delay_value) && !tape.playing && @@ -6743,15 +6830,29 @@ int DigField(struct PlayerInfo *player, } else { +#if 1 + InitMovingField(x, y, (dx < 0 ? MV_LEFT : + dx > 0 ? MV_RIGHT : + dy < 0 ? MV_UP : MV_DOWN)); + MovPos[x][y] = (dx != 0 ? dx : dy); +#else RemoveField(x, y); Feld[x + dx][y + dy] = element; +#endif } +#if 0 + printf("pushing %d/%d ... %d [%d]\n", dx, dy, + FrameCounter, player->push_delay_value); +#endif + +#if 0 if (element == EL_SPRING) { Feld[x + dx][y + dy] = EL_SPRING; MovDir[x + dx][y + dy] = move_direction; } +#endif player->push_delay_value = (element == EL_SPRING ? 0 : 2 + RND(8)); @@ -7104,6 +7205,9 @@ int DigField(struct PlayerInfo *player, if (CAN_FALL(element) && dy) return MF_NO_ACTION; + if (CAN_FALL(element) && IN_LEV_FIELD(x, y + 1) && IS_FREE(x, y + 1)) + return MF_NO_ACTION; + if (!player->Pushing && game.engine_version >= RELEASE_IDENT(2,2,0,7)) player->push_delay_value = GET_NEW_PUSH_DELAY(element); @@ -7123,8 +7227,15 @@ int DigField(struct PlayerInfo *player, !(tape.playing && tape.file_version < FILE_VERSION_2_0)) return MF_NO_ACTION; +#if 1 + InitMovingField(x, y, (dx < 0 ? MV_LEFT : + dx > 0 ? MV_RIGHT : + dy < 0 ? MV_UP : MV_DOWN)); + MovPos[x][y] = (dx != 0 ? dx : dy); +#else RemoveField(x, y); Feld[x + dx][y + dy] = element; +#endif #if 1 if (game.engine_version < RELEASE_IDENT(2,2,0,7)) @@ -7137,7 +7248,11 @@ int DigField(struct PlayerInfo *player, PlaySoundLevelElementAction(x, y, element, ACTION_PUSHING); CheckTriggeredElementChange(element, CE_OTHER_PUSHING); +#if 1 CheckPlayerElementChange(x, y, element, CE_PUSHED_BY_PLAYER); +#else + CheckPlayerElementChange(x + dx, y + dy, element, CE_PUSHED_BY_PLAYER); +#endif break; }