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);
game.wind_direction = level.wind_direction_initial;
game.time_final = 0;
+ game.score_time_final = 0;
game.score = 0;
game.score_final = 0;
game.LevelSolved = TRUE;
game.GameOver = TRUE;
-
- game.time_final = (game.no_time_limit ? TimePlayed : TimeLeft);
- game.score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
- game_em.lev->score :
- level.game_engine_type == GAME_ENGINE_TYPE_MM ?
- game_mm.score :
- game.score);
- game.health_final = (level.game_engine_type == GAME_ENGINE_TYPE_MM ?
- MM_HEALTH(game_mm.laser_overload_value) :
- game.health);
-
- game.LevelSolved_CountingTime = game.time_final;
- game.LevelSolved_CountingScore = game.score_final;
- game.LevelSolved_CountingHealth = game.health_final;
}
void GameWon(void)
if (local_player->active && local_player->MovPos)
return;
+ game.time_final = (game.no_time_limit ? TimePlayed : TimeLeft);
+ game.score_time_final = (level.use_step_counter ? TimePlayed :
+ TimePlayed * FRAMES_PER_SECOND + TimeFrames);
+
+ game.score_final = (level.game_engine_type == GAME_ENGINE_TYPE_EM ?
+ game_em.lev->score :
+ level.game_engine_type == GAME_ENGINE_TYPE_MM ?
+ game_mm.score :
+ game.score);
+
+ game.health_final = (level.game_engine_type == GAME_ENGINE_TYPE_MM ?
+ MM_HEALTH(game_mm.laser_overload_value) :
+ game.health);
+
+ game.LevelSolved_CountingTime = game.time_final;
+ game.LevelSolved_CountingScore = game.score_final;
+ game.LevelSolved_CountingHealth = game.health_final;
+
game.LevelSolved_GameWon = TRUE;
game.LevelSolved_SaveTape = tape.recording;
game.LevelSolved_SaveScore = !tape.playing;
{
// 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;
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
}
}
- 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 &&
}
}
-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++)
{
- if (game.score_final > scores.entry[k].score)
+ 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);
+ 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 = (entry->score == 0 &&
+ entry->time == 0);
+
+ if (is_better || entry_is_empty)
{
// 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;
+ scores.entry[l].time = scores.entry[l - 1].time;
}
}
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;
- position = k;
+ 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 = i;
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)
+ return position;
+}
+
+int NewHighScore(int level_nr)
+{
+ LoadScore(level_nr);
+
+ int position = addScoreEntry();
+
+ if (position >= 0)
+ {
+ SaveScoreTape(level_nr);
SaveScore(level_nr);
+ }
return position;
}
RemovePlayer(player);
}
- if (!game.LevelSolved && level.use_step_counter)
+ if (level.use_step_counter)
{
int i;
{
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]);
}