]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/mille/mille.c
This commit was generated by cvs2svn to compensate for changes in r76866,
[FreeBSD/FreeBSD.git] / games / mille / mille.c
1 /*
2  * Copyright (c) 1982, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * $FreeBSD$
34  */
35
36 #ifndef lint
37 static const char copyright[] =
38 "@(#) Copyright (c) 1982, 1993\n\
39         The Regents of the University of California.  All rights reserved.\n";
40 #endif /* not lint */
41
42 #ifndef lint
43 #if 0
44 static char sccsid[] = "@(#)mille.c     8.1 (Berkeley) 5/31/93";
45 #else
46 static const char rcsid[] =
47   "$FreeBSD$";
48 #endif
49 #endif /* not lint */
50
51 # include       "mille.h"
52 # include       <signal.h>
53 # ifdef attron
54 #       include <term.h>
55 # endif attron
56
57 /*
58  * @(#)mille.c  1.3 (Berkeley) 5/10/83
59  */
60
61 static void usage __P((void));
62
63 int
64 main(ac, av)
65         int     ac;
66         char    *av[]; {
67
68         bool    restore;
69
70         /* revoke */
71         setgid(getgid());
72
73         if (strcmp(av[0], "a.out") == 0) {
74                 outf = fopen("q", "w");
75                 setbuf(outf, (char *)NULL);
76                 Debug = TRUE;
77         }
78         restore = FALSE;
79         switch (ac) {
80           case 2:
81                 rest_f(av[1]);
82                 restore = TRUE;
83           case 1:
84                 break;
85           default:
86                 usage();
87                 /* NOTREACHED */
88         }
89         Play = PLAYER;
90         initscr();
91         delwin(stdscr);
92         stdscr = Board = newwin(BOARD_Y, BOARD_X, 0, 0);
93         Score = newwin(SCORE_Y, SCORE_X, 0, 40);
94         Miles = newwin(MILES_Y, MILES_X, 17, 0);
95 #ifdef attron
96         idlok(Board, TRUE);
97         idlok(Score, TRUE);
98         idlok(Miles, TRUE);
99 #endif
100         leaveok(Score, TRUE);
101         leaveok(Miles, TRUE);
102         clearok(curscr, TRUE);
103         srandomdev();
104         crmode();
105         noecho();
106         signal(SIGINT, rub);
107         for (;;) {
108                 if (!restore || (Player[PLAYER].total >= 5000
109                     || Player[COMP].total >= 5000)) {
110                         if (Player[COMP].total < Player[PLAYER].total)
111                                 Player[PLAYER].games++;
112                         else if (Player[COMP].total > Player[PLAYER].total)
113                                 Player[COMP].games++;
114                         Player[COMP].total = 0;
115                         Player[PLAYER].total = 0;
116                 }
117                 do {
118                         if (!restore)
119                                 Handstart = Play = other(Handstart);
120                         if (!restore || On_exit) {
121                                 shuffle();
122                                 init();
123                         }
124                         newboard();
125                         if (restore)
126                                 mvwaddstr(Score, ERR_Y, ERR_X, Initstr);
127                         prboard();
128                         do {
129                                 domove();
130                                 if (Finished)
131                                         newscore();
132                                 prboard();
133                         } while (!Finished);
134                         check_more();
135                         restore = On_exit = FALSE;
136                 } while (Player[COMP].total < 5000
137                     && Player[PLAYER].total < 5000);
138         }
139 }
140
141 static void
142 usage()
143 {
144         fprintf(stderr, "usage: mille [restore_file]\n");
145         exit(1);
146 }
147
148 /*
149  *      Routine to trap rubouts, and make sure they really want to
150  * quit.
151  */
152 void
153 rub(sig)
154 int sig; {
155
156         (void)signal(SIGINT, SIG_IGN);
157         if (getyn(REALLYPROMPT))
158                 die(0);
159         (void)signal(SIGINT, rub);
160 }
161
162 /*
163  *      Time to go beddy-by
164  */
165 void
166 die(code)
167 int code; {
168
169         (void)signal(SIGINT, SIG_IGN);
170         if (outf)
171                 fflush(outf);
172         mvcur(0, COLS - 1, LINES - 1, 0);
173         endwin();
174         exit(code);
175 }