summaryrefslogtreecommitdiffstats
path: root/hunt/huntd/expl.c
diff options
context:
space:
mode:
Diffstat (limited to 'hunt/huntd/expl.c')
-rw-r--r--hunt/huntd/expl.c211
1 files changed, 211 insertions, 0 deletions
diff --git a/hunt/huntd/expl.c b/hunt/huntd/expl.c
new file mode 100644
index 00000000..59f7eee2
--- /dev/null
+++ b/hunt/huntd/expl.c
@@ -0,0 +1,211 @@
+/*
+ * 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 40
+
+static 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;
+}