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;
for (k = 0; k < MAX_SCORE_ENTRIES; k++)
{
- if (game.score_final > scores.entry[k].score)
+ 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);
+ 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);
+
+ if (is_better || entry_is_empty)
{
// player has made it to the hall of fame
{
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;
}
}
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;
position = k;
break;
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]);
}