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