|
|
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: # undef CTRL ! 14: # define CTRL(x) ('x' & 037) ! 15: ! 16: # ifdef MONITOR ! 17: /* ! 18: * mon_execute: ! 19: * Execute a single monitor command ! 20: */ ! 21: mon_execute(pp) ! 22: register PLAYER *pp; ! 23: { ! 24: register char ch; ! 25: ! 26: ch = pp->p_cbuf[pp->p_ncount++]; ! 27: switch (ch) { ! 28: case CTRL(L): ! 29: sendcom(pp, REDRAW); ! 30: break; ! 31: case 'q': ! 32: (void) strcpy(pp->p_death, "| Quit |"); ! 33: break; ! 34: } ! 35: } ! 36: # endif MONITOR ! 37: ! 38: /* ! 39: * execute: ! 40: * Execute a single command ! 41: */ ! 42: execute(pp) ! 43: register PLAYER *pp; ! 44: { ! 45: register char ch; ! 46: ! 47: ch = pp->p_cbuf[pp->p_ncount++]; ! 48: ! 49: # ifdef FLY ! 50: if (pp->p_flying >= 0) { ! 51: switch (ch) { ! 52: case CTRL(L): ! 53: sendcom(pp, REDRAW); ! 54: break; ! 55: case 'q': ! 56: (void) strcpy(pp->p_death, "| Quit |"); ! 57: break; ! 58: } ! 59: return; ! 60: } ! 61: # endif FLY ! 62: ! 63: switch (ch) { ! 64: case CTRL(L): ! 65: sendcom(pp, REDRAW); ! 66: break; ! 67: case 'h': ! 68: move(pp, LEFTS); ! 69: break; ! 70: case 'H': ! 71: face(pp, LEFTS); ! 72: break; ! 73: case 'j': ! 74: move(pp, BELOW); ! 75: break; ! 76: case 'J': ! 77: face(pp, BELOW); ! 78: break; ! 79: case 'k': ! 80: move(pp, ABOVE); ! 81: break; ! 82: case 'K': ! 83: face(pp, ABOVE); ! 84: break; ! 85: case 'l': ! 86: move(pp, RIGHT); ! 87: break; ! 88: case 'L': ! 89: face(pp, RIGHT); ! 90: break; ! 91: case 'f': ! 92: fire(pp, SHOT); ! 93: break; ! 94: case 'g': ! 95: fire(pp, GRENADE); ! 96: break; ! 97: case 'F': ! 98: fire(pp, SATCHEL); ! 99: break; ! 100: case 'G': ! 101: fire(pp, BOMB); ! 102: break; ! 103: # ifdef OOZE ! 104: case 'o': ! 105: fire_slime(pp, SLIMEREQ); ! 106: break; ! 107: case 'O': ! 108: fire_slime(pp, SSLIMEREQ); ! 109: break; ! 110: # endif OOZE ! 111: case 's': ! 112: scan(pp); ! 113: break; ! 114: case 'c': ! 115: cloak(pp); ! 116: break; ! 117: case 'q': ! 118: (void) strcpy(pp->p_death, "| Quit |"); ! 119: break; ! 120: } ! 121: } ! 122: ! 123: /* ! 124: * move: ! 125: * Execute a move in the given direction ! 126: */ ! 127: move(pp, dir) ! 128: register PLAYER *pp; ! 129: int dir; ! 130: { ! 131: register PLAYER *newp; ! 132: register int x, y; ! 133: register FLAG moved; ! 134: register BULLET *bp; ! 135: ! 136: y = pp->p_y; ! 137: x = pp->p_x; ! 138: ! 139: switch (dir) { ! 140: case LEFTS: ! 141: x--; ! 142: break; ! 143: case RIGHT: ! 144: x++; ! 145: break; ! 146: case ABOVE: ! 147: y--; ! 148: break; ! 149: case BELOW: ! 150: y++; ! 151: break; ! 152: } ! 153: ! 154: moved = FALSE; ! 155: switch (Maze[y][x]) { ! 156: case SPACE: ! 157: # ifdef RANDOM ! 158: case DOOR: ! 159: # endif RANDOM ! 160: moved = TRUE; ! 161: break; ! 162: case WALL1: ! 163: case WALL2: ! 164: case WALL3: ! 165: # ifdef REFLECT ! 166: case WALL4: ! 167: case WALL5: ! 168: # endif REFLECT ! 169: break; ! 170: case MINE: ! 171: case GMINE: ! 172: if (dir == pp->p_face) ! 173: pickup(pp, y, x, 5, Maze[y][x]); ! 174: else if (opposite(dir, pp->p_face)) ! 175: pickup(pp, y, x, 95, Maze[y][x]); ! 176: else ! 177: pickup(pp, y, x, 50, Maze[y][x]); ! 178: Maze[y][x] = SPACE; ! 179: moved = TRUE; ! 180: break; ! 181: case SHOT: ! 182: case GRENADE: ! 183: case SATCHEL: ! 184: case BOMB: ! 185: bp = is_bullet(y, x); ! 186: if (bp != NULL) ! 187: bp->b_expl = TRUE; ! 188: Maze[y][x] = SPACE; ! 189: moved = TRUE; ! 190: break; ! 191: case LEFTS: ! 192: case RIGHT: ! 193: case ABOVE: ! 194: case BELOW: ! 195: # ifdef FLY ! 196: case FLYER: ! 197: # endif FLY ! 198: if (dir != pp->p_face) ! 199: sendcom(pp, BELL); ! 200: else { ! 201: newp = play_at(y, x); ! 202: checkdam(newp, pp, pp->p_ident, STABDAM, KNIFE); ! 203: } ! 204: break; ! 205: } ! 206: if (moved) { ! 207: if (pp->p_ncshot > 0) ! 208: if (--pp->p_ncshot == MAXNCSHOT) { ! 209: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL); ! 210: outstr(pp, " ok", 3); ! 211: } ! 212: if (pp->p_undershot) { ! 213: fixshots(pp->p_y, pp->p_x, pp->p_over); ! 214: pp->p_undershot = FALSE; ! 215: } ! 216: drawplayer(pp, FALSE); ! 217: pp->p_over = Maze[y][x]; ! 218: pp->p_y = y; ! 219: pp->p_x = x; ! 220: drawplayer(pp, TRUE); ! 221: } ! 222: } ! 223: ! 224: /* ! 225: * face: ! 226: * Change the direction the player is facing ! 227: */ ! 228: face(pp, dir) ! 229: register PLAYER *pp; ! 230: register int dir; ! 231: { ! 232: if (pp->p_face != dir) { ! 233: pp->p_face = dir; ! 234: drawplayer(pp, TRUE); ! 235: } ! 236: } ! 237: ! 238: /* ! 239: * fire: ! 240: * Fire a shot of the given type in the given direction ! 241: */ ! 242: fire(pp, type) ! 243: register PLAYER *pp; ! 244: register char type; ! 245: { ! 246: register int req_index; ! 247: static int req[4] = { BULREQ, GRENREQ, SATREQ, BOMBREQ }; ! 248: static int shot_type[4] = { SHOT, GRENADE, SATCHEL, BOMB }; ! 249: ! 250: if (pp == NULL) ! 251: return; ! 252: if (pp->p_ammo == 0) { ! 253: message(pp, "No more charges."); ! 254: return; ! 255: } ! 256: if (pp->p_ncshot > MAXNCSHOT) ! 257: return; ! 258: if (pp->p_ncshot++ == MAXNCSHOT) { ! 259: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL); ! 260: outstr(pp, " ", 3); ! 261: } ! 262: switch (type) { ! 263: case SHOT: ! 264: req_index = 0; ! 265: break; ! 266: case GRENADE: ! 267: req_index = 1; ! 268: break; ! 269: case SATCHEL: ! 270: req_index = 2; ! 271: break; ! 272: case BOMB: ! 273: req_index = 3; ! 274: break; ! 275: # ifdef DEBUG ! 276: default: ! 277: message(pp, "What you do!!!"); ! 278: return; ! 279: # endif DEBUG ! 280: } ! 281: while (pp->p_ammo < req[req_index]) ! 282: req_index--; ! 283: pp->p_ammo -= req[req_index]; ! 284: (void) sprintf(Buf, "%3d", pp->p_ammo); ! 285: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 286: outstr(pp, Buf, 3); ! 287: ! 288: add_shot(shot_type[req_index], pp->p_y, pp->p_x, pp->p_face, ! 289: req[req_index], pp, FALSE, pp->p_face); ! 290: pp->p_undershot = TRUE; ! 291: ! 292: /* ! 293: * Show the object to everyone ! 294: */ ! 295: showexpl(pp->p_y, pp->p_x, shot_type[req_index]); ! 296: for (pp = Player; pp < End_player; pp++) ! 297: sendcom(pp, REFRESH); ! 298: # ifdef MONITOR ! 299: for (pp = Monitor; pp < End_monitor; pp++) ! 300: sendcom(pp, REFRESH); ! 301: # endif MONITOR ! 302: } ! 303: ! 304: # ifdef OOZE ! 305: /* ! 306: * fire_slime: ! 307: * Fire a slime shot in the given direction ! 308: */ ! 309: fire_slime(pp, req) ! 310: register PLAYER *pp; ! 311: register int req; ! 312: { ! 313: if (pp == NULL) ! 314: return; ! 315: if (pp->p_ammo < req) { ! 316: message(pp, "Not enough charges."); ! 317: return; ! 318: } ! 319: if (pp->p_ncshot > MAXNCSHOT) ! 320: return; ! 321: if (pp->p_ncshot++ == MAXNCSHOT) { ! 322: cgoto(pp, STAT_GUN_ROW, STAT_VALUE_COL); ! 323: outstr(pp, " ", 3); ! 324: } ! 325: pp->p_ammo -= req; ! 326: (void) sprintf(Buf, "%3d", pp->p_ammo); ! 327: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 328: outstr(pp, Buf, 3); ! 329: ! 330: add_shot(SLIME, pp->p_y, pp->p_x, pp->p_face, req, pp, FALSE, ! 331: pp->p_face); ! 332: ! 333: /* ! 334: * Show the object to everyone ! 335: */ ! 336: showexpl(pp->p_y, pp->p_x, SLIME); ! 337: for (pp = Player; pp < End_player; pp++) ! 338: sendcom(pp, REFRESH); ! 339: # ifdef MONITOR ! 340: for (pp = Monitor; pp < End_monitor; pp++) ! 341: sendcom(pp, REFRESH); ! 342: # endif MONITOR ! 343: } ! 344: # endif OOZE ! 345: ! 346: /* ! 347: * create_shot: ! 348: * Create a shot with the given properties ! 349: */ ! 350: add_shot(type, y, x, face, charge, owner, expl, over) ! 351: int type; ! 352: int y, x; ! 353: char face; ! 354: int charge; ! 355: PLAYER *owner; ! 356: int expl; ! 357: char over; ! 358: { ! 359: register BULLET *bp; ! 360: ! 361: # ifdef CONSTANT_MOVE ! 362: /* ! 363: * if there are no bullets in flight, set up the alarm ! 364: */ ! 365: ! 366: if (Bullets == NULL) ! 367: bul_alarm(1); ! 368: # endif CONSTANT_MOVE ! 369: ! 370: bp = create_shot(type, y, x, face, charge, owner, ! 371: (owner == NULL) ? NULL : owner->p_ident, expl, over); ! 372: bp->b_next = Bullets; ! 373: Bullets = bp; ! 374: } ! 375: ! 376: BULLET * ! 377: create_shot(type, y, x, face, charge, owner, score, expl, over) ! 378: int type; ! 379: int y, x; ! 380: char face; ! 381: int charge; ! 382: PLAYER *owner; ! 383: IDENT *score; ! 384: int expl; ! 385: char over; ! 386: { ! 387: register BULLET *bp; ! 388: ! 389: bp = (BULLET *) malloc(sizeof (BULLET)); /* NOSTRICT */ ! 390: if (bp == NULL) { ! 391: if (owner != NULL) ! 392: message(owner, "Out of memory"); ! 393: return NULL; ! 394: } ! 395: ! 396: bp->b_face = face; ! 397: bp->b_x = x; ! 398: bp->b_y = y; ! 399: bp->b_charge = charge; ! 400: bp->b_owner = owner; ! 401: bp->b_score = score; ! 402: bp->b_type = type; ! 403: bp->b_expl = expl; ! 404: bp->b_over = over; ! 405: bp->b_next = NULL; ! 406: ! 407: return bp; ! 408: } ! 409: ! 410: /* ! 411: * cloak: ! 412: * Turn on or increase length of a cloak ! 413: */ ! 414: cloak(pp) ! 415: register PLAYER *pp; ! 416: { ! 417: if (pp->p_ammo <= 0) { ! 418: message(pp, "No more charges"); ! 419: return; ! 420: } ! 421: (void) sprintf(Buf, "%3d", --pp->p_ammo); ! 422: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 423: outstr(pp, Buf, 3); ! 424: ! 425: pp->p_cloak += CLOAKLEN; ! 426: cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL); ! 427: outstr(pp, " on", 3); ! 428: ! 429: if (pp->p_scan >= 0) { ! 430: pp->p_scan = -1; ! 431: cgoto(pp, STAT_SCAN_ROW, STAT_VALUE_COL); ! 432: outstr(pp, " ", 3); ! 433: } ! 434: ! 435: showstat(pp); ! 436: } ! 437: ! 438: /* ! 439: * scan: ! 440: * Turn on or increase length of a scan ! 441: */ ! 442: scan(pp) ! 443: register PLAYER *pp; ! 444: { ! 445: if (pp->p_ammo <= 0) { ! 446: message(pp, "No more charges"); ! 447: return; ! 448: } ! 449: (void) sprintf(Buf, "%3d", --pp->p_ammo); ! 450: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 451: outstr(pp, Buf, 3); ! 452: ! 453: pp->p_scan += SCANLEN; ! 454: cgoto(pp, STAT_SCAN_ROW, STAT_VALUE_COL); ! 455: outstr(pp, " on", 3); ! 456: ! 457: if (pp->p_cloak >= 0) { ! 458: pp->p_cloak = -1; ! 459: cgoto(pp, STAT_CLOAK_ROW, STAT_VALUE_COL); ! 460: outstr(pp, " ", 3); ! 461: } ! 462: ! 463: showstat(pp); ! 464: } ! 465: ! 466: /* ! 467: * pickup: ! 468: * check whether the object blew up or whether he picked it up ! 469: */ ! 470: pickup(pp, y, x, prob, obj) ! 471: register PLAYER *pp; ! 472: register int y, x; ! 473: int prob; ! 474: int obj; ! 475: { ! 476: register int req; ! 477: ! 478: switch (obj) { ! 479: case MINE: ! 480: req = BULREQ; ! 481: break; ! 482: case GMINE: ! 483: req = GRENREQ; ! 484: break; ! 485: default: ! 486: abort(); ! 487: } ! 488: if (rand_num(100) < prob) ! 489: add_shot(obj, y, x, LEFTS, req, (PLAYER *) NULL, ! 490: TRUE, pp->p_face); ! 491: else { ! 492: pp->p_ammo += req; ! 493: (void) sprintf(Buf, "%3d", pp->p_ammo); ! 494: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 495: outstr(pp, Buf, 3); ! 496: } ! 497: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.