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