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