Source:Hack 1.0/mklv.shk.c

Below is the full text to mklv.shk.c from the source code of Hack 1.0. To link to a particular line, write [[Hack 1.0/mklv.shk.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.    #ifndef QUEST 4.   #include "mklev.h"  5.    #include "def.eshk.h"  6.    #define	ESHK	((struct eshk *)(&(shk->mextra[0]))) 7.   extern struct monst *makemon; 8.    9.    char shtypes[] = "=/)%?!["; /* 8 shoptypes: 7 specialised, 1 mixed */  10.   schar shprobs[] = { 3,3,5,5,10,10,14,50 };	/* their probabilities */  11.    12.   mkshop{  13.   register struct mkroom *sroom;  14.   register int sh,sx,sy,i;  15.   register char let;  16.   int roomno;  17.   register struct monst *shk;  18.   	for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){  19.   		if(sroom->hx < 0) return;  20.   		if(sroom->lx <= xdnstair && xdnstair <= sroom->hx && 21.  		   sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue;  22.   		if(sroom->lx <= xupstair && xupstair <= sroom->hx && 23.  		   sroom->ly <= yupstair && yupstair <= sroom->hy) continue;  24.   		if( 25.  #ifdef WIZARD 26.  		   wizard || 27.  #endif WIZARD 28.  			sroom->doorct == 1) break;  29.   	}  30.   #ifdef WIZARD  31.   	if(wizard){  32.   		extern char *getenv;  33.   		register char *ep = getenv("SHOPTYPE");  34.   		if(ep){  35.   			if(*ep == 'z' || *ep == 'Z'){  36.   				mkzoo;  37.   				return;  38.   			}  39.   			for(i=0; shtypes[i]; i++)  40.   				if(*ep == shtypes[i]) break;  41.   			let = i;  42.   			goto gotlet;  43.   		}  44.   	}  45.   #endif WIZARD  46.   	for(i = rn2(100),let = 0; (i -= shprobs[let])>= 0; let++)  47.   		if(!shtypes[let]) break;	/* superfluous */  48.   #ifdef WIZARD  49.   gotlet:  50.   #endif WIZARD  51.   	sroom->rtype = 8+let;  52.   	let = shtypes[let];  53.   	sh = sroom->fdoor;  54.   	sx = doors[sh].x;  55.   	sy = doors[sh].y;  56.   	if(sx == sroom->lx-1) sx++; else  57.   	if(sx == sroom->hx+1) sx--; else  58.   	if(sy == sroom->ly-1) sy++; else  59.   	if(sy == sroom->hy+1) sy--; else { 60.  		printf("Where is shopdoor?"); 61.  		return; 62.  	}  63.   	if(!(shk = makemon(PM_SHK,sx,sy))) return; 64.  	shk->isshk = shk->mpeaceful = 1; 65.  	shk->msleep = 0; 66.  	shk->mtrapseen = ~0;	/* we know all the traps already */ 67.  	ESHK->shoproom = roomno; 68.  	ESHK->shd = doors[sh]; 69.  	ESHK->shk.x = sx; 70.  	ESHK->shk.y = sy; 71.  	ESHK->robbed = 0; 72.  	ESHK->visitct = 0; 73.  	shk->mgold = 1000 + 30*rnd(100);	/* initial capital */ 74.  	ESHK->billct = 0; 75.  	findname(ESHK->shknam, let); 76.  	for(sx = sroom->lx; sx <= sroom->hx; sx++) 77.  	for(sy = sroom->ly; sy <= sroom->hy; sy++){ 78.  		register struct monst *mtmp; 79.  		if((sx == sroom->lx && doors[sh].x == sx-1) ||  80.   		   (sx == sroom->hx && doors[sh].x == sx+1) ||  81.   		   (sy == sroom->ly && doors[sh].y == sy-1) ||  82.   		   (sy == sroom->hy && doors[sh].y == sy+1)) continue; 83.  		if(rn2(100) < dlevel && !m_at(sx,sy) &&  84.   		   (mtmp = makemon(PM_MIMIC, sx, sy))){ 85.  			mtmp->mimic = 86.  			    (let && rn2(10) < dlevel) ? let : ']'; 87.  			continue; 88.  		}  89.    mkobj_at(let, sx, sy); 90.  	}  91.   #ifdef WIZARD 92.  	if(wizard) printf("I made a %c-shop.", let ? let : 'g'); 93.  #endif WIZARD 94.  }  95.    96.   mkzoo{ 97.  register struct mkroom *sroom; 98.  register int sh,sx,sy,i; 99.  int goldlim = 500 * dlevel; 100. 	for(sroom = &rooms[0]; ; sroom++){ 101. 		if(sroom->hx < 0) return; 102. 		if(sroom->lx <= xdnstair && xdnstair <= sroom->hx &&  103.  		   sroom->ly <= ydnstair && ydnstair <= sroom->hy) continue; 104. 		if(sroom->lx <= xupstair && xupstair <= sroom->hx &&  105.  		   sroom->ly <= yupstair && yupstair <= sroom->hy) continue; 106. 		if(sroom->doorct == 1) break; 107. 	}  108.  	sroom->rtype = 7; 109. 	sh = sroom->fdoor; 110. 	for(sx = sroom->lx; sx <= sroom->hx; sx++) 111. 	for(sy = sroom->ly; sy <= sroom->hy; sy++){ 112. 		if((sx == sroom->lx && doors[sh].x == sx-1) ||  113.  		   (sx == sroom->hx && doors[sh].x == sx+1) ||  114.  		   (sy == sroom->ly && doors[sh].y == sy-1) ||  115.  		   (sy == sroom->hy && doors[sh].y == sy+1)) continue; 116. 		(void) makemon((struct permonst *) 0,sx,sy); 117. 		i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y)); 118. 		if(i >= goldlim) i = 5*dlevel; 119. 		goldlim -= i;  120. mkgold(10 + rn2(i), sx, sy); 121. 	}  122.  #ifdef WIZARD 123. 	if(wizard) printf("I made a zoo."); 124. #endif WIZARD 125. }  126.   127.  dist2(x0,y0,x1,y1){ 128. 	return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1)); 129. }  130.   131.  sq(a) int a; { 132. 	return(a*a); 133. }  134.  #endif QUEST