|
|
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: ! 13: drawmaze(pp) ! 14: register PLAYER *pp; ! 15: { ! 16: register int x; ! 17: register char *sp; ! 18: register int y; ! 19: register char *endp; ! 20: ! 21: clrscr(pp); ! 22: outstr(pp, pp->p_maze[0], WIDTH); ! 23: for (y = 1; y < HEIGHT - 1; y++) { ! 24: endp = &pp->p_maze[y][WIDTH]; ! 25: for (x = 0, sp = pp->p_maze[y]; sp < endp; x++, sp++) ! 26: if (*sp != SPACE) { ! 27: cgoto(pp, y, x); ! 28: if (pp->p_x == x && pp->p_y == y) ! 29: outch(pp, translate(*sp)); ! 30: else if (isplayer(*sp)) ! 31: outch(pp, player_sym(pp, y, x)); ! 32: else ! 33: outch(pp, *sp); ! 34: } ! 35: } ! 36: cgoto(pp, HEIGHT - 1, 0); ! 37: outstr(pp, pp->p_maze[HEIGHT - 1], WIDTH); ! 38: drawstatus(pp); ! 39: } ! 40: ! 41: /* ! 42: * drawstatus - put up the status lines (this assumes the screen ! 43: * size is 80x24 with the maze being 64x24) ! 44: */ ! 45: drawstatus(pp) ! 46: register PLAYER *pp; ! 47: { ! 48: register int i; ! 49: register PLAYER *np; ! 50: ! 51: cgoto(pp, STAT_AMMO_ROW, STAT_LABEL_COL); ! 52: outstr(pp, "Ammo:", 5); ! 53: (void) sprintf(Buf, "%3d", pp->p_ammo); ! 54: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 55: outstr(pp, Buf, 3); ! 56: ! 57: cgoto(pp, STAT_GUN_ROW, STAT_LABEL_COL); ! 58: outstr(pp, "Gun:", 4); ! 59: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL); ! 60: outstr(pp, (pp->p_ncshot < MAXNCSHOT) ? " ok" : " ", 3); ! 61: ! 62: cgoto(pp, STAT_DAM_ROW, STAT_LABEL_COL); ! 63: outstr(pp, "Damage:", 7); ! 64: (void) sprintf(Buf, "%2d/%2d", pp->p_damage, pp->p_damcap); ! 65: cgoto(pp, STAT_DAM_ROW, STAT_VALUE_COL); ! 66: outstr(pp, Buf, 5); ! 67: ! 68: cgoto(pp, STAT_KILL_ROW, STAT_LABEL_COL); ! 69: outstr(pp, "Kills:", 6); ! 70: (void) sprintf(Buf, "%3d", (pp->p_damcap - MAXDAM) / 2); ! 71: cgoto(pp, STAT_KILL_ROW, STAT_VALUE_COL); ! 72: outstr(pp, Buf, 3); ! 73: ! 74: cgoto(pp, STAT_PLAY_ROW, STAT_LABEL_COL); ! 75: outstr(pp, "Player:", 7); ! 76: for (i = STAT_PLAY_ROW + 1, np = Player; np < End_player; np++) { ! 77: (void) sprintf(Buf, "%5.2f%c%-10.10s %c", np->p_ident->i_score, ! 78: stat_char(np), np->p_ident->i_name, ! 79: np->p_ident->i_team); ! 80: cgoto(pp, i++, STAT_NAME_COL); ! 81: outstr(pp, Buf, STAT_NAME_LEN); ! 82: } ! 83: ! 84: # ifdef MONITOR ! 85: cgoto(pp, STAT_MON_ROW, STAT_LABEL_COL); ! 86: outstr(pp, "Monitor:", 8); ! 87: for (i = STAT_MON_ROW + 1, np = Monitor; np < End_monitor; np++) { ! 88: (void) sprintf(Buf, "%5.5s %-10.10s %c", " ", ! 89: np->p_ident->i_name, np->p_ident->i_team); ! 90: cgoto(pp, i++, STAT_NAME_COL); ! 91: outstr(pp, Buf, STAT_NAME_LEN); ! 92: } ! 93: # endif MONITOR ! 94: } ! 95: ! 96: look(pp) ! 97: register PLAYER *pp; ! 98: { ! 99: register int x, y; ! 100: ! 101: x = pp->p_x; ! 102: y = pp->p_y; ! 103: ! 104: check(pp, y - 1, x - 1); ! 105: check(pp, y - 1, x ); ! 106: check(pp, y - 1, x + 1); ! 107: check(pp, y , x - 1); ! 108: check(pp, y , x ); ! 109: check(pp, y , x + 1); ! 110: check(pp, y + 1, x - 1); ! 111: check(pp, y + 1, x ); ! 112: check(pp, y + 1, x + 1); ! 113: ! 114: switch (pp->p_face) { ! 115: case LEFTS: ! 116: see(pp, LEFTS); ! 117: see(pp, ABOVE); ! 118: see(pp, BELOW); ! 119: break; ! 120: case RIGHT: ! 121: see(pp, RIGHT); ! 122: see(pp, ABOVE); ! 123: see(pp, BELOW); ! 124: break; ! 125: case ABOVE: ! 126: see(pp, ABOVE); ! 127: see(pp, LEFTS); ! 128: see(pp, RIGHT); ! 129: break; ! 130: case BELOW: ! 131: see(pp, BELOW); ! 132: see(pp, LEFTS); ! 133: see(pp, RIGHT); ! 134: break; ! 135: # ifdef FLY ! 136: case FLYER: ! 137: break; ! 138: # endif FLY ! 139: } ! 140: cgoto(pp, y, x); ! 141: } ! 142: ! 143: see(pp, face) ! 144: register PLAYER *pp; ! 145: int face; ! 146: { ! 147: register char *sp; ! 148: register int y, x, i, cnt; ! 149: ! 150: x = pp->p_x; ! 151: y = pp->p_y; ! 152: ! 153: switch (face) { ! 154: case LEFTS: ! 155: sp = &Maze[y][x]; ! 156: for (i = 0; See_over[*--sp]; i++) ! 157: continue; ! 158: ! 159: if (i == 0) ! 160: break; ! 161: ! 162: cnt = i; ! 163: x = pp->p_x - 1; ! 164: --y; ! 165: while (i--) ! 166: check(pp, y, --x); ! 167: i = cnt; ! 168: x = pp->p_x - 1; ! 169: ++y; ! 170: while (i--) ! 171: check(pp, y, --x); ! 172: i = cnt; ! 173: x = pp->p_x - 1; ! 174: ++y; ! 175: while (i--) ! 176: check(pp, y, --x); ! 177: break; ! 178: case RIGHT: ! 179: sp = &Maze[y][++x]; ! 180: for (i = 0; See_over[*sp++]; i++) ! 181: continue; ! 182: ! 183: if (i == 0) ! 184: break; ! 185: ! 186: cnt = i; ! 187: x = pp->p_x + 1; ! 188: --y; ! 189: while (i--) ! 190: check(pp, y, ++x); ! 191: i = cnt; ! 192: x = pp->p_x + 1; ! 193: ++y; ! 194: while (i--) ! 195: check(pp, y, ++x); ! 196: i = cnt; ! 197: x = pp->p_x + 1; ! 198: ++y; ! 199: while (i--) ! 200: check(pp, y, ++x); ! 201: break; ! 202: case ABOVE: ! 203: sp = &Maze[--y][x]; ! 204: if (!See_over[*sp]) ! 205: break; ! 206: do { ! 207: --y; ! 208: sp -= sizeof Maze[0]; ! 209: check(pp, y, x - 1); ! 210: check(pp, y, x ); ! 211: check(pp, y, x + 1); ! 212: } while (See_over[*sp]); ! 213: break; ! 214: case BELOW: ! 215: sp = &Maze[++y][x]; ! 216: if (!See_over[*sp]) ! 217: break; ! 218: do { ! 219: y++; ! 220: sp += sizeof Maze[0]; ! 221: check(pp, y, x - 1); ! 222: check(pp, y, x ); ! 223: check(pp, y, x + 1); ! 224: } while (See_over[*sp]); ! 225: break; ! 226: } ! 227: } ! 228: ! 229: check(pp, y, x) ! 230: PLAYER *pp; ! 231: int y, x; ! 232: { ! 233: register int index; ! 234: register int ch; ! 235: register PLAYER *rpp; ! 236: ! 237: index = y * sizeof Maze[0] + x; ! 238: ch = ((char *) Maze)[index]; ! 239: if (ch != ((char *) pp->p_maze)[index]) { ! 240: rpp = pp; ! 241: cgoto(rpp, y, x); ! 242: if (x == rpp->p_x && y == rpp->p_y) ! 243: outch(rpp, translate(ch)); ! 244: else if (isplayer(ch)) ! 245: outch(rpp, player_sym(rpp, y, x)); ! 246: else ! 247: outch(rpp, ch); ! 248: ((char *) rpp->p_maze)[index] = ch; ! 249: } ! 250: } ! 251: ! 252: /* ! 253: * showstat ! 254: * Update the status of players ! 255: */ ! 256: showstat(pp) ! 257: register PLAYER *pp; ! 258: { ! 259: register PLAYER *np; ! 260: register int y; ! 261: register char c; ! 262: ! 263: y = STAT_PLAY_ROW + 1 + (pp - Player); ! 264: c = stat_char(pp); ! 265: # ifdef MONITOR ! 266: for (np = Monitor; np < End_monitor; np++) { ! 267: cgoto(np, y, STAT_SCAN_COL); ! 268: outch(np, c); ! 269: } ! 270: # endif MONITOR ! 271: for (np = Player; np < End_player; np++) { ! 272: cgoto(np, y, STAT_SCAN_COL); ! 273: outch(np, c); ! 274: } ! 275: } ! 276: ! 277: /* ! 278: * drawplayer: ! 279: * Draw the player on the screen and show him to everyone who's scanning ! 280: * unless he is cloaked. ! 281: */ ! 282: drawplayer(pp, draw) ! 283: PLAYER *pp; ! 284: FLAG draw; ! 285: { ! 286: register PLAYER *newp; ! 287: register int x, y; ! 288: ! 289: x = pp->p_x; ! 290: y = pp->p_y; ! 291: Maze[y][x] = draw ? pp->p_face : pp->p_over; ! 292: ! 293: # ifdef MONITOR ! 294: for (newp = Monitor; newp < End_monitor; newp++) ! 295: check(newp, y, x); ! 296: # endif MONITOR ! 297: ! 298: for (newp = Player; newp < End_player; newp++) { ! 299: if (!draw || newp == pp) { ! 300: check(newp, y, x); ! 301: continue; ! 302: } ! 303: if (newp->p_scan == 0) { ! 304: newp->p_scan--; ! 305: showstat(newp); ! 306: } ! 307: else if (newp->p_scan > 0) { ! 308: if (pp->p_cloak < 0) ! 309: check(newp, y, x); ! 310: newp->p_scan--; ! 311: } ! 312: } ! 313: if (!draw || pp->p_cloak < 0) ! 314: return; ! 315: if (pp->p_cloak-- == 0) ! 316: showstat(pp); ! 317: } ! 318: ! 319: message(pp, s) ! 320: register PLAYER *pp; ! 321: char *s; ! 322: { ! 323: cgoto(pp, HEIGHT, 0); ! 324: outstr(pp, s, strlen(s)); ! 325: ce(pp); ! 326: } ! 327: ! 328: /* ! 329: * translate: ! 330: * Turn a character into the right direction character if we are ! 331: * looking at the current player. ! 332: */ ! 333: translate(ch) ! 334: char ch; ! 335: { ! 336: switch (ch) { ! 337: case LEFTS: ! 338: return '<'; ! 339: case RIGHT: ! 340: return '>'; ! 341: case ABOVE: ! 342: return '^'; ! 343: case BELOW: ! 344: return 'v'; ! 345: } ! 346: return ch; ! 347: } ! 348: ! 349: /* ! 350: * player_sym: ! 351: * Return the player symbol ! 352: */ ! 353: player_sym(pp, y, x) ! 354: PLAYER *pp; ! 355: int y, x; ! 356: { ! 357: register PLAYER *npp; ! 358: ! 359: npp = play_at(y, x); ! 360: if (npp->p_ident->i_team == ' ') ! 361: return Maze[y][x]; ! 362: #ifdef MONITOR ! 363: if (pp->p_ident->i_team == '*') ! 364: return npp->p_ident->i_team; ! 365: #endif ! 366: if (pp->p_ident->i_team != npp->p_ident->i_team) ! 367: return Maze[y][x]; ! 368: return pp->p_ident->i_team; ! 369: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.