Blindfold removal fix
[slashemextended.git] / src / mkroom.c
blobb8edc7d4f52e1b07c12f93bb31955964ead5c08d
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. */
5 /*
6 * Entry points:
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
17 #include "hack.h"
19 #ifdef OVLB
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 *);
48 #endif /* OVLB */
50 #define sq(x) ((x)*(x))
52 extern const struct shclass shtypes[]; /* defined in shknam.c */
54 #ifdef OVLB
56 STATIC_OVL boolean
57 isbig(sroom)
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 ));
65 void
66 mkroommateroom(variety)
67 int 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 */
80 xlou = ylou = 1;
81 xreal = 2 + rn2(10);
82 yreal = 2 + rn2(5);
83 #ifdef BIGSLEX
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;
90 #else
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;
97 #endif
99 xlou += rn2(COLNO - (xreal + 1));
100 ylou += rn2(ROWNO - (yreal + 1));
102 while ((xlou + xreal) > (COLNO - 1)) {
103 impossible("xlou + xreal too big");
104 xreal--;
106 while ((ylou + yreal) > (ROWNO - 1)) {
107 impossible("ylou + yreal too big");
108 yreal--;
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;
118 void
119 mkroom(roomtype)
120 /* make and stock a room of a given type */
121 int roomtype;
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;
219 case RANDOMROOM: {
221 retryrandtype:
222 switch (rnd(89)) {
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;
279 case 56:
280 if (!rn2(20)) {
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;
319 break;
323 default: impossible("Tried to make a room of type %d.", roomtype);
327 STATIC_OVL void
328 mkshop()
330 register struct mkroom *sroom;
331 int i = -1, j;
332 #ifdef WIZARD
333 char *ep = (char *)0; /* (init == lint suppression) */
335 /* first determine shoptype */
336 if(wizard){
337 #ifndef MAC
338 ep = nh_getenv("SHOPTYPE");
339 if(ep){
340 if(*ep == 'z' || *ep == 'Z'){
341 mkzoo(ZOO);
342 return;
344 if(*ep == 'm' || *ep == 'M'){
345 mkzoo(MORGUE);
346 return;
348 if(*ep == 'b' || *ep == 'B'){
349 mkzoo(BEEHIVE);
350 return;
352 if (*ep == 'p' || *ep == 'P') {
353 mkzoo(LEMUREPIT);
354 return;
356 if (*ep == 'i' || *ep == 'I') {
357 mkzoo(MIGOHIVE);
358 return;
360 if (*ep == 'f' || *ep == 'F') {
361 mkzoo(FUNGUSFARM);
362 return;
364 if(*ep == 't' || *ep == 'T' || *ep == '\\'){
365 mkzoo(COURT);
366 return;
368 if(*ep == 's' || *ep == 'S'){
369 mkzoo(BARRACKS);
370 return;
372 if(*ep == 'a' || *ep == 'A'){
373 mkzoo(ANTHOLE);
374 return;
376 if(*ep == 'c' || *ep == 'C'){
377 mkzoo(COCKNEST);
378 return;
380 if(*ep == 'r' || *ep == 'R'){
381 mkzoo(ARMORY);
382 return;
384 if(*ep == 'l' || *ep == 'L'){
385 mkzoo(LEPREHALL);
386 return;
388 if(*ep == '_'){
389 mktemple();
390 return;
392 if(*ep == '}'){
393 mkswamp();
394 return;
396 if (*ep == 'd' || *ep == 'D') {
397 mkzoo(DOUGROOM);
398 return;
400 j = -1;
401 for(i=0; shtypes[i].name; i++)
402 if(*ep == def_oc_syms[(int)shtypes[i].symb]) {
403 if (j < 0) j = i;
404 if (!strcmp(ep + 1, shtypes[i].name))
405 break;
407 if(*ep == 'g' || *ep == 'G')
408 i = 0;
409 else
410 i = j;
412 #endif
414 #endif
415 for(sroom = &rooms[0]; ; sroom++){
416 if(sroom->hx < 0) return;
417 if(sroom - rooms >= nroom) {
418 pline("rooms not closed by -1?");
419 return;
421 if(sroom->rtype != OROOM) continue;
422 if(has_dnstairs(sroom) || has_upstairs(sroom))
423 continue;
425 #ifdef WIZARD
426 (wizard && ep && sroom->doorct != 0) ||
427 #endif
428 sroom->doorct == 1) break;
430 if (!sroom->rlit) {
431 int x, y;
433 for(x = sroom->lx - 1; x <= sroom->hx + 1; x++)
434 for(y = sroom->ly - 1; y <= sroom->hy + 1; y++)
435 levl[x][y].lit = 1;
436 sroom->rlit = 1;
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++)
442 continue;
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 */
455 #else
456 topologize(sroom);
457 #endif
459 /* stock the room with a shopkeeper and artifacts */
460 stock_room(i, sroom);
463 STATIC_OVL struct mkroom *
464 pick_room(strict)
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])
473 sroom = &rooms[0];
474 if(sroom->hx < 0)
475 return (struct mkroom *)0;
476 if(sroom->rtype != OROOM) continue;
477 if(!strict) {
478 if( (has_upstairs(sroom) && rn2(iswarper ? 10 : 100)) || (has_dnstairs(sroom) && rn2(3)))
479 continue;
480 } else if(has_upstairs(sroom) || has_dnstairs(sroom))
481 continue;
482 if(sroom->doorct == 1 || (!rn2(5) && !strict)
483 #ifdef WIZARD
484 || (wizard && !strict)
485 #endif
487 return sroom;
489 return (struct mkroom *)0;
492 STATIC_OVL void
493 mkzoo(type)
494 int type;
496 register struct mkroom *sroom;
498 /*if (type == BADFOODSHOP) {
499 if ((sroom = pick_room(TRUE)) != 0) {
500 sroom->rtype = type;
501 fill_zoo(sroom);
504 else */if ((sroom = pick_room(FALSE)) != 0) {
505 sroom->rtype = type;
506 fill_zoo(sroom);
510 void
511 fill_zoo(sroom)
512 struct mkroom *sroom;
514 struct monst *mon;
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);
522 if (!rn2(10)) {
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);
529 int depthuz;
531 if (iszapem && In_ZAPM(&u.uz) && !(u.zapemescape)) {
533 d_level zapemlevel;
534 int zapemdepth;
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)) {
544 d_level preverlevel;
545 int preverdepth;
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 */
553 } else {
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;
566 coord mm;
567 int gravetries;
569 int moreorless;
571 #ifdef GCC_WARN
572 tx = ty = goldlim = 0;
573 #endif
575 sh = sroom->fdoor;
576 switch(type) {
577 case COURT:
578 case GIANTCOURT:
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))
583 goto throne_placed;
586 i = 100;
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);
591 throne_placed:
592 /* TODO: try to ensure the enthroned monster is an M2_PRINCE */
593 break;
594 case BEEHIVE:
595 case PRISONCHAMBER:
596 case CURSEDMUMMYROOM:
597 case MIGOHIVE:
598 case THE_AREA_ROOM:
599 case QUESTORROOM:
600 case CASINOROOM:
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 ||
606 levl[tx][ty].edge) {
607 (void) somexy(sroom, &mm);
608 tx = mm.x; ty = mm.y;
611 break;
612 case ZOO:
613 case LEPREHALL:
614 case COINHALL:
615 goldlim = 500 * level_difficulty();
616 break;
617 case CLINIC:
618 case MIMICHALL:
619 case ELEMHALL:
620 case TERRORHALL:
621 case ANGELHALL:
622 case SPIDERHALL:
623 case HUMANHALL:
624 case GOLEMHALL:
625 case TROLLHALL:
626 case NYMPHHALL:
627 case GRUEROOM:
628 break;
629 case VARIANTROOM:
630 switch (rnd(5)) {
631 case 1:
632 u.specialtensionmonster = 341; break;
633 case 2:
634 u.specialtensionmonster = 324; break;
635 case 3:
636 u.specialtensionmonster = 325; break;
637 case 4:
638 u.specialtensionmonster = 326; break;
639 case 5:
640 u.specialtensionmonster = 330; break;
642 /* evil variant, angband, animeband, steamband or dnethack */
643 break;
644 case GAMECORNER:
646 switch (rnd(8)) {
647 case 1:
648 u.specialtensionmonster = 426; break;
649 case 2:
650 u.specialtensionmonster = 427; break;
651 case 3:
652 u.specialtensionmonster = 361; break;
653 case 4:
654 u.specialtensionmonster = 322; break;
655 case 5:
656 u.specialtensionmonster = 323; break;
657 case 6:
658 u.specialtensionmonster = 327; break;
659 case 7:
660 u.specialtensionmonster = 328; break;
661 case 8:
662 u.specialtensionmonster = 434; break;
664 /* aoe, elderscrolls, elona, cow, joke, diablo, dlords or cdda */
665 break;
667 case TENSHALL:
668 u.tensionmonster = (rn2(187) + 1);
669 u.tensionmonsteX = (rn2(100) + 1);
670 u.tensionmonsterB = 0;
671 u.tensionmonsterspec = 0;
672 u.tensionmonsterspecB = 0;
673 u.colormonster = 0;
674 u.colormonsterB = 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);
688 break;
689 case DRAGONLAIR:
690 goldlim = 1500 * level_difficulty();
691 break;
694 moreorless = 100;
695 if (rn2(10)) moreorless -= 10;
696 if (rn2(10)) moreorless -= rnd(20);
697 if (!rn2(3)) {
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) ) {
742 u.aggravation = 1;
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) /*||
756 (sroom->doorct &&
757 distmin(sx, sy, doors[sh].x, doors[sh].y) <= 1)*/)
758 continue;
759 } else if(!u.roommatehack && !SPACE_POS(levl[sx][sy].typ) /*||
760 (sroom->doorct &&
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)))*/)
765 continue;
766 /* don't place monster on explicitly placed throne */
767 if(type == COURT && IS_THRONE(levl[sx][sy].typ))
768 continue;
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) {
772 u.aggravation = 1;
773 u.heavyaggravation = 1;
774 uglynastyhack = 1;
775 DifficultyIncreased += 1;
776 HighlevelStatus += 1;
777 reset_rndmonst(NON_PM);
778 } else if (!aggravatemonsteron) {
779 u.aggravation = 0;
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) :
860 (type == LEMUREPIT)?
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 */
870 if(mon) {
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)) {
876 mon->mpeaceful = 0;
877 set_malign(mon);
880 /* green cross rooms are supposed to be very peaceful if you behave well --Amy */
881 if (type == GREENCROSSROOM && (rnd(20) < u.ualign.record)) {
882 mon->mpeaceful = 1;
883 set_malign(mon);
886 if (mon->mnum == PM_SHOPKEEPER) {
887 mon->mfrenzied = FALSE;
888 mon->mpeaceful = 1;
891 if (type == CASINOROOM) { /* croupiers are meant to be awake and non-hostile --Amy */
892 mon->mfrenzied = FALSE;
893 mon->mpeaceful = 1;
894 mon->msleeping = FALSE;
898 switch(type) {
900 case CRYPTROOM:
901 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && rn2(10)) {
902 levl[sx][sy].typ = CRYPTFLOOR;
904 break;
906 case GREENCROSSROOM:
907 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && rn2(10)) {
908 levl[sx][sy].typ = rn2(3) ? PAVEDFLOOR : GRASSLAND;
910 break;
912 case FULLROOM:
913 if (!rn2(fullroomitem)) {
914 (void) mkobj_at(0, sx, sy, TRUE, FALSE);
916 if (!rn2(fullroomtrap)) {
917 makerandomtrap_at(sx, sy, TRUE);
919 break;
921 case QUESTORROOM:
922 if (!rn2(10)) {
923 (void) mkobj_at(0, sx, sy, FALSE, FALSE);
926 if (!rn2(20) || (sx == tx && sy == ty) ) {
928 if (!ISSTAIRORLADDER(levl[sx][sy].typ) ) {
929 switch (rnd(8)) {
930 case 1:
931 levl[sx][sy].typ = FOUNTAIN; break;
932 case 2:
933 levl[sx][sy].typ = SINK; break;
934 case 3:
935 levl[sx][sy].typ = TOILET; break;
936 case 4:
937 levl[sx][sy].typ = GRAVE; break;
938 case 5:
939 levl[sx][sy].typ = WELL; break;
940 case 6:
941 levl[sx][sy].typ = WAGON; break;
942 case 7:
943 levl[sx][sy].typ = WOODENTABLE; break;
944 case 8:
945 levl[sx][sy].typ = STRAWMATTRESS; break;
950 if (sx == tx && sy == ty) {
951 int objtyp = 0;
952 int tryct = 0;
953 newqsttry:
954 objtyp = rn2(NUM_OBJECTS);
955 if (objects[objtyp].oc_prob < 1) {
956 tryct++;
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) ) {
962 tryct++;
963 if (tryct < 50000) goto newqsttry;
964 else goto qstfinished;
967 (void) mksobj_at(objtyp, sx, sy, TRUE, FALSE, FALSE);
970 qstfinished:
972 break;
974 case MIRASPA:
975 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && rn2(10)) {
976 levl[sx][sy].typ = URINELAKE;
978 break;
980 case MACHINEROOM:
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;
984 break;
986 case CHANGINGROOM:
987 if (!rn2(100)) { /* can be any random pair of boots, even rare ones, so there shouldn't be many --Amy */
988 int objtyp = 0;
989 int tryct = 0;
990 newcgrtry:
991 objtyp = rn2(NUM_OBJECTS);
992 if (objects[objtyp].oc_prob < 1) {
993 tryct++;
994 if (tryct < 50000) goto newcgrtry;
995 else goto cgrfinished;
998 if (objects[objtyp].oc_class != ARMOR_CLASS || objects[objtyp].oc_armcat != ARM_BOOTS ) {
999 tryct++;
1000 if (tryct < 50000) goto newcgrtry;
1001 else goto cgrfinished;
1004 (void) mksobj_at(objtyp, sx, sy, TRUE, FALSE, FALSE);
1008 cgrfinished:
1010 break;
1012 case THE_AREA_ROOM:
1014 if (sx == tx && sy == ty) {
1015 if (!ISSTAIRORLADDER(levl[sx][sy].typ) ) {
1016 switch (rnd(4)) {
1017 case 1:
1018 levl[sx][sy].typ = PENTAGRAM; break;
1019 case 2:
1020 levl[sx][sy].typ = FOUNTAIN; break;
1021 case 3:
1022 levl[sx][sy].typ = THRONE; break;
1023 case 4:
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);
1029 if (altarwater) {
1031 if (!rn2(5)) curse(altarwater);
1032 else bless(altarwater);
1038 break;
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;
1046 break;
1048 case ROBBERCAVE:
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);
1059 break;
1061 case CASINOROOM:
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);
1071 if (croupier) {
1072 croupier->mfrenzied = FALSE;
1073 croupier->mpeaceful = 1;
1074 croupier->msleeping = FALSE;
1078 break;
1080 case SANITATIONCENTRAL:
1082 if(levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) {
1084 if (!rn2(5)) levl[sx][sy].typ = ROCKWALL;
1087 break;
1089 case LEVELFFROOM:
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;
1096 break;
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;
1102 if(!rn2(10))
1103 (void) mksobj_at(ICE_BOX,sx,sy,TRUE,FALSE, FALSE);
1104 break;
1106 case VOIDROOM:
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);
1112 break;
1114 case RARITYROOM:
1115 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && !rn2(5)) {
1116 levl[sx][sy].typ = randomwalltype();
1118 break;
1120 case DIVERPARADISE:
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);
1125 break;
1127 case WIZARDSDORM:
1128 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && !rn2(4)) {
1129 levl[sx][sy].typ = rn2(2) ? WOODENTABLE : CARVEDBED;
1132 if(!rn2(50))
1133 (void) mksobj_at(CHARGER,sx,sy,TRUE,FALSE, FALSE);
1135 break;
1137 case SLEEPINGROOM:
1138 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && !rn2(3)) {
1139 levl[sx][sy].typ = STRAWMATTRESS;
1141 break;
1143 case LEVELSEVENTYROOM:
1144 if((levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR) && rn2(10)) {
1145 levl[sx][sy].typ = GRAVEWALL;
1147 break;
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);
1156 if(!rn2(20))
1157 (void) mksobj_at(rn2(10) ? CHARGER : SYMBIOTE,sx,sy,TRUE,FALSE, FALSE);
1159 break;
1161 case PRISONCHAMBER:
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 );
1166 if (!rn2(10)) {
1167 register struct obj *altarwater;
1168 altarwater = mksobj_at(POT_WATER, sx, sy, FALSE, FALSE, FALSE);
1169 if (altarwater) {
1170 if (!rn2(5)) curse(altarwater);
1171 else bless(altarwater);
1175 break;
1177 case KOPSTATION:
1178 if(!rn2(25) && !t_at(sx, sy))
1179 (void) maketrap(sx, sy, KOP_CUBE, 100, FALSE);
1180 break;
1182 case BOSSROOM:
1183 if(!rn2(5) && !t_at(sx, sy))
1184 (void) maketrap(sx, sy, BOSS_SPAWNER, 100, FALSE);
1185 break;
1187 case HAMLETROOM:
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);
1196 break;
1198 case MEADOWROOM:
1199 if(rn2(5) && (levl[sx][sy].typ == ROOM || levl[sx][sy].typ == CORR)) {
1200 levl[sx][sy].typ = GRASSLAND;
1202 if(!rn2(5))
1203 (void) mkobj_at(FOOD_CLASS, sx, sy, FALSE, FALSE);
1205 if(!rn2(25))
1206 (void) mksobj_at(MEADOWFOAM, sx, sy, TRUE, FALSE, FALSE);
1208 break;
1210 case HELLPIT:
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);
1221 break;
1223 case ZOO:
1224 if (specialzoo) {
1225 if (specialzoochance > rnd(100)) {
1226 (void) mkobj_at(specialzootype, sx, sy, TRUE, FALSE);
1229 /* fall through */
1230 case DRAGONLAIR:
1231 case LEPREHALL:
1232 if(sroom->doorct)
1234 int distval = dist2(sx,sy,doors[sh].x,doors[sh].y);
1235 i = sq(distval);
1237 else
1238 i = goldlim;
1239 if(i >= goldlim) i = 5*level_difficulty();
1240 goldlim -= i;
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);
1247 break;
1249 case BADFOODSHOP:
1251 if(!rn2(ishaxor ? 20 : 40))
1252 (void) mksobj_at(BLACK_HENBANE, sx, sy, TRUE, FALSE, FALSE);
1254 break;
1256 case MORGUE:
1257 if(!rn2(5))
1258 (void) mk_tt_object(CORPSE, sx, sy);
1259 if(!rn2(50) && (level_difficulty() > 10+rnd(200) )) { /* real player ghosts --Amy */
1260 coord mmm;
1261 mmm.x = sx;
1262 mmm.y = sy;
1263 (void) tt_mname(&mmm, FALSE, 0);
1265 if(ishaxor && !rn2(50) && (level_difficulty() > 10+rnd(200) )) { /* real player ghosts --Amy */
1266 coord mmm;
1267 mmm.x = sx;
1268 mmm.y = sy;
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);
1273 if (!rn2(10)) {
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);
1280 if (!otmp) break;
1281 curse(otmp);
1282 otmp->ox = sx;
1283 otmp->oy = sy;
1284 add_to_buried(otmp);
1289 break;
1290 case BEEHIVE:
1291 if(!rn2(12)) /* slightly lowered chance --Amy */
1292 (void) mksobj_at(rn2(30) ? LUMP_OF_ROYAL_JELLY : HONEYCOMB, sx, sy, TRUE, FALSE, FALSE);
1293 break;
1294 case FUNGUSFARM:
1295 if (!rn2(25)) /* lowered chance --Amy */
1296 (void) mksobj_at(SLIME_MOLD, sx, sy, TRUE, FALSE, FALSE);
1297 if (!rn2(100))
1298 (void) mksobj_at(SYMBIOTE, sx, sy, TRUE, FALSE, FALSE);
1299 break;
1300 case MIGOHIVE:
1301 switch (rn2(100)) { /* greatly lowered chance --Amy */
1302 case 9:
1303 mksobj_at(DIAMOND, sx, sy, TRUE, FALSE, FALSE);
1304 break;
1305 case 8:
1306 mksobj_at(RUBY, sx, sy, TRUE, FALSE, FALSE);
1307 break;
1308 case 7:
1309 case 6:
1310 mksobj_at(AGATE, sx, sy, TRUE, FALSE, FALSE);
1311 break;
1312 case 5:
1313 case 4:
1314 mksobj_at(FLUORITE, sx, sy, TRUE, FALSE, FALSE);
1315 break;
1316 default:
1317 break;
1319 break;
1320 case BARRACKS:
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);
1323 if (!rn2(25)) {
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);
1330 if (!otmp) break;
1331 curse(otmp);
1332 otmp->ox = sx;
1333 otmp->oy = sy;
1334 add_to_buried(otmp);
1339 break;
1341 case CLINIC:
1342 if(!rn2(10))
1343 (void) mksobj_at(ICE_BOX,sx,sy,TRUE,FALSE, FALSE);
1344 if (!rn2(100))
1345 (void) mksobj_at(SYMBIOTE, sx, sy, TRUE, FALSE, FALSE);
1346 break;
1347 case GOLEMHALL:
1348 if(!rn2(ishaxor ? 10 : 20))
1349 (void) mkobj_at(CHAIN_CLASS, sx, sy, FALSE, FALSE);
1350 break;
1351 case SPIDERHALL:
1352 if(!rn2(3))
1353 (void) mksobj_at(EGG,sx,sy,TRUE,FALSE, FALSE);
1354 break;
1355 case EMPTYNEST:
1356 (void) mksobj_at(EGG,sx,sy,TRUE,FALSE, FALSE);
1357 break;
1358 case COCKNEST:
1359 if(!rn2(7)) {
1360 struct obj *sobj = mk_tt_object(STATUE, sx, sy);
1362 if (sobj) {
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);
1370 break;
1371 case ARMORY:
1373 struct obj *otmp;
1374 if (!rn2(5)) { /* sorry Patrick, but the quantity of those items needs to be lower. --Amy */
1375 if (rn2(2))
1376 otmp = mkobj_at(WEAPON_CLASS, sx, sy, FALSE, FALSE);
1377 else
1378 otmp = mkobj_at(ARMOR_CLASS, sx, sy, FALSE, FALSE);
1379 if (otmp) {
1380 if (is_rustprone(otmp)) otmp->oeroded = rn2(4);
1381 else if (is_rottable(otmp)) otmp->oeroded2 = rn2(4);
1385 break;
1386 case WEAPONCHAMBER:
1388 if (!rn2(2)) {
1389 if (rn2(10))
1390 (void) mkobj_at(WEAPON_CLASS, sx, sy, FALSE, FALSE);
1391 else
1392 (void) mkobj_at(ARMOR_CLASS, sx, sy, FALSE, FALSE);
1395 break;
1396 case ANTHOLE:
1397 if(!rn2(15))
1398 (void) mkobj_at(FOOD_CLASS, sx, sy, FALSE, FALSE);
1399 break;
1400 case ANGELHALL:
1401 if(!rn2(10))
1402 (void) mkobj_at(GEM_CLASS, sx, sy, FALSE, FALSE);
1403 break;
1405 case CURSEDMUMMYROOM:
1406 if(!rn2(10))
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);
1412 if(!rn2(10)) {
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);
1431 break;
1433 case RUINEDCHURCH:
1435 if(!rn2(5))
1436 (void) mksobj_at(rnd_class(JADE+1, LUCKSTONE-1), sx, sy, TRUE, FALSE, FALSE); /* worthless glass */
1437 if(!rn2(20))
1438 (void) mkobj_at(SCROLL_CLASS, sx, sy, FALSE, FALSE);
1439 break;
1440 case MIMICHALL: /* lower overall amount of items --Amy */
1441 if(!rn2(10))
1442 (void) mkobj_at(rn2(5) ? COIN_CLASS : RANDOM_CLASS, sx, sy, FALSE, FALSE);
1443 break;
1444 case HUMANHALL:
1445 if(!rn2(3))
1446 (void) mkobj_at(RANDOM_CLASS, sx, sy, FALSE, FALSE);
1447 break;
1450 switch (type) {
1451 case COURT:
1452 case GIANTCOURT:
1454 struct obj *chest;
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);
1460 if (chest) {
1461 chest->spe = 2; /* so it can be found later */
1465 if (!rn2(20)) {
1466 if (somexy(sroom, &mm))
1467 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1470 level.flags.has_court = 1;
1471 break;
1473 case ARMORY:
1475 level.flags.has_armory = 1;
1477 if (!rn2(10)) {
1478 if (somexy(sroom, &mm))
1479 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1482 break;
1484 case RUINEDCHURCH:
1486 if (somexy(sroom, &mm)) {
1488 if (!ISSTAIRORLADDER(levl[mm.x][mm.y].typ) ) {
1489 levl[mm.x][mm.y].typ = ALTAR;
1490 switch (rnd(4)) {
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;
1499 if (!rn2(10)) {
1500 register struct obj *altarwater;
1501 altarwater = mksobj_at(POT_WATER, mm.x, mm.y, FALSE, FALSE, FALSE);
1502 if (altarwater) {
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;
1515 break;
1517 case BARRACKS:
1519 if (!rn2(50)) {
1520 if (somexy(sroom, &mm))
1521 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1524 level.flags.has_barracks = 1;
1525 break;
1526 case ZOO:
1527 if (!rn2(50)) {
1528 if (somexy(sroom, &mm))
1529 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1531 case REALZOO:
1532 level.flags.has_zoo = 1;
1533 if (!rn2(10)) {
1534 if (somexy(sroom, &mm)) {
1535 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1538 break;
1539 case MORGUE:
1540 if (!rn2(50)) {
1541 if (somexy(sroom, &mm))
1542 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1545 level.flags.has_morgue = 1;
1546 break;
1547 case SWAMP:
1548 level.flags.has_swamp = 1;
1549 break;
1550 case BEEHIVE:
1551 level.flags.has_beehive = 1;
1552 break;
1553 case DOUGROOM:
1554 if (!rn2(5)) {
1555 if (somexy(sroom, &mm)) {
1556 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1559 level.flags.has_zoo = 1;
1560 break;
1561 case LEMUREPIT:
1562 level.flags.has_lemurepit = 1;
1563 break;
1564 case MIGOHIVE:
1565 level.flags.has_migohive = 1;
1566 break;
1567 case FUNGUSFARM:
1568 if (!rn2(5)) {
1569 if (somexy(sroom, &mm)) {
1570 (void) mksobj_at(SYMBIOTE, mm.x, mm.y, TRUE, FALSE, FALSE);
1573 level.flags.has_fungusfarm = 1;
1574 break;
1575 case CLINIC:
1576 if (!rn2(10)) {
1577 if (somexy(sroom, &mm)) {
1578 (void) mksobj_at(SYMBIOTE, mm.x, mm.y, TRUE, FALSE, FALSE);
1581 level.flags.has_clinic = 1;
1582 break;
1583 case TERRORHALL:
1584 level.flags.has_terrorhall = 1;
1585 break;
1586 case INSIDEROOM:
1588 if (!rn2(10)) {
1589 if (somexy(sroom, &mm))
1590 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1592 while (!rn2(2)) {
1593 if (somexy(sroom, &mm))
1594 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1598 level.flags.has_insideroom = 1;
1599 break;
1600 case RIVERROOM:
1601 if (!rn2(30)) {
1602 if (somexy(sroom, &mm))
1603 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1605 level.flags.has_riverroom = 1;
1606 break;
1607 case TENSHALL:
1608 if (!rn2(50)) {
1609 if (somexy(sroom, &mm))
1610 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1612 level.flags.has_tenshall = 1;
1613 break;
1614 case EVILROOM:
1615 level.flags.has_evilroom = 1;
1616 break;
1617 case RELIGIONCENTER:
1618 if (!rn2(10)) {
1619 if (somexy(sroom, &mm)) {
1620 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1623 level.flags.has_religioncenter = 1;
1624 break;
1625 case CURSEDMUMMYROOM:
1626 level.flags.has_cursedmummyroom = 1;
1627 break;
1628 case CHANGINGROOM:
1629 level.flags.has_changingroom = 1;
1630 break;
1631 case QUESTORROOM:
1632 level.flags.has_questorroom = 1;
1633 break;
1634 case ARDUOUSMOUNTAIN:
1635 if (!rn2(50)) {
1636 if (somexy(sroom, &mm)) {
1637 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1640 if (!rn2(3)) {
1641 if (somexy(sroom, &mm))
1642 (void) (void) mkobj_at(IMPLANT_CLASS, mm.x, mm.y, FALSE, FALSE);
1644 level.flags.has_arduousmountain = 1;
1645 break;
1646 case LEVELFFROOM:
1647 level.flags.has_levelffroom = 1;
1648 break;
1649 case VERMINROOM:
1650 if (!rn2(20)) {
1651 if (somexy(sroom, &mm)) {
1652 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1655 level.flags.has_verminroom = 1;
1656 break;
1657 case MIRASPA:
1658 level.flags.has_miraspa = 1;
1659 break;
1660 case MACHINEROOM:
1661 if (!rn2(5)) {
1662 if (somexy(sroom, &mm))
1663 (void) (void) mkobj_at(IMPLANT_CLASS, mm.x, mm.y, FALSE, FALSE);
1665 level.flags.has_machineroom = 1;
1666 break;
1667 case SHOWERROOM:
1668 level.flags.has_showerroom = 1;
1669 break;
1670 case GREENCROSSROOM:
1671 level.flags.has_greencrossroom = 1;
1672 break;
1673 case GAMECORNER:
1674 if (!rn2(10)) {
1675 if (somexy(sroom, &mm)) {
1676 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1679 level.flags.has_gamecorner = 1;
1680 break;
1681 case ILLUSIONROOM:
1682 level.flags.has_illusionroom = 1;
1683 break;
1684 case ELEMHALL:
1685 if (!rn2(50)) {
1686 if (somexy(sroom, &mm))
1687 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1689 level.flags.has_elemhall = 1;
1690 break;
1691 case ANGELHALL:
1692 if (!rn2(20)) {
1693 if (somexy(sroom, &mm))
1694 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1696 level.flags.has_angelhall = 1;
1697 break;
1698 case MIMICHALL:
1699 level.flags.has_mimichall = 1;
1700 break;
1701 case NYMPHHALL:
1702 level.flags.has_nymphhall = 1;
1703 break;
1704 case SPIDERHALL:
1705 level.flags.has_spiderhall = 1;
1706 break;
1707 case TROLLHALL:
1708 if (!rn2(50)) {
1709 if (somexy(sroom, &mm))
1710 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1712 level.flags.has_trollhall = 1;
1713 break;
1714 case COINHALL:
1715 level.flags.has_coinhall = 1;
1716 break;
1717 case HUMANHALL:
1718 if (!rn2(30)) {
1719 if (somexy(sroom, &mm))
1720 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1722 level.flags.has_humanhall = 1;
1723 break;
1724 case GOLEMHALL:
1725 level.flags.has_golemhall = 1;
1726 break;
1727 case TRAPROOM:
1728 level.flags.has_traproom = 1;
1729 break;
1730 case GRUEROOM:
1731 level.flags.has_grueroom = 1;
1732 break;
1734 case CRYPTROOM:
1735 level.flags.has_cryptroom = 1;
1736 if (somexy(sroom, &mm)) {
1737 (void) mksobj_at(CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
1739 break;
1740 case TROUBLEZONE:
1741 if (!rn2(3)) {
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;
1752 break;
1753 case WEAPONCHAMBER:
1754 level.flags.has_weaponchamber = 1;
1755 break;
1756 case HELLPIT:
1757 if (!rn2(10)) {
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;
1765 break;
1766 case FEMINISMROOM:
1767 level.flags.has_feminismroom = 1;
1769 if (somexy(sroom, &mm)) {
1770 (void) mksobj_at(HANDYBAG, mm.x, mm.y, TRUE, FALSE, FALSE);
1772 if (!rn2(10)) {
1773 if (somexy(sroom, &mm)) {
1774 (void) mksobj_at(rnd_class(ELIF_S_JEWEL, DORA_S_JEWEL), mm.x, mm.y, TRUE, FALSE, FALSE);
1778 break;
1779 case MEADOWROOM:
1780 level.flags.has_meadowroom = 1;
1781 break;
1782 case COOLINGCHAMBER:
1783 level.flags.has_coolingchamber = 1;
1784 break;
1785 case VOIDROOM:
1786 level.flags.has_voidroom = 1;
1787 break;
1788 case HAMLETROOM:
1789 if (!rn2(10)) {
1790 if (somexy(sroom, &mm)) {
1791 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1794 level.flags.has_hamletroom = 1;
1795 break;
1796 case KOPSTATION:
1797 level.flags.has_kopstation = 1;
1798 break;
1799 case BOSSROOM:
1800 level.flags.has_bossroom = 1;
1801 break;
1802 case RNGCENTER:
1803 level.flags.has_rngcenter = 1;
1804 break;
1805 case WIZARDSDORM:
1806 if (!rn2(10)) {
1807 if (somexy(sroom, &mm)) {
1808 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1811 level.flags.has_wizardsdorm = 1;
1812 break;
1813 case DOOMEDBARRACKS:
1814 level.flags.has_doomedbarracks = 1;
1815 break;
1816 case SLEEPINGROOM:
1817 if (!rn2(30)) {
1818 if (somexy(sroom, &mm)) {
1819 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1822 level.flags.has_sleepingroom = 1;
1823 break;
1824 case DIVERPARADISE:
1825 level.flags.has_diverparadise = 1;
1826 if (!rn2(5)) {
1827 if (somexy(sroom, &mm)) {
1828 (void) mksobj_at(MATERIAL_KIT, mm.x, mm.y, TRUE, FALSE, FALSE);
1831 break;
1832 case MENAGERIE:
1833 level.flags.has_menagerie = 1;
1834 break;
1835 case NASTYCENTRAL:
1836 level.flags.has_nastycentral = 1;
1837 break;
1838 case EMPTYDESERT:
1839 level.flags.has_emptydesert = 1;
1840 break;
1841 case RARITYROOM:
1842 level.flags.has_rarityroom = 1;
1843 break;
1844 case EXHIBITROOM:
1845 level.flags.has_exhibitroom = 1;
1846 break;
1847 case PRISONCHAMBER:
1848 if (!rn2(20)) {
1849 if (somexy(sroom, &mm)) {
1850 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1853 level.flags.has_prisonchamber = 1;
1854 break;
1855 case ROBBERCAVE:
1856 if (!rn2(20)) {
1857 if (somexy(sroom, &mm)) {
1858 (void) mksobj_at(SACK, mm.x, mm.y, TRUE, FALSE, FALSE);
1861 level.flags.has_robbercave = 1;
1862 break;
1863 case SANITATIONCENTRAL:
1864 level.flags.has_sanitationcentral = 1;
1865 break;
1866 case CASINOROOM:
1867 if (!rn2(5)) {
1868 if (somexy(sroom, &mm)) {
1869 (void) mksobj_at(CASINO_CHIP, mm.x, mm.y, TRUE, FALSE, FALSE);
1871 while (!rn2(3)) {
1872 if (somexy(sroom, &mm)) {
1873 (void) mksobj_at(CASINO_CHIP, mm.x, mm.y, TRUE, FALSE, FALSE);
1877 level.flags.has_casinoroom = 1;
1878 break;
1879 case NUCLEARCHAMBER:
1880 level.flags.has_nuclearchamber = 1;
1881 break;
1882 case LEVELSEVENTYROOM:
1883 level.flags.has_levelseventyroom = 1;
1884 break;
1885 case PLAYERCENTRAL:
1886 level.flags.has_playercentral = 1;
1887 break;
1888 case VARIANTROOM:
1889 level.flags.has_variantroom = 1;
1890 break;
1892 case POOLROOM:
1893 level.flags.has_poolroom = 1;
1894 break;
1895 case STATUEROOM:
1896 level.flags.has_statueroom = 1;
1897 break;
1900 u.aggravation = 0;
1901 u.heavyaggravation = 0;
1905 /* make a swarm of undead around mm */
1906 void
1907 mkundead(mm, revive_corpses, mm_flags, hostility)
1908 coord *mm;
1909 boolean revive_corpses;
1910 int mm_flags;
1911 boolean hostility;
1913 int cnt = 1;
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;
1918 struct obj *otmp;
1919 coord cc;
1921 register struct monst *mtmp;
1923 if (Aggravate_monster) {
1924 u.aggravation = 1;
1925 reset_rndmonst(NON_PM);
1928 while (cnt--) {
1929 mdat = morguemon();
1930 if (enexto(&cc, mm->x, mm->y, mdat) &&
1931 (!revive_corpses ||
1932 !(otmp = sobj_at(CORPSE, cc.x, cc.y)) ||
1933 !revive(otmp)))
1934 mtmp = makemon(mdat, cc.x, cc.y, mm_flags);
1935 if (mtmp && hostility) {
1936 mtmp->mpeaceful = 0;
1937 mtmp->mfrenzied = 1;
1941 u.aggravation = 0;
1943 level.flags.graveyard = TRUE; /* reduced chance for undead corpse */
1946 /*void
1947 mkundeadboo(mm, revive_corpses, mm_flags)
1948 coord *mm;
1949 boolean revive_corpses;
1950 int mm_flags;
1952 struct monst *nmonst;
1954 int cnt = 1;
1955 if (!rn2(2)) cnt = (level_difficulty() + 1)/10;
1956 if (!rn2(5)) cnt += rnz(5);
1957 if (cnt < 1) cnt = 1;
1958 int mdat;
1959 struct obj *otmp;
1960 coord cc;
1962 while (cnt--) {
1963 mdat = PM_UNDEAD_ARCHEOLOGIST + rn2(PM_UNDEAD_WIZARD - PM_UNDEAD_ARCHEOLOGIST + 1);
1964 if (enexto(&cc, mm->x, mm->y, youmonst.data) &&
1965 (!revive_corpses ||
1966 !(otmp = sobj_at(CORPSE, cc.x, cc.y)) ||
1967 !revive(otmp)))
1969 nmonst = makemon(&mons[mdat], cc.x, cc.y, mm_flags);
1970 tt_mname(nmonst);
1974 /* make a swarm of undead around mm but less, for zap.c WAN_SUMMON_UNDEAD */
1975 void
1976 mkundeadX(mm, revive_corpses, mm_flags)
1977 coord *mm;
1978 boolean revive_corpses;
1979 int mm_flags;
1981 int cnt = 1;
1982 struct permonst *mdat;
1983 struct obj *otmp;
1984 coord cc;
1986 if (Aggravate_monster) {
1987 u.aggravation = 1;
1988 reset_rndmonst(NON_PM);
1991 if (!rn2(10)) cnt += rnz(2);
1993 while (cnt--) {
1994 mdat = morguemon();
1995 if (enexto(&cc, mm->x, mm->y, mdat) &&
1996 (!revive_corpses ||
1997 !(otmp = sobj_at(CORPSE, cc.x, cc.y)) ||
1998 !revive(otmp)))
1999 (void) makemon(mdat, cc.x, cc.y, mm_flags);
2001 level.flags.graveyard = TRUE; /* reduced chance for undead corpse */
2003 u.aggravation = 0;
2006 STATIC_OVL struct permonst *
2007 morguemon()
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 */
2019 struct permonst *
2020 antholemon()
2022 int mtyp;
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 *
2037 fungus()
2039 register int i, hd = level_difficulty(), mtyp = 0;
2041 i = rn2(hd > 20 ? 17 : hd > 12 ? 14 : 12);
2043 switch (i) {
2044 case 0:
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]);
2069 STATIC_OVL void
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)) )
2081 continue;
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)*/) {
2094 if((sx+sy)%2) {
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);
2100 eelct++;
2102 } else {
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;
2115 STATIC_OVL coord *
2116 shrine_pos(roomno)
2117 int roomno;
2119 static coord buf;
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);
2124 return(&buf);
2127 STATIC_OVL void
2128 mktemple()
2130 register struct mkroom *sroom;
2131 coord *shrine_spot;
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];
2144 lev->typ = ALTAR;
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;
2150 if (!rn2(10)) {
2151 register struct obj *otmp;
2152 otmp = mksobj_at(POT_WATER, shrine_spot->x, shrine_spot->y, FALSE, FALSE, FALSE);
2153 if (otmp) {
2154 bless(otmp);
2159 boolean
2160 nexttodoor(sx,sy)
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) ||
2168 lev->typ == SDOOR)
2169 return(TRUE);
2171 return(FALSE);
2174 boolean
2175 has_dnstairs(sroom)
2176 register struct mkroom *sroom;
2178 if (sroom == dnstairs_room)
2179 return TRUE;
2180 if (sstairs.sx && !sstairs.up)
2181 return((boolean)(sroom == sstairs_room));
2182 return FALSE;
2185 boolean
2186 has_upstairs(sroom)
2187 register struct mkroom *sroom;
2189 if (sroom == upstairs_room)
2190 return TRUE;
2191 if (sstairs.sx && sstairs.up)
2192 return((boolean)(sroom == sstairs_room));
2193 return FALSE;
2196 #endif /* OVLB */
2197 #ifdef OVL0
2200 somex(croom)
2201 register struct mkroom *croom;
2203 return rn2(croom->hx-croom->lx+1) + croom->lx;
2207 somey(croom)
2208 register struct mkroom *croom;
2210 return rn2(croom->hy-croom->ly+1) + croom->ly;
2213 boolean
2214 inside_room(croom, x, y)
2215 struct mkroom *croom;
2216 xchar x, y;
2218 return((boolean)(x >= croom->lx-1 && x <= croom->hx+1 &&
2219 y >= croom->ly-1 && y <= croom->hy+1));
2222 boolean
2223 somexy(croom, c)
2224 struct mkroom *croom;
2225 coord *c;
2227 int try_cnt = 0;
2228 int i;
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)
2238 return TRUE;
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)
2245 return TRUE;
2246 return FALSE;
2249 if (!croom->nsubrooms) {
2250 c->x = somex(croom);
2251 c->y = somey(croom);
2252 return TRUE;
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))
2261 continue;
2262 for(i=0 ; i<croom->nsubrooms;i++)
2263 if(inside_room(croom->sbrooms[i], c->x, c->y))
2264 goto you_lose;
2265 break;
2266 you_lose: ;
2268 if (try_cnt >= 100)
2269 return FALSE;
2270 return TRUE;
2274 * Search for a special room given its type (zoo, court, etc...)
2275 * Special values :
2276 * - ANY_SHOP
2277 * - ANY_TYPE
2280 struct mkroom *
2281 search_special(type)
2282 schar 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)
2290 return croom;
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)
2295 return croom;
2296 return (struct mkroom *) 0;
2299 #endif /* OVL0 */
2300 #ifdef OVLB
2302 struct permonst *
2303 courtmon()
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));
2317 struct permonst *
2318 minotaurvariant() /* Amy notice: keep is_minotaur() in mondata.c updated too */
2320 if (!rn2(10)) {
2321 switch (rnd(39)) {
2322 case 1:
2323 return (&mons[PM_LOWERCASE_MINOTAUR]);
2324 case 2:
2325 return (&mons[PM_MINOTAUR_MAGICIAN]);
2326 case 3:
2327 return (&mons[PM_MINOTAUR_BOXER]);
2328 case 4:
2329 return (&mons[PM_MINOCHEATER]);
2330 case 5:
2331 return (&mons[PM_MINOTAUR_BALLERINA]);
2332 case 6:
2333 return (&mons[PM_MINOTARD]);
2334 case 7:
2335 return (&mons[PM_MINOTAUR_VORE]);
2336 case 8:
2337 return (&mons[PM_ERR_AXE_MINOTAUR]);
2338 case 9:
2339 return (&mons[PM_ROCKTAUR]);
2340 case 10:
2341 return (&mons[PM_PSEUDO_PETTY_MINOTAUR]);
2342 case 11:
2343 return (&mons[PM_SPECHOTAUR]);
2344 case 12:
2345 return (rn2(5) ? &mons[PM_MINOTAUR] : &mons[PM_MINOTAUR_LICH]);
2346 case 13:
2347 return (&mons[PM_MINOTAUR_MIMIC]);
2348 case 14:
2349 return (&mons[PM_CHASING_MINOTAUR]);
2350 case 15:
2351 return (&mons[PM_FAT_MINOTAUR]);
2352 case 16:
2353 return (&mons[PM_CHEATING_MINOTAUR]);
2354 case 17:
2355 return (&mons[PM_EVIL_PATCH_MINOTAUR]);
2356 case 18:
2357 return (&mons[PM_DUMB_MINOTAUR]);
2358 case 19:
2359 return (&mons[PM_GIGOTAUR]);
2360 case 20:
2361 return (level_difficulty() < 16 ? &mons[PM_MINOTAUR] : &mons[PM_MINOTAUR_PRIESTESS]);
2362 case 21:
2363 return (level_difficulty() < 20 ? &mons[PM_MINOTAUR] : &mons[PM_MINOTAUR_MATRON]);
2364 case 22:
2365 return (level_difficulty() < 26 ? &mons[PM_MINOTAUR] : &mons[PM_ELDER_MINOTAUR]);
2366 case 23:
2367 return (level_difficulty() < 26 ? &mons[PM_MINOTAUR] : &mons[PM_PETTY_ELDER_MINOTAUR]);
2368 case 24:
2369 return (level_difficulty() < 41 ? &mons[PM_MINOTAUR] : &mons[PM_STEEL_MINOTAUR]);
2370 case 25:
2371 return (level_difficulty() < 50 ? &mons[PM_MINOTAUR] : &mons[PM_ANCIENT_MINOTAUR]);
2372 case 26:
2373 return (level_difficulty() < 90 ? &mons[PM_MINOTAUR] : &mons[PM_MINOTAUR_GRANDMASTER]);
2374 case 27:
2375 return (&mons[PM_MINOTAUR_ZOMBIE]);
2376 case 28:
2377 return (level_difficulty() < 76 ? &mons[PM_MINOTAUR] : &mons[PM_ASTERIOS]);
2378 case 29:
2379 return (level_difficulty() < 50 ? &mons[PM_MINOTAUR] : &mons[PM_CHIHYU]);
2380 case 30:
2381 return (level_difficulty() < 60 ? &mons[PM_MINOTAUR] : &mons[PM_MOLOCH]);
2382 case 31:
2383 return (&mons[PM_TAURUSCROTTA]);
2384 case 32:
2385 return (&mons[PM_GRIDOTAUR]);
2386 case 33:
2387 return (level_difficulty() < 50 ? &mons[PM_MINOTAUR] : &mons[PM_MAULOTAUR]);
2388 case 34:
2389 return (&mons[PM_XORNITAUR]);
2390 case 35:
2391 return (&mons[PM_FISHTAUR]);
2392 case 36:
2393 return (&mons[PM_ROARING_FISHTAUR]);
2394 case 37:
2395 return (&mons[PM_SAVEUP_MINOTAUR]);
2396 case 38:
2397 return (&mons[PM_MIMOTAUR]);
2398 case 39:
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! */
2407 struct permonst *
2408 insidemon()
2410 int i = rnd(154);
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]);
2423 else if (i > 129) {
2424 switch (rnd(5)) {
2425 case 1:
2426 return(rn2(5) ? &mons[PM_SUPERTHIEF] : &mons[PM_SLICK_RUEA]);
2427 break;
2428 case 2:
2429 return(rn2(5) ? &mons[PM_SUPERTHIEF] : &mons[PM_DOUBLE_AURORA_BOMBER]);
2430 break;
2431 case 3:
2432 return(rn2(5) ? &mons[PM_SUPERTHIEF] : &mons[PM_SHEER_SPACER]);
2433 break;
2434 case 4:
2435 if (level_difficulty() < 10) return(&mons[PM_SUPERTHIEF]);
2436 return(rn2(5) ? &mons[PM_SUPERTHIEF] : &mons[PM_DIVISION_FIEND]);
2437 break;
2438 case 5:
2439 if (level_difficulty() < 20) return(&mons[PM_SUPERTHIEF]);
2440 return(rn2(20) ? &mons[PM_SUPERTHIEF] : &mons[PM_DIVISION_FOURTH_BOSS]);
2441 break;
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 */
2477 struct permonst *
2478 colormon(color)
2479 int color;
2482 register struct permonst *ptr;
2483 register int ct = 0;
2485 if (color == NO_COLOR) color = CLR_BLACK;
2487 ptr = rndmonst();
2489 do {
2491 ptr = rndmonst();
2492 ct++;
2494 } while (!ptr || (ptr->mcolor != color && ct < 2000) );
2496 return ptr;
2500 struct permonst *
2501 specialtensmon(type) /* for monstercolor function and some others */
2502 int type;
2505 register struct permonst *ptr;
2506 register int ct = 0;
2508 ptr = rndmonst();
2510 do {
2512 ptr = rndmonst();
2513 ct++;
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) ) );
2519 u.mondiffhack = 0;
2521 return ptr;
2525 struct permonst *
2526 speedymon() /* returns a monster whose speed is at least 18 */
2529 register struct permonst *ptr;
2530 register int ct = 0;
2532 ptr = rndmonst();
2534 do {
2536 ptr = rndmonst();
2537 ct++;
2538 if (ct && (ct % 10000 == 0)) u.mondiffhack++;
2539 if (!rn2(2000)) reset_rndmonst(NON_PM);
2541 } while ( !ptr || ((ptr->mmove < 18) && (ct < 250000) ));
2543 u.mondiffhack = 0;
2545 return ptr;
2549 struct permonst *
2550 tenshallmon()
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);
2625 struct permonst *
2626 tenshallmonB()
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);
2701 struct permonst *
2702 douglas_adams_mon()
2704 int depthuz;
2705 int maxdougdiff = 2000; /* arbitrary */
2707 if (iszapem && In_ZAPM(&u.uz) && !(u.zapemescape)) {
2709 d_level zapemlevel;
2710 int zapemdepth;
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;
2721 int preverdepth;
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 */
2728 } else {
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;
2736 int i = rn2(60);
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]);
2747 struct permonst *
2748 beehivemon()
2750 int i = rn2(114);
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]);
2783 struct permonst *
2784 migohivemon()
2786 int depthuz;
2788 if (iszapem && In_ZAPM(&u.uz) && !(u.zapemescape)) {
2790 d_level zapemlevel;
2791 int zapemdepth;
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;
2802 int preverdepth;
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 */
2809 } else {
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)) {
2819 case 1:
2820 return &mons[PM_MIGO_DRONE];
2821 case 2:
2822 return &mons[PM_MIGO_FORCE_DRONE];
2823 case 3:
2824 return &mons[PM_PETTY_MIGO_DRONE];
2825 case 4:
2826 return &mons[PM_ARMED_MIGO_DRONE];
2827 case 5:
2828 return &mons[PM_MIGO_WARRIOR];
2829 case 6:
2830 return &mons[PM_ARMED_MIGO_WARRIOR];
2831 case 7:
2832 if (level_difficulty() > 14) return &mons[PM_MIGO_QUEEN];
2833 else return &mons[PM_MIGO_WARRIOR];
2834 case 8:
2835 if (level_difficulty() > 14) return &mons[PM_ARMED_MIGO_QUEEN];
2836 else return &mons[PM_MIGO_WARRIOR];
2837 case 9:
2838 if (level_difficulty() > 25) return &mons[PM_MIGO_EMPRESS];
2839 else return &mons[PM_MIGO_WARRIOR];
2840 case 10:
2841 return &mons[PM_MI_GO__THE_FUNGI_FROM_YUGGOTH];
2842 case 11:
2843 return &mons[PM_GOMI_WORKER];
2844 case 12:
2845 return &mons[PM_GOMI_SOLDIER];
2846 case 13:
2847 return &mons[PM_GOMI_PHILOSOPHER];
2848 case 14:
2849 if (level_difficulty() > 14) return &mons[PM_GOMI_QUEEN];
2850 else return &mons[PM_MIGO_WARRIOR];
2851 case 15:
2852 return &mons[PM_MI_GO_OPERATOR];
2853 case 16:
2854 return &mons[PM_MIGO_DRONL];
2855 case 17:
2856 return &mons[PM_MIGO_WORRIORTYPE];
2857 case 18:
2858 if (level_difficulty() > 14) return &mons[PM_MIGO_BARONESS];
2859 else return &mons[PM_MIGO_WARRIOR];
2860 default:
2861 return &mons[PM_MIGO_DRONE];
2866 struct permonst *
2867 realzoomon()
2869 int depthuz;
2871 if (iszapem && In_ZAPM(&u.uz) && !(u.zapemescape)) {
2873 d_level zapemlevel;
2874 int zapemdepth;
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;
2885 int preverdepth;
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 */
2892 } else {
2893 depthuz = depth(&u.uz);
2896 if ((depthuz < 6) && !In_sokoban_real(&u.uz) && !In_mainframe(&u.uz) && (level_difficulty() < (5 + rn2(2)))) {
2897 switch (rnd(3)) {
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 */
2935 struct permonst *
2936 squadmon() /* return soldier types. */
2938 int sel_prob, i, mndx;
2940 sel_prob = rnd(80+level_difficulty());
2942 int depthuz;
2944 if (iszapem && In_ZAPM(&u.uz) && !(u.zapemescape)) {
2946 d_level zapemlevel;
2947 int zapemdepth;
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;
2958 int preverdepth;
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 */
2965 } else {
2966 depthuz = depth(&u.uz);
2969 if ((depthuz < 8) && !In_sokoban_real(&u.uz) && !In_mainframe(&u.uz) && (level_difficulty() < (4 + rn2(2)))) {
2970 switch (rnd(5)) {
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;
2977 goto gotone;
2980 if (!rn2(100)) { /* ChatGPT soldier types; higher-level ones are very powerful and therefore should be rare --Amy */
2981 chatgptsoldiers:
2982 switch (rnd(21)) {
2983 case 1:
2984 mndx = (PM_VANGUARD_TROOPER + rn2(10));
2985 break;
2986 case 2:
2987 mndx = PM_SHADOW_COMMANDO;
2988 break;
2989 case 3:
2990 mndx = PM_ELITE_SENTINEL;
2991 break;
2992 case 4:
2993 mndx = rn2(2) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_ELITE_SENTINEL;
2994 break;
2995 case 5:
2996 mndx = rn2(3) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_STORMBREAKER_INFANTRY;
2997 break;
2998 case 6:
2999 mndx = (rn2(3) || (level_difficulty() < 11) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_VENOMOUS_OPERATIVE;
3000 break;
3001 case 7:
3002 mndx = (rn2(5) || (level_difficulty() < 13) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_CHAOS_REAVER;
3003 break;
3004 case 8:
3005 mndx = (rn2(5) || (level_difficulty() < 15) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_NOVA_SHOCK_TROOPER;
3006 break;
3007 case 9:
3008 mndx = (rn2(7) || (level_difficulty() < 17) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_LUNAR_WARDEN;
3009 break;
3010 case 10:
3011 mndx = (rn2(7) || (level_difficulty() < 21) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_DREADNOUGHT_MARINE;
3012 break;
3013 case 11:
3014 mndx = (rn2(10) || (level_difficulty() < 26) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_ARCTIC_BLADESTORM;
3015 break;
3016 case 12:
3017 mndx = (rn2(10) || (level_difficulty() < 31) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_RADIANT_GUARDIAN;
3018 break;
3019 case 13:
3020 mndx = (rn2(15) || (level_difficulty() < 36) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_EMBERSTRIKE_GUNNER;
3021 break;
3022 case 14:
3023 mndx = (rn2(15) || (level_difficulty() < 41) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_THUNDERCLAP_TROOPER;
3024 break;
3025 case 15:
3026 mndx = (rn2(21) || (level_difficulty() < 46) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_CELESTIAL_PARAGON;
3027 break;
3028 case 16:
3029 mndx = (rn2(21) || (level_difficulty() < 51) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_SOULFIRE_SENTINEL;
3030 break;
3031 case 17:
3032 mndx = (rn2(30) || (level_difficulty() < 53) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_SPECTRAL_ENFORCER;
3033 break;
3034 case 18:
3035 mndx = (rn2(30) || (level_difficulty() < 55) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_ABYSSAL_LEGIONNAIRE;
3036 break;
3037 case 19:
3038 mndx = (rn2(50) || (level_difficulty() < 56) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_CYBERNETIC_VANGUARD;
3039 break;
3040 case 20:
3041 mndx = (rn2(70) || (level_difficulty() < 57) ) ? (PM_VANGUARD_TROOPER + rn2(10)) : PM_ASTRAL_BLADEMASTER;
3042 break;
3043 case 21:
3044 mndx = PM_KUNG_FU_JESTER;
3045 break;
3047 goto gotone;
3050 if (sel_prob < 81) {
3051 switch (rnd(21)) {
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;
3074 goto gotone;
3076 if (sel_prob < 96) {
3077 switch (rnd(8)) {
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;
3087 goto gotone;
3089 if (sel_prob < 100) {
3090 switch (rnd(4)) {
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;
3096 goto gotone;
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)) {
3104 mndx = PM_GENERAL;
3105 goto gotone;
3108 /* if we got here, the difficulty level is high enough, so make a captain --Amy */
3109 switch (rnd(3)) {
3110 case 1: mndx = PM_CAPTAIN; break;
3111 case 2: mndx = PM_GOTHIC_CAPTAIN; break;
3112 case 3: mndx = PM_URBAN_CAMO_CAPTAIN; break;
3115 goto gotone;
3117 gotone:
3118 if (!(mvitals[mndx].mvflags & G_GONE)) return(&mons[mndx]);
3119 else return((struct permonst *) 0);
3122 struct permonst *
3123 theareamon()
3125 if (!rn2(500)) {
3126 if (urole.nemesnum != NON_PM && (monster_difficulty() >= mons[urole.nemesnum].mlevel) ) return (&mons[urole.nemesnum]);
3129 switch (rnd(4)) {
3130 case 1:
3131 if (urole.enemy1num != NON_PM && (monster_difficulty() >= mons[urole.enemy1num].mlevel) ) return (&mons[urole.enemy1num]);
3132 return (mkclass(urole.enemy1sym, 0));
3133 case 2:
3134 if (urole.enemy2num != NON_PM && (monster_difficulty() >= mons[urole.enemy2num].mlevel)) return (&mons[urole.enemy2num]);
3135 return (mkclass(urole.enemy2sym, 0));
3136 case 3:
3137 return (mkclass(urole.enemy1sym, 0));
3138 case 4:
3139 return (mkclass(urole.enemy2sym, 0));
3141 return (&mons[PM_HUMAN]); /* fail safe */
3144 struct permonst *
3145 lettersaladmon()
3147 switch (rnd(52)) {
3148 case 1:
3149 return (mkclass(S_ANT,0));
3150 case 2:
3151 return (mkclass(S_BLOB,0));
3152 case 3:
3153 return (mkclass(S_COCKATRICE,0));
3154 case 4:
3155 return (mkclass(S_DOG,0));
3156 case 5:
3157 return (mkclass(S_EYE,0));
3158 case 6:
3159 return (mkclass(S_FELINE,0));
3160 case 7:
3161 return (mkclass(S_GREMLIN,0));
3162 case 8:
3163 return (mkclass(S_HUMANOID,0));
3164 case 9:
3165 return (mkclass(S_IMP,0));
3166 case 10:
3167 return (mkclass(S_JELLY,0));
3168 case 11:
3169 return (mkclass(S_KOBOLD,0));
3170 case 12:
3171 return (mkclass(S_LEPRECHAUN,0));
3172 case 13:
3173 return (mkclass(S_MIMIC,0));
3174 case 14:
3175 return (mkclass(S_NYMPH,0));
3176 case 15:
3177 return (mkclass(S_ORC,0));
3178 case 16:
3179 return (mkclass(S_PIERCER,0));
3180 case 17:
3181 return (mkclass(S_QUADRUPED,0));
3182 case 18:
3183 return (mkclass(S_RODENT,0));
3184 case 19:
3185 return (mkclass(S_SPIDER,0));
3186 case 20:
3187 return (mkclass(S_TRAPPER,0));
3188 case 21:
3189 return (mkclass(S_UNICORN,0));
3190 case 22:
3191 return (mkclass(S_VORTEX,0));
3192 case 23:
3193 return (mkclass(S_WORM,0));
3194 case 24:
3195 return (mkclass(S_XAN,0));
3196 case 25:
3197 return (mkclass(S_LIGHT,0));
3198 case 26:
3199 return (mkclass(S_ZOUTHERN,0));
3200 case 27:
3201 return (mkclass(S_ANGEL,0));
3202 case 28:
3203 return (mkclass(S_BAT,0));
3204 case 29:
3205 return (mkclass(S_CENTAUR,0));
3206 case 30:
3207 return (mkclass(S_DRAGON,0));
3208 case 31:
3209 return (mkclass(S_ELEMENTAL,0));
3210 case 32:
3211 return (mkclass(S_FUNGUS,0));
3212 case 33:
3213 return (mkclass(S_GNOME,0));
3214 case 34:
3215 return (mkclass(S_GIANT,0));
3216 case 35:
3217 return (mkclass(S_FLYFISH,0));
3218 case 36:
3219 return (mkclass(S_JABBERWOCK,0));
3220 case 37:
3221 return (mkclass(S_KOP,0));
3222 case 38:
3223 return (mkclass(S_LICH,0));
3224 case 39:
3225 return (mkclass(S_MUMMY,0));
3226 case 40:
3227 return (mkclass(S_NAGA,0));
3228 case 41:
3229 return (mkclass(S_OGRE,0));
3230 case 42:
3231 return (mkclass(S_PUDDING,0));
3232 case 43:
3233 return (mkclass(S_QUANTMECH,0));
3234 case 44:
3235 return (mkclass(S_RUSTMONST,0));
3236 case 45:
3237 return (mkclass(S_SNAKE,0));
3238 case 46:
3239 return (mkclass(S_TROLL,0));
3240 case 47:
3241 return (mkclass(S_UMBER,0));
3242 case 48:
3243 return (mkclass(S_VAMPIRE,0));
3244 case 49:
3245 return (mkclass(S_WRAITH,0));
3246 case 50:
3247 return (mkclass(S_XORN,0));
3248 case 51:
3249 return (mkclass(S_YETI,0));
3250 case 52:
3251 return (mkclass(S_ZOMBIE,0));
3253 return (&mons[PM_HUMAN]); /* fail safe */
3256 struct permonst *
3257 doomsquadmon()
3259 int i = rn2(60 + (3*level_difficulty()) );
3261 int depthuz;
3263 if (iszapem && In_ZAPM(&u.uz) && !(u.zapemescape)) {
3265 d_level zapemlevel;
3266 int zapemdepth;
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;
3277 int preverdepth;
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 */
3284 } else {
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]);
3298 struct permonst *
3299 illusionmon()
3302 switch (rnd(35)) {
3303 case 1:
3304 return specialtensmon(288); break; /* AD_SPC2 */
3305 case 2:
3306 return specialtensmon(203); break; /* AD_STUN */
3307 case 3:
3308 return specialtensmon(223); break; /* AD_DRIN */
3309 case 4:
3310 return specialtensmon(227); break; /* AD_HALU */
3311 case 5:
3312 return specialtensmon(239); break; /* AD_DARK */
3313 case 6:
3314 return specialtensmon(246); break; /* AD_FEAR */
3315 case 7:
3316 return specialtensmon(251); break; /* AD_FAKE */
3317 case 8:
3318 return specialtensmon(252); break; /* AD_LETH */
3319 case 9:
3320 return specialtensmon(253); break; /* AD_CNCL */
3321 case 10:
3322 return specialtensmon(254); break; /* AD_BANI */
3323 case 11:
3324 return specialtensmon(255); break; /* AD_WISD */
3325 case 12:
3326 return specialtensmon(264); break; /* AD_HODS */
3327 case 13:
3328 return specialtensmon(265); break; /* AD_CHRN */
3329 case 14:
3330 return specialtensmon(266); break; /* AD_WEEP */
3331 case 15:
3332 return specialtensmon(269); break; /* AD_STTP */
3333 case 16:
3334 return specialtensmon(270); break; /* AD_DEPR */
3335 case 17:
3336 return specialtensmon(272); break; /* AD_LAZY */
3337 case 18:
3338 return specialtensmon(278); break; /* AD_INER */
3339 case 19:
3340 return specialtensmon(295); break; /* AD_VULN */
3341 case 20:
3342 return specialtensmon(298); break; /* AD_AMNE */
3343 case 21:
3344 return specialtensmon(307); break; /* AD_INSA */
3345 case 22:
3346 return specialtensmon(308); break; /* AD_TRAP */
3347 case 23:
3348 return specialtensmon(342); break; /* M4_SHAPESHIFT */
3349 case 24:
3350 return specialtensmon(363); break; /* AD_SANI */
3351 case 25:
3352 return specialtensmon(366); break; /* AD_SHAN */
3353 case 26:
3354 return specialtensmon(368); break; /* AD_TERR */
3355 case 27:
3356 return specialtensmon(369); break; /* AD_FEMI */
3357 case 28:
3358 return specialtensmon(370); break; /* AD_LEVI */
3359 case 29:
3360 return specialtensmon(371); break; /* AD_ILLU */
3361 case 30:
3362 return specialtensmon(372); break; /* AD_MCRE */
3363 case 31:
3364 return specialtensmon(374); break; /* AD_DEBU */
3365 case 32:
3366 return specialtensmon(375); break; /* AD_UNPR */
3367 case 33:
3368 return specialtensmon(378); break; /* AD_BLAS */
3369 case 34:
3370 return specialtensmon(428); break; /* AD_INVE */
3371 case 35:
3372 return specialtensmon(429); break; /* AD_WNCE */
3373 default:
3374 return specialtensmon(288); break; /* AD_SPC2 */
3379 struct permonst *
3380 evilroommon()
3382 register struct permonst *ptr;
3383 register int ct = 0;
3385 ptr = rndmonst();
3387 do {
3389 ptr = rndmonst();
3390 ct++;
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) ));
3396 u.mondiffhack = 0;
3398 return ptr;
3402 struct permonst *
3403 machineroommon()
3405 register struct permonst *ptr;
3406 register int ct = 0;
3408 ptr = rndmonst();
3410 do {
3412 ptr = rndmonst();
3413 ct++;
3414 if (ct && (ct % 10000 == 0)) u.mondiffhack++;
3415 if (!rn2(2000)) reset_rndmonst(NON_PM);
3417 } while ( !ptr || (!nonliving(ptr) && (ct < 250000) ));
3419 u.mondiffhack = 0;
3421 return ptr;
3426 * save_room : A recursive function that saves a room and its subrooms
3427 * (if any).
3430 STATIC_OVL void
3431 save_room(fd, r)
3432 int fd;
3433 struct mkroom *r;
3435 short i;
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!
3450 void
3451 mktraproom()
3453 struct mkroom *sroom;
3455 register int sx,sy = 0;
3456 int rtrap;
3457 int randomnes = 0;
3459 if(!(sroom = pick_room(FALSE))) return;
3461 sroom->rtype = TRAPROOM;
3462 rtrap = rndtrap();
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)*/) {
3472 if(rn2(5))
3473 (void) maketrap(sx, sy, rtrap, 100, TRUE);
3474 if (randomnes == 1) rtrap = rndtrap();
3479 void
3480 mkbossroom()
3482 struct mkroom *sroom;
3484 register int sx,sy = 0;
3485 int rtrap;
3486 int randomnes = 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;
3503 void
3504 mknastycentral()
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;
3524 void
3525 mkemptydesert()
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;
3547 void
3548 mkchaosroom()
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();
3569 void
3570 mkmixedpool()
3573 struct mkroom *sroom;
3574 register int sx,sy = 0;
3575 coord mm;
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);
3596 void
3597 mkshowerroom()
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;
3620 void
3621 mkcentraltedium()
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) ) {
3636 switch (rnd(10)) {
3637 case 1:
3638 case 2:
3639 case 3:
3640 case 4:
3641 case 5:
3642 case 6:
3643 case 7:
3644 levl[sx][sy].typ = HIGHWAY;
3645 break;
3646 case 8:
3647 case 9:
3648 levl[sx][sy].typ = GRASSLAND;
3649 break;
3650 case 10:
3651 break;
3655 if((levl[sx][sy].typ > DBWALL) && !t_at(sx,sy) ) {
3656 if(!rn2(10)) {
3657 if(!rn2(10)) {
3658 if(!rn2(10)) {
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);
3672 void
3673 mkrampageroom()
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);
3698 void
3699 mkpoolroom()
3701 struct mkroom *sroom;
3702 schar typ;
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)*/) {
3719 if(rn2(5)) {
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;
3731 void
3732 mkinsideroom()
3734 struct mkroom *sroom;
3735 int typ, typ2;
3736 register int sx,sy = 0;
3737 coord mm;
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;
3751 if (!rn2(10)) {
3752 if (somexy(sroom, &mm))
3753 (void) mksobj_at(TREASURE_CHEST, mm.x, mm.y, TRUE, FALSE, FALSE);
3755 while (!rn2(2)) {
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();
3769 if(rn2(3)) {
3770 levl[sx][sy].typ = typ;
3772 if (typ == FOUNTAIN) level.flags.nfountains++;
3773 if (typ == SINK) level.flags.nsinks++;
3775 if (typ == GRAVE) {
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);
3783 if (!otmp) return;
3784 curse(otmp);
3785 otmp->ox = sx;
3786 otmp->oy = sy;
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;
3806 void
3807 mkriverroom()
3809 struct mkroom *sroom;
3810 schar typ;
3811 register int sx,sy = 0;
3812 coord mm;
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;
3823 if (!rn2(30)) {
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;
3844 void
3845 mkstatueroom()
3847 struct mkroom *sroom;
3848 schar typ;
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)*/) {
3863 if(rn2(2))
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++)
3869 if(rn2(2))
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;
3887 void
3888 save_rooms(fd)
3889 int fd;
3891 short i;
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]);
3899 STATIC_OVL void
3900 rest_room(fd, r)
3901 int fd;
3902 struct mkroom *r;
3904 short 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
3916 * the disk.
3919 void
3920 rest_rooms(fd)
3921 int fd;
3923 short i;
3925 mread(fd, (void *) &nroom, sizeof(nroom));
3926 nsubroom = 0;
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;
3934 #endif /* OVLB */
3936 /*mkroom.c*/