Annotation of 43BSDTahoe/games/hunt/driver.c, revision 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.