1 static char sccsid[] = "	subs.c	4.1	82/05/11	";
2 
3 #include <stdio.h>
4 #include "back.h"
5 
6 int	buffnum;
7 char	outbuff[BUFSIZ];
8 
9 static char	plred[] = "Player is red, computer is white.";
10 static char	plwhite[] = "Player is white, computer is red.";
11 static char	nocomp[] = "(No computer play.)";
12 
13 char  *descr[] = {
14 	"Usage:  backgammon [-] [n r w b pr pw pb t3a]\n",
15 	"\t-\tgets this list\n\tn\tdon't ask for rules or instructions",
16 	"\tr\tplayer is red (implies n)\n\tw\tplayer is white (implies n)",
17 	"\tb\ttwo players, red and white (implies n)",
18 	"\tpr\tprint the board before red's turn",
19 	"\tpw\tprint the board before white's turn",
20 	"\tpb\tprint the board before both player's turn",
21 	"\tterm\tterminal is a term",
22 	"\tsfile\trecover saved game from file",
23 	0
24 };
25 
26 errexit (s)
27 register char	*s;
28 {
29 	write (2,"\n",1);
30 	perror (s);
31 	getout();
32 }
33 
34 strset (s1,s2)
35 register char	*s1, *s2;
36 {
37 	while ( (*s1++ = *s2++) != '\0');
38 }
39 
40 addbuf (c)
41 register char	c;
42 
43 {
44 	buffnum++;
45 	if (buffnum == BUFSIZ)  {
46 		if (write(1,outbuff,BUFSIZ) != BUFSIZ)
47 			errexit ("addbuf (write):");
48 		buffnum = 0;
49 	}
50 	outbuff[buffnum] = c;
51 }
52 
53 buflush ()  {
54 	if (buffnum < 0)
55 		return;
56 	buffnum++;
57 	if (write (1,outbuff,buffnum) != buffnum)
58 		errexit ("buflush (write):");
59 	buffnum = -1;
60 }
61 
62 readc () {
63 	char	c;
64 
65 	if (tflag)  {
66 		cline();
67 		newpos();
68 	}
69 	buflush();
70 	if (read(0,&c,1) != 1)
71 		errexit ("readc");
72 	if (c == '\177')
73 		getout();
74 	if (c == '\033' || c == '\015')
75 		return ('\n');
76 	if (cflag)
77 		return (c);
78 	if (c == '\014')
79 		return ('R');
80 	if (c >= 'a' && c <= 'z')
81 		return (c & 0137);
82 	return (c);
83 }
84 
85 writec (c)
86 char	c;
87 {
88 	if (tflag)
89 		fancyc (c);
90 	else
91 		addbuf (c);
92 }
93 
94 writel (l)
95 register char	*l;
96 {
97 #ifdef DEBUG
98 	register char	*s;
99 
100 	if (trace == NULL)
101 		trace = fopen ("bgtrace","w");
102 
103 	fprintf (trace,"writel: \"");
104 	for (s = l; *s; s++) {
105 		if (*s < ' ' || *s == '\177')
106 			fprintf (trace,"^%c",(*s)^0100);
107 		else
108 			putc (*s,trace);
109 	}
110 	fprintf (trace,"\"\n");
111 	fflush (trace);
112 #endif
113 
114 	while (*l)
115 		writec (*l++);
116 }
117 
118 proll ()   {
119 	if (d0)
120 		swap;
121 	if (cturn == 1)
122 		writel ("Red's roll:  ");
123 	else
124 		writel ("White's roll:  ");
125 	writec (D0+'0');
126 	writec ('\040');
127 	writec (D1+'0');
128 	if (tflag)
129 		cline();
130 }
131 
132 wrint (n)
133 int	n;
134 {
135 	register int	i, j, t;
136 
137 	for (i = 4; i > 0; i--)  {
138 		t = 1;
139 		for (j = 0; j<i; j++)
140 			t *= 10;
141 		if (n > t-1)
142 			writec ((n/t)%10+'0');
143 	}
144 	writec (n%10+'0');
145 }
146 
147 gwrite()  {
148 	register int	r, c;
149 
150 	if (tflag)  {
151 		r = curr;
152 		c = curc;
153 		curmove (16,0);
154 	}
155 
156 	if (gvalue > 1)  {
157 		writel ("Game value:  ");
158 		wrint (gvalue);
159 		writel (".  ");
160 		if (dlast == -1)
161 			writel (color[0]);
162 		else
163 			writel (color[1]);
164 		writel (" doubled last.");
165 	} else  {
166 		switch (pnum)  {
167 		case -1:			    /* player is red */
168 			writel (plred);
169 			break;
170 		case 0:				    /* player is both colors */
171 			writel (nocomp);
172 			break;
173 		case 1:				    /* player is white */
174 			writel (plwhite);
175 		}
176 	}
177 
178 	if (rscore || wscore)  {
179 		writel ("  ");
180 		wrscore();
181 	}
182 
183 	if (tflag)  {
184 		cline();
185 		curmove (r,c);
186 	}
187 }
188 
189 quit ()  {
190 	register int	i;
191 
192 	if (tflag)  {
193 		curmove (20,0);
194 		clend();
195 	} else
196 		writec ('\n');
197 	writel ("Are you sure you want to quit?");
198 	if (yorn (0))  {
199 		if (rfl)  {
200 			writel ("Would you like to save this game?");
201 			if (yorn(0))
202 				save(0);
203 		}
204 		cturn = 0;
205 		return (1);
206 	}
207 	return (0);
208 }
209 
210 yorn (special)
211 register char	special;			/* special response */
212 {
213 	register char	c;
214 	register int	i;
215 
216 	i = 1;
217 	while ( (c = readc()) != 'Y' && c != 'N')  {
218 		if (special && c == special)
219 			return (2);
220 		if (i)  {
221 			if (special)  {
222 				writel ("  (Y, N, or ");
223 				writec (special);
224 				writec (')');
225 			} else
226 				writel ("  (Y or N)");
227 			i = 0;
228 		} else
229 			writec ('\007');
230 	}
231 	if (c == 'Y')
232 		writel ("  Yes.\n");
233 	else
234 		writel ("  No.\n");
235 	if (tflag)
236 		buflush();
237 	return (c == 'Y');
238 }
239 
240 wrhit (i)
241 register int	i;
242 {
243 	writel ("Blot hit on ");
244 	wrint (i);
245 	writec ('.');
246 	writec ('\n');
247 }
248 
249 nexturn ()  {
250 	register int	c;
251 
252 	cturn = -cturn;
253 	c = cturn/abs(cturn);
254 	home = bar;
255 	bar = 25-bar;
256 	offptr += c;
257 	offopp -= c;
258 	inptr += c;
259 	inopp -= c;
260 	Colorptr += c;
261 	colorptr += c;
262 }
263 
264 getarg (arg)
265 register char	***arg;
266 
267 {
268 	register char	*s;
269 
270 	/* process arguments here.  dashes are ignored, nbrw are ignored
271 	   if the game is being recovered */
272 
273 	s = **arg;
274 	if (*s == '-' && s[1] == '\0')  {
275 		tflag = 0;
276 		text (descr);
277 		getout ();
278 	}
279 	for (; *s != '\0'; s++)  {
280 		switch (*s)  {
281 
282 		/* ignore dashes */
283 		case '-':
284 			break;
285 
286 		/* don't ask if rules or instructions needed */
287 		case 'n':
288 			if (rflag)
289 				break;
290 			aflag = 0;
291 			args[acnt++] = *s;
292 			break;
293 
294 		/* player is both read and white */
295 		case 'b':
296 			if (rflag)
297 				break;
298 			pnum = 0;
299 			aflag = 0;
300 			args[acnt++] = *s;
301 			break;
302 
303 		/* player is red */
304 		case 'r':
305 			if (rflag)
306 				break;
307 			pnum = -1;
308 			aflag = 0;
309 			args[acnt++] = *s;
310 			break;
311 
312 		/* player is white */
313 		case 'w':
314 			if (rflag)
315 				break;
316 			pnum = 1;
317 			aflag = 0;
318 			args[acnt++] = *s;
319 			break;
320 
321 		/* print board after move according to following character */
322 		case 'p':
323 			s++;
324 			if (*s != 'r' && *s != 'w' && *s != 'b')
325 				break;
326 			args[acnt++] = 'p';
327 			args[acnt++] = *s;
328 			if (*s == 'r')
329 				bflag = 1;
330 			if (*s == 'w')
331 				bflag = -1;
332 			if (*s == 'b')
333 				bflag = 0;
334 			break;
335 
336 		case 't':
337 			if (*++s == '\0')	/* get terminal caps */
338 				tflag = getcaps (*(++*arg));
339 			else
340 				tflag = getcaps (s);
341 			return;
342 
343 		case 's':
344 			if (*++s == '\0')	/* recover file */
345 				recover (*(++*arg));
346 			else
347 				recover (s);
348 			return;
349 		}
350 	}
351 }
352 
353 init ()  {
354 	register int	i;
355 	for (i = 0; i < 26;)
356 		board[i++] = 0;
357 	board[1] = 2;
358 	board[6] = board[13] = -5;
359 	board[8] = -3;
360 	board[12] = board[19] = 5;
361 	board[17] = 3;
362 	board[24] = -2;
363 	off[0] = off[1] = -15;
364 	in[0] = in[1] = 5;
365 	gvalue = 1;
366 	dlast = 0;
367 }
368 
369 wrscore ()  {
370 	writel ("Score:  ");
371 	writel (color[1]);
372 	writec (' ');
373 	wrint (rscore);
374 	writel (", ");
375 	writel (color[0]);
376 	writec (' ');
377 	wrint (wscore);
378 }
379 
380 fixtty (mode)
381 int	mode;
382 {
383 	if (tflag)
384 		newpos();
385 	buflush();
386 	tty.sg_flags = mode;
387 	if (stty (0,&tty) < 0)
388 		errexit("fixtty");
389 }
390 
391 getout ()  {
392 	/* go to bottom of screen */
393 	if (tflag)  {
394 		curmove (23,0);
395 		cline();
396 	} else
397 		writec ('\n');
398 
399 	/* fix terminal status */
400 	fixtty (old);
401 	exit();
402 }
403 roll ()  {
404 	register char	c;
405 	register int	row;
406 	register int	col;
407 
408 	if (iroll)  {
409 		if (tflag)  {
410 			row = curr;
411 			col = curc;
412 			curmove (17,0);
413 		} else
414 			writec ('\n');
415 		writel ("ROLL: ");
416 		c = readc();
417 		if (c != '\n')  {
418 			while (c < '1' || c > '6')
419 				c = readc();
420 			D0 = c-'0';
421 			writec (' ');
422 			writec (c);
423 			c = readc();
424 			while (c < '1' || c > '6')
425 				c = readc();
426 			D1 = c-'0';
427 			writec (' ');
428 			writec (c);
429 			if (tflag)  {
430 				curmove (17,0);
431 				cline();
432 				curmove (row,col);
433 			} else
434 				writec ('\n');
435 			return;
436 		}
437 		if (tflag)  {
438 			curmove (17,0);
439 			cline();
440 			curmove (row,col);
441 		} else
442 			writec ('\n');
443 	}
444 	D0 = rnum(6)+1;
445 	D1 = rnum(6)+1;
446 	d0 = 0;
447 }
448