X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=259d19b6c54f858bee6ca6701bd6ce5b64ec94fd;hb=c87fc56ebe59b3d5158e7e6f01d7aa9bf667737e;hp=f7392fe400f49bdc4b3b47b8cae54a7c01b98851;hpb=c0f9aa871d5922a6343facd23b44c2d1cb1f8c92;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index f7392fe4..259d19b6 100644 --- a/src/game.c +++ b/src/game.c @@ -4997,7 +4997,7 @@ void GameEnd(void) game.LevelSolved_GameEnd = TRUE; - if (game.LevelSolved_SaveTape) + if (game.LevelSolved_SaveTape && !score_info_tape_play) { // make sure that request dialog to save tape does not open door again if (!global.use_envelope_request) @@ -5013,7 +5013,7 @@ void GameEnd(void) // if no tape is to be saved, close both doors simultaneously CloseDoor(DOOR_CLOSE_ALL); - if (level_editor_test_game) + if (level_editor_test_game || score_info_tape_play) { SetGameStatus(GAME_MODE_MAIN); @@ -5050,6 +5050,9 @@ void GameEnd(void) if (setup.auto_play_next_level) { + scores.continue_playing = TRUE; + scores.next_level_nr = level_nr; + LoadLevel(level_nr); SaveLevelSetup_SeriesInfo(); @@ -5062,9 +5065,7 @@ void GameEnd(void) DrawHallOfFame(last_level_nr); } - else if (setup.auto_play_next_level && setup.increment_levels && - last_level_nr < leveldir_current->last_level && - !network_playing) + else if (scores.continue_playing) { StartGameActions(network.enabled, setup.autorecord, level.random_seed); } @@ -5151,7 +5152,8 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry, } } - return -1; + // special case: new score is beyond the last high score list position + return MAX_SCORE_ENTRIES; } void NewHighScore(int level_nr, boolean tape_saved) @@ -5169,6 +5171,19 @@ void NewHighScore(int level_nr, boolean tape_saved) scores.last_added = addScoreEntry(&scores, &new_entry, one_per_name); + if (scores.last_added >= MAX_SCORE_ENTRIES) + { + scores.last_added = MAX_SCORE_ENTRIES - 1; + scores.force_last_added = TRUE; + + scores.entry[scores.last_added] = new_entry; + + // store last added local score entry (before merging server scores) + scores.last_added_local = scores.last_added; + + return; + } + if (scores.last_added < 0) return; @@ -13238,9 +13253,6 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) } } - player->last_jx = jx; - player->last_jy = jy; - if (Tile[jx][jy] == EL_EXIT_OPEN || Tile[jx][jy] == EL_EM_EXIT_OPEN || Tile[jx][jy] == EL_EM_EXIT_OPENING || @@ -13258,6 +13270,9 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) LevelSolved(); } + player->last_jx = jx; + player->last_jy = jy; + // this breaks one level: "machine", level 000 { int move_direction = player->MovDir; @@ -15679,7 +15694,7 @@ void RequestQuitGameExt(boolean skip_request, boolean quick_quit, char *message) SetOverlayActive(FALSE); // door may still be open due to skipped or envelope style request - CloseDoor(DOOR_CLOSE_1); + CloseDoor(score_info_tape_play ? DOOR_CLOSE_ALL : DOOR_CLOSE_1); } if (network.enabled) @@ -15712,7 +15727,7 @@ void RequestQuitGame(boolean escape_key_pressed) boolean quick_quit = ((escape_key_pressed && !ask_on_escape) || level_editor_test_game); boolean skip_request = (game.all_players_gone || !setup.ask_on_quit_game || - quick_quit); + quick_quit || score_info_tape_play); RequestQuitGameExt(skip_request, quick_quit, "Do you really want to quit the game?");