Home | History | Annotate | Line # | Download | only in common_source
subs.c revision 1.9
      1  1.9  frueauf /*	$NetBSD: subs.c,v 1.9 1998/09/15 13:43:35 frueauf Exp $	*/
      2  1.3      cgd 
      3  1.1      cgd /*
      4  1.3      cgd  * Copyright (c) 1980, 1993
      5  1.3      cgd  *	The Regents of the University of California.  All rights reserved.
      6  1.1      cgd  *
      7  1.1      cgd  * Redistribution and use in source and binary forms, with or without
      8  1.1      cgd  * modification, are permitted provided that the following conditions
      9  1.1      cgd  * are met:
     10  1.1      cgd  * 1. Redistributions of source code must retain the above copyright
     11  1.1      cgd  *    notice, this list of conditions and the following disclaimer.
     12  1.1      cgd  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1      cgd  *    notice, this list of conditions and the following disclaimer in the
     14  1.1      cgd  *    documentation and/or other materials provided with the distribution.
     15  1.1      cgd  * 3. All advertising materials mentioning features or use of this software
     16  1.1      cgd  *    must display the following acknowledgement:
     17  1.1      cgd  *	This product includes software developed by the University of
     18  1.1      cgd  *	California, Berkeley and its contributors.
     19  1.1      cgd  * 4. Neither the name of the University nor the names of its contributors
     20  1.1      cgd  *    may be used to endorse or promote products derived from this software
     21  1.1      cgd  *    without specific prior written permission.
     22  1.1      cgd  *
     23  1.1      cgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  1.1      cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  1.1      cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  1.1      cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  1.1      cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  1.1      cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  1.1      cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  1.1      cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  1.1      cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  1.1      cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  1.1      cgd  * SUCH DAMAGE.
     34  1.1      cgd  */
     35  1.1      cgd 
     36  1.6    lukem #include <sys/cdefs.h>
     37  1.1      cgd #ifndef lint
     38  1.3      cgd #if 0
     39  1.3      cgd static char sccsid[] = "@(#)subs.c	8.1 (Berkeley) 5/31/93";
     40  1.3      cgd #else
     41  1.9  frueauf __RCSID("$NetBSD: subs.c,v 1.9 1998/09/15 13:43:35 frueauf Exp $");
     42  1.3      cgd #endif
     43  1.1      cgd #endif /* not lint */
     44  1.1      cgd 
     45  1.1      cgd #include "back.h"
     46  1.1      cgd 
     47  1.6    lukem int     buffnum;
     48  1.6    lukem char    outbuff[BUFSIZ];
     49  1.1      cgd 
     50  1.6    lukem static char plred[] = "Player is red, computer is white.";
     51  1.6    lukem static char plwhite[] = "Player is white, computer is red.";
     52  1.6    lukem static char nocomp[] = "(No computer play.)";
     53  1.1      cgd 
     54  1.6    lukem char   *descr[] = {
     55  1.1      cgd 	"Usage:  backgammon [-] [n r w b pr pw pb t3a]\n",
     56  1.1      cgd 	"\t-\tgets this list\n\tn\tdon't ask for rules or instructions",
     57  1.1      cgd 	"\tr\tplayer is red (implies n)\n\tw\tplayer is white (implies n)",
     58  1.1      cgd 	"\tb\ttwo players, red and white (implies n)",
     59  1.1      cgd 	"\tpr\tprint the board before red's turn",
     60  1.1      cgd 	"\tpw\tprint the board before white's turn",
     61  1.1      cgd 	"\tpb\tprint the board before both player's turn",
     62  1.1      cgd 	"\tterm\tterminal is a term",
     63  1.1      cgd 	"\tsfile\trecover saved game from file",
     64  1.1      cgd 	0
     65  1.1      cgd };
     66  1.1      cgd 
     67  1.6    lukem void
     68  1.6    lukem errexit(s)
     69  1.6    lukem 	const char *s;
     70  1.1      cgd {
     71  1.6    lukem 	write(2, "\n", 1);
     72  1.6    lukem 	perror(s);
     73  1.6    lukem 	getout(0);
     74  1.1      cgd }
     75  1.1      cgd 
     76  1.6    lukem void
     77  1.6    lukem addbuf(c)
     78  1.6    lukem 	int     c;
     79  1.1      cgd {
     80  1.1      cgd 	buffnum++;
     81  1.6    lukem 	if (buffnum == BUFSIZ) {
     82  1.6    lukem 		if (write(1, outbuff, BUFSIZ) != BUFSIZ)
     83  1.6    lukem 			errexit("addbuf (write):");
     84  1.1      cgd 		buffnum = 0;
     85  1.1      cgd 	}
     86  1.1      cgd 	outbuff[buffnum] = c;
     87  1.1      cgd }
     88  1.1      cgd 
     89  1.6    lukem void
     90  1.6    lukem buflush()
     91  1.6    lukem {
     92  1.1      cgd 	if (buffnum < 0)
     93  1.1      cgd 		return;
     94  1.1      cgd 	buffnum++;
     95  1.6    lukem 	if (write(1, outbuff, buffnum) != buffnum)
     96  1.6    lukem 		errexit("buflush (write):");
     97  1.1      cgd 	buffnum = -1;
     98  1.1      cgd }
     99  1.1      cgd 
    100  1.6    lukem int
    101  1.6    lukem readc()
    102  1.6    lukem {
    103  1.6    lukem 	char    c;
    104  1.1      cgd 
    105  1.6    lukem 	if (tflag) {
    106  1.1      cgd 		cline();
    107  1.1      cgd 		newpos();
    108  1.1      cgd 	}
    109  1.1      cgd 	buflush();
    110  1.6    lukem 	if (read(0, &c, 1) != 1)
    111  1.6    lukem 		errexit("readc");
    112  1.1      cgd #ifdef WHY_IS_THIS_HARDWIRED_IN_HERE
    113  1.1      cgd 	if (c == '\177')
    114  1.6    lukem 		getout(0);
    115  1.1      cgd #endif
    116  1.1      cgd 	if (c == '\033' || c == '\015')
    117  1.1      cgd 		return ('\n');
    118  1.1      cgd 	if (cflag)
    119  1.1      cgd 		return (c);
    120  1.1      cgd 	if (c == '\014')
    121  1.1      cgd 		return ('R');
    122  1.1      cgd 	if (c >= 'a' && c <= 'z')
    123  1.1      cgd 		return (c & 0137);
    124  1.1      cgd 	return (c);
    125  1.1      cgd }
    126  1.1      cgd 
    127  1.6    lukem void
    128  1.6    lukem writec(c)
    129  1.6    lukem 	char    c;
    130  1.1      cgd {
    131  1.1      cgd 	if (tflag)
    132  1.6    lukem 		fancyc(c);
    133  1.1      cgd 	else
    134  1.6    lukem 		addbuf(c);
    135  1.1      cgd }
    136  1.1      cgd 
    137  1.6    lukem void
    138  1.6    lukem writel(l)
    139  1.6    lukem 	char   *l;
    140  1.1      cgd {
    141  1.1      cgd #ifdef DEBUG
    142  1.6    lukem 	char   *s;
    143  1.1      cgd 
    144  1.1      cgd 	if (trace == NULL)
    145  1.6    lukem 		trace = fopen("bgtrace", "w");
    146  1.6    lukem 
    147  1.6    lukem 	fprintf(trace, "writel: \"");
    148  1.1      cgd 	for (s = l; *s; s++) {
    149  1.1      cgd 		if (*s < ' ' || *s == '\177')
    150  1.6    lukem 			fprintf(trace, "^%c", (*s) ^ 0100);
    151  1.1      cgd 		else
    152  1.6    lukem 			putc(*s, trace);
    153  1.1      cgd 	}
    154  1.6    lukem 	fprintf(trace, "\"\n");
    155  1.6    lukem 	fflush(trace);
    156  1.1      cgd #endif
    157  1.1      cgd 
    158  1.1      cgd 	while (*l)
    159  1.6    lukem 		writec(*l++);
    160  1.1      cgd }
    161  1.1      cgd 
    162  1.6    lukem void
    163  1.6    lukem proll()
    164  1.6    lukem {
    165  1.1      cgd 	if (d0)
    166  1.1      cgd 		swap;
    167  1.1      cgd 	if (cturn == 1)
    168  1.6    lukem 		writel("Red's roll:  ");
    169  1.1      cgd 	else
    170  1.6    lukem 		writel("White's roll:  ");
    171  1.6    lukem 	writec(D0 + '0');
    172  1.6    lukem 	writec('\040');
    173  1.6    lukem 	writec(D1 + '0');
    174  1.1      cgd 	if (tflag)
    175  1.1      cgd 		cline();
    176  1.1      cgd }
    177  1.1      cgd 
    178  1.6    lukem void
    179  1.6    lukem wrint(n)
    180  1.6    lukem 	int     n;
    181  1.1      cgd {
    182  1.6    lukem 	int     i, j, t;
    183  1.1      cgd 
    184  1.6    lukem 	for (i = 4; i > 0; i--) {
    185  1.1      cgd 		t = 1;
    186  1.6    lukem 		for (j = 0; j < i; j++)
    187  1.1      cgd 			t *= 10;
    188  1.6    lukem 		if (n > t - 1)
    189  1.6    lukem 			writec((n / t) % 10 + '0');
    190  1.1      cgd 	}
    191  1.6    lukem 	writec(n % 10 + '0');
    192  1.1      cgd }
    193  1.1      cgd 
    194  1.6    lukem void
    195  1.6    lukem gwrite()
    196  1.6    lukem {
    197  1.6    lukem 	int     r, c;
    198  1.1      cgd 
    199  1.6    lukem 	r = c = 0;
    200  1.6    lukem 	if (tflag) {
    201  1.1      cgd 		r = curr;
    202  1.1      cgd 		c = curc;
    203  1.6    lukem 		curmove(16, 0);
    204  1.1      cgd 	}
    205  1.6    lukem 	if (gvalue > 1) {
    206  1.6    lukem 		writel("Game value:  ");
    207  1.6    lukem 		wrint(gvalue);
    208  1.6    lukem 		writel(".  ");
    209  1.1      cgd 		if (dlast == -1)
    210  1.6    lukem 			writel(color[0]);
    211  1.1      cgd 		else
    212  1.6    lukem 			writel(color[1]);
    213  1.6    lukem 		writel(" doubled last.");
    214  1.6    lukem 	} else {
    215  1.6    lukem 		switch (pnum) {
    216  1.6    lukem 		case -1:	/* player is red */
    217  1.6    lukem 			writel(plred);
    218  1.1      cgd 			break;
    219  1.6    lukem 		case 0:	/* player is both colors */
    220  1.6    lukem 			writel(nocomp);
    221  1.1      cgd 			break;
    222  1.6    lukem 		case 1:	/* player is white */
    223  1.6    lukem 			writel(plwhite);
    224  1.1      cgd 		}
    225  1.1      cgd 	}
    226  1.1      cgd 
    227  1.6    lukem 	if (rscore || wscore) {
    228  1.6    lukem 		writel("  ");
    229  1.1      cgd 		wrscore();
    230  1.1      cgd 	}
    231  1.6    lukem 	if (tflag) {
    232  1.1      cgd 		cline();
    233  1.6    lukem 		curmove(r, c);
    234  1.1      cgd 	}
    235  1.1      cgd }
    236  1.1      cgd 
    237  1.6    lukem int
    238  1.6    lukem quit()
    239  1.6    lukem {
    240  1.1      cgd 
    241  1.6    lukem 	if (tflag) {
    242  1.6    lukem 		curmove(20, 0);
    243  1.1      cgd 		clend();
    244  1.1      cgd 	} else
    245  1.6    lukem 		writec('\n');
    246  1.6    lukem 	writel("Are you sure you want to quit?");
    247  1.6    lukem 	if (yorn(0)) {
    248  1.6    lukem 		if (rfl) {
    249  1.6    lukem 			writel("Would you like to save this game?");
    250  1.1      cgd 			if (yorn(0))
    251  1.1      cgd 				save(0);
    252  1.1      cgd 		}
    253  1.1      cgd 		cturn = 0;
    254  1.1      cgd 		return (1);
    255  1.1      cgd 	}
    256  1.1      cgd 	return (0);
    257  1.1      cgd }
    258  1.1      cgd 
    259  1.6    lukem int
    260  1.6    lukem yorn(special)
    261  1.6    lukem 	char    special;	/* special response */
    262  1.1      cgd {
    263  1.6    lukem 	char    c;
    264  1.6    lukem 	int     i;
    265  1.1      cgd 
    266  1.1      cgd 	i = 1;
    267  1.6    lukem 	while ((c = readc()) != 'Y' && c != 'N') {
    268  1.1      cgd 		if (special && c == special)
    269  1.1      cgd 			return (2);
    270  1.6    lukem 		if (i) {
    271  1.6    lukem 			if (special) {
    272  1.6    lukem 				writel("  (Y, N, or ");
    273  1.6    lukem 				writec(special);
    274  1.6    lukem 				writec(')');
    275  1.1      cgd 			} else
    276  1.6    lukem 				writel("  (Y or N)");
    277  1.1      cgd 			i = 0;
    278  1.1      cgd 		} else
    279  1.6    lukem 			writec('\007');
    280  1.1      cgd 	}
    281  1.1      cgd 	if (c == 'Y')
    282  1.6    lukem 		writel("  Yes.\n");
    283  1.1      cgd 	else
    284  1.6    lukem 		writel("  No.\n");
    285  1.1      cgd 	if (tflag)
    286  1.1      cgd 		buflush();
    287  1.1      cgd 	return (c == 'Y');
    288  1.1      cgd }
    289  1.1      cgd 
    290  1.6    lukem void
    291  1.6    lukem wrhit(i)
    292  1.6    lukem 	int     i;
    293  1.1      cgd {
    294  1.6    lukem 	writel("Blot hit on ");
    295  1.6    lukem 	wrint(i);
    296  1.6    lukem 	writec('.');
    297  1.6    lukem 	writec('\n');
    298  1.1      cgd }
    299  1.1      cgd 
    300  1.6    lukem void
    301  1.6    lukem nexturn()
    302  1.6    lukem {
    303  1.6    lukem 	int     c;
    304  1.1      cgd 
    305  1.1      cgd 	cturn = -cturn;
    306  1.6    lukem 	c = cturn / abs(cturn);
    307  1.1      cgd 	home = bar;
    308  1.6    lukem 	bar = 25 - bar;
    309  1.1      cgd 	offptr += c;
    310  1.1      cgd 	offopp -= c;
    311  1.1      cgd 	inptr += c;
    312  1.1      cgd 	inopp -= c;
    313  1.1      cgd 	Colorptr += c;
    314  1.1      cgd 	colorptr += c;
    315  1.1      cgd }
    316  1.1      cgd 
    317  1.6    lukem void
    318  1.6    lukem getarg(arg)
    319  1.6    lukem 	char ***arg;
    320  1.1      cgd {
    321  1.6    lukem 	char  **s;
    322  1.1      cgd 
    323  1.6    lukem 	/* process arguments here.  dashes are ignored, nbrw are ignored if
    324  1.6    lukem 	 * the game is being recovered */
    325  1.1      cgd 
    326  1.1      cgd 	s = *arg;
    327  1.9  frueauf 	while (*s && s[0][0] == '-') {
    328  1.6    lukem 		switch (s[0][1]) {
    329  1.1      cgd 
    330  1.6    lukem 			/* don't ask if rules or instructions needed */
    331  1.1      cgd 		case 'n':
    332  1.1      cgd 			if (rflag)
    333  1.1      cgd 				break;
    334  1.1      cgd 			aflag = 0;
    335  1.1      cgd 			args[acnt++] = 'n';
    336  1.1      cgd 			break;
    337  1.1      cgd 
    338  1.7  hubertf 			/* player is both red and white */
    339  1.1      cgd 		case 'b':
    340  1.1      cgd 			if (rflag)
    341  1.1      cgd 				break;
    342  1.1      cgd 			pnum = 0;
    343  1.1      cgd 			aflag = 0;
    344  1.1      cgd 			args[acnt++] = 'b';
    345  1.1      cgd 			break;
    346  1.1      cgd 
    347  1.6    lukem 			/* player is red */
    348  1.1      cgd 		case 'r':
    349  1.1      cgd 			if (rflag)
    350  1.1      cgd 				break;
    351  1.1      cgd 			pnum = -1;
    352  1.1      cgd 			aflag = 0;
    353  1.1      cgd 			args[acnt++] = 'r';
    354  1.1      cgd 			break;
    355  1.1      cgd 
    356  1.6    lukem 			/* player is white */
    357  1.1      cgd 		case 'w':
    358  1.1      cgd 			if (rflag)
    359  1.1      cgd 				break;
    360  1.1      cgd 			pnum = 1;
    361  1.1      cgd 			aflag = 0;
    362  1.1      cgd 			args[acnt++] = 'w';
    363  1.1      cgd 			break;
    364  1.1      cgd 
    365  1.6    lukem 			/* print board after move according to following
    366  1.6    lukem 			 * character */
    367  1.1      cgd 		case 'p':
    368  1.1      cgd 			if (s[0][2] != 'r' && s[0][2] != 'w' && s[0][2] != 'b')
    369  1.1      cgd 				break;
    370  1.1      cgd 			args[acnt++] = 'p';
    371  1.1      cgd 			args[acnt++] = s[0][2];
    372  1.1      cgd 			if (s[0][2] == 'r')
    373  1.1      cgd 				bflag = 1;
    374  1.1      cgd 			if (s[0][2] == 'w')
    375  1.1      cgd 				bflag = -1;
    376  1.1      cgd 			if (s[0][2] == 'b')
    377  1.1      cgd 				bflag = 0;
    378  1.1      cgd 			break;
    379  1.1      cgd 
    380  1.1      cgd 		case 't':
    381  1.1      cgd 			if (s[0][2] == '\0') {	/* get terminal caps */
    382  1.1      cgd 				s++;
    383  1.6    lukem 				tflag = getcaps(*s);
    384  1.1      cgd 			} else
    385  1.6    lukem 				tflag = getcaps(&s[0][2]);
    386  1.1      cgd 			break;
    387  1.1      cgd 
    388  1.1      cgd 		case 's':
    389  1.1      cgd 			s++;
    390  1.1      cgd 			/* recover file */
    391  1.6    lukem 			recover(s[0]);
    392  1.1      cgd 			break;
    393  1.1      cgd 		}
    394  1.1      cgd 		s++;
    395  1.1      cgd 	}
    396  1.1      cgd 	if (s[0] != 0)
    397  1.1      cgd 		recover(s[0]);
    398  1.1      cgd }
    399  1.1      cgd 
    400  1.6    lukem void
    401  1.6    lukem init()
    402  1.6    lukem {
    403  1.6    lukem 	int     i;
    404  1.6    lukem 
    405  1.1      cgd 	for (i = 0; i < 26;)
    406  1.1      cgd 		board[i++] = 0;
    407  1.1      cgd 	board[1] = 2;
    408  1.1      cgd 	board[6] = board[13] = -5;
    409  1.1      cgd 	board[8] = -3;
    410  1.1      cgd 	board[12] = board[19] = 5;
    411  1.1      cgd 	board[17] = 3;
    412  1.1      cgd 	board[24] = -2;
    413  1.1      cgd 	off[0] = off[1] = -15;
    414  1.1      cgd 	in[0] = in[1] = 5;
    415  1.1      cgd 	gvalue = 1;
    416  1.1      cgd 	dlast = 0;
    417  1.1      cgd }
    418  1.1      cgd 
    419  1.6    lukem void
    420  1.6    lukem wrscore()
    421  1.6    lukem {
    422  1.6    lukem 	writel("Score:  ");
    423  1.6    lukem 	writel(color[1]);
    424  1.6    lukem 	writec(' ');
    425  1.6    lukem 	wrint(rscore);
    426  1.6    lukem 	writel(", ");
    427  1.6    lukem 	writel(color[0]);
    428  1.6    lukem 	writec(' ');
    429  1.6    lukem 	wrint(wscore);
    430  1.1      cgd }
    431  1.1      cgd 
    432  1.6    lukem void
    433  1.6    lukem fixtty(t)
    434  1.6    lukem 	struct termios *t;
    435  1.1      cgd {
    436  1.1      cgd 	if (tflag)
    437  1.1      cgd 		newpos();
    438  1.1      cgd 	buflush();
    439  1.6    lukem 	if (tcsetattr(0, TCSADRAIN, t) < 0)
    440  1.1      cgd 		errexit("fixtty");
    441  1.1      cgd }
    442  1.1      cgd 
    443  1.6    lukem void
    444  1.6    lukem getout(dummy)
    445  1.6    lukem 	int     dummy;
    446  1.6    lukem {
    447  1.1      cgd 	/* go to bottom of screen */
    448  1.6    lukem 	if (tflag) {
    449  1.6    lukem 		curmove(23, 0);
    450  1.1      cgd 		cline();
    451  1.1      cgd 	} else
    452  1.6    lukem 		writec('\n');
    453  1.1      cgd 
    454  1.1      cgd 	/* fix terminal status */
    455  1.6    lukem 	fixtty(&old);
    456  1.4      cgd 	exit(0);
    457  1.1      cgd }
    458  1.1      cgd 
    459  1.6    lukem void
    460  1.6    lukem roll()
    461  1.6    lukem {
    462  1.6    lukem 	char    c;
    463  1.6    lukem 	int     row;
    464  1.6    lukem 	int     col;
    465  1.6    lukem 
    466  1.6    lukem 	row = col = 0;
    467  1.6    lukem 	if (iroll) {
    468  1.6    lukem 		if (tflag) {
    469  1.1      cgd 			row = curr;
    470  1.1      cgd 			col = curc;
    471  1.6    lukem 			curmove(17, 0);
    472  1.1      cgd 		} else
    473  1.6    lukem 			writec('\n');
    474  1.6    lukem 		writel("ROLL: ");
    475  1.1      cgd 		c = readc();
    476  1.6    lukem 		if (c != '\n') {
    477  1.1      cgd 			while (c < '1' || c > '6')
    478  1.1      cgd 				c = readc();
    479  1.6    lukem 			D0 = c - '0';
    480  1.6    lukem 			writec(' ');
    481  1.6    lukem 			writec(c);
    482  1.1      cgd 			c = readc();
    483  1.1      cgd 			while (c < '1' || c > '6')
    484  1.1      cgd 				c = readc();
    485  1.6    lukem 			D1 = c - '0';
    486  1.6    lukem 			writec(' ');
    487  1.6    lukem 			writec(c);
    488  1.6    lukem 			if (tflag) {
    489  1.6    lukem 				curmove(17, 0);
    490  1.1      cgd 				cline();
    491  1.6    lukem 				curmove(row, col);
    492  1.1      cgd 			} else
    493  1.6    lukem 				writec('\n');
    494  1.1      cgd 			return;
    495  1.1      cgd 		}
    496  1.6    lukem 		if (tflag) {
    497  1.6    lukem 			curmove(17, 0);
    498  1.1      cgd 			cline();
    499  1.6    lukem 			curmove(row, col);
    500  1.1      cgd 		} else
    501  1.6    lukem 			writec('\n');
    502  1.1      cgd 	}
    503  1.6    lukem 	D0 = rnum(6) + 1;
    504  1.6    lukem 	D1 = rnum(6) + 1;
    505  1.1      cgd 	d0 = 0;
    506  1.1      cgd }
    507