Annotation of 43BSDReno/games/hunt/driver/answer.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[] = "@(#)answer.c   5.2 (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      "hunt.h"
                     29: # include      <errno.h>
                     30: 
                     31: # define       MAXPERMACH      3       /* Max player/monitor per machine */
                     32: 
                     33: static char    Ttyname[NAMELEN];
                     34: 
                     35: answer()
                     36: {
                     37:        register PLAYER         *pp;
                     38:        register int            newsock;
                     39:        register FILE           *tmpfd;
                     40: # ifdef MONITOR
                     41:        static FLAG             monitor;
                     42: # endif MONITOR
                     43:        static char             name[NAMELEN];
                     44:        static int              socklen;
                     45:        static u_long           machine;
                     46:        static u_long           uid;
                     47:        static SOCKET           sockstruct;
                     48: # ifdef OLDIPC
                     49:        extern SOCKET           Daemon;
                     50: # endif OLDIPC
                     51: 
                     52: # ifdef INTERNET
                     53:        socklen = sizeof sockstruct;
                     54: # else
                     55:        socklen = sizeof sockstruct - 1;
                     56: # endif INTERNET
                     57:        errno = 0;
                     58: # ifndef OLDIPC
                     59:        if ((newsock = accept(Socket, &sockstruct, &socklen)) < 0)
                     60: # else OLDIPC
                     61:        if (accept(Socket, &sockstruct) < 0)
                     62: # endif OLDIPC
                     63:        {
                     64:                if (errno == EINTR)
                     65:                        return;
                     66:                perror("accept");
                     67:                cleanup(1);
                     68:        }
                     69: # ifdef OLDIPC
                     70:        newsock = Socket;
                     71:        Socket = socket(SOCK_STREAM, 0, (struct sockaddr *) &Daemon,
                     72:                SO_ACCEPTCONN);
                     73:        if (Socket < 0) {
                     74:                perror("new accept socket");
                     75:                cleanup(1);
                     76:        }
                     77:        Sock_mask = (1 << Socket);
                     78:        Fds_mask |= Sock_mask;
                     79:        if (Socket >= Num_fds)
                     80:                Num_fds = Socket + 1;
                     81: # endif OLDIPC
                     82: 
                     83:        tmpfd = fdopen(newsock, "w");
                     84: 
                     85: # ifdef INTERNET
                     86:        machine = ntohl(((struct sockaddr_in *) &sockstruct)->sin_addr.s_addr);
                     87: # else INTERNET
                     88:        if (machine == 0)
                     89:                machine = gethostid();
                     90: # endif INTERNET
                     91:        (void) putw(getpid(), tmpfd);
                     92:        (void) read(newsock, (char *) &uid, sizeof uid);
                     93:        uid = ntohl(uid);
                     94:        (void) read(newsock, name, NAMELEN);
                     95:        (void) read(newsock, Ttyname, NAMELEN);
                     96: # ifdef MONITOR
                     97:        (void) read(newsock, (char *) &monitor, sizeof monitor);
                     98: # endif MONITOR
                     99: 
                    100:        if (reached_limit(machine)) {
                    101:                socklen = 0;
                    102:                (void) write(newsock, (char *) &socklen, sizeof socklen);
                    103:                (void) close(newsock);
                    104: # ifdef OLDIPC
                    105:                Fds_mask &= ~(1 << newsock);
                    106: # endif OLDIPC
                    107:                return;
                    108:        }
                    109: 
                    110: # ifdef MONITOR
                    111:        if (monitor)
                    112:                if (End_monitor < &Monitor[MAXMON])
                    113:                        pp = End_monitor++;
                    114:                else {
                    115:                        socklen = 0;
                    116:                        (void) write(newsock, (char *) &socklen,
                    117:                                sizeof socklen);
                    118:                        (void) close(newsock);
                    119:                        return;
                    120:                }
                    121:        else
                    122: # endif MONITOR
                    123:                if (End_player < &Player[MAXPL])
                    124:                        pp = End_player++;
                    125:                else {
                    126:                        socklen = 0;
                    127:                        (void) write(newsock, (char *) &socklen,
                    128:                                sizeof socklen);
                    129:                        (void) close(newsock);
                    130:                        return;
                    131:                }
                    132: 
                    133:        pp->p_ident = get_ident(machine, uid, name);
                    134:        pp->p_output = tmpfd;
                    135:        pp->p_death[0] = '\0';
                    136:        pp->p_fd = newsock;
                    137:        pp->p_mask = (1 << pp->p_fd);
                    138: # ifndef OLDIPC
                    139:        Fds_mask |= pp->p_mask;
                    140:        if (pp->p_fd >= Num_fds)
                    141:                Num_fds = pp->p_fd + 1;
                    142: # endif OLDIPC
                    143: 
                    144:        pp->p_y = 0;
                    145:        pp->p_x = 0;
                    146: 
                    147: # ifdef MONITOR
                    148:        if (monitor)
                    149:                stmonitor(pp);
                    150:        else
                    151: # endif MONITOR
                    152:                stplayer(pp);
                    153: }
                    154: 
                    155: # ifdef MONITOR
                    156: stmonitor(pp)
                    157: register PLAYER        *pp;
                    158: {
                    159:        register int    line;
                    160:        register PLAYER *npp;
                    161: 
                    162:        bcopy((char *) Maze, (char *) pp->p_maze, sizeof Maze);
                    163: 
                    164:        drawmaze(pp);
                    165: 
                    166:        (void) sprintf(Buf, "%5.5s%c%-10.10s", " ", stat_char(pp),
                    167:                pp->p_ident->i_name);
                    168:        line = STAT_MON_ROW + 1 + (pp - Monitor);
                    169:        for (npp = Player; npp < End_player; npp++) {
                    170:                cgoto(npp, line, STAT_NAME_COL);
                    171:                outstr(npp, Buf, STAT_NAME_LEN);
                    172:        }
                    173:        for (npp = Monitor; npp < End_monitor; npp++) {
                    174:                cgoto(npp, line, STAT_NAME_COL);
                    175:                outstr(npp, Buf, STAT_NAME_LEN);
                    176:        }
                    177: 
                    178:        sendcom(pp, REFRESH);
                    179:        sendcom(pp, READY, 0);
                    180:        (void) fflush(pp->p_output);
                    181: }
                    182: # endif MONITOR
                    183: 
                    184: stplayer(newpp)
                    185: register PLAYER        *newpp;
                    186: {
                    187:        register int    x, y;
                    188:        register PLAYER *pp;
                    189: 
                    190:        Nplayer++;
                    191: 
                    192:        for (y = 0; y < UBOUND; y++)
                    193:                for (x = 0; x < WIDTH; x++)
                    194:                        newpp->p_maze[y][x] = Maze[y][x];
                    195:        for (     ; y < DBOUND; y++) {
                    196:                for (x = 0; x < LBOUND; x++)
                    197:                        newpp->p_maze[y][x] = Maze[y][x];
                    198:                for (     ; x < RBOUND; x++)
                    199:                        newpp->p_maze[y][x] = SPACE;
                    200:                for (     ; x < WIDTH;  x++)
                    201:                        newpp->p_maze[y][x] = Maze[y][x];
                    202:        }
                    203:        for (     ; y < HEIGHT; y++)
                    204:                for (x = 0; x < WIDTH; x++)
                    205:                        newpp->p_maze[y][x] = Maze[y][x];
                    206: 
                    207:        do {
                    208:                x = rand_num(WIDTH - 1) + 1;
                    209:                y = rand_num(HEIGHT - 1) + 1;
                    210:        } while (Maze[y][x] != SPACE);
                    211:        newpp->p_over = SPACE;
                    212:        newpp->p_x = x;
                    213:        newpp->p_y = y;
                    214:        newpp->p_undershot = FALSE;
                    215: 
                    216: # ifdef        START_FLYING
                    217:        /* This is only for debugging */
                    218:        newpp->p_flying = rand_num(20);
                    219:        newpp->p_flyx = 2 * rand_num(6) - 5;
                    220:        newpp->p_flyy = 2 * rand_num(6) - 5;
                    221:        newpp->p_face = FLYER;
                    222: # else START_FLYING
                    223:        newpp->p_flying = -1;
                    224:        rand_face(newpp);
                    225: # endif START_FLYING
                    226:        newpp->p_damage = 0;
                    227:        newpp->p_damcap = MAXDAM;
                    228:        newpp->p_nchar = 0;
                    229:        newpp->p_ncount = 0;
                    230:        newpp->p_nexec = 0;
                    231:        newpp->p_ammo = ISHOTS;
                    232:        newpp->p_scan = -1;
                    233:        newpp->p_cloak = CLOAKLEN;
                    234:        newpp->p_ncshot = 0;
                    235: 
                    236:        do {
                    237:                x = rand_num(WIDTH - 1) + 1;
                    238:                y = rand_num(HEIGHT - 1) + 1;
                    239:        } while (Maze[y][x] != SPACE);
                    240:        Maze[y][x] = GMINE;
                    241: # ifdef MONITOR
                    242:        for (pp = Monitor; pp < End_monitor; pp++)
                    243:                check(pp, y, x);
                    244: # endif MONITOR
                    245: 
                    246:        do {
                    247:                x = rand_num(WIDTH - 1) + 1;
                    248:                y = rand_num(HEIGHT - 1) + 1;
                    249:        } while (Maze[y][x] != SPACE);
                    250:        Maze[y][x] = MINE;
                    251: # ifdef MONITOR
                    252:        for (pp = Monitor; pp < End_monitor; pp++)
                    253:                check(pp, y, x);
                    254: # endif MONITOR
                    255: 
                    256:        (void) sprintf(Buf, "%5.2f%c%-10.10s", newpp->p_ident->i_score,
                    257:                stat_char(newpp), newpp->p_ident->i_name);
                    258:        y = STAT_PLAY_ROW + 1 + (newpp - Player);
                    259:        for (pp = Player; pp < End_player; pp++) {
                    260:                if (pp != newpp) {
                    261:                        char    smallbuf[10];
                    262: 
                    263:                        pp->p_ammo += NSHOTS;
                    264:                        newpp->p_ammo += NSHOTS;
                    265:                        cgoto(pp, y, STAT_NAME_COL);
                    266:                        outstr(pp, Buf, STAT_NAME_LEN);
                    267:                        (void) sprintf(smallbuf, "%3d", pp->p_ammo);
                    268:                        cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL);
                    269:                        outstr(pp, smallbuf, 3);
                    270:                }
                    271:        }
                    272: # ifdef MONITOR
                    273:        for (pp = Monitor; pp < End_monitor; pp++) {
                    274:                cgoto(pp, y, STAT_NAME_COL);
                    275:                outstr(pp, Buf, STAT_NAME_LEN);
                    276:        }
                    277: # endif MONITOR
                    278: 
                    279:        drawmaze(newpp);
                    280:        drawplayer(newpp, TRUE);
                    281:        look(newpp);
                    282: # ifdef START_FLYING
                    283:        /* Make sure that the position you enter in will be erased */
                    284:        showexpl(newpp->p_y, newpp->p_x, FLYER);
                    285: # endif START_FLYING
                    286:        sendcom(newpp, REFRESH);
                    287:        sendcom(newpp, READY, 0);
                    288:        (void) fflush(newpp->p_output);
                    289: }
                    290: 
                    291: /*
                    292:  * rand_face:
                    293:  *     Give the player a random facing direction
                    294:  */
                    295: rand_face(pp)
                    296: register PLAYER        *pp;
                    297: {
                    298:        switch (rand_num(4)) {
                    299:          case 0:
                    300:                pp->p_face = LEFTS;
                    301:                break;
                    302:          case 1:
                    303:                pp->p_face = RIGHT;
                    304:                break;
                    305:          case 2:
                    306:                pp->p_face = BELOW;
                    307:                break;
                    308:          case 3:
                    309:                pp->p_face = ABOVE;
                    310:                break;
                    311:        }
                    312: }
                    313: 
                    314: /*
                    315:  * get_ident:
                    316:  *     Get the score structure of a player
                    317:  */
                    318: IDENT *
                    319: get_ident(machine, uid, name)
                    320: u_long machine;
                    321: u_long uid;
                    322: char   *name;
                    323: {
                    324:        register IDENT  *ip;
                    325:        static IDENT    punt;
                    326: 
                    327:        for (ip = Scores; ip != NULL; ip = ip->i_next)
                    328:                if (ip->i_machine == machine && ip->i_uid == uid &&
                    329:                    strncmp(ip->i_name, name, NAMELEN) == 0)
                    330:                        break;
                    331: 
                    332:        if (ip != NULL) {
                    333:                ip->i_entries++;
                    334:                ip->i_score = ip->i_kills / (double) ip->i_entries;
                    335:        }
                    336:        else {
                    337:                ip = (IDENT *) malloc(sizeof (IDENT));
                    338:                if (ip == NULL) {
                    339:                        /* Fourth down, time to punt */
                    340:                        ip = &punt;
                    341:                }
                    342:                ip->i_machine = machine;
                    343:                ip->i_uid = uid;
                    344:                strncpy(ip->i_name, name, NAMELEN);
                    345:                ip->i_kills = 0;
                    346:                ip->i_entries = 1;
                    347:                ip->i_score = 0;
                    348:                ip->i_next = Scores;
                    349:                Scores = ip;
                    350:        }
                    351: 
                    352:        return ip;
                    353: }
                    354: 
                    355: /*
                    356:  * reached_limit:
                    357:  *     Returns whether the limit of x persons per machine has been reached
                    358:  */
                    359: reached_limit(machine)
                    360: u_long machine;
                    361: {
                    362:        register PLAYER *pp;
                    363:        register int    count;
                    364: 
                    365:        count = 0;
                    366:        for (pp = Player; pp < End_player; pp++)
                    367:                if (pp->p_ident->i_machine == machine)
                    368:                        count++;
                    369:        for (pp = Monitor; pp < End_monitor; pp++)
                    370:                if (pp->p_ident->i_machine == machine)
                    371:                        count++;
                    372:        return count >= MAXPERMACH;
                    373: }

unix.superglobalmegacorp.com

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