-/* $NetBSD: makemaze.c,v 1.2 1997/10/10 16:33:43 lukem Exp $ */
+/* $NetBSD: makemaze.c,v 1.11 2014/03/29 20:44:20 dholland Exp $ */
/*
- * Hunt
- * Copyright (c) 1985 Conrad C. Huang, Gregory S. Couch, Kenneth C.R.C. Arnold
- * San Francisco, California
+ * Copyright (c) 1983-2003, Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * + Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * + Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * + Neither the name of the University of California, San Francisco nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: makemaze.c,v 1.2 1997/10/10 16:33:43 lukem Exp $");
+__RCSID("$NetBSD: makemaze.c,v 1.11 2014/03/29 20:44:20 dholland Exp $");
#endif /* not lint */
-# include "hunt.h"
+#include "hunt.h"
-# define ISCLEAR(y,x) (Maze[y][x] == SPACE)
-# define ODD(n) ((n) & 01)
+#define ISCLEAR(y,x) (Maze[y][x] == SPACE)
+#define ODD(n) ((n) & 01)
-static int candig __P((int, int));
-static void dig __P((int, int));
-static void dig_maze __P((int, int));
-static void remap __P((void));
+#if 0
-void
-makemaze()
-{
- char *sp;
- int y, x;
+#define NPERM 24
+#define NDIR 4
- /*
- * fill maze with walls
- */
- sp = &Maze[0][0];
- while (sp < &Maze[HEIGHT - 1][WIDTH])
- *sp++ = DOOR;
+static const int dirs[NPERM][NDIR] = {
+ {0,1,2,3}, {3,0,1,2}, {0,2,3,1}, {0,3,2,1},
+ {1,0,2,3}, {2,3,0,1}, {0,2,1,3}, {2,3,1,0},
+ {1,0,3,2}, {1,2,0,3}, {3,1,2,0}, {2,0,3,1},
+ {1,3,0,2}, {0,3,1,2}, {1,3,2,0}, {2,0,1,3},
+ {0,1,3,2}, {3,1,0,2}, {2,1,0,3}, {1,2,3,0},
+ {2,1,3,0}, {3,0,2,1}, {3,2,0,1}, {3,2,1,0}
+};
- x = rand_num(WIDTH / 2) * 2 + 1;
- y = rand_num(HEIGHT / 2) * 2 + 1;
- dig_maze(x, y);
- remap();
-}
+static const int incr[NDIR][2] = {
+ {0, 1}, {1, 0}, {0, -1}, {-1, 0}
+};
-# define NPERM 24
-# define NDIR 4
-
-int dirs[NPERM][NDIR] = {
- {0,1,2,3}, {3,0,1,2}, {0,2,3,1}, {0,3,2,1},
- {1,0,2,3}, {2,3,0,1}, {0,2,1,3}, {2,3,1,0},
- {1,0,3,2}, {1,2,0,3}, {3,1,2,0}, {2,0,3,1},
- {1,3,0,2}, {0,3,1,2}, {1,3,2,0}, {2,0,1,3},
- {0,1,3,2}, {3,1,0,2}, {2,1,0,3}, {1,2,3,0},
- {2,1,3,0}, {3,0,2,1}, {3,2,0,1}, {3,2,1,0}
- };
-
-int incr[NDIR][2] = {
- {0, 1}, {1, 0}, {0, -1}, {-1, 0}
- };
-
-static void
-dig(y, x)
- int y, x;
-{
- int *dp;
- int *ip;
- int ny, nx;
- int *endp;
-
- Maze[y][x] = SPACE; /* Clear this spot */
- dp = dirs[rand_num(NPERM)];
- endp = &dp[NDIR];
- while (dp < endp) {
- ip = &incr[*dp++][0];
- ny = y + *ip++;
- nx = x + *ip;
- if (candig(ny, nx))
- dig(ny, nx);
- }
-}
/*
* candig:
* Is it legal to clear this spot?
*/
-static int
-candig(y, x)
- int y, x;
+static bool
+candig(int y, int x)
{
- int i;
+ int i;
if (ODD(x) && ODD(y))
- return FALSE; /* can't touch ODD spots */
+ return false; /* can't touch ODD spots */
if (y < UBOUND || y >= DBOUND)
- return FALSE; /* Beyond vertical bounds, NO */
+ return false; /* Beyond vertical bounds, NO */
if (x < LBOUND || x >= RBOUND)
- return FALSE; /* Beyond horizontal bounds, NO */
+ return false; /* Beyond horizontal bounds, NO */
if (ISCLEAR(y, x))
- return FALSE; /* Already clear, NO */
+ return false; /* Already clear, NO */
i = ISCLEAR(y, x + 1);
i += ISCLEAR(y, x - 1);
if (i > 1)
- return FALSE; /* Introduces cycle, NO */
+ return false; /* Introduces cycle, NO */
i += ISCLEAR(y + 1, x);
if (i > 1)
- return FALSE; /* Introduces cycle, NO */
+ return false; /* Introduces cycle, NO */
i += ISCLEAR(y - 1, x);
if (i > 1)
- return FALSE; /* Introduces cycle, NO */
+ return false; /* Introduces cycle, NO */
- return TRUE; /* OK */
+ return true; /* OK */
}
-void
-dig_maze(x, y)
- int x, y;
+static void
+dig(int y, int x)
{
- int tx, ty;
- int i, j;
- int order[4];
-#define MNORTH 0x1
-#define MSOUTH 0x2
-#define MEAST 0x4
-#define MWEST 0x8
+ const int *dp;
+ const int *ip;
+ int ny, nx;
+ const int *endp;
+
+ Maze[y][x] = SPACE; /* Clear this spot */
+ dp = dirs[rand_num(NPERM)];
+ endp = &dp[NDIR];
+ while (dp < endp) {
+ ip = &incr[*dp++][0];
+ ny = y + *ip++;
+ nx = x + *ip;
+ if (candig(ny, nx))
+ dig(ny, nx);
+ }
+}
+#endif
+
+static void
+dig_maze(int x, int y)
+{
+ int tx, ty;
+ int i, j;
+ int order[4];
+#define MNORTH 0x1
+#define MSOUTH 0x2
+#define MEAST 0x4
+#define MWEST 0x8
tx = ty = 0;
Maze[y][x] = SPACE;
}
}
-void
-remap()
+static void
+remap(void)
{
- int y, x;
- char *sp;
- int stat;
+ int y, x;
+ char *sp;
+ int stat;
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++) {
*sp = WALL2;
break;
case 0:
-# ifdef RANDOM
+#ifdef RANDOM
*sp = DOOR;
-# endif
-# ifdef REFLECT
+#endif
+#ifdef REFLECT
*sp = rand_num(2) ? WALL4 : WALL5;
-# endif
+#endif
break;
default:
*sp = WALL3;
}
memcpy(Orig_maze, Maze, sizeof Maze);
}
+
+void
+makemaze(void)
+{
+ char *sp;
+ int y, x;
+
+ /*
+ * fill maze with walls
+ */
+ sp = &Maze[0][0];
+ while (sp < &Maze[HEIGHT - 1][WIDTH])
+ *sp++ = DOOR;
+
+ x = rand_num(WIDTH / 2) * 2 + 1;
+ y = rand_num(HEIGHT / 2) * 2 + 1;
+ dig_maze(x, y);
+ remap();
+}