1 /*	$OpenBSD: subs.c,v 1.22 2015/12/02 20:05:01 tb Exp $	*/
2 
3 /*
4  * Copyright (c) 1980, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include "back.h"
33 
34 __dead void	usage(void);
35 
36 int     buffnum;
37 char    outbuff[BUFSIZ];
38 
39 static const char plred[] = "Player is red, computer is white.";
40 static const char plwhite[] = "Player is white, computer is red.";
41 static const char nocomp[] = "(No computer play.)";
42 
43 void
errexit(const char * s)44 errexit(const char *s)
45 {
46 	write(STDERR_FILENO, "\n", 1);
47 	perror(s);
48 	getout(0);
49 }
50 
51 int
readc(void)52 readc(void)
53 {
54 	int    c;
55 
56 	clrtoeol();
57 	refresh();
58 	c = getch();
59 	if (c == '\004' || c == ERR)	/* ^D or failure	*/
60 		getout(0);
61 	if (c == '\033' || c == '\015')
62 		return('\n');
63 	if (cflag)
64 		return(c);
65 	if (c == '\014')
66 		return('R');
67 	if (c >= 'a' && c <= 'z')
68 		return(c & 0137);	/* upper case */
69 	return(c);
70 }
71 
72 void
proll(void)73 proll(void)
74 {
75 	if (d0)
76 		swap;
77 	if (cturn == 1)
78 		printw("Red's roll:  ");
79 	else
80 		printw("White's roll:  ");
81 	printw("%d,%d", D0, D1);
82 	clrtoeol();
83 }
84 
85 void
gwrite(void)86 gwrite(void)
87 {
88 	int     r, c;
89 
90 	getyx(stdscr, r, c);
91 	move(16, 0);
92 	if (gvalue > 1) {
93 		printw("Game value:  %d.  ", gvalue);
94 		if (dlast == -1)
95 			addstr(color[0]);
96 		else
97 			addstr(color[1]);
98 		addstr(" doubled last.");
99 	} else {
100 		if (!dflag)
101 			printw("[No doubling.]  ");
102 		switch (pnum) {
103 		case -1:	/* player is red */
104 			addstr(plred);
105 			break;
106 		case 0:	/* player is both colors */
107 			addstr(nocomp);
108 			break;
109 		case 1:	/* player is white */
110 			addstr(plwhite);
111 		}
112 	}
113 	if (rscore || wscore) {
114 		addstr("  ");
115 		wrscore();
116 	}
117 	clrtoeol();
118 	move(r, c);
119 }
120 
121 int
quit(void)122 quit(void)
123 {
124 	move(20, 0);
125 	clrtobot();
126 	addstr("Are you sure you want to quit?");
127 	if (yorn(0)) {
128 		if (rfl) {
129 			addstr("Would you like to save this game?");
130 			if (yorn(0))
131 				save(0);
132 		}
133 		cturn = 0;
134 		return(1);
135 	}
136 	return(0);
137 }
138 
139 int
yorn(char special)140 yorn(char special)
141 {
142 	char    c;
143 	int     i;
144 
145 	i = 1;
146 	while ((c = readc()) != 'Y' && c != 'N') {
147 		if (special && c == special)
148 			return(2);
149 		if (i) {
150 			if (special)
151 				printw("  (Y, N, or %c)", special);
152 			else
153 				printw("  (Y or N)");
154 			i = 0;
155 		} else
156 			beep();
157 	}
158 	if (c == 'Y')
159 		addstr("  Yes.\n");
160 	else
161 		addstr("  No.\n");
162 	refresh();
163 	return(c == 'Y');
164 }
165 
166 void
wrhit(int i)167 wrhit(int i)
168 {
169 	printw("Blot hit on %d.\n", i);
170 }
171 
172 void
nexturn(void)173 nexturn(void)
174 {
175 	int     c;
176 
177 	cturn = -cturn;
178 	c = cturn / abs(cturn);
179 	home = bar;
180 	bar = 25 - bar;
181 	offptr += c;
182 	offopp -= c;
183 	inptr += c;
184 	inopp -= c;
185 	Colorptr += c;
186 	colorptr += c;
187 }
188 
189 void
getarg(int argc,char ** argv)190 getarg(int argc, char **argv)
191 {
192 	int     ch;
193 
194 	while ((ch = getopt(argc, argv, "bdnrs:w")) != -1)
195 		switch(ch) {
196 		case 'n':	/* don't ask if rules or instructions needed */
197 			if (rflag)
198 				break;
199 			aflag = 0;
200 			break;
201 
202 		case 'b':	/* player is both red and white */
203 			if (rflag)
204 				break;
205 			pnum = 0;
206 			aflag = 0;
207 			break;
208 
209 		case 'r':	/* player is red */
210 			if (rflag)
211 				break;
212 			pnum = -1;
213 			aflag = 0;
214 			break;
215 
216 		case 'w':	/* player is white */
217 			if (rflag)
218 				break;
219 			pnum = 1;
220 			aflag = 0;
221 			break;
222 
223 		case 's':	/* restore saved game */
224 			recover(optarg);
225 			break;
226 
227 		case 'd':	/* disable doubling */
228 			dflag = 0;
229 			aflag = 0;
230 			break;
231 
232 		default:	/* print cmdline options */
233 			usage();
234 	} /* end switch */
235 }
236 
237 void
usage(void)238 usage(void)
239 {
240 	extern char *__progname;
241 
242 	fprintf(stderr, "usage: %s [-bdnrw] [-s file]\n", __progname);
243 	exit(1);
244 }
245 
246 void
init(void)247 init(void)
248 {
249 	int     i;
250 
251 	for (i = 0; i < 26;)
252 		board[i++] = 0;
253 	board[1] = 2;
254 	board[6] = board[13] = -5;
255 	board[8] = -3;
256 	board[12] = board[19] = 5;
257 	board[17] = 3;
258 	board[24] = -2;
259 	off[0] = off[1] = -15;
260 	in[0] = in[1] = 5;
261 	gvalue = 1;
262 	dlast = 0;
263 }
264 
265 void
wrscore(void)266 wrscore(void)
267 {
268 	printw("Score:  %s %d, %s %d", color[1], rscore, color[0], wscore);
269 }
270 
271 
272 void
getout(int dummy)273 getout(int dummy)
274 {
275 	/* go to bottom of screen */
276 	move(23, 0);
277 	clrtoeol();
278 
279 	endwin();
280 	exit(0);
281 }
282 
283 void
roll(void)284 roll(void)
285 {
286 	char    c;
287 	int     row;
288 	int     col;
289 
290 	if (iroll) {
291 		getyx(stdscr, row, col);
292 		mvprintw(17, 0, "ROLL: ");
293 		c = readc();
294 		if (c != '\n') {
295 			while (c < '1' || c > '6')
296 				c = readc();
297 			D0 = c - '0';
298 			printw(" %c", c);
299 			c = readc();
300 			while (c < '1' || c > '6')
301 				c = readc();
302 			D1 = c - '0';
303 			printw(" %c", c);
304 			move(17, 0);
305 			clrtoeol();
306 			move(row, col);
307 			return;
308 		}
309 		move(17, 0);
310 		clrtoeol();
311 		move(row, col);
312 	}
313 	D0 = rnum(6) + 1;
314 	D1 = rnum(6) + 1;
315 	d0 = 0;
316 }
317