void KillPlayer(struct PlayerInfo *);
void BuryPlayer(struct PlayerInfo *);
void RemovePlayer(struct PlayerInfo *);
+void RemovePlayerWithCleanup(struct PlayerInfo *);
static int getInvisibleActiveFromInvisibleElement(int);
static int getInvisibleFromInvisibleActiveElement(int);
void GameEnd()
{
int hi_pos;
- boolean raise_level = FALSE;
+ int last_level_nr = level_nr;
local_player->LevelSolved_GameEnd = TRUE;
if (setup.increment_levels &&
level_nr < leveldir_current->last_level)
- raise_level = TRUE; /* advance to next level */
-
- if ((hi_pos = NewHiScore(level_nr)) >= 0)
{
- SetGameStatus(GAME_MODE_SCORES);
+ level_nr++; /* advance to next level */
+ TapeErase(); /* start with empty tape */
- DrawHallOfFame(level_nr, hi_pos);
-
- if (raise_level)
+ if (setup.auto_play_next_level)
{
- level_nr++;
- TapeErase();
+ LoadLevel(level_nr);
+
+ SaveLevelSetup_SeriesInfo();
}
}
- else
+
+ hi_pos = NewHiScore(last_level_nr);
+
+ if (hi_pos >= 0 && !setup.skip_scores_after_game)
{
- SetGameStatus(GAME_MODE_MAIN);
+ SetGameStatus(GAME_MODE_SCORES);
- if (raise_level)
- {
- level_nr++;
- TapeErase();
- }
+ DrawHallOfFame(last_level_nr, hi_pos);
+ }
+ 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)
{
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;
}
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 */
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];