X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=c51b7ece8e596108139c1ebc94670c66497faa6a;hb=6687b5314f1e08eb7364c0c5d753b96db18f6089;hp=5a97b201b510b71676ae0f3a64253e5d8a5098ba;hpb=ec7383f34bac8e493eb6c68813c1affb1149890e;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 5a97b201..c51b7ece 100644 --- a/src/game.c +++ b/src/game.c @@ -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];