1 static char sccsid[] = "	subs.c	4.2	82/11/27	";
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 	while (s[0][0] == '-') {
275 		switch (s[0][1])  {
276 
277 		/* don't ask if rules or instructions needed */
278 		case 'n':
279 			if (rflag)
280 				break;
281 			aflag = 0;
282 			args[acnt++] = 'n';
283 			break;
284 
285 		/* player is both read and white */
286 		case 'b':
287 			if (rflag)
288 				break;
289 			pnum = 0;
290 			aflag = 0;
291 			args[acnt++] = 'b';
292 			break;
293 
294 		/* player is red */
295 		case 'r':
296 			if (rflag)
297 				break;
298 			pnum = -1;
299 			aflag = 0;
300 			args[acnt++] = 'r';
301 			break;
302 
303 		/* player is white */
304 		case 'w':
305 			if (rflag)
306 				break;
307 			pnum = 1;
308 			aflag = 0;
309 			args[acnt++] = 'w';
310 			break;
311 
312 		/* print board after move according to following character */
313 		case 'p':
314 			if (s[0][2] != 'r' && s[0][2] != 'w' && s[0][2] != 'b')
315 				break;
316 			args[acnt++] = 'p';
317 			args[acnt++] = s[0][2];
318 			if (s[0][2] == 'r')
319 				bflag = 1;
320 			if (s[0][2] == 'w')
321 				bflag = -1;
322 			if (s[0][2] == 'b')
323 				bflag = 0;
324 			break;
325 
326 		case 't':
327 			if (s[0][2] == '\0') {	/* get terminal caps */
328 				s++;
329 				tflag = getcaps (*s);
330 			} else
331 				tflag = getcaps (&s[0][2]);
332 			break;
333 
334 		case 's':
335 			s++;
336 			/* recover file */
337 			recover (s[0]);
338 			break;
339 		}
340 		s++;
341 	}
342 	if (s[0] != 0)
343 		recover(s[0]);
344 }
345 
346 init ()  {
347 	register int	i;
348 	for (i = 0; i < 26;)
349 		board[i++] = 0;
350 	board[1] = 2;
351 	board[6] = board[13] = -5;
352 	board[8] = -3;
353 	board[12] = board[19] = 5;
354 	board[17] = 3;
355 	board[24] = -2;
356 	off[0] = off[1] = -15;
357 	in[0] = in[1] = 5;
358 	gvalue = 1;
359 	dlast = 0;
360 }
361 
362 wrscore ()  {
363 	writel ("Score:  ");
364 	writel (color[1]);
365 	writec (' ');
366 	wrint (rscore);
367 	writel (", ");
368 	writel (color[0]);
369 	writec (' ');
370 	wrint (wscore);
371 }
372 
373 fixtty (mode)
374 int	mode;
375 {
376 	if (tflag)
377 		newpos();
378 	buflush();
379 	tty.sg_flags = mode;
380 	if (stty (0,&tty) < 0)
381 		errexit("fixtty");
382 }
383 
384 getout ()  {
385 	/* go to bottom of screen */
386 	if (tflag)  {
387 		curmove (23,0);
388 		cline();
389 	} else
390 		writec ('\n');
391 
392 	/* fix terminal status */
393 	fixtty (old);
394 	exit();
395 }
396 roll ()  {
397 	register char	c;
398 	register int	row;
399 	register int	col;
400 
401 	if (iroll)  {
402 		if (tflag)  {
403 			row = curr;
404 			col = curc;
405 			curmove (17,0);
406 		} else
407 			writec ('\n');
408 		writel ("ROLL: ");
409 		c = readc();
410 		if (c != '\n')  {
411 			while (c < '1' || c > '6')
412 				c = readc();
413 			D0 = c-'0';
414 			writec (' ');
415 			writec (c);
416 			c = readc();
417 			while (c < '1' || c > '6')
418 				c = readc();
419 			D1 = c-'0';
420 			writec (' ');
421 			writec (c);
422 			if (tflag)  {
423 				curmove (17,0);
424 				cline();
425 				curmove (row,col);
426 			} else
427 				writec ('\n');
428 			return;
429 		}
430 		if (tflag)  {
431 			curmove (17,0);
432 			cline();
433 			curmove (row,col);
434 		} else
435 			writec ('\n');
436 	}
437 	D0 = rnum(6)+1;
438 	D1 = rnum(6)+1;
439 	d0 = 0;
440 }
441