|
|
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 <signal.h> ! 13: ! 14: # define PLUS_DELTA(x, max) if (x < max) x++; else x-- ! 15: # define MINUS_DELTA(x, min) if (x > min) x--; else x++ ! 16: ! 17: /* ! 18: * moveshots: ! 19: * Move the shots already in the air, taking explosions into account ! 20: */ ! 21: moveshots() ! 22: { ! 23: register BULLET *bp, *next; ! 24: register PLAYER *pp; ! 25: register int x, y; ! 26: register BULLET *blist; ! 27: register int i; ! 28: ! 29: rollexpl(); ! 30: if (Bullets == NULL) ! 31: goto ret; ! 32: ! 33: /* ! 34: * First we move through the bullet list BULSPD times, looking ! 35: * for things we may have run into. If we do run into ! 36: * something, we set up the explosion and disappear, checking ! 37: * for damage to any player who got in the way. ! 38: */ ! 39: ! 40: blist = Bullets; ! 41: Bullets = NULL; ! 42: for (bp = blist; bp != NULL; bp = next) { ! 43: next = bp->b_next; ! 44: x = bp->b_x; ! 45: y = bp->b_y; ! 46: Maze[y][x] = bp->b_over; ! 47: for (pp = Player; pp < End_player; pp++) ! 48: check(pp, y, x); ! 49: # ifdef MONITOR ! 50: for (pp = Monitor; pp < End_monitor; pp++) ! 51: check(pp, y, x); ! 52: # endif MONITOR ! 53: ! 54: for (i = 0; i < BULSPD; i++) { ! 55: if (bp->b_expl) ! 56: break; ! 57: ! 58: x = bp->b_x; ! 59: y = bp->b_y; ! 60: ! 61: switch (bp->b_face) { ! 62: case LEFTS: ! 63: x--; ! 64: break; ! 65: case RIGHT: ! 66: x++; ! 67: break; ! 68: case ABOVE: ! 69: y--; ! 70: break; ! 71: case BELOW: ! 72: y++; ! 73: break; ! 74: } ! 75: ! 76: switch (Maze[y][x]) { ! 77: case SHOT: ! 78: if (rand_num(100) < 5) { ! 79: zapshot(Bullets, bp); ! 80: zapshot(next, bp); ! 81: } ! 82: break; ! 83: case GRENADE: ! 84: if (rand_num(100) < 10) { ! 85: zapshot(Bullets, bp); ! 86: zapshot(next, bp); ! 87: } ! 88: break; ! 89: # ifdef REFLECT ! 90: case WALL4: /* reflecting walls */ ! 91: switch (bp->b_face) { ! 92: case LEFTS: ! 93: bp->b_face = BELOW; ! 94: break; ! 95: case RIGHT: ! 96: bp->b_face = ABOVE; ! 97: break; ! 98: case ABOVE: ! 99: bp->b_face = RIGHT; ! 100: break; ! 101: case BELOW: ! 102: bp->b_face = LEFTS; ! 103: break; ! 104: } ! 105: Maze[y][x] = WALL5; ! 106: # ifdef MONITOR ! 107: for (pp = Monitor; pp < End_monitor; pp++) ! 108: check(pp, y, x); ! 109: # endif MONITOR ! 110: break; ! 111: case WALL5: ! 112: switch (bp->b_face) { ! 113: case LEFTS: ! 114: bp->b_face = ABOVE; ! 115: break; ! 116: case RIGHT: ! 117: bp->b_face = BELOW; ! 118: break; ! 119: case ABOVE: ! 120: bp->b_face = LEFTS; ! 121: break; ! 122: case BELOW: ! 123: bp->b_face = RIGHT; ! 124: break; ! 125: } ! 126: Maze[y][x] = WALL4; ! 127: # ifdef MONITOR ! 128: for (pp = Monitor; pp < End_monitor; pp++) ! 129: check(pp, y, x); ! 130: # endif MONITOR ! 131: break; ! 132: # endif REFLECT ! 133: # ifdef RANDOM ! 134: case DOOR: ! 135: switch (rand_num(4)) { ! 136: case 0: ! 137: bp->b_face = ABOVE; ! 138: break; ! 139: case 1: ! 140: bp->b_face = BELOW; ! 141: break; ! 142: case 2: ! 143: bp->b_face = LEFTS; ! 144: break; ! 145: case 3: ! 146: bp->b_face = RIGHT; ! 147: break; ! 148: } ! 149: break; ! 150: # endif RANDOM ! 151: case LEFTS: ! 152: case RIGHT: ! 153: case BELOW: ! 154: case ABOVE: ! 155: # ifdef FLY ! 156: case FLYER: ! 157: # endif FLY ! 158: /* ! 159: * give the person a chance to catch a ! 160: * grenade if s/he is facing it ! 161: */ ! 162: if (rand_num(100) < 10 ! 163: && opposite(bp->b_face, Maze[y][x])) { ! 164: if (bp->b_owner != NULL) ! 165: message(bp->b_owner, ! 166: "Your charge was absorbed!"); ! 167: pp = play_at(y, x); ! 168: pp->p_ammo += bp->b_charge; ! 169: (void) sprintf(Buf, ! 170: "Absorbed charge (good shield!)"); ! 171: message(pp, Buf); ! 172: free((char *) bp); ! 173: (void) sprintf(Buf, "%3d", pp->p_ammo); ! 174: cgoto(pp, STAT_AMMO_ROW, STAT_VALUE_COL); ! 175: outstr(pp, Buf, 3); ! 176: goto next_bullet; ! 177: } ! 178: /* FALLTHROUGH */ ! 179: # ifndef RANDOM ! 180: case DOOR: ! 181: # endif RANDOM ! 182: case WALL1: ! 183: case WALL2: ! 184: case WALL3: ! 185: bp->b_expl = TRUE; ! 186: break; ! 187: } ! 188: ! 189: bp->b_x = x; ! 190: bp->b_y = y; ! 191: } ! 192: ! 193: bp->b_next = Bullets; ! 194: Bullets = bp; ! 195: next_bullet: ! 196: ; ! 197: } ! 198: ! 199: blist = Bullets; ! 200: Bullets = NULL; ! 201: for (bp = blist; bp != NULL; bp = next) { ! 202: next = bp->b_next; ! 203: if (!bp->b_expl) { ! 204: save_bullet(bp); ! 205: # ifdef MONITOR ! 206: for (pp = Monitor; pp < End_monitor; pp++) ! 207: check(pp, bp->b_y, bp->b_x); ! 208: # endif MONITOR ! 209: continue; ! 210: } ! 211: ! 212: chkshot(bp); ! 213: free((char *) bp); ! 214: } ! 215: for (pp = Player; pp < End_player; pp++) ! 216: Maze[pp->p_y][pp->p_x] = pp->p_face; ! 217: ret: ! 218: for (pp = Player; pp < End_player; pp++) { ! 219: # ifdef FLY ! 220: if (pp->p_flying >= 0) { ! 221: Maze[pp->p_y][pp->p_x] = pp->p_over; ! 222: x = pp->p_x + pp->p_flyx; ! 223: y = pp->p_y + pp->p_flyy; ! 224: if (x < 1) { ! 225: x = 1 - x; ! 226: pp->p_flyx = -pp->p_flyx; ! 227: } ! 228: else if (x > WIDTH - 2) { ! 229: x = (WIDTH - 2) - (x - (WIDTH - 2)); ! 230: pp->p_flyx = -pp->p_flyx; ! 231: } ! 232: if (y < 1) { ! 233: y = 1 - y; ! 234: pp->p_flyy = -pp->p_flyy; ! 235: } ! 236: else if (y > HEIGHT - 2) { ! 237: y = (HEIGHT - 2) - (y - (HEIGHT - 2)); ! 238: pp->p_flyy = -pp->p_flyy; ! 239: } ! 240: again: switch (Maze[y][x]) { ! 241: case LEFTS: ! 242: case RIGHT: ! 243: case ABOVE: ! 244: case BELOW: ! 245: case FLYER: ! 246: switch (rand_num(4)) { ! 247: case 0: ! 248: PLUS_DELTA(x, WIDTH - 2); ! 249: break; ! 250: case 1: ! 251: MINUS_DELTA(x, 1); ! 252: break; ! 253: case 2: ! 254: PLUS_DELTA(y, HEIGHT - 2); ! 255: break; ! 256: case 3: ! 257: MINUS_DELTA(y, 1); ! 258: break; ! 259: } ! 260: goto again; ! 261: case WALL1: ! 262: case WALL2: ! 263: case WALL3: ! 264: # ifdef REFLECT ! 265: case WALL4: ! 266: case WALL5: ! 267: # endif REFLECT ! 268: # ifdef RANDOM ! 269: case DOOR: ! 270: # endif RANDOM ! 271: if (pp->p_flying == 0) ! 272: pp->p_flying++; ! 273: break; ! 274: case MINE: ! 275: checkdam(pp, NULL, NULL, MINDAM, MINE); ! 276: Maze[y][x] = SPACE; ! 277: break; ! 278: case GMINE: ! 279: checkdam(pp, NULL, NULL, MINDAM, GMINE); ! 280: checkdam(pp, NULL, NULL, MINDAM, GMINE); ! 281: Maze[y][x] = SPACE; ! 282: break; ! 283: } ! 284: pp->p_y = y; ! 285: pp->p_x = x; ! 286: pp->p_over = Maze[y][x]; ! 287: if (pp->p_flying-- == 0) { ! 288: checkdam(pp, NULL, NULL, ! 289: rand_num(pp->p_damage / 5), FALL); ! 290: rand_face(pp); ! 291: showstat(pp); ! 292: } ! 293: Maze[y][x] = pp->p_face; ! 294: showexpl(y, x, pp->p_face); ! 295: } ! 296: # endif FLY ! 297: sendcom(pp, REFRESH); /* Flush out the explosions */ ! 298: look(pp); ! 299: sendcom(pp, REFRESH); ! 300: } ! 301: # ifdef MONITOR ! 302: for (pp = Monitor; pp < End_monitor; pp++) ! 303: sendcom(pp, REFRESH); ! 304: # endif MONITOR ! 305: ! 306: # ifdef CONSTANT_MOVE ! 307: if (Bullets != NULL) { ! 308: bul_alarm(1); ! 309: return; ! 310: } ! 311: for (i = 0; i < EXPLEN; i++) ! 312: if (Expl[i] != NULL) { ! 313: bul_alarm(1); ! 314: return; ! 315: } ! 316: bul_alarm(0); ! 317: # endif CONSTANT_MOVE ! 318: ! 319: return; ! 320: } ! 321: ! 322: save_bullet(bp) ! 323: register BULLET *bp; ! 324: { ! 325: bp->b_over = Maze[bp->b_y][bp->b_x]; ! 326: switch (bp->b_over) { ! 327: case SHOT: ! 328: case GRENADE: ! 329: case SATCHEL: ! 330: case BOMB: ! 331: # ifdef OOZE ! 332: case SLIME: ! 333: # ifdef VOLCANO ! 334: case LAVA: ! 335: # endif VOLCANO ! 336: # endif OOZE ! 337: find_under(Bullets, bp); ! 338: break; ! 339: } ! 340: ! 341: switch (bp->b_over) { ! 342: case LEFTS: ! 343: case RIGHT: ! 344: case ABOVE: ! 345: case BELOW: ! 346: # ifdef FLY ! 347: case FLYER: ! 348: # endif FLY ! 349: mark_player(bp); ! 350: break; ! 351: ! 352: default: ! 353: Maze[bp->b_y][bp->b_x] = bp->b_type; ! 354: break; ! 355: } ! 356: ! 357: bp->b_next = Bullets; ! 358: Bullets = bp; ! 359: } ! 360: ! 361: /* ! 362: * chkshot ! 363: * Handle explosions ! 364: */ ! 365: chkshot(bp) ! 366: register BULLET *bp; ! 367: { ! 368: register int y, x; ! 369: register int dy, dx, absdy; ! 370: register int delta, damage; ! 371: register char expl; ! 372: register PLAYER *pp; ! 373: ! 374: switch (bp->b_type) { ! 375: case SHOT: ! 376: case MINE: ! 377: delta = 0; ! 378: break; ! 379: case GRENADE: ! 380: case GMINE: ! 381: delta = 1; ! 382: break; ! 383: case SATCHEL: ! 384: delta = 2; ! 385: break; ! 386: case BOMB: ! 387: delta = 3; ! 388: break; ! 389: # ifdef OOZE ! 390: case SLIME: ! 391: # ifdef VOLCANO ! 392: case LAVA: ! 393: # endif VOLCANO ! 394: chkslime(bp); ! 395: return; ! 396: # endif OOZE ! 397: } ! 398: for (y = bp->b_y - delta; y <= bp->b_y + delta; y++) { ! 399: if (y < 0 || y >= HEIGHT) ! 400: continue; ! 401: dy = y - bp->b_y; ! 402: absdy = (dy < 0) ? -dy : dy; ! 403: for (x = bp->b_x - delta; x <= bp->b_x + delta; x++) { ! 404: if (x < 0 || x >= WIDTH) ! 405: continue; ! 406: dx = x - bp->b_x; ! 407: if (dx == 0) ! 408: expl = (dy == 0) ? '*' : '|'; ! 409: else if (dy == 0) ! 410: expl = '-'; ! 411: else if (dx == dy) ! 412: expl = '\\'; ! 413: else if (dx == -dy) ! 414: expl = '/'; ! 415: else ! 416: expl = '*'; ! 417: showexpl(y, x, expl); ! 418: switch (Maze[y][x]) { ! 419: case LEFTS: ! 420: case RIGHT: ! 421: case ABOVE: ! 422: case BELOW: ! 423: # ifdef FLY ! 424: case FLYER: ! 425: # endif FLY ! 426: if (dx < 0) ! 427: dx = -dx; ! 428: if (absdy > dx) ! 429: damage = delta - absdy + 1; ! 430: else ! 431: damage = delta - dx + 1; ! 432: pp = play_at(y, x); ! 433: while (damage-- > 0) ! 434: checkdam(pp, bp->b_owner, bp->b_score, ! 435: MINDAM, bp->b_type); ! 436: break; ! 437: case GMINE: ! 438: case MINE: ! 439: add_shot((Maze[y][x] == GMINE) ? ! 440: GRENADE : SHOT, ! 441: y, x, LEFTS, ! 442: (Maze[y][x] == GMINE) ? ! 443: GRENREQ : BULREQ, ! 444: (PLAYER *) NULL, TRUE, SPACE); ! 445: Maze[y][x] = SPACE; ! 446: break; ! 447: } ! 448: } ! 449: } ! 450: } ! 451: ! 452: # ifdef OOZE ! 453: /* ! 454: * chkslime: ! 455: * handle slime shot exploding ! 456: */ ! 457: chkslime(bp) ! 458: register BULLET *bp; ! 459: { ! 460: register BULLET *nbp; ! 461: ! 462: switch (Maze[bp->b_y][bp->b_x]) { ! 463: case WALL1: ! 464: case WALL2: ! 465: case WALL3: ! 466: # ifdef REFLECT ! 467: case WALL4: ! 468: case WALL5: ! 469: # endif REFLECT ! 470: # ifdef RANDOM ! 471: case DOOR: ! 472: # endif RANDOM ! 473: switch (bp->b_face) { ! 474: case LEFTS: ! 475: bp->b_x++; ! 476: break; ! 477: case RIGHT: ! 478: bp->b_x--; ! 479: break; ! 480: case ABOVE: ! 481: bp->b_y++; ! 482: break; ! 483: case BELOW: ! 484: bp->b_y--; ! 485: break; ! 486: } ! 487: break; ! 488: } ! 489: nbp = (BULLET *) malloc(sizeof (BULLET)); ! 490: *nbp = *bp; ! 491: # ifdef VOLCANO ! 492: moveslime(nbp, nbp->b_type == SLIME ? SLIMESPEED : LAVASPEED); ! 493: # else VOLCANO ! 494: moveslime(nbp, SLIMESPEED); ! 495: # endif VOLCANO ! 496: } ! 497: ! 498: /* ! 499: * moveslime: ! 500: * move the given slime shot speed times and add it back if ! 501: * it hasn't fizzled yet ! 502: */ ! 503: moveslime(bp, speed) ! 504: register BULLET *bp; ! 505: register int speed; ! 506: { ! 507: register int i, j, dirmask, count; ! 508: register PLAYER *pp; ! 509: register BULLET *nbp; ! 510: ! 511: if (speed == 0) { ! 512: if (bp->b_charge <= 0) ! 513: free((char *) bp); ! 514: else ! 515: save_bullet(bp); ! 516: return; ! 517: } ! 518: ! 519: # ifdef VOLCANO ! 520: showexpl(bp->b_y, bp->b_x, bp->b_type == LAVA ? LAVA : '*'); ! 521: # else VOLCANO ! 522: showexpl(bp->b_y, bp->b_x, '*'); ! 523: # endif VOLCANO ! 524: switch (Maze[bp->b_y][bp->b_x]) { ! 525: case LEFTS: ! 526: case RIGHT: ! 527: case ABOVE: ! 528: case BELOW: ! 529: # ifdef FLY ! 530: case FLYER: ! 531: # endif FLY ! 532: pp = play_at(bp->b_y, bp->b_x); ! 533: message(pp, "You've been slimed."); ! 534: checkdam(pp, bp->b_owner, bp->b_score, MINDAM, bp->b_type); ! 535: break; ! 536: } ! 537: ! 538: if (--bp->b_charge <= 0) { ! 539: free((char *) bp); ! 540: return; ! 541: } ! 542: ! 543: dirmask = 0; ! 544: count = 0; ! 545: switch (bp->b_face) { ! 546: case LEFTS: ! 547: if (!iswall(bp->b_y, bp->b_x - 1)) ! 548: dirmask |= WEST, count++; ! 549: if (!iswall(bp->b_y - 1, bp->b_x)) ! 550: dirmask |= NORTH, count++; ! 551: if (!iswall(bp->b_y + 1, bp->b_x)) ! 552: dirmask |= SOUTH, count++; ! 553: if (dirmask == 0) ! 554: if (!iswall(bp->b_y, bp->b_x + 1)) ! 555: dirmask |= EAST, count++; ! 556: break; ! 557: case RIGHT: ! 558: if (!iswall(bp->b_y, bp->b_x + 1)) ! 559: dirmask |= EAST, count++; ! 560: if (!iswall(bp->b_y - 1, bp->b_x)) ! 561: dirmask |= NORTH, count++; ! 562: if (!iswall(bp->b_y + 1, bp->b_x)) ! 563: dirmask |= SOUTH, count++; ! 564: if (dirmask == 0) ! 565: if (!iswall(bp->b_y, bp->b_x - 1)) ! 566: dirmask |= WEST, count++; ! 567: break; ! 568: case ABOVE: ! 569: if (!iswall(bp->b_y - 1, bp->b_x)) ! 570: dirmask |= NORTH, count++; ! 571: if (!iswall(bp->b_y, bp->b_x - 1)) ! 572: dirmask |= WEST, count++; ! 573: if (!iswall(bp->b_y, bp->b_x + 1)) ! 574: dirmask |= EAST, count++; ! 575: if (dirmask == 0) ! 576: if (!iswall(bp->b_y + 1, bp->b_x)) ! 577: dirmask |= SOUTH, count++; ! 578: break; ! 579: case BELOW: ! 580: if (!iswall(bp->b_y + 1, bp->b_x)) ! 581: dirmask |= SOUTH, count++; ! 582: if (!iswall(bp->b_y, bp->b_x - 1)) ! 583: dirmask |= WEST, count++; ! 584: if (!iswall(bp->b_y, bp->b_x + 1)) ! 585: dirmask |= EAST, count++; ! 586: if (dirmask == 0) ! 587: if (!iswall(bp->b_y - 1, bp->b_x)) ! 588: dirmask |= NORTH, count++; ! 589: break; ! 590: } ! 591: if (count == 0) { ! 592: /* ! 593: * No place to go. Just sit here for a while and wait ! 594: * for adjacent squares to clear out. ! 595: */ ! 596: save_bullet(bp); ! 597: return; ! 598: } ! 599: if (bp->b_charge < count) { ! 600: /* Only bp->b_charge paths may be taken */ ! 601: while (count > bp->b_charge) { ! 602: if (dirmask & WEST) ! 603: dirmask &= ~WEST; ! 604: else if (dirmask & EAST) ! 605: dirmask &= ~EAST; ! 606: else if (dirmask & NORTH) ! 607: dirmask &= ~NORTH; ! 608: else if (dirmask & SOUTH) ! 609: dirmask &= ~SOUTH; ! 610: count--; ! 611: } ! 612: } ! 613: ! 614: i = bp->b_charge / count; ! 615: j = bp->b_charge % count; ! 616: if (dirmask & WEST) { ! 617: count--; ! 618: nbp = create_shot(bp->b_type, bp->b_y, bp->b_x - 1, LEFTS, ! 619: i, bp->b_owner, bp->b_score, TRUE, SPACE); ! 620: moveslime(nbp, speed - 1); ! 621: } ! 622: if (dirmask & EAST) { ! 623: count--; ! 624: nbp = create_shot(bp->b_type, bp->b_y, bp->b_x + 1, RIGHT, ! 625: (count < j) ? i + 1 : i, bp->b_owner, bp->b_score, ! 626: TRUE, SPACE); ! 627: moveslime(nbp, speed - 1); ! 628: } ! 629: if (dirmask & NORTH) { ! 630: count--; ! 631: nbp = create_shot(bp->b_type, bp->b_y - 1, bp->b_x, ABOVE, ! 632: (count < j) ? i + 1 : i, bp->b_owner, bp->b_score, ! 633: TRUE, SPACE); ! 634: moveslime(nbp, speed - 1); ! 635: } ! 636: if (dirmask & SOUTH) { ! 637: count--; ! 638: nbp = create_shot(bp->b_type, bp->b_y + 1, bp->b_x, BELOW, ! 639: (count < j) ? i + 1 : i, bp->b_owner, bp->b_score, ! 640: TRUE, SPACE); ! 641: moveslime(nbp, speed - 1); ! 642: } ! 643: ! 644: free((char *) bp); ! 645: } ! 646: ! 647: /* ! 648: * iswall: ! 649: * returns whether the given location is a wall ! 650: */ ! 651: iswall(y, x) ! 652: register int y, x; ! 653: { ! 654: if (y < 0 || x < 0 || y >= HEIGHT || x >= WIDTH) ! 655: return TRUE; ! 656: switch (Maze[y][x]) { ! 657: case WALL1: ! 658: case WALL2: ! 659: case WALL3: ! 660: # ifdef REFLECT ! 661: case WALL4: ! 662: case WALL5: ! 663: # endif REFLECT ! 664: # ifdef RANDOM ! 665: case DOOR: ! 666: # endif RANDOM ! 667: # ifdef VOLCANO ! 668: case LAVA: ! 669: # endif VOLCANO ! 670: return TRUE; ! 671: } ! 672: return FALSE; ! 673: } ! 674: # endif OOZE ! 675: ! 676: /* ! 677: * zapshot: ! 678: * Take a shot out of the air. ! 679: */ ! 680: zapshot(blist, obp) ! 681: register BULLET *blist, *obp; ! 682: { ! 683: register BULLET *bp; ! 684: register FLAG explode; ! 685: ! 686: explode = FALSE; ! 687: for (bp = blist; bp != NULL; bp = bp->b_next) { ! 688: if (bp->b_x != obp->b_x || bp->b_y != obp->b_y) ! 689: continue; ! 690: if (bp->b_face == obp->b_face) ! 691: continue; ! 692: explode = TRUE; ! 693: break; ! 694: } ! 695: if (!explode) ! 696: return; ! 697: explshot(blist, obp->b_y, obp->b_x); ! 698: } ! 699: ! 700: /* ! 701: * explshot - ! 702: * Make all shots at this location blow up ! 703: */ ! 704: explshot(blist, y, x) ! 705: register BULLET *blist; ! 706: register int y, x; ! 707: { ! 708: register BULLET *bp; ! 709: ! 710: for (bp = blist; bp != NULL; bp = bp->b_next) ! 711: if (bp->b_x == x && bp->b_y == y) { ! 712: bp->b_expl = TRUE; ! 713: if (bp->b_owner != NULL) ! 714: message(bp->b_owner, "Shot intercepted"); ! 715: } ! 716: } ! 717: ! 718: /* ! 719: * play_at: ! 720: * Return a pointer to the player at the given location ! 721: */ ! 722: PLAYER * ! 723: play_at(y, x) ! 724: register int y, x; ! 725: { ! 726: register PLAYER *pp; ! 727: ! 728: for (pp = Player; pp < End_player; pp++) ! 729: if (pp->p_x == x && pp->p_y == y) ! 730: return pp; ! 731: fprintf(stderr, "driver: couldn't find player at (%d,%d)\n", x, y); ! 732: abort(); ! 733: /* NOTREACHED */ ! 734: } ! 735: ! 736: /* ! 737: * opposite: ! 738: * Return TRUE if the bullet direction faces the opposite direction ! 739: * of the player in the maze ! 740: */ ! 741: opposite(face, dir) ! 742: int face; ! 743: char dir; ! 744: { ! 745: switch (face) { ! 746: case LEFTS: ! 747: return (dir == RIGHT); ! 748: case RIGHT: ! 749: return (dir == LEFTS); ! 750: case ABOVE: ! 751: return (dir == BELOW); ! 752: case BELOW: ! 753: return (dir == ABOVE); ! 754: default: ! 755: return FALSE; ! 756: } ! 757: } ! 758: ! 759: /* ! 760: * is_bullet: ! 761: * Is there a bullet at the given coordinates? If so, return ! 762: * a pointer to the bullet, otherwise return NULL ! 763: */ ! 764: BULLET * ! 765: is_bullet(y, x) ! 766: register int y, x; ! 767: { ! 768: register BULLET *bp; ! 769: ! 770: for (bp = Bullets; bp != NULL; bp = bp->b_next) ! 771: if (bp->b_y == y && bp->b_x == x) ! 772: return bp; ! 773: return NULL; ! 774: } ! 775: ! 776: /* ! 777: * fixshots: ! 778: * change the underlying character of the shots at a location ! 779: * to the given character. ! 780: */ ! 781: fixshots(y, x, over) ! 782: register int y, x; ! 783: char over; ! 784: { ! 785: register BULLET *bp; ! 786: ! 787: for (bp = Bullets; bp != NULL; bp = bp->b_next) ! 788: if (bp->b_y == y && bp->b_x == x) ! 789: bp->b_over = over; ! 790: } ! 791: ! 792: /* ! 793: * find_under: ! 794: * find the underlying character for a bullet when it lands ! 795: * on another bullet. ! 796: */ ! 797: find_under(blist, bp) ! 798: register BULLET *blist, *bp; ! 799: { ! 800: register BULLET *nbp; ! 801: ! 802: for (nbp = blist; nbp != NULL; nbp = nbp->b_next) ! 803: if (bp->b_y == nbp->b_y && bp->b_x == nbp->b_x) { ! 804: bp->b_over = nbp->b_over; ! 805: break; ! 806: } ! 807: } ! 808: ! 809: /* ! 810: * mark_player: ! 811: * mark a player as under a shot ! 812: */ ! 813: mark_player(bp) ! 814: register BULLET *bp; ! 815: { ! 816: register PLAYER *pp; ! 817: ! 818: for (pp = Player; pp < End_player; pp++) ! 819: if (pp->p_y == bp->b_y && pp->p_x == bp->b_x) { ! 820: pp->p_undershot = TRUE; ! 821: break; ! 822: } ! 823: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.