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