X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/462fca95471224f85b85be911e72faee16cd1597..3c48fe193d2fb7c927c2c9d1dbf76707e657a9fd:/robots/score.c diff --git a/robots/score.c b/robots/score.c index e4c413f6..4c87bd4e 100644 --- a/robots/score.c +++ b/robots/score.c @@ -1,6 +1,8 @@ +/* $NetBSD: score.c,v 1.17 2004/01/27 20:30:30 jsm Exp $ */ + /* - * Copyright (c) 1980 Regents of the University of California. - * All rights reserved. + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,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. * @@ -31,67 +29,114 @@ * SUCH DAMAGE. */ +#include #ifndef lint -/*static char sccsid[] = "from: @(#)score.c 5.6 (Berkeley) 6/1/90";*/ -static char rcsid[] = "$Id: score.c,v 1.2 1993/08/01 18:52:38 mycroft Exp $"; +#if 0 +static char sccsid[] = "@(#)score.c 8.1 (Berkeley) 5/31/93"; +#else +__RCSID("$NetBSD: score.c,v 1.17 2004/01/27 20:30:30 jsm Exp $"); +#endif #endif /* not lint */ # include "robots.h" -# include -# include # include "pathnames.h" -typedef struct { - int s_uid; - int s_score; - char s_name[MAXNAME]; -} SCORE; - -typedef struct passwd PASSWD; - -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); + /* - * score: - * Post the player's score, if reasonable, and then print out the - * top list. + * read_score: + * Read the score file in MI format */ -score() +static void +read_score(inf) + int inf; { - register int inf; - register SCORE *scp; - register int uid; - register bool done_show = FALSE; - static int numscores, max_uid; + SCORE *scp; - Newscore = FALSE; - if ((inf = open(Scorefile, 2)) < 0) { - perror(Scorefile); - return; - } + if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid) { + max_uid = ntohl(max_uid); - if (read(inf, &max_uid, sizeof max_uid) == sizeof 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 = -1; + 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_wfd) + int score_wfd; +{ + int inf = score_wfd; + SCORE *scp; + u_int32_t uid; + bool done_show = FALSE; + + Newscore = FALSE; + if (inf < 0) + return; + + 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; @@ -99,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; } @@ -108,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; @@ -130,20 +183,20 @@ 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 set_name(scp) -register SCORE *scp; + SCORE *scp; { - register PASSWD *pp; + PASSWD *pp; + static char unknown[] = "???"; if ((pp = getpwuid(scp->s_uid)) == NULL) - pp->pw_name = "???"; + pp->pw_name = unknown; strncpy(scp->s_name, pp->pw_name, MAXNAME); } @@ -151,35 +204,36 @@ register SCORE *scp; * cmp_sc: * Compare two scores. */ +int cmp_sc(s1, s2) -register SCORE *s1, *s2; + const void *s1, *s2; { - return s2->s_score - s1->s_score; + return ((const SCORE *)s2)->s_score - ((const SCORE *)s1)->s_score; } /* * show_score: * Show the score list for the '-s' option. */ +void show_score() { - register SCORE *scp; - register int inf; - static int max_score; + SCORE *scp; + int inf; - 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, 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); }