X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=380614c4b9799c766d0104d11135be76aa127648;hp=4edcf7e8c16fe8cf0e9f902014b4f35c45a6832a;hb=bb49e2b2a9bb4aefe76182be725e998bf9495976;hpb=9e4358919afd28bdb4481eaf8daf4dcd4eca3e02 diff --git a/src/game.c b/src/game.c index 4edcf7e8..380614c4 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); @@ -2224,7 +2224,8 @@ void UpdateGameControlValues() /* update game panel control values */ - game_panel_controls[GAME_PANEL_LEVEL_NUMBER].value = level_nr; + /* use "level.file_info.nr" instead of "level_nr" (for network games) */ + game_panel_controls[GAME_PANEL_LEVEL_NUMBER].value = level.file_info.nr; game_panel_controls[GAME_PANEL_GEMS].value = gems; game_panel_controls[GAME_PANEL_INVENTORY_COUNT].value = 0; @@ -3392,6 +3393,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 +3951,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 +4423,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 +9786,10 @@ 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)) - PlayerWins(&stored_player[i]); + ExitPlayer(&stored_player[i]); + + if (AllPlayersGone) + PlayerWins(local_player); break; } @@ -11215,6 +11228,7 @@ void StartGameActions(boolean init_network_game, boolean record_tape, if (init_network_game) { + SendToServer_LevelFile(); SendToServer_StartPlaying(); return; @@ -12642,7 +12656,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])) && @@ -13403,10 +13417,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) @@ -13954,6 +13970,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);