X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/a0bb5b9abf33dc2d2220eb3bd6e79c964e92a1c1..84d25b7fc1866e662d07f1e5d4b17f13c8547fc9:/robots/score.c diff --git a/robots/score.c b/robots/score.c index 400b0f12..62709435 100644 --- a/robots/score.c +++ b/robots/score.c @@ -1,4 +1,4 @@ -/* $NetBSD: score.c,v 1.4 1997/10/12 14:10:05 lukem Exp $ */ +/* $NetBSD: score.c,v 1.18 2006/03/17 23:11:47 abs Exp $ */ /* * Copyright (c) 1980, 1993 @@ -12,11 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -38,57 +34,109 @@ #if 0 static char sccsid[] = "@(#)score.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: score.c,v 1.4 1997/10/12 14:10:05 lukem Exp $"); +__RCSID("$NetBSD: score.c,v 1.18 2006/03/17 23:11:47 abs Exp $"); #endif #endif /* not lint */ # include "robots.h" # include "pathnames.h" -char *Scorefile = _PATH_SCORE; +const char *Scorefile = _PATH_SCORE; int Max_per_uid = MAX_PER_UID; static SCORE Top[MAXSCORES]; +static u_int32_t numscores, max_uid; + +static void read_score(int); +static void write_score(int); + +/* + * read_score: + * Read the score file in MI format + */ +static void +read_score(inf) + int inf; +{ + SCORE *scp; + + if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) { + max_uid = ntohl(max_uid); + + read(inf, Top, sizeof Top); + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { + scp->s_uid = ntohl(scp->s_uid); + scp->s_score = ntohl(scp->s_score); + scp->s_auto = ntohl(scp->s_auto); + scp->s_level = ntohl(scp->s_level); + } + } + else { + for (scp = Top; scp < &Top[MAXSCORES]; scp++) + scp->s_score = 0; + max_uid = Max_per_uid; + } +} + +/* + * write_score: + * Write the score file in MI format + */ +static void +write_score(inf) + int inf; +{ + SCORE *scp; + + lseek(inf, 0L, SEEK_SET); + + max_uid = htonl(max_uid); + write(inf, &max_uid, sizeof max_uid); + + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { + scp->s_uid = htonl(scp->s_uid); + scp->s_score = htonl(scp->s_score); + scp->s_auto = htonl(scp->s_auto); + scp->s_level = htonl(scp->s_level); + } + + write(inf, Top, sizeof Top); +} + + /* * score: * Post the player's score, if reasonable, and then print out the * top list. */ void -score() +score(score_wfd) + int score_wfd; { - int inf; - SCORE *scp; - int uid; - bool done_show = FALSE; - static int numscores, max_uid; + int inf = score_wfd; + SCORE *scp; + u_int32_t uid; + bool done_show = FALSE; Newscore = FALSE; - if ((inf = open(Scorefile, 2)) < 0) { - perror(Scorefile); + if (inf < 0) return; - } - if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) - read(inf, Top, sizeof Top); - else { - for (scp = Top; scp < &Top[MAXSCORES]; scp++) - scp->s_score = -1; - max_uid = Max_per_uid; - } + read_score(inf); uid = getuid(); if (Top[MAXSCORES-1].s_score <= Score) { numscores = 0; for (scp = Top; scp < &Top[MAXSCORES]; scp++) - if (scp->s_score < 0 || - (scp->s_uid == uid && ++numscores == max_uid)) { + if ((scp->s_uid == uid && ++numscores == max_uid)) { if (scp->s_score > Score) break; scp->s_score = Score; scp->s_uid = uid; + scp->s_auto = Auto_bot; + scp->s_level = Level; set_name(scp); Newscore = TRUE; break; @@ -96,6 +144,8 @@ score() if (scp == &Top[MAXSCORES]) { Top[MAXSCORES-1].s_score = Score; Top[MAXSCORES-1].s_uid = uid; + Top[MAXSCORES-1].s_auto = Auto_bot; + Top[MAXSCORES-1].s_level = Level; set_name(&Top[MAXSCORES-1]); Newscore = TRUE; } @@ -105,19 +155,25 @@ score() if (!Newscore) { Full_clear = FALSE; - close(inf); + lseek(inf, 0, SEEK_SET); return; } else Full_clear = TRUE; + move(1, 15); + printw("%5.5s %5.5s %-9.9s %-8.8s %5.5s", "Rank", "Score", "User", + " ", "Level"); + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { - if (scp->s_score < 0) + if (scp->s_score == 0) break; - move((scp - Top) + 1, 15); + move((scp - Top) + 2, 15); if (!done_show && scp->s_uid == uid && scp->s_score == Score) standout(); - printw(" %d\t%d\t%-8.8s ", (scp - Top) + 1, scp->s_score, scp->s_name); + printw("%5ld %5d %-8.8s %-9.9s %5d", + (long)(scp - Top) + 1, scp->s_score, scp->s_name, + scp->s_auto ? "(autobot)" : "", scp->s_level); if (!done_show && scp->s_uid == uid && scp->s_score == Score) { standend(); done_show = TRUE; @@ -127,11 +183,9 @@ score() refresh(); if (Newscore) { - lseek(inf, 0L, 0); - write(inf, &max_uid, sizeof max_uid); - write(inf, Top, sizeof Top); + write_score(inf); } - close(inf); + lseek(inf, 0, SEEK_SET); } void @@ -141,8 +195,9 @@ set_name(scp) PASSWD *pp; if ((pp = getpwuid(scp->s_uid)) == NULL) - pp->pw_name = "???"; - strncpy(scp->s_name, pp->pw_name, MAXNAME); + strncpy(scp->s_name, "???", MAXNAME); + else + strncpy(scp->s_name, pp->pw_name, MAXNAME); } /* @@ -153,7 +208,7 @@ int cmp_sc(s1, s2) const void *s1, *s2; { - return ((SCORE *)s2)->s_score - ((SCORE *)s1)->s_score; + return ((const SCORE *)s2)->s_score - ((const SCORE *)s1)->s_score; } /* @@ -165,22 +220,20 @@ show_score() { SCORE *scp; int inf; - static int max_score; - if ((inf = open(Scorefile, 0)) < 0) { - perror(Scorefile); + if ((inf = open(Scorefile, O_RDONLY)) < 0) { + warn("opening `%s'", Scorefile); return; } - for (scp = Top; scp < &Top[MAXSCORES]; scp++) - scp->s_score = -1; - - read(inf, &max_score, sizeof max_score); - read(inf, Top, sizeof Top); + read_score(inf); close(inf); inf = 1; + printf("%5.5s %5.5s %-9.9s %-8.8s %5.5s\n", "Rank", "Score", "User", + " ", "Level"); for (scp = Top; scp < &Top[MAXSCORES]; scp++) - if (scp->s_score >= 0) - printf("%d\t%d\t%.*s\n", inf++, scp->s_score, - (int)(sizeof(scp->s_name)), scp->s_name); + if (scp->s_score > 0) + printf("%5d %5d %-8.8s %-9.9s %5d\n", + inf++, scp->s_score, scp->s_name, + scp->s_auto ? "(autobot)" : "", scp->s_level); }