1 /* $OpenBSD: hack.mkmaze.c,v 1.6 2016/01/09 18:33:15 mestre 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 66 extern struct permonst pm_wizard; 67 struct permonst hell_hound = 68 { "hell hound", 'd', 12, 14, 2, 3, 6, 0 }; 69 70 static void walkfrom(int, int); 71 static void move(int *, int *, int); 72 static int okay(int, int, int); 73 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++) for(y = zy-2; y <= zy+2; y++) { 92 levl[x][y].typ = 93 (y == zy-2 || y == zy+2 || x == zx-2 || x == zx+3) ? POOL : 94 (y == zy-1 || y == zy+1 || x == zx-1 || x == zx+2) ? HWALL: 95 ROOM; 96 } 97 (void) mkobj_at(AMULET_SYM, zx, zy); 98 flags.made_amulet = 1; 99 walkfrom(zx+4, zy); 100 if ((mtmp = makemon(&hell_hound, zx, zy))) 101 mtmp->msleep = 1; 102 if ((mtmp = makemon(PM_WIZARD, zx+1, zy))) { 103 mtmp->msleep = 1; 104 flags.no_of_wizards = 1; 105 } 106 } else { 107 mm = mazexy(); 108 zx = mm.x; 109 zy = mm.y; 110 walkfrom(zx,zy); 111 (void) mksobj_at(WAN_WISHING, zx, zy); 112 (void) mkobj_at(ROCK_SYM, zx, zy); /* put a rock on top of it */ 113 } 114 115 for(x = 2; x < COLNO-1; x++) 116 for(y = 2; y < ROWNO-1; y++) { 117 switch(levl[x][y].typ) { 118 case HWALL: 119 levl[x][y].scrsym = '-'; 120 break; 121 case ROOM: 122 levl[x][y].scrsym = '.'; 123 break; 124 } 125 } 126 for(x = rn1(8,11); x; x--) { 127 mm = mazexy(); 128 (void) mkobj_at(rn2(2) ? GEM_SYM : 0, mm.x, mm.y); 129 } 130 for(x = rn1(10,2); x; x--) { 131 mm = mazexy(); 132 (void) mkobj_at(ROCK_SYM, mm.x, mm.y); 133 } 134 mm = mazexy(); 135 (void) makemon(PM_MINOTAUR, mm.x, mm.y); 136 for(x = rn1(5,7); x; x--) { 137 mm = mazexy(); 138 (void) makemon((struct permonst *) 0, mm.x, mm.y); 139 } 140 for(x = rn1(6,7); x; x--) { 141 mm = mazexy(); 142 mkgold(0L,mm.x,mm.y); 143 } 144 for(x = rn1(6,7); x; x--) 145 mktrap(0,1,(struct mkroom *) 0); 146 mm = mazexy(); 147 levl[(int)(xupstair = mm.x)][(int)(yupstair = mm.y)].scrsym = '<'; 148 levl[(int)xupstair][(int)yupstair].typ = STAIRS; 149 xdnstair = ydnstair = 0; 150 } 151 152 static void 153 walkfrom(int x, int y) 154 { 155 int q,a,dir; 156 int dirs[4]; 157 158 levl[x][y].typ = ROOM; 159 while(1) { 160 q = 0; 161 for(a = 0; a < 4; a++) 162 if(okay(x,y,a)) dirs[q++]= a; 163 if(!q) return; 164 dir = dirs[rn2(q)]; 165 move(&x,&y,dir); 166 levl[x][y].typ = ROOM; 167 move(&x,&y,dir); 168 walkfrom(x,y); 169 } 170 } 171 172 static void 173 move(int *x, int *y, int dir) 174 { 175 switch(dir){ 176 case 0: --(*y); break; 177 case 1: (*x)++; break; 178 case 2: (*y)++; break; 179 case 3: --(*x); break; 180 } 181 } 182 183 static int 184 okay(int x, int y, int dir) 185 { 186 move(&x,&y,dir); 187 move(&x,&y,dir); 188 if(x<3 || y<3 || x>COLNO-3 || y>ROWNO-3 || levl[x][y].typ != 0) 189 return(0); 190 else 191 return(1); 192 } 193 194 coord 195 mazexy(void) 196 { 197 coord mm; 198 199 mm.x = 3 + 2*rn2(COLNO/2 - 2); 200 mm.y = 3 + 2*rn2(ROWNO/2 - 2); 201 return mm; 202 } 203