diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /games/robots/score.c |
initial import of NetBSD tree
Diffstat (limited to 'games/robots/score.c')
-rw-r--r-- | games/robots/score.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/games/robots/score.c b/games/robots/score.c new file mode 100644 index 00000000000..d96c8dff50b --- /dev/null +++ b/games/robots/score.c @@ -0,0 +1,190 @@ +/* $NetBSD: score.c,v 1.3 1995/04/22 10:09:12 cgd Exp $ */ + +/* + * 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 + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 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 + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)score.c 8.1 (Berkeley) 5/31/93"; +#else +static char rcsid[] = "$NetBSD: score.c,v 1.3 1995/04/22 10:09:12 cgd Exp $"; +#endif +#endif /* not lint */ + +# include "robots.h" +# include <sys/types.h> +# include <pwd.h> +# include "pathnames.h" + +typedef struct { + int s_uid; + int s_score; + char s_name[MAXNAME]; +} SCORE; + +typedef struct passwd PASSWD; + +char *Scorefile = _PATH_SCORE; + +int Max_per_uid = MAX_PER_UID; + +static SCORE Top[MAXSCORES]; + +/* + * score: + * Post the player's score, if reasonable, and then print out the + * top list. + */ +score() +{ + register int inf; + register SCORE *scp; + register int uid; + register bool done_show = FALSE; + static int numscores, max_uid; + + Newscore = FALSE; + if ((inf = open(Scorefile, 2)) < 0) { + perror(Scorefile); + 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; + } + + 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_score > Score) + break; + scp->s_score = Score; + scp->s_uid = uid; + set_name(scp); + Newscore = TRUE; + break; + } + if (scp == &Top[MAXSCORES]) { + Top[MAXSCORES-1].s_score = Score; + Top[MAXSCORES-1].s_uid = uid; + set_name(&Top[MAXSCORES-1]); + Newscore = TRUE; + } + if (Newscore) + qsort(Top, MAXSCORES, sizeof Top[0], cmp_sc); + } + + if (!Newscore) { + Full_clear = FALSE; + close(inf); + return; + } + else + Full_clear = TRUE; + + for (scp = Top; scp < &Top[MAXSCORES]; scp++) { + if (scp->s_score < 0) + break; + move((scp - Top) + 1, 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); + if (!done_show && scp->s_uid == uid && scp->s_score == Score) { + standend(); + done_show = TRUE; + } + } + Num_scores = scp - Top; + refresh(); + + if (Newscore) { + lseek(inf, 0L, 0); + write(inf, &max_uid, sizeof max_uid); + write(inf, Top, sizeof Top); + } + close(inf); +} + +set_name(scp) +register SCORE *scp; +{ + register PASSWD *pp; + + if ((pp = getpwuid(scp->s_uid)) == NULL) + pp->pw_name = "???"; + strncpy(scp->s_name, pp->pw_name, MAXNAME); +} + +/* + * cmp_sc: + * Compare two scores. + */ +cmp_sc(s1, s2) +register SCORE *s1, *s2; +{ + return s2->s_score - s1->s_score; +} + +/* + * show_score: + * Show the score list for the '-s' option. + */ +show_score() +{ + register SCORE *scp; + register int inf; + static int max_score; + + if ((inf = open(Scorefile, 0)) < 0) { + perror(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); + close(inf); + inf = 1; + 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); +} |