X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=f783c164f8f0187e3bf438c03a8562332121410d;hb=543e97b9c93b941f02cad4ad3b9bd3f480978859;hp=d7ba00f66daf12a950114f8fb1b27413526c6617;hpb=2140fc8d3c1dcb0720a13f3ec54619b8f461fbf0;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index d7ba00f6..f783c164 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 NewHighScore(int); +void NewHighScore(int); void TestIfGoodThingHitsBadThing(int, int, int); void TestIfBadThingHitsGoodThing(int, int, int); @@ -4960,7 +4960,6 @@ void GameEnd(void) { // used instead of "level_nr" (needed for network games) int last_level_nr = levelset.level_nr; - int highlight_position; game.LevelSolved_GameEnd = TRUE; @@ -5004,6 +5003,9 @@ void GameEnd(void) SaveLevelSetup_SeriesInfo(); } + // save score and score tape before potentially erasing tape below + NewHighScore(last_level_nr); + if (setup.increment_levels && level_nr < leveldir_current->last_level && !network_playing) @@ -5019,13 +5021,11 @@ void GameEnd(void) } } - highlight_position = NewHighScore(last_level_nr); - - if (highlight_position >= 0 && setup.show_scores_after_game) + if (scores.last_added >= 0 && setup.show_scores_after_game) { SetGameStatus(GAME_MODE_SCORES); - DrawHallOfFame(last_level_nr, highlight_position); + DrawHallOfFame(last_level_nr); } else if (setup.auto_play_next_level && setup.increment_levels && last_level_nr < leveldir_current->last_level && @@ -5065,6 +5065,10 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry) boolean entry_is_empty = (entry->score == 0 && entry->time == 0); + // prevent adding server score entries if also existing in local score file + if (strEqual(new_entry->tape_basename, entry->tape_basename)) + return -1; + if (is_better || entry_is_empty) { // player has made it to the hall of fame @@ -5106,7 +5110,7 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry) return -1; } -int NewHighScore(int level_nr) +void NewHighScore(int level_nr) { struct ScoreEntry new_entry = {{ 0 }}; // (prevent warning from GCC bug 53119) @@ -5118,15 +5122,34 @@ int NewHighScore(int level_nr) LoadScore(level_nr); - int position = addScoreEntry(&scores, &new_entry); + scores.last_added = addScoreEntry(&scores, &new_entry); - if (position >= 0) + if (scores.last_added >= 0) { - SaveScoreTape(level_nr); SaveScore(level_nr); + + if (game.LevelSolved_SaveTape) + { + SaveScoreTape(level_nr); + SaveServerScore(level_nr); + } + } +} + +void MergeServerScore(void) +{ + int i; + + for (i = 0; i < server_scores.num_entries; i++) + { + int pos = addScoreEntry(&scores, &server_scores.entry[i]); + + if (pos >= 0 && pos <= scores.last_added) + scores.last_added++; } - return position; + if (scores.last_added >= MAX_SCORE_ENTRIES) + scores.last_added = -1; } static int getElementMoveStepsizeExt(int x, int y, int direction)