|
|
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: /* ! 14: * showexpl: ! 15: * Show the explosions as they currently are ! 16: */ ! 17: showexpl(y, x, type) ! 18: register int y, x; ! 19: char type; ! 20: { ! 21: register PLAYER *pp; ! 22: register EXPL *ep; ! 23: ! 24: if (y < 0 || y >= HEIGHT) ! 25: return; ! 26: if (x < 0 || x >= WIDTH) ! 27: return; ! 28: ep = (EXPL *) malloc(sizeof (EXPL)); /* NOSTRICT */ ! 29: ep->e_y = y; ! 30: ep->e_x = x; ! 31: ep->e_char = type; ! 32: ep->e_next = NULL; ! 33: if (Last_expl == NULL) ! 34: Expl[0] = ep; ! 35: else ! 36: Last_expl->e_next = ep; ! 37: Last_expl = ep; ! 38: for (pp = Player; pp < End_player; pp++) { ! 39: if (pp->p_maze[y][x] == type) ! 40: continue; ! 41: pp->p_maze[y][x] = type; ! 42: cgoto(pp, y, x); ! 43: outch(pp, type); ! 44: } ! 45: # ifdef MONITOR ! 46: for (pp = Monitor; pp < End_monitor; pp++) { ! 47: if (pp->p_maze[y][x] == type) ! 48: continue; ! 49: pp->p_maze[y][x] = type; ! 50: cgoto(pp, y, x); ! 51: outch(pp, type); ! 52: } ! 53: # endif MONITOR ! 54: switch (Maze[y][x]) { ! 55: case WALL1: ! 56: case WALL2: ! 57: case WALL3: ! 58: # ifdef RANDOM ! 59: case DOOR: ! 60: # endif RANDOM ! 61: # ifdef REFLECT ! 62: case WALL4: ! 63: case WALL5: ! 64: # endif REFLECT ! 65: if (y >= UBOUND && y < DBOUND && x >= LBOUND && x < RBOUND) ! 66: remove_wall(y, x); ! 67: break; ! 68: } ! 69: } ! 70: ! 71: /* ! 72: * rollexpl: ! 73: * Roll the explosions over, so the next one in the list is at the ! 74: * top ! 75: */ ! 76: rollexpl() ! 77: { ! 78: register EXPL *ep; ! 79: register PLAYER *pp; ! 80: register int y, x; ! 81: register char c; ! 82: register EXPL *nextep; ! 83: ! 84: for (ep = Expl[EXPLEN - 1]; ep != NULL; ep = nextep) { ! 85: nextep = ep->e_next; ! 86: y = ep->e_y; ! 87: x = ep->e_x; ! 88: if (y < UBOUND || y >= DBOUND || x < LBOUND || x >= RBOUND) ! 89: c = Maze[y][x]; ! 90: else ! 91: c = SPACE; ! 92: for (pp = Player; pp < End_player; pp++) ! 93: if (pp->p_maze[y][x] == ep->e_char) { ! 94: pp->p_maze[y][x] = c; ! 95: cgoto(pp, y, x); ! 96: outch(pp, c); ! 97: } ! 98: # ifdef MONITOR ! 99: for (pp = Monitor; pp < End_monitor; pp++) ! 100: check(pp, y, x); ! 101: # endif MONITOR ! 102: free((char *) ep); ! 103: } ! 104: for (x = EXPLEN - 1; x > 0; x--) ! 105: Expl[x] = Expl[x - 1]; ! 106: Last_expl = Expl[0] = NULL; ! 107: } ! 108: ! 109: /* There's about 700 walls in the initial maze. So we pick a number ! 110: * that keeps the maze relatively full. */ ! 111: # define MAXREMOVE 40 ! 112: ! 113: static REGEN removed[MAXREMOVE]; ! 114: static REGEN *rem_index = removed; ! 115: ! 116: /* ! 117: * remove_wall - add a location where the wall was blown away. ! 118: * if there is no space left over, put the a wall at ! 119: * the location currently pointed at. ! 120: */ ! 121: remove_wall(y, x) ! 122: int y, x; ! 123: { ! 124: register REGEN *r; ! 125: # if defined(MONITOR) || defined(FLY) ! 126: register PLAYER *pp; ! 127: # endif MONITOR || FLY ! 128: # ifdef FLY ! 129: register char save_char; ! 130: # endif FLY ! 131: ! 132: r = rem_index; ! 133: while (r->r_y != 0) { ! 134: # ifdef FLY ! 135: switch (Maze[r->r_y][r->r_x]) { ! 136: case SPACE: ! 137: case LEFTS: ! 138: case RIGHT: ! 139: case ABOVE: ! 140: case BELOW: ! 141: case FLYER: ! 142: save_char = Maze[r->r_y][r->r_x]; ! 143: goto found; ! 144: } ! 145: # else FLY ! 146: if (Maze[r->r_y][r->r_x] == SPACE) ! 147: break; ! 148: # endif FLY ! 149: if (++r >= &removed[MAXREMOVE]) ! 150: r = removed; ! 151: } ! 152: ! 153: found: ! 154: if (r->r_y != 0) { ! 155: /* Slot being used, put back this wall */ ! 156: # ifdef FLY ! 157: if (save_char == SPACE) ! 158: Maze[r->r_y][r->r_x] = Orig_maze[r->r_y][r->r_x]; ! 159: else { ! 160: pp = play_at(r->r_y, r->r_x); ! 161: if (pp->p_flying >= 0) ! 162: pp->p_flying += rand_num(10); ! 163: else { ! 164: pp->p_flying = rand_num(20); ! 165: pp->p_flyx = 2 * rand_num(6) - 5; ! 166: pp->p_flyy = 2 * rand_num(6) - 5; ! 167: } ! 168: pp->p_over = Orig_maze[r->r_y][r->r_x]; ! 169: pp->p_face = FLYER; ! 170: Maze[r->r_y][r->r_x] = FLYER; ! 171: showexpl(r->r_y, r->r_x, FLYER); ! 172: } ! 173: # else FLY ! 174: Maze[r->r_y][r->r_x] = Orig_maze[r->r_y][r->r_x]; ! 175: # endif FLY ! 176: # ifdef RANDOM ! 177: if (rand_num(100) == 0) ! 178: Maze[r->r_y][r->r_x] = DOOR; ! 179: # endif RANDOM ! 180: # ifdef REFLECT ! 181: if (rand_num(100) == 0) /* one percent of the time */ ! 182: Maze[r->r_y][r->r_x] = WALL4; ! 183: # endif REFLECT ! 184: # ifdef MONITOR ! 185: for (pp = Monitor; pp < End_monitor; pp++) ! 186: check(pp, r->r_y, r->r_x); ! 187: # endif MONITOR ! 188: } ! 189: ! 190: r->r_y = y; ! 191: r->r_x = x; ! 192: if (++r >= &removed[MAXREMOVE]) ! 193: rem_index = removed; ! 194: else ! 195: rem_index = r; ! 196: ! 197: Maze[y][x] = SPACE; ! 198: # ifdef MONITOR ! 199: for (pp = Monitor; pp < End_monitor; pp++) ! 200: check(pp, y, x); ! 201: # endif MONITOR ! 202: } ! 203: ! 204: /* ! 205: * clearwalls: ! 206: * Clear out the walls array ! 207: */ ! 208: clearwalls() ! 209: { ! 210: register REGEN *rp; ! 211: ! 212: for (rp = removed; rp < &removed[MAXREMOVE]; rp++) ! 213: rp->r_y = 0; ! 214: rem_index = removed; ! 215: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.