X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=71740a8f4931186bbcd5a08847518cef733528d5;hp=750b84eac618cf36b872a9ab2aa0e74cead6af1f;hb=b165e8970f5f3d8f9972433960785f31b9a11723;hpb=dec5093fc78bfe1356d764c2432fed6566b2af66 diff --git a/src/game.c b/src/game.c index 750b84ea..71740a8f 100644 --- a/src/game.c +++ b/src/game.c @@ -3543,9 +3543,6 @@ void InitGame(void) if (network_playing) SendToServer_MovePlayer(MV_NONE); - ZX = ZY = -1; - ExitX = ExitY = -1; - FrameCounter = 0; TimeFrames = 0; TimePlayed = 0; @@ -3558,7 +3555,13 @@ void InitGame(void) ScrollStepSize = 0; // will be correctly initialized by ScrollScreen() - AllPlayersGone = FALSE; + game.robot_wheel_x = -1; + game.robot_wheel_y = -1; + + game.exit_x = -1; + game.exit_y = -1; + + game.all_players_gone = FALSE; game.LevelSolved = FALSE; game.GameOver = FALSE; @@ -4570,30 +4573,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 +6821,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 { @@ -6839,12 +6847,14 @@ static void TurnRoundExt(int x, int y) } } - if (element == EL_ROBOT && ZX >= 0 && ZY >= 0 && - (Feld[ZX][ZY] == EL_ROBOT_WHEEL_ACTIVE || + if (element == EL_ROBOT && + game.robot_wheel_x >= 0 && + game.robot_wheel_y >= 0 && + (Feld[game.robot_wheel_x][game.robot_wheel_y] == EL_ROBOT_WHEEL_ACTIVE || game.engine_version < VERSION_IDENT(3,1,0,0))) { - attr_x = ZX; - attr_y = ZY; + attr_x = game.robot_wheel_x; + attr_y = game.robot_wheel_y; } if (element == EL_PENGUIN) @@ -6877,13 +6887,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 +7192,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 +7960,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; @@ -9025,10 +9036,11 @@ static void RunRobotWheel(int x, int y) static void StopRobotWheel(int x, int y) { - if (ZX == x && ZY == y) + if (game.robot_wheel_x == x && + game.robot_wheel_y == y) { - ZX = ZY = -1; - + game.robot_wheel_x = -1; + game.robot_wheel_y = -1; game.robot_wheel_active = FALSE; } } @@ -9096,7 +9108,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 +9133,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 +9158,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 +9183,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 +9205,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 +9863,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 +11140,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 +11155,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 +11170,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 +11225,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 +11350,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 @@ -11347,6 +11364,15 @@ static void GameActionsExt(void) SetVideoFrameDelay(game_frame_delay_value); + // (de)activate virtual buttons depending on current game status + if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS)) + { + if (game.all_players_gone) // if no players there to be controlled anymore + SetOverlayActive(FALSE); + else if (!tape.playing) // if game continues after tape stopped playing + SetOverlayActive(TRUE); + } + #if 0 #if 0 // ---------- main game synchronization point ---------- @@ -12673,9 +12699,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 +12771,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 +13432,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 +13456,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 = game.robot_wheel_x = jx; + game.exit_y = game.robot_wheel_y = jy; } void ExitPlayer(struct PlayerInfo *player) @@ -13441,10 +13472,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) @@ -14058,9 +14085,9 @@ static int DigField(struct PlayerInfo *player, if (element == EL_ROBOT_WHEEL) { Feld[x][y] = EL_ROBOT_WHEEL_ACTIVE; - ZX = x; - ZY = y; + game.robot_wheel_x = x; + game.robot_wheel_y = y; game.robot_wheel_active = TRUE; TEST_DrawLevelField(x, y); @@ -14969,7 +14996,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 +15063,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) @@ -15230,11 +15254,6 @@ static ListNode *SaveEngineSnapshotBuffers(void) SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(game)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(tape)); - 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)); SaveSnapshotBuffer(&buffers, ARGS_ADDRESS_AND_SIZEOF(TimePlayed)); @@ -15247,8 +15266,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));