Home | History | Annotate | Line # | Download | only in hack
hack.mkmaze.c revision 1.4
      1 /*	$NetBSD: hack.mkmaze.c,v 1.4 1997/10/19 16:58:27 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
      5  */
      6 
      7 #include <sys/cdefs.h>
      8 #ifndef lint
      9 __RCSID("$NetBSD: hack.mkmaze.c,v 1.4 1997/10/19 16:58:27 christos Exp $");
     10 #endif				/* not lint */
     11 
     12 #include "hack.h"
     13 #include "extern.h"
     14 #include "def.mkroom.h"		/* not really used */
     15 struct permonst hell_hound =
     16 {"hell hound", 'd', 12, 14, 2, 3, 6, 0};
     17 
     18 void
     19 makemaz()
     20 {
     21 	int             x, y;
     22 	int		zx, zy;
     23 	coord           mm;
     24 	boolean         al = (dlevel >= 30 && !flags.made_amulet);
     25 
     26 	for (x = 2; x < COLNO - 1; x++)
     27 		for (y = 2; y < ROWNO - 1; y++)
     28 			levl[x][y].typ = (x % 2 && y % 2) ? 0 : HWALL;
     29 	if (al) {
     30 		struct monst   *mtmp;
     31 
     32 		zx = 2 * (COLNO / 4) - 1;
     33 		zy = 2 * (ROWNO / 4) - 1;
     34 		for (x = zx - 2; x < zx + 4; x++)
     35 			for (y = zy - 2; y <= zy + 2; y++) {
     36 				levl[x][y].typ =
     37 					(y == zy - 2 || y == zy + 2 || x == zx - 2 || x == zx + 3) ? POOL :
     38 					(y == zy - 1 || y == zy + 1 || x == zx - 1 || x == zx + 2) ? HWALL :
     39 					ROOM;
     40 			}
     41 		(void) mkobj_at(AMULET_SYM, zx, zy);
     42 		flags.made_amulet = 1;
     43 		walkfrom(zx + 4, zy);
     44 		if ((mtmp = makemon(&hell_hound, zx, zy)) != NULL)
     45 			mtmp->msleep = 1;
     46 		if ((mtmp = makemon(PM_WIZARD, zx + 1, zy)) != NULL) {
     47 			mtmp->msleep = 1;
     48 			flags.no_of_wizards = 1;
     49 		}
     50 	} else {
     51 		mm = mazexy();
     52 		zx = mm.x;
     53 		zy = mm.y;
     54 		walkfrom(zx, zy);
     55 		(void) mksobj_at(WAN_WISHING, zx, zy);
     56 		(void) mkobj_at(ROCK_SYM, zx, zy);	/* put a rock on top of
     57 							 * it */
     58 	}
     59 
     60 	for (x = 2; x < COLNO - 1; x++)
     61 		for (y = 2; y < ROWNO - 1; y++) {
     62 			switch (levl[x][y].typ) {
     63 			case HWALL:
     64 				levl[x][y].scrsym = '-';
     65 				break;
     66 			case ROOM:
     67 				levl[x][y].scrsym = '.';
     68 				break;
     69 			}
     70 		}
     71 	for (x = rn1(8, 11); x; x--) {
     72 		mm = mazexy();
     73 		(void) mkobj_at(rn2(2) ? GEM_SYM : 0, mm.x, mm.y);
     74 	}
     75 	for (x = rn1(10, 2); x; x--) {
     76 		mm = mazexy();
     77 		(void) mkobj_at(ROCK_SYM, mm.x, mm.y);
     78 	}
     79 	mm = mazexy();
     80 	(void) makemon(PM_MINOTAUR, mm.x, mm.y);
     81 	for (x = rn1(5, 7); x; x--) {
     82 		mm = mazexy();
     83 		(void) makemon((struct permonst *) 0, mm.x, mm.y);
     84 	}
     85 	for (x = rn1(6, 7); x; x--) {
     86 		mm = mazexy();
     87 		mkgold(0L, mm.x, mm.y);
     88 	}
     89 	for (x = rn1(6, 7); x; x--)
     90 		mktrap(0, 1, (struct mkroom *) 0);
     91 	mm = mazexy();
     92 	levl[(xupstair = mm.x)][(yupstair = mm.y)].scrsym = '<';
     93 	levl[xupstair][yupstair].typ = STAIRS;
     94 	xdnstair = ydnstair = 0;
     95 }
     96 
     97 void
     98 walkfrom(x, y)
     99 	int             x, y;
    100 {
    101 	int             q, a, dir;
    102 	int             dirs[4];
    103 	levl[x][y].typ = ROOM;
    104 	while (1) {
    105 		q = 0;
    106 		for (a = 0; a < 4; a++)
    107 			if (okay(x, y, a))
    108 				dirs[q++] = a;
    109 		if (!q)
    110 			return;
    111 		dir = dirs[rn2(q)];
    112 		move(&x, &y, dir);
    113 		levl[x][y].typ = ROOM;
    114 		move(&x, &y, dir);
    115 		walkfrom(x, y);
    116 	}
    117 }
    118 
    119 void
    120 move(x, y, dir)
    121 	int            *x, *y;
    122 	int             dir;
    123 {
    124 	switch (dir) {
    125 	case 0:
    126 		--(*y);
    127 		break;
    128 	case 1:
    129 		(*x)++;
    130 		break;
    131 	case 2:
    132 		(*y)++;
    133 		break;
    134 	case 3:
    135 		--(*x);
    136 		break;
    137 	}
    138 }
    139 
    140 int
    141 okay(x, y, dir)
    142 	int             x, y;
    143 	int             dir;
    144 {
    145 	move(&x, &y, dir);
    146 	move(&x, &y, dir);
    147 	if (x < 3 || y < 3 || x > COLNO - 3 || y > ROWNO - 3 || levl[x][y].typ != 0)
    148 		return (0);
    149 	else
    150 		return (1);
    151 }
    152 
    153 coord
    154 mazexy()
    155 {
    156 	coord           mm;
    157 	mm.x = 3 + 2 * rn2(COLNO / 2 - 2);
    158 	mm.y = 3 + 2 * rn2(ROWNO / 2 - 2);
    159 	return mm;
    160 }
    161