X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=c1846d6a147ff6abd76ec6caefe8f0e88b7f0d06;hp=750b84eac618cf36b872a9ab2aa0e74cead6af1f;hb=54cd73c4e6a8fc9521f0adda5501cd09eb294b4c;hpb=dec5093fc78bfe1356d764c2432fed6566b2af66 diff --git a/src/game.c b/src/game.c index 750b84ea..c1846d6a 100644 --- a/src/game.c +++ b/src/game.c @@ -3544,7 +3544,6 @@ void InitGame(void) SendToServer_MovePlayer(MV_NONE); ZX = ZY = -1; - ExitX = ExitY = -1; FrameCounter = 0; TimeFrames = 0; @@ -3558,7 +3557,10 @@ void InitGame(void) ScrollStepSize = 0; // will be correctly initialized by ScrollScreen() - AllPlayersGone = FALSE; + game.exit_x = -1; + game.exit_y = -1; + + game.all_players_gone = FALSE; game.LevelSolved = FALSE; game.GameOver = FALSE; @@ -4570,30 +4572,35 @@ void GameWon(void) if (level.game_engine_type == GAME_ENGINE_TYPE_RND) { - if (ExitX >= 0 && ExitY >= 0) // local player has left the level + // check if last player has left the level + if (game.exit_x >= 0 && + game.exit_y >= 0) { + int x = game.exit_x; + int y = game.exit_y; + int element = Feld[x][y]; + // close exit door after last player - if ((AllPlayersGone && - (Feld[ExitX][ExitY] == EL_EXIT_OPEN || - Feld[ExitX][ExitY] == EL_SP_EXIT_OPEN || - Feld[ExitX][ExitY] == EL_STEEL_EXIT_OPEN)) || - Feld[ExitX][ExitY] == EL_EM_EXIT_OPEN || - Feld[ExitX][ExitY] == EL_EM_STEEL_EXIT_OPEN) + if ((game.all_players_gone && + (element == EL_EXIT_OPEN || + element == EL_SP_EXIT_OPEN || + element == EL_STEEL_EXIT_OPEN)) || + element == EL_EM_EXIT_OPEN || + element == EL_EM_STEEL_EXIT_OPEN) { - int element = Feld[ExitX][ExitY]; - Feld[ExitX][ExitY] = + Feld[x][y] = (element == EL_EXIT_OPEN ? EL_EXIT_CLOSING : element == EL_EM_EXIT_OPEN ? EL_EM_EXIT_CLOSING : element == EL_SP_EXIT_OPEN ? EL_SP_EXIT_CLOSING: element == EL_STEEL_EXIT_OPEN ? EL_STEEL_EXIT_CLOSING: EL_EM_STEEL_EXIT_CLOSING); - PlayLevelSoundElementAction(ExitX, ExitY, element, ACTION_CLOSING); + PlayLevelSoundElementAction(x, y, element, ACTION_CLOSING); } // player disappears - DrawLevelField(ExitX, ExitY); + DrawLevelField(x, y); } for (i = 0; i < MAX_PLAYERS; i++) @@ -6813,10 +6820,10 @@ static void TurnRoundExt(int x, int y) { int attr_x = -1, attr_y = -1; - if (AllPlayersGone) + if (game.all_players_gone) { - attr_x = ExitX; - attr_y = ExitY; + attr_x = game.exit_x; + attr_y = game.exit_y; } else { @@ -6877,13 +6884,13 @@ static void TurnRoundExt(int x, int y) MovDir[x][y] = MV_NONE; if (attr_x < x) - MovDir[x][y] |= (AllPlayersGone ? MV_RIGHT : MV_LEFT); + MovDir[x][y] |= (game.all_players_gone ? MV_RIGHT : MV_LEFT); else if (attr_x > x) - MovDir[x][y] |= (AllPlayersGone ? MV_LEFT : MV_RIGHT); + MovDir[x][y] |= (game.all_players_gone ? MV_LEFT : MV_RIGHT); if (attr_y < y) - MovDir[x][y] |= (AllPlayersGone ? MV_DOWN : MV_UP); + MovDir[x][y] |= (game.all_players_gone ? MV_DOWN : MV_UP); else if (attr_y > y) - MovDir[x][y] |= (AllPlayersGone ? MV_UP : MV_DOWN); + MovDir[x][y] |= (game.all_players_gone ? MV_UP : MV_DOWN); if (element == EL_ROBOT) { @@ -7182,10 +7189,10 @@ static void TurnRoundExt(int x, int y) int newx, newy; boolean move_away = (move_pattern == MV_AWAY_FROM_PLAYER); - if (AllPlayersGone) + if (game.all_players_gone) { - attr_x = ExitX; - attr_y = ExitY; + attr_x = game.exit_x; + attr_y = game.exit_y; } else { @@ -7950,7 +7957,8 @@ static void StartMoving(int x, int y) game.friends_still_needed--; if (!game.friends_still_needed && - !game.GameOver && AllPlayersGone) + !game.GameOver && + game.all_players_gone) LevelSolved(); return; @@ -9096,7 +9104,8 @@ static void CheckExit(int x, int y) return; } - if (AllPlayersGone) // do not re-open exit door closed after last player + // do not re-open exit door closed after last player + if (game.all_players_gone) return; Feld[x][y] = EL_EXIT_OPENING; @@ -9120,7 +9129,8 @@ static void CheckExitEM(int x, int y) return; } - if (AllPlayersGone) // do not re-open exit door closed after last player + // do not re-open exit door closed after last player + if (game.all_players_gone) return; Feld[x][y] = EL_EM_EXIT_OPENING; @@ -9144,7 +9154,8 @@ static void CheckExitSteel(int x, int y) return; } - if (AllPlayersGone) // do not re-open exit door closed after last player + // do not re-open exit door closed after last player + if (game.all_players_gone) return; Feld[x][y] = EL_STEEL_EXIT_OPENING; @@ -9168,7 +9179,8 @@ static void CheckExitSteelEM(int x, int y) return; } - if (AllPlayersGone) // do not re-open exit door closed after last player + // do not re-open exit door closed after last player + if (game.all_players_gone) return; Feld[x][y] = EL_EM_STEEL_EXIT_OPENING; @@ -9189,7 +9201,8 @@ static void CheckExitSP(int x, int y) return; } - if (AllPlayersGone) // do not re-open exit door closed after last player + // do not re-open exit door closed after last player + if (game.all_players_gone) return; Feld[x][y] = EL_SP_EXIT_OPENING; @@ -9846,7 +9859,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) if (action_arg_player_bits & (1 << i)) ExitPlayer(&stored_player[i]); - if (AllPlayersGone) + if (game.players_still_needed == 0) LevelSolved(); break; @@ -11123,11 +11136,11 @@ static void CheckLevelSolved(void) game_em.game_over = TRUE; - AllPlayersGone = TRUE; + game.all_players_gone = TRUE; } if (game_em.game_over) // game lost - AllPlayersGone = TRUE; + game.all_players_gone = TRUE; } else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) { @@ -11138,11 +11151,11 @@ static void CheckLevelSolved(void) game_sp.game_over = TRUE; - AllPlayersGone = TRUE; + game.all_players_gone = TRUE; } if (game_sp.game_over) // game lost - AllPlayersGone = TRUE; + game.all_players_gone = TRUE; } else if (level.game_engine_type == GAME_ENGINE_TYPE_MM) { @@ -11153,11 +11166,11 @@ static void CheckLevelSolved(void) game_mm.game_over = TRUE; - AllPlayersGone = TRUE; + game.all_players_gone = TRUE; } if (game_mm.game_over) // game lost - AllPlayersGone = TRUE; + game.all_players_gone = TRUE; } } @@ -11208,7 +11221,7 @@ static void CheckLevelTime(void) KillPlayer(&stored_player[i]); } } - else if (game.no_time_limit && !AllPlayersGone) // level w/o time limit + else if (game.no_time_limit && !game.all_players_gone) { game_panel_controls[GAME_PANEL_TIME].value = TimePlayed; } @@ -11333,7 +11346,7 @@ static void GameActionsExt(void) if (game.LevelSolved && !game.LevelSolved_GameEnd) GameWon(); - if (AllPlayersGone && !TAPE_IS_STOPPED(tape)) + if (game.all_players_gone && !TAPE_IS_STOPPED(tape)) TapeStop(); if (game_status != GAME_MODE_PLAYING) // status might have changed @@ -12673,9 +12686,9 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) { ExitPlayer(player); - if ((game.friends_still_needed == 0 || - IS_SP_ELEMENT(Feld[jx][jy])) && - AllPlayersGone) + if (game.players_still_needed == 0 && + (game.friends_still_needed == 0 || + IS_SP_ELEMENT(Feld[jx][jy]))) LevelSolved(); } @@ -12745,7 +12758,7 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) for (i = 0; i < MAX_PLAYERS; i++) KillPlayer(&stored_player[i]); } - else if (game.no_time_limit && !AllPlayersGone) // level w/o time limit + else if (game.no_time_limit && !game.all_players_gone) { game_panel_controls[GAME_PANEL_TIME].value = TimePlayed; @@ -13406,7 +13419,9 @@ void BuryPlayer(struct PlayerInfo *player) RemovePlayer(player); player->buried = TRUE; - game.GameOver = TRUE; + + if (game.all_players_gone) + game.GameOver = TRUE; } void RemovePlayer(struct PlayerInfo *player) @@ -13428,10 +13443,13 @@ void RemovePlayer(struct PlayerInfo *player) found = TRUE; if (!found) - AllPlayersGone = TRUE; + { + game.all_players_gone = TRUE; + game.GameOver = TRUE; + } - ExitX = ZX = jx; - ExitY = ZY = jy; + game.exit_x = ZX = jx; + game.exit_y = ZY = jy; } void ExitPlayer(struct PlayerInfo *player) @@ -13441,10 +13459,6 @@ void ExitPlayer(struct PlayerInfo *player) if (game.players_still_needed > 0) game.players_still_needed--; - - // also set if some players not yet gone, but not needed to solve level - if (game.players_still_needed == 0) - AllPlayersGone = TRUE; } static void setFieldForSnapping(int x, int y, int element, int direction) @@ -14969,7 +14983,7 @@ void RequestQuitGameExt(boolean skip_request, boolean quick_quit, char *message) void RequestQuitGame(boolean ask_if_really_quit) { boolean quick_quit = (!ask_if_really_quit || level_editor_test_game); - boolean skip_request = AllPlayersGone || quick_quit; + boolean skip_request = game.all_players_gone || quick_quit; RequestQuitGameExt(skip_request, quick_quit, "Do you really want to quit the game?"); @@ -15036,9 +15050,6 @@ boolean checkGameSolved(void) boolean checkGameFailed(void) { - if (!AllPlayersGone) - return FALSE; - if (level.game_engine_type == GAME_ENGINE_TYPE_EM) return (game_em.game_over && !game_em.level_solved); else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) @@ -15232,8 +15243,6 @@ static ListNode *SaveEngineSnapshotBuffers(void) SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(ZX)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(ZY)); - SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(ExitX)); - SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(ExitY)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(FrameCounter)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(TimeFrames)); @@ -15247,8 +15256,6 @@ static ListNode *SaveEngineSnapshotBuffers(void) SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(ScrollStepSize)); - SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(AllPlayersGone)); - SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(AmoebaCnt)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(AmoebaCnt2));