|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.