X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=2002126623cb737ffc4f103eb36e8d72435e043b;hb=dde5b6f0ddf3293cea59da9ef623ff0f7c94b5c9;hp=2432ab343e0ac2fe0cdc36bc380a32f82ca78643;hpb=ef1162b39495bd80698e6e449060ba82a43ed21c;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 2432ab34..20021266 100644 --- a/src/game.c +++ b/src/game.c @@ -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 @@ -5052,18 +5055,19 @@ int NewHiScore(int level_nr) for (k = 0; k < MAX_SCORE_ENTRIES; k++) { - boolean score_is_better = (game.score_final > scores.entry[k].score); - boolean score_is_equal = (game.score_final == scores.entry[k].score); - boolean time_is_better = (game.score_time_final < scores.entry[k].time); - boolean time_is_equal = (game.score_time_final == scores.entry[k].time); + struct ScoreEntry *entry = &scores.entry[k]; + 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); + boolean time_is_equal = (game.score_time_final == entry->time); boolean better_by_score = (score_is_better || (score_is_equal && time_is_better)); boolean better_by_time = (time_is_better || (time_is_equal && score_is_better)); boolean is_better = (level.rate_time_over_score ? better_by_time : better_by_score); - boolean entry_is_empty = (scores.entry[k].score == 0 && - scores.entry[k].time == 0); + boolean entry_is_empty = (entry->score == 0 && + entry->time == 0); if (is_better || entry_is_empty) { @@ -5093,22 +5097,25 @@ int NewHiScore(int level_nr) put_into_list: - strncpy(scores.entry[k].name, setup.player_name, MAX_PLAYER_NAME_LEN); - scores.entry[k].name[MAX_PLAYER_NAME_LEN] = '\0'; - scores.entry[k].score = game.score_final; - scores.entry[k].time = game.score_time_final; + 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; break; } else if (one_score_entry_per_name && - !strncmp(setup.player_name, scores.entry[k].name, - MAX_PLAYER_NAME_LEN)) + !strncmp(setup.player_name, entry->name, MAX_PLAYER_NAME_LEN)) break; // player already there with a higher score } - if (position >= 0) + if (position >= 0) + { + SaveScoreTape(level_nr); SaveScore(level_nr); + } return position; } @@ -13140,7 +13147,7 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) RemovePlayer(player); } - if (!game.LevelSolved && level.use_step_counter) + if (level.use_step_counter) { int i; @@ -13150,14 +13157,14 @@ void ScrollPlayer(struct PlayerInfo *player, int mode) { TimeLeft--; - if (TimeLeft <= 10 && setup.time_limit) + if (TimeLeft <= 10 && setup.time_limit && !game.LevelSolved) PlaySound(SND_GAME_RUNNING_OUT_OF_TIME); game_panel_controls[GAME_PANEL_TIME].value = TimeLeft; DisplayGameControlValues(); - if (!TimeLeft && setup.time_limit) + if (!TimeLeft && setup.time_limit && !game.LevelSolved) for (i = 0; i < MAX_PLAYERS; i++) KillPlayer(&stored_player[i]); }