X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=70aa13f400166aa87d9ba9c06801675f11a78cc8;hb=07158159ab00f9fbbd3591a692370933cd1bc418;hp=b85dbcae9861dfcae7df2d211ed5a51e2aeba768;hpb=edfb8a9789e107ac11ad76e456bb0f7c2a943ffa;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index b85dbcae..70aa13f4 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; @@ -5005,7 +5004,7 @@ void GameEnd(void) } // save score and score tape before potentially erasing tape below - highlight_position = NewHighScore(last_level_nr); + NewHighScore(last_level_nr); if (setup.increment_levels && level_nr < leveldir_current->last_level && @@ -5022,11 +5021,11 @@ void GameEnd(void) } } - 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 && @@ -5042,12 +5041,12 @@ void GameEnd(void) } } -static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry) +static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry, + boolean one_score_entry_per_name) { - boolean one_score_entry_per_name = !program.many_scores_per_name; int i; - if (strEqual(setup.player_name, EMPTY_PLAYER_NAME)) + if (strEqual(new_entry->name, EMPTY_PLAYER_NAME)) return -1; for (i = 0; i < MAX_SCORE_ENTRIES; i++) @@ -5066,6 +5065,12 @@ 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 + // (special case: historic score entries have an empty tape basename entry) + if (strEqual(new_entry->tape_basename, entry->tape_basename) && + !strEqual(new_entry->tape_basename, UNDEFINED_FILENAME)) + return -1; + if (is_better || entry_is_empty) { // player has made it to the hall of fame @@ -5078,7 +5083,7 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry) if (one_score_entry_per_name) { for (l = i; l < MAX_SCORE_ENTRIES; l++) - if (strEqual(list->entry[l].name, setup.player_name)) + if (strEqual(list->entry[l].name, new_entry->name)) m = l; if (m == i) // player's new highscore overwrites his old one @@ -5096,7 +5101,7 @@ static int addScoreEntry(struct ScoreInfo *list, struct ScoreEntry *new_entry) return i; } else if (one_score_entry_per_name && - strEqual(entry->name, setup.player_name)) + strEqual(entry->name, new_entry->name)) { // player already in high score list with better score or time @@ -5107,9 +5112,10 @@ 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) + boolean one_per_name = !program.many_scores_per_name; strncpy(new_entry.tape_basename, tape.score_tape_basename, MAX_FILENAME_LEN); strncpy(new_entry.name, setup.player_name, MAX_PLAYER_NAME_LEN); @@ -5119,17 +5125,38 @@ int NewHighScore(int level_nr) LoadScore(level_nr); - int position = addScoreEntry(&scores, &new_entry); + scores.last_added = addScoreEntry(&scores, &new_entry, one_per_name); - if (position >= 0) + if (scores.last_added >= 0) { SaveScore(level_nr); if (game.LevelSolved_SaveTape) + { SaveScoreTape(level_nr); + SaveServerScore(level_nr); + } + + // store last added local score entry (before merging server scores) + scores.last_added_local = scores.last_added; + } +} + +void MergeServerScore(void) +{ + boolean one_per_name = !program.many_scores_per_name; + int i; + + for (i = 0; i < server_scores.num_entries; i++) + { + int pos = addScoreEntry(&scores, &server_scores.entry[i], one_per_name); + + 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)