xref: /openbsd-src/games/backgammon/common_source/subs.c (revision 091d139da5e48d3b68f0f42e39d835e133439794)
1*091d139dStb /*	$OpenBSD: subs.c,v 1.22 2015/12/02 20:05:01 tb Exp $	*/
2df930be7Sderaadt 
3df930be7Sderaadt /*
4df930be7Sderaadt  * Copyright (c) 1980, 1993
5df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
6df930be7Sderaadt  *
7df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
8df930be7Sderaadt  * modification, are permitted provided that the following conditions
9df930be7Sderaadt  * are met:
10df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
11df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
12df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
13df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
14df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
157a09557bSmillert  * 3. Neither the name of the University nor the names of its contributors
16df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
17df930be7Sderaadt  *    without specific prior written permission.
18df930be7Sderaadt  *
19df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29df930be7Sderaadt  * SUCH DAMAGE.
30df930be7Sderaadt  */
31df930be7Sderaadt 
32df930be7Sderaadt #include "back.h"
33df930be7Sderaadt 
34741f05d3Sray __dead void	usage(void);
35741f05d3Sray 
36df930be7Sderaadt int     buffnum;
37df930be7Sderaadt char    outbuff[BUFSIZ];
38df930be7Sderaadt 
397341125dSpjanzen static const char plred[] = "Player is red, computer is white.";
407341125dSpjanzen static const char plwhite[] = "Player is white, computer is red.";
417341125dSpjanzen static const char nocomp[] = "(No computer play.)";
42df930be7Sderaadt 
4353da1682Spjanzen void
errexit(const char * s)4487f25a4aStb errexit(const char *s)
45df930be7Sderaadt {
461643290aSpjanzen 	write(STDERR_FILENO, "\n", 1);
47df930be7Sderaadt 	perror(s);
4853da1682Spjanzen 	getout(0);
49df930be7Sderaadt }
50df930be7Sderaadt 
5153da1682Spjanzen int
readc(void)5287f25a4aStb readc(void)
5353da1682Spjanzen {
54d62ad8d8Spjanzen 	int    c;
55df930be7Sderaadt 
56d62ad8d8Spjanzen 	clrtoeol();
57d62ad8d8Spjanzen 	refresh();
58d62ad8d8Spjanzen 	c = getch();
59d62ad8d8Spjanzen 	if (c == '\004' || c == ERR)	/* ^D or failure	*/
6053da1682Spjanzen 		getout(0);
61df930be7Sderaadt 	if (c == '\033' || c == '\015')
62df930be7Sderaadt 		return('\n');
63df930be7Sderaadt 	if (cflag)
64df930be7Sderaadt 		return(c);
65df930be7Sderaadt 	if (c == '\014')
66df930be7Sderaadt 		return('R');
67df930be7Sderaadt 	if (c >= 'a' && c <= 'z')
68d62ad8d8Spjanzen 		return(c & 0137);	/* upper case */
69df930be7Sderaadt 	return(c);
70df930be7Sderaadt }
71df930be7Sderaadt 
7253da1682Spjanzen void
proll(void)7387f25a4aStb proll(void)
7453da1682Spjanzen {
75df930be7Sderaadt 	if (d0)
76df930be7Sderaadt 		swap;
77df930be7Sderaadt 	if (cturn == 1)
78d62ad8d8Spjanzen 		printw("Red's roll:  ");
79df930be7Sderaadt 	else
80d62ad8d8Spjanzen 		printw("White's roll:  ");
81d62ad8d8Spjanzen 	printw("%d,%d", D0, D1);
82d62ad8d8Spjanzen 	clrtoeol();
83df930be7Sderaadt }
84df930be7Sderaadt 
8553da1682Spjanzen void
gwrite(void)8687f25a4aStb gwrite(void)
8753da1682Spjanzen {
8853da1682Spjanzen 	int     r, c;
89df930be7Sderaadt 
90d62ad8d8Spjanzen 	getyx(stdscr, r, c);
91d62ad8d8Spjanzen 	move(16, 0);
92df930be7Sderaadt 	if (gvalue > 1) {
93d62ad8d8Spjanzen 		printw("Game value:  %d.  ", gvalue);
94df930be7Sderaadt 		if (dlast == -1)
95d62ad8d8Spjanzen 			addstr(color[0]);
96df930be7Sderaadt 		else
97d62ad8d8Spjanzen 			addstr(color[1]);
98d62ad8d8Spjanzen 		addstr(" doubled last.");
99df930be7Sderaadt 	} else {
1000731e908Sotto 		if (!dflag)
1010731e908Sotto 			printw("[No doubling.]  ");
102df930be7Sderaadt 		switch (pnum) {
103df930be7Sderaadt 		case -1:	/* player is red */
104d62ad8d8Spjanzen 			addstr(plred);
105df930be7Sderaadt 			break;
106df930be7Sderaadt 		case 0:	/* player is both colors */
107d62ad8d8Spjanzen 			addstr(nocomp);
108df930be7Sderaadt 			break;
109df930be7Sderaadt 		case 1:	/* player is white */
110d62ad8d8Spjanzen 			addstr(plwhite);
111df930be7Sderaadt 		}
112df930be7Sderaadt 	}
113df930be7Sderaadt 	if (rscore || wscore) {
114d62ad8d8Spjanzen 		addstr("  ");
115df930be7Sderaadt 		wrscore();
116df930be7Sderaadt 	}
117d62ad8d8Spjanzen 	clrtoeol();
118d62ad8d8Spjanzen 	move(r, c);
119df930be7Sderaadt }
120df930be7Sderaadt 
12153da1682Spjanzen int
quit(void)12287f25a4aStb quit(void)
12353da1682Spjanzen {
124d62ad8d8Spjanzen 	move(20, 0);
125d62ad8d8Spjanzen 	clrtobot();
126d62ad8d8Spjanzen 	addstr("Are you sure you want to quit?");
127df930be7Sderaadt 	if (yorn(0)) {
128df930be7Sderaadt 		if (rfl) {
129d62ad8d8Spjanzen 			addstr("Would you like to save this game?");
130df930be7Sderaadt 			if (yorn(0))
131df930be7Sderaadt 				save(0);
132df930be7Sderaadt 		}
133df930be7Sderaadt 		cturn = 0;
134df930be7Sderaadt 		return(1);
135df930be7Sderaadt 	}
136df930be7Sderaadt 	return(0);
137df930be7Sderaadt }
138df930be7Sderaadt 
13953da1682Spjanzen int
yorn(char special)14087f25a4aStb yorn(char special)
141df930be7Sderaadt {
14253da1682Spjanzen 	char    c;
14353da1682Spjanzen 	int     i;
144df930be7Sderaadt 
145df930be7Sderaadt 	i = 1;
146df930be7Sderaadt 	while ((c = readc()) != 'Y' && c != 'N') {
147df930be7Sderaadt 		if (special && c == special)
148df930be7Sderaadt 			return(2);
149df930be7Sderaadt 		if (i) {
150d62ad8d8Spjanzen 			if (special)
151d62ad8d8Spjanzen 				printw("  (Y, N, or %c)", special);
152d62ad8d8Spjanzen 			else
153d62ad8d8Spjanzen 				printw("  (Y or N)");
154df930be7Sderaadt 			i = 0;
155df930be7Sderaadt 		} else
156d62ad8d8Spjanzen 			beep();
157df930be7Sderaadt 	}
158df930be7Sderaadt 	if (c == 'Y')
159d62ad8d8Spjanzen 		addstr("  Yes.\n");
160df930be7Sderaadt 	else
161d62ad8d8Spjanzen 		addstr("  No.\n");
162d62ad8d8Spjanzen 	refresh();
163df930be7Sderaadt 	return(c == 'Y');
164df930be7Sderaadt }
165df930be7Sderaadt 
16653da1682Spjanzen void
wrhit(int i)16787f25a4aStb wrhit(int i)
168df930be7Sderaadt {
169d62ad8d8Spjanzen 	printw("Blot hit on %d.\n", i);
170df930be7Sderaadt }
171df930be7Sderaadt 
17253da1682Spjanzen void
nexturn(void)17387f25a4aStb nexturn(void)
17453da1682Spjanzen {
17553da1682Spjanzen 	int     c;
176df930be7Sderaadt 
177df930be7Sderaadt 	cturn = -cturn;
178df930be7Sderaadt 	c = cturn / abs(cturn);
179df930be7Sderaadt 	home = bar;
180df930be7Sderaadt 	bar = 25 - bar;
181df930be7Sderaadt 	offptr += c;
182df930be7Sderaadt 	offopp -= c;
183df930be7Sderaadt 	inptr += c;
184df930be7Sderaadt 	inopp -= c;
185df930be7Sderaadt 	Colorptr += c;
186df930be7Sderaadt 	colorptr += c;
187df930be7Sderaadt }
188df930be7Sderaadt 
18953da1682Spjanzen void
getarg(int argc,char ** argv)19087f25a4aStb getarg(int argc, char **argv)
191df930be7Sderaadt {
19253da1682Spjanzen 	int     ch;
193df930be7Sderaadt 
194741f05d3Sray 	while ((ch = getopt(argc, argv, "bdnrs:w")) != -1)
1955195d91eSokan 		switch(ch) {
19653da1682Spjanzen 		case 'n':	/* don't ask if rules or instructions needed */
197df930be7Sderaadt 			if (rflag)
198df930be7Sderaadt 				break;
199df930be7Sderaadt 			aflag = 0;
200df930be7Sderaadt 			break;
201df930be7Sderaadt 
20210677dd3Spjanzen 		case 'b':	/* player is both red and white */
203df930be7Sderaadt 			if (rflag)
204df930be7Sderaadt 				break;
205df930be7Sderaadt 			pnum = 0;
206df930be7Sderaadt 			aflag = 0;
207df930be7Sderaadt 			break;
208df930be7Sderaadt 
20953da1682Spjanzen 		case 'r':	/* player is red */
210df930be7Sderaadt 			if (rflag)
211df930be7Sderaadt 				break;
212df930be7Sderaadt 			pnum = -1;
213df930be7Sderaadt 			aflag = 0;
214df930be7Sderaadt 			break;
215df930be7Sderaadt 
21653da1682Spjanzen 		case 'w':	/* player is white */
217df930be7Sderaadt 			if (rflag)
218df930be7Sderaadt 				break;
219df930be7Sderaadt 			pnum = 1;
220df930be7Sderaadt 			aflag = 0;
221df930be7Sderaadt 			break;
222df930be7Sderaadt 
22353da1682Spjanzen 		case 's':	/* restore saved game */
22453da1682Spjanzen 			recover(optarg);
22553da1682Spjanzen 			break;
22653da1682Spjanzen 
227c8e1bdacSmartin 		case 'd':	/* disable doubling */
228c8e1bdacSmartin 			dflag = 0;
229*091d139dStb 			aflag = 0;
230c8e1bdacSmartin 			break;
231c8e1bdacSmartin 
23253da1682Spjanzen 		default:	/* print cmdline options */
233741f05d3Sray 			usage();
23499c5df51Setheisen 	} /* end switch */
235df930be7Sderaadt }
236df930be7Sderaadt 
23753da1682Spjanzen void
usage(void)238741f05d3Sray usage(void)
239741f05d3Sray {
240741f05d3Sray 	extern char *__progname;
241741f05d3Sray 
242a307e700Ssobrado 	fprintf(stderr, "usage: %s [-bdnrw] [-s file]\n", __progname);
243741f05d3Sray 	exit(1);
244741f05d3Sray }
245741f05d3Sray 
246741f05d3Sray void
init(void)24787f25a4aStb init(void)
24853da1682Spjanzen {
24953da1682Spjanzen 	int     i;
25053da1682Spjanzen 
251df930be7Sderaadt 	for (i = 0; i < 26;)
252df930be7Sderaadt 		board[i++] = 0;
253df930be7Sderaadt 	board[1] = 2;
254df930be7Sderaadt 	board[6] = board[13] = -5;
255df930be7Sderaadt 	board[8] = -3;
256df930be7Sderaadt 	board[12] = board[19] = 5;
257df930be7Sderaadt 	board[17] = 3;
258df930be7Sderaadt 	board[24] = -2;
259df930be7Sderaadt 	off[0] = off[1] = -15;
260df930be7Sderaadt 	in[0] = in[1] = 5;
261df930be7Sderaadt 	gvalue = 1;
262df930be7Sderaadt 	dlast = 0;
263df930be7Sderaadt }
264df930be7Sderaadt 
26553da1682Spjanzen void
wrscore(void)26687f25a4aStb wrscore(void)
26753da1682Spjanzen {
268d62ad8d8Spjanzen 	printw("Score:  %s %d, %s %d", color[1], rscore, color[0], wscore);
269df930be7Sderaadt }
270df930be7Sderaadt 
271df930be7Sderaadt 
27253da1682Spjanzen void
getout(int dummy)27387f25a4aStb getout(int dummy)
27453da1682Spjanzen {
275df930be7Sderaadt 	/* go to bottom of screen */
276d62ad8d8Spjanzen 	move(23, 0);
277d62ad8d8Spjanzen 	clrtoeol();
278df930be7Sderaadt 
279d62ad8d8Spjanzen 	endwin();
280df930be7Sderaadt 	exit(0);
281df930be7Sderaadt }
28253da1682Spjanzen 
28353da1682Spjanzen void
roll(void)28487f25a4aStb roll(void)
28553da1682Spjanzen {
28653da1682Spjanzen 	char    c;
28753da1682Spjanzen 	int     row;
28853da1682Spjanzen 	int     col;
289df930be7Sderaadt 
290df930be7Sderaadt 	if (iroll) {
291d62ad8d8Spjanzen 		getyx(stdscr, row, col);
292d62ad8d8Spjanzen 		mvprintw(17, 0, "ROLL: ");
293df930be7Sderaadt 		c = readc();
294df930be7Sderaadt 		if (c != '\n') {
295df930be7Sderaadt 			while (c < '1' || c > '6')
296df930be7Sderaadt 				c = readc();
297df930be7Sderaadt 			D0 = c - '0';
298d62ad8d8Spjanzen 			printw(" %c", c);
299df930be7Sderaadt 			c = readc();
300df930be7Sderaadt 			while (c < '1' || c > '6')
301df930be7Sderaadt 				c = readc();
302df930be7Sderaadt 			D1 = c - '0';
303d62ad8d8Spjanzen 			printw(" %c", c);
304d62ad8d8Spjanzen 			move(17, 0);
305d62ad8d8Spjanzen 			clrtoeol();
306d62ad8d8Spjanzen 			move(row, col);
307df930be7Sderaadt 			return;
308df930be7Sderaadt 		}
309d62ad8d8Spjanzen 		move(17, 0);
310d62ad8d8Spjanzen 		clrtoeol();
311d62ad8d8Spjanzen 		move(row, col);
312df930be7Sderaadt 	}
313df930be7Sderaadt 	D0 = rnum(6) + 1;
314df930be7Sderaadt 	D1 = rnum(6) + 1;
315df930be7Sderaadt 	d0 = 0;
316df930be7Sderaadt }
317