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