xref: /csrg-svn/games/robots/score.c (revision 21473)
1*21473Smckusick /*
2*21473Smckusick  * Copyright (c) 1980 Regents of the University of California.
3*21473Smckusick  * All rights reserved.  The Berkeley software License Agreement
4*21473Smckusick  * specifies the terms and conditions for redistribution.
5*21473Smckusick  */
6*21473Smckusick 
7*21473Smckusick #ifndef lint
8*21473Smckusick static char sccsid[] = "@(#)score.c	5.1 (Berkeley) 05/30/85";
9*21473Smckusick #endif not lint
10*21473Smckusick 
11*21473Smckusick # include	"robots.h"
12*21473Smckusick # include	<pwd.h>
13*21473Smckusick 
14*21473Smckusick typedef struct {
15*21473Smckusick 	int	s_uid;
16*21473Smckusick 	int	s_score;
17*21473Smckusick 	char	s_name[MAXNAME];
18*21473Smckusick } SCORE;
19*21473Smckusick 
20*21473Smckusick typedef struct passwd	PASSWD;
21*21473Smckusick 
22*21473Smckusick char	*Scorefile = SCOREFILE;
23*21473Smckusick 
24*21473Smckusick int	Max_per_uid = MAX_PER_UID;
25*21473Smckusick 
26*21473Smckusick static SCORE	Top[MAXSCORES];
27*21473Smckusick 
28*21473Smckusick /*
29*21473Smckusick  * score:
30*21473Smckusick  *	Post the player's score, if reasonable, and then print out the
31*21473Smckusick  *	top list.
32*21473Smckusick  */
33*21473Smckusick score()
34*21473Smckusick {
35*21473Smckusick 	register int	inf;
36*21473Smckusick 	register SCORE	*scp;
37*21473Smckusick 	register int	uid;
38*21473Smckusick 	register bool	done_show = FALSE;
39*21473Smckusick 	static int	numscores, max_uid;
40*21473Smckusick 
41*21473Smckusick 	Newscore = FALSE;
42*21473Smckusick 	if ((inf = open(Scorefile, 2)) < 0) {
43*21473Smckusick 		perror(Scorefile);
44*21473Smckusick 		return;
45*21473Smckusick 	}
46*21473Smckusick 
47*21473Smckusick 	if (read(inf, &max_uid, sizeof max_uid) == sizeof max_uid)
48*21473Smckusick 		read(inf, Top, sizeof Top);
49*21473Smckusick 	else {
50*21473Smckusick 		for (scp = Top; scp < &Top[MAXSCORES]; scp++)
51*21473Smckusick 			scp->s_score = -1;
52*21473Smckusick 		max_uid = Max_per_uid;
53*21473Smckusick 	}
54*21473Smckusick 
55*21473Smckusick 	uid = getuid();
56*21473Smckusick 	if (Top[MAXSCORES-1].s_score <= Score) {
57*21473Smckusick 		numscores = 0;
58*21473Smckusick 		for (scp = Top; scp < &Top[MAXSCORES]; scp++)
59*21473Smckusick 			if (scp->s_score < 0 ||
60*21473Smckusick 			    (scp->s_uid == uid && ++numscores == max_uid)) {
61*21473Smckusick 				if (scp->s_score > Score)
62*21473Smckusick 					break;
63*21473Smckusick 				scp->s_score = Score;
64*21473Smckusick 				scp->s_uid = uid;
65*21473Smckusick 				set_name(scp);
66*21473Smckusick 				Newscore = TRUE;
67*21473Smckusick 				break;
68*21473Smckusick 			}
69*21473Smckusick 		if (scp == &Top[MAXSCORES]) {
70*21473Smckusick 			Top[MAXSCORES-1].s_score = Score;
71*21473Smckusick 			Top[MAXSCORES-1].s_uid = uid;
72*21473Smckusick 			set_name(&Top[MAXSCORES-1]);
73*21473Smckusick 			Newscore = TRUE;
74*21473Smckusick 		}
75*21473Smckusick 		if (Newscore)
76*21473Smckusick 			qsort(Top, MAXSCORES, sizeof Top[0], cmp_sc);
77*21473Smckusick 	}
78*21473Smckusick 
79*21473Smckusick 	if (!Newscore) {
80*21473Smckusick 		Full_clear = FALSE;
81*21473Smckusick 		close(inf);
82*21473Smckusick 		return;
83*21473Smckusick 	}
84*21473Smckusick 	else
85*21473Smckusick 		Full_clear = TRUE;
86*21473Smckusick 
87*21473Smckusick 	for (scp = Top; scp < &Top[MAXSCORES]; scp++) {
88*21473Smckusick 		if (scp->s_score < 0)
89*21473Smckusick 			break;
90*21473Smckusick 		move((scp - Top) + 1, 15);
91*21473Smckusick 		if (!done_show && scp->s_uid == uid && scp->s_score == Score)
92*21473Smckusick 			standout();
93*21473Smckusick 		printw(" %d\t%d\t%-8.8s ", (scp - Top) + 1, scp->s_score, scp->s_name);
94*21473Smckusick 		if (!done_show && scp->s_uid == uid && scp->s_score == Score) {
95*21473Smckusick 			standend();
96*21473Smckusick 			done_show = TRUE;
97*21473Smckusick 		}
98*21473Smckusick 	}
99*21473Smckusick 	Num_scores = scp - Top;
100*21473Smckusick 	refresh();
101*21473Smckusick 
102*21473Smckusick 	if (Newscore) {
103*21473Smckusick 		lseek(inf, 0L, 0);
104*21473Smckusick 		write(inf, &max_uid, sizeof max_uid);
105*21473Smckusick 		write(inf, Top, sizeof Top);
106*21473Smckusick 	}
107*21473Smckusick 	close(inf);
108*21473Smckusick }
109*21473Smckusick 
110*21473Smckusick set_name(scp)
111*21473Smckusick register SCORE	*scp;
112*21473Smckusick {
113*21473Smckusick 	register PASSWD	*pp;
114*21473Smckusick 
115*21473Smckusick 	if ((pp = getpwuid(scp->s_uid)) == NULL)
116*21473Smckusick 		pp->pw_name = "???";
117*21473Smckusick 	strncpy(scp->s_name, pp->pw_name, MAXNAME);
118*21473Smckusick }
119*21473Smckusick 
120*21473Smckusick /*
121*21473Smckusick  * cmp_sc:
122*21473Smckusick  *	Compare two scores.
123*21473Smckusick  */
124*21473Smckusick cmp_sc(s1, s2)
125*21473Smckusick register SCORE	*s1, *s2;
126*21473Smckusick {
127*21473Smckusick 	return s2->s_score - s1->s_score;
128*21473Smckusick }
129*21473Smckusick 
130*21473Smckusick /*
131*21473Smckusick  * show_score:
132*21473Smckusick  *	Show the score list for the '-s' option.
133*21473Smckusick  */
134*21473Smckusick show_score()
135*21473Smckusick {
136*21473Smckusick 	register SCORE	*scp;
137*21473Smckusick 	register int	inf;
138*21473Smckusick 	static int	max_score;
139*21473Smckusick 
140*21473Smckusick 	if ((inf = open(Scorefile, 0)) < 0) {
141*21473Smckusick 		perror(Scorefile);
142*21473Smckusick 		return;
143*21473Smckusick 	}
144*21473Smckusick 
145*21473Smckusick 	for (scp = Top; scp < &Top[MAXSCORES]; scp++)
146*21473Smckusick 		scp->s_score = -1;
147*21473Smckusick 
148*21473Smckusick 	read(inf, &max_score, sizeof max_score);
149*21473Smckusick 	read(inf, Top, sizeof Top);
150*21473Smckusick 	close(inf);
151*21473Smckusick 	inf = 1;
152*21473Smckusick 	for (scp = Top; scp < &Top[MAXSCORES]; scp++)
153*21473Smckusick 		if (scp->s_score >= 0)
154*21473Smckusick 			printf("%d\t%d\t%.*s\n", inf++, scp->s_score, sizeof scp->s_name, scp->s_name);
155*21473Smckusick }
156