X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=e1522b58bb844136786b4113ee247df34506cfdb;hp=c51b7ece8e596108139c1ebc94670c66497faa6a;hb=6999c82df7c989eb8b2a7cc98f0f1e108df34910;hpb=6687b5314f1e08eb7364c0c5d753b96db18f6089 diff --git a/src/game.c b/src/game.c index c51b7ece..e1522b58 100644 --- a/src/game.c +++ b/src/game.c @@ -1112,7 +1112,7 @@ void TestIfGoodThingGetsHitByBadThing(int, int, int); void KillPlayer(struct PlayerInfo *); void BuryPlayer(struct PlayerInfo *); void RemovePlayer(struct PlayerInfo *); -void RemovePlayerWithCleanup(struct PlayerInfo *); +void ExitPlayer(struct PlayerInfo *); static int getInvisibleActiveFromInvisibleElement(int); static int getInvisibleFromInvisibleActiveElement(int); @@ -3392,6 +3392,7 @@ void InitGame() player->gems_still_needed = level.gems_needed; player->sokobanfields_still_needed = 0; player->lights_still_needed = 0; + player->players_still_needed = 0; player->friends_still_needed = 0; for (j = 0; j < MAX_NUM_KEYS; j++) @@ -3949,6 +3950,10 @@ void InitGame() } } + for (i = 0; i < MAX_PLAYERS; i++) + if (stored_player[i].active) + local_player->players_still_needed++; + /* when recording the game, store which players take part in the game */ if (tape.recording) { @@ -4417,6 +4422,10 @@ void InitAmoebaNr(int x, int y) static void PlayerWins(struct PlayerInfo *player) { + if (level.game_engine_type == GAME_ENGINE_TYPE_RND && + local_player->players_still_needed > 0) + return; + player->LevelSolved = TRUE; player->GameOver = TRUE; @@ -9776,7 +9785,7 @@ static void ExecuteCustomElementAction(int x, int y, int element, int page) { for (i = 0; i < MAX_PLAYERS; i++) if (action_arg_player_bits & (1 << i)) - RemovePlayerWithCleanup(&stored_player[i]); + ExitPlayer(&stored_player[i]); if (AllPlayersGone) PlayerWins(local_player); @@ -12645,7 +12654,7 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) Feld[jx][jy] == EL_SP_EXIT_OPEN || Feld[jx][jy] == EL_SP_EXIT_OPENING) /* <-- special case */ { - RemovePlayerWithCleanup(player); + ExitPlayer(player); if ((local_player->friends_still_needed == 0 || IS_SP_ELEMENT(Feld[jx][jy])) && @@ -13406,10 +13415,12 @@ void RemovePlayer(struct PlayerInfo *player) ExitY = ZY = jy; } -void RemovePlayerWithCleanup(struct PlayerInfo *player) +void ExitPlayer(struct PlayerInfo *player) { DrawPlayer(player); /* needed here only to cleanup last field */ RemovePlayer(player); + + local_player->players_still_needed--; } static void setFieldForSnapping(int x, int y, int element, int direction) @@ -13957,6 +13968,8 @@ static int DigField(struct PlayerInfo *player, if (local_player->sokobanfields_still_needed == 0 && (game.emulation == EMU_SOKOBAN || level.auto_exit_sokoban)) { + local_player->players_still_needed = 0; + PlayerWins(player); PlayLevelSound(x, y, SND_GAME_SOKOBAN_SOLVING);