Annotation of 43BSDTahoe/games/hunt/playit.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 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[] = "@(#)playit.c   5.3 (Berkeley) 6/27/88";
                     20: #endif /* not lint */
                     21: 
                     22: /*
                     23:  *  Hunt
                     24:  *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
                     25:  *  San Francisco, California
                     26:  */
                     27: 
                     28: # include      <curses.h>
                     29: # include      <ctype.h>
                     30: # include      <signal.h>
                     31: # include      <errno.h>
                     32: # include      "hunt.h"
                     33: # include      <sys/file.h>
                     34: 
                     35: # undef  CTRL
                     36: # define CTRL(x)       ('x' & 037)
                     37: 
                     38: int            input();
                     39: static int     nchar_send;
                     40: static int     in      = FREAD;
                     41: char           screen[24][80], blanks[80];
                     42: int            cur_row, cur_col;
                     43: # ifdef OTTO
                     44: int            Otto_count;
                     45: int            Otto_mode;
                     46: static int     otto_y, otto_x;
                     47: static char    otto_face;
                     48: # endif OTTO
                     49: 
                     50: # define       MAX_SEND        5
                     51: 
                     52: /*
                     53:  * ibuf is the input buffer used for the stream from the driver.
                     54:  * It is small because we do not check for user input when there
                     55:  * are characters in the input buffer.
                     56:  */
                     57: static char    ibuf[20];
                     58: 
                     59: #define        GETCHR(fd)      (--(fd)->_cnt >= 0 ? *(fd)->_ptr++&0377 : getchr(fd))
                     60: 
                     61: extern int             _putchar();
                     62: 
                     63: /*
                     64:  * playit:
                     65:  *     Play a given game, handling all the curses commands from
                     66:  *     the driver.
                     67:  */
                     68: playit()
                     69: {
                     70:        register FILE           *inf;
                     71:        register int            ch;
                     72:        register unsigned int   y, x;
                     73:        extern int              Master_pid;
                     74:        extern int              errno;
                     75: 
                     76:        errno = 0;
                     77:        while ((inf = fdopen(Socket, "r")) == NULL)
                     78:                if (errno == EINTR)
                     79:                        errno = 0;
                     80:                else {
                     81:                        perror("fdopen of socket");
                     82:                        exit(1);
                     83:                }
                     84:        setbuffer(inf, ibuf, sizeof ibuf);
                     85:        Master_pid = getw(inf);
                     86:        if (Master_pid == 0 || Master_pid == EOF) {
                     87:                bad_con();
                     88:                /* NOTREACHED */
                     89:        }
                     90: # ifdef OTTO
                     91:        Otto_count = 0;
                     92: # endif OTTO
                     93:        nchar_send = MAX_SEND;
                     94:        while ((ch = GETCHR(inf)) != EOF) {
                     95: # ifdef DEBUG
                     96:                fputc(ch, stderr);
                     97: # endif DEBUG
                     98:                switch (ch & 0377) {
                     99:                  case MOVE:
                    100:                        y = GETCHR(inf);
                    101:                        x = GETCHR(inf);
                    102:                        mvcur(cur_row, cur_col, y, x);
                    103:                        cur_row = y;
                    104:                        cur_col = x;
                    105:                        break;
                    106:                  case ADDCH:
                    107:                        ch = GETCHR(inf);
                    108: # ifdef OTTO
                    109:                        switch (ch) {
                    110: 
                    111:                        case '<':
                    112:                        case '>':
                    113:                        case '^':
                    114:                        case 'v':
                    115:                                otto_face = ch;
                    116:                                getyx(stdscr, otto_y, otto_x);
                    117:                                break;
                    118:                        }
                    119: # endif OTTO
                    120:                        put_ch(ch);
                    121:                        break;
                    122:                  case CLRTOEOL:
                    123:                        clear_eol();
                    124:                        break;
                    125:                  case CLEAR:
                    126:                        clear_screen();
                    127:                        break;
                    128:                  case REFRESH:
                    129:                        fflush(stdout);
                    130:                        break;
                    131:                  case REDRAW:
                    132:                        redraw_screen();
                    133:                        fflush(stdout);
                    134:                        break;
                    135:                  case ENDWIN:
                    136:                        fflush(stdout);
                    137:                        if ((ch = GETCHR(inf)) == LAST_PLAYER)
                    138:                                Last_player = TRUE;
                    139:                        ch = EOF;
                    140:                        goto out;
                    141:                  case BELL:
                    142:                        putchar(CTRL(G));
                    143:                        break;
                    144:                  case READY:
                    145:                        (void) fflush(stdout);
                    146:                        if (nchar_send < 0)
                    147:                                (void) ioctl(fileno(stdin), TIOCFLUSH, &in);
                    148:                        nchar_send = MAX_SEND;
                    149: # ifndef OTTO
                    150:                        (void) GETCHR(inf);
                    151: # else OTTO
                    152:                        Otto_count -= (GETCHR(inf) & 255);
                    153:                        if (!Am_monitor) {
                    154: # ifdef DEBUG
                    155:                                fputc('0' + Otto_count, stderr);
                    156: # endif DEBUG
                    157:                                if (Otto_count == 0 && Otto_mode)
                    158:                                        otto(otto_y, otto_x, otto_face);
                    159:                        }
                    160: # endif OTTO
                    161:                        break;
                    162:                  default:
                    163: # ifdef OTTO
                    164:                        switch (ch) {
                    165: 
                    166:                        case '<':
                    167:                        case '>':
                    168:                        case '^':
                    169:                        case 'v':
                    170:                                otto_face = ch;
                    171:                                getyx(stdscr, otto_y, otto_x);
                    172:                                break;
                    173:                        }
                    174: # endif OTTO
                    175:                        put_ch(ch);
                    176:                        break;
                    177:                }
                    178:        }
                    179: out:
                    180:        (void) fclose(inf);
                    181: }
                    182: 
                    183: /*
                    184:  * getchr:
                    185:  *     Grab input and pass it along to the driver
                    186:  *     Return any characters from the driver
                    187:  *     When this routine is called by GETCHR, we already know there are
                    188:  *     no characters in the input buffer.
                    189:  */
                    190: getchr(fd)
                    191: register FILE  *fd;
                    192: {
                    193:        long    nchar;
                    194:        long    readfds, s_readfds;
                    195:        int     driver_mask, stdin_mask;
                    196:        int     nfds, s_nfds;
                    197:        extern int      errno;
                    198: 
                    199:        driver_mask = 1L << fileno(fd);
                    200:        stdin_mask = 1L << fileno(stdin);
                    201:        s_readfds = driver_mask | stdin_mask;
                    202:        s_nfds = (driver_mask > stdin_mask) ? driver_mask : stdin_mask;
                    203:        s_nfds++;
                    204: 
                    205: one_more_time:
                    206:        do {
                    207:                errno = 0;
                    208:                readfds = s_readfds;
                    209:                nfds = s_nfds;
                    210: # ifndef OLDIPC
                    211:                nfds = select(nfds, &readfds, NULL, NULL, NULL);
                    212: # else OLDIPC
                    213:                nfds = select(nfds, &readfds, (int *) NULL, 32767);
                    214: # endif OLDIPC
                    215:        } while (nfds <= 0 && errno == EINTR);
                    216: 
                    217:        if (readfds & stdin_mask)
                    218:                send_stuff();
                    219:        if ((readfds & driver_mask) == 0)
                    220:                goto one_more_time;
                    221:        return _filbuf(fd);
                    222: }
                    223: 
                    224: /*
                    225:  * send_stuff:
                    226:  *     Send standard input characters to the driver
                    227:  */
                    228: send_stuff()
                    229: {
                    230:        register int    count;
                    231:        register char   *sp, *nsp;
                    232:        static char     inp[sizeof Buf];
                    233:        extern char     map_key[256];
                    234: 
                    235:        count = read(fileno(stdin), Buf, sizeof Buf);
                    236:        if (count <= 0)
                    237:                return;
                    238:        if (nchar_send <= 0) {
                    239:                (void) write(1, "\7", 1);
                    240:                return;
                    241:        }
                    242: 
                    243:        /*
                    244:         * look for 'q'uit commands; if we find one,
                    245:         * confirm it.  If it is not confirmed, strip
                    246:         * it out of the input
                    247:         */
                    248:        Buf[count] = '\0';
                    249:        nsp = inp;
                    250:        for (sp = Buf; *sp != '\0'; sp++)
                    251:                if ((*nsp = map_key[*sp]) == 'q')
                    252:                        intr();
                    253: # ifdef OTTO
                    254:                else if (*nsp == CTRL(O))
                    255:                        Otto_mode = !Otto_mode;
                    256: # endif OTTO
                    257:                else
                    258:                        nsp++;
                    259:        count = nsp - inp;
                    260:        if (count) {
                    261: # ifdef OTTO
                    262:                Otto_count += count;
                    263: # endif OTTO
                    264:                nchar_send -= count;
                    265:                if (nchar_send < 0)
                    266:                        count += nchar_send;
                    267:                (void) write(Socket, inp, count);
                    268:        }
                    269: }
                    270: 
                    271: /*
                    272:  * quit:
                    273:  *     Handle the end of the game when the player dies
                    274:  */
                    275: quit()
                    276: {
                    277:        register int    explain, ch;
                    278: 
                    279:        if (Last_player)
                    280:                return TRUE;
                    281: # ifdef OTTO
                    282:        if (Otto_mode)
                    283:                return FALSE;
                    284: # endif OTTO
                    285:        mvcur(cur_row, cur_col, HEIGHT, 0);
                    286:        cur_row = HEIGHT;
                    287:        cur_col = 0;
                    288:        put_str("Re-enter game? ");
                    289:        clear_eol();
                    290:        fflush(stdout);
                    291:        explain = FALSE;
                    292:        for (;;) {
                    293:                if (isupper(ch = getchar()))
                    294:                        ch = tolower(ch);
                    295:                if (ch == 'y') {
                    296:                        sleep(2);
                    297:                        return FALSE;
                    298:                }
                    299:                else if (ch == 'n')
                    300:                        return TRUE;
                    301:                (void) putchar(CTRL(G));
                    302:                if (!explain) {
                    303:                        put_str("(Y or N) ");
                    304:                        explain = TRUE;
                    305:                }
                    306:                fflush(stdout);
                    307:        }
                    308: }
                    309: 
                    310: put_ch(ch)
                    311:        char    ch;
                    312: {
                    313:        if (!isprint(ch)) {
                    314:                fprintf(stderr, "r,c,ch: %d,%d,%d", cur_row, cur_col, ch);
                    315:                return;
                    316:        }
                    317:        screen[cur_row][cur_col] = ch;
                    318:        putchar(ch);
                    319:        if (++cur_col >= COLS) {
                    320:                if (!AM || XN)
                    321:                        putchar('\n');
                    322:                cur_col = 0;
                    323:                if (++cur_row >= LINES)
                    324:                        cur_row = LINES;
                    325:        }
                    326: }
                    327: 
                    328: put_str(s)
                    329:        char    *s;
                    330: {
                    331:        while (*s)
                    332:                put_ch(*s++);
                    333: }
                    334: 
                    335: clear_screen()
                    336: {
                    337:        register int    i;
                    338: 
                    339:        if (blanks[0] == '\0')
                    340:                for (i = 0; i < 80; i++)
                    341:                        blanks[i] = ' ';
                    342: 
                    343:        if (CL != NULL) {
                    344:                tputs(CL, LINES, _putchar);
                    345:                for (i = 0; i < 24; i++)
                    346:                        bcopy(blanks, screen[i], 80);
                    347:        } else {
                    348:                for (i = 0; i < 24; i++) {
                    349:                        mvcur(cur_row, cur_col, i, 0);
                    350:                        cur_row = i;
                    351:                        cur_col = 0;
                    352:                        clear_eol();
                    353:                }
                    354:                mvcur(cur_row, cur_col, 0, 0);
                    355:        }
                    356:        cur_row = cur_col = 0;
                    357: }
                    358: 
                    359: clear_eol()
                    360: {
                    361:        if (CE != NULL)
                    362:                tputs(CE, 1, _putchar);
                    363:        else {
                    364:                fwrite(blanks, sizeof (char), 80 - cur_col, stdout);
                    365:                if (COLS != 80)
                    366:                        mvcur(cur_row, 80, cur_row, cur_col);
                    367:                else if (AM)
                    368:                        mvcur(cur_row + 1, 0, cur_row, cur_col);
                    369:                else
                    370:                        mvcur(cur_row, 79, cur_row, cur_col);
                    371:        }
                    372:        bcopy(blanks, &screen[cur_row][cur_col], 80 - cur_col);
                    373: }
                    374: 
                    375: redraw_screen()
                    376: {
                    377:        register int    i;
                    378:        static int      first = 1;
                    379: 
                    380:        if (first) {
                    381:                if ((curscr = newwin(24, 80, 0, 0)) == NULL) {
                    382:                        fprintf(stderr, "Can't create curscr\n");
                    383:                        exit(1);
                    384:                }
                    385:                for (i = 0; i < 24; i++)
                    386:                        curscr->_y[i] = screen[i];
                    387:                first = 0;
                    388:        }
                    389:        curscr->_cury = cur_row;
                    390:        curscr->_curx = cur_col;
                    391:        wrefresh(curscr);
                    392: #ifdef NOCURSES
                    393:        mvcur(cur_row, cur_col, 0, 0);
                    394:        for (i = 0; i < 23; i++) {
                    395:                fwrite(screen[i], sizeof (char), 80, stdout);
                    396:                if (COLS > 80 || (COLS == 80 && !AM))
                    397:                        putchar('\n');
                    398:        }
                    399:        fwrite(screen[23], sizeof (char), 79, stdout);
                    400:        mvcur(23, 79, cur_row, cur_col);
                    401: #endif
                    402: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.