subs.c revision 1.5 1 /* $NetBSD: subs.c,v 1.5 1995/04/29 00:44:15 mycroft Exp $ */
2
3 /*
4 * Copyright (c) 1980, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)subs.c 8.1 (Berkeley) 5/31/93";
39 #else
40 static char rcsid[] = "$NetBSD: subs.c,v 1.5 1995/04/29 00:44:15 mycroft Exp $";
41 #endif
42 #endif /* not lint */
43
44 #include <stdio.h>
45 #include "back.h"
46
47 int buffnum;
48 char outbuff[BUFSIZ];
49
50 static char plred[] = "Player is red, computer is white.";
51 static char plwhite[] = "Player is white, computer is red.";
52 static char nocomp[] = "(No computer play.)";
53
54 char *descr[] = {
55 "Usage: backgammon [-] [n r w b pr pw pb t3a]\n",
56 "\t-\tgets this list\n\tn\tdon't ask for rules or instructions",
57 "\tr\tplayer is red (implies n)\n\tw\tplayer is white (implies n)",
58 "\tb\ttwo players, red and white (implies n)",
59 "\tpr\tprint the board before red's turn",
60 "\tpw\tprint the board before white's turn",
61 "\tpb\tprint the board before both player's turn",
62 "\tterm\tterminal is a term",
63 "\tsfile\trecover saved game from file",
64 0
65 };
66
67 errexit (s)
68 register char *s;
69 {
70 write (2,"\n",1);
71 perror (s);
72 getout();
73 }
74
75 strset (s1,s2)
76 register char *s1, *s2;
77 {
78 while ( (*s1++ = *s2++) != '\0');
79 }
80
81 addbuf (c)
82 register char c;
83
84 {
85 buffnum++;
86 if (buffnum == BUFSIZ) {
87 if (write(1,outbuff,BUFSIZ) != BUFSIZ)
88 errexit ("addbuf (write):");
89 buffnum = 0;
90 }
91 outbuff[buffnum] = c;
92 }
93
94 buflush () {
95 if (buffnum < 0)
96 return;
97 buffnum++;
98 if (write (1,outbuff,buffnum) != buffnum)
99 errexit ("buflush (write):");
100 buffnum = -1;
101 }
102
103 readc () {
104 char c;
105
106 if (tflag) {
107 cline();
108 newpos();
109 }
110 buflush();
111 if (read(0,&c,1) != 1)
112 errexit ("readc");
113 #ifdef WHY_IS_THIS_HARDWIRED_IN_HERE
114 if (c == '\177')
115 getout();
116 #endif
117 if (c == '\033' || c == '\015')
118 return ('\n');
119 if (cflag)
120 return (c);
121 if (c == '\014')
122 return ('R');
123 if (c >= 'a' && c <= 'z')
124 return (c & 0137);
125 return (c);
126 }
127
128 writec (c)
129 char c;
130 {
131 if (tflag)
132 fancyc (c);
133 else
134 addbuf (c);
135 }
136
137 writel (l)
138 register char *l;
139 {
140 #ifdef DEBUG
141 register char *s;
142
143 if (trace == NULL)
144 trace = fopen ("bgtrace","w");
145
146 fprintf (trace,"writel: \"");
147 for (s = l; *s; s++) {
148 if (*s < ' ' || *s == '\177')
149 fprintf (trace,"^%c",(*s)^0100);
150 else
151 putc (*s,trace);
152 }
153 fprintf (trace,"\"\n");
154 fflush (trace);
155 #endif
156
157 while (*l)
158 writec (*l++);
159 }
160
161 proll () {
162 if (d0)
163 swap;
164 if (cturn == 1)
165 writel ("Red's roll: ");
166 else
167 writel ("White's roll: ");
168 writec (D0+'0');
169 writec ('\040');
170 writec (D1+'0');
171 if (tflag)
172 cline();
173 }
174
175 wrint (n)
176 int n;
177 {
178 register int i, j, t;
179
180 for (i = 4; i > 0; i--) {
181 t = 1;
182 for (j = 0; j<i; j++)
183 t *= 10;
184 if (n > t-1)
185 writec ((n/t)%10+'0');
186 }
187 writec (n%10+'0');
188 }
189
190 gwrite() {
191 register int r, c;
192
193 if (tflag) {
194 r = curr;
195 c = curc;
196 curmove (16,0);
197 }
198
199 if (gvalue > 1) {
200 writel ("Game value: ");
201 wrint (gvalue);
202 writel (". ");
203 if (dlast == -1)
204 writel (color[0]);
205 else
206 writel (color[1]);
207 writel (" doubled last.");
208 } else {
209 switch (pnum) {
210 case -1: /* player is red */
211 writel (plred);
212 break;
213 case 0: /* player is both colors */
214 writel (nocomp);
215 break;
216 case 1: /* player is white */
217 writel (plwhite);
218 }
219 }
220
221 if (rscore || wscore) {
222 writel (" ");
223 wrscore();
224 }
225
226 if (tflag) {
227 cline();
228 curmove (r,c);
229 }
230 }
231
232 quit () {
233 register int i;
234
235 if (tflag) {
236 curmove (20,0);
237 clend();
238 } else
239 writec ('\n');
240 writel ("Are you sure you want to quit?");
241 if (yorn (0)) {
242 if (rfl) {
243 writel ("Would you like to save this game?");
244 if (yorn(0))
245 save(0);
246 }
247 cturn = 0;
248 return (1);
249 }
250 return (0);
251 }
252
253 yorn (special)
254 register char special; /* special response */
255 {
256 register char c;
257 register int i;
258
259 i = 1;
260 while ( (c = readc()) != 'Y' && c != 'N') {
261 if (special && c == special)
262 return (2);
263 if (i) {
264 if (special) {
265 writel (" (Y, N, or ");
266 writec (special);
267 writec (')');
268 } else
269 writel (" (Y or N)");
270 i = 0;
271 } else
272 writec ('\007');
273 }
274 if (c == 'Y')
275 writel (" Yes.\n");
276 else
277 writel (" No.\n");
278 if (tflag)
279 buflush();
280 return (c == 'Y');
281 }
282
283 wrhit (i)
284 register int i;
285 {
286 writel ("Blot hit on ");
287 wrint (i);
288 writec ('.');
289 writec ('\n');
290 }
291
292 nexturn () {
293 register int c;
294
295 cturn = -cturn;
296 c = cturn/abs(cturn);
297 home = bar;
298 bar = 25-bar;
299 offptr += c;
300 offopp -= c;
301 inptr += c;
302 inopp -= c;
303 Colorptr += c;
304 colorptr += c;
305 }
306
307 getarg (arg)
308 register char ***arg;
309
310 {
311 register char **s;
312
313 /* process arguments here. dashes are ignored, nbrw are ignored
314 if the game is being recovered */
315
316 s = *arg;
317 while (s[0][0] == '-') {
318 switch (s[0][1]) {
319
320 /* don't ask if rules or instructions needed */
321 case 'n':
322 if (rflag)
323 break;
324 aflag = 0;
325 args[acnt++] = 'n';
326 break;
327
328 /* player is both read and white */
329 case 'b':
330 if (rflag)
331 break;
332 pnum = 0;
333 aflag = 0;
334 args[acnt++] = 'b';
335 break;
336
337 /* player is red */
338 case 'r':
339 if (rflag)
340 break;
341 pnum = -1;
342 aflag = 0;
343 args[acnt++] = 'r';
344 break;
345
346 /* player is white */
347 case 'w':
348 if (rflag)
349 break;
350 pnum = 1;
351 aflag = 0;
352 args[acnt++] = 'w';
353 break;
354
355 /* print board after move according to following character */
356 case 'p':
357 if (s[0][2] != 'r' && s[0][2] != 'w' && s[0][2] != 'b')
358 break;
359 args[acnt++] = 'p';
360 args[acnt++] = s[0][2];
361 if (s[0][2] == 'r')
362 bflag = 1;
363 if (s[0][2] == 'w')
364 bflag = -1;
365 if (s[0][2] == 'b')
366 bflag = 0;
367 break;
368
369 case 't':
370 if (s[0][2] == '\0') { /* get terminal caps */
371 s++;
372 tflag = getcaps (*s);
373 } else
374 tflag = getcaps (&s[0][2]);
375 break;
376
377 case 's':
378 s++;
379 /* recover file */
380 recover (s[0]);
381 break;
382 }
383 s++;
384 }
385 if (s[0] != 0)
386 recover(s[0]);
387 }
388
389 init () {
390 register int i;
391 for (i = 0; i < 26;)
392 board[i++] = 0;
393 board[1] = 2;
394 board[6] = board[13] = -5;
395 board[8] = -3;
396 board[12] = board[19] = 5;
397 board[17] = 3;
398 board[24] = -2;
399 off[0] = off[1] = -15;
400 in[0] = in[1] = 5;
401 gvalue = 1;
402 dlast = 0;
403 }
404
405 wrscore () {
406 writel ("Score: ");
407 writel (color[1]);
408 writec (' ');
409 wrint (rscore);
410 writel (", ");
411 writel (color[0]);
412 writec (' ');
413 wrint (wscore);
414 }
415
416 fixtty (t)
417 struct termios *t;
418 {
419 if (tflag)
420 newpos();
421 buflush();
422 if (tcsetattr (0, TCSADRAIN, t) < 0)
423 errexit("fixtty");
424 }
425
426 getout () {
427 /* go to bottom of screen */
428 if (tflag) {
429 curmove (23,0);
430 cline();
431 } else
432 writec ('\n');
433
434 /* fix terminal status */
435 fixtty (&old);
436 exit(0);
437 }
438 roll () {
439 register char c;
440 register int row;
441 register int col;
442
443 if (iroll) {
444 if (tflag) {
445 row = curr;
446 col = curc;
447 curmove (17,0);
448 } else
449 writec ('\n');
450 writel ("ROLL: ");
451 c = readc();
452 if (c != '\n') {
453 while (c < '1' || c > '6')
454 c = readc();
455 D0 = c-'0';
456 writec (' ');
457 writec (c);
458 c = readc();
459 while (c < '1' || c > '6')
460 c = readc();
461 D1 = c-'0';
462 writec (' ');
463 writec (c);
464 if (tflag) {
465 curmove (17,0);
466 cline();
467 curmove (row,col);
468 } else
469 writec ('\n');
470 return;
471 }
472 if (tflag) {
473 curmove (17,0);
474 cline();
475 curmove (row,col);
476 } else
477 writec ('\n');
478 }
479 D0 = rnum(6)+1;
480 D1 = rnum(6)+1;
481 d0 = 0;
482 }
483