Source:Hack 1.0/mklv.makemaz.c

Below is the full text to mklv.makemaz.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/mklv.makemaz.c#line123 ]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

1.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ 2.     3.    #include "mklev.h"  4.    extern struct monst *makemon; 5.   extern coord mazexy; 6.    7.    makemaz 8.   {  9.    	int x,y; 10.  	register zx,zy; 11.  	coord mm; 12.   13.   	for(x = 2; x < COLNO-1; x++) 14.  		for(y = 2; y < ROWNO-1; y++) 15.  			levl[x][y].typ = (x%2 && y%2) ? 0 : HWALL; 16.  	mm = mazexy; 17.  	zx = mm.x;  18. zy = mm.y; 19. walkfrom(zx,zy); 20.  	mkobj_at(AMULET_SYM, zx, zy); 21.  	mkobj_at(ROCK_SYM, zx, zy);	/* put a rock on top of the amulet */ 22.  	/* (probably this means that one needs a wand of digging to reach  23.   	    the amulet - we must make sure that the player has a chance of  24.   	    getting one; let us say when he kills the minotaur; of course  25.   	    the minotaur itself may be blocked behind rocks, but well...) */ 26.  	for(x = 2; x < COLNO-1; x++) 27.  		for(y = 2; y < ROWNO-1; y++) { 28.  			switch(levl[x][y].typ) { 29.  			case HWALL: 30.  				levl[x][y].scrsym = '-'; 31.  				break; 32.  			case ROOM: 33.  				levl[x][y].scrsym = '.'; 34.  				break; 35.  			}  36.   		}  37.   	for(x = rn1(8,11); x; x--) { 38.  		mm = mazexy; 39.  		mkobj_at(0, mm.x, mm.y); 40.  	}  41.   	for(x = rn1(10,2); x; x--) { 42.  		mm = mazexy; 43.  		mkobj_at(ROCK_SYM, mm.x, mm.y); 44.  	}  45.   	mm = mazexy; 46.  	(void) makemon(PM_MINOTAUR, mm.x, mm.y); 47.  	for(x = rn1(5,7); x; x--) { 48.  		mm = mazexy; 49.  		(void) makemon((struct permonst *) 0, mm.x, mm.y); 50.  	}  51.   	for(x = rn1(6,7); x; x--) { 52.  		mm = mazexy; 53.  		mkgold(0,mm.x,mm.y); 54.  	}  55.   	for(x = rn1(6,7); x; x--) 56.  		mktrap(0,1); 57.  	mm = mazexy; 58.  	levl[(xupstair = mm.x)][(yupstair = mm.y)].scrsym = '<'; 59.  	levl[xupstair][yupstair].typ = STAIRS; 60.  	xdnstair = ydnstair = 0; 61.  }  62.    63.   walkfrom(x,y) int x,y; { 64.  register int q,a,dir; 65.  int dirs[4]; 66.  	levl[x][y].typ = ROOM; 67.  	while(1) { 68.  		q = 0; 69.  		for(a = 0; a < 4; a++) 70.  			if(okay(x,y,a)) dirs[q++]= a;  71. if(!q) return; 72.  		dir = dirs[rn2(q)]; 73.  		move(&x,&y,dir); 74.  		levl[x][y].typ = ROOM; 75.  		move(&x,&y,dir); 76.  		walkfrom(x,y); 77.  	}  78.   }  79.    80.   move(x,y,dir) 81.  register int *x, *y; 82.  register int dir; 83.  {  84.   	switch(dir){ 85.  		case 0: --(*y); break; 86.  		case 1: (*x)++; break; 87.  		case 2: (*y)++; break; 88.  		case 3: --(*x); break; 89.  	}  90.   }  91.    92.   okay(x,y,dir) 93.  int x,y; 94.  register int dir; 95.  {  96.   	move(&x,&y,dir); 97.  	move(&x,&y,dir); 98.  	if(x<3 || y<3 || x>COLNO-3 || y>ROWNO-3 || levl[x][y].typ != 0) 99.  		return(0); 100. 	else 101. 		return(1); 102. }  103.   104.  coord 105. mazexy{ 106. 	coord mm; 107. 	mm.x = 3 + 2*rn2(COLNO/2 - 2); 108. 	mm.y = 3 + 2*rn2(ROWNO/2 - 2); 109. 	return mm; 110. }