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