|
|
1.1 root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2: /* hack.mkshop.c - version 1.0.3 */
3:
4: #ifndef QUEST
5: #include "hack.h"
6: #include "def.mkroom.h"
7: #include "def.eshk.h"
8: #define ESHK ((struct eshk *)(&(shk->mextra[0])))
9: extern struct monst *makemon();
10: extern struct obj *mkobj_at();
11: extern int nroom;
12: extern char shtypes[]; /* = "=/)%?!["; 8 types: 7 specialized, 1 mixed */
13: schar shprobs[] = { 3,3,5,5,10,10,14,50 }; /* their probabilities */
14:
15: mkshop(){
16: register struct mkroom *sroom;
17: register int sh,sx,sy,i = -1;
18: register char let;
19: int roomno;
20: register struct monst *shk;
21: #ifdef WIZARD
22: /* first determine shoptype */
23: if(wizard){
24: extern char *getenv();
25: register char *ep = getenv("SHOPTYPE");
26: if(ep){
27: if(*ep == 'z' || *ep == 'Z'){
28: mkzoo(ZOO);
29: return;
30: }
31: if(*ep == 'm' || *ep == 'M'){
32: mkzoo(MORGUE);
33: return;
34: }
35: if(*ep == 'b' || *ep == 'B'){
36: mkzoo(BEEHIVE);
37: return;
38: }
39: if(*ep == 's' || *ep == 'S'){
40: mkswamp();
41: return;
42: }
43: for(i=0; shtypes[i]; i++)
44: if(*ep == shtypes[i]) break;
45: goto gottype;
46: }
47: }
48: gottype:
49: #endif WIZARD
50: for(sroom = &rooms[0], roomno = 0; ; sroom++, roomno++){
51: if(sroom->hx < 0) return;
52: if(sroom - rooms >= nroom) {
53: pline("rooms not closed by -1?");
54: return;
55: }
56: if(sroom->rtype) continue;
57: if(!sroom->rlit || has_dnstairs(sroom) || has_upstairs(sroom))
58: continue;
59: if(
60: #ifdef WIZARD
61: (wizard && getenv("SHOPTYPE") && sroom->doorct != 0) ||
62: #endif WIZARD
63: sroom->doorct <= 2 && sroom->doorct > 0) break;
64: }
65:
66: if(i < 0) { /* shoptype not yet determined */
67: register int j;
68:
69: for(j = rn2(100), i = 0; (j -= shprobs[i])>= 0; i++)
70: if(!shtypes[i]) break; /* superfluous */
71: if(isbig(sroom) && i + SHOPBASE == WANDSHOP)
72: i = GENERAL-SHOPBASE;
73: }
74: sroom->rtype = i + SHOPBASE;
75: let = shtypes[i];
76: sh = sroom->fdoor;
77: sx = doors[sh].x;
78: sy = doors[sh].y;
79: if(sx == sroom->lx-1) sx++; else
80: if(sx == sroom->hx+1) sx--; else
81: if(sy == sroom->ly-1) sy++; else
82: if(sy == sroom->hy+1) sy--; else {
83: #ifdef WIZARD
84: /* This is said to happen sometimes, but I've never seen it. */
85: if(wizard) {
86: register int j = sroom->doorct;
87: extern int doorindex;
88:
89: pline("Where is shopdoor?");
90: pline("Room at (%d,%d),(%d,%d).", sroom->lx, sroom->ly,
91: sroom->hx, sroom->hy);
92: pline("doormax=%d doorct=%d fdoor=%d",
93: doorindex, sroom->doorct, sh);
94: while(j--) {
95: pline("door [%d,%d]", doors[sh].x, doors[sh].y);
96: sh++;
97: }
98: more();
99: }
100: #endif WIZARD
101: return;
102: }
103: if(!(shk = makemon(PM_SHK,sx,sy))) return;
104: shk->isshk = shk->mpeaceful = 1;
105: shk->msleep = 0;
106: shk->mtrapseen = ~0; /* we know all the traps already */
107: ESHK->shoproom = roomno;
108: ESHK->shoplevel = dlevel;
109: ESHK->shd = doors[sh];
110: ESHK->shk.x = sx;
111: ESHK->shk.y = sy;
112: ESHK->robbed = 0;
113: ESHK->visitct = 0;
114: ESHK->following = 0;
115: shk->mgold = 1000 + 30*rnd(100); /* initial capital */
116: ESHK->billct = 0;
117: findname(ESHK->shknam, let);
118: for(sx = sroom->lx; sx <= sroom->hx; sx++)
119: for(sy = sroom->ly; sy <= sroom->hy; sy++){
120: register struct monst *mtmp;
121: if((sx == sroom->lx && doors[sh].x == sx-1) ||
122: (sx == sroom->hx && doors[sh].x == sx+1) ||
123: (sy == sroom->ly && doors[sh].y == sy-1) ||
124: (sy == sroom->hy && doors[sh].y == sy+1)) continue;
125: if(rn2(100) < dlevel && !m_at(sx,sy) &&
126: (mtmp = makemon(PM_MIMIC, sx, sy))){
127: mtmp->mimic = 1;
128: mtmp->mappearance =
129: (let && rn2(10) < dlevel) ? let : ']';
130: continue;
131: }
132: (void) mkobj_at(let, sx, sy);
133: }
134: }
135:
136: mkzoo(type)
137: int type;
138: {
139: register struct mkroom *sroom;
140: register struct monst *mon;
141: register int sh,sx,sy,i;
142: int goldlim = 500 * dlevel;
143: int moct = 0;
144: struct permonst *morguemon();
145:
146: i = nroom;
147: for(sroom = &rooms[rn2(nroom)]; ; sroom++) {
148: if(sroom == &rooms[nroom])
149: sroom = &rooms[0];
150: if(!i-- || sroom->hx < 0)
151: return;
152: if(sroom->rtype)
153: continue;
154: if(type == MORGUE && sroom->rlit)
155: continue;
156: if(has_upstairs(sroom) || (has_dnstairs(sroom) && rn2(3)))
157: continue;
158: if(sroom->doorct == 1 || !rn2(5))
159: break;
160: }
161: sroom->rtype = type;
162: sh = sroom->fdoor;
163: for(sx = sroom->lx; sx <= sroom->hx; sx++)
164: for(sy = sroom->ly; sy <= sroom->hy; sy++){
165: if((sx == sroom->lx && doors[sh].x == sx-1) ||
166: (sx == sroom->hx && doors[sh].x == sx+1) ||
167: (sy == sroom->ly && doors[sh].y == sy-1) ||
168: (sy == sroom->hy && doors[sh].y == sy+1)) continue;
169: mon = makemon(
170: (type == MORGUE) ? morguemon() :
171: (type == BEEHIVE) ? PM_KILLER_BEE : (struct permonst *) 0,
172: sx, sy);
173: if(mon) mon->msleep = 1;
174: switch(type) {
175: case ZOO:
176: i = sq(dist2(sx,sy,doors[sh].x,doors[sh].y));
177: if(i >= goldlim) i = 5*dlevel;
178: goldlim -= i;
179: mkgold((long)(10 + rn2(i)), sx, sy);
180: break;
181: case MORGUE:
182: /* Usually there is one dead body in the morgue */
183: if(!moct && rn2(3)) {
184: mksobj_at(CORPSE, sx, sy);
185: moct++;
186: }
187: break;
188: case BEEHIVE:
189: if(!rn2(3)) mksobj_at(LUMP_OF_ROYAL_JELLY, sx, sy);
190: break;
191: }
192: }
193: }
194:
195: struct permonst *
196: morguemon()
197: {
198: extern struct permonst pm_ghost;
199: register int i = rn2(100), hd = rn2(dlevel);
200:
201: if(hd > 10 && i < 10) return(PM_DEMON);
202: if(hd > 8 && i > 85) return(PM_VAMPIRE);
203: return((i < 40) ? PM_GHOST : (i < 60) ? PM_WRAITH : PM_ZOMBIE);
204: }
205:
206: mkswamp() /* Michiel Huisjes & Fred de Wilde */
207: {
208: register struct mkroom *sroom;
209: register int sx,sy,i,eelct = 0;
210: extern struct permonst pm_eel;
211:
212: for(i=0; i<5; i++) { /* 5 tries */
213: sroom = &rooms[rn2(nroom)];
214: if(sroom->hx < 0 || sroom->rtype ||
215: has_upstairs(sroom) || has_dnstairs(sroom))
216: continue;
217:
218: /* satisfied; make a swamp */
219: sroom->rtype = SWAMP;
220: for(sx = sroom->lx; sx <= sroom->hx; sx++)
221: for(sy = sroom->ly; sy <= sroom->hy; sy++)
222: if((sx+sy)%2 && !o_at(sx,sy) && !t_at(sx,sy)
223: && !m_at(sx,sy) && !nexttodoor(sx,sy)){
224: levl[sx][sy].typ = POOL;
225: levl[sx][sy].scrsym = POOL_SYM;
226: if(!eelct || !rn2(4)) {
227: (void) makemon(PM_EEL, sx, sy);
228: eelct++;
229: }
230: }
231: }
232: }
233:
234: nexttodoor(sx,sy)
235: register sx,sy;
236: {
237: register dx,dy;
238: register struct rm *lev;
239: for(dx = -1; dx <= 1; dx++) for(dy = -1; dy <= 1; dy++)
240: if((lev = &levl[sx+dx][sy+dy])->typ == DOOR ||
241: lev->typ == SDOOR || lev->typ == LDOOR)
242: return(1);
243: return(0);
244: }
245:
246: has_dnstairs(sroom)
247: register struct mkroom *sroom;
248: {
249: return(sroom->lx <= xdnstair && xdnstair <= sroom->hx &&
250: sroom->ly <= ydnstair && ydnstair <= sroom->hy);
251: }
252:
253: has_upstairs(sroom)
254: register struct mkroom *sroom;
255: {
256: return(sroom->lx <= xupstair && xupstair <= sroom->hx &&
257: sroom->ly <= yupstair && yupstair <= sroom->hy);
258: }
259:
260: isbig(sroom)
261: register struct mkroom *sroom;
262: {
263: register int area = (sroom->hx - sroom->lx) * (sroom->hy - sroom->ly);
264: return( area > 20 );
265: }
266:
267: dist2(x0,y0,x1,y1){
268: return((x0-x1)*(x0-x1) + (y0-y1)*(y0-y1));
269: }
270:
271: sq(a) int a; {
272: return(a*a);
273: }
274: #endif QUEST
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.