Annotation of 43BSDTahoe/games/hunt/driver.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: char copyright[] =
                     20: "@(#) Copyright (c) 1985 Regents of the University of California.\n\
                     21:  All rights reserved.\n";
                     22: #endif /* not lint */
                     23: 
                     24: #ifndef lint
                     25: static char sccsid[] = "@(#)driver.c   5.3 (Berkeley) 6/27/88";
                     26: #endif /* not lint */
                     27: 
                     28: /*
                     29:  *  Hunt
                     30:  *  Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
                     31:  *  San Francisco, California
                     32:  */
                     33: 
                     34: # include      "hunt.h"
                     35: # include      <signal.h>
                     36: # include      <errno.h>
                     37: # include      <sys/ioctl.h>
                     38: # include      <sys/time.h>
                     39: 
                     40: # ifndef pdp11
                     41: # define       RN      (((Seed = Seed * 11109 + 13849) >> 16) & 0xffff)
                     42: # else pdp11
                     43: # define       RN      ((Seed = Seed * 11109 + 13849) & 0x7fff)
                     44: # endif pdp11
                     45: 
                     46: int    Seed = 0;
                     47: 
                     48: # ifdef CONSTANT_MOVE
                     49: static struct itimerval        Timing;
                     50: # endif CONSTANT_MOVE
                     51: 
                     52: SOCKET Daemon;
                     53: # ifdef        INTERNET
                     54: int    Test_socket;            /* test socket to answer datagrams */
                     55: # define       DAEMON_SIZE     (sizeof Daemon)
                     56: # else INTERNET
                     57: # define       DAEMON_SIZE     (sizeof Daemon - 1)
                     58: # endif        INTERNET
                     59: 
                     60: /*
                     61:  * main:
                     62:  *     The main program.
                     63:  */
                     64: main()
                     65: {
                     66:        register PLAYER *pp;
                     67:        register int    had_char;
                     68: # ifdef INTERNET
                     69:        register long   test_mask;
                     70:        int             msg;
                     71:        int             namelen;
                     72:        SOCKET          test;
                     73: # endif INTERNET
                     74: # ifdef CONSTANT_MOVE
                     75:        register int    enable_alarm, disable_alarm;
                     76: # endif CONSTANT_MOVE
                     77:        static long     read_fds;
                     78: 
                     79:        init();
                     80:        Sock_mask = (1 << Socket);
                     81: # ifdef INTERNET
                     82:        test_mask = (1 << Test_socket);
                     83: # endif INTERNET
                     84: 
                     85: # ifdef CONSTANT_MOVE
                     86:        enable_alarm = sigblock(0);
                     87:        disable_alarm = enable_alarm | (1 << (SIGALRM - 1));
                     88:        (void) sigsetmask(disable_alarm);
                     89:        (void) signal(SIGALRM, moveshots);
                     90: # endif CONSTANT_MOVE
                     91: 
                     92:        while (Nplayer > 0) {
                     93: # ifdef CONSTANT_MOVE
                     94:                (void) sigsetmask(enable_alarm);
                     95: # endif CONSTANT_MOVE
                     96:                read_fds = Fds_mask;
                     97:                errno = 0;
                     98: # ifndef OLDIPC
                     99:                while (select(Num_fds, &read_fds, (int *) NULL,
                    100:                    (int *) NULL, (struct timeval *) NULL) < 0)
                    101: # else OLDIPC
                    102:                while (select(20, &read_fds, NULL, 32767) < 0)
                    103: # endif OLDIPC
                    104:                {
                    105:                        if (errno != EINTR)
                    106:                                perror("select");
                    107:                        if (Nplayer == 0)
                    108:                                goto out;
                    109:                        errno = 0;
                    110:                }
                    111:                Have_inp = read_fds;
                    112: # ifdef CONSTANT_MOVE
                    113:                (void) sigsetmask(disable_alarm);
                    114: # endif CONSTANT_MOVE
                    115: # ifdef INTERNET
                    116:                if (read_fds & test_mask) {
                    117:                        namelen = DAEMON_SIZE;
                    118: # ifndef OLDIPC
                    119:                        (void) recvfrom(Test_socket, (char *) &msg, sizeof msg,
                    120:                                0, (struct sockaddr *) &test, &namelen);
                    121:                        (void) sendto(Test_socket, (char *) &msg, sizeof msg,
                    122:                                0, (struct sockaddr *) &test, DAEMON_SIZE);
                    123: # else OLDIPC
                    124:                        (void) receive(Test_socket, (struct sockaddr *) &test,
                    125:                                (char *) &msg, sizeof msg);
                    126:                        (void) send(Test_socket, (struct sockaddr *) &test,
                    127:                                (char *) &msg, sizeof msg);
                    128: # endif OLDIPC
                    129:                }
                    130: # endif INTERNET
                    131:                for (;;) {
                    132:                        had_char = FALSE;
                    133:                        for (pp = Player; pp < End_player; pp++)
                    134:                                if (havechar(pp)) {
                    135:                                        execute(pp);
                    136:                                        pp->p_nexec++;
                    137:                                        had_char++;
                    138:                                }
                    139: # ifdef MONITOR
                    140:                        for (pp = Monitor; pp < End_monitor; pp++)
                    141:                                if (havechar(pp)) {
                    142:                                        mon_execute(pp);
                    143:                                        pp->p_nexec++;
                    144:                                        had_char++;
                    145:                                }
                    146: # endif MONITOR
                    147:                        if (!had_char)
                    148:                                break;
                    149: # ifdef CONSTANT_MOVE
                    150:                        for (pp = Player; pp < End_player; pp++) {
                    151:                                look(pp);
                    152:                                sendcom(pp, REFRESH);
                    153:                        }
                    154: # ifdef MONITOR
                    155:                        for (pp = Monitor; pp < End_monitor; pp++)
                    156:                                sendcom(pp, REFRESH);
                    157: # endif MONITOR
                    158: # else CONSTANT_MOVE
                    159:                        moveshots();
                    160: # endif CONSTANT_MOVE
                    161:                        for (pp = Player; pp < End_player; )
                    162:                                if (pp->p_death[0] != '\0')
                    163:                                        zap(pp, TRUE);
                    164:                                else
                    165:                                        pp++;
                    166: # ifdef MONITOR
                    167:                        for (pp = Monitor; pp < End_monitor; )
                    168:                                if (pp->p_death[0] != '\0')
                    169:                                        zap(pp, FALSE);
                    170:                                else
                    171:                                        pp++;
                    172: # endif MONITOR
                    173:                }
                    174:                if (read_fds & Sock_mask)
                    175:                        answer();
                    176:                for (pp = Player; pp < End_player; pp++) {
                    177:                        if (read_fds & pp->p_mask)
                    178:                                sendcom(pp, READY, pp->p_nexec);
                    179:                        pp->p_nexec = 0;
                    180:                        (void) fflush(pp->p_output);
                    181:                }
                    182: # ifdef MONITOR
                    183:                for (pp = Monitor; pp < End_monitor; pp++) {
                    184:                        if (read_fds & pp->p_mask)
                    185:                                sendcom(pp, READY, pp->p_nexec);
                    186:                        pp->p_nexec = 0;
                    187:                        (void) fflush(pp->p_output);
                    188:                }
                    189: # endif MONITOR
                    190:        }
                    191: out:
                    192: # ifdef        CONSTANT_MOVE
                    193:        bul_alarm(0);
                    194: # endif        CONSTANT_MOVE
                    195: 
                    196: # ifdef MONITOR
                    197:        for (pp = Monitor; pp < End_monitor; )
                    198:                zap(pp, FALSE);
                    199: # endif MONITOR
                    200:        cleanup(0);
                    201: }
                    202: 
                    203: /*
                    204:  * init:
                    205:  *     Initialize the global parameters.
                    206:  */
                    207: init()
                    208: {
                    209:        register int    i;
                    210: # ifdef        INTERNET
                    211:        SOCKET          test_port;
                    212:        auto int        msg;
                    213: # endif        INTERNET
                    214:        int             cleanup();
                    215: 
                    216: # ifndef DEBUG
                    217:        (void) ioctl(fileno(stdout), TIOCNOTTY, NULL);
                    218:        (void) setpgrp(getpid(), getpid());
                    219:        (void) signal(SIGHUP, SIG_IGN);
                    220:        (void) signal(SIGINT, SIG_IGN);
                    221:        (void) signal(SIGQUIT, SIG_IGN);
                    222:        (void) signal(SIGTERM, cleanup);
                    223: # endif DEBUG
                    224: 
                    225:        (void) chdir("/usr/tmp");       /* just in case it core dumps */
                    226:        (void) signal(SIGPIPE, SIG_IGN);
                    227: 
                    228: # ifdef        INTERNET
                    229:        Daemon.sin_family = SOCK_FAMILY;
                    230: # ifdef OLD
                    231:        if (gethostname(local_name, sizeof local_name) < 0) {
                    232:                perror("gethostname");
                    233:                exit(1);
                    234:        }
                    235:        if ((hp = gethostbyname(local_name)) == NULL) {
                    236:                fprintf(stderr, "Unknown host %s\n", local_name);
                    237:                exit(1);
                    238:        }
                    239:        bcopy(hp->h_addr, &(Daemon.sin_addr.s_addr), hp->h_length);
                    240: # else
                    241:        Daemon.sin_addr.s_addr = INADDR_ANY;
                    242: # endif OLD
                    243:        Daemon.sin_port = htons(Sock_port);
                    244: # else INTERNET
                    245:        Daemon.sun_family = SOCK_FAMILY;
                    246:        (void) strcpy(Daemon.sun_path, Sock_name);
                    247: # endif INTERNET
                    248: 
                    249: # ifndef OLDIPC
                    250:        Socket = socket(SOCK_FAMILY, SOCK_STREAM, 0);
                    251: # else OLDIPC
                    252:        Socket = socket(SOCK_STREAM, 0, (struct sockaddr *) &Daemon,
                    253:                SO_ACCEPTCONN);
                    254: # endif OLDIPC
                    255: # if defined(INTERNET) && !defined(OLDIPC)
                    256:        if (setsockopt(Socket, SOL_SOCKET, SO_USELOOPBACK, &msg, sizeof msg)<0)
                    257:                perror("setsockopt loopback");
                    258: # endif INTERNET
                    259: # ifndef OLDIPC
                    260:        if (bind(Socket, (struct sockaddr *) &Daemon, DAEMON_SIZE) < 0) {
                    261:                if (errno == EADDRINUSE)
                    262:                        exit(0);
                    263:                else {
                    264:                        perror("bind");
                    265:                        cleanup(1);
                    266:                }
                    267:        }
                    268:        (void) listen(Socket, 5);
                    269: # endif OLDIPC
                    270:        Fds_mask = (1 << Socket);
                    271:        Num_fds = Socket + 1;
                    272: 
                    273: # ifdef INTERNET
                    274:        test_port = Daemon;
                    275:        test_port.sin_port = htons(Test_port);
                    276: 
                    277: # ifndef OLDIPC
                    278:        Test_socket = socket(SOCK_FAMILY, SOCK_DGRAM, 0);
                    279:        if (bind(Test_socket, (struct sockaddr *) &test_port,
                    280:            DAEMON_SIZE) < 0) {
                    281:                perror("bind");
                    282:                exit(1);
                    283:        }
                    284:        (void) listen(Test_socket, 5);
                    285: # else OLDIPC
                    286:        Test_socket = socket(SOCK_DGRAM, 0, (struct sockaddr *) &test_port, 0);
                    287: # endif OLDIPC
                    288:        Fds_mask |= (1 << Test_socket);
                    289:        if (Test_socket > Socket)
                    290:                Num_fds = Test_socket + 1;
                    291: # endif        INTERNET
                    292: 
                    293:        Seed = getpid() + time((time_t *) NULL);
                    294:        makemaze();
                    295: 
                    296:        for (i = 0; i < NASCII; i++)
                    297:                See_over[i] = TRUE;
                    298:        See_over[DOOR] = FALSE;
                    299:        See_over[WALL1] = FALSE;
                    300:        See_over[WALL2] = FALSE;
                    301:        See_over[WALL3] = FALSE;
                    302: # ifdef REFLECT
                    303:        See_over[WALL4] = FALSE;
                    304:        See_over[WALL5] = FALSE;
                    305: # endif REFLECT
                    306: 
                    307: # ifdef CONSTANT_MOVE
                    308:        getitimer(ITIMER_REAL, &Timing);
                    309:        Timing.it_interval.tv_sec = 0;
                    310:        Timing.it_interval.tv_usec = 500;
                    311:        Timing.it_value.tv_sec = 0;
                    312:        Timing.it_value.tv_usec = 0;
                    313:        setitimer(ITIMER_REAL, &Timing, NULL);
                    314: # endif CONSTANT_MOVE
                    315: 
                    316:        answer();
                    317: }
                    318: 
                    319: # ifdef CONSTANT_MOVE
                    320: /*
                    321:  * bul_alarm:
                    322:  *     Set up the alarm for the bullets
                    323:  */
                    324: bul_alarm(val)
                    325: int    val;
                    326: {
                    327:        Timing.it_value.tv_usec = val * Timing.it_interval.tv_usec;
                    328:        setitimer(ITIMER_REAL, &Timing, NULL);
                    329: }
                    330: # endif CONSTANT_MOVE
                    331: 
                    332: /*
                    333:  * checkdam:
                    334:  *     Check the damage to the given player, and see if s/he is killed
                    335:  */
                    336: checkdam(ouch, gotcha, credit, amt, shot_type)
                    337: register PLAYER        *ouch, *gotcha;
                    338: register IDENT *credit;
                    339: int            amt;
                    340: char           shot_type;
                    341: {
                    342:        register char   *cp;
                    343: 
                    344:        if (ouch->p_death[0] != '\0')
                    345:                return;
                    346:        if (rand_num(100) < 5) {
                    347:                message(ouch, "Missed you by a hair");
                    348:                if (gotcha != NULL)
                    349:                        message(gotcha, "Missed him");
                    350:                return;
                    351:        }
                    352:        ouch->p_damage += amt;
                    353:        if (ouch->p_damage <= ouch->p_damcap) {
                    354:                (void) sprintf(Buf, "%2d", ouch->p_damage);
                    355:                cgoto(ouch, STAT_DAM_ROW, STAT_VALUE_COL);
                    356:                outstr(ouch, Buf, 2);
                    357:                return;
                    358:        }
                    359: 
                    360:        /* Someone DIED */
                    361:        switch (shot_type) {
                    362:          default:
                    363:                cp = "Killed";
                    364:                break;
                    365: # ifdef FLY
                    366:          case FALL:
                    367:                cp = "Killed on impact";
                    368:                break;
                    369: # endif FLY
                    370:          case KNIFE:
                    371:                cp = "Stabbed to death";
                    372:                break;
                    373:          case SHOT:
                    374:                cp = "Shot to death";
                    375:                break;
                    376:          case GRENADE:
                    377:          case SATCHEL:
                    378:          case BOMB:
                    379:                cp = "Bombed";
                    380:                break;
                    381:          case MINE:
                    382:          case GMINE:
                    383:                cp = "Blown apart";
                    384:                break;
                    385: # ifdef        OOZE
                    386:          case SLIME:
                    387:                cp = "Slimed";
                    388:                break;
                    389: # endif OOZE
                    390: # ifdef        VOLCANO
                    391:          case LAVA:
                    392:                cp = "Baked";
                    393:                break;
                    394: # endif VOLCANO
                    395:        }
                    396:        if (credit == NULL) {
                    397:                (void) sprintf(ouch->p_death, "| %s by %s |", cp,
                    398:                        (shot_type == MINE || shot_type == GMINE) ?
                    399:                        "a mine" : "act of God");
                    400:                return;
                    401:        }
                    402: 
                    403:        (void) sprintf(ouch->p_death, "| %s by %s |", cp, credit->i_name);
                    404: 
                    405:        credit->i_kills++;
                    406:        credit->i_score = credit->i_kills / (double) credit->i_entries;
                    407:        if (gotcha == NULL)
                    408:                return;
                    409:        gotcha->p_damcap += STABDAM;
                    410:        gotcha->p_damage -= STABDAM;
                    411:        if (gotcha->p_damage < 0)
                    412:                gotcha->p_damage = 0;
                    413:        (void) sprintf(Buf, "%2d/%2d", gotcha->p_damage, gotcha->p_damcap);
                    414:        cgoto(gotcha, STAT_DAM_ROW, STAT_VALUE_COL);
                    415:        outstr(gotcha, Buf, 5);
                    416:        (void) sprintf(Buf, "%3d", (gotcha->p_damcap - MAXDAM) / 2);
                    417:        cgoto(gotcha, STAT_KILL_ROW, STAT_VALUE_COL);
                    418:        outstr(gotcha, Buf, 3);
                    419:        (void) sprintf(Buf, "%5.2f", gotcha->p_ident->i_score);
                    420:        for (ouch = Player; ouch < End_player; ouch++) {
                    421:                cgoto(ouch, STAT_PLAY_ROW + 1 + (gotcha - Player),
                    422:                        STAT_NAME_COL);
                    423:                outstr(ouch, Buf, 5);
                    424:        }
                    425: }
                    426: 
                    427: /*
                    428:  * zap:
                    429:  *     Kill off a player and take him out of the game.
                    430:  */
                    431: zap(pp, was_player)
                    432: register PLAYER        *pp;
                    433: FLAG           was_player;
                    434: {
                    435:        register int    i, len;
                    436:        register BULLET *bp;
                    437:        register PLAYER *np;
                    438:        register int    x, y;
                    439:        int             savefd, savemask;
                    440: 
                    441:        if (was_player) {
                    442:                drawplayer(pp, FALSE);
                    443:                Nplayer--;
                    444:        }
                    445: 
                    446:        len = strlen(pp->p_death);      /* Display the cause of death */
                    447:        x = (WIDTH - len) / 2;
                    448:        cgoto(pp, HEIGHT / 2, x);
                    449:        outstr(pp, pp->p_death, len);
                    450:        for (i = 1; i < len; i++)
                    451:                pp->p_death[i] = '-';
                    452:        pp->p_death[0] = '+';
                    453:        pp->p_death[len - 1] = '+';
                    454:        cgoto(pp, HEIGHT / 2 - 1, x);
                    455:        outstr(pp, pp->p_death, len);
                    456:        cgoto(pp, HEIGHT / 2 + 1, x);
                    457:        outstr(pp, pp->p_death, len);
                    458:        cgoto(pp, HEIGHT, 0);
                    459: 
                    460:        if (Nplayer == 0) {
                    461: # ifdef CONSTANT_MOVE
                    462:                bul_alarm(0);
                    463: # endif CONSTANT_MOVE
                    464:                cleanup(0);
                    465:                /* NOTREACHED */
                    466:        }
                    467: 
                    468:        savefd = pp->p_fd;
                    469:        savemask = pp->p_mask;
                    470: 
                    471: # ifdef MONITOR
                    472:        if (was_player) {
                    473: # endif MONITOR
                    474:                for (bp = Bullets; bp != NULL; bp = bp->b_next) {
                    475:                        if (bp->b_owner == pp)
                    476:                                bp->b_owner = NULL;
                    477:                        if (bp->b_x == pp->p_x && bp->b_y == pp->p_y)
                    478:                                bp->b_over = SPACE;
                    479:                }
                    480: 
                    481:                i = rand_num(pp->p_ammo);
                    482:                if (i == pp->p_ammo - 1) {
                    483:                        x = pp->p_ammo;
                    484:                        len = SLIME;
                    485:                }
                    486:                else if (i >= BOMBREQ) {
                    487:                        x = BOMBREQ;
                    488:                        len = BOMB;
                    489:                }
                    490:                else if (i >= SSLIMEREQ) {
                    491:                        x = SSLIMEREQ;
                    492:                        len = SLIME;
                    493:                }
                    494:                else if (i >= SATREQ) {
                    495:                        x = SATREQ;
                    496:                        len = SATCHEL;
                    497:                }
                    498:                else if (i >= SLIMEREQ) {
                    499:                        x = SLIMEREQ;
                    500:                        len = SLIME;
                    501:                }
                    502:                else if (i >= GRENREQ) {
                    503:                        x = GRENREQ;
                    504:                        len = GRENADE;
                    505:                }
                    506:                else
                    507:                        x = 0;
                    508:                if (x > 0) {
                    509:                        add_shot(len, pp->p_y, pp->p_x, pp->p_face, x,
                    510:                                (PLAYER *) NULL, TRUE, SPACE);
                    511:                        (void) sprintf(Buf, "%s detonated.",
                    512:                                pp->p_ident->i_name);
                    513:                        for (np = Player; np < End_player; np++)
                    514:                                message(np, Buf);
                    515: # ifdef MONITOR
                    516:                        for (np = Monitor; np < End_monitor; np++)
                    517:                                message(np, Buf);
                    518: # endif MONITOR
                    519:                }
                    520: 
                    521: # ifdef VOLCANO
                    522:                volcano += pp->p_ammo - x;
                    523:                if (rand_num(100) < volcano / 50) {
                    524:                        do {
                    525:                                x = rand_num(WIDTH / 2) + WIDTH / 4;
                    526:                                y = rand_num(HEIGHT / 2) + HEIGHT / 4;
                    527:                        } while (Maze[y][x] != SPACE);
                    528:                        add_shot(LAVA, y, x, LEFTS, volcano,
                    529:                                (PLAYER *) NULL, TRUE, SPACE);
                    530:                        for (np = Player; np < End_player; np++)
                    531:                                message(np, "Volcano eruption.");
                    532:                        volcano = 0;
                    533:                }
                    534: # endif VOLCANO
                    535: 
                    536:                sendcom(pp, ENDWIN);
                    537:                (void) fclose(pp->p_output);
                    538: 
                    539:                End_player--;
                    540:                if (pp != End_player) {
                    541:                        bcopy((char *) End_player, (char *) pp,
                    542:                                sizeof (PLAYER));
                    543:                        (void) sprintf(Buf, "%5.2f%c%-10.10s",
                    544:                                pp->p_ident->i_score, stat_char(pp),
                    545:                                pp->p_ident->i_name);
                    546:                        i = STAT_PLAY_ROW + 1 + (pp - Player);
                    547:                        for (np = Player; np < End_player; np++) {
                    548:                                cgoto(np, i, STAT_NAME_COL);
                    549:                                outstr(np, Buf, STAT_NAME_LEN);
                    550:                        }
                    551: # ifdef MONITOR
                    552:                        for (np = Monitor; np < End_monitor; np++) {
                    553:                                cgoto(np, i, STAT_NAME_COL);
                    554:                                outstr(np, Buf, STAT_NAME_LEN);
                    555:                        }
                    556: # endif MONITOR
                    557:                }
                    558: 
                    559:                /* Erase the last player */
                    560:                i = STAT_PLAY_ROW + 1 + Nplayer;
                    561:                for (np = Player; np < End_player; np++) {
                    562:                        cgoto(np, i, STAT_NAME_COL);
                    563:                        ce(np);
                    564:                }
                    565: # ifdef MONITOR
                    566:                for (np = Monitor; np < End_monitor; np++) {
                    567:                        cgoto(np, i, STAT_NAME_COL);
                    568:                        ce(np);
                    569:                }
                    570:        }
                    571:        else {
                    572:                sendcom(pp, ENDWIN);
                    573:                (void) putc(LAST_PLAYER, pp->p_output);
                    574:                (void) fclose(pp->p_output);
                    575: 
                    576:                End_monitor--;
                    577:                if (pp != End_monitor) {
                    578:                        bcopy((char *) End_monitor, (char *) pp,
                    579:                                sizeof (PLAYER));
                    580:                        (void) sprintf(Buf, "%5.5s %-10.10s", " ",
                    581:                                pp->p_ident->i_name);
                    582:                        i = STAT_MON_ROW + 1 + (pp - Player);
                    583:                        for (np = Player; np < End_player; np++) {
                    584:                                cgoto(np, i, STAT_NAME_COL);
                    585:                                outstr(np, Buf, STAT_NAME_LEN);
                    586:                        }
                    587:                        for (np = Monitor; np < End_monitor; np++) {
                    588:                                cgoto(np, i, STAT_NAME_COL);
                    589:                                outstr(np, Buf, STAT_NAME_LEN);
                    590:                        }
                    591:                }
                    592: 
                    593:                /* Erase the last monitor */
                    594:                i = STAT_MON_ROW + 1 + (End_monitor - Monitor);
                    595:                for (np = Player; np < End_player; np++) {
                    596:                        cgoto(np, i, STAT_NAME_COL);
                    597:                        ce(np);
                    598:                }
                    599:                for (np = Monitor; np < End_monitor; np++) {
                    600:                        cgoto(np, i, STAT_NAME_COL);
                    601:                        ce(np);
                    602:                }
                    603: 
                    604:        }
                    605: # endif MONITOR
                    606: 
                    607:        Fds_mask &= ~savemask;
                    608:        if (Num_fds == savefd + 1) {
                    609:                Num_fds = Socket;
                    610: # ifdef INTERNET
                    611:                if (Test_socket > Socket)
                    612:                        Num_fds = Test_socket;
                    613: # endif INTERNET
                    614:                for (np = Player; np < End_player; np++)
                    615:                        if (np->p_fd > Num_fds)
                    616:                                Num_fds = np->p_fd;
                    617: # ifdef MONITOR
                    618:                for (np = Monitor; np < End_monitor; np++)
                    619:                        if (np->p_fd > Num_fds)
                    620:                                Num_fds = np->p_fd;
                    621: # endif MONITOR
                    622:                Num_fds++;
                    623:        }
                    624: }
                    625: 
                    626: /*
                    627:  * rand_num:
                    628:  *     Return a random number in a given range.
                    629:  */
                    630: rand_num(range)
                    631: int    range;
                    632: {
                    633:        return (range == 0 ? 0 : RN % range);
                    634: }
                    635: 
                    636: /*
                    637:  * havechar:
                    638:  *     Check to see if we have any characters in the input queue; if
                    639:  *     we do, read them, stash them away, and return TRUE; else return
                    640:  *     FALSE.
                    641:  */
                    642: havechar(pp)
                    643: register PLAYER        *pp;
                    644: {
                    645:        extern int      errno;
                    646: 
                    647:        if (pp->p_ncount < pp->p_nchar)
                    648:                return TRUE;
                    649:        if (!(Have_inp & pp->p_mask))
                    650:                return FALSE;
                    651:        Have_inp &= ~pp->p_mask;
                    652: check_again:
                    653:        errno = 0;
                    654:        if ((pp->p_nchar = read(pp->p_fd, pp->p_cbuf, sizeof pp->p_cbuf)) <= 0)
                    655:        {
                    656:                if (errno == EINTR)
                    657:                        goto check_again;
                    658:                pp->p_cbuf[0] = 'q';
                    659:        }
                    660:        pp->p_ncount = 0;
                    661:        return TRUE;
                    662: }
                    663: 
                    664: /*
                    665:  * cleanup:
                    666:  *     Exit with the given value, cleaning up any droppings lying around
                    667:  */
                    668: cleanup(eval)
                    669: int    eval;
                    670: {
                    671:        register PLAYER *pp;
                    672: 
                    673:        for (pp = Player; pp < End_player; pp++) {
                    674:                cgoto(pp, HEIGHT, 0);
                    675:                sendcom(pp, ENDWIN);
                    676:                (void) putc(LAST_PLAYER, pp->p_output);
                    677:                (void) fclose(pp->p_output);
                    678:        }
                    679: # ifdef MONITOR
                    680:        for (pp = Monitor; pp < End_monitor; pp++) {
                    681:                cgoto(pp, HEIGHT, 0);
                    682:                sendcom(pp, ENDWIN);
                    683:                (void) putc(LAST_PLAYER, pp->p_output);
                    684:                (void) fclose(pp->p_output);
                    685:        }
                    686: # endif MONITOR
                    687:        (void) close(Socket);
                    688: # ifdef AF_UNIX_HACK
                    689:        (void) unlink(Sock_name);
                    690: # endif AF_UNIX_HACK
                    691:        exit(eval);
                    692: }

unix.superglobalmegacorp.com

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