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
33 * @(#)subs.c 8.1 (Berkeley) 5/31/93
34 * $FreeBSD: src/games/backgammon/common_source/subs.c,v 1.12 1999/11/30 03:48:27 billf Exp $
35 * $DragonFly: src/games/backgammon/common_source/subs.c,v 1.2 2003/06/17 04:25:22 dillon Exp $
46 static const char plred[] = "Player is red, computer is white.";
47 static const char plwhite[] = "Player is white, computer is red.";
48 static const char nocomp[] = "(No computer play.)";
50 const char *const descr[] = {
51 "Usage: backgammon [-h n r w b pr pw pb tterm sfile]\n",
52 "\t-h\tgets this list\n\t-n\tdon't ask for rules or instructions",
53 "\t-r\tplayer is red (implies -n)\n\t-w\tplayer is white (implies -n)",
54 "\t-b\ttwo players, red and white (implies -n)",
55 "\t-pr\tprint the board before red's turn",
56 "\t-pw\tprint the board before white's turn",
57 "\t-pb\tprint the board before both player's turn",
58 "\t-tterm\tterminal is a term",
59 "\t-sfile\trecover saved game from file",
76 if (buffnum == BUFSIZ) {
77 if (write(1,outbuff,BUFSIZ) != BUFSIZ)
78 errexit ("addbuf (write):");
89 if (write (1,outbuff,buffnum) != buffnum)
90 errexit ("buflush (write):");
102 if (read(0,&c,1) != 1)
104 #ifdef WHY_IS_THIS_HARDWIRED_IN_HERE
108 if (c == '\033' || c == '\015')
114 if (c >= 'a' && c <= 'z')
136 trace = fopen ("bgtrace","w");
138 fprintf (trace,"writel: \"");
139 for (s = l; *s; s++) {
140 if (*s < ' ' || *s == '\177')
141 fprintf (trace,"^%c",(*s)^0100);
145 fprintf (trace,"\"\n");
157 writel ("Red's roll: ");
159 writel ("White's roll: ");
172 for (i = 4; i > 0; i--) {
174 for (j = 0; j<i; j++)
177 writec ((n/t)%10+'0');
192 writel ("Game value: ");
199 writel (" doubled last.");
202 case -1: /* player is red */
205 case 0: /* player is both colors */
208 case 1: /* player is white */
213 if (rscore || wscore) {
232 writel ("Are you sure you want to quit?");
235 writel ("Would you like to save this game?");
246 char special; /* special response */
252 while ( (c = readc()) != 'Y' && c != 'N') {
253 if (special && c == special)
257 writel (" (Y, N, or ");
261 writel (" (Y or N)");
278 writel ("Blot hit on ");
288 c = cturn/abs(cturn);
309 /* process arguments here. dashes are ignored, nbrw are ignored
310 if the game is being recovered */
312 while ((ch = getopt (argc, argv, "nbrwp:t:s:h")) != -1) {
315 /* don't ask if rules or instructions needed */
320 args[acnt++] = strdup ("-n");
323 /* player is both red and white */
329 args[acnt++] = strdup ("-b");
338 args[acnt++] = strdup ("-r");
341 /* player is white */
347 args[acnt++] = strdup ("-w");
350 /* print board after move according to following character */
352 if (optarg[0] != 'r' && optarg[0] != 'w' && optarg[0] != 'b')
354 args[acnt] = strdup ("-p ");
355 args[acnt++][2] = optarg[0];
356 if (optarg[0] == 'r')
358 if (optarg[0] == 'w')
360 if (optarg[0] == 'b')
365 tflag = getcaps (optarg);
373 for (i = 0; descr[i] != 0; i++)
380 if ( argc && argv[0][0] != '\0' )
389 board[6] = board[13] = -5;
391 board[12] = board[19] = 5;
394 off[0] = off[1] = -15;
418 if (stty (0,&tty) < 0)
424 /* go to bottom of screen */
431 /* fix terminal status */
450 while (c < '1' || c > '6')
456 while (c < '1' || c > '6')