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.3 2006/08/08 16:36:11 pavalos Exp $
45 static const char plred[] = "Player is red, computer is white.";
46 static const char plwhite[] = "Player is white, computer is red.";
47 static const char nocomp[] = "(No computer play.)";
49 const char *const descr[] = {
50 "Usage: backgammon [-h n r w b pr pw pb tterm sfile]\n",
51 "\t-h\tgets this list\n\t-n\tdon't ask for rules or instructions",
52 "\t-r\tplayer is red (implies -n)\n\t-w\tplayer is white (implies -n)",
53 "\t-b\ttwo players, red and white (implies -n)",
54 "\t-pr\tprint the board before red's turn",
55 "\t-pw\tprint the board before white's turn",
56 "\t-pb\tprint the board before both player's turn",
57 "\t-tterm\tterminal is a term",
58 "\t-sfile\trecover saved game from file",
63 errexit(const char *s)
74 if (buffnum == BUFSIZ) {
75 if (write(1,outbuff,BUFSIZ) != BUFSIZ)
76 errexit ("addbuf (write):");
89 if (write (1,outbuff,buffnum) != buffnum)
90 errexit ("buflush (write):");
104 if (read(0,&c,1) != 1)
106 #ifdef WHY_IS_THIS_HARDWIRED_IN_HERE
110 if (c == '\033' || c == '\015')
116 if (c >= 'a' && c <= 'z')
131 writel(const char *l)
137 trace = fopen ("bgtrace","w");
139 fprintf (trace,"writel: \"");
140 for (s = l; *s; s++) {
141 if (*s < ' ' || *s == '\177')
142 fprintf (trace,"^%c",(*s)^0100);
146 fprintf (trace,"\"\n");
160 writel ("Red's roll: ");
162 writel ("White's roll: ");
175 for (i = 4; i > 0; i--) {
177 for (j = 0; j<i; j++)
180 writec ((n/t)%10+'0');
198 writel ("Game value: ");
205 writel (" doubled last.");
208 case -1: /* player is red */
211 case 0: /* player is both colors */
214 case 1: /* player is white */
219 if (rscore || wscore) {
238 writel ("Are you sure you want to quit?");
241 writel ("Would you like to save this game?");
258 while ( (c = readc()) != 'Y' && c != 'N') {
259 if (special && c == special)
263 writel (" (Y, N, or ");
267 writel (" (Y or N)");
284 writel ("Blot hit on ");
296 c = cturn/abs(cturn);
308 getarg(int argc, char **argv)
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' )
395 board[6] = board[13] = -5;
397 board[12] = board[19] = 5;
400 off[0] = off[1] = -15;
426 if (ioctl(0, TIOCSETP, &tty) < 0)
433 /* go to bottom of screen */
440 /* fix terminal status */
462 while (c < '1' || c > '6')
468 while (c < '1' || c > '6')