2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 static char sccsid[] = "@(#)subs.c 8.1 (Berkeley) 5/31/93";
38 static const char rcsid[] =
39 "$FreeBSD: src/games/backgammon/common_source/subs.c,v 1.12 1999/11/30 03:48:27 billf Exp $";
50 static const char plred[] = "Player is red, computer is white.";
51 static const char plwhite[] = "Player is white, computer is red.";
52 static const char nocomp[] = "(No computer play.)";
54 const char *const descr[] = {
55 "Usage: backgammon [-h n r w b pr pw pb tterm sfile]\n",
56 "\t-h\tgets this list\n\t-n\tdon't ask for rules or instructions",
57 "\t-r\tplayer is red (implies -n)\n\t-w\tplayer is white (implies -n)",
58 "\t-b\ttwo players, red and white (implies -n)",
59 "\t-pr\tprint the board before red's turn",
60 "\t-pw\tprint the board before white's turn",
61 "\t-pb\tprint the board before both player's turn",
62 "\t-tterm\tterminal is a term",
63 "\t-sfile\trecover saved game from file",
80 if (buffnum == BUFSIZ) {
81 if (write(1,outbuff,BUFSIZ) != BUFSIZ)
82 errexit ("addbuf (write):");
93 if (write (1,outbuff,buffnum) != buffnum)
94 errexit ("buflush (write):");
106 if (read(0,&c,1) != 1)
108 #ifdef WHY_IS_THIS_HARDWIRED_IN_HERE
112 if (c == '\033' || c == '\015')
118 if (c >= 'a' && c <= 'z')
140 trace = fopen ("bgtrace","w");
142 fprintf (trace,"writel: \"");
143 for (s = l; *s; s++) {
144 if (*s < ' ' || *s == '\177')
145 fprintf (trace,"^%c",(*s)^0100);
149 fprintf (trace,"\"\n");
161 writel ("Red's roll: ");
163 writel ("White's roll: ");
176 for (i = 4; i > 0; i--) {
178 for (j = 0; j<i; j++)
181 writec ((n/t)%10+'0');
196 writel ("Game value: ");
203 writel (" doubled last.");
206 case -1: /* player is red */
209 case 0: /* player is both colors */
212 case 1: /* player is white */
217 if (rscore || wscore) {
236 writel ("Are you sure you want to quit?");
239 writel ("Would you like to save this game?");
250 char special; /* special response */
256 while ( (c = readc()) != 'Y' && c != 'N') {
257 if (special && c == special)
261 writel (" (Y, N, or ");
265 writel (" (Y or N)");
282 writel ("Blot hit on ");
292 c = cturn/abs(cturn);
313 /* process arguments here. dashes are ignored, nbrw are ignored
314 if the game is being recovered */
316 while ((ch = getopt (argc, argv, "nbrwp:t:s:h")) != -1) {
319 /* don't ask if rules or instructions needed */
324 args[acnt++] = strdup ("-n");
327 /* player is both red and white */
333 args[acnt++] = strdup ("-b");
342 args[acnt++] = strdup ("-r");
345 /* player is white */
351 args[acnt++] = strdup ("-w");
354 /* print board after move according to following character */
356 if (optarg[0] != 'r' && optarg[0] != 'w' && optarg[0] != 'b')
358 args[acnt] = strdup ("-p ");
359 args[acnt++][2] = optarg[0];
360 if (optarg[0] == 'r')
362 if (optarg[0] == 'w')
364 if (optarg[0] == 'b')
369 tflag = getcaps (optarg);
377 for (i = 0; descr[i] != 0; i++)
384 if ( argc && argv[0][0] != '\0' )
393 board[6] = board[13] = -5;
395 board[12] = board[19] = 5;
398 off[0] = off[1] = -15;
422 if (stty (0,&tty) < 0)
428 /* go to bottom of screen */
435 /* fix terminal status */
454 while (c < '1' || c > '6')
460 while (c < '1' || c > '6')