X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=21b4b82bdbf0e316e821ffe87122152b86f29fe6;hb=4886496a94259950ec6e62bbad4d67784b5d2d2d;hp=1b32c1ecfe4c3caf25dbb1fe808717ea859f936c;hpb=c241a28eeb51bbb04799737005f2d21d98e983ef;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 1b32c1ec..21b4b82b 100644 --- a/src/game.c +++ b/src/game.c @@ -1106,7 +1106,7 @@ void ContinueMoving(int, int); void Bang(int, int); void InitMovDir(int, int); void InitAmoebaNr(int, int); -int NewHiScore(int); +int NewHighScore(int); void TestIfGoodThingHitsBadThing(int, int, int); void TestIfBadThingHitsGoodThing(int, int, int); @@ -4960,7 +4960,7 @@ void GameEnd(void) { // used instead of "level_nr" (needed for network games) int last_level_nr = levelset.level_nr; - int hi_pos; + int highlight_position; game.LevelSolved_GameEnd = TRUE; @@ -4971,6 +4971,9 @@ void GameEnd(void) CloseDoor(DOOR_CLOSE_1); SaveTapeChecked_LevelSolved(tape.level_nr); // ask to save tape + + // set unique basename for score tape (also saved in high score table) + strcpy(tape.score_tape_basename, getScoreTapeBasename(setup.player_name)); } // if no tape is to be saved, close both doors simultaneously @@ -5016,13 +5019,13 @@ void GameEnd(void) } } - hi_pos = NewHiScore(last_level_nr); + highlight_position = NewHighScore(last_level_nr); - if (hi_pos >= 0 && setup.show_scores_after_game) + if (highlight_position >= 0 && setup.show_scores_after_game) { SetGameStatus(GAME_MODE_SCORES); - DrawHallOfFame(last_level_nr, hi_pos); + DrawHallOfFame(last_level_nr, highlight_position); } else if (setup.auto_play_next_level && setup.increment_levels && last_level_nr < leveldir_current->last_level && @@ -5038,21 +5041,19 @@ void GameEnd(void) } } -int NewHiScore(int level_nr) +static int addScoreEntry(void) { - int k, l; + int i, l; int position = -1; boolean one_score_entry_per_name = !program.many_scores_per_name; - LoadScore(level_nr); - if (strEqual(setup.player_name, EMPTY_PLAYER_NAME) || game.score_final < scores.entry[MAX_SCORE_ENTRIES - 1].score) return -1; - for (k = 0; k < MAX_SCORE_ENTRIES; k++) + for (i = 0; i < MAX_SCORE_ENTRIES; i++) { - struct ScoreEntry *entry = &scores.entry[k]; + struct ScoreEntry *entry = &scores.entry[i]; boolean score_is_better = (game.score_final > entry->score); boolean score_is_equal = (game.score_final == entry->score); boolean time_is_better = (game.score_time_final < entry->time); @@ -5070,21 +5071,21 @@ int NewHiScore(int level_nr) { // player has made it to the hall of fame - if (k < MAX_SCORE_ENTRIES - 1) + if (i < MAX_SCORE_ENTRIES - 1) { int m = MAX_SCORE_ENTRIES - 1; if (one_score_entry_per_name) { - for (l = k; l < MAX_SCORE_ENTRIES; l++) + for (l = i; l < MAX_SCORE_ENTRIES; l++) if (strEqual(setup.player_name, scores.entry[l].name)) m = l; - if (m == k) // player's new highscore overwrites his old one + if (m == i) // player's new highscore overwrites his old one goto put_into_list; } - for (l = m; l > k; l--) + for (l = m; l > i; l--) { strcpy(scores.entry[l].name, scores.entry[l - 1].name); scores.entry[l].score = scores.entry[l - 1].score; @@ -5094,11 +5095,12 @@ int NewHiScore(int level_nr) put_into_list: + strcpy(entry->tape_basename, tape.score_tape_basename); strncpy(entry->name, setup.player_name, MAX_PLAYER_NAME_LEN); entry->name[MAX_PLAYER_NAME_LEN] = '\0'; entry->score = game.score_final; entry->time = game.score_time_final; - position = k; + position = i; break; } @@ -5107,8 +5109,20 @@ int NewHiScore(int level_nr) break; // player already there with a higher score } - if (position >= 0) + return position; +} + +int NewHighScore(int level_nr) +{ + LoadScore(level_nr); + + int position = addScoreEntry(); + + if (position >= 0) + { + SaveScoreTape(level_nr); SaveScore(level_nr); + } return position; }