Fandom

Wikihack

Source:Hack 1.0/mklv.shk.c

2,034pages on
this wiki
Add New Page
Talk0

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

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

Screenshots and source code from Hack are used under the CWI license.
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

Also on Fandom

Random Wiki