xref: /original-bsd/games/mille/mille.c (revision c7ce21e7)
1 /*
2  * Copyright (c) 1982 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 char copyright[] =
20 "@(#) Copyright (c) 1982 Regents of the University of California.\n\
21  All rights reserved.\n";
22 #endif /* not lint */
23 
24 #ifndef lint
25 static char sccsid[] = "@(#)mille.c	5.3 (Berkeley) 06/18/88";
26 #endif /* not lint */
27 
28 # include	"mille.h"
29 # include	<signal.h>
30 # ifdef attron
31 #	include	<term.h>
32 # endif	attron
33 
34 /*
35  * @(#)mille.c	1.3 (Berkeley) 5/10/83
36  */
37 
38 int	rub();
39 
40 main(ac, av)
41 reg int		ac;
42 reg char	*av[]; {
43 
44 	reg bool	restore;
45 
46 	/* run as the user */
47 	setuid(getuid());
48 
49 	if (strcmp(av[0], "a.out") == 0) {
50 		outf = fopen("q", "w");
51 		setbuf(outf, (char *)NULL);
52 		Debug = TRUE;
53 	}
54 	restore = FALSE;
55 	switch (ac) {
56 	  case 2:
57 		rest_f(av[1]);
58 		restore = TRUE;
59 	  case 1:
60 		break;
61 	  default:
62 		printf("usage: milles [ restore_file ]\n");
63 		exit(-1);
64 		/* NOTREACHED */
65 	}
66 	Play = PLAYER;
67 	initscr();
68 # ifdef attron
69 #	define	CA	cursor_address
70 # endif
71 	if (!CA) {
72 		printf("Sorry.  Need cursor addressing to play mille\n");
73 		exit(-1);
74 	}
75 	delwin(stdscr);
76 	stdscr = Board = newwin(BOARD_Y, BOARD_X, 0, 0);
77 	Score = newwin(SCORE_Y, SCORE_X, 0, 40);
78 	Miles = newwin(MILES_Y, MILES_X, 17, 0);
79 #ifdef attron
80 	idlok(Board, TRUE);
81 	idlok(Score, TRUE);
82 	idlok(Miles, TRUE);
83 #endif
84 	leaveok(Score, TRUE);
85 	leaveok(Miles, TRUE);
86 	clearok(curscr, TRUE);
87 # ifndef PROF
88 	srandom(getpid());
89 # else
90 	srandom(0);
91 # endif
92 	crmode();
93 	noecho();
94 	signal(SIGINT, rub);
95 	for (;;) {
96 		if (!restore || (Player[PLAYER].total >= 5000
97 		    || Player[COMP].total >= 5000)) {
98 			if (Player[COMP].total < Player[PLAYER].total)
99 				Player[PLAYER].games++;
100 			else if (Player[COMP].total > Player[PLAYER].total)
101 				Player[COMP].games++;
102 			Player[COMP].total = 0;
103 			Player[PLAYER].total = 0;
104 		}
105 		do {
106 			if (!restore)
107 				Handstart = Play = other(Handstart);
108 			if (!restore || On_exit) {
109 				shuffle();
110 				init();
111 			}
112 			newboard();
113 			if (restore)
114 				mvwaddstr(Score, ERR_Y, ERR_X, Initstr);
115 			prboard();
116 			do {
117 				domove();
118 				if (Finished)
119 					newscore();
120 				prboard();
121 			} while (!Finished);
122 			check_more();
123 			restore = On_exit = FALSE;
124 		} while (Player[COMP].total < 5000
125 		    && Player[PLAYER].total < 5000);
126 	}
127 }
128 
129 /*
130  *	Routine to trap rubouts, and make sure they really want to
131  * quit.
132  */
133 rub() {
134 
135 	(void)signal(SIGINT, SIG_IGN);
136 	if (getyn(REALLYPROMPT))
137 		die();
138 	(void)signal(SIGINT, rub);
139 }
140 
141 /*
142  *	Time to go beddy-by
143  */
144 die() {
145 
146 	(void)signal(SIGINT, SIG_IGN);
147 	if (outf)
148 		fflush(outf);
149 	mvcur(0, COLS - 1, LINES - 1, 0);
150 	endwin();
151 	exit(1);
152 }
153 
154