/** * Enters a players name on a hi-score table, if "legal". * * Assumes "signals_ignore_tstp()" has been called. */ void enter_score(time_t *death_time) { int j; /* Cheaters are not scored */ for (j = 0; j < OPT_MAX; ++j) { if (option_type(j) != OP_SCORE) continue; if (!player->opts.opt[j]) continue; msg("Score not registered for cheaters."); event_signal(EVENT_MESSAGE_FLUSH); return; } /* Add a new entry, if allowed */ if (player->noscore & (NOSCORE_WIZARD | NOSCORE_DEBUG)) { msg("Score not registered for wizards."); event_signal(EVENT_MESSAGE_FLUSH); } else if (!player->total_winner && streq(player->died_from, "Interrupting")) { msg("Score not registered due to interruption."); event_signal(EVENT_MESSAGE_FLUSH); } else if (!player->total_winner && streq(player->died_from, "Quitting")) { msg("Score not registered due to quitting."); event_signal(EVENT_MESSAGE_FLUSH); } else { high_score entry; high_score scores[MAX_HISCORES]; build_score(&entry, player->died_from, death_time); highscore_read(scores, N_ELEMENTS(scores)); highscore_add(&entry, scores, N_ELEMENTS(scores)); highscore_write(scores, N_ELEMENTS(scores)); } /* Success */ return; }
/* * Actually place an entry into the high score file * Return the location (0 is best) or -1 on "failure" */ static int highscore_add(high_score *score) { int i, slot; bool done = FALSE; high_score the_score, tmpscore; /* Paranoia -- it may not have opened */ if (highscore_fd < 0) return (-1); /* Determine where the score should go */ slot = highscore_where(score); /* Hack -- Not on the list */ if (slot < 0) return (-1); /* Hack -- prepare to dump the new score */ the_score = (*score); /* Slide all the scores down one */ for (i = slot; !done && (i < MAX_HISCORES); i++) { /* Read the old guy, note errors */ if (highscore_seek(i)) return (-1); if (highscore_read(&tmpscore)) done = TRUE; /* Back up and dump the score we were holding */ if (highscore_seek(i)) return (-1); if (highscore_write(&the_score)) return (-1); /* Hack -- Save the old score, for the next pass */ the_score = tmpscore; } /* Return location used */ return (slot); }
/* * Enters a players name on a hi-score table, if "legal". * * Assumes "signals_ignore_tstp()" has been called. */ void enter_score(time_t *death_time) { int j; /* Cheaters are not scored */ for (j = OPT_SCORE; j < OPT_MAX; ++j) { if (!op_ptr->opt[j]) continue; msg_print("Score not registered for cheaters."); message_flush(); return; } /* Wizard-mode pre-empts scoring */ if (p_ptr->noscore & (NOSCORE_WIZARD | NOSCORE_DEBUG)) { msg_print("Score not registered for wizards."); message_flush(); } #ifndef SCORE_BORGS /* Borg-mode pre-empts scoring */ else if (p_ptr->noscore & NOSCORE_BORG) { msg_print("Score not registered for borgs."); message_flush(); } #endif /* SCORE_BORGS */ /* Hack -- Interupted */ else if (!p_ptr->total_winner && streq(p_ptr->died_from, "Interrupting")) { msg_print("Score not registered due to interruption."); message_flush(); } /* Hack -- Quitter */ else if (!p_ptr->total_winner && streq(p_ptr->died_from, "Quitting")) { msg_print("Score not registered due to quitting."); message_flush(); } /* Add a new entry to the score list, see where it went */ else { high_score entry; high_score scores[MAX_HISCORES]; build_score(&entry, p_ptr->died_from, death_time); highscore_read(scores, N_ELEMENTS(scores)); highscore_add(&entry, scores, N_ELEMENTS(scores)); highscore_write(scores, N_ELEMENTS(scores)); } /* Success */ return; }