fixed exiting players with custom elements when playing multi-player games
[rocksndiamonds.git] / src / game.c
index 5a97b201b510b71676ae0f3a64253e5d8a5098ba..c51b7ece8e596108139c1ebc94670c66497faa6a 100644 (file)
@@ -1112,6 +1112,7 @@ void TestIfGoodThingGetsHitByBadThing(int, int, int);
 void KillPlayer(struct PlayerInfo *);
 void BuryPlayer(struct PlayerInfo *);
 void RemovePlayer(struct PlayerInfo *);
+void RemovePlayerWithCleanup(struct PlayerInfo *);
 
 static int getInvisibleActiveFromInvisibleElement(int);
 static int getInvisibleFromInvisibleActiveElement(int);
@@ -4696,22 +4697,33 @@ void GameEnd()
   {
     level_nr++;                /* advance to next level */
     TapeErase();       /* start with empty tape */
+
+    if (setup.auto_play_next_level)
+    {
+      LoadLevel(level_nr);
+
+      SaveLevelSetup_SeriesInfo();
+    }
   }
 
   hi_pos = NewHiScore(last_level_nr);
 
-  if (hi_pos >= 0)
+  if (hi_pos >= 0 && !setup.skip_scores_after_game)
   {
     SetGameStatus(GAME_MODE_SCORES);
 
     DrawHallOfFame(last_level_nr, hi_pos);
   }
-  else
+  else if (!setup.auto_play_next_level || !setup.increment_levels)
   {
     SetGameStatus(GAME_MODE_MAIN);
 
     DrawMainMenu();
   }
+  else
+  {
+    StartGameActions(network.enabled, setup.autorecord, level.random_seed);
+  }
 }
 
 int NewHiScore(int level_nr)
@@ -9764,7 +9776,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]);
+         RemovePlayerWithCleanup(&stored_player[i]);
+
+      if (AllPlayersGone)
+       PlayerWins(local_player);
 
       break;
     }
@@ -12630,12 +12645,12 @@ void ScrollPlayer(struct PlayerInfo *player, int mode)
        Feld[jx][jy] == EL_SP_EXIT_OPEN ||
        Feld[jx][jy] == EL_SP_EXIT_OPENING)     /* <-- special case */
     {
-      DrawPlayer(player);      /* needed here only to cleanup last field */
-      RemovePlayer(player);
+      RemovePlayerWithCleanup(player);
 
-      if (local_player->friends_still_needed == 0 ||
-         IS_SP_ELEMENT(Feld[jx][jy]))
-       PlayerWins(player);
+      if ((local_player->friends_still_needed == 0 ||
+          IS_SP_ELEMENT(Feld[jx][jy])) &&
+         AllPlayersGone)
+       PlayerWins(local_player);
     }
 
     /* this breaks one level: "machine", level 000 */
@@ -13391,6 +13406,12 @@ void RemovePlayer(struct PlayerInfo *player)
   ExitY = ZY = jy;
 }
 
+void RemovePlayerWithCleanup(struct PlayerInfo *player)
+{
+  DrawPlayer(player);  /* needed here only to cleanup last field */
+  RemovePlayer(player);
+}
+
 static void setFieldForSnapping(int x, int y, int element, int direction)
 {
   struct ElementInfo *ei = &element_info[element];