1 /* SCCS Id: @(#)mkroom.c 3.4 2001/09/06 */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed. See license for details. */
7 * mkroom() -- make and stock a room of a given type
8 * nexttodoor() -- return TRUE if adjacent to a door
9 * has_dnstairs() -- return TRUE if given room has a down staircase
10 * has_upstairs() -- return TRUE if given room has an up staircase
11 * courtmon() -- generate a court monster
12 * douglas_adams_mon() -- create a Douglas-Adams_Monster
13 * save_rooms() -- save rooms into file fd
14 * rest_rooms() -- restore rooms from file fd
20 STATIC_DCL boolean
isbig(struct mkroom
*);
21 STATIC_DCL
struct mkroom
* pick_room(BOOLEAN_P
);
22 STATIC_DCL
void mkshop(void), mkzoo(int), mkswamp(void);
23 STATIC_DCL
void mktemple(void);
24 STATIC_DCL coord
* shrine_pos(int);
25 STATIC_DCL
struct permonst
* morguemon(void);
26 STATIC_DCL
struct permonst
* tenshallmon(void);
27 STATIC_DCL
struct permonst
* tenshallmonB(void);
28 STATIC_DCL
struct permonst
* prisonermon(void);
29 STATIC_DCL
struct permonst
* fungus(void);
31 /*STATIC_DCL struct permonst * colormon(int);*/
33 STATIC_DCL
void mktraproom(void);
34 STATIC_DCL
void mkpoolroom(void);
35 STATIC_DCL
void mkbossroom(void);
36 STATIC_DCL
void mknastycentral(void);
37 STATIC_DCL
void mkemptydesert(void);
38 STATIC_DCL
void mkstatueroom(void);
39 STATIC_DCL
void mkinsideroom(void);
40 STATIC_DCL
void mkriverroom(void);
41 STATIC_DCL
void mkchaosroom(void);
42 STATIC_DCL
void mkmixedpool(void);
43 STATIC_DCL
void mkshowerroom(void);
44 STATIC_DCL
void mkcentraltedium(void);
45 STATIC_DCL
void mkrampageroom(void);
46 STATIC_DCL
void save_room(int,struct mkroom
*);
47 STATIC_DCL
void rest_room(int,struct mkroom
*);
50 #define sq(x) ((x)*(x))
52 extern const struct shclass shtypes
[]; /* defined in shknam.c */
58 register struct mkroom
*sroom
;
60 register int area
= (sroom
->hx
- sroom
->lx
+ 1)
61 * (sroom
->hy
- sroom
->ly
+ 1);
62 return((boolean
)( area
> 20 ));
66 mkroommateroom(variety
)
68 /* variety: 0 = usually make floor but not always, 1 = only very rarely make floor; might add more later */
70 int xlou
, xreal
, ylou
, yreal
;
72 boolean wallremoving
= 0;
73 if (variety
== 0 && rn2(5)) wallremoving
= 1;
74 if (variety
== 1 && !rn2(5)) wallremoving
= 1;
76 u
.roommatehack
= FALSE
;
77 if (wallremoving
== 0 && rn2(3)) u
.roommatehack
= TRUE
; /* allow monsters to be placed inside walls sometimes */
78 if (wallremoving
== 1 && !rn2(4)) u
.roommatehack
= TRUE
; /* allow monsters to be placed inside walls sometimes */
84 if (!rn2(100)) xreal
+= rnd(80);
85 if (!rn2(100)) yreal
+= rnd(24);
86 if (!rn2(10)) xreal
+= rnd(40);
87 if (!rn2(10)) yreal
+= rnd(12);
88 if (xreal
> 80) xreal
= 80;
89 if (yreal
> 20) yreal
= 20;
91 if (!rn2(100)) xreal
+= rnd(40);
92 if (!rn2(100)) yreal
+= rnd(12);
93 if (!rn2(10)) xreal
+= rnd(20);
94 if (!rn2(10)) yreal
+= rnd(6);
95 if (xreal
> 50) xreal
= 50;
96 if (yreal
> 10) yreal
= 10;
99 xlou
+= rn2(COLNO
- (xreal
+ 1));
100 ylou
+= rn2(ROWNO
- (yreal
+ 1));
102 while ((xlou
+ xreal
) > (COLNO
- 1)) {
103 impossible("xlou + xreal too big");
106 while ((ylou
+ yreal
) > (ROWNO
- 1)) {
107 impossible("ylou + yreal too big");
111 add_room(xlou
, ylou
, (xlou
+ xreal
), (ylou
+ yreal
), rn2(2), RANDOMROOM
, FALSE
, FALSE
, wallremoving
? 1 : 2);
112 fill_room(&rooms
[nroom
- 1], FALSE
);
114 u
.roommatehack
= FALSE
;
120 /* make and stock a room of a given type */
123 if (roomtype
>= SHOPBASE
)
124 mkshop(); /* someday, we should be able to specify shop type */
125 else switch(roomtype
) {
126 case COURT
: mkzoo(COURT
); break;
127 case ZOO
: mkzoo(ZOO
); break;
128 case BEEHIVE
: mkzoo(BEEHIVE
); break;
129 case MORGUE
: mkzoo(MORGUE
); break;
130 case BARRACKS
: mkzoo(BARRACKS
); break;
131 case REALZOO
: mkzoo(REALZOO
); break;
132 case BADFOODSHOP
: mkzoo(BADFOODSHOP
); break;
133 case DOUGROOM
: mkzoo(DOUGROOM
); break;
134 case DRAGONLAIR
: mkzoo(DRAGONLAIR
); break;
135 case GIANTCOURT
: mkzoo(GIANTCOURT
); break;
136 case SWAMP
: mkswamp(); break;
137 case TEMPLE
: mktemple(); break;
138 case LEPREHALL
: mkzoo(LEPREHALL
); break;
139 case COCKNEST
: mkzoo(COCKNEST
); break;
140 case ANTHOLE
: mkzoo(ANTHOLE
); break;
141 case LEMUREPIT
: mkzoo(LEMUREPIT
); break;
142 case MIGOHIVE
: mkzoo(MIGOHIVE
); break;
143 case FUNGUSFARM
: mkzoo(FUNGUSFARM
); break;
144 case CLINIC
: mkzoo(CLINIC
); break;
145 case TERRORHALL
: mkzoo(TERRORHALL
); break;
146 case TENSHALL
: mkzoo(TENSHALL
); break;
147 case ELEMHALL
: mkzoo(ELEMHALL
); break;
148 case ANGELHALL
: mkzoo(ANGELHALL
); break;
149 case MIMICHALL
: mkzoo(MIMICHALL
); break;
150 case NYMPHHALL
: mkzoo(NYMPHHALL
); break;
151 case TROLLHALL
: mkzoo(TROLLHALL
); break;
152 case HUMANHALL
: mkzoo(HUMANHALL
); break;
153 case GOLEMHALL
: mkzoo(GOLEMHALL
); break;
154 case SPIDERHALL
: mkzoo(SPIDERHALL
); break;
155 case COINHALL
: mkzoo(COINHALL
); break;
156 case GRUEROOM
: mkzoo(GRUEROOM
); break;
157 case TRAPROOM
: mktraproom(); break;
158 case POOLROOM
: mkpoolroom(); break;
159 case STATUEROOM
: mkstatueroom(); break;
160 case INSIDEROOM
: mkinsideroom(); break;
161 case RIVERROOM
: mkriverroom(); break;
162 case ARMORY
: mkzoo(ARMORY
); break;
163 case EMPTYNEST
: mkzoo(EMPTYNEST
); break;
165 case CRYPTROOM
: mkzoo(CRYPTROOM
); break;
166 case TROUBLEZONE
: mkzoo(TROUBLEZONE
); break;
167 case WEAPONCHAMBER
: mkzoo(WEAPONCHAMBER
); break;
168 case HELLPIT
: mkzoo(HELLPIT
); break;
169 case ROBBERCAVE
: mkzoo(ROBBERCAVE
); break;
170 case CASINOROOM
: mkzoo(CASINOROOM
); break;
171 case SANITATIONCENTRAL
: mkzoo(SANITATIONCENTRAL
); break;
172 case FEMINISMROOM
: mkzoo(FEMINISMROOM
); break;
173 case MEADOWROOM
: mkzoo(MEADOWROOM
); break;
174 case COOLINGCHAMBER
: mkzoo(COOLINGCHAMBER
); break;
175 case VOIDROOM
: mkzoo(VOIDROOM
); break;
176 case HAMLETROOM
: mkzoo(HAMLETROOM
); break;
177 case KOPSTATION
: mkzoo(KOPSTATION
); break;
178 case BOSSROOM
: mkbossroom(); break;
179 case RNGCENTER
: mkzoo(RNGCENTER
); break;
180 case WIZARDSDORM
: mkzoo(WIZARDSDORM
); break;
181 case DOOMEDBARRACKS
: mkzoo(DOOMEDBARRACKS
); break;
182 case SLEEPINGROOM
: mkzoo(SLEEPINGROOM
); break;
183 case DIVERPARADISE
: mkzoo(DIVERPARADISE
); break;
184 case MENAGERIE
: mkzoo(MENAGERIE
); break;
185 case NASTYCENTRAL
: mknastycentral(); break;
186 case EMPTYDESERT
: mkemptydesert(); break;
187 case RARITYROOM
: mkzoo(RARITYROOM
); break;
188 case EXHIBITROOM
: mkzoo(EXHIBITROOM
); break;
189 case PRISONCHAMBER
: mkzoo(PRISONCHAMBER
); break;
190 case NUCLEARCHAMBER
: mkzoo(NUCLEARCHAMBER
); break;
191 case LEVELSEVENTYROOM
: mkzoo(LEVELSEVENTYROOM
); break;
192 case PLAYERCENTRAL
: mkzoo(PLAYERCENTRAL
); break;
193 case VARIANTROOM
: mkzoo(VARIANTROOM
); break;
195 case EVILROOM
: mkzoo(EVILROOM
); break;
196 case RELIGIONCENTER
: mkzoo(RELIGIONCENTER
); break;
197 case CHAOSROOM
: mkchaosroom(); break;
198 case CURSEDMUMMYROOM
: mkzoo(CURSEDMUMMYROOM
); break;
199 case MIXEDPOOL
: mkmixedpool(); break;
200 case ARDUOUSMOUNTAIN
: mkzoo(ARDUOUSMOUNTAIN
); break;
201 case LETTERSALADROOM
: mkzoo(LETTERSALADROOM
); break;
202 case THE_AREA_ROOM
: mkzoo(THE_AREA_ROOM
); break;
203 case CHANGINGROOM
: mkzoo(CHANGINGROOM
); break;
204 case QUESTORROOM
: mkzoo(QUESTORROOM
); break;
205 case LEVELFFROOM
: mkzoo(LEVELFFROOM
); break;
206 case VERMINROOM
: mkzoo(VERMINROOM
); break;
207 case MIRASPA
: mkzoo(MIRASPA
); break;
208 case FULLROOM
: mkzoo(FULLROOM
); break;
209 case MACHINEROOM
: mkzoo(MACHINEROOM
); break;
210 case SHOWERROOM
: mkshowerroom(); break;
211 case GREENCROSSROOM
: mkzoo(GREENCROSSROOM
); break;
212 case CENTRALTEDIUM
: mkcentraltedium(); break;
213 case RUINEDCHURCH
: mkzoo(RUINEDCHURCH
); break;
214 case RAMPAGEROOM
: mkrampageroom(); break;
215 case GAMECORNER
: mkzoo(GAMECORNER
); break;
216 case ILLUSIONROOM
: mkzoo(ILLUSIONROOM
); break;
224 case 1: mkzoo(COURT
); break;
225 case 2: mkswamp(); break;
226 case 3: mkzoo(BEEHIVE
); break;
227 case 4: mkzoo(MORGUE
); break;
228 case 5: mkzoo(BARRACKS
); break;
229 case 6: mkzoo(ZOO
); break;
230 case 7: mkzoo(REALZOO
); break;
231 case 8: mkzoo(GIANTCOURT
); break;
232 case 9: mkzoo(LEPREHALL
); break;
233 case 10: mkzoo(DRAGONLAIR
); break;
234 case 11: mkzoo(BADFOODSHOP
); break;
235 case 12: mkzoo(COCKNEST
); break;
236 case 13: mkzoo(ANTHOLE
); break;
237 case 14: mkzoo(LEMUREPIT
); break;
238 case 15: mkzoo(MIGOHIVE
); break;
239 case 16: mkzoo(FUNGUSFARM
); break;
240 case 17: mkzoo(CLINIC
); break;
241 case 18: mkzoo(TERRORHALL
); break;
242 case 19: mkzoo(ELEMHALL
); break;
243 case 20: mkzoo(ANGELHALL
); break;
244 case 21: mkzoo(MIMICHALL
); break;
245 case 22: mkzoo(NYMPHHALL
); break;
246 case 23: mkzoo(SPIDERHALL
); break;
247 case 24: mkzoo(TROLLHALL
); break;
248 case 25: mkzoo(HUMANHALL
); break;
249 case 26: mkzoo(GOLEMHALL
); break;
250 case 27: mkzoo(COINHALL
); break;
251 case 28: mkzoo(DOUGROOM
); break;
252 case 29: mkzoo(ARMORY
); break;
253 case 30: mkzoo(TENSHALL
); break;
254 case 31: mktraproom(); break;
255 case 32: mkpoolroom(); break;
256 case 33: mkstatueroom(); break;
257 case 34: mkinsideroom(); break;
258 case 35: mkriverroom(); break;
259 case 36: mktemple(); break;
260 case 37: mkzoo(EMPTYNEST
); break;
261 case 38: mkzoo(GRUEROOM
); break;
262 case 39: mkzoo(CRYPTROOM
); break;
263 case 40: mkzoo(TROUBLEZONE
); break;
264 case 41: mkzoo(WEAPONCHAMBER
); break;
265 case 42: mkzoo(HELLPIT
); break;
266 case 43: mkzoo(FEMINISMROOM
); break;
267 case 44: mkzoo(MEADOWROOM
); break;
268 case 45: mkzoo(COOLINGCHAMBER
); break;
269 case 46: mkzoo(VOIDROOM
); break;
270 case 47: mkzoo(HAMLETROOM
); break;
271 case 48: mkzoo(KOPSTATION
); break;
272 case 49: mkbossroom(); break;
273 case 50: mkzoo(RNGCENTER
); break;
274 case 51: mkzoo(WIZARDSDORM
); break;
275 case 52: mkzoo(DOOMEDBARRACKS
); break;
276 case 53: mkzoo(SLEEPINGROOM
); break;
277 case 54: mkzoo(DIVERPARADISE
); break;
278 case 55: mkzoo(MENAGERIE
); break;
281 mknastycentral(); break;
283 else goto retryrandtype
;
284 case 57: mkemptydesert(); break;
285 case 58: mkzoo(RARITYROOM
); break;
286 case 59: mkzoo(EXHIBITROOM
); break;
287 case 60: mkzoo(PRISONCHAMBER
); break;
288 case 61: mkzoo(NUCLEARCHAMBER
); break;
289 case 62: mkzoo(LEVELSEVENTYROOM
); break;
290 case 63: mkzoo(VARIANTROOM
); break;
291 case 64: mkzoo(EVILROOM
); break;
292 case 65: mkzoo(RELIGIONCENTER
); break;
293 case 66: mkchaosroom(); break;
294 case 67: mkzoo(CURSEDMUMMYROOM
); break;
295 case 68: mkmixedpool(); break;
296 case 69: mkzoo(ARDUOUSMOUNTAIN
); break;
297 case 70: mkzoo(LEVELFFROOM
); break;
298 case 71: mkzoo(VERMINROOM
); break;
299 case 72: mkzoo(MIRASPA
); break;
300 case 73: mkzoo(MACHINEROOM
); break;
301 case 74: mkshowerroom(); break;
302 case 75: mkzoo(GREENCROSSROOM
); break;
303 case 76: mkcentraltedium(); break;
304 case 77: mkzoo(RUINEDCHURCH
); break;
305 case 78: mkrampageroom(); break;
306 case 79: mkzoo(GAMECORNER
); break;
307 case 80: mkzoo(ILLUSIONROOM
); break;
308 case 81: mkzoo(ROBBERCAVE
); break;
309 case 82: mkzoo(SANITATIONCENTRAL
); break;
310 case 83: mkzoo(PLAYERCENTRAL
); break;
311 case 84: mkzoo(CASINOROOM
); break;
312 case 85: mkzoo(FULLROOM
); break;
313 case 86: mkzoo(LETTERSALADROOM
); break;
314 case 87: mkzoo(THE_AREA_ROOM
); break;
315 case 88: mkzoo(CHANGINGROOM
); break;
316 case 89: mkzoo(QUESTORROOM
); break;
323 default: impossible("Tried to make a room of type %d.", roomtype
);
330 register struct mkroom
*sroom
;
333 char *ep
= (char *)0; /* (init == lint suppression) */
335 /* first determine shoptype */
338 ep
= nh_getenv("SHOPTYPE");
340 if(*ep
== 'z' || *ep
== 'Z'){
344 if(*ep
== 'm' || *ep
== 'M'){
348 if(*ep
== 'b' || *ep
== 'B'){
352 if (*ep
== 'p' || *ep
== 'P') {
356 if (*ep
== 'i' || *ep
== 'I') {
360 if (*ep
== 'f' || *ep
== 'F') {
364 if(*ep
== 't' || *ep
== 'T' || *ep
== '\\'){
368 if(*ep
== 's' || *ep
== 'S'){
372 if(*ep
== 'a' || *ep
== 'A'){
376 if(*ep
== 'c' || *ep
== 'C'){
380 if(*ep
== 'r' || *ep
== 'R'){
384 if(*ep
== 'l' || *ep
== 'L'){
396 if (*ep
== 'd' || *ep
== 'D') {
401 for(i
=0; shtypes
[i
].name
; i
++)
402 if(*ep
== def_oc_syms
[(int)shtypes
[i
].symb
]) {
404 if (!strcmp(ep
+ 1, shtypes
[i
].name
))
407 if(*ep
== 'g' || *ep
== 'G')
415 for(sroom
= &rooms
[0]; ; sroom
++){
416 if(sroom
->hx
< 0) return;
417 if(sroom
- rooms
>= nroom
) {
418 pline("rooms not closed by -1?");
421 if(sroom
->rtype
!= OROOM
) continue;
422 if(has_dnstairs(sroom
) || has_upstairs(sroom
))
426 (wizard
&& ep
&& sroom
->doorct
!= 0) ||
428 sroom
->doorct
== 1) break;
433 for(x
= sroom
->lx
- 1; x
<= sroom
->hx
+ 1; x
++)
434 for(y
= sroom
->ly
- 1; y
<= sroom
->hy
+ 1; y
++)
439 if(i
< 0) { /* shoptype not yet determined */
440 /* pick a shop type at random */
441 for (j
= rnd(100), i
= 0; (j
-= shtypes
[i
].prob
) > 0; i
++)
444 /* big rooms cannot be wand or book shops,
445 * - so make them general stores
447 /*if(isbig(sroom) && (shtypes[i].symb == WAND_CLASS
448 || shtypes[i].symb == SPBOOK_CLASS)) i = 0;*/
450 sroom
->rtype
= SHOPBASE
+ i
;
452 /* set room bits before stocking the shop */
453 #ifdef SPECIALIZATION
454 topologize(sroom
, FALSE
); /* doesn't matter - this is a special room */
459 /* stock the room with a shopkeeper and artifacts */
460 stock_room(i
, sroom
);
463 STATIC_OVL
struct mkroom
*
465 register boolean strict
;
466 /* pick an unused room, preferably with only one door */
468 register struct mkroom
*sroom
;
469 register int i
= nroom
;
471 for(sroom
= &rooms
[rn2(nroom
)]; i
--; sroom
++) {
472 if(sroom
== &rooms
[nroom
])
475 return (struct mkroom
*)0;
476 if(sroom
->rtype
!= OROOM
) continue;
478 if( (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) || (has_dnstairs(sroom
) && rn2(3)))
480 } else if(has_upstairs(sroom
) || has_dnstairs(sroom
))
482 if(sroom
->doorct
== 1 || (!rn2(5) && !strict
)
484 || (wizard
&& !strict
)
489 return (struct mkroom
*)0;
496 register struct mkroom
*sroom
;
498 /*if (type == BADFOODSHOP) {
499 if ((sroom = pick_room(TRUE)) != 0) {
504 else */if ((sroom
= pick_room(FALSE
)) != 0) {
512 struct mkroom
*sroom
;
515 struct monst
*randomon
;
516 register struct obj
*otmp
;
517 boolean specialzoo
= 0;
518 int specialzoochance
= 50;
519 int specialzootype
= 0;
520 int fullroomitem
= rn1(10, 10);
521 int fullroomtrap
= rn1(20, 8);
523 specialzoo
= 1; /* extra items! */
524 specialzoochance
= 50 + rnd(50);
525 if (!rn2(5)) specialzoochance
/= (1 + rnd(4));
526 if (rn2(5)) specialzootype
= 1 + rnd(16);
531 if (iszapem
&& In_ZAPM(&u
.uz
) && !(u
.zapemescape
)) {
535 zapemlevel
.dnum
= dname_to_dnum("Space Base");
536 zapemlevel
.dlevel
= dungeons
[zapemlevel
.dnum
].entry_lev
;
537 zapemdepth
= depth(&zapemlevel
);
539 depthuz
= (1 + depth(&u
.uz
) - zapemdepth
);
540 if (depthuz
< 1) depthuz
= 1; /* fail safe */
542 } else if (u
.preversionmode
&& !u
.preversionescape
&& In_greencross(&u
.uz
)) {
546 preverlevel
.dnum
= dname_to_dnum("Green Cross");
547 preverlevel
.dlevel
= dungeons
[preverlevel
.dnum
].entry_lev
;
548 preverdepth
= depth(&preverlevel
);
550 depthuz
= (1 + depth(&u
.uz
) - preverdepth
);
551 if (depthuz
< 1) depthuz
= 1; /* fail safe */
554 depthuz
= depth(&u
.uz
);
557 boolean aggravatemonsteron
= FALSE
;
558 boolean uglynastyhack
= FALSE
;
560 int sleepchance
= 10;
561 if (!rn2(10)) sleepchance
-= rnd(10);
563 register int sx
,sy
,i
;
564 int sh
, tx
, ty
, goldlim
, type
= sroom
->rtype
;
565 int rmno
= (sroom
- rooms
) + ROOMOFFSET
;
572 tx
= ty
= goldlim
= 0;
579 if(level
.flags
.is_maze_lev
) {
580 for(tx
= sroom
->lx
; tx
<= sroom
->hx
; tx
++)
581 for(ty
= sroom
->ly
; ty
<= sroom
->hy
; ty
++)
582 if(IS_THRONE(levl
[tx
][ty
].typ
))
587 do { /* don't place throne on top of stairs */
588 (void) somexy(sroom
, &mm
);
589 tx
= mm
.x
; ty
= mm
.y
;
590 } while (occupied((xchar
)tx
, (xchar
)ty
) && --i
> 0);
592 /* TODO: try to ensure the enthroned monster is an M2_PRINCE */
596 case CURSEDMUMMYROOM
:
601 tx
= sroom
->lx
+ (sroom
->hx
- sroom
->lx
+ 1)/2;
602 ty
= sroom
->ly
+ (sroom
->hy
- sroom
->ly
+ 1)/2;
603 if(sroom
->irregular
) {
604 /* center might not be valid, so put queen elsewhere */
605 if ((int) levl
[tx
][ty
].roomno
!= rmno
||
607 (void) somexy(sroom
, &mm
);
608 tx
= mm
.x
; ty
= mm
.y
;
615 goldlim
= 500 * level_difficulty();
632 u
.specialtensionmonster
= 341; break;
634 u
.specialtensionmonster
= 324; break;
636 u
.specialtensionmonster
= 325; break;
638 u
.specialtensionmonster
= 326; break;
640 u
.specialtensionmonster
= 330; break;
642 /* evil variant, angband, animeband, steamband or dnethack */
648 u
.specialtensionmonster
= 426; break;
650 u
.specialtensionmonster
= 427; break;
652 u
.specialtensionmonster
= 361; break;
654 u
.specialtensionmonster
= 322; break;
656 u
.specialtensionmonster
= 323; break;
658 u
.specialtensionmonster
= 327; break;
660 u
.specialtensionmonster
= 328; break;
662 u
.specialtensionmonster
= 434; break;
664 /* aoe, elderscrolls, elona, cow, joke, diablo, dlords or cdda */
668 u
.tensionmonster
= (rn2(187) + 1);
669 u
.tensionmonsteX
= (rn2(100) + 1);
670 u
.tensionmonsterB
= 0;
671 u
.tensionmonsterspec
= 0;
672 u
.tensionmonsterspecB
= 0;
675 u
.specialtensionmonster
= 0;
676 u
.specialtensionmonsterB
= 0;
677 if (!rn2(8)) {u
.colormonster
= rnd(15);
678 if (!rn2(4)) u
.colormonsterB
= rnd(15);
681 if (!rn2(4)) u
.tensionmonsterB
= (rn2(187) + 1);
682 if (!rn2(10)) {u
.tensionmonsterspec
= rndmonst();
683 if (!rn2(4)) u
.tensionmonsterspecB
= rndmonst();
685 if (!rn2(10)) {u
.specialtensionmonster
= rnd(434); /* monstercolor function! */
686 if (!rn2(4)) u
.specialtensionmonsterB
= rnd(434);
690 goldlim
= 1500 * level_difficulty();
695 if (rn2(10)) moreorless
-= 10;
696 if (rn2(10)) moreorless
-= rnd(20);
698 moreorless
-= rnd(30);
699 if (!rn2(5)) moreorless
-= rnd(40);
701 if (moreorless
< 10) moreorless
= 10;
703 /* armories don't contain as many monsters; also, some other rooms and settings change the values */
705 if (ishaxor
&& rn2(2)) moreorless
= 100;
706 if (type
== VOIDROOM
) {
707 if (rn2(2)) moreorless
/= 2;
708 else moreorless
/= 3;
710 if (type
== ARMORY
) moreorless
/= 2;
711 if (type
== ROBBERCAVE
) moreorless
/= 2;
712 if (type
== CASINOROOM
) moreorless
/= 10;
713 if (type
== DIVERPARADISE
) moreorless
/= 5;
714 if (type
== SANITATIONCENTRAL
) moreorless
/= 3;
715 if (type
== LEVELFFROOM
) moreorless
/= 3;
716 if (type
== MACHINEROOM
) moreorless
/= 3;
717 if (type
== ARDUOUSMOUNTAIN
) moreorless
/= 5;
718 if (type
== RUINEDCHURCH
) moreorless
/= 5;
719 if (type
== GREENCROSSROOM
) moreorless
/= 10;
720 if (type
== MIRASPA
) moreorless
/= 5;
721 if (type
== FULLROOM
) moreorless
/= 5;
722 if (type
== PLAYERCENTRAL
) moreorless
/= 5;
723 if (type
== LEVELSEVENTYROOM
) moreorless
/= 2;
724 if (type
== NUCLEARCHAMBER
) moreorless
/= 2;
725 if (type
== HAMLETROOM
&& moreorless
> 5) moreorless
= 5;
726 if (issuxxor
) moreorless
/= 2;
727 moreorless
/= rnd(5); /* generally tone it down --Amy */
729 if (type
== LETTERSALADROOM
&& moreorless
< 75) moreorless
= 75; /* supposed to always be close to maxxed --Amy */
731 if (RngeKillerFilling
&& moreorless
< 100) moreorless
= 100;
732 if (iskillfiller
&& moreorless
< 100) moreorless
= 100;
734 if (moreorless
< 1) moreorless
= 1;
735 if (moreorless
> 100) moreorless
= 100;
737 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
738 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
740 /* evil patch idea by Amy: 2% chance that special rooms are populated with much higher-leveled monsters */
741 if (!rn2(50) || (type
== VOIDROOM
) ) {
743 reset_rndmonst(NON_PM
);
744 aggravatemonsteron
= TRUE
;
747 if (type
== VOIDROOM
) {
748 u
.heavyaggravation
= 1;
751 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
752 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
753 if(sroom
->irregular
) {
754 if ((int) levl
[sx
][sy
].roomno
!= rmno
||
755 (levl
[sx
][sy
].edge
) /*||
757 distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1)*/)
759 } else if(!u
.roommatehack
&& !SPACE_POS(levl
[sx
][sy
].typ
) /*||
761 ((sx == sroom->lx && doors[sh].x == sx-1) ||
762 (sx == sroom->hx && doors[sh].x == sx+1) ||
763 (sy == sroom->ly && doors[sh].y == sy-1) ||
764 (sy == sroom->hy && doors[sh].y == sy+1)))*/)
766 /* don't place monster on explicitly placed throne */
767 if(type
== COURT
&& IS_THRONE(levl
[sx
][sy
].typ
))
770 if (type
== CURSEDMUMMYROOM
) { /* ugly hack to make the lich into an OOD monster but not the remaining stuff */
771 if (sx
== tx
&& sy
== ty
) {
773 u
.heavyaggravation
= 1;
775 DifficultyIncreased
+= 1;
776 HighlevelStatus
+= 1;
777 reset_rndmonst(NON_PM
);
778 } else if (!aggravatemonsteron
) {
780 u
.heavyaggravation
= 0;
781 } else u
.heavyaggravation
= 0;
783 if (!(sx
== tx
&& sy
== ty
) && uglynastyhack
) {
784 uglynastyhack
= FALSE
;
785 if (DifficultyIncreased
> 0) DifficultyIncreased
-= 1;
786 if (HighlevelStatus
> 0) HighlevelStatus
-= 1;
790 if ( ((rnd(100) <= moreorless
) || (rn2(5) && sx
== tx
&& sy
== ty
)) && (type
!= EMPTYNEST
) ) mon
= makemon(
791 (type
== COURT
) ? (rn2(5) ? courtmon() : mkclass(S_ORC
,0) ) :
793 (type
== INSIDEROOM
) ? (rn2(Role_if(PM_CAMPERSTRIKER
) ? 20 : 40) ? insidemon() : (struct permonst
*) 0 ) :
795 (type
== BARRACKS
) ? squadmon() :
796 (type
== DOOMEDBARRACKS
) ? doomsquadmon() :
797 (type
== LETTERSALADROOM
) ? lettersaladmon() :
798 (type
== CHANGINGROOM
) ? (rn2(8) ? specialtensmon(332) : rn2(2) ? specialtensmon(385) : specialtensmon(386) ) : /* MS_SHOE, MS_SOCKS, MS_PANTS */
799 (type
== QUESTORROOM
) ? (rn2(3) ? specialtensmon(409) : specialtensmon(408) ) : /* MS_GAARDIEN, MS_LIEDER */
800 (type
== THE_AREA_ROOM
) ? theareamon() :
801 (type
== EVILROOM
) ? evilroommon() :
802 (type
== RUINEDCHURCH
) ? mkclass(S_GHOST
,0) :
803 (type
== GREENCROSSROOM
) ? (rn2(5) ? mkclass(S_HUMAN
,0) : specialtensmon(332) /* MS_SHOE */ ) :
804 (type
== MACHINEROOM
) ? machineroommon() :
805 (type
== MIRASPA
) ? (!rn2(4) ? specialtensmon(49) /* MR_ACID */ : !rn2(3) ? specialtensmon(200) /* AD_ACID */ : !rn2(2) ? specialtensmon(88) /* M1_ACID */ : specialtensmon(235) /* AD_CORR */ ) :
806 (type
== VERMINROOM
) ? (!rn2(3) ? mkclass(S_RODENT
,0) : !rn2(2) ? mkclass(S_SNAKE
,0) : mkclass(S_WORM
,0) ) :
807 (type
== LEVELFFROOM
) ? (!rn2(100) ? &mons
[PM_SHOPKEEPER
] : specialtensmon(323) /* M5_JOKE */ ) :
808 (type
== ARDUOUSMOUNTAIN
) ? (rn2(2) ? specialtensmon(156) /* UNCOMMON10 */ : rn2(2) ? specialtensmon(155) /* UNCOMMON7 */ : rn2(2) ? specialtensmon(154) /* UNCOMMON5 */ : rn2(2) ? specialtensmon(153) /* UNCOMMON3 */ : specialtensmon(152) /* UNCOMMON2 */ ) :
809 (type
== CURSEDMUMMYROOM
) ? (sx
== tx
&& sy
== ty
? mkclass(S_LICH
,0) : mkclass(S_MUMMY
,0) ) :
810 (type
== RELIGIONCENTER
) ? (rn2(5) ? specialtensmon(347) /* MS_CONVERT */ : specialtensmon(348) /* MS_ALIEN */ ) :
811 (type
== CLINIC
) ? specialtensmon(218) /* AD_HEAL */ :
812 (type
== TERRORHALL
) ? mkclass(S_UMBER
,0) :
813 (type
== CASINOROOM
) ? ( ((level_difficulty() + u
.pompejipermanentrecord
) > 100) ? &mons
[PM_ELITE_CROUPIER
] : ((level_difficulty() + u
.pompejipermanentrecord
) > 80) ? &mons
[PM_EXCEPTIONAL_CROUPIER
] : ((level_difficulty() + u
.pompejipermanentrecord
) > 60) ? &mons
[PM_MASTER_CROUPIER
] : ((level_difficulty() + u
.pompejipermanentrecord
) > 40) ? &mons
[PM_EXPERIENCED_CROUPIER
] : &mons
[PM_CROUPIER
] ) :
814 (type
== ROBBERCAVE
) ? (!rn2(20) ? specialtensmon(286) /* AD_SAMU */ : !rn2(4) ? specialtensmon(357) /* AD_THIE */ : !rn2(3) ? specialtensmon(212) /* AD_SITM */ : !rn2(2) ? specialtensmon(213) /* AD_SEDU */ : specialtensmon(211) /* AD_SGLD */ ) :
815 (type
== SANITATIONCENTRAL
) ? specialtensmon(363) /* AD_SANI */ :
816 (type
== VARIANTROOM
) ? specialtensmon(u
.specialtensionmonster
) :
817 (type
== ILLUSIONROOM
) ? illusionmon() :
818 (type
== GAMECORNER
) ? specialtensmon(u
.specialtensionmonster
) :
819 (type
== TENSHALL
) ? (u
.specialtensionmonsterB
? (rn2(2) ? specialtensmon(u
.specialtensionmonsterB
) : specialtensmon(u
.specialtensionmonster
) ) : u
.specialtensionmonster
? specialtensmon(u
.specialtensionmonster
) : u
.tensionmonsterspecB
? (rn2(2) ? u
.tensionmonsterspecB
: u
.tensionmonsterspec
) : u
.tensionmonsterspec
? u
.tensionmonsterspec
: u
.colormonsterB
? (rn2(2) ? colormon(u
.colormonsterB
) : colormon(u
.colormonster
) ) : u
.colormonster
? colormon(u
.colormonster
) : u
.tensionmonsterB
? (rn2(2) ? tenshallmon() : tenshallmonB() ) : tenshallmon()) :
820 (type
== ELEMHALL
) ? mkclass(S_ELEMENTAL
,0) :
821 (type
== ANGELHALL
) ? mkclass(S_ANGEL
,0) :
822 (type
== FEMINISMROOM
) ? (!rn2(50) ? specialtensmon(369) /* AD_FEMI */ : !rn2(20) ? specialtensmon(333) /* MS_STENCH */ : !rn2(3) ? specialtensmon(38) : !rn2(2) ? specialtensmon(39) : specialtensmon(40) ) /* MS_FART_foo */ :
823 (type
== MIMICHALL
) ? mkclass(S_MIMIC
,0) :
824 (type
== MEADOWROOM
) ? (!rn2(10) ? mkclass(S_NYMPH
,0) : !rn2(3) ? mkclass(S_ANT
,0) : !rn2(2) ? mkclass(S_QUADRUPED
,0) : mkclass(S_XAN
,0)) :
825 (type
== SLEEPINGROOM
) ? (!rn2(10) ? mkclass(S_OGRE
,0) : !rn2(3) ? mkclass(S_KOBOLD
,0) : !rn2(2) ? mkclass(S_RODENT
,0) : mkclass(S_ORC
,0)) :
826 (type
== HELLPIT
) ? (!rn2(10) ? mkclass(S_ARCHFIEND
,0) : (rnd(9) > 2) ? mkclass(S_DEMON
,0) : specialtensmon(109) /* M2_DEMON */ ) :
827 (type
== MENAGERIE
) ? (!rn2(8) ? mkclass(S_DOG
,0) : !rn2(7) ? mkclass(S_FELINE
,0) : !rn2(6) ? mkclass(S_RODENT
,0) : !rn2(5) ? mkclass(S_UNICORN
,0) : !rn2(4) ? mkclass(S_ZOUTHERN
,0) : !rn2(3) ? mkclass(S_BAT
,0) : !rn2(2) ? mkclass(S_SNAKE
,0) : mkclass(S_YETI
,0)) :
828 (type
== EXHIBITROOM
) ? (!rn2(7) ? mkclass(S_EYE
,0) : !rn2(6) ? mkclass(S_GREMLIN
,0) : !rn2(5) ? mkclass(S_PIERCER
,0) : !rn2(4) ? mkclass(S_TRAPPER
,0) : !rn2(3) ? mkclass(S_WORM
,0) : !rn2(2) ? mkclass(S_LIGHT
,0) : mkclass(S_NAGA
,0)) :
829 (type
== RARITYROOM
) ? (!rn2(5) ? mkclass(S_QUANTMECH
,0) : !rn2(4) ? mkclass(S_JABBERWOCK
,0) : !rn2(3) ? mkclass(S_RUBMONST
,0) : !rn2(2) ? mkclass(S_XORN
,0) : mkclass(S_WALLMONST
,0)) :
830 (type
== NYMPHHALL
) ? mkclass(S_NYMPH
,0) :
831 (type
== DIVERPARADISE
) ? mkclass(S_EEL
,0) :
832 (type
== WEAPONCHAMBER
) ? specialtensmon(190) /* AT_WEAP */ :
833 (type
== TROUBLEZONE
) ? (!rn2(10) ? mkclass(S_KOP
,0) : !rn2(4) ? mkclass(S_TROLL
,0) : !rn2(3) ? mkclass(S_UMBER
,0) : !rn2(2) ? mkclass(S_DEMON
,0) : mkclass(S_VORTEX
,0)) :
834 (type
== TROLLHALL
) ? mkclass(S_TROLL
,0) :
835 (type
== SPIDERHALL
) ? mkclass(S_SPIDER
,0) :
836 (type
== COOLINGCHAMBER
) ? (!rn2(3) ? specialtensmon(195) : !rn2(2) ? specialtensmon(243) : specialtensmon(299) ) /* AD_COLD, AD_FRZE and AD_ICEB */ :
837 (type
== HUMANHALL
) ? mkclass(S_HUMAN
,0) :
838 (type
== VOIDROOM
) ? mkclass(S_GHOST
,0) :
839 (type
== WIZARDSDORM
) ? (!rn2(4) ? mkclass(S_DRAGON
,0) : !rn2(3) ? specialtensmon(180) : !rn2(2) ? specialtensmon(236) : specialtensmon(313)) /* AT_SPIT, AD_TCKL, AD_CAST */ :
840 (type
== KOPSTATION
) ? mkclass(S_KOP
,0) :
841 (type
== RNGCENTER
) ? (!rn2(2) ? specialtensmon(312) : specialtensmon(331) ) /* AD_RNG, M5_RANDOMIZED */ :
842 (type
== HAMLETROOM
) ? mkclass(S_GIANT
,0) :
843 (type
== GOLEMHALL
) ? mkclass(S_GOLEM
,0) :
844 (type
== CRYPTROOM
) ? specialtensmon(95) /* M2_UNDEAD */ :
845 (type
== NUCLEARCHAMBER
) ? specialtensmon(337) /* AD_CONT */ :
846 (type
== LEVELSEVENTYROOM
) ? ((struct permonst
*) 0) /* any random monster */ :
847 (type
== PLAYERCENTRAL
) ? (&mons
[PM_ARCHEOLOGIST
+ rn2(PM_WIZARD
- PM_ARCHEOLOGIST
+ 1)]) :
848 (type
== COINHALL
) ? mkclass(S_BAD_COINS
,0) :
849 (type
== GRUEROOM
) ? mkclass(S_GRUE
,0) :
850 (type
== MORGUE
) ? morguemon() :
851 (type
== FUNGUSFARM
) ? (!rn2(4) ? mkclass(S_BLOB
,0) : !rn2(3) ? mkclass(S_PUDDING
,0) : !rn2(2) ? mkclass(S_JELLY
,0) : mkclass(S_FUNGUS
,0)) :
852 (type
== BEEHIVE
) ? (sx
== tx
&& sy
== ty
? (((depthuz
< 5) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (3 + rn2(3)))) ? &mons
[PM_BIG_BEE
] : &mons
[PM_QUEEN_BEE
]) : beehivemon()) :
853 (type
== PRISONCHAMBER
) ? (sx
== tx
&& sy
== ty
? prisonermon() : mkclass(S_OGRE
,0) ) :
854 (type
== DOUGROOM
) ? douglas_adams_mon() :
855 (type
== LEPREHALL
) ? mkclass(S_LEPRECHAUN
,0) :
856 (type
== COCKNEST
) ? mkclass(S_COCKATRICE
,0) :
857 (type
== ARMORY
) ? (rn2(10) ? mkclass(S_RUSTMONST
,0) : mkclass(S_PUDDING
,0) ) :
858 (type
== ANTHOLE
) ? mkclass(S_ANT
,0) :
859 (type
== DRAGONLAIR
) ? mkclass(S_DRAGON
,0) :
861 (!rn2(20) ? &mons
[PM_HORNED_DEVIL
] : !rn2(20) ? mkclass(S_DEMON
,0) : !rn2(50) ? &mons
[ndemon(A_NONE
)] : rn2(2) ? mkclass(S_IMP
,0) : &mons
[PM_LEMURE
]) :
862 (type
== MIGOHIVE
) ? (sx
== tx
&& sy
== ty
? (((depthuz
< 10) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (5 + rn2(5)))) ? &mons
[PM_SUDO_MIGO
] : &mons
[PM_MIGO_QUEEN
]) : migohivemon()) :
863 (type
== BADFOODSHOP
) ? mkclass(S_BAD_FOOD
,0) :
864 (type
== REALZOO
) ? (rn2(3) ? realzoomon() : rn2(3) ? mkclass(S_QUADRUPED
,0) : rn2(3) ? mkclass(S_FELINE
,0) : rn2(3) ? mkclass(S_YETI
,0) : mkclass(S_SNAKE
,0) ) :
865 (type
== GIANTCOURT
) ? mkclass(S_GIANT
,0) :
866 (struct permonst
*) 0,
867 sx
, sy
, /*NO_MM_FLAGS*/MM_ADJACENTOK
);
868 else mon
= ((struct monst
*)0);
869 /* some rooms can spawn new monster variants now --Amy */
871 if ((sleepchance
> 1) && !(In_netherrealm(&u
.uz
)) && !issoviet
&& !(uarmf
&& uarmf
->oartifact
== ART_VERY_NICE_PERSON
) && rn2(sleepchance
)) mon
->msleeping
= 1; /* random chance of them not being asleep --Amy */
872 /* In Soviet Russia, monsters are always awake harharharharhar harharhar harhar! --Amy */
874 /* enemies in these rooms will almost always be hostile now --Amy */
875 if (mon
->mpeaceful
&& type
!= CASINOROOM
&& rn2(20)) {
880 /* green cross rooms are supposed to be very peaceful if you behave well --Amy */
881 if (type
== GREENCROSSROOM
&& (rnd(20) < u
.ualign
.record
)) {
886 if (mon
->mnum
== PM_SHOPKEEPER
) {
887 mon
->mfrenzied
= FALSE
;
891 if (type
== CASINOROOM
) { /* croupiers are meant to be awake and non-hostile --Amy */
892 mon
->mfrenzied
= FALSE
;
894 mon
->msleeping
= FALSE
;
901 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
902 levl
[sx
][sy
].typ
= CRYPTFLOOR
;
907 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
908 levl
[sx
][sy
].typ
= rn2(3) ? PAVEDFLOOR
: GRASSLAND
;
913 if (!rn2(fullroomitem
)) {
914 (void) mkobj_at(0, sx
, sy
, TRUE
, FALSE
);
916 if (!rn2(fullroomtrap
)) {
917 makerandomtrap_at(sx
, sy
, TRUE
);
923 (void) mkobj_at(0, sx
, sy
, FALSE
, FALSE
);
926 if (!rn2(20) || (sx
== tx
&& sy
== ty
) ) {
928 if (!ISSTAIRORLADDER(levl
[sx
][sy
].typ
) ) {
931 levl
[sx
][sy
].typ
= FOUNTAIN
; break;
933 levl
[sx
][sy
].typ
= SINK
; break;
935 levl
[sx
][sy
].typ
= TOILET
; break;
937 levl
[sx
][sy
].typ
= GRAVE
; break;
939 levl
[sx
][sy
].typ
= WELL
; break;
941 levl
[sx
][sy
].typ
= WAGON
; break;
943 levl
[sx
][sy
].typ
= WOODENTABLE
; break;
945 levl
[sx
][sy
].typ
= STRAWMATTRESS
; break;
950 if (sx
== tx
&& sy
== ty
) {
954 objtyp
= rn2(NUM_OBJECTS
);
955 if (objects
[objtyp
].oc_prob
< 1) {
957 if (tryct
< 50000) goto newqsttry
;
958 else goto qstfinished
;
961 if (!(objects
[objtyp
].oc_class
== WEAPON_CLASS
|| is_weptoolbase(objtyp
) || is_blindfoldbase(objtyp
) || objects
[objtyp
].oc_class
== RING_CLASS
|| objects
[objtyp
].oc_class
== AMULET_CLASS
|| objects
[objtyp
].oc_class
== IMPLANT_CLASS
|| objects
[objtyp
].oc_class
== ARMOR_CLASS
) ) {
963 if (tryct
< 50000) goto newqsttry
;
964 else goto qstfinished
;
967 (void) mksobj_at(objtyp
, sx
, sy
, TRUE
, FALSE
, FALSE
);
975 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
976 levl
[sx
][sy
].typ
= URINELAKE
;
981 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(4)) {
982 levl
[sx
][sy
].typ
= !rn2(3) ? TUNNELWALL
: !rn2(2) ? STALACTITE
: CRYSTALWATER
;
987 if (!rn2(100)) { /* can be any random pair of boots, even rare ones, so there shouldn't be many --Amy */
991 objtyp
= rn2(NUM_OBJECTS
);
992 if (objects
[objtyp
].oc_prob
< 1) {
994 if (tryct
< 50000) goto newcgrtry
;
995 else goto cgrfinished
;
998 if (objects
[objtyp
].oc_class
!= ARMOR_CLASS
|| objects
[objtyp
].oc_armcat
!= ARM_BOOTS
) {
1000 if (tryct
< 50000) goto newcgrtry
;
1001 else goto cgrfinished
;
1004 (void) mksobj_at(objtyp
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1014 if (sx
== tx
&& sy
== ty
) {
1015 if (!ISSTAIRORLADDER(levl
[sx
][sy
].typ
) ) {
1018 levl
[sx
][sy
].typ
= PENTAGRAM
; break;
1020 levl
[sx
][sy
].typ
= FOUNTAIN
; break;
1022 levl
[sx
][sy
].typ
= THRONE
; break;
1024 levl
[sx
][sy
].typ
= ALTAR
; break;
1025 levl
[sx
][sy
].altarmask
= Align2amask( A_NONE
);
1027 register struct obj
*altarwater
;
1028 altarwater
= mksobj_at(POT_WATER
, sx
, sy
, FALSE
, FALSE
, FALSE
);
1031 if (!rn2(5)) curse(altarwater
);
1032 else bless(altarwater
);
1040 case ARDUOUSMOUNTAIN
:
1041 if(levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) {
1043 if (rn2(2)) levl
[sx
][sy
].typ
= MOUNTAIN
;
1044 else if (!rn2(5)) levl
[sx
][sy
].typ
= TUNNELWALL
;
1050 if(levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) {
1052 if (!rn2(5)) levl
[sx
][sy
].typ
= ROCKWALL
;
1055 if(!rn2(25) && !t_at(sx
, sy
)) {
1056 (void) maketrap(sx
, sy
, MONSTER_CUBE
, 100, FALSE
);
1063 if(levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) {
1065 if (!rn2(10) || (sx
== tx
&& sy
== ty
)) levl
[sx
][sy
].typ
= WOODENTABLE
;
1068 if (sx
== tx
&& sy
== ty
) {
1069 register struct monst
*croupier
;
1070 croupier
= makemon(level_difficulty() > 100 ? &mons
[PM_ELITE_CROUPIER
] : level_difficulty() > 80 ? &mons
[PM_EXCEPTIONAL_CROUPIER
] : level_difficulty() > 60 ? &mons
[PM_MASTER_CROUPIER
] : level_difficulty() > 40 ? &mons
[PM_EXPERIENCED_CROUPIER
] : &mons
[PM_CROUPIER
], sx
, sy
, MM_ADJACENTOK
);
1072 croupier
->mfrenzied
= FALSE
;
1073 croupier
->mpeaceful
= 1;
1074 croupier
->msleeping
= FALSE
;
1080 case SANITATIONCENTRAL
:
1082 if(levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) {
1084 if (!rn2(5)) levl
[sx
][sy
].typ
= ROCKWALL
;
1090 if(levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) {
1092 if (rn2(2)) levl
[sx
][sy
].typ
= FARMLAND
;
1093 else if (!rn2(3)) levl
[sx
][sy
].typ
= HIGHWAY
;
1094 else if (!rn2(4)) levl
[sx
][sy
].typ
= GRASSLAND
;
1098 case COOLINGCHAMBER
:
1099 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
1100 levl
[sx
][sy
].typ
= rn2(2) ? SNOW
: ICE
;
1103 (void) mksobj_at(ICE_BOX
,sx
,sy
,TRUE
,FALSE
, FALSE
);
1107 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
1108 levl
[sx
][sy
].typ
= NETHERMIST
;
1110 if(!rn2(4) && !t_at(sx
, sy
))
1111 (void) maketrap(sx
, sy
, GIANT_CHASM
, 100, TRUE
);
1115 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !rn2(5)) {
1116 levl
[sx
][sy
].typ
= randomwalltype();
1121 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(3)) {
1122 levl
[sx
][sy
].typ
= rn2(4) ? WATERTUNNEL
: MOAT
;
1124 if (!rn2(5)) (void) mkobj_at(RANDOM_CLASS
, sx
, sy
, FALSE
, FALSE
);
1128 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !rn2(4)) {
1129 levl
[sx
][sy
].typ
= rn2(2) ? WOODENTABLE
: CARVEDBED
;
1133 (void) mksobj_at(CHARGER
,sx
,sy
,TRUE
,FALSE
, FALSE
);
1138 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !rn2(3)) {
1139 levl
[sx
][sy
].typ
= STRAWMATTRESS
;
1143 case LEVELSEVENTYROOM
:
1144 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
1145 levl
[sx
][sy
].typ
= GRAVEWALL
;
1149 case NUCLEARCHAMBER
:
1150 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(2)) {
1151 levl
[sx
][sy
].typ
= STYXRIVER
;
1153 if(!rn2(5) && !t_at(sx
, sy
))
1154 (void) maketrap(sx
, sy
, CONTAMINATION_TRAP
, 100, TRUE
);
1157 (void) mksobj_at(rn2(10) ? CHARGER
: SYMBIOTE
,sx
,sy
,TRUE
,FALSE
, FALSE
);
1162 if (sx
== tx
&& sy
== ty
&& !ISSTAIRORLADDER(levl
[sx
][sy
].typ
) ) {
1163 levl
[sx
][sy
].typ
= ALTAR
;
1164 levl
[sx
][sy
].altarmask
= Align2amask( A_NONE
);
1167 register struct obj
*altarwater
;
1168 altarwater
= mksobj_at(POT_WATER
, sx
, sy
, FALSE
, FALSE
, FALSE
);
1170 if (!rn2(5)) curse(altarwater
);
1171 else bless(altarwater
);
1178 if(!rn2(25) && !t_at(sx
, sy
))
1179 (void) maketrap(sx
, sy
, KOP_CUBE
, 100, FALSE
);
1183 if(!rn2(5) && !t_at(sx
, sy
))
1184 (void) maketrap(sx
, sy
, BOSS_SPAWNER
, 100, FALSE
);
1188 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
1189 levl
[sx
][sy
].typ
= rn2(10) ? GRASSLAND
: !rn2(4) ? BURNINGWAGON
: !rn2(3) ? WELL
: rn2(2) ? POISONEDWELL
: WAGON
;
1191 if(!rn2(5) && !t_at(sx
, sy
)) {
1192 if (rn2(10)) (void) maketrap(sx
, sy
, STATUE_TRAP
, 100, TRUE
);
1193 else if (rn2(20)) (void) maketrap(sx
, sy
, MONSTER_CUBE
, 100, FALSE
);
1194 else (void) maketrap(sx
, sy
, WARP_ZONE
, 100, TRUE
);
1199 if(rn2(5) && (levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
)) {
1200 levl
[sx
][sy
].typ
= GRASSLAND
;
1203 (void) mkobj_at(FOOD_CLASS
, sx
, sy
, FALSE
, FALSE
);
1206 (void) mksobj_at(MEADOWFOAM
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1211 if(!rn2(2) && (levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
)) {
1212 levl
[sx
][sy
].typ
= LAVAPOOL
;
1214 if (!rn2(10) && levl
[sx
][sy
].typ
!= LAVAPOOL
) {
1215 makemon(&mons
[rn2(2) ? PM_SPIDDAL_STICK
: PM_HARRADA
], sx
, sy
, MM_ADJACENTOK
);
1218 if (!rn2(10) && !(t_at(sx
,sy
))) {
1219 (void) maketrap(sx
, sy
, FIRE_TRAP
, 100, TRUE
);
1225 if (specialzoochance
> rnd(100)) {
1226 (void) mkobj_at(specialzootype
, sx
, sy
, TRUE
, FALSE
);
1234 int distval
= dist2(sx
,sy
,doors
[sh
].x
,doors
[sh
].y
);
1239 if(i
>= goldlim
) i
= 5*level_difficulty();
1241 if (rn2(4)) (void) mkgold(1, sx
, sy
); /* don't spawn endless amounts of gold --Amy */
1242 else (void) mkgold((long) rn1(i
, 10), sx
, sy
);
1244 if((type
== LEPREHALL
) && !rn2(ishaxor
? 50 : 100))
1245 (void) mksobj_at(BLACK_HENBANE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1251 if(!rn2(ishaxor
? 20 : 40))
1252 (void) mksobj_at(BLACK_HENBANE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1258 (void) mk_tt_object(CORPSE
, sx
, sy
);
1259 if(!rn2(50) && (level_difficulty() > 10+rnd(200) )) { /* real player ghosts --Amy */
1263 (void) tt_mname(&mmm
, FALSE
, 0);
1265 if(ishaxor
&& !rn2(50) && (level_difficulty() > 10+rnd(200) )) { /* real player ghosts --Amy */
1269 (void) tt_mname(&mmm
, FALSE
, 0);
1271 if(!rn2(ishaxor
? 10 : 20)) /* lots of treasure buried with dead */
1272 (void) mksobj_at((rn2(3)) ? LARGE_BOX
: CHEST
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1274 make_grave(sx
, sy
, (char *)0);
1276 if (!rn2(5)) (void) mkgold(0L, sx
, sy
);
1277 for (gravetries
= rn2(2 + rn2(4)); gravetries
; gravetries
--) {
1278 if (timebasedlowerchance()) {
1279 otmp
= mkobj(rn2(3) ? COIN_CLASS
: RANDOM_CLASS
, TRUE
, FALSE
);
1284 add_to_buried(otmp
);
1291 if(!rn2(12)) /* slightly lowered chance --Amy */
1292 (void) mksobj_at(rn2(30) ? LUMP_OF_ROYAL_JELLY
: HONEYCOMB
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1295 if (!rn2(25)) /* lowered chance --Amy */
1296 (void) mksobj_at(SLIME_MOLD
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1298 (void) mksobj_at(SYMBIOTE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1301 switch (rn2(100)) { /* greatly lowered chance --Amy */
1303 mksobj_at(DIAMOND
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1306 mksobj_at(RUBY
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1310 mksobj_at(AGATE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1314 mksobj_at(FLUORITE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1321 if(!rn2(ishaxor
? 25 : 50)) /* the payroll and some loot */
1322 (void) mksobj_at((rn2(3)) ? LARGE_BOX
: CHEST
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1324 make_grave(sx
, sy
, (char *)0);
1326 if (!rn2(5)) (void) mkgold(0L, sx
, sy
);
1327 for (gravetries
= rn2(2 + rn2(4)); gravetries
; gravetries
--) {
1328 if (timebasedlowerchance()) {
1329 otmp
= mkobj(rn2(3) ? COIN_CLASS
: RANDOM_CLASS
, TRUE
, FALSE
);
1334 add_to_buried(otmp
);
1343 (void) mksobj_at(ICE_BOX
,sx
,sy
,TRUE
,FALSE
, FALSE
);
1345 (void) mksobj_at(SYMBIOTE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1348 if(!rn2(ishaxor
? 10 : 20))
1349 (void) mkobj_at(CHAIN_CLASS
, sx
, sy
, FALSE
, FALSE
);
1353 (void) mksobj_at(EGG
,sx
,sy
,TRUE
,FALSE
, FALSE
);
1356 (void) mksobj_at(EGG
,sx
,sy
,TRUE
,FALSE
, FALSE
);
1360 struct obj
*sobj
= mk_tt_object(STATUE
, sx
, sy
);
1363 for (i
= rn2(5); i
; i
--)
1364 if (timebasedlowerchance()) {
1365 (void) add_to_container(sobj
, mkobj(RANDOM_CLASS
, FALSE
, FALSE
), TRUE
);
1367 sobj
->owt
= weight(sobj
);
1374 if (!rn2(5)) { /* sorry Patrick, but the quantity of those items needs to be lower. --Amy */
1376 otmp
= mkobj_at(WEAPON_CLASS
, sx
, sy
, FALSE
, FALSE
);
1378 otmp
= mkobj_at(ARMOR_CLASS
, sx
, sy
, FALSE
, FALSE
);
1380 if (is_rustprone(otmp
)) otmp
->oeroded
= rn2(4);
1381 else if (is_rottable(otmp
)) otmp
->oeroded2
= rn2(4);
1390 (void) mkobj_at(WEAPON_CLASS
, sx
, sy
, FALSE
, FALSE
);
1392 (void) mkobj_at(ARMOR_CLASS
, sx
, sy
, FALSE
, FALSE
);
1398 (void) mkobj_at(FOOD_CLASS
, sx
, sy
, FALSE
, FALSE
);
1402 (void) mkobj_at(GEM_CLASS
, sx
, sy
, FALSE
, FALSE
);
1405 case CURSEDMUMMYROOM
:
1407 (void) mksobj_at(STATUE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
1409 if(!rn2(10) && !t_at(sx
, sy
))
1410 (void) maketrap(sx
, sy
, rn2(50) ? STATUE_TRAP
: SATATUE_TRAP
, 100, TRUE
);
1413 struct obj
*enchantedgear
;
1414 enchantedgear
= mkobj_at(rn2(2) ? WEAPON_CLASS
: ARMOR_CLASS
, sx
, sy
, FALSE
, FALSE
);
1416 if (enchantedgear
&& enchantedgear
->spe
== 0) {
1417 enchantedgear
->spe
= rne(Race_if(PM_LISTENER
) ? 3 : 2);
1420 /* the items are supposed to be cursed... --Amy */
1421 if (enchantedgear
) {
1422 curse(enchantedgear
);
1423 curse(enchantedgear
);
1424 if (enchantedgear
->hvycurse
) { /* ... with a good chance of nastier curses */
1425 curse(enchantedgear
);
1426 curse(enchantedgear
);
1436 (void) mksobj_at(rnd_class(JADE
+1, LUCKSTONE
-1), sx
, sy
, TRUE
, FALSE
, FALSE
); /* worthless glass */
1438 (void) mkobj_at(SCROLL_CLASS
, sx
, sy
, FALSE
, FALSE
);
1440 case MIMICHALL
: /* lower overall amount of items --Amy */
1442 (void) mkobj_at(rn2(5) ? COIN_CLASS
: RANDOM_CLASS
, sx
, sy
, FALSE
, FALSE
);
1446 (void) mkobj_at(RANDOM_CLASS
, sx
, sy
, FALSE
, FALSE
);
1455 if (!ISSTAIRORLADDER(levl
[tx
][ty
].typ
)) levl
[tx
][ty
].typ
= THRONE
;
1456 if (somexy(sroom
, &mm
)) {
1457 (void) mkgold((long) rn1(50 * level_difficulty(),10), mm
.x
, mm
.y
);
1458 /* the royal coffers */
1459 chest
= mksobj_at(CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1461 chest
->spe
= 2; /* so it can be found later */
1466 if (somexy(sroom
, &mm
))
1467 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1470 level
.flags
.has_court
= 1;
1475 level
.flags
.has_armory
= 1;
1478 if (somexy(sroom
, &mm
))
1479 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1486 if (somexy(sroom
, &mm
)) {
1488 if (!ISSTAIRORLADDER(levl
[mm
.x
][mm
.y
].typ
) ) {
1489 levl
[mm
.x
][mm
.y
].typ
= ALTAR
;
1492 case 1: levl
[mm
.x
][mm
.y
].altarmask
= Align2amask( A_LAWFUL
); break;
1493 case 2: levl
[mm
.x
][mm
.y
].altarmask
= Align2amask( A_NEUTRAL
); break;
1494 case 3: levl
[mm
.x
][mm
.y
].altarmask
= Align2amask( A_CHAOTIC
); break;
1495 case 4: levl
[mm
.x
][mm
.y
].altarmask
= Align2amask( A_NONE
); break;
1500 register struct obj
*altarwater
;
1501 altarwater
= mksobj_at(POT_WATER
, mm
.x
, mm
.y
, FALSE
, FALSE
, FALSE
);
1504 if (Amask2align(levl
[mm
.x
][mm
.y
].altarmask
) == A_NONE
&& !rn2(5)) curse(altarwater
);
1505 else bless(altarwater
);
1510 (void) mkobj_at(SPBOOK_CLASS
, mm
.x
, mm
.y
, FALSE
, FALSE
);
1513 level
.flags
.has_ruinedchurch
= 1;
1520 if (somexy(sroom
, &mm
))
1521 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1524 level
.flags
.has_barracks
= 1;
1528 if (somexy(sroom
, &mm
))
1529 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1532 level
.flags
.has_zoo
= 1;
1534 if (somexy(sroom
, &mm
)) {
1535 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1541 if (somexy(sroom
, &mm
))
1542 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1545 level
.flags
.has_morgue
= 1;
1548 level
.flags
.has_swamp
= 1;
1551 level
.flags
.has_beehive
= 1;
1555 if (somexy(sroom
, &mm
)) {
1556 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1559 level
.flags
.has_zoo
= 1;
1562 level
.flags
.has_lemurepit
= 1;
1565 level
.flags
.has_migohive
= 1;
1569 if (somexy(sroom
, &mm
)) {
1570 (void) mksobj_at(SYMBIOTE
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1573 level
.flags
.has_fungusfarm
= 1;
1577 if (somexy(sroom
, &mm
)) {
1578 (void) mksobj_at(SYMBIOTE
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1581 level
.flags
.has_clinic
= 1;
1584 level
.flags
.has_terrorhall
= 1;
1589 if (somexy(sroom
, &mm
))
1590 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1593 if (somexy(sroom
, &mm
))
1594 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1598 level
.flags
.has_insideroom
= 1;
1602 if (somexy(sroom
, &mm
))
1603 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1605 level
.flags
.has_riverroom
= 1;
1609 if (somexy(sroom
, &mm
))
1610 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1612 level
.flags
.has_tenshall
= 1;
1615 level
.flags
.has_evilroom
= 1;
1617 case RELIGIONCENTER
:
1619 if (somexy(sroom
, &mm
)) {
1620 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1623 level
.flags
.has_religioncenter
= 1;
1625 case CURSEDMUMMYROOM
:
1626 level
.flags
.has_cursedmummyroom
= 1;
1629 level
.flags
.has_changingroom
= 1;
1632 level
.flags
.has_questorroom
= 1;
1634 case ARDUOUSMOUNTAIN
:
1636 if (somexy(sroom
, &mm
)) {
1637 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1641 if (somexy(sroom
, &mm
))
1642 (void) (void) mkobj_at(IMPLANT_CLASS
, mm
.x
, mm
.y
, FALSE
, FALSE
);
1644 level
.flags
.has_arduousmountain
= 1;
1647 level
.flags
.has_levelffroom
= 1;
1651 if (somexy(sroom
, &mm
)) {
1652 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1655 level
.flags
.has_verminroom
= 1;
1658 level
.flags
.has_miraspa
= 1;
1662 if (somexy(sroom
, &mm
))
1663 (void) (void) mkobj_at(IMPLANT_CLASS
, mm
.x
, mm
.y
, FALSE
, FALSE
);
1665 level
.flags
.has_machineroom
= 1;
1668 level
.flags
.has_showerroom
= 1;
1670 case GREENCROSSROOM
:
1671 level
.flags
.has_greencrossroom
= 1;
1675 if (somexy(sroom
, &mm
)) {
1676 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1679 level
.flags
.has_gamecorner
= 1;
1682 level
.flags
.has_illusionroom
= 1;
1686 if (somexy(sroom
, &mm
))
1687 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1689 level
.flags
.has_elemhall
= 1;
1693 if (somexy(sroom
, &mm
))
1694 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1696 level
.flags
.has_angelhall
= 1;
1699 level
.flags
.has_mimichall
= 1;
1702 level
.flags
.has_nymphhall
= 1;
1705 level
.flags
.has_spiderhall
= 1;
1709 if (somexy(sroom
, &mm
))
1710 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1712 level
.flags
.has_trollhall
= 1;
1715 level
.flags
.has_coinhall
= 1;
1719 if (somexy(sroom
, &mm
))
1720 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1722 level
.flags
.has_humanhall
= 1;
1725 level
.flags
.has_golemhall
= 1;
1728 level
.flags
.has_traproom
= 1;
1731 level
.flags
.has_grueroom
= 1;
1735 level
.flags
.has_cryptroom
= 1;
1736 if (somexy(sroom
, &mm
)) {
1737 (void) mksobj_at(CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1742 if (somexy(sroom
, &mm
)) {
1743 if(levl
[mm
.x
][mm
.x
].typ
== ROOM
|| levl
[mm
.x
][mm
.x
].typ
== CORR
) {
1744 levl
[mm
.x
][mm
.x
].typ
= PENTAGRAM
;
1748 if (somexy(sroom
, &mm
)) {
1749 (void) mksobj_at(CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1751 level
.flags
.has_troublezone
= 1;
1754 level
.flags
.has_weaponchamber
= 1;
1758 if (somexy(sroom
, &mm
)) {
1759 if(levl
[mm
.x
][mm
.x
].typ
== ROOM
|| levl
[mm
.x
][mm
.x
].typ
== CORR
) {
1760 levl
[mm
.x
][mm
.x
].typ
= PENTAGRAM
;
1764 level
.flags
.has_hellpit
= 1;
1767 level
.flags
.has_feminismroom
= 1;
1769 if (somexy(sroom
, &mm
)) {
1770 (void) mksobj_at(HANDYBAG
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1773 if (somexy(sroom
, &mm
)) {
1774 (void) mksobj_at(rnd_class(ELIF_S_JEWEL
, DORA_S_JEWEL
), mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1780 level
.flags
.has_meadowroom
= 1;
1782 case COOLINGCHAMBER
:
1783 level
.flags
.has_coolingchamber
= 1;
1786 level
.flags
.has_voidroom
= 1;
1790 if (somexy(sroom
, &mm
)) {
1791 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1794 level
.flags
.has_hamletroom
= 1;
1797 level
.flags
.has_kopstation
= 1;
1800 level
.flags
.has_bossroom
= 1;
1803 level
.flags
.has_rngcenter
= 1;
1807 if (somexy(sroom
, &mm
)) {
1808 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1811 level
.flags
.has_wizardsdorm
= 1;
1813 case DOOMEDBARRACKS
:
1814 level
.flags
.has_doomedbarracks
= 1;
1818 if (somexy(sroom
, &mm
)) {
1819 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1822 level
.flags
.has_sleepingroom
= 1;
1825 level
.flags
.has_diverparadise
= 1;
1827 if (somexy(sroom
, &mm
)) {
1828 (void) mksobj_at(MATERIAL_KIT
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1833 level
.flags
.has_menagerie
= 1;
1836 level
.flags
.has_nastycentral
= 1;
1839 level
.flags
.has_emptydesert
= 1;
1842 level
.flags
.has_rarityroom
= 1;
1845 level
.flags
.has_exhibitroom
= 1;
1849 if (somexy(sroom
, &mm
)) {
1850 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1853 level
.flags
.has_prisonchamber
= 1;
1857 if (somexy(sroom
, &mm
)) {
1858 (void) mksobj_at(SACK
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1861 level
.flags
.has_robbercave
= 1;
1863 case SANITATIONCENTRAL
:
1864 level
.flags
.has_sanitationcentral
= 1;
1868 if (somexy(sroom
, &mm
)) {
1869 (void) mksobj_at(CASINO_CHIP
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1872 if (somexy(sroom
, &mm
)) {
1873 (void) mksobj_at(CASINO_CHIP
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
1877 level
.flags
.has_casinoroom
= 1;
1879 case NUCLEARCHAMBER
:
1880 level
.flags
.has_nuclearchamber
= 1;
1882 case LEVELSEVENTYROOM
:
1883 level
.flags
.has_levelseventyroom
= 1;
1886 level
.flags
.has_playercentral
= 1;
1889 level
.flags
.has_variantroom
= 1;
1893 level
.flags
.has_poolroom
= 1;
1896 level
.flags
.has_statueroom
= 1;
1901 u
.heavyaggravation
= 0;
1905 /* make a swarm of undead around mm */
1907 mkundead(mm
, revive_corpses
, mm_flags
, hostility
)
1909 boolean revive_corpses
;
1914 if (!rn2(2)) cnt
= (level_difficulty() + 1)/10;
1915 if (!rn2(5)) cnt
+= rnz(5);
1916 if (cnt
< 1) cnt
= 1;
1917 struct permonst
*mdat
;
1921 register struct monst
*mtmp
;
1923 if (Aggravate_monster
) {
1925 reset_rndmonst(NON_PM
);
1930 if (enexto(&cc
, mm
->x
, mm
->y
, mdat
) &&
1932 !(otmp
= sobj_at(CORPSE
, cc
.x
, cc
.y
)) ||
1934 mtmp
= makemon(mdat
, cc
.x
, cc
.y
, mm_flags
);
1935 if (mtmp
&& hostility
) {
1936 mtmp
->mpeaceful
= 0;
1937 mtmp
->mfrenzied
= 1;
1943 level
.flags
.graveyard
= TRUE
; /* reduced chance for undead corpse */
1947 mkundeadboo(mm, revive_corpses, mm_flags)
1949 boolean revive_corpses;
1952 struct monst *nmonst;
1955 if (!rn2(2)) cnt = (level_difficulty() + 1)/10;
1956 if (!rn2(5)) cnt += rnz(5);
1957 if (cnt < 1) cnt = 1;
1963 mdat = PM_UNDEAD_ARCHEOLOGIST + rn2(PM_UNDEAD_WIZARD - PM_UNDEAD_ARCHEOLOGIST + 1);
1964 if (enexto(&cc, mm->x, mm->y, youmonst.data) &&
1966 !(otmp = sobj_at(CORPSE, cc.x, cc.y)) ||
1969 nmonst = makemon(&mons[mdat], cc.x, cc.y, mm_flags);
1974 /* make a swarm of undead around mm but less, for zap.c WAN_SUMMON_UNDEAD */
1976 mkundeadX(mm
, revive_corpses
, mm_flags
)
1978 boolean revive_corpses
;
1982 struct permonst
*mdat
;
1986 if (Aggravate_monster
) {
1988 reset_rndmonst(NON_PM
);
1991 if (!rn2(10)) cnt
+= rnz(2);
1995 if (enexto(&cc
, mm
->x
, mm
->y
, mdat
) &&
1997 !(otmp
= sobj_at(CORPSE
, cc
.x
, cc
.y
)) ||
1999 (void) makemon(mdat
, cc
.x
, cc
.y
, mm_flags
);
2001 level
.flags
.graveyard
= TRUE
; /* reduced chance for undead corpse */
2006 STATIC_OVL
struct permonst
*
2009 register int i
= rn2(100), hd
= rn2(level_difficulty());
2011 if(hd
> 10 && i
< 10)
2012 return(&mons
[ndemon(A_NONE
)]);
2013 if(hd
> 8 && i
> 90)
2014 return(mkclass(S_VAMPIRE
,0));
2016 return((i
< 30) ? mkclass(S_GHOST
,0) : (i
< 40) ? mkclass(S_WRAITH
,0) : (i
< 70) ? mkclass(S_MUMMY
,0) : (i
< 71) ? mkclass(S_LICH
,0) : mkclass(S_ZOMBIE
,0));
2017 } /* added mummies, enabled all of S_wraith type monsters --Amy */
2024 /* Same monsters within a level, different ones between levels */
2025 switch ((level_difficulty() + ((long)u
.ubirthday
)) % 4) {
2026 default: mtyp
= PM_GIANT_ANT
; break;
2027 case 0: mtyp
= PM_SOLDIER_ANT
; break;
2028 case 1: mtyp
= PM_FIRE_ANT
; break;
2029 case 2: mtyp
= PM_SNOW_ANT
; break;
2031 return ((mvitals
[mtyp
].mvflags
& G_GONE
) ?
2032 (struct permonst
*)0 : &mons
[mtyp
]);
2036 STATIC_OVL
struct permonst
*
2039 register int i
, hd
= level_difficulty(), mtyp
= 0;
2041 i
= rn2(hd
> 20 ? 17 : hd
> 12 ? 14 : 12);
2045 case 1: mtyp
= PM_LICHEN
; break;
2046 case 2: mtyp
= PM_BROWN_MOLD
; break;
2047 case 3: mtyp
= PM_YELLOW_MOLD
; break;
2048 case 4: mtyp
= PM_GREEN_MOLD
; break;
2049 case 5: mtyp
= PM_RED_MOLD
; break;
2050 case 6: mtyp
= PM_SHRIEKER
; break;
2051 case 7: mtyp
= PM_VIOLET_FUNGUS
; break;
2052 case 8: mtyp
= PM_BLUE_JELLY
; break;
2053 case 9: mtyp
= PM_DISGUSTING_MOLD
; break;
2054 case 10: mtyp
= PM_BLACK_MOLD
; break;
2055 case 11: mtyp
= PM_GRAY_OOZE
; break;
2056 /* Following only after level 12... */
2057 case 12: mtyp
= PM_SPOTTED_JELLY
; break;
2058 case 13: mtyp
= PM_BROWN_PUDDING
; break;
2059 /* Following only after level 20... */
2060 case 14: mtyp
= PM_GREEN_SLIME
; break;
2061 case 15: mtyp
= PM_BLACK_PUDDING
; break;
2062 case 16: mtyp
= PM_OCHRE_JELLY
; break;
2065 return ((mvitals
[mtyp
].mvflags
& G_GONE
) ?
2066 (struct permonst
*)0 : &mons
[mtyp
]);
2070 mkswamp() /* Michiel Huisjes & Fred de Wilde */
2072 register struct mkroom
*sroom
;
2073 register int sx
,sy
,i
,eelct
= 0;
2075 /* There should be variation in the amount. --Amy */
2076 int ammount
= rnd(5);
2078 for(i
=0; i
<ammount
; i
++) { /* turn up to 5 rooms swampy */
2079 sroom
= &rooms
[rn2(nroom
)];
2080 if(sroom
->hx
< 0 || sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) )
2083 if (!rn2(3)) continue; /* allow some randomness --Amy */
2085 /* satisfied; make a swamp */
2086 sroom
->rtype
= SWAMP
;
2088 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
2089 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
2091 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
2092 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
2093 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !t_at(sx
,sy
) /*&& !nexttodoor(sx,sy)*/) {
2095 levl
[sx
][sy
].typ
= POOL
;
2096 if(!eelct
|| !rn2(10)) {
2097 /* mkclass() won't do, as we might get kraken */
2098 /* comment by Amy - low-level players shouldn't move close to water anyway, so I will totally spawn everything here! */
2099 (void) makemon(mkclass(S_EEL
,0), sx
, sy
, NO_MM_FLAGS
);
2103 if(!rn2(10)) /* swamps tend to be moldy */
2104 (void) makemon(mkclass(S_FUNGUS
,0), sx
, sy
, NO_MM_FLAGS
);
2106 if (!rn2(ishaxor
? 25 : 50))
2107 (void) mksobj_at(BLACK_HENBANE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
2111 level
.flags
.has_swamp
= 1;
2120 struct mkroom
*troom
= &rooms
[roomno
- ROOMOFFSET
];
2122 buf
.x
= troom
->lx
+ ((troom
->hx
- troom
->lx
) / 2);
2123 buf
.y
= troom
->ly
+ ((troom
->hy
- troom
->ly
) / 2);
2130 register struct mkroom
*sroom
;
2132 register struct rm
*lev
;
2134 if(!(sroom
= pick_room(TRUE
))) return;
2136 /* set up Priest and shrine */
2137 sroom
->rtype
= TEMPLE
;
2139 * In temples, shrines are blessed altars
2140 * located in the center of the room
2142 shrine_spot
= shrine_pos((sroom
- rooms
) + ROOMOFFSET
);
2143 lev
= &levl
[shrine_spot
->x
][shrine_spot
->y
];
2145 lev
->altarmask
= induced_align(80);
2146 priestini(&u
.uz
, sroom
, shrine_spot
->x
, shrine_spot
->y
, FALSE
);
2147 lev
->altarmask
|= AM_SHRINE
;
2148 level
.flags
.has_temple
= 1;
2151 register struct obj
*otmp
;
2152 otmp
= mksobj_at(POT_WATER
, shrine_spot
->x
, shrine_spot
->y
, FALSE
, FALSE
, FALSE
);
2161 register int sx
, sy
;
2163 register int dx
, dy
;
2164 register struct rm
*lev
;
2165 for(dx
= -1; dx
<= 1; dx
++) for(dy
= -1; dy
<= 1; dy
++) {
2166 if(!isok(sx
+dx
, sy
+dy
)) continue;
2167 if(IS_DOOR((lev
= &levl
[sx
+dx
][sy
+dy
])->typ
) ||
2176 register struct mkroom
*sroom
;
2178 if (sroom
== dnstairs_room
)
2180 if (sstairs
.sx
&& !sstairs
.up
)
2181 return((boolean
)(sroom
== sstairs_room
));
2187 register struct mkroom
*sroom
;
2189 if (sroom
== upstairs_room
)
2191 if (sstairs
.sx
&& sstairs
.up
)
2192 return((boolean
)(sroom
== sstairs_room
));
2201 register struct mkroom
*croom
;
2203 return rn2(croom
->hx
-croom
->lx
+1) + croom
->lx
;
2208 register struct mkroom
*croom
;
2210 return rn2(croom
->hy
-croom
->ly
+1) + croom
->ly
;
2214 inside_room(croom
, x
, y
)
2215 struct mkroom
*croom
;
2218 return((boolean
)(x
>= croom
->lx
-1 && x
<= croom
->hx
+1 &&
2219 y
>= croom
->ly
-1 && y
<= croom
->hy
+1));
2224 struct mkroom
*croom
;
2230 if (croom
->irregular
) {
2231 i
= (croom
- rooms
) + ROOMOFFSET
;
2233 while(try_cnt
++ < 100) {
2234 c
->x
= somex(croom
);
2235 c
->y
= somey(croom
);
2236 if (!levl
[c
->x
][c
->y
].edge
&&
2237 (int) levl
[c
->x
][c
->y
].roomno
== i
)
2240 /* try harder; exhaustively search until one is found */
2241 for(c
->x
= croom
->lx
; c
->x
<= croom
->hx
; c
->x
++)
2242 for(c
->y
= croom
->ly
; c
->y
<= croom
->hy
; c
->y
++)
2243 if (!levl
[c
->x
][c
->y
].edge
&&
2244 (int) levl
[c
->x
][c
->y
].roomno
== i
)
2249 if (!croom
->nsubrooms
) {
2250 c
->x
= somex(croom
);
2251 c
->y
= somey(croom
);
2255 /* Check that coords doesn't fall into a subroom or into a wall */
2257 while(try_cnt
++ < 100) {
2258 c
->x
= somex(croom
);
2259 c
->y
= somey(croom
);
2260 if (IS_WALL(levl
[c
->x
][c
->y
].typ
))
2262 for(i
=0 ; i
<croom
->nsubrooms
;i
++)
2263 if(inside_room(croom
->sbrooms
[i
], c
->x
, c
->y
))
2274 * Search for a special room given its type (zoo, court, etc...)
2281 search_special(type
)
2284 register struct mkroom
*croom
;
2286 for(croom
= &rooms
[0]; croom
->hx
>= 0; croom
++)
2287 if((type
== ANY_TYPE
&& croom
->rtype
!= OROOM
) ||
2288 (type
== ANY_SHOP
&& croom
->rtype
>= SHOPBASE
) ||
2289 croom
->rtype
== type
)
2291 for(croom
= &subrooms
[0]; croom
->hx
>= 0; croom
++)
2292 if((type
== ANY_TYPE
&& croom
->rtype
!= OROOM
) ||
2293 (type
== ANY_SHOP
&& croom
->rtype
>= SHOPBASE
) ||
2294 croom
->rtype
== type
)
2296 return (struct mkroom
*) 0;
2305 int i
= rnz(60) + rnz(3*level_difficulty());
2306 if (i
> 200) return(mkclass(S_DRAGON
,0));
2307 else if (i
> 130) return(mkclass(S_GIANT
,0));
2308 else if (i
> 85) return(mkclass(S_TROLL
,0));
2309 else if (i
> 75) return(mkclass(S_JABBERWOCK
,0));
2310 else if (i
> 60) return(mkclass(S_CENTAUR
,0));
2311 else if (i
> 45) return(mkclass(S_ORC
,0));
2312 else if (i
> 30) return(mkclass(S_HUMANOID
,0));
2313 else if (i
> 15) return(mkclass(S_GNOME
,0));
2314 else return(mkclass(S_KOBOLD
,0));
2318 minotaurvariant() /* Amy notice: keep is_minotaur() in mondata.c updated too */
2323 return (&mons
[PM_LOWERCASE_MINOTAUR
]);
2325 return (&mons
[PM_MINOTAUR_MAGICIAN
]);
2327 return (&mons
[PM_MINOTAUR_BOXER
]);
2329 return (&mons
[PM_MINOCHEATER
]);
2331 return (&mons
[PM_MINOTAUR_BALLERINA
]);
2333 return (&mons
[PM_MINOTARD
]);
2335 return (&mons
[PM_MINOTAUR_VORE
]);
2337 return (&mons
[PM_ERR_AXE_MINOTAUR
]);
2339 return (&mons
[PM_ROCKTAUR
]);
2341 return (&mons
[PM_PSEUDO_PETTY_MINOTAUR
]);
2343 return (&mons
[PM_SPECHOTAUR
]);
2345 return (rn2(5) ? &mons
[PM_MINOTAUR
] : &mons
[PM_MINOTAUR_LICH
]);
2347 return (&mons
[PM_MINOTAUR_MIMIC
]);
2349 return (&mons
[PM_CHASING_MINOTAUR
]);
2351 return (&mons
[PM_FAT_MINOTAUR
]);
2353 return (&mons
[PM_CHEATING_MINOTAUR
]);
2355 return (&mons
[PM_EVIL_PATCH_MINOTAUR
]);
2357 return (&mons
[PM_DUMB_MINOTAUR
]);
2359 return (&mons
[PM_GIGOTAUR
]);
2361 return (level_difficulty() < 16 ? &mons
[PM_MINOTAUR
] : &mons
[PM_MINOTAUR_PRIESTESS
]);
2363 return (level_difficulty() < 20 ? &mons
[PM_MINOTAUR
] : &mons
[PM_MINOTAUR_MATRON
]);
2365 return (level_difficulty() < 26 ? &mons
[PM_MINOTAUR
] : &mons
[PM_ELDER_MINOTAUR
]);
2367 return (level_difficulty() < 26 ? &mons
[PM_MINOTAUR
] : &mons
[PM_PETTY_ELDER_MINOTAUR
]);
2369 return (level_difficulty() < 41 ? &mons
[PM_MINOTAUR
] : &mons
[PM_STEEL_MINOTAUR
]);
2371 return (level_difficulty() < 50 ? &mons
[PM_MINOTAUR
] : &mons
[PM_ANCIENT_MINOTAUR
]);
2373 return (level_difficulty() < 90 ? &mons
[PM_MINOTAUR
] : &mons
[PM_MINOTAUR_GRANDMASTER
]);
2375 return (&mons
[PM_MINOTAUR_ZOMBIE
]);
2377 return (level_difficulty() < 76 ? &mons
[PM_MINOTAUR
] : &mons
[PM_ASTERIOS
]);
2379 return (level_difficulty() < 50 ? &mons
[PM_MINOTAUR
] : &mons
[PM_CHIHYU
]);
2381 return (level_difficulty() < 60 ? &mons
[PM_MINOTAUR
] : &mons
[PM_MOLOCH
]);
2383 return (&mons
[PM_TAURUSCROTTA
]);
2385 return (&mons
[PM_GRIDOTAUR
]);
2387 return (level_difficulty() < 50 ? &mons
[PM_MINOTAUR
] : &mons
[PM_MAULOTAUR
]);
2389 return (&mons
[PM_XORNITAUR
]);
2391 return (&mons
[PM_FISHTAUR
]);
2393 return (&mons
[PM_ROARING_FISHTAUR
]);
2395 return (&mons
[PM_SAVEUP_MINOTAUR
]);
2397 return (&mons
[PM_MIMOTAUR
]);
2399 return (&mons
[PM_MINOTAUR_NPC
]);
2403 return(&mons
[PM_MINOTAUR
]);
2406 /* arabella room monsters - Amy remark: please keep mondata.c "is_arabellamonster" in sync so they don't drown! */
2411 if (i
> 153) return(rn2(2) ? &mons
[PM_ARABELLA_SHOE
] : !rn2(3) ? &mons
[PM_ANASTASIA_SHOE
] : rn2(2) ? &mons
[PM_HENRIETTA_SHOE
] : rn2(4) ? &mons
[PM_KATRIN_SHOE
] : &mons
[PM_JANA_SHOE
]);
2412 else if (i
> 152) return(rn2(20) ? &mons
[PM_SUPERTHIEF
] : (level_difficulty() < 24) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM____BIT_SUBSYSTEM
]);
2413 else if (i
> 151) return(&mons
[PM_YOUR_MAP_SHOWS_
]);
2414 else if (i
> 150) return(&mons
[PM_HEAVILY_INJURED
]);
2415 else if (i
> 145) return(&mons
[PM_YOU_SEE_
]);
2416 else if (i
> 140) return(&mons
[PM_CRITICALLY_INJURED
]);
2417 else if (i
> 139) return(&mons
[PM_IDE_BY__
]);
2418 else if (i
> 138) return(&mons
[PM_VAILABLE__EXIT_ANYWAY_
]);
2419 else if (i
> 137) return(&mons
[PM_MAND_PENDING__MAGIC_SPELL___
]);
2420 else if (i
> 136) return(&mons
[PM_E_PALE_WRAITH_WITH_A_LIGHTNING_STROKE_
]);
2421 else if (i
> 132) return(&mons
[PM_CRITICALLY_INJURED_PERCENTS
]);
2422 else if (i
> 130) return(&mons
[PM_OGRE_PERCENTS
]);
2426 return(rn2(5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_SLICK_RUEA
]);
2429 return(rn2(5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_DOUBLE_AURORA_BOMBER
]);
2432 return(rn2(5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_SHEER_SPACER
]);
2435 if (level_difficulty() < 10) return(&mons
[PM_SUPERTHIEF
]);
2436 return(rn2(5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_DIVISION_FIEND
]);
2439 if (level_difficulty() < 20) return(&mons
[PM_SUPERTHIEF
]);
2440 return(rn2(20) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_DIVISION_FOURTH_BOSS
]);
2445 else if (i
> 128) return(&mons
[PM_EVC_UFO
]);
2446 else if (i
> 127) return(&mons
[PM_XXXXXXXXXXXXXXXXXXXX
]);
2447 else if (i
> 125) return(&mons
[PM_HYPER_CAVE_BEAR
]);
2448 else if (i
> 122) return(rn2(5) ? &mons
[PM_SUPERCHEST
] : &mons
[PM_ULTRACHEST
]);
2449 else if (i
> 121) return(rn2(5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_TELEPORT_TRAP
]);
2450 else if (i
> 120) return(rn2(5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_ULTRAYOUSEE
]);
2451 else if (i
> 117) return(&mons
[PM_HIGHSCORE_DUMMY
]);
2452 else if (i
> 114) return(&mons
[PM_DEEP_ROCK
]);
2453 else if (i
> 109) return(&mons
[PM_SUPERDEEP_TYPE
]);
2454 else if (i
> 108) return(&mons
[PM_ENEMY_FROM_LEVEL___
]);
2455 else if (i
> 106) return(rn2(20) ? &mons
[PM_SUPER_STATUE
] : &mons
[PM_ELTRA_STATUE
]);
2456 else if (i
> 105) return(&mons
[PM_CURSED_CALLED_BANDIT
]);
2457 else if (i
> 100) return(mkclass(S_WORM_TAIL
,0));
2458 else if (i
> 99) return(rn2(1000) ? &mons
[PM_SUPERTHIEF
] : (level_difficulty() < 40) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_PERCENTS_____NIX
]);
2459 else if (i
> 98) return(rn2(200) ? &mons
[PM_SUPERTHIEF
] : (level_difficulty() < 20) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_NIX
]);
2460 else if (i
> 96) return((level_difficulty() < 5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_AK_THIEF_IS_DEAD_
]);
2461 else if (i
> 94) return((level_difficulty() < 5) ? &mons
[PM_SUPERTHIEF
] : &mons
[PM_UN_IN_PROTECT_MODE
]);
2462 else if (i
> 85) return(rn2(5) ? &mons
[PM_FAKE_CHARACTER
] : &mons
[PM_CHARACTER_EVP
]);
2463 else if (i
> 84) return((level_difficulty() < 20) ? &mons
[PM_SPACEWARS_FIGHTER
] : &mons
[PM_UNDEAD_SPACEWARS_FIGHTER
]);
2464 else if (i
> 74) return(&mons
[PM_CAR_DRIVING_SUPERTHIEF
]);
2465 else if (i
> 64) return(&mons
[PM_SUPERJEDI
]);
2466 else if (i
> 54) return(&mons
[PM_DIVISION_THIEF
]);
2467 else if (i
> 45) return(&mons
[PM_DIVISION_JEDI
]);
2468 else if (i
> 36) return(&mons
[PM_CRITICALLY_INJURED_THIEF
]);
2469 else if (i
> 27) return(&mons
[PM_CRITICALLY_INJURED_JEDI
]);
2470 else if (i
> 18) return(&mons
[PM_HUGE_OGRE_THIEF
]);
2471 else if (i
> 9) return(&mons
[PM_GUNNHILD_S_GENERAL_STORE
]);
2472 else return(&mons
[PM_SUPERTHIEF
]);
2474 return(&mons
[PM_SUPERTHIEF
]); /* appease compiler */
2482 register struct permonst
*ptr
;
2483 register int ct
= 0;
2485 if (color
== NO_COLOR
) color
= CLR_BLACK
;
2494 } while (!ptr
|| (ptr
->mcolor
!= color
&& ct
< 2000) );
2501 specialtensmon(type
) /* for monstercolor function and some others */
2505 register struct permonst
*ptr
;
2506 register int ct
= 0;
2514 if (ct
&& (ct
% 10000 == 0)) u
.mondiffhack
++;
2515 if (!rn2(2000)) reset_rndmonst(NON_PM
);
2517 } while ( !ptr
|| (( (type
== 1 && !(ptr
->msound
== MS_SILENT
)) || (type
== 2 && !(ptr
->msound
== MS_BARK
)) || (type
== 3 && !(ptr
->msound
== MS_MEW
)) || (type
== 4 && !(ptr
->msound
== MS_ROAR
)) || (type
== 5 && !(ptr
->msound
== MS_GROWL
)) || (type
== 6 && !(ptr
->msound
== MS_SQEEK
)) || (type
== 7 && !(ptr
->msound
== MS_SQAWK
)) || (type
== 8 && !(ptr
->msound
== MS_HISS
)) || (type
== 9 && !(ptr
->msound
== MS_BUZZ
)) || (type
== 10 && !(ptr
->msound
== MS_GRUNT
)) || (type
== 11 && !(ptr
->msound
== MS_NEIGH
)) || (type
== 12 && !(ptr
->msound
== MS_WAIL
)) || (type
== 13 && !(ptr
->msound
== MS_GURGLE
)) || (type
== 14 && !(ptr
->msound
== MS_BURBLE
)) || (type
== 15 && !(ptr
->msound
== MS_SHRIEK
)) || (type
== 16 && !(ptr
->msound
== MS_BONES
)) || (type
== 17 && !(ptr
->msound
== MS_LAUGH
)) || (type
== 18 && !(ptr
->msound
== MS_MUMBLE
)) || (type
== 19 && !(ptr
->msound
== MS_IMITATE
)) || (type
== 20 && !(ptr
->msound
== MS_ORC
)) || (type
== 21 && !(ptr
->msound
== MS_HUMANOID
)) || (type
== 22 && !(ptr
->msound
== MS_ARREST
)) || (type
== 23 && !(ptr
->msound
== MS_SOLDIER
)) || (type
== 24 && !(ptr
->msound
== MS_DJINNI
)) || (type
== 25 && !(ptr
->msound
== MS_NURSE
)) || (type
== 26 && !(ptr
->msound
== MS_SEDUCE
)) || (type
== 27 && !(ptr
->msound
== MS_VAMPIRE
)) || (type
== 28 && !(ptr
->msound
== MS_CUSS
)) || (type
== 29 && !(ptr
->msound
== MS_NEMESIS
)) || (type
== 30 && !(ptr
->msound
== MS_SPELL
)) || (type
== 31 && !(ptr
->msound
== MS_WERE
)) || (type
== 32 && !(ptr
->msound
== MS_BOAST
)) || (type
== 33 && !(ptr
->msound
== MS_SHEEP
)) || (type
== 34 && !(ptr
->msound
== MS_CHICKEN
)) || (type
== 35 && !(ptr
->msound
== MS_COW
)) || (type
== 36 && !(ptr
->msound
== MS_PARROT
)) || (type
== 37 && !(ptr
->msound
== MS_WHORE
)) || (type
== 38 && !(ptr
->msound
== MS_FART_QUIET
)) || (type
== 39 && !(ptr
->msound
== MS_FART_NORMAL
)) || (type
== 40 && !(ptr
->msound
== MS_FART_LOUD
)) || (type
== 41 && !(ptr
->msound
== MS_BOSS
)) || (type
== 42 && !(ptr
->msound
== MS_SOUND
)) || (type
== 43 && !(ptr
->mresists
& MR_FIRE
)) || (type
== 44 && !(ptr
->mresists
& MR_COLD
)) || (type
== 45 && !(ptr
->mresists
& MR_SLEEP
)) || (type
== 46 && !(ptr
->mresists
& MR_DISINT
)) || (type
== 47 && !(ptr
->mresists
& MR_ELEC
)) || (type
== 48 && !(ptr
->mresists
& MR_POISON
)) || (type
== 49 && !(ptr
->mresists
& MR_ACID
)) || (type
== 50 && !(ptr
->mresists
& MR_STONE
)) || (type
== 51 && !(ptr
->mresists
& MR_DEATH
)) || (type
== 52 && !(ptr
->mresists
& MR_DRAIN
)) || (type
== 53 && !(ptr
->mresists
& MR_PLUSONE
)) || (type
== 54 && !(ptr
->mresists
& MR_PLUSTWO
)) || (type
== 55 && !(ptr
->mresists
& MR_PLUSTHREE
)) || (type
== 56 && !(ptr
->mresists
& MR_PLUSFOUR
)) || (type
== 57 && !(ptr
->mresists
& MR_HITASONE
)) || (type
== 58 && !(ptr
->mresists
& MR_HITASTWO
)) || (type
== 59 && !(ptr
->mresists
& MR_HITASTHREE
)) || (type
== 60 && !(ptr
->mresists
& MR_HITASFOUR
)) || (type
== 61 && !(ptr
->mflags1
& M1_FLY
)) || (type
== 62 && !(ptr
->mflags1
& M1_SWIM
)) || (type
== 63 && !(ptr
->mflags1
& M1_AMORPHOUS
)) || (type
== 64 && !(ptr
->mflags1
& M1_WALLWALK
)) || (type
== 65 && !(ptr
->mflags1
& M1_CLING
)) || (type
== 66 && !(ptr
->mflags1
& M1_TUNNEL
)) || (type
== 67 && !(ptr
->mflags1
& M1_NEEDPICK
)) || (type
== 68 && !(ptr
->mflags1
& M1_CONCEAL
)) || (type
== 69 && !(ptr
->mflags1
& M1_HIDE
)) || (type
== 70 && !(ptr
->mflags1
& M1_AMPHIBIOUS
)) || (type
== 71 && !(ptr
->mflags1
& M1_BREATHLESS
)) || (type
== 72 && !(ptr
->mflags1
& M1_NOTAKE
)) || (type
== 73 && !(ptr
->mflags1
& M1_NOEYES
)) || (type
== 74 && !(ptr
->mflags1
& M1_NOHANDS
)) || (type
== 75 && !(ptr
->mflags1
& M1_NOLIMBS
)) || (type
== 76 && !(ptr
->mflags1
& M1_NOHEAD
)) || (type
== 77 && !(ptr
->mflags1
& M1_MINDLESS
)) || (type
== 78 && !(ptr
->mflags1
& M1_HUMANOID
)) || (type
== 79 && !(ptr
->mflags1
& M1_ANIMAL
)) || (type
== 80 && !(ptr
->mflags1
& M1_SLITHY
)) || (type
== 81 && !(ptr
->mflags1
& M1_UNSOLID
)) || (type
== 82 && !(ptr
->mflags1
& M1_THICK_HIDE
)) || (type
== 83 && !(ptr
->mflags1
& M1_OVIPAROUS
)) || (type
== 84 && !(ptr
->mflags1
& M1_REGEN
)) || (type
== 85 && !(ptr
->mflags1
& M1_SEE_INVIS
)) || (type
== 86 && !(ptr
->mflags1
& M1_TPORT
)) || (type
== 87 && !(ptr
->mflags1
& M1_TPORT_CNTRL
)) || (type
== 88 && !(ptr
->mflags1
& M1_ACID
)) || (type
== 89 && !(ptr
->mflags1
& M1_POIS
)) || (type
== 90 && !(ptr
->mflags1
& M1_CARNIVORE
)) || (type
== 91 && !(ptr
->mflags1
& M1_HERBIVORE
)) || (type
== 92 && !(ptr
->mflags1
& M1_OMNIVORE
)) || (type
== 93 && !(ptr
->mflags1
& M1_METALLIVORE
)) || (type
== 94 && !(ptr
->mflags2
& M2_NOPOLY
)) || (type
== 95 && !(ptr
->mflags2
& M2_UNDEAD
)) || (type
== 96 && !(ptr
->mflags2
& M2_MERC
)) || (type
== 97 && !(ptr
->mflags2
& M2_HUMAN
)) || (type
== 98 && !(ptr
->mflags2
& M2_ELF
)) || (type
== 99 && !(ptr
->mflags2
& M2_DWARF
)) || (type
== 100 && !(ptr
->mflags2
& M2_GNOME
)) || (type
== 101 && !(ptr
->mflags2
& M2_ORC
)) || (type
== 102 && !(ptr
->mflags2
& M2_HOBBIT
)) || (type
== 103 && !(ptr
->mflags2
& M2_WERE
)) || (type
== 104 && !(ptr
->mflags2
& M2_VAMPIRE
)) || (type
== 105 && !(ptr
->mflags2
& M2_LORD
)) || (type
== 106 && !(ptr
->mflags2
& M2_PRINCE
)) || (type
== 107 && !(ptr
->mflags2
& M2_MINION
)) || (type
== 108 && !(ptr
->mflags2
& M2_GIANT
)) || (type
== 109 && !(ptr
->mflags2
& M2_DEMON
)) || (type
== 110 && !(ptr
->mflags2
& M2_MALE
)) || (type
== 111 && !(ptr
->mflags2
& M2_FEMALE
)) || (type
== 112 && !(ptr
->mflags2
& M2_NEUTER
)) || (type
== 113 && !(ptr
->mflags2
& M2_PNAME
)) || (type
== 114 && !(ptr
->mflags2
& M2_HOSTILE
)) || (type
== 115 && !(ptr
->mflags2
& M2_PEACEFUL
)) || (type
== 116 && !(ptr
->mflags2
& M2_DOMESTIC
)) || (type
== 117 && !(ptr
->mflags2
& M2_WANDER
)) || (type
== 118 && !(ptr
->mflags2
& M2_STALK
)) || (type
== 119 && !(ptr
->mflags2
& M2_NASTY
)) || (type
== 120 && !(ptr
->mflags2
& M2_STRONG
)) || (type
== 121 && !(ptr
->mflags2
& M2_ROCKTHROW
)) || (type
== 122 && !(ptr
->mflags2
& M2_GREEDY
)) || (type
== 123 && !(ptr
->mflags2
& M2_JEWELS
)) || (type
== 124 && !(ptr
->mflags2
& M2_COLLECT
)) || (type
== 125 && !(ptr
->mflags2
& M2_MAGIC
)) || (type
== 126 && !(ptr
->mflags3
& M3_WANTSAMUL
)) || (type
== 127 && !(ptr
->mflags3
& M3_WANTSBELL
)) || (type
== 128 && !(ptr
->mflags3
& M3_WANTSBOOK
)) || (type
== 129 && !(ptr
->mflags3
& M3_WANTSCAND
)) || (type
== 130 && !(ptr
->mflags3
& M3_WANTSARTI
)) || (type
== 131 && !(ptr
->mflags3
& M3_WAITFORU
)) || (type
== 132 && !(ptr
->mflags3
& M3_CLOSE
)) || (type
== 133 && !(ptr
->mflags3
& M3_INFRAVISION
)) || (type
== 134 && !(ptr
->mflags3
& M3_INFRAVISIBLE
)) || (type
== 135 && !(ptr
->mflags3
& M3_TRAITOR
)) || (type
== 136 && !(ptr
->mflags3
& M3_NOTAME
)) || (type
== 137 && !(ptr
->mflags3
& M3_AVOIDER
)) || (type
== 138 && !(ptr
->mflags3
& M3_LITHIVORE
)) || (type
== 139 && !(ptr
->mflags3
& M3_PETTY
)) || (type
== 140 && !(ptr
->mflags3
& M3_POKEMON
)) || (type
== 141 && !(ptr
->mflags3
& M3_NOPLRPOLY
)) || (type
== 142 && !(ptr
->mflags3
& M3_NONMOVING
)) || (type
== 143 && !(ptr
->mflags3
& M3_EGOTYPE
)) || (type
== 144 && !(ptr
->mflags3
& M3_TELEPATHIC
)) || (type
== 145 && !(ptr
->mflags3
& M3_SPIDER
)) || (type
== 146 && !(ptr
->mflags3
& M3_PETRIFIES
)) || (type
== 147 && !(ptr
->mflags3
& M3_IS_MIND_FLAYER
)) || (type
== 148 && !(ptr
->mflags3
& M3_NO_DECAY
)) || (type
== 149 && !(ptr
->mflags3
& M3_MIMIC
)) || (type
== 150 && !(ptr
->mflags3
& M3_PERMAMIMIC
)) || (type
== 151 && !(ptr
->mflags3
& M3_SLIME
)) || (type
== 152 && !(ptr
->mflags3
& M3_FREQ_UNCOMMON2
)) || (type
== 153 && !(ptr
->mflags3
& M3_FREQ_UNCOMMON3
)) || (type
== 154 && !(ptr
->mflags3
& M3_FREQ_UNCOMMON5
)) || (type
== 155 && !(ptr
->mflags3
& M3_FREQ_UNCOMMON7
)) || (type
== 156 && !(ptr
->mflags3
& M3_FREQ_UNCOMMON10
)) || (type
== 157 && !(ptr
->mflags3
& M3_MIND_FLAYER
)) || (type
== 158 && !(ptr
->msize
== MZ_TINY
)) || (type
== 159 && !(ptr
->msize
== MZ_SMALL
)) || (type
== 160 && !(ptr
->msize
== MZ_MEDIUM
)) || (type
== 161 && !(ptr
->msize
== MZ_LARGE
)) || (type
== 162 && !(ptr
->msize
== MZ_HUGE
)) || (type
== 163 && !(ptr
->msize
== MZ_GIGANTIC
)) || (type
== 164 && !(ptr
->geno
& G_VLGROUP
)) || (type
== 165 && !(ptr
->geno
& G_UNIQ
)) || (type
== 166 && !(ptr
->geno
& G_SGROUP
)) || (type
== 167 && !(ptr
->geno
& G_LGROUP
)) || (type
== 168 && !(ptr
->geno
& G_GENO
)) || (type
== 169 && !(ptr
->geno
& G_NOCORPSE
)) || (type
== 170 && !haspassive(ptr
)) || (type
== 171 && !attacktype(ptr
, AT_CLAW
)) || (type
== 172 && !attacktype(ptr
, AT_BITE
)) || (type
== 173 && !attacktype(ptr
, AT_KICK
)) || (type
== 174 && !attacktype(ptr
, AT_BUTT
)) || (type
== 175 && !attacktype(ptr
, AT_TUCH
)) || (type
== 176 && !attacktype(ptr
, AT_STNG
)) || (type
== 177 && !attacktype(ptr
, AT_HUGS
)) || (type
== 178 && !attacktype(ptr
, AT_SCRA
)) || (type
== 179 && !attacktype(ptr
, AT_LASH
)) || (type
== 180 && !attacktype(ptr
, AT_SPIT
)) || (type
== 181 && !attacktype(ptr
, AT_ENGL
)) || (type
== 182 && !attacktype(ptr
, AT_BREA
)) || (type
== 183 && !attacktype(ptr
, AT_EXPL
)) || (type
== 184 && !attacktype(ptr
, AT_BOOM
)) || (type
== 185 && !attacktype(ptr
, AT_GAZE
)) || (type
== 186 && !attacktype(ptr
, AT_TENT
)) || (type
== 187 && !attacktype(ptr
, AT_TRAM
)) || (type
== 188 && !attacktype(ptr
, AT_BEAM
)) || (type
== 189 && !attacktype(ptr
, AT_MULTIPLY
)) || (type
== 190 && !attacktype(ptr
, AT_WEAP
)) || (type
== 191 && !attacktype(ptr
, AT_MAGC
)) || (type
== 192 && !dmgtype(ptr
, AD_PHYS
)) || (type
== 193 && !dmgtype(ptr
, AD_MAGM
)) || (type
== 194 && !dmgtype(ptr
, AD_FIRE
)) || (type
== 195 && !dmgtype(ptr
, AD_COLD
)) || (type
== 196 && !dmgtype(ptr
, AD_SLEE
)) || (type
== 197 && !dmgtype(ptr
, AD_DISN
)) || (type
== 198 && !dmgtype(ptr
, AD_ELEC
)) || (type
== 199 && !dmgtype(ptr
, AD_DRST
)) || (type
== 200 && !dmgtype(ptr
, AD_ACID
)) || (type
== 201 && !dmgtype(ptr
, AD_LITE
)) || (type
== 202 && !dmgtype(ptr
, AD_BLND
)) || (type
== 203 && !dmgtype(ptr
, AD_STUN
)) || (type
== 204 && !dmgtype(ptr
, AD_SLOW
)) || (type
== 205 && !dmgtype(ptr
, AD_PLYS
)) || (type
== 206 && !dmgtype(ptr
, AD_DRLI
)) || (type
== 207 && !dmgtype(ptr
, AD_DREN
)) || (type
== 208 && !dmgtype(ptr
, AD_LEGS
)) || (type
== 209 && !dmgtype(ptr
, AD_STON
)) || (type
== 210 && !dmgtype(ptr
, AD_STCK
)) || (type
== 211 && !dmgtype(ptr
, AD_SGLD
)) || (type
== 212 && !dmgtype(ptr
, AD_SITM
)) || (type
== 213 && !dmgtype(ptr
, AD_SEDU
)) || (type
== 214 && !dmgtype(ptr
, AD_TLPT
)) || (type
== 215 && !dmgtype(ptr
, AD_RUST
)) || (type
== 216 && !dmgtype(ptr
, AD_CONF
)) || (type
== 217 && !dmgtype(ptr
, AD_DGST
)) || (type
== 218 && !dmgtype(ptr
, AD_HEAL
)) || (type
== 219 && !dmgtype(ptr
, AD_WRAP
)) || (type
== 220 && !dmgtype(ptr
, AD_WERE
)) || (type
== 221 && !dmgtype(ptr
, AD_DRDX
)) || (type
== 222 && !dmgtype(ptr
, AD_DRCO
)) || (type
== 223 && !dmgtype(ptr
, AD_DRIN
)) || (type
== 224 && !dmgtype(ptr
, AD_DISE
)) || (type
== 225 && !dmgtype(ptr
, AD_DCAY
)) || (type
== 226 && !dmgtype(ptr
, AD_SSEX
)) || (type
== 227 && !dmgtype(ptr
, AD_HALU
)) || (type
== 228 && !dmgtype(ptr
, AD_DETH
)) || (type
== 229 && !dmgtype(ptr
, AD_PEST
)) || (type
== 230 && !dmgtype(ptr
, AD_FAMN
)) || (type
== 231 && !dmgtype(ptr
, AD_SLIM
)) || (type
== 232 && !dmgtype(ptr
, AD_CALM
)) || (type
== 233 && !dmgtype(ptr
, AD_ENCH
)) || (type
== 234 && !dmgtype(ptr
, AD_POLY
)) || (type
== 235 && !dmgtype(ptr
, AD_CORR
)) || (type
== 236 && !dmgtype(ptr
, AD_TCKL
)) || (type
== 237 && !dmgtype(ptr
, AD_NGRA
)) || (type
== 238 && !dmgtype(ptr
, AD_GLIB
)) || (type
== 239 && !dmgtype(ptr
, AD_DARK
)) || (type
== 240 && !dmgtype(ptr
, AD_WTHR
)) || (type
== 241 && !dmgtype(ptr
, AD_LUCK
)) || (type
== 242 && !dmgtype(ptr
, AD_NUMB
)) || (type
== 243 && !dmgtype(ptr
, AD_FRZE
)) || (type
== 244 && !dmgtype(ptr
, AD_DISP
)) || (type
== 245 && !dmgtype(ptr
, AD_BURN
)) || (type
== 246 && !dmgtype(ptr
, AD_FEAR
)) || (type
== 247 && !dmgtype(ptr
, AD_NPRO
)) || (type
== 248 && !dmgtype(ptr
, AD_POIS
)) || (type
== 249 && !dmgtype(ptr
, AD_THIR
)) || (type
== 250 && !dmgtype(ptr
, AD_LAVA
)) || (type
== 251 && !dmgtype(ptr
, AD_FAKE
)) || (type
== 252 && !dmgtype(ptr
, AD_LETH
)) || (type
== 253 && !dmgtype(ptr
, AD_CNCL
)) || (type
== 254 && !dmgtype(ptr
, AD_BANI
)) || (type
== 255 && !dmgtype(ptr
, AD_WISD
)) || (type
== 256 && !dmgtype(ptr
, AD_SHRD
)) || (type
== 257 && !dmgtype(ptr
, AD_WET
)) || (type
== 258 && !dmgtype(ptr
, AD_SUCK
)) || (type
== 259 && !dmgtype(ptr
, AD_MALK
)) || (type
== 260 && !dmgtype(ptr
, AD_UVUU
)) || (type
== 261 && !dmgtype(ptr
, AD_ABDC
)) || (type
== 262 && !dmgtype(ptr
, AD_AXUS
)) || (type
== 263 && !dmgtype(ptr
, AD_CHKH
)) || (type
== 264 && !dmgtype(ptr
, AD_HODS
)) || (type
== 265 && !dmgtype(ptr
, AD_CHRN
)) || (type
== 266 && !dmgtype(ptr
, AD_WEEP
)) || (type
== 267 && !dmgtype(ptr
, AD_VAMP
)) || (type
== 268 && !dmgtype(ptr
, AD_WEBS
)) || (type
== 269 && !dmgtype(ptr
, AD_STTP
)) || (type
== 270 && !dmgtype(ptr
, AD_DEPR
)) || (type
== 271 && !dmgtype(ptr
, AD_WRAT
)) || (type
== 272 && !dmgtype(ptr
, AD_LAZY
)) || (type
== 273 && !dmgtype(ptr
, AD_DRCH
)) || (type
== 274 && !dmgtype(ptr
, AD_DFOO
)) || (type
== 275 && !dmgtype(ptr
, AD_NEXU
)) || (type
== 276 && !dmgtype(ptr
, AD_SOUN
)) || (type
== 277 && !dmgtype(ptr
, AD_GRAV
)) || (type
== 278 && !dmgtype(ptr
, AD_INER
)) || (type
== 279 && !dmgtype(ptr
, AD_TIME
)) || (type
== 280 && !dmgtype(ptr
, AD_MANA
)) || (type
== 281 && !dmgtype(ptr
, AD_PLAS
)) || (type
== 282 && !dmgtype(ptr
, AD_SKIL
)) || (type
== 283 && !dmgtype(ptr
, AD_CLRC
)) || (type
== 284 && !dmgtype(ptr
, AD_SPEL
)) || (type
== 285 && !dmgtype(ptr
, AD_RBRE
)) || (type
== 286 && !dmgtype(ptr
, AD_SAMU
)) || (type
== 287 && !dmgtype(ptr
, AD_CURS
)) || (type
== 288 && !dmgtype(ptr
, AD_SPC2
)) || (type
== 289 && !dmgtype(ptr
, AD_VENO
)) || (type
== 290 && !dmgtype(ptr
, AD_DREA
)) || (type
== 291 && !dmgtype(ptr
, AD_NAST
)) || (type
== 292 && !dmgtype(ptr
, AD_BADE
)) || (type
== 293 && !dmgtype(ptr
, AD_SLUD
)) || (type
== 294 && !dmgtype(ptr
, AD_ICUR
)) || (type
== 295 && !dmgtype(ptr
, AD_VULN
)) || (type
== 296 && !dmgtype(ptr
, AD_FUMB
)) || (type
== 297 && !dmgtype(ptr
, AD_DIMN
)) || (type
== 298 && !dmgtype(ptr
, AD_AMNE
)) || (type
== 299 && !dmgtype(ptr
, AD_ICEB
)) || (type
== 300 && !dmgtype(ptr
, AD_VAPO
)) || (type
== 301 && !dmgtype(ptr
, AD_EDGE
)) || (type
== 302 && !dmgtype(ptr
, AD_VOMT
)) || (type
== 303 && !dmgtype(ptr
, AD_LITT
)) || (type
== 304 && !dmgtype(ptr
, AD_FREN
)) || (type
== 305 && !dmgtype(ptr
, AD_NGEN
)) || (type
== 306 && !dmgtype(ptr
, AD_CHAO
)) || (type
== 307 && !dmgtype(ptr
, AD_INSA
)) || (type
== 308 && !dmgtype(ptr
, AD_TRAP
)) || (type
== 309 && !dmgtype(ptr
, AD_WGHT
)) || (type
== 310 && !dmgtype(ptr
, AD_NTHR
)) || (type
== 311 && !dmgtype(ptr
, AD_MIDI
)) || (type
== 312 && !dmgtype(ptr
, AD_RNG
)) || (type
== 313 && !dmgtype(ptr
, AD_CAST
)) || (type
== 314 && !(ptr
->mflags4
& M4_BAT
)) || (type
== 315 && !(ptr
->mflags4
& M4_REVIVE
)) || (type
== 316 && !(ptr
->mflags4
& M4_RAT
)) || (type
== 317 && !(ptr
->mflags4
& M4_SHADE
)) || (type
== 318 && !(ptr
->mflags4
& M4_REFLECT
)) || (type
== 319 && !(ptr
->mflags4
& M4_MULTIHUED
)) || (type
== 320 && !(ptr
->mflags4
& M4_TAME
)) || (type
== 321 && !(ptr
->mflags4
& M4_ORGANIVORE
)) || (type
== 322 && !(ptr
->mflags5
& M5_SPACEWARS
)) || (type
== 323 && !(ptr
->mflags5
& M5_JOKE
)) || (type
== 324 && !(ptr
->mflags5
& M5_ANGBAND
)) || (type
== 325 && !(ptr
->mflags5
& M5_STEAMBAND
)) || (type
== 326 && !(ptr
->mflags5
& M5_ANIMEBAND
)) || (type
== 327 && !(ptr
->mflags5
& M5_DIABLO
)) || (type
== 328 && !(ptr
->mflags5
& M5_DLORDS
)) || (type
== 329 && !(ptr
->mflags5
& M5_VANILLA
)) || (type
== 330 && !(ptr
->mflags5
& M5_DNETHACK
)) || (type
== 331 && !(ptr
->mflags5
& M5_RANDOMIZED
)) || (type
== 332 && !(ptr
->msound
== MS_SHOE
)) || (type
== 333 && !(ptr
->msound
== MS_STENCH
)) || (type
== 334 && !dmgtype(ptr
, AD_ALIN
)) || (type
== 335 && !dmgtype(ptr
, AD_SIN
)) || (type
== 336 && !dmgtype(ptr
, AD_MINA
)) || (type
== 337 && !dmgtype(ptr
, AD_CONT
)) || (type
== 338 && !dmgtype(ptr
, AD_AGGR
)) || (type
== 339 && !(ptr
->mflags5
& M5_JONADAB
)) || (type
== 340 && !dmgtype(ptr
, AD_DATA
)) || (type
== 341 && !(ptr
->mflags5
& M5_EVIL
)) || (type
== 342 && !(ptr
->mflags4
& M4_SHAPESHIFT
)) || (type
== 343 && !(ptr
->mflags4
& M4_GRIDBUG
)) || (type
== 344 && !dmgtype(ptr
, AD_DEST
)) || (type
== 345 && !dmgtype(ptr
, AD_TREM
)) || (type
== 346 && !dmgtype(ptr
, AD_RAGN
)) || (type
== 347 && !(ptr
->msound
== MS_CONVERT
)) || (type
== 348 && !(ptr
->msound
== MS_HCALIEN
)) || (type
== 349 && !dmgtype(ptr
, AD_IDAM
)) || (type
== 350 && !dmgtype(ptr
, AD_ANTI
)) || (type
== 351 && !dmgtype(ptr
, AD_PAIN
)) || (type
== 352 && !dmgtype(ptr
, AD_TECH
)) || (type
== 353 && !dmgtype(ptr
, AD_MEMO
)) || (type
== 354 && !dmgtype(ptr
, AD_TRAI
)) || (type
== 355 && !dmgtype(ptr
, AD_STAT
)) || (type
== 356 && !dmgtype(ptr
, AD_DAMA
)) || (type
== 357 && !dmgtype(ptr
, AD_THIE
)) || (type
== 358 && !dmgtype(ptr
, AD_PART
)) || (type
== 359 && !dmgtype(ptr
, AD_RUNS
)) || (type
== 360 && !attacktype(ptr
, AT_RATH
)) || (type
== 361 && !(ptr
->mflags5
& M5_ELONA
)) || (type
== 362 && !dmgtype(ptr
, AD_NACU
)) || (type
== 363 && !dmgtype(ptr
, AD_SANI
)) || (type
== 364 && !dmgtype(ptr
, AD_RBAD
)) || (type
== 365 && !dmgtype(ptr
, AD_BLEE
)) || (type
== 366 && !dmgtype(ptr
, AD_SHAN
)) || (type
== 367 && !dmgtype(ptr
, AD_SCOR
)) || (type
== 368 && !dmgtype(ptr
, AD_TERR
)) || (type
== 369 && !dmgtype(ptr
, AD_FEMI
)) || (type
== 370 && !dmgtype(ptr
, AD_LEVI
)) || (type
== 371 && !dmgtype(ptr
, AD_ILLU
)) || (type
== 372 && !dmgtype(ptr
, AD_MCRE
)) || (type
== 373 && !dmgtype(ptr
, AD_FLAM
)) || (type
== 374 && !dmgtype(ptr
, AD_DEBU
)) || (type
== 375 && !dmgtype(ptr
, AD_UNPR
)) || (type
== 376 && !dmgtype(ptr
, AD_NIVE
)) || (type
== 377 && !dmgtype(ptr
, AD_TDRA
)) || (type
== 378 && !dmgtype(ptr
, AD_BLAS
)) || (type
== 379 && !dmgtype(ptr
, AD_DROP
)) || (type
== 380 && !(ptr
->mflags6
& M6_FLEE
)) || (type
== 381 && !(ptr
->mflags6
& M6_RANDWALK
)) || (type
== 382 && !(ptr
->msound
== MS_CASINO
)) || (type
== 383 && !(ptr
->msound
== MS_GIBBERISH
)) || (type
== 384 && !(ptr
->msound
== MS_GLYPHS
)) || (type
== 385 && !(ptr
->msound
== MS_SOCKS
)) || (type
== 386 && !(ptr
->msound
== MS_PANTS
)) || (type
== 387 && !(ptr
->msound
== MS_HANDY
)) || (type
== 388 && !(ptr
->msound
== MS_CAR
)) || (type
== 389 && !(ptr
->msound
== MS_JAPANESE
)) || (type
== 390 && !(ptr
->msound
== MS_SOVIET
)) || (type
== 391 && !(ptr
->msound
== MS_SNORE
)) || (type
== 392 && !(ptr
->msound
== MS_PHOTO
)) || (type
== 393 && !(ptr
->msound
== MS_REPAIR
)) || (type
== 394 && !(ptr
->msound
== MS_DRUGS
)) || (type
== 395 && !(ptr
->msound
== MS_COMBAT
)) || (type
== 396 && !(ptr
->msound
== MS_MUTE
)) || (type
== 397 && !(ptr
->msound
== MS_CORONA
)) || (type
== 398 && !(ptr
->msound
== MS_TRUMPET
)) || (type
== 399 && !(ptr
->msound
== MS_PAIN
)) || (type
== 400 && !(ptr
->msound
== MS_BRAG
)) || (type
== 401 && !(ptr
->msound
== MS_PRINCESSLEIA
)) || (type
== 402 && !(ptr
->msound
== MS_SISSY
)) || (type
== 403 && !(ptr
->msound
== MS_SING
)) || (type
== 404 && !(ptr
->msound
== MS_ALLA
)) || (type
== 405 && !(ptr
->msound
== MS_POKEDEX
)) || (type
== 406 && !(ptr
->msound
== MS_BOT
)) || (type
== 407 && !(ptr
->msound
== MS_APOC
)) || (type
== 408 && !(ptr
->msound
== MS_LIEDER
)) || (type
== 409 && !(ptr
->msound
== MS_GAARDIEN
)) || (type
== 410 && !(ptr
->msound
== MS_MISSING
)) || (type
== 411 && !(ptr
->msound
== MS_SELFHARM
)) || (type
== 412 && !(ptr
->msound
== MS_CLOCK
)) || (type
== 413 && !(ptr
->msound
== MS_OHGOD
)) || (type
== 414 && !(ptr
->msound
== MS_WOLLOH
)) || (type
== 415 && !(ptr
->msound
== MS_CODE
)) || (type
== 416 && !(ptr
->msound
== MS_BARBER
)) || (type
== 417 && !(ptr
->msound
== MS_AREOLA
)) || (type
== 418 && !(ptr
->msound
== MS_STABILIZE
)) || (type
== 419 && !(ptr
->msound
== MS_ESCAPE
)) || (type
== 420 && !(ptr
->msound
== MS_FEARHARE
)) || (type
== 421 && !(ptr
->msound
== MS_SPOILER
)) || (type
== 422 && !(ptr
->msound
== MS_DEAD
)) || (type
== 423 && !(ptr
->msound
== MS_TREESQUAD
)) || (type
== 424 && !(ptr
->msound
== MS_METALMAFIA
)) || (type
== 425 && !(ptr
->msound
== MS_DEEPSTATE
)) || (type
== 426 && !(ptr
->mflags5
& M5_AOE
)) || (type
== 427 && !(ptr
->mflags5
& M5_ELDERSCROLLS
)) || (type
== 428 && !dmgtype(ptr
, AD_INVE
)) || (type
== 429 && !dmgtype(ptr
, AD_WNCE
)) || (type
== 430 && !dmgtype(ptr
, AD_DEBT
)) || (type
== 431 && !dmgtype(ptr
, AD_SWAP
)) || (type
== 432 && !dmgtype(ptr
, AD_TPTO
)) || (type
== 433 && !(ptr
->mflags5
& M5_CHATGPT
)) || (type
== 434 && !(ptr
->mflags5
& M5_CDDA
)) ) && (ct
< 250000) ) );
2526 speedymon() /* returns a monster whose speed is at least 18 */
2529 register struct permonst
*ptr
;
2530 register int ct
= 0;
2538 if (ct
&& (ct
% 10000 == 0)) u
.mondiffhack
++;
2539 if (!rn2(2000)) reset_rndmonst(NON_PM
);
2541 } while ( !ptr
|| ((ptr
->mmove
< 18) && (ct
< 250000) ));
2552 if (u
.tensionmonster
< 6) return (mkclass(S_ANT
,0));
2553 else if (u
.tensionmonster
< 9) return (mkclass(S_BLOB
,0));
2554 else if (u
.tensionmonster
< 11) return (mkclass(S_COCKATRICE
,0));
2555 else if (u
.tensionmonster
< 15) return (mkclass(S_DOG
,0));
2556 else if (u
.tensionmonster
< 18) return (mkclass(S_EYE
,0));
2557 else if (u
.tensionmonster
< 22) return (mkclass(S_FELINE
,0));
2558 else if (u
.tensionmonster
< 24) return (mkclass(S_GREMLIN
,0));
2559 else if (u
.tensionmonster
< 29) return (mkclass(S_HUMANOID
,0));
2560 else if (u
.tensionmonster
< 33) return (mkclass(S_IMP
,0));
2561 else if (u
.tensionmonster
< 36) return (mkclass(S_JELLY
,0));
2562 else if (u
.tensionmonster
< 41) return (mkclass(S_KOBOLD
,0));
2563 else if (u
.tensionmonster
< 44) return (mkclass(S_LEPRECHAUN
,0));
2564 else if (u
.tensionmonster
< 47) return (mkclass(S_MIMIC
,0));
2565 else if (u
.tensionmonster
< 50) return (mkclass(S_NYMPH
,0));
2566 else if (u
.tensionmonster
< 54) return (mkclass(S_ORC
,0));
2567 else if (u
.tensionmonster
< 55) return (mkclass(S_PIERCER
,0));
2568 else if (u
.tensionmonster
< 58) return (mkclass(S_QUADRUPED
,0));
2569 else if (u
.tensionmonster
< 62) return (mkclass(S_RODENT
,0));
2570 else if (u
.tensionmonster
< 65) return (mkclass(S_SPIDER
,0));
2571 else if (u
.tensionmonster
< 66) return (mkclass(S_TRAPPER
,0));
2572 else if (u
.tensionmonster
< 69) return (mkclass(S_UNICORN
,0));
2573 else if (u
.tensionmonster
< 71) return (mkclass(S_VORTEX
,0));
2574 else if (u
.tensionmonster
< 73) return (mkclass(S_WORM
,0));
2575 else if (u
.tensionmonster
< 75) return (mkclass(S_XAN
,0));
2576 else if (u
.tensionmonster
< 76) return (mkclass(S_LIGHT
,0));
2577 else if (u
.tensionmonster
< 77) return (mkclass(S_ZOUTHERN
,0));
2578 else if (u
.tensionmonster
< 78) return (mkclass(S_ANGEL
,0));
2579 else if (u
.tensionmonster
< 81) return (mkclass(S_BAT
,0));
2580 else if (u
.tensionmonster
< 83) return (mkclass(S_CENTAUR
,0));
2581 else if (u
.tensionmonster
< 86) return (mkclass(S_DRAGON
,0));
2582 else if (u
.tensionmonster
< 89) return (mkclass(S_ELEMENTAL
,0));
2583 else if (u
.tensionmonster
< 94) return (mkclass(S_FUNGUS
,0));
2584 else if (u
.tensionmonster
< 99) return (mkclass(S_GNOME
,0));
2585 else if (u
.tensionmonster
< 102) return (mkclass(S_GIANT
,0));
2586 else if (u
.tensionmonster
< 103) return (mkclass(S_JABBERWOCK
,0));
2587 else if (u
.tensionmonster
< 104) return (mkclass(S_KOP
,0));
2588 else if (u
.tensionmonster
< 105) return (mkclass(S_LICH
,0));
2589 else if (u
.tensionmonster
< 108) return (mkclass(S_MUMMY
,0));
2590 else if (u
.tensionmonster
< 110) return (mkclass(S_NAGA
,0));
2591 else if (u
.tensionmonster
< 113) return (mkclass(S_OGRE
,0));
2592 else if (u
.tensionmonster
< 115) return (mkclass(S_PUDDING
,0));
2593 else if (u
.tensionmonster
< 116) return (mkclass(S_QUANTMECH
,0));
2594 else if (u
.tensionmonster
< 118) return (mkclass(S_RUSTMONST
,0));
2595 else if (u
.tensionmonster
< 121) return (mkclass(S_SNAKE
,0));
2596 else if (u
.tensionmonster
< 123) return (mkclass(S_TROLL
,0));
2597 else if (u
.tensionmonster
< 124) return (mkclass(S_UMBER
,0));
2598 else if (u
.tensionmonster
< 125) return (mkclass(S_VAMPIRE
,0));
2599 else if (u
.tensionmonster
< 127) return (mkclass(S_WRAITH
,0));
2600 else if (u
.tensionmonster
< 128) return (mkclass(S_XORN
,0));
2601 else if (u
.tensionmonster
< 130) return (mkclass(S_YETI
,0));
2602 else if (u
.tensionmonster
< 135) return (mkclass(S_ZOMBIE
,0));
2603 else if (u
.tensionmonster
< 145) return (mkclass(S_HUMAN
,0));
2604 else if (u
.tensionmonster
< 147) return (mkclass(S_GHOST
,0));
2605 else if (u
.tensionmonster
< 149) return (mkclass(S_GOLEM
,0));
2606 else if (u
.tensionmonster
< 152) return (mkclass(S_DEMON
,0));
2607 else if (u
.tensionmonster
< 155) return (mkclass(S_EEL
,0));
2608 else if (u
.tensionmonster
< 160) return (mkclass(S_LIZARD
,0));
2609 else if (u
.tensionmonster
< 162) return (mkclass(S_BAD_FOOD
,0));
2610 else if (u
.tensionmonster
< 165) return (mkclass(S_BAD_COINS
,0));
2611 else if (u
.tensionmonster
< 166) {if (u
.tensionmonsteX
< 95) return (mkclass(S_HUMAN
,0));
2612 else return (mkclass(S_NEMESE
,0));
2614 else if (u
.tensionmonster
< 171) return (mkclass(S_GRUE
,0));
2615 else if (u
.tensionmonster
< 176) return (mkclass(S_WALLMONST
,0));
2616 else if (u
.tensionmonster
< 180) return (mkclass(S_RUBMONST
,0));
2617 else if (u
.tensionmonster
< 181) {if (u
.tensionmonsteX
< 99) return (mkclass(S_HUMAN
,0));
2618 else return (mkclass(S_ARCHFIEND
,0));
2620 else if (u
.tensionmonster
< 186) return (mkclass(S_TURRET
,0));
2621 else if (u
.tensionmonster
< 187) return (mkclass(S_FLYFISH
,0));
2622 else return ((struct permonst
*)0);
2628 if (u
.tensionmonsterB
< 6) return (mkclass(S_ANT
,0));
2629 else if (u
.tensionmonsterB
< 9) return (mkclass(S_BLOB
,0));
2630 else if (u
.tensionmonsterB
< 11) return (mkclass(S_COCKATRICE
,0));
2631 else if (u
.tensionmonsterB
< 15) return (mkclass(S_DOG
,0));
2632 else if (u
.tensionmonsterB
< 18) return (mkclass(S_EYE
,0));
2633 else if (u
.tensionmonsterB
< 22) return (mkclass(S_FELINE
,0));
2634 else if (u
.tensionmonsterB
< 24) return (mkclass(S_GREMLIN
,0));
2635 else if (u
.tensionmonsterB
< 29) return (mkclass(S_HUMANOID
,0));
2636 else if (u
.tensionmonsterB
< 33) return (mkclass(S_IMP
,0));
2637 else if (u
.tensionmonsterB
< 36) return (mkclass(S_JELLY
,0));
2638 else if (u
.tensionmonsterB
< 41) return (mkclass(S_KOBOLD
,0));
2639 else if (u
.tensionmonsterB
< 44) return (mkclass(S_LEPRECHAUN
,0));
2640 else if (u
.tensionmonsterB
< 47) return (mkclass(S_MIMIC
,0));
2641 else if (u
.tensionmonsterB
< 50) return (mkclass(S_NYMPH
,0));
2642 else if (u
.tensionmonsterB
< 54) return (mkclass(S_ORC
,0));
2643 else if (u
.tensionmonsterB
< 55) return (mkclass(S_PIERCER
,0));
2644 else if (u
.tensionmonsterB
< 58) return (mkclass(S_QUADRUPED
,0));
2645 else if (u
.tensionmonsterB
< 62) return (mkclass(S_RODENT
,0));
2646 else if (u
.tensionmonsterB
< 65) return (mkclass(S_SPIDER
,0));
2647 else if (u
.tensionmonsterB
< 66) return (mkclass(S_TRAPPER
,0));
2648 else if (u
.tensionmonsterB
< 69) return (mkclass(S_UNICORN
,0));
2649 else if (u
.tensionmonsterB
< 71) return (mkclass(S_VORTEX
,0));
2650 else if (u
.tensionmonsterB
< 73) return (mkclass(S_WORM
,0));
2651 else if (u
.tensionmonsterB
< 75) return (mkclass(S_XAN
,0));
2652 else if (u
.tensionmonsterB
< 76) return (mkclass(S_LIGHT
,0));
2653 else if (u
.tensionmonsterB
< 77) return (mkclass(S_ZOUTHERN
,0));
2654 else if (u
.tensionmonsterB
< 78) return (mkclass(S_ANGEL
,0));
2655 else if (u
.tensionmonsterB
< 81) return (mkclass(S_BAT
,0));
2656 else if (u
.tensionmonsterB
< 83) return (mkclass(S_CENTAUR
,0));
2657 else if (u
.tensionmonsterB
< 86) return (mkclass(S_DRAGON
,0));
2658 else if (u
.tensionmonsterB
< 89) return (mkclass(S_ELEMENTAL
,0));
2659 else if (u
.tensionmonsterB
< 94) return (mkclass(S_FUNGUS
,0));
2660 else if (u
.tensionmonsterB
< 99) return (mkclass(S_GNOME
,0));
2661 else if (u
.tensionmonsterB
< 102) return (mkclass(S_GIANT
,0));
2662 else if (u
.tensionmonsterB
< 103) return (mkclass(S_JABBERWOCK
,0));
2663 else if (u
.tensionmonsterB
< 104) return (mkclass(S_KOP
,0));
2664 else if (u
.tensionmonsterB
< 105) return (mkclass(S_LICH
,0));
2665 else if (u
.tensionmonsterB
< 108) return (mkclass(S_MUMMY
,0));
2666 else if (u
.tensionmonsterB
< 110) return (mkclass(S_NAGA
,0));
2667 else if (u
.tensionmonsterB
< 113) return (mkclass(S_OGRE
,0));
2668 else if (u
.tensionmonsterB
< 115) return (mkclass(S_PUDDING
,0));
2669 else if (u
.tensionmonsterB
< 116) return (mkclass(S_QUANTMECH
,0));
2670 else if (u
.tensionmonsterB
< 118) return (mkclass(S_RUSTMONST
,0));
2671 else if (u
.tensionmonsterB
< 121) return (mkclass(S_SNAKE
,0));
2672 else if (u
.tensionmonsterB
< 123) return (mkclass(S_TROLL
,0));
2673 else if (u
.tensionmonsterB
< 124) return (mkclass(S_UMBER
,0));
2674 else if (u
.tensionmonsterB
< 125) return (mkclass(S_VAMPIRE
,0));
2675 else if (u
.tensionmonsterB
< 127) return (mkclass(S_WRAITH
,0));
2676 else if (u
.tensionmonsterB
< 128) return (mkclass(S_XORN
,0));
2677 else if (u
.tensionmonsterB
< 130) return (mkclass(S_YETI
,0));
2678 else if (u
.tensionmonsterB
< 135) return (mkclass(S_ZOMBIE
,0));
2679 else if (u
.tensionmonsterB
< 145) return (mkclass(S_HUMAN
,0));
2680 else if (u
.tensionmonsterB
< 147) return (mkclass(S_GHOST
,0));
2681 else if (u
.tensionmonsterB
< 149) return (mkclass(S_GOLEM
,0));
2682 else if (u
.tensionmonsterB
< 152) return (mkclass(S_DEMON
,0));
2683 else if (u
.tensionmonsterB
< 155) return (mkclass(S_EEL
,0));
2684 else if (u
.tensionmonsterB
< 160) return (mkclass(S_LIZARD
,0));
2685 else if (u
.tensionmonsterB
< 162) return (mkclass(S_BAD_FOOD
,0));
2686 else if (u
.tensionmonsterB
< 165) return (mkclass(S_BAD_COINS
,0));
2687 else if (u
.tensionmonsterB
< 166) {if (u
.tensionmonsteX
< 95) return (mkclass(S_HUMAN
,0));
2688 else return (mkclass(S_NEMESE
,0));
2690 else if (u
.tensionmonsterB
< 171) return (mkclass(S_GRUE
,0));
2691 else if (u
.tensionmonsterB
< 176) return (mkclass(S_WALLMONST
,0));
2692 else if (u
.tensionmonsterB
< 180) return (mkclass(S_RUBMONST
,0));
2693 else if (u
.tensionmonsterB
< 181) {if (u
.tensionmonsteX
< 99) return (mkclass(S_HUMAN
,0));
2694 else return (mkclass(S_ARCHFIEND
,0));
2696 else if (u
.tensionmonsterB
< 186) return (mkclass(S_TURRET
,0));
2697 else if (u
.tensionmonsterB
< 187) return (mkclass(S_FLYFISH
,0));
2698 else return ((struct permonst
*)0);
2705 int maxdougdiff
= 2000; /* arbitrary */
2707 if (iszapem
&& In_ZAPM(&u
.uz
) && !(u
.zapemescape
)) {
2711 zapemlevel
.dnum
= dname_to_dnum("Space Base");
2712 zapemlevel
.dlevel
= dungeons
[zapemlevel
.dnum
].entry_lev
;
2713 zapemdepth
= depth(&zapemlevel
);
2715 depthuz
= (1 + depth(&u
.uz
) - zapemdepth
);
2716 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2718 } else if (u
.preversionmode
&& !u
.preversionescape
&& In_greencross(&u
.uz
)) {
2720 d_level preverlevel
;
2722 preverlevel
.dnum
= dname_to_dnum("Green Cross");
2723 preverlevel
.dlevel
= dungeons
[preverlevel
.dnum
].entry_lev
;
2724 preverdepth
= depth(&preverlevel
);
2726 depthuz
= (1 + depth(&u
.uz
) - preverdepth
);
2727 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2729 depthuz
= depth(&u
.uz
);
2732 if ((depthuz
< 10) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (8 + rn2(3)))) {
2733 maxdougdiff
= depthuz
;
2737 if (i
> 55) return((maxdougdiff
< 12) ? &mons
[PM_TRAIL_BEAST
] : &mons
[PM_RAVENOUS_BUGBLATTER_BEAST_OF_TRAAL
]);
2738 else if (i
> 54 && !rn2(10)) return((maxdougdiff
< 9) ? &mons
[PM_MRIVAN
] : &mons
[PM_MARVIN
]);
2739 else if (i
> 46) return(&mons
[PM_CREEPING___
]);
2740 else if (i
> 26) return(&mons
[PM_MICROSCOPIC_SPACE_FLEET
]);
2741 else if (i
> 20) return((maxdougdiff
< 4) ? &mons
[PM_BIRDON
] : !rn2(5) ? &mons
[PM_STUNOGON
] : &mons
[PM_VOGON
]);
2742 else if (i
> 19) return((maxdougdiff
< 14) ? &mons
[PM_BIRDON
] : &mons
[PM_VOGON_LORD
]);
2743 else if (i
> 2) return(&mons
[PM_BABELFISH
]);
2744 else return((maxdougdiff
< 8) ? &mons
[PM_MOONTIGER
] : &mons
[PM_ALGOLIAN_SUNTIGER
]);
2752 if (i
> 112) return((level_difficulty() > 40) ? &mons
[PM_NEUROBEE
] : &mons
[PM_KILLER_BEE
]);
2753 else if (i
> 111) return((level_difficulty() > 15) ? &mons
[PM_VORACIOUS_FORCE_BEE
] : &mons
[PM_KILLER_BEE
]);
2754 else if (i
> 110) return((level_difficulty() > 15) ? &mons
[PM_THWARTER_BEE
] : &mons
[PM_KILLER_BEE
]);
2755 else if (i
> 108) return((level_difficulty() > 15) ? &mons
[PM_VORACIOUS_BEE
] : &mons
[PM_KILLER_BEE
]);
2756 else if (i
> 107) return((level_difficulty() > 9) ? &mons
[PM_HIGHBEE
] : &mons
[PM_KILLER_BEE
]);
2757 else if (i
> 106) return(((level_difficulty() > 9) && !rn2(50)) ? &mons
[PM_BAN_BEE
] : &mons
[PM_KILLER_BEE
]);
2758 else if (i
> 105) return((level_difficulty() > 6) ? (rn2(5) ? &mons
[PM_ZOMBEE
] : &mons
[PM_SPIKE_ZOMBEE
]) : &mons
[PM_KILLER_BEE
]);
2759 else if (i
> 104) return((level_difficulty() > 6) ? &mons
[PM_FUMBLEBEE
] : &mons
[PM_KILLER_BEE
]);
2760 else if (i
> 96) return((level_difficulty() > 6) ? &mons
[PM_WING_BEE
] : &mons
[PM_KILLER_BEE
]);
2761 else if (i
> 88) return((level_difficulty() > 6) ? &mons
[PM_TWIN_BEE
] : &mons
[PM_KILLER_BEE
]);
2762 else if (i
> 87) return((level_difficulty() > 6) ? &mons
[PM_WEREKILLERBEE
] : &mons
[PM_KILLER_BEE
]);
2763 else if (i
> 86) return((level_difficulty() > 5) ? &mons
[PM_GIANT_JELLY_BEE
] : &mons
[PM_KILLER_BEE
]);
2764 else if (i
> 85) return((level_difficulty() > 5) ? &mons
[PM_CARCOSAN_BEE
] : &mons
[PM_KILLER_BEE
]);
2765 else if (i
> 84) return((level_difficulty() > 5) ? &mons
[PM_SPIKE_BEE
] : &mons
[PM_KILLER_BEE
]);
2766 else if (i
> 74) return((level_difficulty() > 5) ? &mons
[PM_GIANT_KILLER_BEE
] : &mons
[PM_KILLER_BEE
]);
2767 else if (i
> 73) return((level_difficulty() > 3) ? &mons
[PM_SHARP_BEE
] : &mons
[PM_KILLER_BEE
]);
2768 else if (i
> 71) return((level_difficulty() > 3) ? &mons
[PM_STUNNING_BEE
] : &mons
[PM_KILLER_BEE
]);
2769 else if (i
> 61) return(&mons
[PM_THORN_BEE
]);
2770 else if (i
> 60) return(&mons
[PM_BOTULISM_BEE
]);
2771 else if (i
> 59) return(&mons
[PM_INJECTING_BEE
]);
2772 else if (i
> 58) return(&mons
[PM_HUNTER_BEE
]);
2773 else if (i
> 57) return(&mons
[PM_BUMBLEBEE
]);
2774 else if (i
> 56) return(&mons
[PM_WEREBEE
]);
2775 else if (i
> 55) return(&mons
[PM_HONEY_BEE
]);
2776 else if (i
> 54) return(&mons
[PM_WAX_BEE
]);
2777 else if (i
> 53) return(&mons
[PM_JELLY_BEE
]);
2778 else if (i
> 50) return(&mons
[PM_AGGRESSIVE_BEE
]);
2779 else return(&mons
[PM_KILLER_BEE
]);
2788 if (iszapem
&& In_ZAPM(&u
.uz
) && !(u
.zapemescape
)) {
2792 zapemlevel
.dnum
= dname_to_dnum("Space Base");
2793 zapemlevel
.dlevel
= dungeons
[zapemlevel
.dnum
].entry_lev
;
2794 zapemdepth
= depth(&zapemlevel
);
2796 depthuz
= (1 + depth(&u
.uz
) - zapemdepth
);
2797 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2799 } else if (u
.preversionmode
&& !u
.preversionescape
&& In_greencross(&u
.uz
)) {
2801 d_level preverlevel
;
2803 preverlevel
.dnum
= dname_to_dnum("Green Cross");
2804 preverlevel
.dlevel
= dungeons
[preverlevel
.dnum
].entry_lev
;
2805 preverdepth
= depth(&preverlevel
);
2807 depthuz
= (1 + depth(&u
.uz
) - preverdepth
);
2808 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2810 depthuz
= depth(&u
.uz
);
2813 if ((depthuz
< 10) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (5 + rn2(5)))) return (&mons
[PM_LITTLE_MIGO
]);
2815 if (rn2(3)) return (!rn2(3) ? &mons
[PM_MIGO_WARRIOR
] : &mons
[PM_MIGO_DRONE
]);
2816 else if (!rn2(4)) return (rn2(2) ? &mons
[PM_MIGO_FORCE_DRONE
] : &mons
[PM_ARMED_MIGO_DRONE
]);
2817 else switch (rnd(18)) {
2820 return &mons
[PM_MIGO_DRONE
];
2822 return &mons
[PM_MIGO_FORCE_DRONE
];
2824 return &mons
[PM_PETTY_MIGO_DRONE
];
2826 return &mons
[PM_ARMED_MIGO_DRONE
];
2828 return &mons
[PM_MIGO_WARRIOR
];
2830 return &mons
[PM_ARMED_MIGO_WARRIOR
];
2832 if (level_difficulty() > 14) return &mons
[PM_MIGO_QUEEN
];
2833 else return &mons
[PM_MIGO_WARRIOR
];
2835 if (level_difficulty() > 14) return &mons
[PM_ARMED_MIGO_QUEEN
];
2836 else return &mons
[PM_MIGO_WARRIOR
];
2838 if (level_difficulty() > 25) return &mons
[PM_MIGO_EMPRESS
];
2839 else return &mons
[PM_MIGO_WARRIOR
];
2841 return &mons
[PM_MI_GO__THE_FUNGI_FROM_YUGGOTH
];
2843 return &mons
[PM_GOMI_WORKER
];
2845 return &mons
[PM_GOMI_SOLDIER
];
2847 return &mons
[PM_GOMI_PHILOSOPHER
];
2849 if (level_difficulty() > 14) return &mons
[PM_GOMI_QUEEN
];
2850 else return &mons
[PM_MIGO_WARRIOR
];
2852 return &mons
[PM_MI_GO_OPERATOR
];
2854 return &mons
[PM_MIGO_DRONL
];
2856 return &mons
[PM_MIGO_WORRIORTYPE
];
2858 if (level_difficulty() > 14) return &mons
[PM_MIGO_BARONESS
];
2859 else return &mons
[PM_MIGO_WARRIOR
];
2861 return &mons
[PM_MIGO_DRONE
];
2871 if (iszapem
&& In_ZAPM(&u
.uz
) && !(u
.zapemescape
)) {
2875 zapemlevel
.dnum
= dname_to_dnum("Space Base");
2876 zapemlevel
.dlevel
= dungeons
[zapemlevel
.dnum
].entry_lev
;
2877 zapemdepth
= depth(&zapemlevel
);
2879 depthuz
= (1 + depth(&u
.uz
) - zapemdepth
);
2880 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2882 } else if (u
.preversionmode
&& !u
.preversionescape
&& In_greencross(&u
.uz
)) {
2884 d_level preverlevel
;
2886 preverlevel
.dnum
= dname_to_dnum("Green Cross");
2887 preverlevel
.dlevel
= dungeons
[preverlevel
.dnum
].entry_lev
;
2888 preverdepth
= depth(&preverlevel
);
2890 depthuz
= (1 + depth(&u
.uz
) - preverdepth
);
2891 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2893 depthuz
= depth(&u
.uz
);
2896 if ((depthuz
< 6) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (5 + rn2(2)))) {
2898 case 1: return(&mons
[PM_MONKEY
]);
2899 case 2: return(&mons
[PM_ROTHE
]);
2900 case 3: return(&mons
[PM_SMALL_LYNX
]);
2904 int i
= rn2(60 + (3*level_difficulty()) );
2905 if (i
> 175 && !rn2(50)) return(&mons
[PM_JUMBO_THE_ELEPHANT
]);
2906 else if (i
> 115) return(&mons
[PM_MASTODON
]);
2907 else if (i
> 85) return(&mons
[PM_PYTHON
]);
2908 else if (i
> 70) return(&mons
[PM_MUMAK
]);
2909 else if (i
> 60) return(&mons
[PM_TIGER
]);
2910 else if (i
> 55) return(&mons
[PM_LYNX
]);
2911 else if (i
> 45) return(&mons
[PM_PANTHER
]);
2912 else if (i
> 25) return(&mons
[PM_JAGUAR
]);
2913 else if (i
> 15) return(&mons
[PM_APE
]);
2914 else return(&mons
[PM_MONKEY
]);
2917 STATIC_OVL
struct permonst
*
2918 prisonermon() /* return random prisoner type --Amy */
2920 if (rn2(5)) return (&mons
[PM_PRISONER
]);
2921 else switch (rnd(9)) {
2922 case 1: return (&mons
[PM_CASTLE_PRISONER
]);
2923 case 2: return (&mons
[PM_OCCASIONAL_FRIEND
]);
2924 case 3: return (&mons
[PM_GIRL_OUTSIDE_GANG
]);
2925 case 4: return (&mons
[PM_YOUR_BROTHER
]);
2926 case 5: return (&mons
[PM_YOUR_SISTER
]);
2927 case 6: return (&mons
[PM_GRAVITY_STRIKER
]);
2928 case 7: return (&mons
[PM_POEZ_PRESIDENT
]);
2929 case 8: return (&mons
[PM_YLVA_PRISONER
]);
2930 case 9: return (&mons
[PM_ARCANE_PRISONER
]);
2932 return (&mons
[PM_PRISONER
]); /* fail safe */
2936 squadmon() /* return soldier types. */
2938 int sel_prob
, i
, mndx
;
2940 sel_prob
= rnd(80+level_difficulty());
2944 if (iszapem
&& In_ZAPM(&u
.uz
) && !(u
.zapemescape
)) {
2948 zapemlevel
.dnum
= dname_to_dnum("Space Base");
2949 zapemlevel
.dlevel
= dungeons
[zapemlevel
.dnum
].entry_lev
;
2950 zapemdepth
= depth(&zapemlevel
);
2952 depthuz
= (1 + depth(&u
.uz
) - zapemdepth
);
2953 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2955 } else if (u
.preversionmode
&& !u
.preversionescape
&& In_greencross(&u
.uz
)) {
2957 d_level preverlevel
;
2959 preverlevel
.dnum
= dname_to_dnum("Green Cross");
2960 preverlevel
.dlevel
= dungeons
[preverlevel
.dnum
].entry_lev
;
2961 preverdepth
= depth(&preverlevel
);
2963 depthuz
= (1 + depth(&u
.uz
) - preverdepth
);
2964 if (depthuz
< 1) depthuz
= 1; /* fail safe */
2966 depthuz
= depth(&u
.uz
);
2969 if ((depthuz
< 8) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (4 + rn2(2)))) {
2971 case 1: mndx
= PM_UNARMORED_SOLDIER
; break;
2972 case 2: mndx
= PM_WEAKISH_SOLDIER
; break;
2973 case 3: mndx
= PM_NEWBIE_SOLDIER
; break;
2974 case 4: mndx
= PM_LUSH_SOLDIER
; break;
2975 case 5: mndx
= PM_RECRUIT_SOLDIER
; break;
2980 if (!rn2(100)) { /* ChatGPT soldier types; higher-level ones are very powerful and therefore should be rare --Amy */
2984 mndx
= (PM_VANGUARD_TROOPER
+ rn2(10));
2987 mndx
= PM_SHADOW_COMMANDO
;
2990 mndx
= PM_ELITE_SENTINEL
;
2993 mndx
= rn2(2) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_ELITE_SENTINEL
;
2996 mndx
= rn2(3) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_STORMBREAKER_INFANTRY
;
2999 mndx
= (rn2(3) || (level_difficulty() < 11) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_VENOMOUS_OPERATIVE
;
3002 mndx
= (rn2(5) || (level_difficulty() < 13) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_CHAOS_REAVER
;
3005 mndx
= (rn2(5) || (level_difficulty() < 15) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_NOVA_SHOCK_TROOPER
;
3008 mndx
= (rn2(7) || (level_difficulty() < 17) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_LUNAR_WARDEN
;
3011 mndx
= (rn2(7) || (level_difficulty() < 21) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_DREADNOUGHT_MARINE
;
3014 mndx
= (rn2(10) || (level_difficulty() < 26) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_ARCTIC_BLADESTORM
;
3017 mndx
= (rn2(10) || (level_difficulty() < 31) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_RADIANT_GUARDIAN
;
3020 mndx
= (rn2(15) || (level_difficulty() < 36) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_EMBERSTRIKE_GUNNER
;
3023 mndx
= (rn2(15) || (level_difficulty() < 41) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_THUNDERCLAP_TROOPER
;
3026 mndx
= (rn2(21) || (level_difficulty() < 46) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_CELESTIAL_PARAGON
;
3029 mndx
= (rn2(21) || (level_difficulty() < 51) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_SOULFIRE_SENTINEL
;
3032 mndx
= (rn2(30) || (level_difficulty() < 53) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_SPECTRAL_ENFORCER
;
3035 mndx
= (rn2(30) || (level_difficulty() < 55) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_ABYSSAL_LEGIONNAIRE
;
3038 mndx
= (rn2(50) || (level_difficulty() < 56) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_CYBERNETIC_VANGUARD
;
3041 mndx
= (rn2(70) || (level_difficulty() < 57) ) ? (PM_VANGUARD_TROOPER
+ rn2(10)) : PM_ASTRAL_BLADEMASTER
;
3044 mndx
= PM_KUNG_FU_JESTER
;
3050 if (sel_prob
< 81) {
3052 case 1: mndx
= PM_SOLDIER
; break;
3053 case 2: mndx
= PM_TEUTON_SOLDIER
; break;
3054 case 3: mndx
= PM_FRANKISH_SOLDIER
; break;
3055 case 4: mndx
= PM_BRITISH_SOLDIER
; break;
3056 case 5: mndx
= PM_AMERICAN_SOLDIER
; break;
3057 case 6: mndx
= PM_ARAB_SOLDIER
; break;
3058 case 7: mndx
= PM_ASIAN_SOLDIER
; break;
3059 case 8: mndx
= PM_SEAFARING_SOLDIER
; break;
3060 case 9: mndx
= PM_BYZANTINE_SOLDIER
; break;
3061 case 10: mndx
= PM_CELTIC_SOLDIER
; break;
3062 case 11: mndx
= PM_VANILLA_SOLDIER
; break;
3063 case 12: mndx
= PM_VIKING_SOLDIER
; break;
3064 case 13: mndx
= PM_SWAMP_SOLDIER
; break;
3065 case 14: mndx
= PM_JAVA_SOLDIER
; break;
3066 case 15: mndx
= PM_IBERIAN_SOLDIER
; break;
3067 case 16: mndx
= PM_ROHIRRIM_SOLDIER
; break;
3068 case 17: mndx
= PM_GAUCHE_SOLDIER
; break;
3069 case 18: mndx
= PM_PAD_SOLDIER
; break;
3070 case 19: mndx
= PM_COPPER_SOLDIER
; break;
3071 case 20: mndx
= PM_VIDEO_SOLDIER
; break;
3072 case 21: mndx
= PM_MEDIEVAL_SOLDIER
; break;
3076 if (sel_prob
< 96) {
3078 case 1: mndx
= PM_SERGEANT
; break;
3079 case 2: mndx
= PM_EXTRATERRESTRIAL_SERGEANT
; break;
3080 case 3: mndx
= PM_MINOAN_SERGEANT
; break;
3081 case 4: mndx
= PM_HUN_SERGEANT
; break;
3082 case 5: mndx
= PM_MONGOL_SERGEANT
; break;
3083 case 6: mndx
= PM_PERSIAN_SERGEANT
; break;
3084 case 7: mndx
= PM_TWOWEAP_SERGEANT
; break;
3085 case 8: mndx
= PM_ORANGE_SERGEANT
; break;
3089 if (sel_prob
< 100) {
3091 case 1: mndx
= PM_LIEUTENANT
; break;
3092 case 2: mndx
= PM_YAMATO_LIEUTENANT
; break;
3093 case 3: mndx
= PM_CARTHAGE_LIEUTENANT
; break;
3094 case 4: mndx
= PM_ROMAN_LIEUTENANT
; break;
3099 /* instead of hundreds of captains, let's also spawn some of the ChatGPT ones --Amy */
3100 if (!rn2(2)) goto chatgptsoldiers
;
3102 /* generals are the very high-level soldier type; they should be rare --Amy */
3103 if (sel_prob
> 120 && !rn2(3)) {
3108 /* if we got here, the difficulty level is high enough, so make a captain --Amy */
3110 case 1: mndx
= PM_CAPTAIN
; break;
3111 case 2: mndx
= PM_GOTHIC_CAPTAIN
; break;
3112 case 3: mndx
= PM_URBAN_CAMO_CAPTAIN
; break;
3118 if (!(mvitals
[mndx
].mvflags
& G_GONE
)) return(&mons
[mndx
]);
3119 else return((struct permonst
*) 0);
3126 if (urole
.nemesnum
!= NON_PM
&& (monster_difficulty() >= mons
[urole
.nemesnum
].mlevel
) ) return (&mons
[urole
.nemesnum
]);
3131 if (urole
.enemy1num
!= NON_PM
&& (monster_difficulty() >= mons
[urole
.enemy1num
].mlevel
) ) return (&mons
[urole
.enemy1num
]);
3132 return (mkclass(urole
.enemy1sym
, 0));
3134 if (urole
.enemy2num
!= NON_PM
&& (monster_difficulty() >= mons
[urole
.enemy2num
].mlevel
)) return (&mons
[urole
.enemy2num
]);
3135 return (mkclass(urole
.enemy2sym
, 0));
3137 return (mkclass(urole
.enemy1sym
, 0));
3139 return (mkclass(urole
.enemy2sym
, 0));
3141 return (&mons
[PM_HUMAN
]); /* fail safe */
3149 return (mkclass(S_ANT
,0));
3151 return (mkclass(S_BLOB
,0));
3153 return (mkclass(S_COCKATRICE
,0));
3155 return (mkclass(S_DOG
,0));
3157 return (mkclass(S_EYE
,0));
3159 return (mkclass(S_FELINE
,0));
3161 return (mkclass(S_GREMLIN
,0));
3163 return (mkclass(S_HUMANOID
,0));
3165 return (mkclass(S_IMP
,0));
3167 return (mkclass(S_JELLY
,0));
3169 return (mkclass(S_KOBOLD
,0));
3171 return (mkclass(S_LEPRECHAUN
,0));
3173 return (mkclass(S_MIMIC
,0));
3175 return (mkclass(S_NYMPH
,0));
3177 return (mkclass(S_ORC
,0));
3179 return (mkclass(S_PIERCER
,0));
3181 return (mkclass(S_QUADRUPED
,0));
3183 return (mkclass(S_RODENT
,0));
3185 return (mkclass(S_SPIDER
,0));
3187 return (mkclass(S_TRAPPER
,0));
3189 return (mkclass(S_UNICORN
,0));
3191 return (mkclass(S_VORTEX
,0));
3193 return (mkclass(S_WORM
,0));
3195 return (mkclass(S_XAN
,0));
3197 return (mkclass(S_LIGHT
,0));
3199 return (mkclass(S_ZOUTHERN
,0));
3201 return (mkclass(S_ANGEL
,0));
3203 return (mkclass(S_BAT
,0));
3205 return (mkclass(S_CENTAUR
,0));
3207 return (mkclass(S_DRAGON
,0));
3209 return (mkclass(S_ELEMENTAL
,0));
3211 return (mkclass(S_FUNGUS
,0));
3213 return (mkclass(S_GNOME
,0));
3215 return (mkclass(S_GIANT
,0));
3217 return (mkclass(S_FLYFISH
,0));
3219 return (mkclass(S_JABBERWOCK
,0));
3221 return (mkclass(S_KOP
,0));
3223 return (mkclass(S_LICH
,0));
3225 return (mkclass(S_MUMMY
,0));
3227 return (mkclass(S_NAGA
,0));
3229 return (mkclass(S_OGRE
,0));
3231 return (mkclass(S_PUDDING
,0));
3233 return (mkclass(S_QUANTMECH
,0));
3235 return (mkclass(S_RUSTMONST
,0));
3237 return (mkclass(S_SNAKE
,0));
3239 return (mkclass(S_TROLL
,0));
3241 return (mkclass(S_UMBER
,0));
3243 return (mkclass(S_VAMPIRE
,0));
3245 return (mkclass(S_WRAITH
,0));
3247 return (mkclass(S_XORN
,0));
3249 return (mkclass(S_YETI
,0));
3251 return (mkclass(S_ZOMBIE
,0));
3253 return (&mons
[PM_HUMAN
]); /* fail safe */
3259 int i
= rn2(60 + (3*level_difficulty()) );
3263 if (iszapem
&& In_ZAPM(&u
.uz
) && !(u
.zapemescape
)) {
3267 zapemlevel
.dnum
= dname_to_dnum("Space Base");
3268 zapemlevel
.dlevel
= dungeons
[zapemlevel
.dnum
].entry_lev
;
3269 zapemdepth
= depth(&zapemlevel
);
3271 depthuz
= (1 + depth(&u
.uz
) - zapemdepth
);
3272 if (depthuz
< 1) depthuz
= 1; /* fail safe */
3274 } else if (u
.preversionmode
&& !u
.preversionescape
&& In_greencross(&u
.uz
)) {
3276 d_level preverlevel
;
3278 preverlevel
.dnum
= dname_to_dnum("Green Cross");
3279 preverlevel
.dlevel
= dungeons
[preverlevel
.dnum
].entry_lev
;
3280 preverdepth
= depth(&preverlevel
);
3282 depthuz
= (1 + depth(&u
.uz
) - preverdepth
);
3283 if (depthuz
< 1) depthuz
= 1; /* fail safe */
3285 depthuz
= depth(&u
.uz
);
3288 if ((depthuz
< 8) && !In_sokoban_real(&u
.uz
) && !In_mainframe(&u
.uz
) && (level_difficulty() < (4 + rn2(3)))) return(&mons
[PM_STUNTED_ZOMBIEMAN
]);
3290 if (rn2(4)) return(&mons
[PM_ZOMBIEMAN
]);
3291 else if (rn2(3)) return(&mons
[PM_FORMER_SERGEANT
]);
3292 else if (rn2(2) && i
> 90) return(&mons
[PM_WOLFENSTEINER
]);
3293 else if (rn2(2) && i
> 115) return(&mons
[PM_ARACHNOTRON
]);
3294 else if (rn2(2) && i
> 150) return(&mons
[PM_MANCUBUS
]);
3295 else return(&mons
[PM_ZOMBIEMAN
]);
3304 return specialtensmon(288); break; /* AD_SPC2 */
3306 return specialtensmon(203); break; /* AD_STUN */
3308 return specialtensmon(223); break; /* AD_DRIN */
3310 return specialtensmon(227); break; /* AD_HALU */
3312 return specialtensmon(239); break; /* AD_DARK */
3314 return specialtensmon(246); break; /* AD_FEAR */
3316 return specialtensmon(251); break; /* AD_FAKE */
3318 return specialtensmon(252); break; /* AD_LETH */
3320 return specialtensmon(253); break; /* AD_CNCL */
3322 return specialtensmon(254); break; /* AD_BANI */
3324 return specialtensmon(255); break; /* AD_WISD */
3326 return specialtensmon(264); break; /* AD_HODS */
3328 return specialtensmon(265); break; /* AD_CHRN */
3330 return specialtensmon(266); break; /* AD_WEEP */
3332 return specialtensmon(269); break; /* AD_STTP */
3334 return specialtensmon(270); break; /* AD_DEPR */
3336 return specialtensmon(272); break; /* AD_LAZY */
3338 return specialtensmon(278); break; /* AD_INER */
3340 return specialtensmon(295); break; /* AD_VULN */
3342 return specialtensmon(298); break; /* AD_AMNE */
3344 return specialtensmon(307); break; /* AD_INSA */
3346 return specialtensmon(308); break; /* AD_TRAP */
3348 return specialtensmon(342); break; /* M4_SHAPESHIFT */
3350 return specialtensmon(363); break; /* AD_SANI */
3352 return specialtensmon(366); break; /* AD_SHAN */
3354 return specialtensmon(368); break; /* AD_TERR */
3356 return specialtensmon(369); break; /* AD_FEMI */
3358 return specialtensmon(370); break; /* AD_LEVI */
3360 return specialtensmon(371); break; /* AD_ILLU */
3362 return specialtensmon(372); break; /* AD_MCRE */
3364 return specialtensmon(374); break; /* AD_DEBU */
3366 return specialtensmon(375); break; /* AD_UNPR */
3368 return specialtensmon(378); break; /* AD_BLAS */
3370 return specialtensmon(428); break; /* AD_INVE */
3372 return specialtensmon(429); break; /* AD_WNCE */
3374 return specialtensmon(288); break; /* AD_SPC2 */
3382 register struct permonst
*ptr
;
3383 register int ct
= 0;
3391 if (ct
&& (ct
% 10000 == 0)) u
.mondiffhack
++;
3392 if (!rn2(2000)) reset_rndmonst(NON_PM
);
3394 } while ( !ptr
|| ( (!dmgtype(ptr
, AD_DISN
) && !dmgtype(ptr
, AD_STON
) && !dmgtype(ptr
, AD_DETH
) && !dmgtype(ptr
, AD_PEST
) && !dmgtype(ptr
, AD_FAMN
) && !dmgtype(ptr
, AD_SLIM
) && !dmgtype(ptr
, AD_WTHR
) && !dmgtype(ptr
, AD_NPRO
) && !dmgtype(ptr
, AD_LAVA
) && !dmgtype(ptr
, AD_LETH
) && !dmgtype(ptr
, AD_CNCL
) && !dmgtype(ptr
, AD_BANI
) && !dmgtype(ptr
, AD_SHRD
) && !dmgtype(ptr
, AD_WET
) && !dmgtype(ptr
, AD_SUCK
) && !dmgtype(ptr
, AD_UVUU
) && !dmgtype(ptr
, AD_STTP
) && !dmgtype(ptr
, AD_DEPR
) && !dmgtype(ptr
, AD_WRAT
) && !dmgtype(ptr
, AD_DFOO
) && !dmgtype(ptr
, AD_TIME
) && !dmgtype(ptr
, AD_VENO
) && !dmgtype(ptr
, AD_VAPO
) && !dmgtype(ptr
, AD_EDGE
) && !dmgtype(ptr
, AD_LITT
) && !dmgtype(ptr
, AD_FREN
) && !dmgtype(ptr
, AD_NGEN
) && !dmgtype(ptr
, AD_CHAO
) && !dmgtype(ptr
, AD_DEST
) && !dmgtype(ptr
, AD_ANTI
) && !dmgtype(ptr
, AD_STAT
) && !dmgtype(ptr
, AD_RUNS
) && !dmgtype(ptr
, AD_DAMA
) && !dmgtype(ptr
, AD_THIE
) && !dmgtype(ptr
, AD_RAGN
) && !dmgtype(ptr
, AD_DATA
) && !dmgtype(ptr
, AD_MINA
) && !dmgtype(ptr
, AD_RBAD
) ) && (ct
< 250000) ));
3405 register struct permonst
*ptr
;
3406 register int ct
= 0;
3414 if (ct
&& (ct
% 10000 == 0)) u
.mondiffhack
++;
3415 if (!rn2(2000)) reset_rndmonst(NON_PM
);
3417 } while ( !ptr
|| (!nonliving(ptr
) && (ct
< 250000) ));
3426 * save_room : A recursive function that saves a room and its subrooms
3437 * Well, I really should write only useful information instead
3438 * of writing the whole structure. That is I should not write
3439 * the subrooms pointers, but who cares ?
3441 bwrite(fd
, (void *) r
, sizeof(struct mkroom
));
3442 for(i
=0; i
<r
->nsubrooms
; i
++)
3443 save_room(fd
, r
->sbrooms
[i
]);
3447 * save_rooms : Save all the rooms on disk!
3453 struct mkroom
*sroom
;
3455 register int sx
,sy
= 0;
3459 if(!(sroom
= pick_room(FALSE
))) return;
3461 sroom
->rtype
= TRAPROOM
;
3464 if (!rn2(4)) randomnes
= 1;
3466 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
3467 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
3469 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3470 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
3471 if((levl
[sx
][sy
].typ
> DBWALL
) && !t_at(sx
,sy
) /*&& !nexttodoor(sx,sy)*/) {
3473 (void) maketrap(sx
, sy
, rtrap
, 100, TRUE
);
3474 if (randomnes
== 1) rtrap
= rndtrap();
3482 struct mkroom
*sroom
;
3484 register int sx
,sy
= 0;
3488 if(!(sroom
= pick_room(FALSE
))) return;
3490 sroom
->rtype
= BOSSROOM
;
3492 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3493 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3495 if(!rn2(5) && !t_at(sx
, sy
))
3496 (void) maketrap(sx
, sy
, BOSS_SPAWNER
, 100, FALSE
);
3499 level
.flags
.has_bossroom
= 1;
3506 struct mkroom
*sroom
;
3507 register int sx
,sy
= 0;
3509 if (!(sroom
= pick_room(FALSE
))) return;
3511 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3513 sroom
->rtype
= NASTYCENTRAL
;
3515 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3516 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3517 (void) mksobj_at(rnd_class(RIGHT_MOUSE_BUTTON_STONE
, NASTY_STONE
), sx
, sy
, TRUE
, FALSE
, FALSE
);
3520 level
.flags
.has_nastycentral
= 1;
3527 struct mkroom
*sroom
;
3528 register int sx
,sy
= 0;
3530 if (!(sroom
= pick_room(FALSE
))) return;
3532 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3534 sroom
->rtype
= EMPTYDESERT
;
3536 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3537 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3538 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
3539 levl
[sx
][sy
].typ
= rn2(5) ? SAND
: SHIFTINGSAND
;
3543 level
.flags
.has_emptydesert
= 1;
3551 struct mkroom
*sroom
;
3552 register int sx
,sy
= 0;
3554 if (!(sroom
= pick_room(FALSE
))) return;
3556 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3558 sroom
->rtype
= CHAOSROOM
;
3560 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3561 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3562 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(10)) {
3563 levl
[sx
][sy
].typ
= randomwalltype();
3573 struct mkroom
*sroom
;
3574 register int sx
,sy
= 0;
3577 if (!(sroom
= pick_room(FALSE
))) return;
3579 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3581 sroom
->rtype
= MIXEDPOOL
;
3583 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3584 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3585 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(4)) {
3586 levl
[sx
][sy
].typ
= rn2(2) ? MOAT
: CRYSTALWATER
;
3590 if (somexy(sroom
, &mm
)) {
3591 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
3600 struct mkroom
*sroom
;
3601 register int sx
,sy
= 0;
3603 if (!(sroom
= pick_room(FALSE
))) return;
3605 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3607 sroom
->rtype
= SHOWERROOM
;
3609 level
.flags
.has_showerroom
= 1;
3611 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3612 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3613 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && rn2(3)) {
3614 levl
[sx
][sy
].typ
= rn2(2) ? BUBBLES
: RAINCLOUD
;
3624 struct mkroom
*sroom
;
3625 register int sx
,sy
= 0;
3627 if (!(sroom
= pick_room(FALSE
))) return;
3629 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3631 sroom
->rtype
= CENTRALTEDIUM
;
3633 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3634 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3635 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) ) {
3644 levl
[sx
][sy
].typ
= HIGHWAY
;
3648 levl
[sx
][sy
].typ
= GRASSLAND
;
3655 if((levl
[sx
][sy
].typ
> DBWALL
) && !t_at(sx
,sy
) ) {
3659 (void) maketrap(sx
, sy
, randominsidetrap(), 100, TRUE
);
3661 else (void) maketrap(sx
, sy
, LEVEL_TELEP
, 100, TRUE
);
3663 else (void) maketrap(sx
, sy
, TELEP_TRAP
, 100, TRUE
);
3676 struct mkroom
*sroom
;
3677 register int sx
,sy
= 0;
3679 if (!(sroom
= pick_room(FALSE
))) return;
3681 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3683 sroom
->rtype
= RAMPAGEROOM
;
3685 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3686 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++) {
3687 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !rn2(10)) {
3688 levl
[sx
][sy
].typ
= ROCKWALL
;
3691 if (!rn2(3)) (void) mksobj_at(BOULDER
, sx
, sy
, TRUE
, FALSE
, FALSE
);
3692 if (!rn2(3)) (void) maketrap(sx
, sy
, rndtrap(), 100, TRUE
);
3701 struct mkroom
*sroom
;
3703 register int sx
,sy
= 0;
3705 if (!(sroom
= pick_room(FALSE
))) return;
3707 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3709 sroom
->rtype
= POOLROOM
;
3711 typ
= !rn2(6) ? POOL
: !rn2(5) ? MOAT
: !rn2(8) ? ICE
: !rn2(14) ? GRASSLAND
: !rn2(25) ? SNOW
: !rn2(30) ? ASH
: !rn2(35) ? SAND
: !rn2(35) ? PAVEDFLOOR
: !rn2(50) ? HIGHWAY
: !rn2(45) ? GRAVEWALL
: !rn2(20) ? CLOUD
: !rn2(32) ? AIR
: !rn2(40) ? ROCKWALL
: !rn2(40) ? TREE
: !rn2(50) ? FARMLAND
: !rn2(75) ? NETHERMIST
: !rn2(100) ? STALACTITE
: !rn2(100) ? MOUNTAIN
: !rn2(60) ? IRONBARS
: !rn2(70) ? CRYSTALWATER
: !rn2(100) ? TUNNELWALL
: !rn2(150) ? WATERTUNNEL
: !rn2(100) ? MOORLAND
: !rn2(150) ? URINELAKE
: !rn2(200) ? SHIFTINGSAND
: !rn2(50) ? STYXRIVER
: !rn2(400) ? WOODENTABLE
: !rn2(800) ? CARVEDBED
: !rn2(300) ? STRAWMATTRESS
: !rn2(800) ? WELL
: !rn2(800) ? POISONEDWELL
: !rn2(800) ? WAGON
: !rn2(800) ? BURNINGWAGON
: !rn2(480) ? FOUNTAIN
: !rn2(60) ? CRYPTFLOOR
: !rn2(100) ? BUBBLES
: !rn2(80) ? RAINCLOUD
: !rn2(1000) ? PENTAGRAM
: !rn2(1000) ? THRONE
: !rn2(240) ? SINK
: !rn2(160) ? TOILET
: !rn2(80) ? GRAVE
: !rn2(1000) ? ALTAR
: LAVAPOOL
;
3713 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
3714 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
3716 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3717 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
3718 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !t_at(sx
,sy
) /*&& !nexttodoor(sx,sy)*/) {
3720 levl
[sx
][sy
].typ
= typ
;
3721 if (typ
== FOUNTAIN
) level
.flags
.nfountains
++;
3722 if (typ
== SINK
) level
.flags
.nsinks
++;
3727 level
.flags
.has_poolroom
= 1;
3734 struct mkroom
*sroom
;
3736 register int sx
,sy
= 0;
3739 register int tryct
= 0;
3740 register struct obj
*otmp
;
3742 if (!(sroom
= pick_room(FALSE
))) return;
3744 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3746 sroom
->rtype
= INSIDEROOM
;
3748 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
3749 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
3752 if (somexy(sroom
, &mm
))
3753 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
3756 if (somexy(sroom
, &mm
))
3757 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
3761 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3762 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
3763 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !t_at(sx
,sy
) /*&& !nexttodoor(sx,sy)*/) {
3765 typ
= !rn2(8) ? POOL
: !rn2(10) ? MOAT
: !rn2(9) ? ICE
: !rn2(20) ? GRASSLAND
: !rn2(50) ? SNOW
: !rn2(75) ? ASH
: !rn2(100) ? SAND
: !rn2(35) ? PAVEDFLOOR
: !rn2(150) ? HIGHWAY
: !rn2(25) ? GRAVEWALL
: !rn2(15) ? CLOUD
: !rn2(16) ? AIR
: !rn2(16) ? ROCKWALL
: !rn2(16) ? TREE
: !rn2(30) ? FARMLAND
: !rn2(100) ? NETHERMIST
: !rn2(200) ? STALACTITE
: !rn2(20) ? MOUNTAIN
: !rn2(20) ? IRONBARS
: !rn2(50) ? CRYSTALWATER
: !rn2(16) ? TUNNELWALL
: !rn2(150) ? WATERTUNNEL
: !rn2(100) ? MOORLAND
: !rn2(200) ? URINELAKE
: !rn2(300) ? SHIFTINGSAND
: !rn2(100) ? STYXRIVER
: !rn2(200) ? WOODENTABLE
: !rn2(300) ? CARVEDBED
: !rn2(100) ? STRAWMATTRESS
: !rn2(400) ? WELL
: !rn2(200) ? POISONEDWELL
: !rn2(400) ? WAGON
: !rn2(200) ? BURNINGWAGON
: !rn2(40) ? FOUNTAIN
: !rn2(60) ? CRYPTFLOOR
: !rn2(100) ? BUBBLES
: !rn2(80) ? RAINCLOUD
: !rn2(100) ? PENTAGRAM
: !rn2(100) ? THRONE
: !rn2(32) ? SINK
: !rn2(24) ? TOILET
: !rn2(12) ? GRAVE
: !rn2(200) ? ALTAR
: LAVAPOOL
;
3767 typ2
= randominsidetrap();
3770 levl
[sx
][sy
].typ
= typ
;
3772 if (typ
== FOUNTAIN
) level
.flags
.nfountains
++;
3773 if (typ
== SINK
) level
.flags
.nsinks
++;
3777 make_grave(sx
, sy
, (char *) 0);
3778 /* Possibly fill it with objects */
3779 if (!rn2(5)) (void) mkgold(0L, sx
, sy
);
3780 for (tryct
= rn2(2 + rn2(4)); tryct
; tryct
--) {
3781 if (timebasedlowerchance()) {
3782 otmp
= mkobj(rn2(3) ? COIN_CLASS
: RANDOM_CLASS
, TRUE
, FALSE
);
3787 add_to_buried(otmp
);
3793 /*else*/ if (!rn2(Role_if(PM_CAMPERSTRIKER
) ? 5 : 10)) (void) maketrap(sx
, sy
, typ2
, 100, TRUE
);
3795 if (!rn2(1000)) (void) mksobj_at(SWITCHER
, sx
, sy
, TRUE
, FALSE
, FALSE
);
3796 if (!rn2(Role_if(PM_CAMPERSTRIKER
) ? 25 : 100)) (void) mksobj_at(UGH_MEMORY_TO_CREATE_INVENTORY
, sx
, sy
, TRUE
, FALSE
, FALSE
);
3798 if (!rn2(Role_if(PM_CAMPERSTRIKER
) ? 20 : 40)) (void) makemon(insidemon(), sx
, sy
, MM_ADJACENTOK
|MM_ANGRY
);
3802 level
.flags
.has_insideroom
= 1;
3809 struct mkroom
*sroom
;
3811 register int sx
,sy
= 0;
3814 if (!(sroom
= pick_room(FALSE
))) return;
3816 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3818 sroom
->rtype
= RIVERROOM
;
3820 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
3821 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
3824 if (somexy(sroom
, &mm
))
3825 (void) mksobj_at(TREASURE_CHEST
, mm
.x
, mm
.y
, TRUE
, FALSE
, FALSE
);
3828 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3829 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
3830 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !t_at(sx
,sy
) /*&& !nexttodoor(sx,sy)*/) {
3832 typ
= !rn2(5) ? POOL
: !rn2(6) ? MOAT
: !rn2(20) ? ICE
: !rn2(20) ? GRASSLAND
: !rn2(80) ? HIGHWAY
: !rn2(20) ? FOUNTAIN
: !rn2(30) ? FARMLAND
: !rn2(35) ? MOUNTAIN
: !rn2(50) ? CRYSTALWATER
: !rn2(100) ? TUNNELWALL
: !rn2(150) ? WATERTUNNEL
: !rn2(6) ? ROCKWALL
: !rn2(16) ? TREE
: ROOM
;
3834 levl
[sx
][sy
].typ
= typ
;
3835 if (typ
== FOUNTAIN
) level
.flags
.nfountains
++;
3836 if (typ
== SINK
) level
.flags
.nsinks
++;
3837 if(Role_if(PM_CAMPERSTRIKER
) && !rn2(50)) (void) maketrap(sx
, sy
, rndtrap(), 100, TRUE
);
3840 level
.flags
.has_riverroom
= 1;
3847 struct mkroom
*sroom
;
3849 register int sx
,sy
,i
= 0;
3851 if (!(sroom
= pick_room(FALSE
))) return;
3853 if(sroom
->rtype
!= OROOM
|| (has_upstairs(sroom
) && rn2(iswarper
? 10 : 100)) ) return;
3855 sroom
->rtype
= STATUEROOM
;
3857 if (sroom
->ly
== 20 && sroom
->hy
== 19) sroom
->ly
= sroom
->hy
= 20;
3858 if (sroom
->ly
== 1 && sroom
->hy
== 0) sroom
->ly
= sroom
->hy
= 0;
3860 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3861 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
3862 if((levl
[sx
][sy
].typ
== ROOM
|| levl
[sx
][sy
].typ
== CORR
) && !t_at(sx
,sy
) /*&& !nexttodoor(sx,sy)*/) {
3864 (void) maketrap(sx
, sy
, (rn2(10) ? STATUE_TRAP
: ANIMATION_TRAP
), 100, TRUE
);
3867 for(sx
= sroom
->lx
; sx
<= sroom
->hx
; sx
++)
3868 for(sy
= sroom
->ly
; sy
<= sroom
->hy
; sy
++)
3871 struct obj
*sobj
= mksobj_at(STATUE
, sx
, sy
, TRUE
, FALSE
, FALSE
);
3873 if (sobj
&& !rn2(3) ) {
3874 for (i
= rn2(2 + rn2(4)); i
; i
--)
3875 if (timebasedlowerchance()) {
3876 (void) add_to_container(sobj
, mkobj(RANDOM_CLASS
, FALSE
, FALSE
), TRUE
);
3878 sobj
->owt
= weight(sobj
);
3880 if (sobj
) sobj
->owt
= weight(sobj
);
3883 level
.flags
.has_statueroom
= 1;
3893 /* First, write the number of rooms */
3894 bwrite(fd
, (void *) &nroom
, sizeof(nroom
));
3895 for(i
=0; i
<nroom
; i
++)
3896 save_room(fd
, &rooms
[i
]);
3906 mread(fd
, (void *) r
, sizeof(struct mkroom
));
3907 for(i
=0; i
<r
->nsubrooms
; i
++) {
3908 r
->sbrooms
[i
] = &subrooms
[nsubroom
];
3909 rest_room(fd
, &subrooms
[nsubroom
]);
3910 subrooms
[nsubroom
++].resident
= (struct monst
*)0;
3915 * rest_rooms : That's for restoring rooms. Read the rooms structure from
3925 mread(fd
, (void *) &nroom
, sizeof(nroom
));
3927 for(i
= 0; i
<nroom
; i
++) {
3928 rest_room(fd
, &rooms
[i
]);
3929 rooms
[i
].resident
= (struct monst
*)0;
3931 rooms
[nroom
].hx
= -1; /* restore ending flags */
3932 subrooms
[nsubroom
].hx
= -1;