1 /* $NetBSD: hack.mkmaze.c,v 1.8 2009/08/12 07:28:41 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, 5 * Amsterdam 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are 10 * met: 11 * 12 * - Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * - Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * - Neither the name of the Stichting Centrum voor Wiskunde en 20 * Informatica, nor the names of its contributors may be used to endorse or 21 * promote products derived from this software without specific prior 22 * written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 25 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 27 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 28 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 29 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 30 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 31 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 32 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 33 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37 /* 38 * Copyright (c) 1982 Jay Fenlason <hack@gnu.org> 39 * All rights reserved. 40 * 41 * Redistribution and use in source and binary forms, with or without 42 * modification, are permitted provided that the following conditions 43 * are met: 44 * 1. Redistributions of source code must retain the above copyright 45 * notice, this list of conditions and the following disclaimer. 46 * 2. Redistributions in binary form must reproduce the above copyright 47 * notice, this list of conditions and the following disclaimer in the 48 * documentation and/or other materials provided with the distribution. 49 * 3. The name of the author may not be used to endorse or promote products 50 * derived from this software without specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 53 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 54 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 55 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 56 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 57 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 58 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 59 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 60 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 61 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 62 */ 63 64 #include "hack.h" 65 #include "extern.h" 66 #include "def.mkroom.h" /* not really used */ 67 68 static const struct permonst hell_hound = 69 {"hell hound", 'd', 12, 14, 2, 3, 6, 0}; 70 71 static void walkfrom(int, int); 72 static void move(int *, int *, int); 73 static int okay(int, int, int); 74 75 void 76 makemaz(void) 77 { 78 int x, y; 79 int zx, zy; 80 coord mm; 81 boolean al = (dlevel >= 30 && !flags.made_amulet); 82 83 for (x = 2; x < COLNO - 1; x++) 84 for (y = 2; y < ROWNO - 1; y++) 85 levl[x][y].typ = (x % 2 && y % 2) ? 0 : HWALL; 86 if (al) { 87 struct monst *mtmp; 88 89 zx = 2 * (COLNO / 4) - 1; 90 zy = 2 * (ROWNO / 4) - 1; 91 for (x = zx - 2; x < zx + 4; x++) 92 for (y = zy - 2; y <= zy + 2; y++) { 93 levl[x][y].typ = 94 (y == zy - 2 || y == zy + 2 || x == zx - 2 || x == zx + 3) ? POOL : 95 (y == zy - 1 || y == zy + 1 || x == zx - 1 || x == zx + 2) ? HWALL : 96 ROOM; 97 } 98 (void) mkobj_at(AMULET_SYM, zx, zy); 99 flags.made_amulet = 1; 100 walkfrom(zx + 4, zy); 101 if ((mtmp = makemon(&hell_hound, zx, zy)) != NULL) 102 mtmp->msleep = 1; 103 if ((mtmp = makemon(PM_WIZARD, zx + 1, zy)) != NULL) { 104 mtmp->msleep = 1; 105 flags.no_of_wizards = 1; 106 } 107 } else { 108 mm = mazexy(); 109 zx = mm.x; 110 zy = mm.y; 111 walkfrom(zx, zy); 112 (void) mksobj_at(WAN_WISHING, zx, zy); 113 (void) mkobj_at(ROCK_SYM, zx, zy); /* put a rock on top of 114 * it */ 115 } 116 117 for (x = 2; x < COLNO - 1; x++) 118 for (y = 2; y < ROWNO - 1; y++) { 119 switch (levl[x][y].typ) { 120 case HWALL: 121 levl[x][y].scrsym = '-'; 122 break; 123 case ROOM: 124 levl[x][y].scrsym = '.'; 125 break; 126 } 127 } 128 for (x = rn1(8, 11); x; x--) { 129 mm = mazexy(); 130 (void) mkobj_at(rn2(2) ? GEM_SYM : 0, mm.x, mm.y); 131 } 132 for (x = rn1(10, 2); x; x--) { 133 mm = mazexy(); 134 (void) mkobj_at(ROCK_SYM, mm.x, mm.y); 135 } 136 mm = mazexy(); 137 (void) makemon(PM_MINOTAUR, mm.x, mm.y); 138 for (x = rn1(5, 7); x; x--) { 139 mm = mazexy(); 140 (void) makemon((struct permonst *) 0, mm.x, mm.y); 141 } 142 for (x = rn1(6, 7); x; x--) { 143 mm = mazexy(); 144 mkgold(0L, mm.x, mm.y); 145 } 146 for (x = rn1(6, 7); x; x--) 147 mktrap(0, 1, (struct mkroom *) 0); 148 mm = mazexy(); 149 levl[(xupstair = mm.x)][(yupstair = mm.y)].scrsym = '<'; 150 levl[xupstair][yupstair].typ = STAIRS; 151 xdnstair = ydnstair = 0; 152 } 153 154 static void 155 walkfrom(int x, int y) 156 { 157 int q, a, dir; 158 int dirs[4]; 159 levl[x][y].typ = ROOM; 160 while (1) { 161 q = 0; 162 for (a = 0; a < 4; a++) 163 if (okay(x, y, a)) 164 dirs[q++] = a; 165 if (!q) 166 return; 167 dir = dirs[rn2(q)]; 168 move(&x, &y, dir); 169 levl[x][y].typ = ROOM; 170 move(&x, &y, dir); 171 walkfrom(x, y); 172 } 173 } 174 175 static void 176 move(int *x, int *y, int dir) 177 { 178 switch (dir) { 179 case 0: 180 --(*y); 181 break; 182 case 1: 183 (*x)++; 184 break; 185 case 2: 186 (*y)++; 187 break; 188 case 3: 189 --(*x); 190 break; 191 } 192 } 193 194 static int 195 okay(int x, int y, int dir) 196 { 197 move(&x, &y, dir); 198 move(&x, &y, dir); 199 if (x < 3 || y < 3 || x > COLNO - 3 || y > ROWNO - 3 || levl[x][y].typ != 0) 200 return (0); 201 else 202 return (1); 203 } 204 205 coord 206 mazexy(void) 207 { 208 coord mm; 209 mm.x = 3 + 2 * rn2(COLNO / 2 - 2); 210 mm.y = 3 + 2 * rn2(ROWNO / 2 - 2); 211 return mm; 212 } 213