📄 expl.c
字号:
/* * Hunt * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold * San Francisco, California */# include "hunt.h"/* * showexpl: * Show the explosions as they currently are */showexpl(y, x, type)register int y, x;char type;{ register PLAYER *pp; register EXPL *ep; if (y < 0 || y >= HEIGHT) return; if (x < 0 || x >= WIDTH) return; ep = (EXPL *) malloc(sizeof (EXPL)); /* NOSTRICT */ ep->e_y = y; ep->e_x = x; ep->e_char = type; ep->e_next = NULL; if (Last_expl == NULL) Expl[0] = ep; else Last_expl->e_next = ep; Last_expl = ep; for (pp = Player; pp < End_player; pp++) { if (pp->p_maze[y][x] == type) continue; pp->p_maze[y][x] = type; cgoto(pp, y, x); outch(pp, type); }# ifdef MONITOR for (pp = Monitor; pp < End_monitor; pp++) { if (pp->p_maze[y][x] == type) continue; pp->p_maze[y][x] = type; cgoto(pp, y, x); outch(pp, type); }# endif switch (Maze[y][x]) { case WALL1: case WALL2: case WALL3:# ifdef RANDOM case DOOR:# endif# ifdef REFLECT case WALL4: case WALL5:# endif if (y >= UBOUND && y < DBOUND && x >= LBOUND && x < RBOUND) remove_wall(y, x); break; }}/* * rollexpl: * Roll the explosions over, so the next one in the list is at the * top */rollexpl(){ register EXPL *ep; register PLAYER *pp; register int y, x; register char c; register EXPL *nextep; for (ep = Expl[EXPLEN - 1]; ep != NULL; ep = nextep) { nextep = ep->e_next; y = ep->e_y; x = ep->e_x; if (y < UBOUND || y >= DBOUND || x < LBOUND || x >= RBOUND) c = Maze[y][x]; else c = SPACE; for (pp = Player; pp < End_player; pp++) if (pp->p_maze[y][x] == ep->e_char) { pp->p_maze[y][x] = c; cgoto(pp, y, x); outch(pp, c); }# ifdef MONITOR for (pp = Monitor; pp < End_monitor; pp++) check(pp, y, x);# endif free((char *) ep); } for (x = EXPLEN - 1; x > 0; x--) Expl[x] = Expl[x - 1]; Last_expl = Expl[0] = NULL;}/* There's about 700 walls in the initial maze. So we pick a number * that keeps the maze relatively full. */# define MAXREMOVE 40static REGEN removed[MAXREMOVE];static REGEN *rem_index = removed;/* * remove_wall - add a location where the wall was blown away. * if there is no space left over, put the a wall at * the location currently pointed at. */remove_wall(y, x)int y, x;{ register REGEN *r;# if defined(MONITOR) || defined(FLY) register PLAYER *pp;# endif# ifdef FLY register char save_char;# endif r = rem_index; while (r->r_y != 0) {# ifdef FLY switch (Maze[r->r_y][r->r_x]) { case SPACE: case LEFTS: case RIGHT: case ABOVE: case BELOW: case FLYER: save_char = Maze[r->r_y][r->r_x]; goto found; }# else if (Maze[r->r_y][r->r_x] == SPACE) break;# endif if (++r >= &removed[MAXREMOVE]) r = removed; }found: if (r->r_y != 0) { /* Slot being used, put back this wall */# ifdef FLY if (save_char == SPACE) Maze[r->r_y][r->r_x] = Orig_maze[r->r_y][r->r_x]; else { pp = play_at(r->r_y, r->r_x); if (pp->p_flying >= 0) pp->p_flying += rand_num(10); else { pp->p_flying = rand_num(20); pp->p_flyx = 2 * rand_num(6) - 5; pp->p_flyy = 2 * rand_num(6) - 5; } pp->p_over = Orig_maze[r->r_y][r->r_x]; pp->p_face = FLYER; Maze[r->r_y][r->r_x] = FLYER; showexpl(r->r_y, r->r_x, FLYER); }# else Maze[r->r_y][r->r_x] = Orig_maze[r->r_y][r->r_x];# endif# ifdef RANDOM if (rand_num(100) == 0) Maze[r->r_y][r->r_x] = DOOR;# endif# ifdef REFLECT if (rand_num(100) == 0) /* one percent of the time */ Maze[r->r_y][r->r_x] = WALL4;# endif# ifdef MONITOR for (pp = Monitor; pp < End_monitor; pp++) check(pp, r->r_y, r->r_x);# endif } r->r_y = y; r->r_x = x; if (++r >= &removed[MAXREMOVE]) rem_index = removed; else rem_index = r; Maze[y][x] = SPACE;# ifdef MONITOR for (pp = Monitor; pp < End_monitor; pp++) check(pp, y, x);# endif}/* * clearwalls: * Clear out the walls array */clearwalls(){ register REGEN *rp; for (rp = removed; rp < &removed[MAXREMOVE]; rp++) rp->r_y = 0; rem_index = removed;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -