|
|
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.