]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - robots/score.c
* fixed <ctype> bugs
[bsdgames-darwin.git] / robots / score.c
index e4c413f64eedd9ff79086d5c81c1a98564081d23..4c87bd4ea0b2a40edc167e8ab7a7fefe53f9127a 100644 (file)
@@ -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
  * 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.
  *
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #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      <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;
+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);
 }