|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <signal.h> ! 3: #ifdef BELL3.0 ! 4: #include <fcntl.h> ! 5: #include <termio.h> ! 6: #else ! 7: #include <sgtty.h> ! 8: #endif ! 9: #include <pwd.h> ! 10: #include "pacdefs.h" ! 11: ! 12: #ifndef BELL3.0 ! 13: #define O_RDWR 2 ! 14: #define O_CREAT 0 ! 15: #define O_RDONLY 0 ! 16: #define O_NDELAY 0 ! 17: #endif ! 18: ! 19: extern char ! 20: *BC, ! 21: *UP; ! 22: ! 23: extern int ! 24: putch(); ! 25: ! 26: extern char ! 27: *tgoto(), ! 28: *mktemp(); ! 29: ! 30: extern int ! 31: delay, ! 32: errno, ! 33: goldcnt; ! 34: ! 35: extern long ! 36: time(); ! 37: ! 38: extern struct pac ! 39: *pacptr; ! 40: ! 41: extern struct pac ! 42: monst[]; ! 43: ! 44: #ifndef MSG ! 45: int comfile; ! 46: #else ! 47: struct mstruct ! 48: { ! 49: int frompid; ! 50: int mtype; ! 51: }; ! 52: ! 53: #endif ! 54: ! 55: #ifndef NODELAY ! 56: ! 57: #ifndef MSG ! 58: char *fnam; ! 59: #endif ! 60: ! 61: #endif ! 62: ! 63: /* ! 64: * initbrd is used to re-initialize the display ! 65: * array once a new game is started. ! 66: */ ! 67: char initbrd[BRDY][BRDX] = ! 68: { ! 69: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", ! 70: "O + + + * + + + + OOO + + + + * + + + O", ! 71: "O X OOO + OOOOO + OOO + OOOOO + OOO X O", ! 72: "O * + + * + * + * + + * + * + * + + * O", ! 73: "O + OOO + O + OOOOOOOOOOO + O + OOO + O", ! 74: "O + + + * O + + + OOO + + + O * + + + O", ! 75: "OOOOOOO + OOOOO + OOO + OOOOO + OOOOOOO", ! 76: " O + O + + * + + * + + O + O ", ! 77: " O + O + OOO - - OOO + O + O ", ! 78: "OOOOOOO + O + O O + O + OOOOOOO", ! 79: " * + * O O * + * ", ! 80: "OOOOOOO + O + O O + O + OOOOOOO", ! 81: " O + O + OOOOOOOOOOO + O + O ", ! 82: " O + O * + + + + + + * O + O ", ! 83: "OOOOOOO + O + OOOOOOOOOOO + O + OOOOOOO", ! 84: "O + + + * + * + + OOO + + * + * + + + O", ! 85: "O X OOO + OOOOO + OOO + OOOOO + OOO X O", ! 86: "O + + O * + * + * + + * + * + * O + + O", ! 87: "OOO + O + O + OOOOOOOOOOO + O + O + OOO", ! 88: "O + * + + O + + + OOO + + + O + + * + O", ! 89: "O + OOOOOOOOOOO + OOO + OOOOOOOOOOO + O", ! 90: "O + + + + + + + * + + * + + + + + + + O", ! 91: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", ! 92: }; ! 93: ! 94: /* ! 95: * brd is kept for historical reasons. ! 96: * It should only be used in the routine "which" ! 97: * to determine the next move for a monster or ! 98: * in the routine "monster" to determine if it ! 99: * was a valid move. Admittedly this is redundant ! 100: * and could be replaced by initbrd, but it is kept ! 101: * so that someday additional intelligence or ! 102: * optimization could be added to the choice of ! 103: * the monster's next move. Hence, note the symbol ! 104: * CHOICE at most points that a move decision ! 105: * logically HAS to be made. ! 106: */ ! 107: char brd[BRDY][BRDX] = ! 108: { ! 109: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", ! 110: "O + + + * + + + + OOO + + + + * + + + O", ! 111: "O X OOO + OOOOO + OOO + OOOOO + OOO X O", ! 112: "O * + + * + * + * + + * + * + * + + * O", ! 113: "O + OOO + O + OOOOOOOOOOO + O + OOO + O", ! 114: "O + + + * O + + + OOO + + + O * + + + O", ! 115: "OOOOOOO + OOOOO + OOO + OOOOO + OOOOOOO", ! 116: " O + O + + * + + * + + O + O ", ! 117: " O + O + OOO - - OOO + O + O ", ! 118: "OOOOOOO + O + O O + O + OOOOOOO", ! 119: " * + * O O * + * ", ! 120: "OOOOOOO + O + O O + O + OOOOOOO", ! 121: " O + O + OOOOOOOOOOO + O + O ", ! 122: " O + O * + + + + + + * O + O ", ! 123: "OOOOOOO + O + OOOOOOOOOOO + O + OOOOOOO", ! 124: "O + + + * + * + + OOO + + * + * + + + O", ! 125: "O X OOO + OOOOO + OOO + OOOOO + OOO X O", ! 126: "O + + O * + * + * + + * + * + * O + + O", ! 127: "OOO + O + O + OOOOOOOOOOO + O + O + OOO", ! 128: "O + * + + O + + + OOO + + + O + + * + O", ! 129: "O + OOOOOOOOOOO + OOO + OOOOOOOOOOO + O", ! 130: "O + + + + + + + * + + * + + + + + + + O", ! 131: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", ! 132: }; ! 133: ! 134: /* ! 135: * display reflects the screen on the player's ! 136: * terminal at any point in time. ! 137: */ ! 138: char display[BRDY][BRDX] = ! 139: { ! 140: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", ! 141: "O + + + + + + + + OOO + + + + + + + + O", ! 142: "O X OOO + OOOOO + OOO + OOOOO + OOO X O", ! 143: "O + + + + + + + + + + + + + + + + + + O", ! 144: "O + OOO + O + OOOOOOOOOOO + O + OOO + O", ! 145: "O + + + + O + + + OOO + + + O + + + + O", ! 146: "OOOOOOO + OOOOO + OOO + OOOOO + OOOOOOO", ! 147: " O + O + + + + + + + + O + O ", ! 148: " O + O + OOO - - OOO + O + O ", ! 149: "OOOOOOO + O + O O + O + OOOOOOO", ! 150: " + + + O O + + + ", ! 151: "OOOOOOO + O + O O + O + OOOOOOO", ! 152: " O + O + OOOOOOOOOOO + O + O ", ! 153: " O + O + + + + + + + + O + O ", ! 154: "OOOOOOO + O + OOOOOOOOOOO + O + OOOOOOO", ! 155: "O + + + + + + + + OOO + + + + + + + + O", ! 156: "O X OOO + OOOOO + OOO + OOOOO + OOO X O", ! 157: "O + + O + + + + + + + + + + + + O + + O", ! 158: "OOO + O + O + OOOOOOOOOOO + O + O + OOO", ! 159: "O + + + + O + + + OOO + + + O + + + + O", ! 160: "O + OOOOOOOOOOO + OOO + OOOOOOOOOOO + O", ! 161: "O + + + + + + + + + + + + + + + + + + O", ! 162: "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", ! 163: }; ! 164: ! 165: /* terminal type from environment and /etc/termcap ala ex & vi */ ! 166: char *vs_cl = "", /* clear screen sequence */ ! 167: *vs_cm = "", /* cursor positioning sequence */ ! 168: *vs_vb = ""; ! 169: ! 170: char combuf[BUFSIZ], ! 171: message[81], /* temporary message buffer */ ! 172: inbuf[2]; ! 173: ! 174: int ppid, ! 175: cpid, ! 176: game, ! 177: killcnt = 0, ! 178: vs_rows, ! 179: vs_cols; ! 180: ! 181: unsigned ! 182: pscore; ! 183: ! 184: long timein; ! 185: ! 186: #ifdef BELL3.0 ! 187: struct termio ! 188: savetty, ! 189: newtty; ! 190: #else ! 191: struct sgttyb ! 192: savetty, newtty; ! 193: #endif ! 194: ! 195: struct uscore ! 196: { ! 197: unsigned score; /* same type as pscore */ ! 198: int uid; /* uid of player */ ! 199: }; ! 200: ! 201: struct scorebrd ! 202: { ! 203: struct uscore entry[MSSAVE]; ! 204: } scoresave[MGTYPE] = ! 205: { ! 206: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 207: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 208: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 209: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ! 210: }; ! 211: ! 212: update() ! 213: { ! 214: char str[10]; ! 215: ! 216: (void) sprintf(str, "%6d", pscore); ! 217: SPLOT(0, 52, str); ! 218: (void) sprintf(str, "%6d", goldcnt); ! 219: SPLOT(21, 57, str); ! 220: } ! 221: ! 222: reinit() ! 223: { ! 224: register int locx, locy; ! 225: register char tmp; ! 226: ! 227: for (locy = 0; locy < BRDY; locy++) ! 228: { ! 229: for (locx = 0; locx < BRDX; locx++) ! 230: { ! 231: tmp = initbrd[locy][locx]; ! 232: brd[locy][locx] = tmp; ! 233: if ((display[locy][locx] = tmp) == CHOICE) ! 234: { ! 235: display[locy][locx] = GOLD; ! 236: }; ! 237: }; ! 238: }; ! 239: goldcnt = GOLDCNT; ! 240: delay -= (delay / 10); /* hot it up */ ! 241: } ! 242: ! 243: errgen(string) ! 244: char *string; ! 245: { ! 246: SPLOT(23,45,string); ! 247: } ! 248: ! 249: dokill(mnum) ! 250: int mnum; ! 251: { ! 252: register struct pac *mptr; ! 253: ! 254: PLOT(0, 0, BEEP); ! 255: if (pacptr->danger == TRUE) ! 256: { ! 257: if (++killcnt == MAXMONSTER) ! 258: { ! 259: if (display[TRYPOS][TRXPOS] == GOLD) ! 260: { ! 261: goldcnt--; ! 262: }; ! 263: display[TRYPOS][TRXPOS] = TREASURE; ! 264: PLOT(TRYPOS, TRXPOS, TREASURE); ! 265: killcnt = 0; ! 266: }; ! 267: SPLOT(5, 45, "MONSTERS KILLED: "); ! 268: (void) sprintf(message, "%1d", killcnt); ! 269: SPLOT(5, 62, message); ! 270: mptr = (&monst[mnum]); ! 271: mptr->ypos = MSTARTY; ! 272: mptr->xpos = MSTARTX + (2 * mnum); ! 273: mptr->stat = START; ! 274: PLOT(mptr->ypos, mptr->xpos, MONSTER); ! 275: pscore += KILLSCORE; ! 276: return(GOTONE); ! 277: }; ! 278: return(TURKEY); ! 279: } ! 280: ! 281: /* ! 282: /* clr -- issues an escape sequence to clear the display ! 283: */ ! 284: ! 285: clr() ! 286: { ! 287: (void) fprintf(stdout, "%s", vs_cl); ! 288: fflush(stdout); ! 289: nap(2); ! 290: } ! 291: ! 292: /* ! 293: * display initial instructions ! 294: */ ! 295: ! 296: instruct() ! 297: { ! 298: clr(); ! 299: POS(0, 0); ! 300: (void) fprintf(stdout, "Attention: you are in a dungeon, being chased by monsters!\r\n\n"); ! 301: (void) fprintf(stdout, "There are gold coins scattered uniformly in the dungeon, marked by \"+\".\r\n"); ! 302: (void) fprintf(stdout, "One magic potion is available at each spot marked \"X\". Each potion will\r\n"); ! 303: (void) fprintf(stdout, "enable you to kill monsters by touch for a limited duration. It will also\r\n"); ! 304: (void) fprintf(stdout, "scare them away. When you kill a monster it is regenerated, but this takes\r\n"); ! 305: (void) fprintf(stdout, "time. You can also regenerate yourself %d times. Killing all the monsters\r\n", MAXPAC); ! 306: (void) fprintf(stdout, "results in further treasure appearing magically somewhere in the dungeon,\r\n"); ! 307: (void) fprintf(stdout, "marked by \"$\". There is a magic tunnel connecting the center left and\r\n"); ! 308: (void) fprintf(stdout, "center right parts of the dungeon. The monsters know about it!\r\n\n"); ! 309: (void) fprintf(stdout, " Type: h to move left\r\n"); ! 310: (void) fprintf(stdout, " l to move right\r\n"); ! 311: (void) fprintf(stdout, " k or w to move up\r\n"); ! 312: (void) fprintf(stdout, " j or x to move down\r\n"); ! 313: (void) fprintf(stdout, " <space> to halt \r\n"); ! 314: (void) fprintf(stdout, " q to quit\r\n\n"); ! 315: (void) fprintf(stdout, " Type: 1 normal game\r\n"); ! 316: (void) fprintf(stdout, " 2 blinking monsters\r\n"); ! 317: (void) fprintf(stdout, " 3 intelligent monsters\r\n"); ! 318: (void) fprintf(stdout, " 4 blinking intelligent monsters\r\n"); ! 319: } ! 320: ! 321: /* ! 322: * over -- game over processing ! 323: */ ! 324: ! 325: over() ! 326: { ! 327: register int i; ! 328: register int line; ! 329: int scorefile = 0; ! 330: struct passwd *getpwuid(), *p; ! 331: ! 332: fflush(stdout); ! 333: sleep(5); /* for slow readers */ ! 334: poll(0); /* flush and discard input from player */ ! 335: clr(); ! 336: /* high score to date processing */ ! 337: if (game != 0) ! 338: { ! 339: line = 7; ! 340: POS(line++, 20); ! 341: (void) fprintf(stdout, " ___________________________ "); ! 342: POS(line++, 20); ! 343: (void) fprintf(stdout, "| |"); ! 344: POS(line++, 20); ! 345: (void) fprintf(stdout, "| G A M E O V E R |"); ! 346: POS(line++, 20); ! 347: (void) fprintf(stdout, "| |"); ! 348: POS(line++, 20); ! 349: (void) fprintf(stdout, "| Game type: %1d |",game); ! 350: if ((scorefile = open(MAXSCORE, O_RDWR | O_CREAT, 0666)) != -1) ! 351: { ! 352: read(scorefile, (char *)scoresave, sizeof(scoresave)); ! 353: for (i = MSSAVE - 1; i >= 0; i--) { ! 354: if (scoresave[game - 1].entry[i].score < pscore) ! 355: { ! 356: if (i < MSSAVE - 1) ! 357: { ! 358: scoresave[game - 1].entry[i + 1].score = ! 359: scoresave[game - 1].entry[i].score; ! 360: scoresave[game - 1].entry[i + 1].uid = ! 361: scoresave[game - 1].entry[i].uid; ! 362: }; ! 363: scoresave[game - 1].entry[i].score = pscore; ! 364: scoresave[game - 1].entry[i].uid = getuid(); ! 365: }; ! 366: }; ! 367: lseek(scorefile, 0l, 0); ! 368: write(scorefile, (char *)scoresave, sizeof(scoresave)); ! 369: close(scorefile); ! 370: POS(line++, 20); ! 371: (void) fprintf(stdout, "| High Scores to date: |"); ! 372: for (i = 0; i < MSSAVE; i++) ! 373: { ! 374: setpwent(); ! 375: p = getpwuid(scoresave[game - 1].entry[i].uid); ! 376: POS(line++, 20); ! 377: (void) fprintf(stdout, "| Player : %-8s %5u |", p->pw_name, ! 378: scoresave[game - 1].entry[i].score); ! 379: }; ! 380: } ! 381: else ! 382: { ! 383: POS(line++, 20); ! 384: (void) fprintf(stdout, "| |"); ! 385: POS(line++, 20); ! 386: (void) fprintf(stdout, "| Please create a 'paclog' |"); ! 387: POS(line++, 20); ! 388: (void) fprintf(stdout, "| file. See 'MAXSCORE' in |"); ! 389: POS(line++, 20); ! 390: (void) fprintf(stdout, "| 'pacdefs.h'. |"); ! 391: }; ! 392: POS(line++, 20); ! 393: (void) fprintf(stdout, "| |"); ! 394: POS(line++, 20); ! 395: (void) fprintf(stdout, "| Your score: %-5u |", pscore); ! 396: POS(line, 20); ! 397: (void) fprintf(stdout, "|___________________________|"); ! 398: }; ! 399: leave(); ! 400: } ! 401: ! 402: /* ! 403: * leave -- flush buffers,kill the Child, reset tty, and delete tempfile ! 404: */ ! 405: ! 406: leave() ! 407: { ! 408: POS(23, 0); ! 409: (void) fflush(stdout); ! 410: sleep(1); ! 411: ! 412: #ifndef NODELAY ! 413: kill(cpid, SIGKILL); ! 414: #endif ! 415: ! 416: #ifdef BELL3.0 ! 417: ioctl(0, TCSETAW, &savetty); ! 418: #else ! 419: ioctl(0, TIOCSETP, &savetty); ! 420: #endif ! 421: ! 422: #ifndef NODELAY ! 423: ! 424: #ifndef MSG ! 425: close(comfile); ! 426: unlink(fnam); ! 427: #endif ! 428: ! 429: #endif ! 430: exit(0); ! 431: } ! 432: ! 433: /* ! 434: * init -- does global initialization and spawns a child process to read ! 435: * the input terminal. ! 436: */ ! 437: ! 438: init() ! 439: { ! 440: register int tries = 0; ! 441: static int lastchar = DELETE; ! 442: extern short ospeed; /* baud rate for crt (for tputs()) */ ! 443: ! 444: errno = 0; ! 445: (void) time(&timein); /* get start time */ ! 446: srand((unsigned)timein); /* start rand randomly */ ! 447: /* ! 448: * verify CRT and get proper cursor control sequence. ! 449: */ ! 450: ! 451: #ifdef NODELAY ! 452: ! 453: #ifndef BELL3.0 ! 454: close(0); ! 455: if (open("/dev/tty", O_RDONLY | O_NDELAY) != 0) ! 456: { ! 457: perror("Unable to open /dev/tty"); ! 458: exit(1); ! 459: }; ! 460: #endif ! 461: ! 462: #endif ! 463: vsinit(); ! 464: /* ! 465: * setup raw mode, no echo ! 466: */ ! 467: #ifdef BELL3.0 ! 468: ioctl(0, TCGETA, &savetty); ! 469: newtty = savetty; ! 470: if ((savetty.c_cflag & CBAUD) == B9600) ! 471: { ! 472: delay = 1000 * (nrand(10) + 5); ! 473: } ! 474: else ! 475: { ! 476: delay = 1000; ! 477: }; ! 478: ospeed = savetty.c_cflag & CBAUD; /* for tputs() */ ! 479: #ifdef NODELAY ! 480: newtty.c_cc[VTIME] = 7; ! 481: newtty.c_cc[VMIN] = 0; ! 482: #else ! 483: newtty.c_cc[VMIN] = 1; ! 484: #endif ! 485: newtty.c_iflag = 0; ! 486: newtty.c_oflag &= ~OPOST; ! 487: newtty.c_cflag &= ~(PARENB | CSIZE); ! 488: newtty.c_cflag |= CS8; ! 489: newtty.c_lflag &= ~(ECHO | ECHOE | ISIG | ICANON | XCASE); ! 490: ioctl(0, TCSETAW, &newtty); ! 491: #else ! 492: ioctl(0, TIOCGETP, &savetty); ! 493: newtty = savetty; ! 494: if (savetty.sg_ospeed >= B9600) ! 495: delay = 1000 * (nrand(10) + 5); ! 496: else ! 497: delay = 1000; ! 498: ospeed = savetty.sg_ospeed; /* for tputs() */ ! 499: newtty.sg_flags |= CBREAK; ! 500: newtty.sg_flags &= ~ECHO; ! 501: ioctl(0, TIOCSETP, &newtty); ! 502: #endif ! 503: ! 504: /* ! 505: * set up communications ! 506: */ ! 507: ! 508: #ifndef NODELAY ! 509: ! 510: #ifndef MSG ! 511: fnam = mktemp(TMPF); ! 512: if ((comfile = creat(fnam, 0666)) == -1) ! 513: { ! 514: (void) sprintf(message, "Cannot create %s", fnam); ! 515: perror(message); ! 516: leave(); ! 517: }; ! 518: /* ! 519: * initialize semaphore ! 520: */ ! 521: lseek(comfile, 0l, 0); ! 522: combuf[1] = EMPTY; ! 523: write(comfile, combuf, 2); ! 524: close(comfile); ! 525: #endif ! 526: #endif ! 527: ! 528: #ifndef NODELAY ! 529: /* ! 530: * fork off a child to read the input ! 531: */ ! 532: ppid = getpid(); ! 533: if ((cpid = fork()) == 0) ! 534: { ! 535: #ifndef MSG ! 536: comfile = open(fnam, O_RDWR); ! 537: #endif ! 538: for (;;) ! 539: { ! 540: read(0, inbuf, 1); ! 541: if (lastchar != inbuf[0]) ! 542: { ! 543: #ifdef MSG ! 544: if (inbuf[0] == DELETE || inbuf[0] == ABORT) ! 545: leave(); ! 546: send(inbuf, 1, ppid, 64); ! 547: #else ! 548: lseek(comfile, 0l, 0); ! 549: read(comfile, combuf, 2); ! 550: if (combuf[1] == EMPTY) ! 551: { ! 552: lseek(comfile, 0l, 0); ! 553: combuf[0] = inbuf[0]; ! 554: combuf[1] = FULL; ! 555: write(comfile, combuf, 2); ! 556: }; ! 557: #endif ! 558: }; ! 559: lastchar = DELETE; ! 560: }; ! 561: }; ! 562: ! 563: #ifndef MSG ! 564: comfile = open(fnam, O_RDWR); ! 565: #else ! 566: msgenab(); ! 567: #endif ! 568: ! 569: #endif ! 570: /* ! 571: * New game starts here ! 572: */ ! 573: game = 0; ! 574: instruct(); ! 575: while ((game == 0) && (tries++ < 300)) ! 576: { ! 577: poll(1); ! 578: }; ! 579: if (tries >= 300) ! 580: { ! 581: /* I give up. Let's call it quits. */ ! 582: leave(); ! 583: }; ! 584: goldcnt = GOLDCNT; ! 585: pscore = 0; ! 586: clr(); ! 587: } ! 588: ! 589: /* ! 590: * poll -- read characters sent by input subprocess and set global flags ! 591: */ ! 592: ! 593: poll(sltime) ! 594: { ! 595: int stop; ! 596: register int charcnt; ! 597: int junk; ! 598: ! 599: #ifndef NODELAY ! 600: #ifdef MSG ! 601: struct mstruct msghead; ! 602: #endif ! 603: #endif ! 604: ! 605: stop = 0; ! 606: readin: ! 607: ! 608: #ifdef NODELAY ! 609: fflush(stdout); ! 610: charcnt = 0; ! 611: nap(12); ! 612: #ifndef BELL3.0 ! 613: ioctl(0, FIONREAD, &junk); ! 614: if (junk) ! 615: #endif ! 616: charcnt = read(0, combuf, 1); ! 617: switch (charcnt) ! 618: { ! 619: ! 620: case 0: ! 621: combuf[1] = EMPTY; ! 622: break; ! 623: ! 624: case -1: ! 625: errgen("READ ERROR IN POLL"); ! 626: abort(); ! 627: ! 628: default: ! 629: combuf[0] = combuf[charcnt-1]; ! 630: combuf[1] = FULL; ! 631: break; ! 632: }; ! 633: #else ! 634: ! 635: #ifdef MSG ! 636: combuf[1] = (recv(combuf, 1, &msghead, 0) == -1) ? EMPTY : FULL; ! 637: #else ! 638: lseek(comfile, 0l, 0); /* rewind */ ! 639: read(comfile, combuf, 2); /* read 2 chars */ ! 640: #endif ! 641: ! 642: #endif ! 643: if (combuf[1] == EMPTY) ! 644: { ! 645: #ifndef BELL3.0 ! 646: ! 647: #ifndef NODELAY ! 648: if (sltime > 0) ! 649: { ! 650: sleep(sltime); ! 651: }; ! 652: #endif ! 653: ! 654: #endif ! 655: if (stop) ! 656: { ! 657: goto readin; ! 658: }; ! 659: return; ! 660: }; ! 661: combuf[1] = EMPTY; ! 662: ! 663: #ifndef NODELAY ! 664: ! 665: #ifndef MSG ! 666: lseek(comfile, 0l, 0); /* another rewind */ ! 667: write(comfile, combuf, 2); ! 668: #endif ! 669: #endif ! 670: ! 671: switch(combuf[0] & 0177) ! 672: { ! 673: case LEFT: ! 674: pacptr->dirn = DLEFT; ! 675: break; ! 676: ! 677: case RIGHT: ! 678: pacptr->dirn = DRIGHT; ! 679: break; ! 680: ! 681: case NORTH: ! 682: case NNORTH: ! 683: pacptr->dirn = DUP; ! 684: break; ! 685: ! 686: case DOWN: ! 687: case NDOWN: ! 688: pacptr->dirn = DDOWN; ! 689: break; ! 690: ! 691: case HALT: ! 692: pacptr->dirn = DNULL; ! 693: break; ! 694: ! 695: case ABORT: ! 696: case DELETE: ! 697: case QUIT: ! 698: over(); ! 699: break; ! 700: ! 701: case CNTLS: ! 702: stop = 1; ! 703: goto readin; ! 704: ! 705: case GAME1: ! 706: game = 1; ! 707: break; ! 708: ! 709: case GAME2: ! 710: game = 2; ! 711: break; ! 712: ! 713: case GAME3: ! 714: game = 3; ! 715: break; ! 716: ! 717: case GAME4: ! 718: game = 4; ! 719: break; ! 720: ! 721: default: ! 722: goto readin; ! 723: } ! 724: } ! 725: ! 726: vsinit() ! 727: { ! 728: char buf[1024]; ! 729: char tspace[256], *aoftspace; ! 730: char *tgetstr(); ! 731: extern char *UP, *BC; /* defined in tgoto.c (from ex's termlib */ ! 732: extern char PC; /* defined in tputs.c (from termlib) */ ! 733: ! 734: tgetent(buf, getenv("TERM")); ! 735: aoftspace = tspace; ! 736: vs_cl = tgetstr("cl", &aoftspace); ! 737: vs_cm = tgetstr("cm", &aoftspace); ! 738: BC = tgetstr("bc", &aoftspace); ! 739: UP = tgetstr("up", &aoftspace); ! 740: PC = *tgetstr("pc", &aoftspace); ! 741: vs_vb = tgetstr("vb", &aoftspace); ! 742: vs_rows = tgetnum("li"); ! 743: vs_cols = tgetnum("co"); ! 744: if ((vs_vb == 0) || (*vs_vb == '\0')) ! 745: { ! 746: vs_vb = aoftspace; ! 747: *vs_vb++ = ''; ! 748: *vs_vb++ = '\0'; ! 749: aoftspace += 2; ! 750: }; ! 751: if ((vs_cl == 0) || (*vs_cl == '\0') || ! 752: (vs_cm == 0) || (*vs_cm == '\0')) ! 753: { ! 754: (void) fprintf(stderr, "\nPacman is designed for CRT's with addressable cursors.\n"); ! 755: (void) fprintf(stderr, "Verify that the TERM environment variable is a proper\n"); ! 756: (void) fprintf(stderr, "type and is export-ed, and try it again...\n\n"); ! 757: exit(2); ! 758: }; ! 759: } ! 760: ! 761: /* dfp - real function for tputs function to use */ ! 762: putch( ch ) ! 763: register int ch; ! 764: { ! 765: putchar( ch ); ! 766: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.