Blindfold removal fix
[slashemextended.git] / src / mon.c
blobb2861bac22860ce01c6baabf221f612230b0693b
1 /* SCCS Id: @(#)mon.c 3.4 2003/12/04 */
2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* If you're using precompiled headers, you don't want this either */
6 #ifdef MICROPORT_BUG
7 #define MKROOM_H
8 #endif
10 #include "hack.h"
11 #include "mfndpos.h"
12 #include "edog.h"
13 #include "artifact.h"
14 #include "display.h"
15 #include "global.h"
16 #include "quest.h"
17 #include "qtext.h"
18 #include "epri.h"
20 #include <ctype.h>
22 void display_monster(XCHAR_P,XCHAR_P,struct monst *,int,XCHAR_P);
24 STATIC_DCL boolean restrap(struct monst *);
25 STATIC_DCL long mm_aggression(struct monst *,struct monst *);
26 #ifdef OVL2
27 STATIC_DCL int pick_animal(void);
28 STATIC_DCL int select_newcham_form(struct monst *);
29 STATIC_DCL void kill_eggs(struct obj *);
30 #endif
32 /* make wraith luring unnecessary --Amy */
34 #define STARVATION_SPECIFIC_NOCORPSE(mdat) \
35 (!is_reviver(mdat) && !(mdat == &mons[PM_TROLL_ZOMBIE]) && !(mdat == &mons[PM_EGO_TROLL_MUMMY]) && !(mdat == &mons[PM_EVIL_TROLL_MUMMY]) && !(mdat == &mons[PM_TROLL_PERMAMIMIC_MUMMY]) && !(mdat == &mons[PM_TROLL_MUMMY]))
37 #define Qstatf(x) (quest_status.x)
39 #if 0
40 /* part of the original warning code which was replaced in 3.3.1 */
41 #ifdef OVL1
42 #define warnDelay 10
43 long lastwarntime;
44 int lastwarnlev;
47 STATIC_DCL void warn_effects(void);
48 #endif /* OVL1 */
49 #endif /* 0 */
51 #ifndef OVLB
52 STATIC_VAR int cham_to_pm[];
53 #else
54 STATIC_DCL struct obj *make_corpse(struct monst *);
55 STATIC_DCL void m_detach(struct monst *, struct permonst *);
56 STATIC_DCL void lifesaved_monster(struct monst *);
57 static void unpoly_monster(struct monst *);
58 STATIC_DCL boolean level_specific_nocorpse(struct permonst *);
60 STATIC_OVL boolean
61 level_specific_nocorpse(mdat)
62 struct permonst *mdat;
64 #ifdef REINCARNATION
65 if (Is_rogue_level(&u.uz) && rn2(2)) return TRUE;
66 #endif
67 if ((level.flags.graveyard || mdat == &mons[PM_WRAITH] || mdat == &mons[PM_HUDDLED_WRAITH] || mdat == &mons[PM_HITTABLE_WRAITH] || mdat == &mons[PM_BIG_WRAITH] || mdat == &mons[PM_CREVICE_WRAITH] || mdat == &mons[PM_HUGE_WRAITH] || mdat == &mons[PM_GIGANTIC_WRAITH] || mdat == &mons[PM_WAFER_THIN_MINT] || mdat == &mons[PM_WRAITH_SHAMAN] || mdat == &mons[PM_NASTY_WRAITH] || mdat == &mons[PM_CREEPING___] ) && is_undead(mdat) && !is_reviver(mdat) && mdat != &mons[PM_TROLL_ZOMBIE] && mdat != &mons[PM_EGO_TROLL_MUMMY] && mdat != &mons[PM_EVIL_TROLL_MUMMY] && mdat != &mons[PM_TROLL_PERMAMIMIC_MUMMY] && mdat != &mons[PM_TROLL_MUMMY] && mdat != &mons[PM_VECNA] && rn2(3)) return TRUE;
69 return FALSE;
72 /* convert the monster index of an undead to its living counterpart */
73 int
74 undead_to_corpse(mndx)
75 int mndx;
78 switch (mndx) {
79 case PM_SMALLER_MIND_FLAYER_ZOMBIE:
80 case PM_SMALLERE_MIND_FLAYER_MUMMY: mndx = PM_MIND_FLAYER; break;
81 case PM_KOBOLD_ZOMBIE:
82 case PM_GHEY_KOBOLD_ZOMBIE:
83 case PM_EVIL_KOBOLD_MUMMY:
84 case PM_KOBOLD_MUMMY: mndx = PM_KOBOLD; break;
85 case PM_OGRE_ZOMBIE:
86 case PM_EVIL_OGRE_MUMMY:
87 case PM_OGRE_MUMMY: mndx = PM_OGRE; break;
88 case PM_DWARF_ZOMBIE:
89 case PM_EVIL_DWARF_MUMMY:
90 case PM_DWARF_MUMMY: mndx = PM_DWARF; break;
91 case PM_COCKATRICE_ZOMBIE:
92 case PM_COCKATRICE_MUMMY: mndx = PM_COCKATRICE; break;
93 case PM_GNOME_ZOMBIE:
94 case PM_EVIL_GNOME_MUMMY:
95 case PM_GNOME_MUMMY: mndx = PM_GNOME; break;
96 case PM_ORC_ZOMBIE:
97 case PM_NEVER_AN_ORC_ZOMBIE:
98 case PM_DEFINITELY_NOT_ORC_MUMMY:
99 case PM_EVIL_ORC_MUMMY:
100 case PM_ORC_MUMMY: mndx = PM_ORC; break;
101 case PM_DROW_MUMMY:
102 case PM_DROW_ZOMBIE:
103 case PM_ELF_ZOMBIE:
104 case PM_EVIL_ELF_MUMMY:
105 case PM_EVIL_DROW_MUMMY:
106 case PM_ELF_MUMMY: mndx = PM_ELF; break;
107 case PM_VAMPIRE:
108 case PM_VAMPIRE_LORD:
109 case PM_VAMPIRE_MAGE:
110 case PM_HUMAN_ZOMBIE:
111 case PM_GRUNTHACK_ZOMBIE:
112 case PM_GRUNT_A_LOT_ZOMBIE:
113 case PM_BLACK_DEATH:
114 case PM_DRAUGR_DEATHLORD:
115 case PM_WALKING_CORPSE:
116 case PM_HUNGRY_DEAD_POTATO:
117 case PM_HUNGRY_DEAD:
118 case PM_ROTTING_CARCASS:
119 case PM_DROWNED_DEAD_ONE:
120 case PM_FLESHEATER:
121 case PM_PALE_SHAMBLER:
122 case PM_EMBER_THRALL:
123 case PM_FIERY_CARCASS:
124 case PM_ZOMBIE_CAR:
125 case PM_PLAGUE_BEARER:
126 case PM_GREENER_ZOMBIE:
127 case PM_ZOMBIE_BADDIE:
128 case PM_ZOMBIE_WARRIOR:
129 case PM_MAFIOSO:
130 case PM_TALIBAN_MILITIA:
131 case PM_M__TO_M___:
132 case PM_ETA_TERRORIST:
133 case PM_BLACK_ONES:
134 case PM_CORNFLAKE_ZOMBIE:
135 case PM_ZOMBIE:
136 case PM_WEAUM_ZOMBIE:
137 case PM_GNOLL_GHOUL:
138 case PM_DRAUGR_ZOMBIE:
139 case PM_STEEL_ZOMBIE:
140 case PM_DRAUGR_MUMMY:
141 case PM_GREATER_MUMMY:
142 case PM_HALF_DRAGON_MUMMY:
143 case PM_HALF_DRAGON_ZOMBIE:
144 case PM_MUMMY:
145 case PM_TOMB_MUMMY:
146 case PM_CADAVER:
147 case PM_POISONOUS_WIMP:
148 case PM_PRESERVED_DEAD:
149 case PM_RECEIVED_DEAD_POTATO:
150 case PM_EMBALMED_CORPSE:
151 case PM_TOXICATED_POTATO:
152 case PM_DRIED_CORPSE:
153 case PM_CORRUPTED_SHAMBLER:
154 case PM_DEAD_PHARAO:
155 case PM_DECAYED_CORPSE:
156 case PM_WAIVED_POTATO:
157 case PM_DEAD_POTATO:
158 case PM_ADOM_MUMMY:
159 case PM_EVIL_HUMAN_MUMMY:
160 case PM_MUMMY_HOMER:
161 case PM_HUMAN_MUMMY: mndx = PM_HUMAN; break;
162 case PM_GIANT_ZOMBIE:
163 case PM_EVIL_GIANT_MUMMY:
164 case PM_GIANT_MUMMY: mndx = PM_GIANT; break;
165 case PM_ETTIN_ZOMBIE:
166 case PM_DARK_BACKGROUND_ETTIN_ZOMBIE:
167 case PM_SUMTHINS_KILLIN_YA:
168 case PM_HEHEHE_YOUR_GAME_ENDED_BRO:
169 case PM_PROTESTAINST_ETTIN_ZOMBIE:
170 case PM_CALLS_ITSELF_ETTIN_MUMMY:
171 case PM_ORANGE_ETTIN_MUMMY:
172 case PM_EVIL_ETTIN_MUMMY:
173 case PM_NON_SEEN_ETTIN_MUMMY:
174 case PM_HAHA_YOU_JUST_DIED:
175 case PM_CANNOT_KILL_WHAT_YOU_CANNOT_SEE:
176 case PM_ETTIN_MUMMY: mndx = PM_ETTIN; break;
177 case PM_TROLL_ZOMBIE:
178 case PM_EGO_TROLL_MUMMY:
179 case PM_TROLL_PERMAMIMIC_MUMMY:
180 case PM_EVIL_TROLL_MUMMY:
181 case PM_TROLL_MUMMY: mndx = PM_TROLL; break;
182 case PM_MIMIC_MUMMY: mndx = PM_GIANT_MIMIC; break;
183 case PM_TASMANIAN_ZOMBIE: mndx = PM_TASMANIAN_DEVIL; break;
184 case PM_ZOMBIE_PROSTITUTE: mndx = PM_NORMAL_PROSTITUTE; break;
185 default: break;
187 return mndx;
190 /* Convert the monster index of some monsters (such as quest guardians)
191 * to their generic species type.
193 * Return associated character class monster, rather than species
194 * if mode is 1.
197 genus(mndx, mode)
198 int mndx, mode;
200 switch (mndx) {
201 /* Quest guardians */
202 case PM_STUDENT: mndx = mode ? PM_ARCHEOLOGIST : PM_HUMAN; break;
203 case PM_CHIEFTAIN: mndx = mode ? PM_BARBARIAN : PM_HUMAN; break;
204 case PM_NEANDERTHAL: mndx = mode ? PM_CAVEMAN : PM_HUMAN; break;
205 case PM_ATTENDANT: mndx = mode ? PM_HEALER : PM_HUMAN; break;
206 case PM_UNFORTUNATE_VICTIM: mndx = mode ? PM_BLEEDER : PM_HUMAN; break;
207 case PM_PAGE: mndx = mode ? PM_KNIGHT : PM_HUMAN; break;
208 case PM_RHYMER: mndx = mode ? PM_BARD : PM_HUMAN; break;
209 case PM_ABBOT: mndx = mode ? PM_MONK : PM_HUMAN; break;
210 case PM_ACOLYTE: mndx = mode ? PM_PRIEST : PM_HUMAN; break;
211 case PM_HUNTER: mndx = mode ? PM_RANGER : PM_HUMAN; break;
212 case PM_THUG: mndx = mode ? PM_ROGUE : PM_HUMAN; break;
213 case PM_ROSHI: mndx = mode ? PM_SAMURAI : PM_HUMAN; break;
214 case PM_GUIDE: mndx = mode ? PM_TOURIST : PM_HUMAN; break;
215 case PM_APPRENTICE: mndx = mode ? PM_WIZARD : PM_HUMAN; break;
216 case PM_SUPER_WARRIOR: mndx = mode ? PM_VALKYRIE : PM_HUMAN; break;
217 default:
218 if (mndx >= LOW_PM && mndx < NUMMONS) {
219 struct permonst *ptr = &mons[mndx];
220 if (is_human(ptr)) mndx = PM_HUMAN;
221 else if (is_elf(ptr)) mndx = PM_ELF;
222 else if (is_dwarf(ptr)) mndx = PM_DWARF;
223 else if (is_gnome(ptr)) mndx = PM_GNOME;
224 else if (is_orc(ptr)) mndx = PM_ORC;
226 break;
228 return mndx;
231 /* convert monster index to chameleon index */
233 pm_to_cham(mndx)
234 int mndx;
236 int mcham;
238 switch (mndx) {
239 case PM_CHAMELEON: mcham = CHAM_CHAMELEON; break;
240 case PM_EVIL_CHAMELEON: mcham = CHAM_EVIL_CHAMELEON; break;
241 case PM_CHAMECHAUN: mcham = CHAM_CHAMECHAUN; break;
242 case PM_METAMORPHOSE: mcham = CHAM_METAMORPHOSE; break;
243 case PM_GHELEON: mcham = CHAM_GHELEON; break;
244 case PM_LAMECHAM: mcham = CHAM_LAMECHAM; break;
245 case PM_SHAPESHIFTING_EXPERTISE: mcham = CHAM_SHAPESHIFTING_EXPERTISE; break;
246 case PM_RAINBOW_SPHERE: mcham = CHAM_RAINBOW_SPHERE; break;
247 case PM_ELONA_BADGER: mcham = CHAM_ELONA_BADGER; break;
248 case PM_PURPLE_R: mcham = CHAM_PURPLE_R; break;
249 case PM_VAMPSHIFTER: mcham = CHAM_VAMPSHIFTER; break;
250 case PM_UNGENOCIDABLE_VAMPSHIFTER: mcham = CHAM_UNGENOCIDABLE_VAMPSHIFTER; break;
251 case PM_CHARMONIE: mcham = CHAM_CHARMONIE; break;
252 case PM_EDOTO: mcham = CHAM_EDOTO; break;
253 case PM_COCKAMELEON: mcham = CHAM_COCKAMELEON; break;
254 case PM_GREEN_SLAAD: mcham = CHAM_GREEN_SLAAD; break;
255 case PM_KARMA_CHAMELEON: mcham = CHAM_KARMA_CHAMELEON; break;
256 case PM_DOPPELGANGER: mcham = CHAM_DOPPELGANGER; break;
257 case PM_METAL_DOPPELGANGER: mcham = CHAM_METAL_DOPPELGANGER; break;
258 case PM_DOPPLEZON: mcham = CHAM_DOPPLEZON; break;
259 case PM_SANDESTIN: mcham = CHAM_SANDESTIN; break;
260 case PM_MISSINGNO: mcham = CHAM_MISSINGNO; break;
261 case PM_TRANSFORMER: mcham = CHAM_TRANSFORMER; break;
262 case PM_WARPER: mcham = CHAM_WARPER; break;
263 case PM_CHAOS_SHAPECHANGER: mcham = CHAM_CHAOS_SHAPECHANGER; break;
264 case PM_PEANUT__BUTTER_AND_JELLY_SANDWICH: mcham = CHAM_SANDWICH; break;
265 case PM_JUNOW_TRICE: mcham = CHAM_JUNOW_TRICE; break;
266 case PM_POLY_FLAYER: mcham = CHAM_POLY_FLAYER; break;
267 case PM_WILD_CHANGE_NYMPH: mcham = CHAM_WILD_CHANGE_NYMPH; break;
268 case PM_VERY_POLY_NYMPH: mcham = CHAM_VERY_POLY_NYMPH; break;
269 case PM_CORTEGEX: mcham = CHAM_CORTEGEX; break;
270 case PM_CHANGE_EXPLODER: mcham = CHAM_CHANGE_EXPLODER; break;
271 case PM_BAM_CHAM: mcham = CHAM_BAM_CHAM; break;
272 case PM_LAURA_S_PARLOR_TRICK: mcham = CHAM_LAURA_S_PARLOR_TRICK; break;
273 case PM_LAURA_S_MASTERPIECE: mcham = CHAM_LAURA_S_MASTERPIECE; break;
274 case PM_TSCHANG_SEPHIRAH: mcham = CHAM_TSCHANG_SEPHIRAH; break;
275 case PM_GLONK_SEPHIRAH: mcham = CHAM_GLONK_SEPHIRAH; break;
276 case PM_KUSCHOING_SEPHIRAH: mcham = CHAM_KUSCHOING_SEPHIRAH; break;
277 case PM_ULTRA_DESTRUCTIVE_MONSTER: mcham = CHAM_ULTRA_DESTRUCTIVE_MONSTER; break;
278 case PM_DARN_DEMENTOR: mcham = CHAM_DARN_DEMENTOR; break;
279 case PM_SHOEMELEON: mcham = CHAM_SHOEMELEON; break;
280 case PM_POLYFESHNEE: mcham = CHAM_POLYFESHNEE; break;
281 case PM_COVETOUSLEON: mcham = CHAM_COVETOUSLEON; break;
282 case PM_THE_ZRUTINATOR: mcham = CHAM_ZRUTINATOR; break;
283 case PM_WHORED_HORE: mcham = CHAM_WHORED_HORE; break;
284 case PM_LULU_ASS: mcham = CHAM_LULU_ASS; break;
285 case PM_TENDER_JESSE: mcham = CHAM_TENDER_JESSE; break;
286 case PM_ELEROTIC_DREAM_WOMAN: mcham = CHAM_ELEROTIC_DREAM_WOMAN; break;
287 case PM_MARTIIN: mcham = CHAM_MARTIIN; break;
288 case PM_FOREPREACHER_CONVERTER: mcham = CHAM_FOREPREACHER_CONVERTER; break;
289 case PM_RICTIM_TERRORIZER: mcham = CHAM_RICTIM_TERRORIZER; break;
290 case PM_POLYMORPHITIC_WOLF: mcham = CHAM_POLYMORPHITIC_WOLF; break;
291 case PM_OFFDIVER: mcham = CHAM_OFFDIVER; break;
292 case PM_SLUMBER_HULK: mcham = CHAM_SLUMBER_HULK; break;
293 case PM_IVEL_WUXTINA: mcham = CHAM_IVEL_WUXTINA; break;
294 case PM_EARLY_LEON: mcham = CHAM_EARLY_LEON; break;
295 case PM_CHAMELON: mcham = CHAM_CHAMELON; break;
296 case PM_COMMA_CHAMELEON: mcham = CHAM_COMMA_CHAMELEON; break;
297 case PM_CHANGELING: mcham = CHAM_CHANGELING; break;
298 case PM_CHANGELING_ZOMBIE: mcham = CHAM_CHANGELING_ZOMBIE; break;
299 case PM_CHANGELING_MUMMY: mcham = CHAM_CHANGELING_MUMMY; break;
300 case PM_UNIQUE_SHIFTER: mcham = CHAM_UNIQUE_SHIFTER; break;
301 case PM_PLAYER_CHANGELING: mcham = CHAM_PLAYER_CHANGELING; break;
302 case PM_CHANGERING_KELPIE: mcham = CHAM_CHANGERING_KELPIE; break;
303 case PM_EACH_UISGE: mcham = CHAM_EACH_UISGE; break;
304 case PM_DITTO: mcham = CHAM_DITTO; break;
305 case PM_GIANT_CHAMELEON: mcham = CHAM_GIANT_CHAMELEON; break;
306 default: mcham = CHAM_ORDINARY; break;
308 return mcham;
311 /* convert chameleon index to monster index - these must be in the same order as monst.h */
312 STATIC_VAR int cham_to_pm[] = {
313 NON_PM, /* placeholder for CHAM_ORDINARY */
314 PM_CHAMELEON,
315 PM_DOPPELGANGER,
316 PM_DOPPLEZON,
317 PM_SANDESTIN,
318 PM_MISSINGNO,
319 PM_TRANSFORMER,
320 PM_WARPER,
321 PM_CHAOS_SHAPECHANGER,
322 PM_PEANUT__BUTTER_AND_JELLY_SANDWICH,
323 PM_KARMA_CHAMELEON,
324 PM_JUNOW_TRICE,
325 PM_POLY_FLAYER,
326 PM_WILD_CHANGE_NYMPH,
327 PM_VERY_POLY_NYMPH,
328 PM_CORTEGEX,
329 PM_CHANGE_EXPLODER,
330 PM_BAM_CHAM,
331 PM_LAURA_S_PARLOR_TRICK,
332 PM_LAURA_S_MASTERPIECE,
333 PM_TSCHANG_SEPHIRAH,
334 PM_GLONK_SEPHIRAH,
335 PM_KUSCHOING_SEPHIRAH,
336 PM_ULTRA_DESTRUCTIVE_MONSTER,
337 PM_DARN_DEMENTOR,
338 PM_SHOEMELEON,
339 PM_POLYFESHNEE,
340 PM_COVETOUSLEON,
341 PM_WHORED_HORE,
342 PM_LULU_ASS,
343 PM_TENDER_JESSE,
344 PM_ELEROTIC_DREAM_WOMAN,
345 PM_MARTIIN,
346 PM_FOREPREACHER_CONVERTER,
347 PM_RICTIM_TERRORIZER,
348 PM_POLYMORPHITIC_WOLF,
349 PM_OFFDIVER,
350 PM_SLUMBER_HULK,
351 PM_IVEL_WUXTINA,
352 PM_EARLY_LEON,
353 PM_CHAMECHAUN,
354 PM_METAL_DOPPELGANGER,
355 PM_GHELEON,
356 PM_THE_ZRUTINATOR,
357 PM_METAMORPHOSE,
358 PM_GREEN_SLAAD,
359 PM_CHANGELING,
360 PM_CHANGELING_MUMMY,
361 PM_CHANGELING_ZOMBIE,
362 PM_COCKAMELEON,
363 PM_CHARMONIE,
364 PM_EDOTO,
365 PM_PURPLE_R,
366 PM_VAMPSHIFTER,
367 PM_UNGENOCIDABLE_VAMPSHIFTER,
368 PM_CHAMELON,
369 PM_COMMA_CHAMELEON,
370 PM_UNIQUE_SHIFTER,
371 PM_PLAYER_CHANGELING,
372 PM_EVIL_CHAMELEON,
373 PM_CHANGERING_KELPIE,
374 PM_DITTO,
375 PM_ELONA_BADGER,
376 PM_RAINBOW_SPHERE,
377 PM_SHAPESHIFTING_EXPERTISE,
378 PM_EACH_UISGE,
379 PM_LAMECHAM,
380 PM_GIANT_CHAMELEON,
383 /* for deciding whether corpse or statue will carry along full monster data */
384 #define KEEPTRAITS(mon) ((mon)->isshk || (mon)->isgyp || (mon)->mtame ||\
385 ((mon)->data->geno & G_UNIQ) || \
386 (mon)->egotype_troll || \
387 is_reviver((mon)->data) || \
388 /* normally leader the will be unique, */ \
389 /* but he might have been polymorphed */ \
390 (mon)->m_id == quest_status.leader_m_id || \
391 /* special cancellation handling for these */ \
392 (dmgtype((mon)->data, AD_SEDU) || \
393 dmgtype((mon)->data, AD_SSEX)))
395 /* Creates a monster corpse, a "special" corpse, or nothing if it doesn't
396 * leave corpses. Monsters which leave "special" corpses should have
397 * G_NOCORPSE set in order to prevent wishing for one, finding tins of one,
398 * etc....
400 STATIC_OVL struct obj *
401 make_corpse(mtmp)
402 register struct monst *mtmp;
404 register struct permonst *mdat = mtmp->data;
405 int num;
406 struct obj *obj = (struct obj *)0;
407 int x = mtmp->mx, y = mtmp->my;
408 int mndx = monsndx(mdat);
410 switch(mndx) {
411 case PM_GRAY_DRAGON:
412 case PM_MERCURIAL_DRAGON:
413 case PM_SILVER_DRAGON:
414 case PM_SHIMMERING_DRAGON:
415 case PM_DEEP_DRAGON:
416 case PM_RED_DRAGON:
417 case PM_ORANGE_DRAGON:
418 case PM_WHITE_DRAGON:
419 case PM_BLACK_DRAGON:
420 case PM_BLUE_DRAGON:
421 case PM_DARK_DRAGON:
422 case PM_COPPER_DRAGON:
423 case PM_PLATINUM_DRAGON:
424 case PM_BRASS_DRAGON:
425 case PM_AMETHYST_DRAGON:
426 case PM_PURPLE_DRAGON:
427 case PM_DIAMOND_DRAGON:
428 case PM_EMERALD_DRAGON:
429 case PM_SAPPHIRE_DRAGON:
430 case PM_RUBY_DRAGON:
431 case PM_GREEN_DRAGON:
432 case PM_GOLDEN_DRAGON:
433 case PM_FEMINISM_DRAGON:
434 case PM_MAIDRAGON:
435 case PM_CANCEL_DRAGON:
436 case PM_NEGATIVE_DRAGON:
437 case PM_CORONA_DRAGON:
438 case PM_CONTRO_DRAGON:
439 case PM_NOPE_DRAGON:
440 case PM_CRYSTALLINE_DRAGON:
441 case PM_MYSTERY_DRAGON:
442 case PM_HEROIC_DRAGON:
443 case PM_STONE_DRAGON:
444 case PM_CYAN_DRAGON:
445 case PM_PSYCHIC_DRAGON:
446 case PM_RAINBOW_DRAGON:
447 case PM_BLOOD_DRAGON:
448 case PM_PLAIN_DRAGON:
449 case PM_SKY_DRAGON:
450 case PM_WATER_DRAGON:
451 case PM_EVIL_DRAGON:
452 case PM_MAGIC_DRAGON:
453 case PM_YELLOW_DRAGON:
454 /* Make dragon scales. This assumes that the order of the */
455 /* dragons is the same as the order of the scales. */
456 if (!rn2(mtmp->mrevived ? 20 : 3)) {
457 num = GRAY_DRAGON_SCALES + monsndx(mdat) - PM_GRAY_DRAGON;
458 if (!rn2(8)) num = GRAY_DRAGON_SCALE_SHIELD + monsndx(mdat) - PM_GRAY_DRAGON;
459 obj = mksobj_at(num, x, y, TRUE, FALSE, FALSE); /* allow random enchantment and BUC --Amy */
460 /*obj->spe = 0;
461 obj->cursed = obj->blessed = FALSE;*/
463 goto default_1;
465 case PM_GRAY_DRAGOM:
466 case PM_MERCURIAL_DRAGOM:
467 case PM_SILVER_DRAGOM:
468 case PM_SHIMMERING_DRAGOM:
469 case PM_DEEP_DRAGOM:
470 case PM_RED_DRAGOM:
471 case PM_ORANGE_DRAGOM:
472 case PM_WHITE_DRAGOM:
473 case PM_BLACK_DRAGOM:
474 case PM_BLUE_DRAGOM:
475 case PM_COPPER_DRAGOM:
476 case PM_PLATINUM_DRAGOM:
477 case PM_BRASS_DRAGOM:
478 case PM_AMETHYST_DRAGOM:
479 case PM_PURPLE_DRAGOM:
480 case PM_DIAMOND_DRAGOM:
481 case PM_EMERALD_DRAGOM:
482 case PM_SAPPHIRE_DRAGOM:
483 case PM_RUBY_DRAGOM:
484 case PM_GREEN_DRAGOM:
485 case PM_GOLDEN_DRAGOM:
486 case PM_FEMINISM_DRAGOM:
487 case PM_MAIDRAGOM:
488 case PM_CANCEL_DRAGOM:
489 case PM_NEGATIVE_DRAGOM:
490 case PM_CORONA_DRAGOM:
491 case PM_CONTRO_DRAGOM:
492 case PM_NOPE_DRAGOM:
493 case PM_CRYSTALLINE_DRAGOM:
494 case PM_MYSTERY_DRAGOM:
495 case PM_HEROIC_DRAGOM:
496 case PM_STONE_DRAGOM:
497 case PM_CYAN_DRAGOM:
498 case PM_PSYCHIC_DRAGOM:
499 case PM_RAINBOW_DRAGOM:
500 case PM_BLOOD_DRAGOM:
501 case PM_PLAIN_DRAGOM:
502 case PM_SKY_DRAGOM:
503 case PM_WATER_DRAGOM:
504 case PM_EVIL_DRAGOM:
505 case PM_MAGIC_DRAGOM:
506 case PM_YELLOW_DRAGOM:
507 /* Make dragon scales. This assumes that the order of the */
508 /* dragons is the same as the order of the scales. */
509 if (!rn2(mtmp->mrevived ? 20 : 3)) {
510 num = GRAY_DRAGON_SCALES + monsndx(mdat) - PM_GRAY_DRAGOM;
511 if (!rn2(8)) num = GRAY_DRAGON_SCALE_SHIELD + monsndx(mdat) - PM_GRAY_DRAGOM;
512 obj = mksobj_at(num, x, y, TRUE, FALSE, FALSE); /* allow random enchantment and BUC --Amy */
513 /*obj->spe = 0;
514 obj->cursed = obj->blessed = FALSE;*/
516 goto default_1;
518 case PM_YOUNG_UNICORN:
519 if (rn2(2)) goto default_1;
520 /* fall through */
521 case PM_WHITE_UNICORN:
522 case PM_PROTECTED_WHITE_UNICORN:
523 case PM_PROTECTED_GRAY_UNICORN:
524 case PM_PROTECTED_BLACK_UNICORN:
525 case PM_WINGED_WHITE_UNICORN:
526 case PM_WINGED_GRAY_UNICORN:
527 case PM_WINGED_BLACK_UNICORN:
528 case PM_BEIGE_UNICORN:
529 case PM_CONCRETE_UNICORN:
530 case PM_ANTHRAZITE_UNICORN:
531 case PM_SMOKY_QUARTZ_UNICORN:
532 case PM_JET_UNICORN:
533 case PM_PEARL_UNICORN:
534 case PM_ICEFLAME_UNICORN:
535 case PM_CURICORN:
536 case PM_JAPICORN:
537 case PM_BLASTICORN:
538 case PM_OFFWHITE_UNICORN:
539 case PM_PALE_GRAY_UNICORN:
540 case PM_BLACKISH_UNICORN:
541 case PM_BUTTICORN:
542 case PM_SQUEAKICORN:
543 case PM_FARTICORN:
544 case PM_PICK_HORN:
545 case PM_DIG_HORN:
546 case PM_PHASE_HORN:
547 case PM_MATURE_UNICORN:
548 case PM_SELF_FLAGELLATING_UNICORN:
549 case PM_WIPED_UNICORN:
550 case PM_GRAVY_UNICORN:
551 case PM_GREAT_WHITE_UNICORN:
552 case PM_GREAT_GRAY_UNICORN:
553 case PM_GREAT_BLACK_UNICORN:
554 case PM_SUPERPOWERED_WHITE_UNICORN:
555 case PM_SUPERPOWERED_GRAY_UNICORN:
556 case PM_SUPERPOWERED_BLACK_UNICORN:
557 case PM_REAR_WHITE_UNICORN:
558 case PM_REAR_GRAY_UNICORN:
559 case PM_REAR_BLACK_UNICORN:
560 case PM_BEHIDE_WHITE_UNICORN:
561 case PM_BEHIDE_GRAY_UNICORN:
562 case PM_BEHIDE_BLACK_UNICORN:
563 case PM_PURE_WHITE_UNICORN:
564 case PM_ETHER_UNICORN:
565 case PM_WHITE_UNICORN_FOAL:
566 case PM_BEGIN_UNICORN:
567 case PM_WEIT_UNICORN:
568 case PM_DORK_UNICORN:
569 case PM_PROSE_UNICORN:
570 case PM_ILLUSION_HORN:
571 case PM_BLOODY_HORN:
572 case PM_DEVIOUS_HORN:
573 case PM_CEMENT_UNICORN:
574 case PM_TAR_UNICORN:
575 case PM_COCOON_ANTIHERO:
576 case PM_EVIL_SAVIOR:
577 case PM_BADFICINA:
578 case PM_SLAU_UNICORN:
579 case PM_UNICORN_ZOMBIE:
580 case PM_LEYM_UNICORN:
581 case PM_STED_UNICORN:
582 case PM_GRAY_UNICORN_FOAL:
583 case PM_BLACK_UNICORN_FOAL:
584 case PM_GRAY_UNICORN:
585 case PM_PLAYER_UNICORN:
586 case PM_HANDSOME_GRAY_UNICORN:
587 case PM_BLACK_UNICORN:
588 case PM_PORTER_BLACK_UNICORN:
589 case PM_PURPLE_UNICORN:
590 case PM_PINK_UNICORN:
591 case PM_ORANGE_UNICORN:
592 case PM_CYAN_UNICORN:
593 case PM_BROWN_UNICORN:
594 case PM_RED_UNICORN:
595 case PM_YELLOW_UNICORN:
596 case PM_GREEN_UNICORN:
597 case PM_ULTRAVIOLET_UNICORN:
598 case PM_XRAY_UNICORN:
599 case PM_SPOTTED_UNICORN:
600 case PM_LESSER_SPOTTED_UNICORN:
601 case PM_POLECORN:
602 case PM_HUGE_POLECORN:
603 case PM_GOLDEN_UNICORN:
604 case PM_UNICORN_SKELETON:
605 case PM_NIGHTMARE_UNICORN:
606 case PM_UNICORN_OF_AMBER:
607 case PM_RAINBOW_UNICORN:
608 case PM_DESATURATED_UNICORN:
609 case PM_DULL_UNICORN:
610 case PM_POWERLESS_UNICORN:
611 case PM_BIG_PURPLE_UNICORN:
612 case PM_BIG_WHITE_UNICORN:
613 case PM_BIG_GRAY_UNICORN:
614 case PM_BIG_BLACK_UNICORN:
615 case PM_SQUIRRELHORN:
616 case PM_REGULAR_GIRL_SNEAKER:
617 case PM_EXCEPTIONAL_GIRL_SNEAKER:
618 case PM_ELITE_GIRL_SNEAKER:
619 case PM_YUNICOR_LIZARD:
620 case PM_GOOD_BLUE_UNICORN:
621 case PM_FADING_GRAY_UNICORN:
622 case PM_IMPENETRABLE_BLACK_UNICORN:
623 case PM_PETTY_BIG_WHITE_UNICORN:
624 case PM_PETTY_BIG_GRAY_UNICORN:
625 case PM_PETTY_BIG_BLACK_UNICORN:
626 if (mtmp->mrevived && rn2(20)) {
627 if (canseemon(mtmp))
628 pline("%s recently regrown horn crumbles to dust.",
629 s_suffix(Monnam(mtmp)));
630 } else
631 (void) mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
632 goto default_1;
633 case PM_ARCANE_LIGHT_UNICORN:
634 case PM_ARCANE_MEDIUM_UNICORN:
635 case PM_ARCANE_EVIL_UNICORN:
636 case PM_BLACK_MAGICORN:
637 case PM_GRAY_MAGICORN:
638 case PM_WHITE_MAGICORN:
639 if (mtmp->mrevived && rn2(20)) {
640 if (canseemon(mtmp))
641 pline("%s recently regrown horn crumbles to dust.",
642 s_suffix(Monnam(mtmp)));
643 } else
644 (void) mksobj_at(ARCANE_HORN, x, y, TRUE, FALSE, FALSE);
645 goto default_1;
646 case PM_TITAN_UNICORN:
647 case PM_ALLA_UNICORN:
648 case PM_LAST_UNICORN:
649 if (mtmp->mrevived && rn2(20)) {
650 if (canseemon(mtmp))
651 pline("%s recently regrown horn crumbles to dust.",
652 s_suffix(Monnam(mtmp)));
653 } else
654 (void) mksobj_at(TITANIUM_HORN, x, y, TRUE, FALSE, FALSE);
655 goto default_1;
656 case PM_BUBBLY_UNICORN:
657 case PM_ALIEN_UNICORN:
658 case PM_SLATE_UNICORN:
659 if (mtmp->mrevived && rn2(20)) {
660 if (canseemon(mtmp))
661 pline("%s recently regrown horn crumbles to dust.",
662 s_suffix(Monnam(mtmp)));
663 } else
664 (void) mksobj_at(BUBBLEHORN, x, y, TRUE, FALSE, FALSE);
665 goto default_1;
666 case PM_REPLICA_UNICORN:
667 if (mtmp->mrevived && rn2(20)) {
668 if (canseemon(mtmp))
669 pline("%s recently regrown horn crumbles to dust.",
670 s_suffix(Monnam(mtmp)));
671 } else
672 (void) mksobj_at(REPLICA_UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
673 goto default_1;
674 case PM_SKY_UNICORN:
675 if (mtmp->mrevived && rn2(20)) {
676 if (canseemon(mtmp))
677 pline("%s recently regrown horn crumbles to dust.",
678 s_suffix(Monnam(mtmp)));
679 } else
680 (void) mksobj_at(SKY_HORN, x, y, TRUE, FALSE, FALSE);
681 goto default_1;
682 case PM_COLLUDE_UNICORN:
683 if (mtmp->mrevived && rn2(20)) {
684 if (canseemon(mtmp))
685 pline("%s recently regrown horn crumbles to dust.",
686 s_suffix(Monnam(mtmp)));
687 } else
688 (void) mksobj_at(DARK_HORN, x, y, TRUE, FALSE, FALSE);
689 goto default_1;
690 case PM_LONG_WORM: /* crysknives are too powerful, they should be rare --Amy */
691 if (!rn2(20)) (void) mksobj_at(WORM_TOOTH, x, y, TRUE, FALSE, FALSE);
692 goto default_1;
693 case PM_KILLER_TRIPE_RATION:
694 case PM_PERSONALIZED_KILLER_TRIPE_RATION:
695 (void) mksobj_at(TRIPE_RATION, x, y, TRUE, FALSE, FALSE);
696 newsym(x, y);
697 return (struct obj *)0;
698 case PM_KILLER_APPLE:
699 case PM_IWBTG_APPLE:
700 (void) mksobj_at(APPLE, x, y, TRUE, FALSE, FALSE);
701 newsym(x, y);
702 return (struct obj *)0;
703 case PM_KILLER_PEAR:
704 (void) mksobj_at(ASIAN_PEAR, x, y, TRUE, FALSE, FALSE);
705 newsym(x, y);
706 return (struct obj *)0;
707 case PM_EVIL_ORANGE:
708 (void) mksobj_at(ORANGE, x, y, TRUE, FALSE, FALSE);
709 newsym(x, y);
710 return (struct obj *)0;
711 case PM_FLOATING_LEMON:
712 (void) mksobj_at(LEMON, x, y, TRUE, FALSE, FALSE);
713 newsym(x, y);
714 return (struct obj *)0;
715 case PM_JUICY_CHERRY:
716 (void) mksobj_at(CHERRY, x, y, TRUE, FALSE, FALSE);
717 newsym(x, y);
718 return (struct obj *)0;
719 case PM_TSCHERRYTREE:
721 int tscherries = rnd(10);
722 while (tscherries > 0) {
723 (void) mksobj_at(CHERRY, x, y, TRUE, FALSE, FALSE);
724 tscherries--;
726 newsym(x, y);
727 return (struct obj *)0;
729 case PM_FLOATING_MELON:
730 (void) mksobj_at(MELON, x, y, TRUE, FALSE, FALSE);
731 newsym(x, y);
732 return (struct obj *)0;
733 case PM_STRIP_BANANA:
734 case PM_KICKING_BANANA:
735 (void) mksobj_at(BANANA, x, y, TRUE, FALSE, FALSE);
736 newsym(x, y);
737 return (struct obj *)0;
738 case PM_RAVENOUS_CREAM_PIE:
739 case PM_KOP_BRANDED_RAVENOUS_CREAM_PIE:
740 (void) mksobj_at(CREAM_PIE, x, y, TRUE, FALSE, FALSE);
741 newsym(x, y);
742 return (struct obj *)0;
743 case PM_KILLER_FOOD_RATION:
744 case PM_OFFOOD_RATION:
745 case PM_GIANT_FOOD_RATION:
746 case PM_EXTRA_ONIONY_FOOD_RATION:
747 case PM_ROTTEN_FOOD_RATION:
748 (void) mksobj_at(FOOD_RATION, x, y, TRUE, FALSE, FALSE);
749 newsym(x, y);
750 return (struct obj *)0;
751 case PM_KILLER_MEATBALL:
752 (void) mksobj_at(MEATBALL, x, y, TRUE, FALSE, FALSE);
753 newsym(x, y);
754 return (struct obj *)0;
755 case PM_BAD_EGG:
756 case PM_PORTER_BAD_EGG:
757 (void) mksobj_at(EGG, x, y, TRUE, FALSE, FALSE);
758 newsym(x, y);
759 return (struct obj *)0;
760 case PM_SPIDDAL_STICK:
761 (void) mksobj_at(SPIDDAL_STICK, x, y, TRUE, FALSE, FALSE);
762 newsym(x, y);
763 return (struct obj *)0;
764 case PM_HARRADA:
765 (void) mksobj_at(HARRADA, x, y, TRUE, FALSE, FALSE);
766 newsym(x, y);
767 return (struct obj *)0;
768 case PM_INTELLIMIND_FLAYER:
769 if (!mtmp->mrevived) (void) mksobj_at(INTELLIGENCE_PACK, x, y, TRUE, FALSE, FALSE);
770 newsym(x, y);
771 return (struct obj *)0;
772 case PM_VAMPIRE:
773 case PM_VAMPIRE_LORD:
774 case PM_VAMPIRE_MAGE:
775 /* include mtmp in the mkcorpstat() call */
776 num = undead_to_corpse(mndx);
777 obj = mkcorpstat(CORPSE, mtmp, &mons[num], x, y, TRUE);
778 obj->age -= 100; /* this is an *OLD* corpse */
779 break;
780 case PM_EVIL_KOBOLD_MUMMY:
781 case PM_KOBOLD_MUMMY:
782 case PM_DWARF_MUMMY:
783 case PM_GNOME_MUMMY:
784 case PM_ORC_MUMMY:
785 case PM_COCKATRICE_MUMMY:
786 case PM_COCKATRICE_ZOMBIE:
787 case PM_DEFINITELY_NOT_ORC_MUMMY:
788 case PM_ELF_MUMMY:
789 case PM_HUMAN_MUMMY:
790 case PM_MUMMY_HOMER:
791 case PM_MUMMY:
792 case PM_TOMB_MUMMY:
793 case PM_ADOM_MUMMY:
794 case PM_MIMIC_MUMMY:
795 case PM_GIANT_MUMMY:
796 case PM_ETTIN_MUMMY:
797 case PM_NON_SEEN_ETTIN_MUMMY:
798 case PM_HAHA_YOU_JUST_DIED:
799 case PM_CANNOT_KILL_WHAT_YOU_CANNOT_SEE:
800 case PM_SMALLER_MIND_FLAYER_ZOMBIE:
801 case PM_SMALLERE_MIND_FLAYER_MUMMY:
802 case PM_ORANGE_ETTIN_MUMMY:
803 case PM_CALLS_ITSELF_ETTIN_MUMMY:
804 case PM_TROLL_MUMMY:
805 case PM_EGO_TROLL_MUMMY:
806 case PM_EVIL_TROLL_MUMMY:
807 case PM_TROLL_PERMAMIMIC_MUMMY:
808 case PM_TROLL_ZOMBIE:
809 case PM_KOBOLD_ZOMBIE:
810 case PM_GHEY_KOBOLD_ZOMBIE:
811 case PM_OGRE_ZOMBIE:
812 case PM_JUJU_ZOMBI:
813 case PM_OGRE_MUMMY:
814 case PM_DWARF_ZOMBIE:
815 case PM_GNOME_ZOMBIE:
816 case PM_ORC_ZOMBIE:
817 case PM_NEVER_AN_ORC_ZOMBIE:
818 case PM_ELF_ZOMBIE:
819 case PM_HUMAN_ZOMBIE:
820 case PM_GRUNTHACK_ZOMBIE:
821 case PM_GRUNT_A_LOT_ZOMBIE:
822 case PM_CADAVER:
823 case PM_POISONOUS_WIMP:
824 case PM_PRESERVED_DEAD:
825 case PM_RECEIVED_DEAD_POTATO:
826 case PM_EMBALMED_CORPSE:
827 case PM_TOXICATED_POTATO:
828 case PM_CORRUPTED_SHAMBLER:
829 case PM_DRIED_CORPSE:
830 case PM_DEAD_PHARAO:
831 case PM_DECAYED_CORPSE:
832 case PM_WAIVED_POTATO:
833 case PM_DEAD_POTATO:
834 case PM_BLACK_DEATH:
835 case PM_DRAUGR_DEATHLORD:
836 case PM_TASMANIAN_ZOMBIE:
837 case PM_WALKING_CORPSE:
838 case PM_HUNGRY_DEAD_POTATO:
839 case PM_HUNGRY_DEAD:
840 case PM_ROTTING_CARCASS:
841 case PM_DROWNED_DEAD_ONE:
842 case PM_FLESHEATER:
843 case PM_PALE_SHAMBLER:
844 case PM_EMBER_THRALL:
845 case PM_FIERY_CARCASS:
846 case PM_ZOMBIE_CAR:
847 case PM_PLAGUE_BEARER:
848 case PM_GREENER_ZOMBIE:
849 case PM_ZOMBIE_BADDIE:
850 case PM_ZOMBIE_WARRIOR:
851 case PM_MAFIOSO:
852 case PM_TALIBAN_MILITIA:
853 case PM_M__TO_M___:
854 case PM_ETA_TERRORIST:
855 case PM_BLACK_ONES:
856 case PM_CORNFLAKE_ZOMBIE:
857 case PM_ZOMBIE:
858 case PM_WEAUM_ZOMBIE:
859 case PM_GIANT_ZOMBIE:
860 case PM_ETTIN_ZOMBIE:
861 case PM_DARK_BACKGROUND_ETTIN_ZOMBIE:
862 case PM_SUMTHINS_KILLIN_YA:
863 case PM_HEHEHE_YOUR_GAME_ENDED_BRO:
864 case PM_PROTESTAINST_ETTIN_ZOMBIE:
865 case PM_GNOLL_GHOUL:
866 case PM_DRAUGR_ZOMBIE:
867 case PM_STEEL_ZOMBIE:
868 case PM_DRAUGR_MUMMY:
869 case PM_GREATER_MUMMY:
870 case PM_DROW_ZOMBIE:
871 case PM_ZOMBIE_PROSTITUTE:
872 case PM_DROW_MUMMY:
873 case PM_HALF_DRAGON_MUMMY:
874 case PM_HALF_DRAGON_ZOMBIE:
875 num = undead_to_corpse(mndx);
876 obj = mkcorpstat(CORPSE, mtmp, &mons[num], x, y, TRUE);
877 obj->age -= 100; /* this is an *OLD* corpse */
878 break;
879 case PM_ROTTEN_WIGHT:
880 case PM_WIGHT:
881 case PM_FOREST_WIGHT:
882 case PM_GRAVE_WIGHT:
883 case PM_EMPEROR_WIGHT:
884 case PM_MEANIE:
885 case PM_CAR_THIEF:
886 case PM_WATER_WIGHT:
887 case PM_SUBWAY_WIGHT:
888 case PM_CRYPT_WIGHT:
889 case PM_BARROW_WIGHT:
890 case PM_HIDDEN_BARROW_WIGHT:
891 case PM_TUNNEL_WIGHT:
892 case PM_TUNNEL_FORCE_WIGHT:
893 case PM_PORTER_WIGHT:
894 case PM_TRAILER:
895 case PM_UNDEAD_BAT:
896 case PM_UNDEAD_SWARM_BAT:
897 case PM_PETTY_TUNNEL_WIGHT:
898 case PM_CASTLE_WIGHT:
899 case PM_GRAVE_WARRIOR:
900 case PM_ULTRA_WIGHT:
901 case PM_GHOUL:
902 case PM_OH_GOD_GHOUL:
903 case PM_GHAST:
904 case PM_DOSTICH:
905 case PM_CHTO:
906 case PM_LOL_WE_INVENTED_ANOTHER_GHAST:
907 case PM_STINKING_ALIEN:
908 case PM_GASTLY:
909 case PM_HAUNTER:
910 case PM_GENGAR:
911 case PM_CREEPING___:
912 case PM_FRANKENSTEIN_S_MONSTER:
913 case PM_UNDEAD_MIMIC:
914 case PM_UNDEAD_PERMAMIMIC:
915 case PM_UNDEAD_SWARM_MIMIC:
916 case PM_UNDEAD_SWARM_PERMAMIMIC:
917 case PM_UNDEAD_KANGAROO:
918 case PM_RIBBON_FISH:
919 case PM_SKELETON_FISH:
920 case PM_BONE_FISH:
921 case PM_CORPSE_FISH:
922 case PM_HORROR_FISH:
923 case PM_UNDEAD_OLOG_HAI_AMBUSHER:
924 case PM_UNDEAD_ANT:
925 case PM_UNDEAD_COCKATRICE:
926 case PM_MUTATED_UNDEAD_COCKATRICE:
927 case PM_SKELETAL_HOUND:
928 case PM_CORPSE_HOUND:
929 case PM_REAL_CORPSE_HOUND:
930 case PM_ZOMBOCAT:
931 case PM_HAUNTED_TIGER:
932 case PM_UNDEAD_MIND_FLAYER:
933 case PM_ELDRITCH_MIND_FLAYER:
934 case PM_UNDEAD_NYMPH:
935 case PM_SKELETTOCROTTA:
936 case PM_UNDEAD_RAT:
937 case PM_UNDEAD_SCORPION:
938 case PM_UNDEAD_GNASHER_SCORPION:
939 case PM_UNDEAD_HORSE:
940 case PM_UNDEAD_UNICORN: /* too decayed to leave a working horn, so we just don't leave one at all :D --Amy */
941 case PM_DISGUISED_UNDEAD_UNICORN:
942 case PM_UNDEAD_CENTAUR:
943 case PM_FLYING_UNDEAD_CENTAUR:
944 case PM_UNDEAD_KOP:
945 case PM_UNDEAD_SERGEANT:
946 case PM_UNDEAD_LIEUTENANT:
947 case PM_UNDEAD_KOMMISSIONER:
948 case PM_UNDEAD_KAPTAIN:
949 case PM_UNDEAD_KCHIEF:
950 case PM_UNDEAD_KATCHER:
951 case PM_UNDEAD_KRIMINOLOGIST:
952 case PM_UNDEAD_KEELHAULER:
953 case PM_UNDEAD_KLEEVER:
954 case PM_UNDEAD_SNAKE:
955 case PM_UNDEAD_EGO_SNAKE:
956 case PM_UNDEAD_NAGA:
957 case PM_UNDEAD_NAGA_HATCHLING:
958 case PM_UNDEAD_YETI:
959 case PM_UNDEAD_ALLTECHER:
960 case PM_UNDEAD_SPELLMASTER:
961 case PM_UNDEAD_ARCHEOLOGIST: /* keyword "newroles" */
962 case PM_UNDEAD_BARBARIAN:
963 case PM_UNDEAD_NOOB_MODE_BARB:
964 case PM_UNDEAD_BINDER:
965 case PM_UNDEAD_BLEEDER:
966 case PM_UNDEAD_BARD:
967 case PM_UNDEAD_CAVEMAN:
968 case PM_UNDEAD_CAVEWOMAN:
969 case PM_UNDEAD_CHEVALIER:
970 case PM_UNDEAD_COURIER:
971 case PM_UNDEAD_SPACEWARS_FIGHTER:
972 case PM_UNDEAD_CAMPERSTRIKER:
973 case PM_UNDEAD_CARTOMANCER:
974 case PM_UNDEAD_DRAGONMASTER:
975 case PM_UNDEAD_FJORDE:
976 case PM_UNDEAD_PRACTICANT:
977 case PM_UNDEAD_EMERA:
978 case PM_UNDEAD_TOSSER:
979 case PM_UNDEAD_AKLYST:
980 case PM_UNDEAD_MILL_SWALLOWER:
981 case PM_UNDEAD_SYMBIANT:
982 case PM_UNDEAD_BUTT_LOVER:
983 case PM_UNDEAD_DANCER:
984 case PM_UNDEAD_DIABLIST:
985 case PM_UNDEAD_PREVERSIONER:
986 case PM_UNDEAD_SECRET_ADVICE_MEMBER:
987 case PM_UNDEAD_SHOE_FETISHIST:
988 case PM_UNDEAD_GENDERSTARIST:
989 case PM_UNDEAD_COMBATANT:
990 case PM_UNDEAD_ZYBORG:
991 case PM_UNDEAD_DEATH_EATER:
992 case PM_UNDEAD_GANGSTER:
993 case PM_UNDEAD_POKEMON:
994 case PM_UNDEAD_ELECTRIC_MAGE:
995 case PM_UNDEAD_POISON_MAGE:
996 case PM_UNDEAD_OCCULT_MASTER:
997 case PM_UNDEAD_CHAOS_SORCEROR:
998 case PM_UNDEAD_ELEMENTALIST:
999 case PM_UNDEAD_WILD_TALENT:
1000 case PM_UNDEAD_ACID_MAGE:
1001 case PM_UNDEAD_FLAME_MAGE:
1002 case PM_UNDEAD_CONVICT:
1003 case PM_UNDEAD_LUNATIC:
1004 case PM_UNDEAD_GEEK:
1005 case PM_UNDEAD_GRADUATE:
1006 case PM_UNDEAD_SCIENTIST:
1007 case PM_UNDEAD_ROCKER:
1008 case PM_UNDEAD_HEALER:
1009 case PM_UNDEAD_ICE_MAGE:
1010 case PM_UNDEAD_KNIGHT:
1011 case PM_UNDEAD_WARRIOR:
1012 case PM_UNDEAD_MONK:
1013 case PM_UNDEAD_HALF_BAKED:
1014 case PM_UNDEAD_PROSTITUTE:
1015 case PM_UNDEAD_KURWA:
1016 case PM_UNDEAD_PSION:
1017 case PM_UNDEAD_NECROMANCER:
1018 case PM_UNDEAD_NOBLEMAN:
1019 case PM_UNDEAD_NOBLEWOMAN:
1020 case PM_UNDEAD_PIRATE:
1021 case PM_UNDEAD_KORSAIR:
1022 case PM_UNDEAD_CRUEL_ABUSER:
1023 case PM_UNDEAD_SAIYAN:
1024 case PM_UNDEAD_POLITICIAN:
1025 case PM_UNDEAD_LIBRARIAN:
1026 case PM_UNDEAD_COOK:
1027 case PM_UNDEAD_AUGURER:
1028 case PM_UNDEAD_SAGE:
1029 case PM_UNDEAD_GUNNER:
1030 case PM_UNDEAD_OTAKU:
1031 case PM_UNDEAD_ARTIST:
1032 case PM_UNDEAD_GAMER:
1033 case PM_UNDEAD_DOLL_MISTRESS:
1034 case PM_UNDEAD_FEAT_MASTER:
1035 case PM_UNDEAD_FOXHOUND_AGENT:
1036 case PM_UNDEAD_INTEL_SCRIBE:
1037 case PM_UNDEAD_PALADIN:
1038 case PM_UNDEAD_WANDKEEPER:
1039 case PM_UNDEAD_ASSASSIN:
1040 case PM_UNDEAD_BULLY:
1041 case PM_UNDEAD_SUPERMARKET_CASHIER:
1042 case PM_UNDEAD_SLAVE_MASTER:
1043 case PM_UNDEAD_MYSTIC:
1044 case PM_UNDEAD_FORM_CHANGER:
1045 case PM_UNDEAD_TRACER:
1046 case PM_UNDEAD_MASON:
1047 case PM_UNDEAD_DEMAGOGUE:
1048 case PM_UNDEAD_CELLAR_CHILD:
1049 case PM_UNDEAD_GRENADONIN:
1050 case PM_UNDEAD_SOCIAL_JUSTICE_WARRIOR:
1051 case PM_UNDEAD_WALSCHOLAR:
1052 case PM_UNDEAD_SINGSLAVE:
1053 case PM_UNDEAD_HUSSY:
1054 case PM_UNDEAD_ANACHRONOUNBINDER:
1055 case PM_UNDEAD_NUCLEAR_PHYSICIST:
1056 case PM_UNDEAD_GANG_SCHOLAR:
1057 case PM_UNDEAD_FEMINIST:
1058 case PM_UNDEAD_BLOODSEEKER:
1059 case PM_UNDEAD_LADIESMAN:
1060 case PM_UNDEAD_JESTER:
1061 case PM_UNDEAD_PICKPOCKET:
1062 case PM_UNDEAD_MAHOU_SHOUJO:
1063 case PM_UNDEAD_DIVER:
1064 case PM_UNDEAD_GLADIATOR:
1065 case PM_UNDEAD_GOFF:
1066 case PM_UNDEAD_AMAZON:
1067 case PM_UNDEAD_MURDERER:
1068 case PM_UNDEAD_ALTMER:
1069 case PM_UNDEAD_BOSMER:
1070 case PM_UNDEAD_DUNMER:
1071 case PM_UNDEAD_THALMOR:
1072 case PM_UNDEAD_ORDINATOR:
1073 case PM_UNDEAD_PRIEST:
1074 case PM_UNDEAD_PRIESTESS:
1075 case PM_UNDEAD_RANGER:
1076 case PM_UNDEAD_ELPH:
1077 case PM_UNDEAD_ROGUE:
1078 case PM_UNDEAD_SAMURAI:
1079 case PM_UNDEAD_TOURIST:
1080 case PM_UNDEAD_DRUNK:
1081 case PM_UNDEAD_FIREFIGHTER:
1082 case PM_UNDEAD_LOCKSMITH:
1083 case PM_UNDEAD_ERDRICK:
1084 case PM_UNDEAD_FIGHTER:
1085 case PM_UNDEAD_FENCER:
1086 case PM_UNDEAD_MEDIUM:
1087 case PM_UNDEAD_SEXYMATE:
1088 case PM_UNDEAD_STAND_USER:
1089 case PM_UNDEAD_JUSTICE_KEEPER:
1090 case PM_UNDEAD_DOOM_MARINE:
1091 case PM_UNDEAD_DQ_SLIME:
1092 case PM_UNDEAD_MUSICIAN:
1093 case PM_UNDEAD_FAILED_EXISTENCE:
1094 case PM_UNDEAD_NINJA:
1095 case PM_UNDEAD_OFFICER:
1096 case PM_UNDEAD_UNDERTAKER:
1097 case PM_UNDEAD_ZOOKEEPER:
1098 case PM_UNDEAD_CLIMACTERIAL:
1099 case PM_UNDEAD_WOMANIZER:
1100 case PM_UNDEAD_TRANSVESTITE:
1101 case PM_UNDEAD_TRANSSYLVANIAN:
1102 case PM_UNDEAD_SOFTWARE_ENGINEER:
1103 case PM_UNDEAD_CRACKER:
1104 case PM_UNDEAD_JANITOR:
1105 case PM_UNDEAD_SPACE_MARINE:
1106 case PM_UNDEAD_STORMBOY:
1107 case PM_UNDEAD_YAUTJA:
1108 case PM_UNDEAD_JOCKEY:
1109 case PM_UNDEAD_QUARTERBACK:
1110 case PM_UNDEAD_PSYKER:
1111 case PM_UNDEAD_EMPATH:
1112 case PM_UNDEAD_MASTERMIND:
1113 case PM_UNDEAD_WEIRDBOY:
1114 case PM_UNDEAD_ASTRONAUT:
1115 case PM_UNDEAD_CYBERNINJA:
1116 case PM_UNDEAD_DISSIDENT:
1117 case PM_UNDEAD_XELNAGA:
1118 case PM_UNDEAD_UNBELIEVER:
1119 case PM_UNDEAD_TOPMODEL:
1120 case PM_UNDEAD_ACTIVISTOR:
1121 case PM_NON_UNDEAD_SLAYER:
1122 case PM_UNDEAD_VALKYRIE:
1123 case PM_UNDEAD_VANILLA_VALK:
1124 case PM_UNDEAD_YEOMAN:
1125 case PM_UNDEAD_PADAWAN:
1126 case PM_UNDEAD_JEDI:
1127 case PM_UNDEAD_SHADOW_JEDI:
1128 case PM_UNDEAD_WIZARD:
1129 case PM_UNDEAD_MOLD:
1130 case PM_FUNGOID_MOLD:
1131 case PM_UNDEAD_FUNGUS:
1132 case PM_MOLDY_FUNGUS:
1133 case PM_UNDEAD_PATCH:
1134 case PM_MOLDY_PATCH:
1135 case PM_UNDEAD_FORCE_FUNGUS:
1136 case PM_UNDEAD_WORT:
1137 case PM_MOLDY_FORCE_FUNGUS:
1138 case PM_MOLDY_WORT:
1139 case PM_UNDEAD_FORCE_PATCH:
1140 case PM_MOLDY_FORCE_PATCH:
1141 case PM_UNDEAD_WARP_FUNGUS:
1142 case PM_MOLDY_WARP_FUNGUS:
1143 case PM_UNDEAD_WARP_PATCH:
1144 case PM_MOLDY_WARP_PATCH:
1145 case PM_UNDEAD_STALK:
1146 case PM_MOLDY_STALK:
1147 case PM_UNDEAD_GROWTH:
1148 case PM_FUNGOID_GROWTH:
1149 case PM_UNDEAD_SPORE:
1150 case PM_MOLDY_SPORE:
1151 case PM_UNDEAD_MUSHROOM:
1152 case PM_MOLDY_MUSHROOM:
1153 case PM_UNDEAD_COLONY:
1154 case PM_MOLDY_COLONY:
1155 case PM_MUTATED_UNDEAD_POTATO:
1156 case PM_THOUL:
1157 case PM_ROTTEN_WRAITH:
1158 case PM_UNDEAD_ZRUTY:
1159 case PM_YET_ANOTHER_GREATER_MUMMY:
1160 case PM_GREATER_MUMMY_PRIEST:
1161 case PM_GREATER_MUMMY_PHARAOH:
1162 case PM_GREATER_MUMMY_HIGH_PRIEST:
1163 obj = mkcorpstat(CORPSE, (struct monst *)0, &mons[mndx], x, y, TRUE);
1164 obj->age -= 100; /* this is an *OLD* corpse */
1165 break;
1166 case PM_MEDUSA: {
1167 struct monst *mtmp2;
1170 /* KMH -- the legend of Medusa and Pegasus */
1171 /* Only when Medusa leaves a corpse */
1172 mtmp2 = makemon(&mons[PM_PEGASUS], x, y, 0);
1173 if (mtmp2) {
1174 You("%s something spring forth from the corpse of %s.",
1175 Blind ? "sense" : "see", mon_nam(mtmp));
1176 mtmp2->mpeaceful = 1;
1177 mtmp2->mtame = 0;
1179 goto default_1;
1181 case PM_NIGHTMARE:
1182 pline("All that remains is her horn...");
1183 obj = oname(mksobj(UNICORN_HORN, TRUE, FALSE, FALSE),
1184 artiname(ART_NIGHTHORN));
1185 de_energise_artifact(ART_NIGHTHORN);
1186 goto initspecial;
1187 case PM_BEHOLDER:
1188 pline("All that remains is a single eye...");
1189 obj = oname(mksobj(EYEBALL, TRUE, FALSE, FALSE),
1190 artiname(ART_EYE_OF_THE_BEHOLDER));
1191 de_energise_artifact(ART_EYE_OF_THE_BEHOLDER);
1192 goto initspecial;
1193 case PM_VECNA:
1194 pline("All that remains is a hand...");
1195 obj = oname(mksobj(SEVERED_HAND, TRUE, FALSE, FALSE),
1196 artiname(ART_HAND_OF_VECNA));
1197 de_energise_artifact(ART_HAND_OF_VECNA);
1198 initspecial:
1199 obj->quan = 1;
1200 obj->owt = weight(obj);
1201 curse(obj);
1202 place_object(obj, x, y);
1203 stackobj(obj);
1204 newsym(x, y);
1205 return obj;
1206 break;
1207 case PM_IRON_GOLEM:
1208 num = d(2,6);
1209 while (num--)
1210 obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE, FALSE);
1211 mtmp->mnamelth = 0;
1212 break;
1213 case PM_GLASS_GOLEM:
1214 num = d(2,4); /* very low chance of creating all glass gems */
1215 while (num--)
1216 obj = mksobj_at((LAST_GEM + rnd(9)), x, y, TRUE, FALSE, FALSE);
1217 mtmp->mnamelth = 0;
1218 break;
1219 case PM_RUBY_GOLEM:
1220 /* [DS] Mik's original Lethe fobbed off the player with coloured
1221 * glass even for the higher golems. We'll play fair here - if
1222 * you can kill one of these guys, you deserve the gems. */
1223 num = d(2,4);
1224 while (num--)
1225 obj = mksobj_at(RUBY, x, y, TRUE, FALSE, FALSE);
1226 mtmp->mnamelth = 0;
1227 break;
1228 case PM_DIAMOND_GOLEM:
1229 num = d(2,4);
1230 while (num--)
1231 obj = mksobj_at(DIAMOND, x, y, TRUE, FALSE, FALSE);
1232 mtmp->mnamelth = 0;
1233 break;
1234 case PM_SAPPHIRE_GOLEM:
1235 num = d(2,4);
1236 while (num--)
1237 obj = mksobj_at(SAPPHIRE, x, y, TRUE, FALSE, FALSE);
1238 mtmp->mnamelth = 0;
1239 break;
1240 case PM_EMERALD_GOLEM:
1241 num = d(2,4);
1242 while (num--)
1243 obj = mksobj_at(EMERALD, x, y, TRUE, FALSE, FALSE);
1244 mtmp->mnamelth = 0;
1245 break;
1246 case PM_TOPAZ_GOLEM:
1247 num = d(2,4);
1248 while (num--)
1249 obj = mksobj_at(TOPAZ, x, y, TRUE, FALSE, FALSE);
1250 mtmp->mnamelth = 0;
1251 break;
1252 case PM_AMETHYST_GOLEM:
1253 num = d(2,4);
1254 while (num--)
1255 obj = mksobj_at(AMETHYST, x, y, TRUE, FALSE, FALSE);
1256 mtmp->mnamelth = 0;
1257 break;
1258 case PM_STEEL_GOLEM:
1259 num = d(2,6);
1260 /* [DS] Add steel chains (or handcuffs!) for steel golems? */
1261 while (num--)
1262 obj = mksobj_at(IRON_CHAIN, x, y, TRUE, FALSE, FALSE);
1263 mtmp->mnamelth = 0;
1264 break;
1265 case PM_CRYSTAL_GOLEM:
1266 /* [DS] Generate gemstones of various hues */
1267 num = d(2,4);
1269 int gemspan = LAST_GEM - bases[GEM_CLASS] + 1;
1270 while (num--)
1271 obj = mksobj_at(bases[GEM_CLASS] + rn2(gemspan), x, y,
1272 TRUE, FALSE, FALSE);
1273 mtmp->mnamelth = 0;
1275 break;
1276 case PM_CLAY_GOLEM:
1277 obj = mksobj_at(ROCK, x, y, FALSE, FALSE, FALSE);
1279 if (obj) {
1280 if(!rn2(8)) {
1281 obj->spe = rne(2);
1282 if (rn2(2)) obj->blessed = rn2(2);
1283 else blessorcurse(obj, 3);
1284 } else if(!rn2(10)) {
1285 if (rn2(10)) curse(obj);
1286 else blessorcurse(obj, 3);
1287 obj->spe = -rne(2);
1288 } else blessorcurse(obj, 10);
1290 obj->quan = (long)(rn2(20) + 50);
1291 obj->owt = weight(obj);
1293 mtmp->mnamelth = 0;
1295 break;
1296 case PM_STONE_GOLEM:
1297 case PM_LARGE_STONE_GOLEM:
1298 case PM_HUGE_STONE_GOLEM:
1299 case PM_GIANT_STONE_GOLEM:
1300 case PM_HIGH_END_STONE_GOLEM:
1301 case PM_UBER_STONE_GOLEM:
1302 case PM_ULTRA_STONE_GOLEM:
1303 obj = mkcorpstat(STATUE, (struct monst *)0,
1304 mdat, x, y, FALSE);
1305 break;
1306 case PM_WOOD_GOLEM:
1307 num = d(2,4);
1308 if (num > 1 && rn2(2)) num /= 2;
1309 while(num--)
1310 obj = mksobj_at(QUARTERSTAFF, x, y, TRUE, FALSE, FALSE);
1311 mtmp->mnamelth = 0;
1312 break;
1313 case PM_AXLEM:
1314 num = d(2,2);
1315 if (num > 1 && rn2(2)) num /= 2;
1316 while(num--)
1317 obj = mksobj_at(AXE, x, y, TRUE, FALSE, FALSE);
1318 mtmp->mnamelth = 0;
1319 break;
1320 case PM_UNICORN_GOLEM:
1321 num = d(2,2);
1322 if (num > 1 && rn2(2)) num /= 2;
1323 while(num--)
1324 obj = mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
1325 mtmp->mnamelth = 0;
1326 break;
1327 case PM_MINTERM_GOLEM:
1328 num = d(2,2);
1329 if (num > 1 && rn2(2)) num /= 2;
1330 while(num--)
1331 obj = mksobj_at(ETERNIUM_BLADE, x, y, TRUE, FALSE, FALSE);
1332 mtmp->mnamelth = 0;
1333 break;
1334 case PM_LONG_GOLEM:
1335 num = d(2,2);
1336 if (num > 1 && rn2(2)) num /= 2;
1337 while(num--)
1338 obj = mksobj_at(LONG_SWORD, x, y, TRUE, FALSE, FALSE);
1339 mtmp->mnamelth = 0;
1340 break;
1341 case PM_SLASH_GOLEM:
1342 num = d(2,2);
1343 if (num > 1 && rn2(2)) num /= 2;
1344 while(num--)
1345 obj = mksobj_at(IRON_SABER, x, y, TRUE, FALSE, FALSE);
1346 mtmp->mnamelth = 0;
1347 break;
1348 case PM_MAYLEM:
1349 num = d(2,2);
1350 if (num > 1 && rn2(2)) num /= 2;
1351 while(num--)
1352 obj = mksobj_at(MACE, x, y, TRUE, FALSE, FALSE);
1353 mtmp->mnamelth = 0;
1354 break;
1355 case PM_FLATOLEM:
1356 num = d(2,2);
1357 if (num > 1 && rn2(2)) num /= 2;
1358 while(num--)
1359 obj = mksobj_at(FLAIL, x, y, TRUE, FALSE, FALSE);
1360 mtmp->mnamelth = 0;
1361 break;
1362 case PM_WULSCHLEM:
1363 num = d(2,2);
1364 if (num > 1 && rn2(2)) num /= 2;
1365 while(num--)
1366 obj = mksobj_at(VOULGE, x, y, TRUE, FALSE, FALSE);
1367 mtmp->mnamelth = 0;
1368 break;
1369 case PM_RANSOEM:
1370 num = d(2,2);
1371 if (num > 1 && rn2(2)) num /= 2;
1372 while(num--)
1373 obj = mksobj_at(RANSEUR, x, y, TRUE, FALSE, FALSE);
1374 mtmp->mnamelth = 0;
1375 break;
1376 case PM_BARDIIM:
1377 num = d(2,2);
1378 if (num > 1 && rn2(2)) num /= 2;
1379 while(num--)
1380 obj = mksobj_at(BARDICHE, x, y, TRUE, FALSE, FALSE);
1381 mtmp->mnamelth = 0;
1382 break;
1383 case PM_FORKLEM:
1384 num = d(2,2);
1385 if (num > 1 && rn2(2)) num /= 2;
1386 while(num--)
1387 obj = mksobj_at(GARDEN_FORK, x, y, TRUE, FALSE, FALSE);
1388 mtmp->mnamelth = 0;
1389 break;
1390 case PM_HAMLEM:
1391 num = d(2,2);
1392 if (num > 1 && rn2(2)) num /= 2;
1393 while(num--)
1394 obj = mksobj_at(WAR_HAMMER, x, y, TRUE, FALSE, FALSE);
1395 mtmp->mnamelth = 0;
1396 break;
1397 case PM_GISLEM:
1398 num = d(2,2);
1399 if (num > 1 && rn2(2)) num /= 2;
1400 while(num--)
1401 obj = mksobj_at(GUISARME, x, y, TRUE, FALSE, FALSE);
1402 mtmp->mnamelth = 0;
1403 break;
1404 case PM_BEARD_GOLEM:
1405 num = d(2,2);
1406 if (num > 1 && rn2(2)) num /= 2;
1407 while(num--)
1408 obj = mksobj_at(HELMET_BEARD, x, y, TRUE, FALSE, FALSE);
1409 mtmp->mnamelth = 0;
1410 break;
1411 case PM_PIX_GOLEM:
1412 num = d(2,2);
1413 if (num > 1 && rn2(2)) num /= 2;
1414 while(num--)
1415 obj = mksobj_at(PICK_AXE, x, y, TRUE, FALSE, FALSE);
1416 mtmp->mnamelth = 0;
1417 break;
1418 case PM_FLEECY_LEATHER_GOLEM:
1419 num = d(2,3);
1420 if (num > 1 && rn2(2)) num /= 2;
1421 while(num--)
1422 obj = mksobj_at(BULLWHIP, x, y, TRUE, FALSE, FALSE);
1423 mtmp->mnamelth = 0;
1424 break;
1425 case PM_RETARDED_GOLEM:
1426 num = d(2,4);
1427 if (num > 1 && rn2(2)) num /= 2;
1428 while(num--)
1429 obj = mksobj_at(SLING, x, y, TRUE, FALSE, FALSE);
1430 mtmp->mnamelth = 0;
1431 break;
1432 case PM_LANCE_GOLEM:
1433 num = d(2,2);
1434 if (num > 1 && rn2(2)) num /= 2;
1435 while(num--)
1436 obj = mksobj_at(LANCE, x, y, TRUE, FALSE, FALSE);
1437 mtmp->mnamelth = 0;
1438 break;
1439 case PM_DENT_GOLEM:
1440 num = d(2,2);
1441 if (num > 1 && rn2(2)) num /= 2;
1442 while(num--)
1443 obj = mksobj_at(TRIDENT, x, y, TRUE, FALSE, FALSE);
1444 mtmp->mnamelth = 0;
1445 break;
1446 case PM_FLY_GOLEM:
1447 num = d(2,2);
1448 if (num > 1 && rn2(2)) num /= 2;
1449 while(num--)
1450 obj = mksobj_at(FLY_SWATTER, x, y, TRUE, FALSE, FALSE);
1451 mtmp->mnamelth = 0;
1452 break;
1453 case PM_STAR_GOLEM:
1454 num = d(2,6);
1455 if (num > 1 && rn2(2)) num /= 2;
1456 while(num--)
1457 obj = mksobj_at(MORNING_STAR, x, y, TRUE, FALSE, FALSE);
1458 mtmp->mnamelth = 0;
1459 break;
1460 case PM_TIMBER_GOLEM:
1461 num = d(2,2);
1462 if (num > 1 && rn2(2)) num /= 2;
1463 while(num--)
1464 obj = mksobj_at(CLUB, x, y, TRUE, FALSE, FALSE);
1465 mtmp->mnamelth = 0;
1466 break;
1467 case PM_RAPIER_GOLEM:
1468 num = d(2,2);
1469 if (num > 1 && rn2(2)) num /= 2;
1470 while(num--)
1471 obj = mksobj_at(RAPIER, x, y, TRUE, FALSE, FALSE);
1472 mtmp->mnamelth = 0;
1473 break;
1474 case PM_ICEBOX_GOLEM:
1475 num = d(2,2);
1476 if (num > 1 && rn2(2)) num /= 2;
1477 while(num--)
1478 obj = mksobj_at(ICE_BOX, x, y, TRUE, FALSE, FALSE);
1479 mtmp->mnamelth = 0;
1480 break;
1481 case PM_CHEST_GOLEM:
1482 num = d(2,2);
1483 if (num > 1 && rn2(2)) num /= 2;
1484 while(num--)
1485 obj = mksobj_at(CHEST, x, y, TRUE, FALSE, FALSE);
1486 mtmp->mnamelth = 0;
1487 break;
1488 case PM_BOX_GOLEM:
1489 num = d(2,2);
1490 if (num > 1 && rn2(2)) num /= 2;
1491 while(num--)
1492 obj = mksobj_at(LARGE_BOX, x, y, TRUE, FALSE, FALSE);
1493 mtmp->mnamelth = 0;
1494 break;
1495 case PM_POTATO_GOLEM:
1496 if (mtmp->mrevived) break;
1497 num = d(2,2);
1498 if (num > 1 && rn2(2)) num /= 2;
1499 while(num--)
1500 obj = mksobj_at(POTATO_BAG, x, y, TRUE, FALSE, FALSE);
1501 mtmp->mnamelth = 0;
1502 break;
1503 case PM_SACK_GOLEM:
1504 num = d(2,2);
1505 if (num > 1 && rn2(2)) num /= 2;
1506 while(num--)
1507 obj = mksobj_at(SACK, x, y, TRUE, FALSE, FALSE);
1508 mtmp->mnamelth = 0;
1509 break;
1510 case PM_SCIM_GOLEM:
1511 num = d(2,2);
1512 if (num > 1 && rn2(2)) num /= 2;
1513 while(num--)
1514 obj = mksobj_at(SCIMITAR, x, y, TRUE, FALSE, FALSE);
1515 mtmp->mnamelth = 0;
1516 break;
1517 case PM_PURPUR_GOLEM:
1518 num = d(2,2);
1519 if (num > 1 && rn2(2)) num /= 2;
1520 while(num--)
1521 obj = mksobj_at(BIDENHANDER, x, y, TRUE, FALSE, FALSE);
1522 mtmp->mnamelth = 0;
1523 break;
1524 case PM_BALL_GOLEM:
1525 num = d(2,5);
1526 if (num > 1 && rn2(2)) num /= 2;
1527 while(num--)
1528 obj = mksobj_at(HEAVY_IRON_BALL, x, y, TRUE, FALSE, FALSE);
1529 mtmp->mnamelth = 0;
1530 break;
1531 case PM_PAGER_GOLEM:
1532 num = d(2,2);
1533 if (num > 1 && rn2(2)) num /= 2;
1534 while(num--)
1535 obj = mksobj_at(PAPER_SWORD, x, y, TRUE, FALSE, FALSE);
1536 mtmp->mnamelth = 0;
1537 break;
1538 case PM_LIQUID_GOLEM:
1539 num = d(2,4);
1540 if (num > 1 && rn2(2)) num /= 2;
1541 while(num--)
1542 obj = mksobj_at(ASTERISK, x, y, TRUE, FALSE, FALSE);
1543 mtmp->mnamelth = 0;
1544 break;
1545 case PM_GEMSTONE_GOLEM:
1546 num = d(2,4);
1547 if (num > 1 && rn2(2)) num /= 2;
1548 while(num--)
1549 obj = mksobj_at(CYAN_STONE, x, y, TRUE, FALSE, FALSE);
1550 mtmp->mnamelth = 0;
1551 break;
1552 case PM_TAR_GOLEM:
1553 num = d(2,4);
1554 if (num > 1 && rn2(2)) num /= 2;
1555 while(num--)
1556 obj = mksobj_at(BITUKNIFE, x, y, TRUE, FALSE, FALSE);
1557 mtmp->mnamelth = 0;
1558 break;
1559 case PM_SECRETION_GOLEM:
1560 num = d(2,4);
1561 if (num > 1 && rn2(2)) num /= 2;
1562 while(num--)
1563 obj = mksobj_at(rn2(10) ? SECRETION_DAGGER : POKER_STICK, x, y, TRUE, FALSE, FALSE);
1564 mtmp->mnamelth = 0;
1565 break;
1566 case PM_ARCANIUM_GOLEM:
1567 num = d(2,4);
1568 if (num > 1 && rn2(2)) num /= 2;
1569 while(num--)
1570 obj = mksobj_at(COLLUSION_KNIFE, x, y, TRUE, FALSE, FALSE);
1571 mtmp->mnamelth = 0;
1572 break;
1573 case PM_INKA_GOLEM:
1574 num = d(2,4);
1575 if (num > 1 && rn2(2)) num /= 2;
1576 while(num--)
1577 obj = mksobj_at(INKA_BLADE, x, y, TRUE, FALSE, FALSE);
1578 mtmp->mnamelth = 0;
1579 break;
1580 case PM_VIVA_GOLEM:
1581 num = d(2,4);
1582 if (num > 1 && rn2(2)) num /= 2;
1583 while(num--)
1584 obj = mksobj_at(HUNTING_RIFLE, x, y, TRUE, FALSE, FALSE);
1585 mtmp->mnamelth = 0;
1586 break;
1587 case PM_LEATHER_GOLEM:
1588 num = d(2,4);
1589 if (num > 1 && rn2(2)) num /= 2;
1590 while(num--)
1591 obj = mksobj_at(LEATHER_ARMOR, x, y, TRUE, FALSE, FALSE);
1592 mtmp->mnamelth = 0;
1593 break;
1594 case PM_BOOT_GOLEM:
1595 num = d(1,6);
1596 if (num > 1 && rn2(2)) num /= 2;
1597 while(num--)
1598 obj = mksobj_at(LADY_BOOTS, x, y, TRUE, FALSE, FALSE);
1599 mtmp->mnamelth = 0;
1600 break;
1601 case PM_SHOE_GOLEM:
1602 if (mtmp->mrevived) break;
1603 num = d(1,2);
1604 if (num > 1 && rn2(2)) num /= 2;
1605 while(num--)
1606 obj = mksobj_at(rnd_class(PLASTEEL_BOOTS,LEVITATION_BOOTS), x, y, TRUE, FALSE, FALSE);
1607 mtmp->mnamelth = 0;
1608 break;
1609 case PM_SANDAL_GOLEM:
1610 num = d(1,6);
1611 if (num > 1 && rn2(2)) num /= 2;
1612 while(num--)
1613 obj = mksobj_at(STILETTO_SANDALS, x, y, TRUE, FALSE, FALSE);
1614 mtmp->mnamelth = 0;
1615 break;
1616 case PM_LINGERIE_GOLEM:
1617 num = d(1,4);
1618 if (num > 1 && rn2(2)) num /= 2;
1619 while(num--)
1620 obj = mksobj_at(VICTORIAN_UNDERWEAR, x, y, TRUE, FALSE, FALSE);
1621 mtmp->mnamelth = 0;
1622 break;
1623 case PM_ITALIAN_GOLEM:
1624 num = d(1,6);
1625 if (num > 1 && rn2(2)) num /= 2;
1626 while(num--)
1627 obj = mksobj_at(ITALIAN_HEELS, x, y, TRUE, FALSE, FALSE);
1628 mtmp->mnamelth = 0;
1629 break;
1630 case PM_STUDDED_GOLEM:
1631 num = d(2,3);
1632 if (num > 1 && rn2(2)) num /= 2;
1633 while(num--)
1634 obj = mksobj_at(STUDDED_LEATHER_ARMOR, x, y, TRUE, FALSE, FALSE);
1635 mtmp->mnamelth = 0;
1636 break;
1637 case PM_RING_GOLEM:
1638 num = d(2,3);
1639 if (num > 1 && rn2(2)) num /= 2;
1640 while(num--)
1641 obj = mksobj_at(RING_MAIL, x, y, TRUE, FALSE, FALSE);
1642 mtmp->mnamelth = 0;
1643 break;
1644 case PM_SCALE_GOLEM:
1645 num = d(2,3);
1646 if (num > 1 && rn2(2)) num /= 2;
1647 while(num--)
1648 obj = mksobj_at(SCALE_MAIL, x, y, TRUE, FALSE, FALSE);
1649 mtmp->mnamelth = 0;
1650 break;
1651 case PM_CHAIN_GOLEM:
1652 num = d(2,3);
1653 if (num > 1 && rn2(2)) num /= 2;
1654 while(num--)
1655 obj = mksobj_at(CHAIN_MAIL, x, y, TRUE, FALSE, FALSE);
1656 mtmp->mnamelth = 0;
1657 break;
1658 case PM_BANDED_GOLEM:
1659 num = d(2,2);
1660 if (num > 1 && rn2(2)) num /= 2;
1661 while(num--)
1662 obj = mksobj_at(BANDED_MAIL, x, y, TRUE, FALSE, FALSE);
1663 mtmp->mnamelth = 0;
1664 break;
1665 case PM_VOLUME_GOLEM:
1666 num = d(2,2);
1667 if (num > 1 && rn2(2)) num /= 2;
1668 while(num--)
1669 obj = mksobj_at(SPLINT_MAIL, x, y, TRUE, FALSE, FALSE);
1670 mtmp->mnamelth = 0;
1671 break;
1672 case PM_LAMEL_GOLEM:
1673 num = d(2,2);
1674 if (num > 1 && rn2(2)) num /= 2;
1675 while(num--)
1676 obj = mksobj_at(METAL_LAMELLAR_ARMOR, x, y, TRUE, FALSE, FALSE);
1677 mtmp->mnamelth = 0;
1678 break;
1679 case PM_BRATE_GOLEM:
1680 num = d(2,2);
1681 if (num > 1 && rn2(2)) num /= 2;
1682 while(num--)
1683 obj = mksobj_at(BRONZE_PLATE_MAIL, x, y, TRUE, FALSE, FALSE);
1684 mtmp->mnamelth = 0;
1685 break;
1686 case PM_CRYLEM:
1687 num = d(2,2);
1688 if (num > 1 && rn2(2)) num /= 2;
1689 while(num--)
1690 obj = mksobj_at(CRYSTAL_PLATE_MAIL, x, y, TRUE, FALSE, FALSE);
1691 mtmp->mnamelth = 0;
1692 break;
1693 case PM_PARTIAL_GOLEM:
1694 num = d(2,2);
1695 if (num > 1 && rn2(2)) num /= 2;
1696 while(num--)
1697 obj = mksobj_at(PARTIAL_PLATE_MAIL, x, y, TRUE, FALSE, FALSE);
1698 mtmp->mnamelth = 0;
1699 break;
1700 case PM_RIB_GOLEM:
1701 num = d(2,2);
1702 if (num > 1 && rn2(2)) num /= 2;
1703 while(num--)
1704 obj = mksobj_at(RIBBED_PLATE_MAIL, x, y, TRUE, FALSE, FALSE);
1705 mtmp->mnamelth = 0;
1706 break;
1707 case PM_TINSEL_GOLEM:
1708 num = d(2,2);
1709 if (num > 1 && rn2(2)) num /= 2;
1710 while(num--)
1711 obj = mksobj_at(TINSEL_LONGSWORD, x, y, TRUE, FALSE, FALSE);
1712 mtmp->mnamelth = 0;
1713 break;
1714 case PM_AMBER_GOLEM:
1715 num = d(2,2);
1716 if (num > 1 && rn2(2)) num /= 2;
1717 while(num--)
1718 obj = mksobj_at(ANCUS, x, y, TRUE, FALSE, FALSE);
1719 mtmp->mnamelth = 0;
1720 break;
1721 case PM_PLATE_GOLEM:
1722 num = d(2,2);
1723 if (num > 1 && rn2(2)) num /= 2;
1724 while(num--)
1725 obj = mksobj_at(PLATE_MAIL, x, y, TRUE, FALSE, FALSE);
1726 mtmp->mnamelth = 0;
1727 break;
1728 case PM_FUEL_SUNFLOWER:
1729 if (mtmp->mrevived) break;
1730 num = rn1(3,3);
1731 while(num--)
1732 obj = mksobj_at(POT_OIL, x, y, TRUE, FALSE, FALSE);
1733 mtmp->mnamelth = 0;
1734 break;
1735 case PM_FULL_PLATE_GOLEM:
1736 num = d(2,2);
1737 if (num > 1 && rn2(2)) num /= 2;
1738 while(num--)
1739 obj = mksobj_at(FULL_PLATE_MAIL, x, y, TRUE, FALSE, FALSE);
1740 mtmp->mnamelth = 0;
1741 break;
1743 case PM_CROUPIER:
1744 case PM_MASTER_CROUPIER:
1745 case PM_EXPERIENCED_CROUPIER:
1746 case PM_EXCEPTIONAL_CROUPIER:
1747 case PM_ELITE_CROUPIER:
1748 if (!rn2(2)) {
1749 num = rnd(2);
1750 while(num--)
1751 obj = mksobj_at(CASINO_CHIP, x, y, TRUE, FALSE, FALSE);
1753 goto default_1;
1754 case PM_BUG:
1755 if (!rn2(6)) {
1756 mksobj_at(PACK_OF_FLOPPIES, x, y, TRUE, FALSE, FALSE);
1758 break;
1759 case PM_HEISENBUG:
1760 if (!rn2(3)) {
1761 mksobj_at(PACK_OF_FLOPPIES, x, y, TRUE, FALSE, FALSE);
1763 break;
1764 case PM_PDP___: /* PDP-11 */
1765 case PM_PDP__: /* PDP-9 */
1766 case PM_VAX:
1767 case PM_CRAY:
1768 num = rn2(10) + 5;
1769 while (num--) {
1770 mksobj_at(!rn2(3) ? DIODE : (!rn2(2) ? TRANSISTOR : IC), x, y, TRUE, FALSE, FALSE);
1772 break;
1773 case PM_ALGOLIAN_SUNTIGER:
1774 if (!rn2(75)) {
1775 mksobj_at(TOOTH_OF_AN_ALGOLIAN_SUNTIGER,x, y, TRUE, FALSE, FALSE);
1777 goto default_1;
1778 case PM_ALL_SUPPLY_LIZARD:
1779 mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
1780 goto default_1;
1781 case PM_SAVEUP_MINOTAUR:
1782 if (mtmp->mrevived) goto default_1;
1783 mksobj_at(WAN_DIGGING, x, y, TRUE, FALSE, FALSE);
1784 goto default_1;
1785 case PM_HORNWALL:
1786 mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
1787 goto default_1;
1788 case PM_CHARGEHORN:
1789 mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
1790 goto default_1;
1791 case PM_TOPSIDE_LIZARD:
1792 mksobj_at(BUBBLEHORN, x, y, TRUE, FALSE, FALSE);
1793 goto default_1;
1795 case PM_WAX_GOLEM:
1796 num = d(2,4);
1797 while (num--)
1798 obj = mksobj_at(WAX_CANDLE, x, y, TRUE, FALSE, FALSE);
1799 mtmp->mnamelth = 0;
1800 break;
1801 case PM_PLASTIC_GOLEM:
1802 /* KMH -- Credit cards are #ifdef TOURIST */
1803 num = d(2,2);
1804 if (num > 1 && rn2(2)) num /= 2;
1805 while (num--)
1806 obj = mksobj_at(CREDIT_CARD, x, y, TRUE, FALSE, FALSE);
1807 mtmp->mnamelth = 0;
1808 break;
1809 case PM_GOLD_GOLEM:
1810 case PM_GOLD_SLIME:
1811 /* Good luck gives more coins */
1812 obj = mkgold((long)(200 - rnl(101)), x, y);
1813 mtmp->mnamelth = 0;
1814 break;
1815 case PM_INVULNERABLE_GOLEM:
1816 /* Good luck gives more coins */
1817 obj = mkgold((long)(rnz(1000) + 2000 - rnl(1001)), x, y);
1818 mtmp->mnamelth = 0;
1819 break;
1821 case PM_PAPER_GOLEM:
1822 if (mtmp->mrevived) break;
1823 num = rnd(4);
1824 while (num--)
1825 obj = mksobj_at(SCR_BLANK_PAPER, x, y, TRUE, FALSE, FALSE);
1826 mtmp->mnamelth = 0;
1827 break;
1829 case PM_PAPERBACK_GOLEM:
1830 if (mtmp->mrevived) break;
1831 num = rnd(4);
1832 while (num--)
1833 obj = mksobj_at(SPE_BLANK_PAPER, x, y, TRUE, FALSE, FALSE);
1834 mtmp->mnamelth = 0;
1835 break;
1837 case PM_ECTUEL_CHRISTMICEBOX:
1838 obj = mksobj_at(ICE_BOX, x, y, TRUE, FALSE, FALSE);
1839 mtmp->mnamelth = 0;
1840 break;
1842 case PM_INVERTED_HORN:
1843 obj = mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
1844 mtmp->mnamelth = 0;
1845 break;
1847 case PM_POTION_GOLEM:
1848 case PM_ALCHEMY_GOLEM:
1849 if (mtmp->mrevived) break;
1850 num = rnd(4);
1851 while (num--)
1852 obj = mksobj_at(rnd_class(POT_BOOZE, POT_AMNESIA), x, y, TRUE, FALSE, FALSE);
1853 mtmp->mnamelth = 0;
1854 break;
1856 case PM_FOOD_GOLEM:
1857 case PM_SCHOOL_FOOD_GOLEM:
1858 num = rnd(3);
1859 while (num--)
1860 obj = mksobj_at(rnd_class(TRIPE_RATION, TIN), x, y, TRUE, FALSE, FALSE);
1861 mtmp->mnamelth = 0;
1862 break;
1864 case PM_IMPLANT_GOLEM:
1865 if (mtmp->mrevived) break;
1866 num = rnd(3);
1867 while (num--)
1868 obj = mksobj_at(rnd_class(IMPLANT_OF_ABSORPTION, IMPLANT_OF_VIRTUE), x, y, TRUE, FALSE, FALSE);
1869 mtmp->mnamelth = 0;
1870 break;
1872 case PM_SCROLL_GOLEM:
1873 if (mtmp->mrevived) break;
1874 num = rnd(4);
1875 while (num--)
1876 obj = mksobj_at(rnd_class(SCR_CREATE_MONSTER, SCR_BLANK_PAPER), x, y, TRUE, FALSE, FALSE);
1877 mtmp->mnamelth = 0;
1878 break;
1880 case PM_WAND_GOLEM:
1881 if (mtmp->mrevived) break;
1882 num = rnd(3);
1883 while (num--)
1884 obj = mksobj_at(rnd_class(WAN_LIGHT, WAN_PSYBEAM), x, y, TRUE, FALSE, FALSE);
1885 mtmp->mnamelth = 0;
1886 break;
1888 case PM_GIANT_PENIS_GOLEM:
1889 if (mtmp->mrevived) break;
1890 num = rnd(5);
1891 while (num--)
1892 obj = mksobj_at(rnd_class(WAN_LIGHT, WAN_PSYBEAM), x, y, TRUE, FALSE, FALSE);
1893 mtmp->mnamelth = 0;
1894 break;
1896 default_1: /* monsters that still drop a corpse have a goto statement that points here */
1897 default: /* worm that walks has a chance to get a corpse even from G_NOCORPSE monsters --Amy */
1899 if ( (( (mvitals[mndx].mvflags & G_NOCORPSE) && !(mtmp->egotype_troll) ) || mtmp->egotype_multiplicator ) && ( ((!Race_if(PM_WORM_THAT_WALKS) || !polyok(mdat)) && !Race_if(PM_WARPER)) || (rn2(5) && !(mtmp->egotype_troll) ) || mndx == PM_ITEM_MASTER || mndx == PM_HOLE_MASTER || mndx == PM_TRAP_MASTER || mndx == PM_BOULDER_MASTER || mndx == PM_GOOD_ITEM_MASTER || mndx == PM_BAD_ITEM_MASTER ) )
1900 return (struct obj *)0;
1901 else /* preserve the unique traits of some creatures */
1902 obj = mkcorpstat(CORPSE, KEEPTRAITS(mtmp) ? mtmp : 0,
1903 mdat, x, y, TRUE);
1904 break;
1907 if (!obj) return (struct obj *)0; /* really fixing the damn bug with the "bug" and similar monster types! --Amy */
1909 /* clockwork automatons rarely get the sap of a monster, which might give intrinsics */
1910 if (obj && Race_if(PM_CLOCKWORK_AUTOMATON) && !rn2(100) && !(mtmp->egotype_troll) && !is_reviver(mdat) ) {
1911 register struct obj *energysap;
1913 energysap = mksobj_at(ENERGY_SAP, x, y, FALSE, FALSE, FALSE);
1914 if (energysap) {
1915 energysap->corpsenm = mtmp->mnum;
1919 if (obj && RngeSapGeneration && !rn2(100) && !(mtmp->egotype_troll) && !is_reviver(mdat) ) {
1920 register struct obj *energysap;
1922 energysap = mksobj_at(ENERGY_SAP, x, y, FALSE, FALSE, FALSE);
1923 if (energysap) {
1924 energysap->corpsenm = mtmp->mnum;
1928 /* All special cases should precede the G_NOCORPSE check */
1930 /* if polymorph or undead turning has killed this monster,
1931 prevent the same attack beam from hitting its corpse */
1932 if (flags.bypasses) bypass_obj(obj);
1934 if (mtmp->mnamelth)
1935 obj = oname(obj, NAME(mtmp));
1937 /* Avoid "It was hidden under a green mold corpse!"
1938 * during Blind combat. An unseen monster referred to as "it"
1939 * could be killed and leave a corpse. If a hider then hid
1940 * underneath it, you could be told the corpse type of a
1941 * monster that you never knew was there without this.
1942 * The code in hitmu() substitutes the word "something"
1943 * if the corpses obj->dknown is 0.
1945 if (Blind && !sensemon(mtmp)) obj->dknown = 0;
1947 /* Invisible monster ==> invisible corpse */
1948 obj->oinvis = mtmp->perminvis;
1949 obj->oinvisreal = mtmp->minvisreal;
1951 stackobj(obj);
1952 newsym(x, y);
1953 return obj;
1956 #endif /* OVLB */
1957 #ifdef OVL1
1959 #if 0
1960 /* part of the original warning code which was replaced in 3.3.1 */
1961 STATIC_OVL void
1962 warn_effects()
1964 register struct monst *mtmp;
1965 int num_mon;
1966 int warned_of;
1968 num_mon = 0;
1969 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
1970 if (!canseemon(mtmp) && !(mtmp->mpeaceful) && !(mtmp->mtame)) {
1971 if (Warning && (!spec_ability(uwep,SPFX_WARN) || !spec_dbon(uwep,mtmp,1))) num_mon++;
1972 else if (Undead_warning && (is_undead(mtmp->data) || mtmp->egotype_undead) ) num_mon++;
1973 else if (spec_ability(uwep,SPFX_WARN) && spec_dbon(uwep,mtmp,1)) num_mon++;
1976 if (num_mon == 0) return;
1977 /* num_mon is the # of monsters which could be warned against...
1978 pick one at random... */
1979 warned_of = rn2(num_mon)+1;
1980 mtmp = fmon;
1981 num_mon = warned_of;
1982 do {
1983 if (!canseemon(mtmp) && !(mtmp->mpeaceful) && !(mtmp->mtame)) {
1984 if (Warning && (!spec_ability(uwep,SPFX_WARN) || !spec_dbon(uwep,mtmp,1))) num_mon--;
1985 else if (Undead_warning && (is_undead(mtmp->data) || mtmp->egotype_undead) ) num_mon--;
1986 else if (spec_ability(uwep,SPFX_WARN) && spec_dbon(uwep,mtmp,1)) num_mon--;
1988 if (num_mon > 0) mtmp = mtmp->nmon;
1989 } while (num_mon > 0);
1990 display_monster(mtmp->mx,mtmp->my,mtmp,1,0);
1991 lastwarnlev = warnlevel;
1992 lastwarntime = moves;
1993 /* warnlevel = 0;*/
1994 return;
1996 #endif /* 0 */
1998 /* check mtmp and water/lava for compatibility, 0 (survived), 1 (died) */
2000 minliquid(mtmp)
2001 register struct monst *mtmp;
2003 boolean inpool, inlava, infountain;
2005 inpool = (is_waterypool(mtmp->mx,mtmp->my) || is_watertunnel(mtmp->mx,mtmp->my)) &&
2006 !is_flyer(mtmp->data) && !(is_urinelake(mtmp->mx,mtmp->my)) && !(is_moorland(mtmp->mx,mtmp->my)) && !(is_crystalwater(mtmp->mx,mtmp->my)) && (!mtmp->egotype_flying) && !is_floater(mtmp->data);
2007 inlava = is_lava(mtmp->mx,mtmp->my) &&
2008 !is_flyer(mtmp->data) && (!mtmp->egotype_flying) && !is_floater(mtmp->data);
2009 infountain = IS_FOUNTAIN(levl[mtmp->mx][mtmp->my].typ);
2011 int crapcnt = 1;
2013 /* Flying and levitation keeps our steed out of the liquid */
2014 /* (but not water-walking or swimming) */
2015 if (mtmp == u.usteed && (Flying || Levitation))
2016 return (0);
2018 /* poisonous non-zombies will poison a well --Amy */
2019 if (IS_WELL(levl[mtmp->mx][mtmp->my].typ) && poisonous(mtmp->data) && !(mtmp->data->mlet == S_ZOMBIE)) {
2020 levl[mtmp->mx][mtmp->my].typ = POISONEDWELL;
2021 if (cansee(mtmp->mx, mtmp->my)) pline("%s poisons the well!", Monnam(mtmp));
2024 /* but zombies will cure it... no matter how nonsensical this might seem, it's intentional */
2025 if (IS_POISONEDWELL(levl[mtmp->mx][mtmp->my].typ) && mtmp->data->mlet == S_ZOMBIE) {
2026 levl[mtmp->mx][mtmp->my].typ = WELL;
2027 if (cansee(mtmp->mx, mtmp->my)) pline("%s cures the well of its poison!", Monnam(mtmp));
2030 if (IS_TOILET(levl[mtmp->mx][mtmp->my].typ) && multi >= 0 && !rn2(SuperFemtrapKatharina ? 5 : 10) && flags.soundok && mtmp->mcanmove && ((distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) || FemtrapActiveKatharina) && ((mtmp->data->msound == MS_FART_QUIET) || (mtmp->data->msound == MS_FART_NORMAL) || (mtmp->data->msound == MS_FART_LOUD) || FemtrapActiveThai ) ) {
2031 if (cansee(mtmp->mx,mtmp->my)) {
2032 pline("%s produces %s crapping noises with %s %s butt.", Monnam(mtmp), mtmp->data->msound == MS_FART_QUIET ? "tender" : mtmp->data->msound == MS_FART_NORMAL ? "beautiful" : "disgusting", mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
2033 } else {
2034 You_hear("%s crapping noises.", mtmp->data->msound == MS_FART_QUIET ? "tender" : mtmp->data->msound == MS_FART_NORMAL ? "beautiful" : "disgusting");
2036 u.cnd_crappingcount++;
2037 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
2038 if (mtmp->data->msound == MS_FART_QUIET) pline("Because of the wonderfully soft noises, you briefly forget what you were doing and just stand there.");
2039 else if (mtmp->data->msound == MS_FART_NORMAL) pline("You just can't believe that someone could produce such erotic noises, and are immobilized by your feelings.");
2040 else pline("This is really disgusting. You resist the urge to vomit, but fail to pay attention to your surroundings for a moment...");
2042 crapcnt = 1;
2043 if (mtmp->crapbonus > 0) {
2044 crapcnt += mtmp->crapbonus;
2045 drain_alla(crapcnt);
2046 pline(flags.female ? "Your vagina seems to turn itself inward..." : "It feels like your penis is contracting...");
2048 if (crapcnt > 10) crapcnt = 10; /* sanity check --Amy */
2050 if (isstunfish) {
2051 if (mtmp->data->msound == MS_FART_QUIET) nomul(-rnz(3 + crapcnt), "listening to tender crapping noises", TRUE);
2052 else if (mtmp->data->msound == MS_FART_NORMAL) nomul(-rnz(4 + crapcnt), "listening to beautiful crapping noises", TRUE);
2053 else nomul(-rnz(2 + crapcnt), "listening to disgusting crapping noises", TRUE);
2054 } else {
2055 if (mtmp->data->msound == MS_FART_QUIET) nomul(-rnd(3 + crapcnt), "listening to tender crapping noises", TRUE);
2056 else if (mtmp->data->msound == MS_FART_NORMAL) nomul(-rnd(4 + crapcnt), "listening to beautiful crapping noises", TRUE);
2057 else nomul(-rnd(2 + crapcnt), "listening to disgusting crapping noises", TRUE);
2060 nomovemsg = "At last, you get yourself together, ready to move on.";
2062 if (!rn2(10)) increasesanity(1);
2066 if (IS_TOILET(levl[mtmp->mx][mtmp->my].typ) && uarmc && uarmc->oartifact == ART_TOILET_NOISES && multi >= 0 && flags.soundok && mtmp->mcanmove && ((distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) || FemtrapActiveKatharina) && ((mtmp->data->msound != MS_FART_QUIET) && (mtmp->data->msound != MS_FART_NORMAL) && (mtmp->data->msound != MS_FART_LOUD) ) ) {
2067 if (cansee(mtmp->mx,mtmp->my)) {
2068 pline("%s produces crapping noises with %s %s butt.", Monnam(mtmp), mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
2069 } else {
2070 You_hear("crapping noises.");
2072 u.cnd_crappingcount++;
2073 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
2075 crapcnt = 1;
2076 if (mtmp->crapbonus > 0) {
2077 crapcnt += mtmp->crapbonus;
2078 drain_alla(crapcnt);
2079 pline(flags.female ? "Your vagina seems to turn itself inward..." : "It feels like your penis is contracting...");
2081 if (crapcnt > 10) crapcnt = 10; /* sanity check --Amy */
2083 pline("Because you are stupid, you stop to listen.");
2084 if (isstunfish) nomul(-rnz(3 + crapcnt), "listening to crapping noises", TRUE);
2085 else nomul(-rnd(3 + crapcnt), "listening to crapping noises", TRUE);
2086 nomovemsg = "At last, you get yourself together, ready to move on.";
2087 if (!rn2(10)) increasesanity(1);
2090 if (IS_TOILET(levl[mtmp->mx][mtmp->my].typ) && !rn2(SuperFemtrapKatharina ? 5 : 10) && FemtrapActiveKlara && spawnswithsandals(mtmp->data) && multi >= 0 && flags.soundok && mtmp->mcanmove && ((distu(mtmp->mx,mtmp->my) <= BOLT_LIM*BOLT_LIM) || FemtrapActiveKatharina) ) {
2091 if (cansee(mtmp->mx,mtmp->my)) {
2092 pline("%s produces crapping noises with %s %s butt.", Monnam(mtmp), mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
2093 } else {
2094 You_hear("crapping noises.");
2096 u.cnd_crappingcount++;
2097 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
2099 crapcnt = 1;
2100 if (mtmp->crapbonus > 0) {
2101 crapcnt += mtmp->crapbonus;
2102 drain_alla(crapcnt);
2103 pline(flags.female ? "Your vagina seems to turn itself inward..." : "It feels like your penis is contracting...");
2105 if (crapcnt > 10) crapcnt = 10; /* sanity check --Amy */
2107 pline("For some reason you are aroused, and just stand there listening.");
2108 if (isstunfish) nomul(-rnz(3 + crapcnt), "listening to crapping noises", TRUE);
2109 else nomul(-rnd(3 + crapcnt), "listening to crapping noises", TRUE);
2110 nomovemsg = "At last, you get yourself together, ready to move on.";
2111 if (!rn2(10)) increasesanity(1);
2114 /* Gremlin multiplying won't go on forever since the hit points
2115 * keep going down, and when it gets to 1 hit point the clone
2116 * function will fail.
2118 if (splittinggremlin(mtmp->data) && (inpool || infountain) && !rn2(5)) { /* lowered chance --Amy */
2119 if (split_mon(mtmp, (struct monst *)0))
2120 dryup(mtmp->mx, mtmp->my, FALSE);
2121 if (inpool) water_damage(mtmp->minvent, FALSE, FALSE);
2122 return (0);
2123 } else if (splittinglavagremlin(mtmp->data) && inlava && !rn2(5)) { /* lowered chance --Amy */
2124 (split_mon(mtmp, (struct monst *)0));
2125 return (0);
2126 } else if (mtmp->data == &mons[PM_IRON_GOLEM] && inpool && !rn2(5)) {
2127 int dam = d(2,6);
2128 if (cansee(mtmp->mx,mtmp->my))
2129 pline("%s rusts.", Monnam(mtmp));
2130 mtmp->mhp -= dam;
2131 if (mtmp->mhpmax > dam) mtmp->mhpmax -= dam;
2132 if (mtmp->mhp < 1) {
2133 mondead(mtmp);
2134 if (mtmp->mhp < 1) return (1);
2136 water_damage(mtmp->minvent, FALSE, FALSE);
2137 return (0);
2140 if (inlava && !(is_arabellamonster(mtmp->data) && *in_rooms(mtmp->mx, mtmp->my, INSIDEROOM)) ) {
2142 * Lava effects much as water effects. Lava likers are able to
2143 * protect their stuff. Fire resistant monsters can only protect
2144 * themselves --ALI
2146 if (!is_clinger(mtmp->data) && !(mtmp->data->mlet == S_FLYFISH) && !(mtmp->data == &mons[PM_UNMAGIC_FISH]) && !(mtmp->data == &mons[PM_ROXY_GRETA_S_SNEAKER]) && !likes_lava(mtmp->data)) {
2147 if (!resists_fire(mtmp)) {
2148 if (cansee(mtmp->mx,mtmp->my))
2149 pline("%s %s.", Monnam(mtmp),
2150 mtmp->data == &mons[PM_WATER_ELEMENTAL] ?
2151 "boils away" : "burns to a crisp");
2152 if (!rn2(20)) mondead(mtmp); /* give them a chance to survive --Amy */
2153 else (void) rloc(mtmp, FALSE); /* unrealistic, I know, but I want the game to be as hard as possible. */
2154 /* And monsters dying instantly is not my idea of hard. After all, you can instakill Croesus that way:
2155 * freeze the moat, wait for him to step on it and burn the ice away, which is way too easy! */
2157 else {
2158 if (--mtmp->mhp < 1) {
2159 if (cansee(mtmp->mx,mtmp->my))
2160 pline("%s surrenders to the fire.", Monnam(mtmp));
2161 if (!rn2(20)) mondead(mtmp);
2162 else (void) rloc(mtmp, FALSE);
2164 else if (cansee(mtmp->mx,mtmp->my))
2165 pline("%s burns slightly.", Monnam(mtmp));
2167 if (mtmp->mhp > 0) {
2168 (void) fire_damage(mtmp->minvent, FALSE, FALSE,
2169 mtmp->mx, mtmp->my);
2170 (void) rloc(mtmp, FALSE);
2171 return 0;
2173 return (1);
2175 } else if (inpool && !(is_arabellamonster(mtmp->data) && *in_rooms(mtmp->mx, mtmp->my, INSIDEROOM)) ) {
2176 /* Most monsters drown in pools. flooreffects() will take care of
2177 * water damage to dead monsters' inventory, but survivors need to
2178 * be handled here. Swimmers are able to protect their stuff...
2180 if (!is_clinger(mtmp->data)
2181 && !is_swimmer(mtmp->data) && !(mtmp->data->mlet == S_FLYFISH) && !(mtmp->data->mlet == S_EEL) && !mtmp->egotype_watersplasher && !amphibious(mtmp->data)) {
2182 if (cansee(mtmp->mx,mtmp->my)) {
2183 pline("%s drowns.", Monnam(mtmp));
2185 if (u.ustuck && u.uswallow && u.ustuck == mtmp) {
2186 /* This can happen after a purple worm plucks you off a
2187 flying steed while you are over water. */
2188 pline("%s sinks as water rushes in and flushes you out.",
2189 Monnam(mtmp));
2191 if (!rn2(20)) mondead(mtmp); /* see above for the reason why monsters survive here --Amy */
2192 else (void) rloc(mtmp, FALSE);
2193 if (mtmp->mhp > 0) {
2194 (void) rloc(mtmp, FALSE);
2195 water_damage(mtmp->minvent, FALSE, FALSE);
2196 return 0;
2198 return (1);
2200 } /*else {*/
2201 /* but eels have a difficult time outside */
2202 if (mtmp->data->mlet == S_EEL && issoviet && !Is_waterlevel(&u.uz)) {
2204 /* "S_EEL monsters are horribly weak on land again." In Soviet Russia, people got kind of annoyed that they couldn't punch out kraken with a single hit of their bare fists, even though being capable of doing so makes the game way too easy. Other races though, will have to contend with eels in fair combat, water or no water. Who the heck decided to skew the odds in favor of the player anyway? Isn't Nethack supposed to be a difficult game??? --Amy */
2206 if(mtmp->mhp > 1) mtmp->mhp--;
2207 monflee(mtmp, 2, FALSE, FALSE);
2210 /* commented out - would just make the game easier, and we don't want that --Amy */
2211 /*}*/
2212 return (0);
2216 mcalcmove(mon)
2217 struct monst *mon;
2219 int mmove = mon->data->mmove;
2221 if (FemtrapActiveKsenia && spawnswithsandals(mon->data) && (mmove < 12)) mmove = 12;
2223 if (mon->data == &mons[PM_HUSSY_JILL] || mon->data == &mons[PM_ENEMY_FROM_LEVEL___] || mon->data == &mons[PM_VELCRO_BITCH] || mon->data == &mons[PM_SOCKS_GIRL] || mon->data == &mons[PM_MAND_PENDING__MAGIC_SPELL___] || mon->data == &mons[PM_E_PALE_WRAITH_WITH_A_LIGHTNING_STROKE_] || mon->data == &mons[PM_ULTRACHEST] || mon->data == &mons[PM_JILL] ) {
2224 /* Hussy Jill is a dangerous quest nemesis. As long as you don't hurt her, she'll just stand in place...
2225 * but as soon as she loses as much as a single hit point, she'll completely 0wn your sorry butt :P --Amy */
2226 if (!(u.usteed && mon == u.usteed) && (mon->mhp == mon->mhpmax)) {
2227 mmove = 0;
2228 return mmove;
2232 if (mon->data == &mons[PM_SUPER_STATUE] || mon->data == &mons[PM_SUPERCHEST] || mon->data == &mons[PM_ELTRA_STATUE]) {
2233 if (!(u.usteed && mon == u.usteed) && mon->m_ap_type) {
2234 mmove = 0;
2235 return mmove;
2240 if (mon->data == &mons[PM_WOODEN_RAFT] || mon->data == &mons[PM_MINE_TROLLEY] || mon->data == &mons[PM_SHIP_O__THE_SEA] || mon->data == &mons[PM_CLASHING_MINE_TROLLEY]) {
2241 if (!(u.usteed && mon == u.usteed)) {
2242 mmove = 0;
2243 return mmove;
2247 if (mon->data == &mons[PM_HEFFER] || mon->data == &mons[PM_THE_SMITH] ) {
2248 /* Hephaisto, also known as "The Armorer", speeds up whenever he takes damage. --Amy */
2249 mmove *= mon->mhpmax;
2250 mmove /= mon->mhp;
2253 if (mmove == 0) mmove++; /* allowing stationary monsters to occasionally get turns --Amy */
2255 /* Note: MSLOW's `+ 1' prevents slowed speed 1 getting reduced to 0;
2256 * MFAST's `+ 2' prevents hasted speed 1 from becoming a no-op;
2257 * both adjustments have negligible effect on higher speeds.
2259 if (mon->mspeed == MSLOW)
2260 mmove = (2 * mmove + 1) / 3;
2261 else if (mon->mspeed == MFAST)
2262 mmove = (4 * mmove + 2) / 3;
2264 if (mon == u.usteed) {
2265 if ( (u.ugallop || (uarmf && uarmf->oartifact == ART_LIGHT_DAL_I_THALION)) && flags.mv) {
2266 /* average movement is 1.50 times normal */
2267 mmove = ((rn2(2) ? 4 : 5) * mmove) / 3;
2271 /* multiplicative speed increases first */
2273 if ( (uwep && uwep->oartifact == ART_GUARDIAN_OF_ARANOCH) && !rn2(5) && (mmove > 0) && !mon->mpeaceful && !mon->mtame) {
2274 mmove *= 2;
2277 if ( (u.twoweap && uswapwep && uswapwep->oartifact == ART_GUARDIAN_OF_ARANOCH) && !rn2(5) && (mmove > 0) && !mon->mpeaceful && !mon->mtame) {
2278 mmove *= 2;
2281 /* ataru monster lightsaber form - boosts monster speed slightly if it has two weapon attacks
2282 * this is because monsters don't dual-wield in SLEX (unlike dnethack) but still need some kind of boost --Amy */
2283 if (MON_WEP(mon) && (mons[mon->mnum].mattk[1].aatyp == AT_WEAP) ) {
2284 struct obj *monweapon;
2285 monweapon = MON_WEP(mon);
2286 if (monweapon) {
2287 if (is_lightsaber(monweapon) && !bimanual(monweapon) && monweapon->lamplit && !rn2((mon->data->geno & G_UNIQ) ? 10 : 20)) {
2288 mmove *= 2;
2293 if ((MonsterSpeedBug || u.uprops[MONSTER_SPEED_BUG].extrinsic || (uamul && uamul->oartifact == ART_FOOK_SRI_SAEVE) || (uarm && uarm->oartifact == ART_HUNKSTERMAN) || (uarm && uarm->oartifact == ART_SUSA_MAIL) || have_monsterspeedstone()) && !rn2(2) && (mmove > 0)) {
2294 mmove *= 3;
2295 if (mmove == 3) mmove = 4;
2296 mmove /= 2;
2298 if (FemtrapActiveEveline && humanoid(mon->data) && (!rn2(2) || SuperFemtrapEveline) && is_female(mon->data) && (mmove > 0)) {
2299 mmove *= 3;
2300 if (mmove == 3) mmove = 4;
2301 mmove /= 2;
2304 if (Race_if(PM_UNALIGNMENT_THING) && mon->data->msound == MS_CONVERT && !mon->mpeaceful && !mon->mtame && (mmove > 0)) {
2305 mmove += rnd(mmove);
2308 if (uwep && uwep->oartifact == ART_TSCHAPSNAP && distu(mon->mx,mon->my) > 290) {
2309 mmove *= (1 + rnd(2));
2311 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_TSCHAPSNAP && distu(mon->mx,mon->my) > 290) {
2312 mmove *= (1 + rnd(2));
2315 /* additive speed increases second */
2317 if (mon->egotype_speedster) mmove += 6;
2318 if (mon->egotype_racer) mmove += 12;
2320 if (is_highway(mon->mx, mon->my)) {
2321 if (mon->data->msound == MS_CAR) mmove += mmove;
2322 else mmove += rnd(mmove);
2325 if (mon->data == &mons[PM_YEEK_HARD_WORKER] && !rn2(5)) mmove += 12;
2326 if (mon->data == &mons[PM_ROUGE_HC_LADY] && !rn2(5)) mmove += 12;
2327 if (mon->data == &mons[PM_INDRA] && !rn2(5)) mmove += 12;
2328 if (mon->data == &mons[PM_KOBOLD_BLASTER] && !rn2(5)) mmove += 12;
2329 if (mon->data == &mons[PM_SPEED_HACK_CHEATAH] && !mon->mpeaceful) mmove += 60;
2331 if (mon->data == &mons[PM_DACHA_DACHA_DACHA_SMIRKING_SNEAK_THIEF] && !rn2(20)) mmove += rnd(60);
2332 if (mon->data == &mons[PM_BUGGED_TO_HELL_WIZARD] && !rn2(20)) mmove += rnd(60);
2334 if (mon->data == &mons[PM_DIAGONALATOR] && u.dx && u.dy) mmove += 12;
2335 if (mon->data == &mons[PM_BRIGHT_DIAGONALATOR] && u.dx && u.dy) mmove += 12;
2336 if (mon->data == &mons[PM_HEAVEN_DIAGONALATOR] && u.dx && u.dy) mmove += 12;
2337 if (mon->data == &mons[PM_FEMININE_DIAGONALATOR] && u.dx && u.dy) mmove += 12;
2338 if (mon->data == &mons[PM_ABNORMAL_DIAGONALATOR] && u.dx && u.dy) mmove += 12;
2340 if (mmove && uarmc && itemhasappearance(uarmc, APP_GREEK_CLOAK) ) mmove += 1;
2342 if (uarmh && mmove && itemhasappearance(uarmh, APP_FORMULA_ONE_HELMET) ) mmove += 1;
2344 if (uarmg && uarmg->oartifact == ART_AFK_MEANS_ASS_FUCKER && (dmgtype(mon->data, AD_SITM) || dmgtype(mon->data, AD_SEDU) || dmgtype(mon->data, AD_SSEX) ) ) mmove += 12;
2346 if (Race_if(PM_PLAYER_UNICORN)) mmove += 3; /* because you have double speed --Amy */
2348 /* divisions last */
2350 if (mon->data == &mons[PM_DEWING_BAT] && !rn2(2) && mmove > 1) mmove /= 2;
2352 if (uamul && uamul->oartifact == ART_APATHY_STRATEGY && mmove > 1) mmove /= 2;
2354 return mmove;
2357 /* actions that happen once per ``turn'', regardless of each
2358 individual monster's metabolism; some of these might need to
2359 be reclassified to occur more in proportion with movement rate */
2360 void
2361 mcalcdistress()
2363 struct monst *mtmp;
2365 int chameleonchance = 6;
2367 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
2368 if (DEADMONSTER(mtmp)) continue;
2370 /* must check non-moving monsters once/turn in case
2371 * they managed to end up in liquid */
2372 if (mtmp->data->mmove == 0) {
2373 if (vision_full_recalc) vision_recalc(0);
2374 if (minliquid(mtmp)) continue;
2377 if (FemtrapActiveInge && mtmp->data->msound == MS_FART_QUIET && mtmp->fartbonus < 9) mtmp->fartbonus = 9;
2379 /* regenerate hit points */
2380 mon_regen(mtmp, FALSE);
2382 chameleonchance = 6;
2383 if (mtmp->cham && mtmp->cham == CHAM_ZRUTINATOR) chameleonchance = 100;
2384 if (mtmp->cham && mtmp->cham == CHAM_LAMECHAM) chameleonchance = 30;
2386 /* possibly polymorph shapechangers and lycanthropes
2387 * Amy edit: zrutinator (Rodney's special pet) has a low polymorph chance; he likes to be in his natural form */
2388 if (mtmp->cham && !rn2(chameleonchance) && !Protection_from_shape_changers)
2389 (void) mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE,
2390 cansee(mtmp->mx,mtmp->my) && flags.verbose, FALSE, FALSE);
2391 were_change(mtmp);
2393 if (FemtrapActiveYasaman) {
2394 if ( (rn2(100) > mtmp->data->mr) && (mtmp->oldmonnm == monsndx(mtmp->data)) && !(mtmp->isshk) && !(mtmp->isgd) && !(mtmp->ispriest) && !(mtmp->isminion) && !(mtmp->isgyp) && !(mtmp->data->geno & G_UNIQ) && !rn2(SuperFemtrapYasaman ? 3333 : 10000) && !resist(mtmp, WAND_CLASS, 0, NOTELL) ) {
2395 int mndx;
2396 struct permonst *pm;
2397 yasichoice:
2398 mndx = rn2(NUMMONS);
2399 pm = &mons[mndx];
2400 if (rnd(pm->mlevel + 1) > (mtmp->m_lev + 10) ) goto yasichoice;
2401 if (uncommon2(pm) && !rn2(4)) goto yasichoice;
2402 if (uncommon3(pm) && !rn2(3)) goto yasichoice;
2403 if (uncommon5(pm) && !rn2(2)) goto yasichoice;
2404 if (uncommon7(pm) && rn2(3)) goto yasichoice;
2405 if (uncommon10(pm) && rn2(5)) goto yasichoice;
2406 if (is_jonadabmonster(pm) && rn2(20)) goto yasichoice;
2407 if (rn2(10000) && !(pm->msound == MS_STENCH || pm->msound == MS_FART_NORMAL || pm->msound == MS_FART_QUIET || pm->msound == MS_FART_LOUD) ) goto yasichoice;
2409 mon_spec_poly(mtmp, pm, 0L, FALSE, canseemon(mtmp), FALSE, TRUE);
2414 /* gradually time out temporary problems */
2415 if (mtmp->mblinded) {
2416 mtmp->mblinded--;
2417 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mblinded) mtmp->mblinded--;
2418 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mblinded) mtmp->mblinded--;
2419 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mblinded) mtmp->mblinded--;
2420 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mblinded) mtmp->mblinded--;
2421 if (mtmp->mblinded < 1) {
2422 mtmp->mcansee = 1;
2426 if (mtmp->mfrozen) {
2427 mtmp->mfrozen--;
2428 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfrozen) mtmp->mfrozen--;
2429 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfrozen) mtmp->mfrozen--;
2430 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfrozen) mtmp->mfrozen--;
2431 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfrozen) mtmp->mfrozen--;
2433 if (mtmp->mfrozen < 1) {
2434 mtmp->mcanmove = 1;
2435 mtmp->masleep = 0;
2438 if (mtmp->mfleetim) {
2439 mtmp->mfleetim--;
2440 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfleetim) mtmp->mfleetim--;
2441 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfleetim) mtmp->mfleetim--;
2442 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfleetim) mtmp->mfleetim--;
2443 if (!mtmp->mtame && (mtmp->data->geno & G_UNIQ) && mtmp->mfleetim) mtmp->mfleetim--;
2445 if (mtmp->mfleetim < 1) {
2446 mtmp->mflee = 0;
2450 /* FIXME: mtmp->mlstmv ought to be updated here */
2455 movemon()
2457 register struct monst *mtmp, *nmtmp;
2458 register boolean somebody_can_move = FALSE;
2460 #if 0
2461 /* part of the original warning code which was replaced in 3.3.1 */
2462 warnlevel = 0;
2463 #endif
2466 Some of you may remember the former assertion here that
2467 because of deaths and other actions, a simple one-pass
2468 algorithm wasn't possible for movemon. Deaths are no longer
2469 removed to the separate list fdmon; they are simply left in
2470 the chain with hit points <= 0, to be cleaned up at the end
2471 of the pass.
2473 The only other actions which cause monsters to be removed from
2474 the chain are level migrations and losedogs(). I believe losedogs()
2475 is a cleanup routine not associated with monster movements, and
2476 monsters can only affect level migrations on themselves, not others
2477 (hence the fetching of nmon before moving the monster). Currently,
2478 monsters can jump into traps, read cursed scrolls of teleportation,
2479 and drink cursed potions of raise level to change levels. These are
2480 all reflexive at this point. Should one monster be able to level
2481 teleport another, this scheme would have problems.
2484 for(mtmp = fmon; mtmp; mtmp = nmtmp) {
2486 /* end monster movement early if hero is flagged to leave the level */
2487 if (u.utotype
2488 #ifdef SAFERHANGUP
2489 /* or if the program has lost contact with the user */
2490 || program_state.done_hup
2491 #endif
2493 somebody_can_move = FALSE;
2494 break;
2497 nmtmp = mtmp->nmon;
2499 u.symbioteattacking = FALSE; /* in case the previous one was hit by the symbiote's passive attack... */
2501 /* Find a monster that we have not treated yet. */
2502 if(DEADMONSTER(mtmp))
2503 continue;
2504 if(mtmp->movement < NORMAL_SPEED)
2505 continue;
2507 mtmp->movement -= NORMAL_SPEED;
2508 if (mtmp->movement >= NORMAL_SPEED)
2509 somebody_can_move = TRUE;
2511 if (vision_full_recalc) vision_recalc(0); /* vision! */
2513 if (minliquid(mtmp)) continue;
2515 /* if permamimics are ever not cloaked, e.g. because they got created by another monster polymorphing,
2516 * cloak them again. --Amy */
2517 if ((permamimic(mtmp->data) || mtmp->egotype_permamimic ) && !mtmp->m_ap_type ) {
2518 set_mimic_sym(mtmp);
2521 if (is_hider(mtmp->data) || mtmp->egotype_hide || mtmp->egotype_mimic) {
2522 /* unwatched mimics and piercers may hide again [MRS] */
2523 if(restrap(mtmp) && issoviet) continue;
2524 if((mtmp->m_ap_type == M_AP_FURNITURE || mtmp->m_ap_type == M_AP_OBJECT) && issoviet) continue;
2525 if(mtmp->mundetected && issoviet) continue;
2528 /* continue if the monster died fighting */
2529 if ((Conflict || (mtmp->mnum == PM_FRENZY_KANGAROO) ) && !mtmp->iswiz && mtmp->mcansee && haseyes(mtmp->data) ) {
2530 /* Note:
2531 * Conflict does not take effect in the first round.
2532 * Therefore, A monster when stepping into the area will
2533 * get to swing at you.
2535 * The call to fightm() must be _last_. The monster might
2536 * have died if it returns 1.
2538 /* Amy addition: monsters without eyes are now immune, because the Astral Plane is easy enough already! */
2539 if (couldsee(mtmp->mx,mtmp->my) &&
2540 (distu(mtmp->mx,mtmp->my) <= /*BOLT_LIM*BOLT_LIM*/ 4) &&
2541 fightm(mtmp))
2542 continue; /* mon might have died */
2544 if ((StrongConflict || (mtmp->mnum == PM_FRENZY_KANGAROO)) && !mtmp->iswiz && mtmp->mcansee && haseyes(mtmp->data) ) {
2545 /* Note:
2546 * Conflict does not take effect in the first round.
2547 * Therefore, A monster when stepping into the area will
2548 * get to swing at you.
2550 * The call to fightm() must be _last_. The monster might
2551 * have died if it returns 1.
2553 /* Amy addition: monsters without eyes are now immune, because the Astral Plane is easy enough already! */
2554 if (couldsee(mtmp->mx,mtmp->my) &&
2555 (distu(mtmp->mx,mtmp->my) <= /*BOLT_LIM*BOLT_LIM*/ 4) &&
2556 fightm(mtmp))
2557 continue; /* mon might have died */
2559 if(dochugw(mtmp)) /* otherwise just move the monster */
2560 continue;
2562 #if 0
2563 /* part of the original warning code which was replaced in 3.3.1 */
2564 if(warnlevel > 0)
2565 warn_effects();
2566 #endif
2567 if (any_light_source())
2568 vision_full_recalc = 1; /* in case a mon moved with a light source */
2569 dmonsfree(); /* remove all dead monsters */
2571 /* a monster may have levteleported player -dlc */
2572 if (u.utotype) {
2573 deferred_goto();
2574 /* changed levels, so these monsters are dormant */
2575 somebody_can_move = FALSE;
2578 return somebody_can_move;
2581 #endif /* OVL1 */
2582 #ifdef OVLB
2584 #define mstoning(obj) (ofood(obj) && \
2585 ((touch_petrifies(&mons[(obj)->corpsenm]) || \
2586 (obj)->corpsenm == PM_MEDUSA) && (obj)->corpsenm != PM_PLAYERMON ))
2589 * Maybe eat a metallic object (not just gold).
2590 * Return value: 0 => nothing happened, 1 => monster ate something,
2591 * 2 => monster died (it must have grown into a genocided form, but
2592 * that can't happen at present because nothing which eats objects
2593 * has young and old forms).
2596 meatmetal(mtmp)
2597 register struct monst *mtmp;
2599 register struct obj *otmp;
2600 struct permonst *ptr;
2601 int poly, grow, heal, mstone;
2603 /* If a pet, eating is handled separately, in dog.c */
2604 if (mtmp->mtame) return 0;
2606 /* Eats topmost metal object if it is there */
2607 for (otmp = level.objects[mtmp->mx][mtmp->my];
2608 otmp; otmp = otmp->nexthere) {
2609 if (otmp->oerodeproof) continue; /* change by Amy - erosionproof items can't be eaten */
2610 if (is_metallic(otmp) && !obj_resists(otmp, 5, 95) &&
2611 touch_artifact(otmp,mtmp)) {
2612 /* KMH -- Don't eat indigestible/choking objects */
2613 if (otmp->otyp != AMULET_OF_STRANGULATION &&
2614 otmp->otyp != RIN_SLOW_DIGESTION && otmp->otyp != RIN_INDIGESTION) {
2615 if (cansee(mtmp->mx,mtmp->my) && flags.verbose) {
2617 /* metal mafia guys technically eat metallic items, but it's flavored as them selling the metal --Amy
2618 * they're secretive about it, so there is no sound if they do so outside your field of view */
2620 if (mtmp->data->msound == MS_METALMAFIA) pline("%s sells %s to the fences!", Monnam(mtmp), distant_name(otmp,doname));
2621 else pline("%s eats %s!", Monnam(mtmp), distant_name(otmp,doname));
2622 } else if (flags.soundok && flags.verbose && !(mtmp->data->msound == MS_METALMAFIA)) {
2623 You_hear("a crunching sound.");
2624 if (PlayerHearsSoundEffects) pline(issoviet ? "Ochen' tsennyy element metalla tol'ko chto poyel i vy budete pinat' sebya, yesli ya skazhu vam, chto eto bylo." : "Gruum!");
2627 u.cnd_moneatmetal++;
2628 mtmp->meating = otmp->owt/2 + 1;
2629 if (mtmp->meating > 10) mtmp->meating = 10; /* arbitrary --Amy */
2630 if (mtmp->data->msound == MS_METALMAFIA && mtmp->meating > 1) mtmp->meating = 1; /* not really eating it */
2631 /* Heal up to the object's weight in hp */
2632 if (mtmp->mhp < mtmp->mhpmax) {
2633 mtmp->mhp += objects[otmp->otyp].oc_weight;
2634 if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
2637 if (otmp->otyp == MEDICAL_KIT)
2638 delete_contents(otmp);
2639 if (Has_contents(otmp)) {
2640 register struct obj *otmp3;
2641 while ((otmp3 = otmp->cobj) != 0) {
2642 obj_extract_self(otmp3);
2643 if ( (otmp->otyp == ICE_BOX || otmp->otyp == DISPERSION_BOX || otmp->otyp == ICE_BOX_OF_HOLDING || otmp->otyp == ICE_BOX_OF_WATERPROOFING || otmp->otyp == ICE_BOX_OF_DIGESTION) && otmp3->otyp == CORPSE) {
2644 otmp3->icedobject = TRUE;
2645 otmp3->age = monstermoves - otmp3->age;
2646 start_corpse_timeout(otmp3);
2648 (void) mpickobj(mtmp, otmp3, FALSE);
2652 if(otmp == uball) {
2653 unpunish();
2654 delobj(otmp);
2655 } else if (otmp == uchain) {
2656 unpunish(); /* frees uchain */
2657 } else {
2658 poly = polyfodder(otmp);
2659 grow = mlevelgain(otmp);
2660 heal = mhealup(otmp);
2661 mstone = mstoning(otmp);
2662 delobj(otmp);
2663 ptr = mtmp->data;
2664 if (poly) {
2665 if (mon_spec_poly(mtmp,
2666 (struct permonst *)0, 0L, FALSE,
2667 cansee(mtmp->mx,mtmp->my) && flags.verbose,
2668 FALSE, FALSE))
2669 ptr = mtmp->data;
2670 } else if (grow) {
2671 ptr = grow_up(mtmp, (struct monst *)0);
2672 } else if (mstone && !rn2(4) ) {
2673 if (poly_when_stoned(ptr)) {
2674 mon_to_stone(mtmp);
2675 ptr = mtmp->data;
2676 } else if (!resists_ston(mtmp)) {
2677 if (canseemon(mtmp))
2678 pline("%s turns to stone!", Monnam(mtmp));
2679 monstone(mtmp);
2680 ptr = (struct permonst *)0;
2682 } else if (heal) {
2683 mtmp->mhp = mtmp->mhpmax;
2685 if (!ptr) return 2; /* it died */
2687 /* Left behind a pile? */
2688 if (rnd(25) < 3)
2689 (void) mksobj_at(ROCK, mtmp->mx, mtmp->my, TRUE, FALSE, FALSE);
2690 newsym(mtmp->mx, mtmp->my);
2691 return 1;
2695 return 0;
2699 * Maybe eat a lithic object.
2700 * Return value: 0 => nothing happened, 1 => monster ate something,
2701 * 2 => monster died (it must have grown into a genocided form, but
2702 * that can't happen at present because nothing which eats objects
2703 * has young and old forms).
2706 meatlithic(mtmp)
2707 register struct monst *mtmp;
2709 register struct obj *otmp;
2710 struct permonst *ptr;
2711 int poly, grow, heal, mstone;
2713 /* If a pet, eating is handled separately, in dog.c */
2714 if (mtmp->mtame) return 0;
2716 /* Eats topmost lithic object if it is there */
2717 for (otmp = level.objects[mtmp->mx][mtmp->my];
2718 otmp; otmp = otmp->nexthere) {
2720 if (otmp->oerodeproof) continue; /* change by Amy - erosionproof items can't be eaten */
2721 if (is_lithic(otmp) && !obj_resists(otmp, 5, 95) &&
2722 touch_artifact(otmp,mtmp)) {
2723 if (otmp->otyp != AMULET_OF_STRANGULATION &&
2724 otmp->otyp != RIN_SLOW_DIGESTION && otmp->otyp != RIN_INDIGESTION) {
2725 if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
2726 pline("%s eats %s!", Monnam(mtmp),
2727 distant_name(otmp,doname));
2728 else if (flags.soundok && flags.verbose) {
2729 You_hear("a grating sound.");
2730 if (PlayerHearsSoundEffects) pline(issoviet ? "Luchshe nadeyat'sya, chto etot punkt kamennyy ne bylo chem-to vazhnym, potomu chto teper' poteryana navsegda." : "Wuoeing!");
2732 u.cnd_moneatstone++;
2733 mtmp->meating = otmp->owt/2 + 1;
2734 if (mtmp->meating > 10) mtmp->meating = 10; /* arbitrary --Amy */
2735 /* Heal up to the object's weight in hp */
2736 if (mtmp->mhp < mtmp->mhpmax) {
2737 mtmp->mhp += objects[otmp->otyp].oc_weight;
2738 if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
2741 if (otmp->otyp == MEDICAL_KIT)
2742 delete_contents(otmp);
2743 if (Has_contents(otmp)) {
2744 register struct obj *otmp3;
2745 while ((otmp3 = otmp->cobj) != 0) {
2746 obj_extract_self(otmp3);
2747 if ( (otmp->otyp == ICE_BOX || otmp->otyp == DISPERSION_BOX || otmp->otyp == ICE_BOX_OF_HOLDING || otmp->otyp == ICE_BOX_OF_WATERPROOFING || otmp->otyp == ICE_BOX_OF_DIGESTION) && otmp3->otyp == CORPSE) {
2748 otmp3->icedobject = TRUE;
2749 otmp3->age = monstermoves - otmp3->age;
2750 start_corpse_timeout(otmp3);
2752 (void) mpickobj(mtmp, otmp3, FALSE);
2756 if(otmp == uball) {
2757 unpunish();
2758 delobj(otmp);
2759 } else if (otmp == uchain) {
2760 unpunish(); /* frees uchain */
2761 } else {
2762 poly = polyfodder(otmp);
2763 grow = mlevelgain(otmp);
2764 heal = mhealup(otmp);
2765 mstone = mstoning(otmp);
2766 delobj(otmp);
2767 ptr = mtmp->data;
2768 if (poly) {
2769 if (mon_spec_poly(mtmp,
2770 (struct permonst *)0, 0L, FALSE,
2771 cansee(mtmp->mx,mtmp->my) && flags.verbose,
2772 FALSE, FALSE))
2773 ptr = mtmp->data;
2774 } else if (grow) {
2775 ptr = grow_up(mtmp, (struct monst *)0);
2776 } else if (mstone && !rn2(4) ) {
2777 if (poly_when_stoned(ptr)) {
2778 mon_to_stone(mtmp);
2779 ptr = mtmp->data;
2780 } else if (!resists_ston(mtmp)) {
2781 if (canseemon(mtmp))
2782 pline("%s turns to stone!", Monnam(mtmp));
2783 monstone(mtmp);
2784 ptr = (struct permonst *)0;
2786 } else if (heal) {
2787 mtmp->mhp = mtmp->mhpmax;
2789 if (!ptr) return 2; /* it died */
2791 newsym(mtmp->mx, mtmp->my);
2792 return 1;
2796 return 0;
2799 /* function for eater trap effect, allivore etc.; this can eat even erosionproof items (not a bug) --Amy */
2801 meatanything(mtmp)
2802 register struct monst *mtmp;
2804 register struct obj *otmp;
2805 struct permonst *ptr;
2806 int poly, grow, heal, mstone;
2808 /* If a pet, eating is handled separately, in dog.c */
2809 if (mtmp->mtame) return 0;
2811 /* Eats topmost object if it is there */
2812 for (otmp = level.objects[mtmp->mx][mtmp->my];
2813 otmp; otmp = otmp->nexthere) {
2814 if (!obj_resists(otmp, 5, 95) &&
2815 touch_artifact(otmp,mtmp)) {
2816 if (otmp->otyp != AMULET_OF_STRANGULATION &&
2817 otmp->otyp != RIN_SLOW_DIGESTION && otmp->otyp != RIN_INDIGESTION) {
2818 if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
2819 pline("%s eats %s!", Monnam(mtmp),
2820 distant_name(otmp,doname));
2821 else if (flags.soundok && flags.verbose) {
2822 You_hear("a chewing sound.");
2823 if (PlayerHearsSoundEffects) pline(issoviet ? "Ochen' tsennyy element metalla tol'ko chto poyel i vy budete pinat' sebya, yesli ya skazhu vam, chto eto bylo." : "Gruum!");
2825 u.cnd_moneatall++;
2826 mtmp->meating = otmp->owt/2 + 1;
2827 if (mtmp->meating > 10) mtmp->meating = 10; /* arbitrary --Amy */
2828 /* Heal up to the object's weight in hp */
2829 if (mtmp->mhp < mtmp->mhpmax) {
2830 mtmp->mhp += objects[otmp->otyp].oc_weight;
2831 if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
2834 if (otmp->otyp == MEDICAL_KIT)
2835 delete_contents(otmp);
2836 if (Has_contents(otmp)) {
2837 register struct obj *otmp3;
2838 while ((otmp3 = otmp->cobj) != 0) {
2839 obj_extract_self(otmp3);
2840 if ( (otmp->otyp == ICE_BOX || otmp->otyp == DISPERSION_BOX || otmp->otyp == ICE_BOX_OF_HOLDING || otmp->otyp == ICE_BOX_OF_WATERPROOFING || otmp->otyp == ICE_BOX_OF_DIGESTION) && otmp3->otyp == CORPSE) {
2841 otmp3->icedobject = TRUE;
2842 otmp3->age = monstermoves - otmp3->age;
2843 start_corpse_timeout(otmp3);
2845 (void) mpickobj(mtmp, otmp3, FALSE);
2849 if(otmp == uball) {
2850 unpunish();
2851 delobj(otmp);
2852 } else if (otmp == uchain) {
2853 unpunish(); /* frees uchain */
2854 } else {
2855 poly = polyfodder(otmp);
2856 grow = mlevelgain(otmp);
2857 heal = mhealup(otmp);
2858 mstone = mstoning(otmp);
2859 delobj(otmp);
2860 ptr = mtmp->data;
2861 if (poly) {
2862 if (mon_spec_poly(mtmp,
2863 (struct permonst *)0, 0L, FALSE,
2864 cansee(mtmp->mx,mtmp->my) && flags.verbose,
2865 FALSE, FALSE))
2866 ptr = mtmp->data;
2867 } else if (grow) {
2868 ptr = grow_up(mtmp, (struct monst *)0);
2869 } else if (mstone && !rn2(4) ) {
2870 if (poly_when_stoned(ptr)) {
2871 mon_to_stone(mtmp);
2872 ptr = mtmp->data;
2873 } else if (!resists_ston(mtmp)) {
2874 if (canseemon(mtmp))
2875 pline("%s turns to stone!", Monnam(mtmp));
2876 monstone(mtmp);
2877 ptr = (struct permonst *)0;
2879 } else if (heal) {
2880 mtmp->mhp = mtmp->mhpmax;
2882 if (!ptr) return 2; /* it died */
2884 newsym(mtmp->mx, mtmp->my);
2885 return 1;
2889 return 0;
2892 void
2893 meatcorpse(mtmp)
2894 register struct monst *mtmp;
2896 register struct obj *otmp, *otmpB;
2898 /* If a pet, eating is handled separately, in dog.c */
2899 if (mtmp->mtame) return;
2901 /* Eats topmost corpse if it is there */
2902 for (otmp = level.objects[mtmp->mx][mtmp->my];
2903 otmp; otmp = otmp->nexthere)
2904 if (otmp->otyp == CORPSE &&
2905 otmp->age+50 <= monstermoves) {
2906 if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
2907 pline("%s eats %s!", Monnam(mtmp),
2908 distant_name(otmp,doname));
2909 else if (flags.soundok && flags.verbose) {
2910 You(FunnyHallu ? "hear an alien's noises!" : "hear an awful gobbling noise!");
2911 if (PlayerHearsSoundEffects) pline(issoviet ? "Vy boites' ne meneye, vy malen'kiy rebenok? Postaraytes', chtoby ne ispachkat' sebya, kha-kha!" : "Kwololololo lololololo!");
2913 mtmp->meating = 2;
2915 if (otmp->otyp == MEDICAL_KIT)
2916 delete_contents(otmp);
2917 if (Has_contents(otmp)) {
2918 register struct obj *otmp3;
2919 while ((otmp3 = otmp->cobj) != 0) {
2920 obj_extract_self(otmp3);
2921 if ( (otmp->otyp == ICE_BOX || otmp->otyp == DISPERSION_BOX || otmp->otyp == ICE_BOX_OF_HOLDING || otmp->otyp == ICE_BOX_OF_WATERPROOFING || otmp->otyp == ICE_BOX_OF_DIGESTION) && otmp3->otyp == CORPSE) {
2922 otmp3->icedobject = TRUE;
2923 otmp3->age = monstermoves - otmp3->age;
2924 start_corpse_timeout(otmp3);
2926 (void) mpickobj(mtmp, otmp3, FALSE);
2930 delobj(otmp);
2932 if (mtmp->data == &mons[PM_CORPULENT_DOG] || mtmp->data == &mons[PM_THICK_POTATO] || mtmp->data == &mons[PM_BLACK_MUZZLE] || mtmp->data == &mons[PM_CORPSE_SPITTER] || mtmp->data == &mons[PM_MUZZLE_FIEND] || mtmp->data == &mons[PM_MAW_FIEND] || mtmp->data == &mons[PM_ROCKET_MUZZLE]) {
2934 otmpB = mksobj(ROCKET, TRUE, FALSE, FALSE);
2935 if (otmpB) {
2936 otmpB->quan = 1;
2937 otmpB->owt = weight(otmpB);
2938 (void) mpickobj(mtmp, otmpB, FALSE);
2942 if (mtmp->data == &mons[PM_SPIT_DEMON]) {
2944 otmpB = mksobj(ROCK, TRUE, FALSE, FALSE);
2945 if (otmpB) {
2946 otmpB->quan = 5;
2947 otmpB->owt = weight(otmpB);
2948 (void) mpickobj(mtmp, otmpB, FALSE);
2955 break; /* only eat one at a time... */
2957 newsym(mtmp->mx, mtmp->my);
2961 meatobj(mtmp) /* for gelatinous cubes */
2962 register struct monst *mtmp;
2964 register struct obj *otmp, *otmp2;
2965 struct permonst *ptr;
2966 int poly, grow, heal, count = 0, ecount = 0;
2967 char buf[BUFSZ];
2969 buf[0] = '\0';
2970 /* If a pet, eating is handled separately, in dog.c */
2971 if (mtmp->mtame) return 0;
2973 /* Eats organic objects, including cloth and wood, if there */
2974 /* Engulfs others, except huge rocks and metal attached to player */
2975 for (otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp = otmp2) {
2976 otmp2 = otmp->nexthere;
2977 if (is_organic(otmp) && !obj_resists(otmp, 5, 95) &&
2978 touch_artifact(otmp,mtmp)) {
2979 if (otmp->oerodeproof) continue; /* change by Amy - erosionproof items can't be eaten */
2980 if (otmp->otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) &&
2981 !resists_ston(mtmp))
2982 continue;
2983 if (otmp->otyp == AMULET_OF_STRANGULATION ||
2984 otmp->otyp == RIN_SLOW_DIGESTION && otmp->otyp != RIN_INDIGESTION)
2985 continue;
2986 ++count;
2987 if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
2988 pline("%s eats %s!", Monnam(mtmp),
2989 distant_name(otmp, doname));
2990 else if (flags.soundok && flags.verbose) {
2991 You_hear("a slurping sound.");
2992 if (PlayerHearsSoundEffects) pline(issoviet ? "Skoreye vsego, eto bylo chto-to, chto vy, vozmozhno, khoteli ispol'zovat', ili, mozhet byt', dazhe vash taynik! Razve eto ne veselo?" : "Chllp!");
2994 u.cnd_moneatorganic++;
2995 /* Heal up to the object's weight in hp */
2996 if (mtmp->mhp < mtmp->mhpmax) {
2997 mtmp->mhp += objects[otmp->otyp].oc_weight;
2998 if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = mtmp->mhpmax;
3000 if (otmp->otyp == MEDICAL_KIT)
3001 delete_contents(otmp);
3002 if (Has_contents(otmp)) {
3003 register struct obj *otmp3;
3004 /* contents of eaten containers become engulfed; this
3005 is arbitrary, but otherwise g.cubes are too powerful */
3006 while ((otmp3 = otmp->cobj) != 0) {
3007 obj_extract_self(otmp3);
3008 if ( (otmp->otyp == ICE_BOX || otmp->otyp == DISPERSION_BOX || otmp->otyp == ICE_BOX_OF_HOLDING || otmp->otyp == ICE_BOX_OF_WATERPROOFING || otmp->otyp == ICE_BOX_OF_DIGESTION) && otmp3->otyp == CORPSE) {
3009 otmp3->icedobject = TRUE;
3010 otmp3->age = monstermoves - otmp3->age;
3011 start_corpse_timeout(otmp3);
3013 (void) mpickobj(mtmp, otmp3, FALSE);
3016 poly = polyfodder(otmp);
3017 grow = mlevelgain(otmp);
3018 heal = mhealup(otmp);
3020 if(otmp == uball) {
3021 unpunish();
3022 delobj(otmp);
3023 } else if (otmp == uchain) {
3024 unpunish(); /* frees uchain */
3025 } else {
3026 delobj(otmp); /* munch */
3029 ptr = mtmp->data;
3030 if (poly) {
3031 if (mon_spec_poly(mtmp, (struct permonst *)0, 0L, FALSE,
3032 cansee(mtmp->mx,mtmp->my) && flags.verbose,
3033 FALSE, FALSE))
3034 ptr = mtmp->data;
3035 } else if (grow) {
3036 ptr = grow_up(mtmp, (struct monst *)0);
3037 } else if (heal) {
3038 mtmp->mhp = mtmp->mhpmax;
3040 /* in case it polymorphed or died */
3041 if (ptr != &mons[PM_GELATINOUS_CUBE])
3042 return !ptr ? 2 : 1;
3043 } else if (otmp->oclass != ROCK_CLASS &&
3044 otmp != uball && otmp != uchain) {
3045 ++ecount;
3046 if (ecount == 1) {
3047 sprintf(buf, "%s engulfs %s.", Monnam(mtmp),
3048 distant_name(otmp,doname));
3049 } else if (ecount == 2)
3050 sprintf(buf, "%s engulfs several objects.", Monnam(mtmp));
3051 obj_extract_self(otmp);
3052 (void) mpickobj(mtmp, otmp, FALSE); /* slurp */
3054 /* Engulf & devour is instant, so don't set meating */
3055 if (mtmp->minvis) newsym(mtmp->mx, mtmp->my);
3057 if (ecount > 0) {
3058 if (cansee(mtmp->mx, mtmp->my) && flags.verbose && buf[0])
3059 pline("%s", buf);
3060 else if (flags.soundok && flags.verbose) {
3061 You_hear("%s slurping sound%s.",
3062 ecount == 1 ? "a" : "several",
3063 ecount == 1 ? "" : "s");
3064 if (PlayerHearsSoundEffects) pline(issoviet ? "Skoreye vsego, eto bylo chto-to, chto vy, vozmozhno, khoteli ispol'zovat', ili, mozhet byt', dazhe vash taynik! Razve eto ne veselo?" : "Chllp!");
3067 return ((count > 0) || (ecount > 0)) ? 1 : 0;
3070 void
3071 mpickgold(mtmp)
3072 register struct monst *mtmp;
3074 register struct obj *gold;
3075 int mat_idx;
3077 if (DEADMONSTER(mtmp)) return; /* hopefully prevent stupid bugs --Amy */
3079 if ((gold = g_at(mtmp->mx, mtmp->my)) != 0) {
3081 /* Amy edit: pets shouldn't be able to simply pick up the 10k you used for credit cloning, you lame ass... */
3082 int dogquan = 5 * mtmp->m_lev; /* halved by Amy, see also dogmove.c */
3083 if (gold && gold->quan < dogquan) dogquan = gold->quan;
3085 mat_idx = objects[gold->otyp].oc_material;
3087 if (uchain && (gold == uchain) ) return;
3088 if (uchain && (gold == uball) ) return;
3090 #ifndef GOLDOBJ
3091 if (mtmp->mtame && dogquan < gold->quan) {
3092 gold->quan -= dogquan;
3093 gold->owt = weight(gold);
3094 mtmp->mgold += dogquan;
3095 } else {
3096 mtmp->mgold += gold->quan;
3097 delobj(gold);
3099 #else
3100 obj_extract_self(gold);
3101 add_to_minv(mtmp, gold);
3102 #endif
3103 if (cansee(mtmp->mx, mtmp->my) ) {
3104 if (flags.verbose && !mtmp->isgd)
3105 pline("%s picks up some %s.", Monnam(mtmp),
3106 mat_idx == MT_GOLD ? "gold" : "money");
3107 newsym(mtmp->mx, mtmp->my);
3111 #endif /* OVLB */
3112 #ifdef OVL2
3114 boolean
3115 mpickstuff(mtmp, str)
3116 register struct monst *mtmp;
3117 register const char *str;
3119 register struct obj *otmp, *otmp2;
3121 int dogquan = 5 * mtmp->m_lev; /* halved by Amy, see also dogmove.c */
3123 if (DEADMONSTER(mtmp)) return FALSE; /* hopefully prevent stupid bugs --Amy */
3125 /* prevent shopkeepers from leaving the door of their shop */
3126 if(mtmp->isshk && inhishop(mtmp)) return FALSE;
3128 for(otmp = level.objects[mtmp->mx][mtmp->my]; otmp; otmp = otmp2) {
3129 otmp2 = otmp->nexthere;
3130 /* Nymphs take everything. Most monsters don't pick up corpses. */
3131 if (!str ? searches_for_item(mtmp,otmp) :
3132 !!(index(str, otmp->oclass))) {
3133 if (otmp->otyp == CORPSE && mtmp->data->mlet != S_NYMPH && mtmp->data != &mons[PM_GOLDEN_KNIGHT] && mtmp->data != &mons[PM_GOLDEN_HOLY_KNIGHT] && mtmp->data != &mons[PM_URCAGUARY] &&
3134 /* let a handful of corpse types thru to can_carry() */
3135 !touch_petrifies(&mons[otmp->corpsenm]) &&
3136 otmp->corpsenm != PM_LIZARD &&
3137 otmp->corpsenm != PM_CAVE_LIZARD &&
3138 otmp->corpsenm != PM_PREHISTORIC_CAVE_LIZARD &&
3139 otmp->corpsenm != PM_CHAOS_LIZARD &&
3140 otmp->corpsenm != PM_CHAOTIC_LIZARD &&
3141 otmp->corpsenm != PM_LIZARD_OF_YENDOR &&
3142 otmp->corpsenm != PM_GRASS_LIZARD &&
3143 otmp->corpsenm != PM_PERFUSWAP_LIZARD &&
3144 otmp->corpsenm != PM_ALL_SUPPLY_LIZARD &&
3145 otmp->corpsenm != PM_TOPSIDE_LIZARD &&
3146 otmp->corpsenm != PM_DEAD_LIZARD &&
3147 otmp->corpsenm != PM_STOPWATCH_LIZARD &&
3148 otmp->corpsenm != PM_RUNE_LIZARD &&
3149 otmp->corpsenm != PM_YUNICOR_LIZARD &&
3150 otmp->corpsenm != PM_SPECTRAL_LIZARD &&
3151 otmp->corpsenm != PM_BLUE_LIZARD &&
3152 otmp->corpsenm != PM_DARKEN_LIZARD &&
3153 otmp->corpsenm != PM_SWAMP_LIZARD &&
3154 otmp->corpsenm != PM_SPITTING_LIZARD &&
3155 otmp->corpsenm != PM_LIZARD_EEL &&
3156 otmp->corpsenm != PM_INNOCLIZARD &&
3157 otmp->corpsenm != PM_FAT_LIZARD &&
3158 otmp->corpsenm != PM_LIZARD_MAN &&
3159 otmp->corpsenm != PM_LIZARD_KING &&
3160 otmp->corpsenm != PM_EEL_LIZARD &&
3161 otmp->corpsenm != PM_ANTI_STONE_LIZARD &&
3162 otmp->corpsenm != PM_HUGE_LIZARD &&
3163 otmp->corpsenm != PM_CORK_ESPADRILLE &&
3164 otmp->corpsenm != PM_PACKED_LIZARD &&
3165 otmp->corpsenm != PM_UNSILIZARD &&
3166 otmp->corpsenm != PM_SILILIZARD &&
3167 otmp->corpsenm != PM_VERY_SLOW_HUGE_LIZARD &&
3168 otmp->corpsenm != PM_ROCK_LIZARD &&
3169 otmp->corpsenm != PM_WILL_STONE_LIZARD &&
3170 otmp->corpsenm != PM_WILL_RATCH_LIZARD &&
3171 otmp->corpsenm != PM_BABY_CAVE_LIZARD &&
3172 otmp->corpsenm != PM_NIGHT_LIZARD &&
3173 otmp->corpsenm != PM_DIGGING_LIZARD &&
3174 otmp->corpsenm != PM_DIGLIZARD &&
3175 otmp->corpsenm != PM_LICHZARD &&
3176 otmp->corpsenm != PM_SKELLIZARD &&
3177 otmp->corpsenm != PM_SAND_TIDE &&
3178 otmp->corpsenm != PM_O_P_E_L &&
3179 otmp->corpsenm != PM_FBI_AGENT &&
3180 otmp->corpsenm != PM_OWN_SMOKE &&
3181 otmp->corpsenm != PM_GRANDPA &&
3182 otmp->corpsenm != PM_ELONA_LIZARD_MAN &&
3183 otmp->corpsenm != PM_TOUCAN &&
3184 otmp->corpsenm != PM_GIANT_TOUCAN &&
3185 otmp->corpsenm != PM_LIZARD_MAGE &&
3186 otmp->corpsenm != PM_BLACK_LIZARDMAN &&
3187 otmp->corpsenm != PM_ASSASSIN_LIZARD &&
3188 otmp->corpsenm != PM_DANGEROUS_ASSASSIN_LIZARD &&
3189 otmp->corpsenm != PM_PRESSLIZARD &&
3190 otmp->corpsenm != PM_STATIOLIZARD &&
3191 otmp->corpsenm != PM_GIBLIZARD &&
3192 otmp->corpsenm != PM_CASINO_LIZARD &&
3193 otmp->corpsenm != PM_BLIZZARD_LIZARD &&
3194 otmp->corpsenm != PM_HELTH_LIZARD &&
3195 otmp->corpsenm != PM_NORMAL_LIZARD &&
3196 otmp->corpsenm != PM_CLOCKBACK_LIZARD &&
3197 otmp->corpsenm != PM_ADULT_LIZARD &&
3198 otmp->corpsenm != PM_LIZZY &&
3199 otmp->corpsenm != PM_LIZARD_PRINCE &&
3200 otmp->corpsenm != PM_HIDDEN_LIZARD &&
3201 otmp->corpsenm != PM_BLACK_LIZARD &&
3202 otmp->corpsenm != PM_DEFORMED_LIZARD &&
3203 otmp->corpsenm != PM_CLINGING_LIZARD &&
3204 otmp->corpsenm != PM_MIMIC_LIZARD &&
3205 otmp->corpsenm != PM_KARMIC_LIZARD &&
3206 otmp->corpsenm != PM_GREEN_LIZARD &&
3207 otmp->corpsenm != PM_SCORZARD &&
3208 otmp->corpsenm != PM_MONSTER_LIZARD &&
3209 otmp->corpsenm != PM_ICE_LIZARD &&
3210 otmp->corpsenm != PM_FIRE_LIZARD &&
3211 otmp->corpsenm != PM_LIGHTNING_LIZARD &&
3212 otmp->corpsenm != PM_GIANT_LIZARD &&
3213 !acidic(&mons[otmp->corpsenm])) continue;
3215 /* Giants used to pluck the statues off of statue traps, rendering the traps inoperative!
3216 * I'm just going to ban monsters from picking up statues, that oughta fix it. --Amy
3217 * also they shouldn't pick up certain items from special rooms */
3218 if (otmp->otyp == STATUE) continue;
3219 if (otmp->otyp == SWITCHER) continue;
3220 if (otmp->otyp == BITCHER) continue;
3221 if (otmp->otyp == POTATO_BAG) continue;
3222 if (otmp->otyp == CHARGER) continue;
3223 if (otmp->otyp == SYMBIOTE) continue;
3224 if (otmp->otyp == UGH_MEMORY_TO_CREATE_INVENTORY) continue;
3225 if (!touch_artifact(otmp,mtmp)) continue;
3226 if (!can_carry(mtmp,otmp)) continue;
3227 if (is_waterypool(mtmp->mx,mtmp->my)) continue;
3228 if (is_watertunnel(mtmp->mx,mtmp->my)) continue;
3229 if ((otmp->oinvis && !perceives(mtmp->data) || otmp->oinvisreal) ) continue;
3231 /* disallow pets to simply pick up a huge amount of gold, because credit cloning is OP --Amy */
3232 if (mtmp->mtame && otmp && (otmp->oclass == COIN_CLASS)) {
3233 if (otmp->quan < dogquan) dogquan = otmp->quan;
3234 if (dogquan < otmp->quan) {
3235 otmp->quan -= dogquan;
3236 otmp->owt = weight(otmp);
3237 mtmp->mgold += dogquan;
3238 if (cansee(mtmp->mx, mtmp->my) ) {
3239 if (flags.verbose && !mtmp->isgd)
3240 pline("%s picks up some gold.", Monnam(mtmp));
3241 newsym(mtmp->mx, mtmp->my);
3243 return TRUE;
3247 if (cansee(mtmp->mx,mtmp->my) && flags.verbose)
3248 pline("%s picks up %s.", Monnam(mtmp),
3249 (distu(mtmp->mx, mtmp->my) <= 5) ?
3250 doname(otmp) : distant_name(otmp, doname));
3251 obj_extract_self(otmp);
3252 /* unblock point after extract, before pickup */
3253 if (otmp->otyp == BOULDER)
3254 unblock_point(otmp->ox,otmp->oy); /* vision */
3255 (void) mpickobj(mtmp, otmp, FALSE); /* may merge and free otmp */
3256 m_dowear(mtmp, FALSE);
3257 newsym(mtmp->mx, mtmp->my);
3258 return TRUE; /* pick only one object */
3261 return FALSE;
3264 #endif /* OVL2 */
3265 #ifdef OVL0
3268 curr_mon_load(mtmp)
3269 register struct monst *mtmp;
3271 register int curload = 0;
3272 register struct obj *obj;
3274 for(obj = mtmp->minvent; obj; obj = obj->nobj) {
3275 if(obj->otyp != BOULDER || !throws_rocks(mtmp->data))
3276 curload += obj->owt;
3279 return curload;
3283 max_mon_load(mtmp)
3284 register struct monst *mtmp;
3286 register long maxload;
3288 /* Base monster carrying capacity is equal to human maximum
3289 * carrying capacity, or half human maximum if not strong.
3290 * (for a polymorphed player, the value used would be the
3291 * non-polymorphed carrying capacity instead of max/half max).
3292 * This is then modified by the ratio between the monster weights
3293 * and human weights. Corpseless monsters are given a capacity
3294 * proportional to their size instead of weight.
3296 if (!mtmp->data->cwt)
3297 maxload = (5000 * (long)mtmp->data->msize) / MZ_HUMAN;
3298 else if (!strongmonst(mtmp->data)
3299 || (strongmonst(mtmp->data) && (mtmp->data->cwt > WT_HUMAN)))
3300 maxload = (5000 * (long)mtmp->data->cwt) / WT_HUMAN;
3301 else maxload = 5000; /*strong monsters w/cwt <= WT_HUMAN*/
3303 if (!strongmonst(mtmp->data)) maxload /= 2;
3305 if (maxload < 200) maxload = 200;
3307 return (int) maxload;
3310 /* for restricting monsters' object-pickup */
3311 boolean
3312 can_carry(mtmp,otmp)
3313 struct monst *mtmp;
3314 struct obj *otmp;
3316 int otyp = otmp->otyp, newload = otmp->owt;
3317 struct permonst *mdat = mtmp->data;
3319 if (notake(mdat)) return FALSE; /* can't carry anything */
3321 if (otyp == CORPSE && touch_petrifies(&mons[otmp->corpsenm]) &&
3322 !(mtmp->misc_worn_check & W_ARMG) && !resists_ston(mtmp))
3323 return FALSE;
3324 if (otyp == CORPSE && is_rider(&mons[otmp->corpsenm]))
3325 return FALSE;
3326 if (otyp == CORPSE && is_deadlysin(&mons[otmp->corpsenm]))
3327 return FALSE;
3328 if (objects[otyp].oc_material == MT_SILVER && issoviet && hates_silver(mdat) &&
3329 (otyp != BELL_OF_OPENING || !is_covetous(mdat)))
3330 return FALSE;
3332 /* Steeds don't pick up stuff (to avoid shop abuse) */
3333 if (mtmp == u.usteed) return (FALSE);
3334 if (mtmp->isshk) return(TRUE); /* no limit */
3335 if (mtmp->mpeaceful && !mtmp->mtame) return(FALSE);
3336 /* otherwise players might find themselves obligated to violate
3337 * their alignment if the monster takes something they need
3340 /* special--boulder throwers carry unlimited amounts of boulders */
3341 if (throws_rocks(mdat) && otyp == BOULDER)
3342 return(TRUE);
3344 if (mdat == &mons[PM_GOLDEN_KNIGHT])
3345 return (boolean)(otmp->oclass != ROCK_CLASS);
3346 if (mdat == &mons[PM_GOLDEN_HOLY_KNIGHT])
3347 return (boolean)(otmp->oclass != ROCK_CLASS);
3348 if (mdat == &mons[PM_URCAGUARY])
3349 return (boolean)(otmp->oclass != ROCK_CLASS);
3351 /* nymphs deal in stolen merchandise, but not boulders or statues */
3352 if (mdat->mlet == S_NYMPH)
3353 return (boolean)(otmp->oclass != ROCK_CLASS);
3355 if (curr_mon_load(mtmp) + newload > max_mon_load(mtmp)) return FALSE;
3357 /* if the monster hates silver, don't pick it up */
3358 /* Amy edit: that's stupid. they only hate being hit by silver objects, but can handle them just fine! */
3359 /* In Soviet Russia, monsters aren't supposed to be dangerous. Instead, they're burdened by silly restrictions that
3360 * prevent them from being able to use items that would be perfectly fine for them to use. */
3361 if (objects[otmp->otyp].oc_material == MT_SILVER && issoviet && hates_silver(mtmp->data))
3362 return(FALSE);
3364 if(curr_mon_load(mtmp) + newload > max_mon_load(mtmp)) return(FALSE);
3366 return(TRUE);
3369 /* return number of acceptable neighbour positions */
3371 mfndpos(mon, poss, info, flag)
3372 register struct monst *mon;
3373 coord *poss; /* coord poss[9] */
3374 long *info; /* long info[9] */
3375 long flag;
3377 struct permonst *mdat = mon->data;
3378 register xchar x,y,nx,ny;
3379 register int cnt = 0;
3380 register uchar ntyp;
3381 uchar nowtyp;
3382 boolean wantpool,poolok,wantlava,lavaok,nodiag;
3383 boolean rockok = FALSE, treeok = FALSE, thrudoor;
3384 int maxx, maxy;
3386 x = mon->mx;
3387 y = mon->my;
3388 nowtyp = levl[x][y].typ;
3390 nodiag = (isgridbug(mdat) || (uwep && uwep->oartifact == ART_EGRID_BUG && mon->data->mlet == S_XAN) || (uarmf && !rn2(10) && itemhasappearance(uarmf, APP_CHESS_BOOTS) ) );
3391 wantpool = mdat->mlet == S_EEL || mdat->mlet == S_FLYFISH || mdat == &mons[PM_HUMAN_WEREPIRANHA] || mdat == &mons[PM_HUMAN_WEREEEL] || mdat == &mons[PM_HUMAN_WEREKRAKEN] || mdat == &mons[PM_HUMAN_WEREFLYFISH] || mdat == &mons[PM_CONCORDE__] || mdat == &mons[PM_SWIMMER_TROLL] || mdat == &mons[PM_MISTER_SUBMARINE] || mdat == &mons[PM_WATERCAR] || mdat == &mons[PM_EEL_GOLEM] || mdat == &mons[PM_WATER_TURRET] || mdat == &mons[PM_AQUA_TURRET] || mdat == &mons[PM_DIVER_TROLL] || mdat == &mons[PM_PUNT] || mdat == &mons[PM_LASER_SHARCHON] || mdat == &mons[PM_WATER_FLEA] || mdat == &mons[PM_HAMM_WATER_FLEA] || mdat == &mons[PM_LUXURY_YACHT] || mdat == &mons[PM_SUBMARINE_GOBLIN] ;
3392 poolok = (is_flyer(mdat) || mon->egotype_flying || is_clinger(mdat) || mon->egotype_watersplasher ||
3393 (is_swimmer(mdat) && !wantpool)) && !(mdat->mlet == S_FLYFISH || mdat == &mons[PM_HUMAN_WEREFLYFISH] || mdat == &mons[PM_CONCORDE__]);
3394 wantlava = (mdat->mlet == S_FLYFISH || mdat == &mons[PM_HUMAN_WEREFLYFISH] || mdat == &mons[PM_CONCORDE__]);
3395 lavaok = is_flyer(mdat) || mon->egotype_flying || is_clinger(mdat) || (likes_lava(mdat) && !wantlava);
3396 thrudoor = ((flag & (ALLOW_WALL|BUSTDOOR)) != 0L);
3397 treeok = (is_flyer(mdat) || mon->egotype_flying || (mon->data == &mons[PM_GIANT_TREE_SPIDER]) || (mon->data == &mons[PM_POISONOUS_TREE_FROG]) || (mon->data->msound == MS_TREESQUAD));
3398 /* flying monsters, but not flying players, can pass over trees; the tree squad can too --Amy */
3399 if (flag & ALLOW_DIG) {
3400 struct obj *mw_tmp;
3402 /* need to be specific about what can currently be dug */
3403 if (!needspick(mdat)) {
3404 rockok = treeok = TRUE;
3405 } else if ((mw_tmp = MON_WEP(mon)) && mw_tmp && mw_tmp->cursed &&
3406 mon->weapon_check == NO_WEAPON_WANTED) {
3407 rockok = is_pick(mw_tmp);
3408 } else {
3409 rockok = (m_carrying(mon, PICK_AXE) || m_carrying(mon, CONGLOMERATE_PICK) || m_carrying(mon, UNWIELDY_PICK) || m_carrying(mon, CONUNDRUM_PICK) || m_carrying(mon, SHOVEL) || m_carrying(mon, MYSTERY_PICK) || m_carrying(mon, BRONZE_PICK) || m_carrying(mon, BRICK_PICK) || m_carrying(mon, MYSTERIOUS_PICK) || m_carrying(mon, NANO_PICK) ||
3410 (m_carrying(mon, DWARVISH_MATTOCK) &&
3411 !which_armor(mon, W_ARMS)) ||
3412 (m_carrying(mon, SOFT_MATTOCK) &&
3413 !which_armor(mon, W_ARMS)) ||
3414 (m_carrying(mon, ETERNIUM_MATTOCK) &&
3415 !which_armor(mon, W_ARMS)) );
3416 treeok = (m_carrying(mon, AXE) || m_carrying(mon, OBSIDIAN_AXE) || m_carrying(mon, SPIRIT_AXE) || m_carrying(mon, SHARP_AXE) || m_carrying(mon, QUALITY_AXE) || m_carrying(mon, DISKOS) || m_carrying(mon, TOMAHAWK) || m_carrying(mon, INFERNAL_AXE) || m_carrying(mon, NANO_AXE) || m_carrying(mon, TUBING_PLIERS) ||
3417 (m_carrying(mon, BATTLE_AXE) &&
3418 !which_armor(mon, W_ARMS)) ||
3419 (m_carrying(mon, MOON_AXE) &&
3420 !which_armor(mon, W_ARMS)) ||
3421 (m_carrying(mon, CHEMISTRY_SPACE_AXE) &&
3422 !which_armor(mon, W_ARMS)) ||
3423 (m_carrying(mon, QUATTUORST_AXE) &&
3424 !which_armor(mon, W_ARMS)) ||
3425 (m_carrying(mon, GROM_AXE) &&
3426 !which_armor(mon, W_ARMS)) ||
3427 (m_carrying(mon, DWARVISH_BATTLE_AXE) &&
3428 !which_armor(mon, W_ARMS)));
3430 thrudoor |= rockok || treeok;
3432 if (is_flyer(mdat) || mon->egotype_flying || (mon->data->msound == MS_TREESQUAD) ) treeok = TRUE; /* fail safe */
3434 nexttry: /* eels prefer the water, but if there is no water nearby,
3435 they will crawl over land */
3436 if(mon->mconf) {
3438 /* Amy edit: petkeeping will now make it less likely for your confused pet to lash out at other pets */
3440 if (mon->mtame && !PlayerCannotUseSkills) {
3441 boolean willbeconfused = TRUE;
3442 switch (P_SKILL(P_PETKEEPING)) {
3443 default: willbeconfused = TRUE; break;
3444 case P_BASIC: if (!rn2(5)) willbeconfused = FALSE; break;
3445 case P_SKILLED: if (rnd(5) > 3) willbeconfused = FALSE; break;
3446 case P_EXPERT: if (rnd(5) > 2) willbeconfused = FALSE; break;
3447 case P_MASTER: if (rn2(5)) willbeconfused = FALSE; break;
3448 case P_GRAND_MASTER: if (rn2(10)) willbeconfused = FALSE; break;
3449 case P_SUPREME_MASTER: if (rn2(10)) willbeconfused = FALSE; break;
3452 if (willbeconfused) {
3453 flag |= ALLOW_ALL;
3454 flag &= ~NOTONL;
3456 } else {
3457 flag |= ALLOW_ALL;
3458 flag &= ~NOTONL;
3461 if(!mon->mcansee)
3462 flag |= ALLOW_SSM;
3463 maxx = min(x+1,COLNO-1);
3464 maxy = min(y+1,ROWNO-1);
3465 for(nx = max(1,x-1); nx <= maxx; nx++)
3466 for(ny = max(0,y-1); ny <= maxy; ny++) {
3467 if(nx == x && ny == y) continue;
3468 if(IS_ROCK(ntyp = levl[nx][ny].typ) && ntyp != FARMLAND && !(ntyp == GRAVEWALL && tunnels(mdat)) &&
3469 !(ntyp == TUNNELWALL && !is_flyer(mdat) && !is_floater(mdat) && !(mon->egotype_flying)) &&
3470 !(ntyp == MOUNTAIN && (is_flyer(mdat) || is_floater(mdat) || (mon->data == &mons[PM_MOUNTAIN_SPIDER]) || (mon->egotype_flying))) &&
3471 !((flag & ALLOW_WALL) && may_passwall(nx,ny)) &&
3472 !((IS_TREE(ntyp) ? treeok : rockok) && may_dig(nx,ny))) continue;
3473 /* KMH -- Added iron bars */
3474 if (ntyp == IRONBARS && !(flag & ALLOW_BARS)) continue;
3475 /* ALI -- Artifact doors (no passage unless open/openable) */
3476 if (IS_DOOR(ntyp) && (rn2( (!nolimbs(mdat) && !slithy(mdat) && mdat->msize >= MZ_HUMAN ) ? 50 : 200) || artifact_door(nx, ny) ) ) /* let's allow monsters to bypass locked doors sometimes. --Amy */
3477 /* with evil patch idea by jonadab that allows human-or-larger-sized monsters with legs to break them more easily */
3479 if (artifact_door(nx, ny) ?
3480 (levl[nx][ny].doormask & D_CLOSED) && !(flag & OPENDOOR)
3481 || levl[nx][ny].doormask & D_LOCKED :
3482 !amorphous(mdat) &&
3483 ((levl[nx][ny].doormask & D_CLOSED && !(flag & OPENDOOR)) ||
3484 (levl[nx][ny].doormask & D_LOCKED && !(flag & UNLOCKDOOR))) &&
3485 !thrudoor) continue;
3486 if(nx != x && ny != y && (nodiag ||
3487 #ifdef REINCARNATION
3488 ((IS_DOOR(nowtyp) &&
3489 ((levl[x][y].doormask & ~D_BROKEN) || Is_rogue_level(&u.uz))) ||
3490 (IS_DOOR(ntyp) &&
3491 ((levl[nx][ny].doormask & ~D_BROKEN) || Is_rogue_level(&u.uz))))
3492 #else
3493 ((IS_DOOR(nowtyp) && (levl[x][y].doormask & ~D_BROKEN)) ||
3494 (IS_DOOR(ntyp) && (levl[nx][ny].doormask & ~D_BROKEN)))
3495 #endif
3497 continue;
3498 /*if((is_pool(nx,ny) == wantpool || is_lava(nx,ny) == wantlava || poolok) &&
3499 ( lavaok || wantlava || !is_lava(nx,ny))) {*/
3501 if(( ( ( (is_waterypool(nx,ny) && !(is_crystalwater(nx,ny))) || is_watertunnel(nx,ny)) == wantpool) ||
3502 (is_crystalwater(nx,ny) && wantpool) ||
3503 ((is_moorland(nx,ny)) || (is_urinelake(nx,ny)) && rn2(2)) ||
3504 (is_shiftingsand(nx,ny) && wantpool) ||
3505 (is_lava(nx,ny) && wantlava) || (is_styxriver(nx,ny) && wantlava) || poolok) &&
3506 (lavaok || wantlava || (!is_lava(nx,ny) ) )) {
3507 int dispx, dispy;
3508 boolean monseeu = (mon->mcansee && (!Invis || (perceives(mdat) && !(uarm && uarm->oartifact == ART_YOU_CANNOT_SEE_ME) ) || (!StrongInvis && rn2(3)) ));
3509 boolean checkobj = OBJ_AT(nx,ny);
3511 /* Displacement also displaces the Elbereth/scare monster,
3512 * as long as you are visible.
3514 if(Displaced && (StrongDisplaced || !rn2(3)) && monseeu && (mon->mux==nx) && (mon->muy==ny)) {
3515 dispx = u.ux;
3516 dispy = u.uy;
3517 } else {
3518 dispx = nx;
3519 dispy = ny;
3522 info[cnt] = 0;
3523 if ((checkobj || Displaced) && !(u.elberethcheese && (rnd(u.elberethcheese + 100) > 100) ) && onscary(dispx, dispy, mon)) {
3524 if(!(flag & ALLOW_SSM) && !rn2(3)) continue;
3525 info[cnt] |= ALLOW_SSM;
3526 if (!rn2(10) && monnear(mon, dispx, dispy) ) u.elberethcheese++;
3528 if((nx == u.ux && ny == u.uy) ||
3529 (nx == mon->mux && ny == mon->muy)) {
3530 if (nx == u.ux && ny == u.uy) {
3531 /* If it's right next to you, it found you,
3532 * displaced or no. We must set mux and muy
3533 * right now, so when we return we can tell
3534 * that the ALLOW_U means to attack _you_ and
3535 * not the image.
3537 mon->mux = u.ux;
3538 mon->muy = u.uy;
3540 if(!(flag & ALLOW_U)) continue;
3541 info[cnt] |= ALLOW_U;
3542 } else {
3543 if(MON_AT(nx, ny)) {
3544 struct monst *mtmp2 = m_at(nx, ny);
3545 long mmflag = flag | mm_aggression(mon, mtmp2);
3547 if (!(mmflag & ALLOW_M)) continue;
3548 info[cnt] |= ALLOW_M;
3549 if (mtmp2->mtame) {
3550 if (!(mmflag & ALLOW_TM)) continue;
3551 info[cnt] |= ALLOW_TM;
3554 /* Note: ALLOW_SANCT only prevents movement, not */
3555 /* attack, into a temple.
3556 * Amy edit: waaaaaaaay too uber OP if you can be completely safe in there! lame exploit abuser! */
3557 if(level.flags.has_temple &&
3558 *in_rooms(nx, ny, TEMPLE) &&
3559 !*in_rooms(x, y, TEMPLE) &&
3560 !(u.elberethcheese && (rnd(u.elberethcheese + 100) > 100) ) &&
3561 in_your_sanctuary((struct monst *)0, nx, ny)) {
3562 if(!(flag & ALLOW_SANCT) && rn2(3) && !(mon->data->geno & G_UNIQ) ) continue;
3563 info[cnt] |= ALLOW_SANCT;
3564 if (!rn2(10) && monnear(mon, nx, ny) ) u.elberethcheese++;
3567 if(checkobj && rn2(5) && !(u.elberethcheese && (rnd(u.elberethcheese + 100) > 100) ) && sobj_at(CLOVE_OF_GARLIC, nx, ny)) {
3568 if(flag & NOGARLIC) continue;
3569 info[cnt] |= NOGARLIC;
3570 if (!rn2(10) && monnear(mon, nx, ny) ) u.elberethcheese++;
3572 if(checkobj && sobj_at(BOULDER, nx, ny)) {
3573 if(!(flag & ALLOW_ROCK)) continue;
3574 info[cnt] |= ALLOW_ROCK;
3576 if (monseeu && onlineu(nx,ny)) {
3577 if(flag & NOTONL) continue;
3578 info[cnt] |= NOTONL;
3580 if (nx != x && ny != y && bad_rock(mon, x, ny)
3581 && bad_rock(mon, nx, y)
3582 && !(!mon->mpeaceful && !mon->mtame && mon->mhp < (mon->mhpmax / ((mon->data->geno & G_UNIQ) ? 2 : 3) ) )
3583 && (bigmonst(mdat) || (curr_mon_load(mon) > 5000)))
3584 continue;
3585 /* The monster avoids a particular type of trap if it's familiar
3586 * with the trap type. Pets get ALLOW_TRAPS and checking is
3587 * done in dogmove.c. In either case, "harmless" traps are
3588 * neither avoided nor marked in info[].
3590 { register struct trap *ttmp = t_at(nx, ny);
3591 if(ttmp) {
3592 if(ttmp->ttyp >= TRAPNUM || ttmp->ttyp == 0) {
3593 impossible("A monster looked at a very strange trap of type %d.", ttmp->ttyp);
3594 continue;
3596 if ((ttmp->ttyp != RUST_TRAP
3597 || mdat == &mons[PM_FLAMING_SPHERE]
3598 || mdat == &mons[PM_SUMMONED_FLAMING_SPHERE]
3599 || mdat == &mons[PM_IRON_GOLEM])
3600 && ttmp->ttyp != STATUE_TRAP
3601 && ttmp->ttyp != SHIT_TRAP
3602 && ttmp->ttyp != ANIMATION_TRAP
3603 && ttmp->ttyp != RMB_LOSS_TRAP
3604 && ttmp->ttyp != SUPERSCROLLER_TRAP
3605 && ttmp->ttyp != ACTIVE_SUPERSCROLLER_TRAP
3606 && ttmp->ttyp != SPEED_TRAP
3607 && ttmp->ttyp != MENU_TRAP
3608 && ttmp->ttyp != SWARM_TRAP
3609 && ttmp->ttyp != AUTOMATIC_SWITCHER
3611 && !(ttmp->ttyp == PARALYSIS_TRAP && FemtrapActiveKatrin && !mon->mpeaceful && !mon->mtame)
3613 && ttmp->ttyp != HEEL_TRAP
3614 && ttmp->ttyp != VULN_TRAP
3615 && ttmp->ttyp != DISPLAY_TRAP
3616 && ttmp->ttyp != SPELL_LOSS_TRAP
3617 && ttmp->ttyp != YELLOW_SPELL_TRAP
3618 && ttmp->ttyp != AUTO_DESTRUCT_TRAP
3619 && ttmp->ttyp != MEMORY_TRAP
3620 && ttmp->ttyp != INVENTORY_TRAP
3621 && ttmp->ttyp != BLACK_NG_WALL_TRAP
3622 && ttmp->ttyp != UNKNOWN_TRAP
3623 && ttmp->ttyp != TRAP_PERCENTS
3624 && ttmp->ttyp != LAVA_TRAP
3625 && ttmp->ttyp != FLOOD_TRAP
3626 && ttmp->ttyp != FREE_HAND_TRAP
3627 && ttmp->ttyp != UNIDENTIFY_TRAP
3628 && ttmp->ttyp != THIRST_TRAP
3629 && ttmp->ttyp != LUCK_TRAP
3630 && ttmp->ttyp != SHADES_OF_GREY_TRAP
3631 && ttmp->ttyp != ITEM_TELEP_TRAP
3632 && ttmp->ttyp != GRAVITY_TRAP
3633 && ttmp->ttyp != STONE_TO_FLESH_TRAP
3634 && ttmp->ttyp != QUICKSAND_TRAP
3635 && ttmp->ttyp != FAINT_TRAP
3636 && ttmp->ttyp != CURSE_TRAP
3637 && ttmp->ttyp != DIFFICULTY_TRAP
3638 && ttmp->ttyp != SOUND_TRAP
3639 && ttmp->ttyp != CASTER_TRAP
3640 && ttmp->ttyp != WEAKNESS_TRAP
3641 && ttmp->ttyp != ROT_THIRTEEN_TRAP
3642 && ttmp->ttyp != BISHOP_TRAP
3643 && ttmp->ttyp != CONFUSION_TRAP
3644 && ttmp->ttyp != NUPESELL_TRAP
3645 && ttmp->ttyp != DROP_TRAP
3646 && ttmp->ttyp != DSTW_TRAP
3647 && ttmp->ttyp != STATUS_TRAP
3648 && ttmp->ttyp != PESTILENCE_TRAP
3649 && ttmp->ttyp != FAMINE_TRAP
3650 && ttmp->ttyp != ALIGNMENT_TRAP
3651 && ttmp->ttyp != STAIRS_TRAP
3652 && ttmp->ttyp != UNINFORMATION_TRAP
3653 && ttmp->ttyp != OPTION_TRAP
3654 && ttmp->ttyp != MISCOLOR_TRAP
3655 && ttmp->ttyp != ONE_RAINBOW_TRAP
3656 && ttmp->ttyp != COLORSHIFT_TRAP
3657 && ttmp->ttyp != TOP_LINE_TRAP
3658 && ttmp->ttyp != CAPS_TRAP
3659 && ttmp->ttyp != UN_KNOWLEDGE_TRAP
3660 && ttmp->ttyp != DARKHANCE_TRAP
3661 && ttmp->ttyp != DSCHUEUEUET_TRAP
3662 && ttmp->ttyp != NOPESKILL_TRAP
3663 && ttmp->ttyp != TIMERUN_TRAP
3664 && ttmp->ttyp != SPELL_COOLDOWN_TRAP
3665 && ttmp->ttyp != TURBODULL_TRAP
3666 && ttmp->ttyp != REDDAM_TRAP
3667 && ttmp->ttyp != REDINC_TRAP
3668 && ttmp->ttyp != MULCH_TRAP
3669 && ttmp->ttyp != INACCURACY_TRAP
3670 && ttmp->ttyp != MONSTER_MULTISHOT_TRAP
3671 && ttmp->ttyp != DO_YOU_HAVE_A_PIN_TRAP
3672 && ttmp->ttyp != COSTLY_FAILURE_TRAP
3673 && ttmp->ttyp != INVENTORY_SIZE_TRAP
3674 && ttmp->ttyp != AEFDE_TRAP
3675 && ttmp->ttyp != EPVI_TRAP
3676 && ttmp->ttyp != FUCKFUCKFUCK_TRAP
3677 && ttmp->ttyp != REAL_LIE_TRAP
3678 && ttmp->ttyp != ESCAPE_PAST_TRAP
3679 && ttmp->ttyp != PETHATE_TRAP
3680 && ttmp->ttyp != PET_LASHOUT_TRAP
3681 && ttmp->ttyp != PETSTARVE_TRAP
3682 && ttmp->ttyp != PETSCREW_TRAP
3683 && ttmp->ttyp != TECH_LOSS_TRAP
3684 && ttmp->ttyp != PROOFLOSS_TRAP
3685 && ttmp->ttyp != UN_INVIS_TRAP
3686 && ttmp->ttyp != DETECTATION_TRAP
3687 && ttmp->ttyp != REALLY_BAD_TRAP
3688 && ttmp->ttyp != COVID_TRAP
3689 && ttmp->ttyp != ARTIBLAST_TRAP
3690 && ttmp->ttyp != GIANT_EXPLORER_TRAP
3691 && ttmp->ttyp != TRAPWARP_TRAP
3692 && ttmp->ttyp != YAWM_TRAP
3693 && ttmp->ttyp != CRADLE_OF_CHAOS_TRAP
3694 && ttmp->ttyp != TEZCATLIPOCA_TRAP
3695 && ttmp->ttyp != ENTHUMESIS_TRAP
3696 && ttmp->ttyp != MIKRAANESIS_TRAP
3697 && ttmp->ttyp != GOTS_TOO_GOOD_TRAP
3698 && ttmp->ttyp != KILLER_ROOM_TRAP
3699 && ttmp->ttyp != NO_FUN_WALLS_TRAP
3700 && ttmp->ttyp != BAD_PART_TRAP
3701 && ttmp->ttyp != COMPLETELY_BAD_PART_TRAP
3702 && ttmp->ttyp != EVIL_VARIANT_TRAP
3703 && ttmp->ttyp != INTRINSIC_LOSS_TRAP
3704 && ttmp->ttyp != BLOOD_LOSS_TRAP
3705 && ttmp->ttyp != BAD_EFFECT_TRAP
3706 && ttmp->ttyp != MULTIPLY_TRAP
3707 && ttmp->ttyp != AUTO_VULN_TRAP
3708 && ttmp->ttyp != TELE_ITEMS_TRAP
3709 && ttmp->ttyp != NASTINESS_TRAP
3710 && ttmp->ttyp != RECURSION_TRAP
3711 && ttmp->ttyp != RESPAWN_TRAP
3712 && ttmp->ttyp != WARP_ZONE
3713 && ttmp->ttyp != CAPTCHA_TRAP
3714 && ttmp->ttyp != MIND_WIPE_TRAP
3715 && ttmp->ttyp != LOCK_TRAP
3716 && ttmp->ttyp != MAGIC_CANCELLATION_TRAP
3717 && ttmp->ttyp != FARLOOK_TRAP
3718 && ttmp->ttyp != GATEWAY_FROM_HELL
3719 && ttmp->ttyp != GROWING_TRAP
3720 && ttmp->ttyp != COOLING_TRAP
3721 && ttmp->ttyp != BAR_TRAP
3722 && ttmp->ttyp != LOCKING_TRAP
3723 && ttmp->ttyp != AIR_TRAP
3724 && ttmp->ttyp != TERRAIN_TRAP
3725 && ttmp->ttyp != DISCONNECT_TRAP
3726 && ttmp->ttyp != INTERFACE_SCREW_TRAP
3727 && ttmp->ttyp != DIMNESS_TRAP
3728 && ttmp->ttyp != EVIL_ARTIFACT_TRAP
3729 && ttmp->ttyp != BOSSFIGHT_TRAP
3730 && ttmp->ttyp != ENTIRE_LEVEL_TRAP
3731 && ttmp->ttyp != BONES_TRAP
3732 && ttmp->ttyp != RODNEY_TRAP
3733 && ttmp->ttyp != AUTOCURSE_TRAP
3734 && ttmp->ttyp != HIGHLEVEL_TRAP
3735 && ttmp->ttyp != SPELL_FORGETTING_TRAP
3736 && ttmp->ttyp != SOUND_EFFECT_TRAP
3737 && ttmp->ttyp != ORANGE_SPELL_TRAP
3738 && ttmp->ttyp != VIOLET_SPELL_TRAP
3739 && ttmp->ttyp != TRAP_OF_LONGING
3740 && ttmp->ttyp != CURSED_PART_TRAP
3741 && ttmp->ttyp != QUAVERSAL_TRAP
3742 && ttmp->ttyp != APPEARANCE_SHUFFLING_TRAP
3743 && ttmp->ttyp != BROWN_SPELL_TRAP
3744 && ttmp->ttyp != CHOICELESS_TRAP
3745 && ttmp->ttyp != GOLDSPELL_TRAP
3746 && ttmp->ttyp != DEPROVEMENT_TRAP
3747 && ttmp->ttyp != INITIALIZATION_TRAP
3748 && ttmp->ttyp != GUSHLUSH_TRAP
3749 && ttmp->ttyp != SOILTYPE_TRAP
3750 && ttmp->ttyp != DANGEROUS_TERRAIN_TRAP
3751 && ttmp->ttyp != FALLOUT_TRAP
3752 && ttmp->ttyp != MOJIBAKE_TRAP
3753 && ttmp->ttyp != GRAVATION_TRAP
3754 && ttmp->ttyp != UNCALLED_TRAP
3755 && ttmp->ttyp != EXPLODING_DICE_TRAP
3756 && ttmp->ttyp != PERMACURSE_TRAP
3757 && ttmp->ttyp != SHROUDED_IDENTITY_TRAP
3758 && ttmp->ttyp != FEELER_GAUGES_TRAP
3759 && ttmp->ttyp != LONG_SCREWUP_TRAP
3760 && ttmp->ttyp != WING_YELLOW_CHANGER
3761 && ttmp->ttyp != LIFE_SAVING_TRAP
3762 && ttmp->ttyp != CURSEUSE_TRAP
3763 && ttmp->ttyp != CUT_NUTRITION_TRAP
3764 && ttmp->ttyp != SKILL_LOSS_TRAP
3765 && ttmp->ttyp != AUTOPILOT_TRAP
3766 && ttmp->ttyp != FORCE_TRAP
3767 && ttmp->ttyp != MONSTER_GLYPH_TRAP
3768 && ttmp->ttyp != CHANGING_DIRECTIVE_TRAP
3769 && ttmp->ttyp != CONTAINER_KABOOM_TRAP
3770 && ttmp->ttyp != STEAL_DEGRADE_TRAP
3771 && ttmp->ttyp != LEFT_INVENTORY_TRAP
3772 && ttmp->ttyp != FLUCTUATING_SPEED_TRAP
3773 && ttmp->ttyp != TARMUSTROKINGNORA_TRAP
3774 && ttmp->ttyp != FAILURE_TRAP
3775 && ttmp->ttyp != BRIGHT_CYAN_SPELL_TRAP
3776 && ttmp->ttyp != FREQUENTATION_SPAWN_TRAP
3777 && ttmp->ttyp != PET_AI_TRAP
3778 && ttmp->ttyp != SATAN_TRAP
3779 && ttmp->ttyp != REMEMBERANCE_TRAP
3780 && ttmp->ttyp != POKELIE_TRAP
3781 && ttmp->ttyp != AUTOPICKUP_TRAP
3782 && ttmp->ttyp != DYWYPI_TRAP
3783 && ttmp->ttyp != SILVER_SPELL_TRAP
3784 && ttmp->ttyp != METAL_SPELL_TRAP
3785 && ttmp->ttyp != PLATINUM_SPELL_TRAP
3786 && ttmp->ttyp != MANLER_TRAP
3787 && ttmp->ttyp != DOORNING_TRAP
3788 && ttmp->ttyp != NOWNSIBLE_TRAP
3789 && ttmp->ttyp != ELM_STREET_TRAP
3790 && ttmp->ttyp != MONNOISE_TRAP
3791 && ttmp->ttyp != RANG_CALL_TRAP
3792 && ttmp->ttyp != RECURRING_SPELL_LOSS_TRAP
3793 && ttmp->ttyp != ANTITRAINING_TRAP
3794 && ttmp->ttyp != TECHOUT_TRAP
3795 && ttmp->ttyp != STAT_DECAY_TRAP
3796 && ttmp->ttyp != MOVEMORK_TRAP
3798 && ttmp->ttyp != WALL_TRAP
3799 && ttmp->ttyp != MONSTER_GENERATOR
3800 && ttmp->ttyp != POTION_DISPENSER
3801 && ttmp->ttyp != SPACEWARS_SPAWN_TRAP
3802 && ttmp->ttyp != TV_TROPES_TRAP
3803 && ttmp->ttyp != SYMBIOTE_TRAP
3804 && ttmp->ttyp != KILL_SYMBIOTE_TRAP
3805 && ttmp->ttyp != SYMBIOTE_REPLACEMENT_TRAP
3806 && ttmp->ttyp != SHUTDOWN_TRAP
3807 && ttmp->ttyp != CORONA_TRAP
3808 && ttmp->ttyp != UNPROOFING_TRAP
3809 && ttmp->ttyp != VISIBILITY_TRAP
3810 && ttmp->ttyp != FEMINISM_STONE_TRAP
3811 && ttmp->ttyp != SHUEFT_TRAP
3812 && ttmp->ttyp != MOTH_LARVAE_TRAP
3813 && ttmp->ttyp != WORTHINESS_TRAP
3814 && ttmp->ttyp != CONDUCT_TRAP
3815 && ttmp->ttyp != STRIKETHROUGH_TRAP
3816 && ttmp->ttyp != MULTIPLE_GATHER_TRAP
3817 && ttmp->ttyp != VIVISECTION_TRAP
3818 && ttmp->ttyp != INSTAFEMINISM_TRAP
3819 && ttmp->ttyp != INSTANASTY_TRAP
3821 && ttmp->ttyp != CALLING_OUT_TRAP
3822 && ttmp->ttyp != FIELD_BREAK_TRAP
3823 && ttmp->ttyp != TENTH_TRAP
3824 && ttmp->ttyp != DEBT_TRAP
3825 && ttmp->ttyp != INVERSION_TRAP
3826 && ttmp->ttyp != WINCE_TRAP
3827 && ttmp->ttyp != FUCK_OVER_TRAP
3828 && ttmp->ttyp != U_HAVE_BEEN_TRAP
3829 && ttmp->ttyp != PERSISTENT_FART_TRAP
3830 && ttmp->ttyp != ATTACKING_HEEL_TRAP
3831 && ttmp->ttyp != TRAP_TELEPORTER
3832 && ttmp->ttyp != ALIGNMENT_TRASH_TRAP
3833 && ttmp->ttyp != RESHUFFLE_TRAP
3834 && ttmp->ttyp != MUSEHAND_TRAP
3835 && ttmp->ttyp != DOGSIDE_TRAP
3836 && ttmp->ttyp != BANKRUPT_TRAP
3837 && ttmp->ttyp != FILLUP_TRAP
3838 && ttmp->ttyp != AIRSTRIKE_TRAP
3839 && ttmp->ttyp != DYNAMITE_TRAP
3840 && ttmp->ttyp != MALEVOLENCE_TRAP
3841 && ttmp->ttyp != LEAFLET_TRAP
3842 && ttmp->ttyp != CORROSION_TRAP
3843 && ttmp->ttyp != FLAME_TRAP
3844 && ttmp->ttyp != RAZOR_TRAP
3845 && ttmp->ttyp != PHOSGENE_TRAP
3846 && ttmp->ttyp != CHLOROFORM_TRAP
3847 && ttmp->ttyp != WITHER_TRAP
3848 && ttmp->ttyp != PHASEPORTER
3849 && ttmp->ttyp != PHASE_BEAMER
3850 && ttmp->ttyp != VULNERATE_TRAP
3851 && ttmp->ttyp != TENTADEEP_TRAP
3852 && ttmp->ttyp != STATHALF_TRAP
3853 && ttmp->ttyp != CUTSTAT_TRAP
3854 && ttmp->ttyp != RARE_SPAWN_TRAP
3855 && ttmp->ttyp != YOU_ARE_AN_IDIOT_TRAP
3856 && ttmp->ttyp != NASTYCURSE_TRAP
3857 && ttmp->ttyp != REPEATING_NASTYCURSE_TRAP
3859 && ttmp->ttyp != FALLING_ROCK_COLD
3860 && ttmp->ttyp != RETURN_TRAP
3861 && ttmp->ttyp != INTRINSIC_STEAL_TRAP
3862 && ttmp->ttyp != SCORE_AXE_TRAP
3863 && ttmp->ttyp != SCORE_DRAIN_TRAP
3864 && ttmp->ttyp != SINGLE_UNIDENTIFY_TRAP
3865 && ttmp->ttyp != UNLUCKY_TRAP
3866 && ttmp->ttyp != ALIGNMENT_REDUCTION_TRAP
3867 && ttmp->ttyp != MALIGNANT_TRAP
3868 && ttmp->ttyp != STAT_DAMAGE_TRAP
3869 && ttmp->ttyp != HALF_MEMORY_TRAP
3870 && ttmp->ttyp != HALF_TRAINING_TRAP
3871 && ttmp->ttyp != DEBUFF_TRAP
3872 && ttmp->ttyp != TRIP_ONCE_TRAP
3873 && ttmp->ttyp != NARCOLEPSY_TRAP
3874 && ttmp->ttyp != MARTIAL_ARTS_TRAP
3876 && ttmp->ttyp != MEAN_BURDEN_TRAP
3877 && ttmp->ttyp != CARRCAP_TRAP
3878 && ttmp->ttyp != UMENG_TRAP
3880 && ttmp->ttyp != SKILL_POINT_LOSS_TRAP
3881 && ttmp->ttyp != PERFECT_MATCH_TRAP
3882 && ttmp->ttyp != DUMBIE_LIGHTSABER_TRAP
3883 && ttmp->ttyp != WRONG_STAIRS
3884 && ttmp->ttyp != TECHSTOP_TRAP
3885 && ttmp->ttyp != AMNESIA_SWITCH_TRAP
3886 && ttmp->ttyp != SKILL_SWAP_TRAP
3887 && ttmp->ttyp != SKILL_UPORDOWN_TRAP
3888 && ttmp->ttyp != SKILL_RANDOMIZE_TRAP
3889 && ttmp->ttyp != HYBRID_TRAP
3890 && ttmp->ttyp != SHAPECHANGE_TRAP
3891 && ttmp->ttyp != MELTEM_TRAP
3892 && ttmp->ttyp != MIGUC_TRAP
3893 && ttmp->ttyp != DIRECTIVE_TRAP
3894 && ttmp->ttyp != SATATUE_TRAP
3895 && ttmp->ttyp != FARTING_WEB
3896 && ttmp->ttyp != CATACLYSM_TRAP
3897 && ttmp->ttyp != DATA_DELETE_TRAP
3898 && ttmp->ttyp != ELDER_TENTACLING_TRAP
3899 && ttmp->ttyp != FOOTERER_TRAP
3901 && ttmp->ttyp != SKILL_MULTIPLY_TRAP
3902 && ttmp->ttyp != TRAPWALK_TRAP
3903 && ttmp->ttyp != CLUSTER_TRAP
3904 && ttmp->ttyp != FIELD_TRAP
3905 && ttmp->ttyp != MONICIDE_TRAP
3906 && ttmp->ttyp != TRAP_CREATION_TRAP
3907 && ttmp->ttyp != LEOLD_TRAP
3908 && ttmp->ttyp != BURDEN_TRAP
3909 && ttmp->ttyp != MAGIC_VACUUM_TRAP
3910 && ttmp->ttyp != ANIMEBAND_TRAP
3911 && ttmp->ttyp != PERFUME_TRAP
3912 && ttmp->ttyp != COURT_TRAP
3913 && ttmp->ttyp != ELDER_SCROLLS_TRAP
3914 && ttmp->ttyp != JOKE_TRAP
3915 && ttmp->ttyp != DUNGEON_LORDS_TRAP
3916 && ttmp->ttyp != FORTYTWO_TRAP
3917 && ttmp->ttyp != RANDOMIZE_TRAP
3918 && ttmp->ttyp != EVILROOM_TRAP
3919 && ttmp->ttyp != AOE_TRAP
3920 && ttmp->ttyp != ELONA_TRAP
3921 && ttmp->ttyp != RELIGION_TRAP
3922 && ttmp->ttyp != STEAMBAND_TRAP
3923 && ttmp->ttyp != HARDCORE_TRAP
3924 && ttmp->ttyp != MACHINE_TRAP
3925 && ttmp->ttyp != BEE_TRAP
3926 && ttmp->ttyp != MIGO_TRAP
3927 && ttmp->ttyp != ANGBAND_TRAP
3928 && ttmp->ttyp != DNETHACK_TRAP
3929 && ttmp->ttyp != EVIL_SPAWN_TRAP
3930 && ttmp->ttyp != SHOE_TRAP
3931 && ttmp->ttyp != INSIDE_TRAP
3932 && ttmp->ttyp != DOOM_TRAP
3933 && ttmp->ttyp != MILITARY_TRAP
3934 && ttmp->ttyp != ILLUSION_TRAP
3935 && ttmp->ttyp != DIABLO_TRAP
3937 && ttmp->ttyp != GRAVE_WALL_TRAP
3938 && ttmp->ttyp != TUNNEL_TRAP
3939 && ttmp->ttyp != FARMLAND_TRAP
3940 && ttmp->ttyp != MOUNTAIN_TRAP
3941 && ttmp->ttyp != WATER_TUNNEL_TRAP
3942 && ttmp->ttyp != CRYSTAL_FLOOD_TRAP
3943 && ttmp->ttyp != MOORLAND_TRAP
3944 && ttmp->ttyp != URINE_TRAP
3945 && ttmp->ttyp != SHIFTING_SAND_TRAP
3946 && ttmp->ttyp != STYX_TRAP
3947 && ttmp->ttyp != PENTAGRAM_TRAP
3948 && ttmp->ttyp != SNOW_TRAP
3949 && ttmp->ttyp != ASH_TRAP
3950 && ttmp->ttyp != SAND_TRAP
3951 && ttmp->ttyp != PAVEMENT_TRAP
3952 && ttmp->ttyp != HIGHWAY_TRAP
3953 && ttmp->ttyp != GRASSLAND_TRAP
3954 && ttmp->ttyp != NETHER_MIST_TRAP
3955 && ttmp->ttyp != STALACTITE_TRAP
3956 && ttmp->ttyp != CRYPTFLOOR_TRAP
3957 && ttmp->ttyp != BUBBLE_TRAP
3958 && ttmp->ttyp != RAIN_CLOUD_TRAP
3960 && ttmp->ttyp != ITEM_NASTIFICATION_TRAP
3961 && ttmp->ttyp != SANITY_INCREASE_TRAP
3962 && ttmp->ttyp != PSI_TRAP
3963 && ttmp->ttyp != GAY_TRAP
3965 && ttmp->ttyp != SARAH_TRAP
3966 && ttmp->ttyp != CLAUDIA_TRAP
3967 && ttmp->ttyp != LUDGERA_TRAP
3968 && ttmp->ttyp != KATI_TRAP
3970 && ttmp->ttyp != SANITY_TREBLE_TRAP
3971 && ttmp->ttyp != STAT_DECREASE_TRAP
3972 && ttmp->ttyp != SIMEOUT_TRAP
3974 && ttmp->ttyp != LOOTCUT_TRAP
3975 && ttmp->ttyp != MONSTER_SPEED_TRAP
3976 && ttmp->ttyp != SCALING_TRAP
3977 && ttmp->ttyp != ENMITY_TRAP
3978 && ttmp->ttyp != WHITE_SPELL_TRAP
3979 && ttmp->ttyp != COMPLETE_GRAY_SPELL_TRAP
3980 && ttmp->ttyp != QUASAR_TRAP
3981 && ttmp->ttyp != MOMMA_TRAP
3982 && ttmp->ttyp != HORROR_TRAP
3983 && ttmp->ttyp != ARTIFICER_TRAP
3984 && ttmp->ttyp != WEREFORM_TRAP
3985 && ttmp->ttyp != NON_PRAYER_TRAP
3986 && ttmp->ttyp != EVIL_PATCH_TRAP
3987 && ttmp->ttyp != HARD_MODE_TRAP
3988 && ttmp->ttyp != SECRET_ATTACK_TRAP
3989 && ttmp->ttyp != EATER_TRAP
3990 && ttmp->ttyp != COVETOUSNESS_TRAP
3991 && ttmp->ttyp != NOT_SEEN_TRAP
3992 && ttmp->ttyp != DARK_MODE_TRAP
3993 && ttmp->ttyp != ANTISEARCH_TRAP
3994 && ttmp->ttyp != HOMICIDE_TRAP
3995 && ttmp->ttyp != NASTY_NATION_TRAP
3996 && ttmp->ttyp != WAKEUP_CALL_TRAP
3997 && ttmp->ttyp != GRAYOUT_TRAP
3998 && ttmp->ttyp != GRAY_CENTER_TRAP
3999 && ttmp->ttyp != CHECKERBOARD_TRAP
4000 && ttmp->ttyp != CLOCKWISE_SPIN_TRAP
4001 && ttmp->ttyp != COUNTERCLOCKWISE_SPIN_TRAP
4002 && ttmp->ttyp != LAG_TRAP
4003 && ttmp->ttyp != BLESSCURSE_TRAP
4004 && ttmp->ttyp != DE_LIGHT_TRAP
4005 && ttmp->ttyp != DISCHARGE_TRAP
4006 && ttmp->ttyp != TRASHING_TRAP
4007 && ttmp->ttyp != FILTERING_TRAP
4008 && ttmp->ttyp != DEFORMATTING_TRAP
4009 && ttmp->ttyp != FLICKER_STRIP_TRAP
4010 && ttmp->ttyp != UNDRESSING_TRAP
4011 && ttmp->ttyp != HYPERBLUEWALL_TRAP
4012 && ttmp->ttyp != NOLITE_TRAP
4013 && ttmp->ttyp != PARANOIA_TRAP
4014 && ttmp->ttyp != FLEECESCRIPT_TRAP
4015 && ttmp->ttyp != INTERRUPT_TRAP
4016 && ttmp->ttyp != DUSTBIN_TRAP
4017 && ttmp->ttyp != MANA_BATTERY_TRAP
4018 && ttmp->ttyp != MONSTERFINGERS_TRAP
4019 && ttmp->ttyp != MISCAST_TRAP
4020 && ttmp->ttyp != MESSAGE_SUPPRESSION_TRAP
4021 && ttmp->ttyp != STUCK_ANNOUNCEMENT_TRAP
4022 && ttmp->ttyp != BLOODTHIRSTY_TRAP
4023 && ttmp->ttyp != MAXIMUM_DAMAGE_TRAP
4024 && ttmp->ttyp != LATENCY_TRAP
4025 && ttmp->ttyp != STARLIT_TRAP
4026 && ttmp->ttyp != KNOWLEDGE_TRAP
4027 && ttmp->ttyp != HIGHSCORE_TRAP
4028 && ttmp->ttyp != PINK_SPELL_TRAP
4029 && ttmp->ttyp != GREEN_SPELL_TRAP
4030 && ttmp->ttyp != EVC_TRAP
4031 && ttmp->ttyp != UNDERLAYER_TRAP
4032 && ttmp->ttyp != DAMAGE_METER_TRAP
4033 && ttmp->ttyp != ARBITRARY_WEIGHT_TRAP
4034 && ttmp->ttyp != FUCKED_INFO_TRAP
4035 && ttmp->ttyp != BLACK_SPELL_TRAP
4036 && ttmp->ttyp != CYAN_SPELL_TRAP
4037 && ttmp->ttyp != HEAP_TRAP
4038 && ttmp->ttyp != BLUE_SPELL_TRAP
4039 && ttmp->ttyp != TRON_TRAP
4040 && ttmp->ttyp != RED_SPELL_TRAP
4041 && ttmp->ttyp != TOO_HEAVY_TRAP
4042 && ttmp->ttyp != ELONGATION_TRAP
4043 && ttmp->ttyp != WRAPOVER_TRAP
4044 && ttmp->ttyp != DESTRUCTION_TRAP
4045 && ttmp->ttyp != MELEE_PREFIX_TRAP
4046 && ttmp->ttyp != AUTOMORE_TRAP
4047 && ttmp->ttyp != UNFAIR_ATTACK_TRAP
4049 && ttmp->ttyp != LOUDSPEAKER
4050 && ttmp->ttyp != NEST_TRAP
4051 && ttmp->ttyp != CYANIDE_TRAP
4052 && ttmp->ttyp != LASER_TRAP
4053 && ttmp->ttyp != FART_TRAP
4054 && ttmp->ttyp != CONFUSE_TRAP
4055 && ttmp->ttyp != STUN_TRAP
4056 && ttmp->ttyp != HALLUCINATION_TRAP
4057 && ttmp->ttyp != PETRIFICATION_TRAP
4058 && ttmp->ttyp != NUMBNESS_TRAP
4059 && ttmp->ttyp != FREEZING_TRAP
4060 && ttmp->ttyp != BURNING_TRAP
4061 && ttmp->ttyp != FEAR_TRAP
4062 && ttmp->ttyp != BLINDNESS_TRAP
4063 && ttmp->ttyp != GLIB_TRAP
4064 && ttmp->ttyp != SLIME_TRAP
4065 && ttmp->ttyp != INERTIA_TRAP
4066 && ttmp->ttyp != TIME_TRAP
4067 && ttmp->ttyp != LYCANTHROPY_TRAP
4068 && ttmp->ttyp != UNLIGHT_TRAP
4069 && ttmp->ttyp != ELEMENTAL_TRAP
4070 && ttmp->ttyp != ESCALATING_TRAP
4071 && ttmp->ttyp != NEGATIVE_TRAP
4072 && ttmp->ttyp != MANA_TRAP
4073 && ttmp->ttyp != SIN_TRAP
4074 && ttmp->ttyp != DESTROY_ARMOR_TRAP
4075 && ttmp->ttyp != DIVINE_ANGER_TRAP
4076 && ttmp->ttyp != GENETIC_TRAP
4077 && ttmp->ttyp != MISSINGNO_TRAP
4078 && ttmp->ttyp != CANCELLATION_TRAP
4079 && ttmp->ttyp != HOSTILITY_TRAP
4080 && ttmp->ttyp != BOSS_TRAP
4081 && ttmp->ttyp != WISHING_TRAP
4082 && ttmp->ttyp != RECURRING_AMNESIA_TRAP
4083 && ttmp->ttyp != BIGSCRIPT_TRAP
4084 && ttmp->ttyp != BANK_TRAP
4085 && ttmp->ttyp != ONLY_TRAP
4086 && ttmp->ttyp != MAP_TRAP
4087 && ttmp->ttyp != TECH_TRAP
4088 && ttmp->ttyp != DISENCHANT_TRAP
4089 && ttmp->ttyp != VERISIERT
4090 && ttmp->ttyp != CHAOS_TRAP
4091 && ttmp->ttyp != MUTENESS_TRAP
4092 && ttmp->ttyp != NTLL_TRAP
4093 && ttmp->ttyp != ENGRAVING_TRAP
4094 && ttmp->ttyp != MAGIC_DEVICE_TRAP
4095 && ttmp->ttyp != BOOK_TRAP
4096 && ttmp->ttyp != LEVEL_TRAP
4097 && ttmp->ttyp != QUIZ_TRAP
4099 && ttmp->ttyp != BOMB_TRAP
4100 && ttmp->ttyp != EARTHQUAKE_TRAP
4101 && ttmp->ttyp != GLUE_TRAP
4102 && ttmp->ttyp != GUILLOTINE_TRAP
4103 && ttmp->ttyp != BISECTION_TRAP
4104 && ttmp->ttyp != VOLT_TRAP
4105 && ttmp->ttyp != HORDE_TRAP
4106 && ttmp->ttyp != IMMOBILITY_TRAP
4107 && ttmp->ttyp != GREEN_GLYPH
4108 && ttmp->ttyp != BLUE_GLYPH
4109 && ttmp->ttyp != YELLOW_GLYPH
4110 && ttmp->ttyp != ORANGE_GLYPH
4111 && ttmp->ttyp != BLACK_GLYPH
4112 && ttmp->ttyp != PURPLE_GLYPH
4114 && ttmp->ttyp != METABOLIC_TRAP
4115 && ttmp->ttyp != TRAP_OF_NO_RETURN
4116 && ttmp->ttyp != EGOTRAP
4117 && ttmp->ttyp != FAST_FORWARD_TRAP
4118 && ttmp->ttyp != TRAP_OF_ROTTENNESS
4119 && ttmp->ttyp != UNSKILLED_TRAP
4120 && ttmp->ttyp != LOW_STATS_TRAP
4121 && ttmp->ttyp != TRAINING_TRAP
4122 && ttmp->ttyp != EXERCISE_TRAP
4123 && ttmp->ttyp != FALLING_LOADSTONE_TRAP
4124 && ttmp->ttyp != SUMMON_UNDEAD_TRAP
4125 && ttmp->ttyp != FALLING_NASTYSTONE_TRAP
4127 && ttmp->ttyp != SPINED_BALL_TRAP
4128 && ttmp->ttyp != PENDULUM_TRAP
4129 && ttmp->ttyp != TURN_TABLE
4130 && ttmp->ttyp != SCENT_TRAP
4131 && ttmp->ttyp != BANANA_TRAP
4132 && ttmp->ttyp != FALLING_TUB_TRAP
4133 && ttmp->ttyp != ALARM
4134 && ttmp->ttyp != CALTROPS_TRAP
4135 && ttmp->ttyp != BLADE_WIRE
4136 && ttmp->ttyp != MAGNET_TRAP
4137 && ttmp->ttyp != SLINGSHOT_TRAP
4138 && ttmp->ttyp != CANNON_TRAP
4139 && ttmp->ttyp != VENOM_SPRINKLER
4140 && ttmp->ttyp != FUMAROLE
4142 && ttmp->ttyp != EVIL_HEEL_TRAP
4143 && ttmp->ttyp != BAD_EQUIPMENT_TRAP
4144 && ttmp->ttyp != TEMPOCONFLICT_TRAP
4145 && ttmp->ttyp != TEMPOHUNGER_TRAP
4146 && ttmp->ttyp != TELEPORTITIS_TRAP
4147 && ttmp->ttyp != POLYMORPHITIS_TRAP
4148 && ttmp->ttyp != PREMATURE_DEATH_TRAP
4149 && ttmp->ttyp != LASTING_AMNESIA_TRAP
4150 && ttmp->ttyp != RAGNAROK_TRAP
4151 && ttmp->ttyp != SINGLE_DISENCHANT_TRAP
4153 && ttmp->ttyp != SEVERE_DISENCHANT_TRAP
4154 && ttmp->ttyp != PAIN_TRAP
4155 && ttmp->ttyp != TREMBLING_TRAP
4156 && ttmp->ttyp != TECHCAP_TRAP
4157 && ttmp->ttyp != SPELL_MEMORY_TRAP
4158 && ttmp->ttyp != SKILL_REDUCTION_TRAP
4159 && ttmp->ttyp != SKILLCAP_TRAP
4160 && ttmp->ttyp != PERMANENT_STAT_DAMAGE_TRAP
4162 && ttmp->ttyp != NEXUS_TRAP
4163 && ttmp->ttyp != LEG_TRAP
4164 && ttmp->ttyp != ARTIFACT_JACKPOT_TRAP
4165 && ttmp->ttyp != MAP_AMNESIA_TRAP
4166 && ttmp->ttyp != SPREADING_TRAP
4167 && ttmp->ttyp != ADJACENT_TRAP
4168 && ttmp->ttyp != SUPERTHING_TRAP
4169 && ttmp->ttyp != LEVITATION_TRAP
4170 && ttmp->ttyp != BOWEL_CRAMPS_TRAP
4171 && ttmp->ttyp != UNEQUIPPING_TRAP
4172 && ttmp->ttyp != GOOD_ARTIFACT_TRAP
4173 && ttmp->ttyp != GENDER_TRAP
4174 && ttmp->ttyp != TRAP_OF_OPPOSITE_ALIGNMENT
4175 && ttmp->ttyp != SINCOUNT_TRAP
4176 && ttmp->ttyp != WRENCHING_TRAP
4177 && ttmp->ttyp != TRACKER_TRAP
4178 && ttmp->ttyp != NURSE_TRAP
4179 && ttmp->ttyp != BACK_TO_START_TRAP
4180 && ttmp->ttyp != NEMESIS_TRAP
4181 && ttmp->ttyp != STREW_TRAP
4182 && ttmp->ttyp != OUTTA_DEPTH_TRAP
4183 && ttmp->ttyp != PUNISHMENT_TRAP
4184 && ttmp->ttyp != BOON_TRAP
4185 && ttmp->ttyp != FOUNTAIN_TRAP
4186 && ttmp->ttyp != THRONE_TRAP
4187 && ttmp->ttyp != ARABELLA_SPEAKER
4188 && ttmp->ttyp != FEMMY_TRAP
4189 && ttmp->ttyp != MADELEINE_TRAP
4190 && ttmp->ttyp != MARLENA_TRAP
4191 && ttmp->ttyp != SABRINA_TRAP
4192 && ttmp->ttyp != TANJA_TRAP
4193 && ttmp->ttyp != SONJA_TRAP
4194 && ttmp->ttyp != RHEA_TRAP
4195 && ttmp->ttyp != LARA_TRAP
4196 && ttmp->ttyp != NADINE_TRAP
4197 && ttmp->ttyp != LUISA_TRAP
4198 && ttmp->ttyp != IRINA_TRAP
4199 && ttmp->ttyp != LISELOTTE_TRAP
4200 && ttmp->ttyp != GRETA_TRAP
4201 && ttmp->ttyp != JANE_TRAP
4202 && ttmp->ttyp != SUE_LYN_TRAP
4203 && ttmp->ttyp != CHARLOTTE_TRAP
4204 && ttmp->ttyp != HANNAH_TRAP
4205 && ttmp->ttyp != LITTLE_MARIE_TRAP
4206 && ttmp->ttyp != RUTH_TRAP
4207 && ttmp->ttyp != MAGDALENA_TRAP
4208 && ttmp->ttyp != MARLEEN_TRAP
4209 && ttmp->ttyp != KLARA_TRAP
4210 && ttmp->ttyp != FRIEDERIKE_TRAP
4211 && ttmp->ttyp != NAOMI_TRAP
4212 && ttmp->ttyp != UTE_TRAP
4213 && ttmp->ttyp != JASIEEN_TRAP
4214 && ttmp->ttyp != YASAMAN_TRAP
4215 && ttmp->ttyp != MAY_BRITT_TRAP
4216 && ttmp->ttyp != KSENIA_TRAP
4217 && ttmp->ttyp != LYDIA_TRAP
4218 && ttmp->ttyp != CONNY_TRAP
4219 && ttmp->ttyp != KATIA_TRAP
4220 && ttmp->ttyp != MARIYA_TRAP
4221 && ttmp->ttyp != ELISE_TRAP
4222 && ttmp->ttyp != RONJA_TRAP
4223 && ttmp->ttyp != ARIANE_TRAP
4224 && ttmp->ttyp != JOHANNA_TRAP
4225 && ttmp->ttyp != INGE_TRAP
4226 && ttmp->ttyp != ROSA_TRAP
4227 && ttmp->ttyp != JANINA_TRAP
4228 && ttmp->ttyp != KRISTIN_TRAP
4229 && ttmp->ttyp != ANNA_TRAP
4230 && ttmp->ttyp != RUEA_TRAP
4231 && ttmp->ttyp != DORA_TRAP
4232 && ttmp->ttyp != MARIKE_TRAP
4233 && ttmp->ttyp != JETTE_TRAP
4234 && ttmp->ttyp != INA_TRAP
4235 && ttmp->ttyp != SING_TRAP
4236 && ttmp->ttyp != VICTORIA_TRAP
4237 && ttmp->ttyp != MELISSA_TRAP
4238 && ttmp->ttyp != ANITA_TRAP
4239 && ttmp->ttyp != HENRIETTA_TRAP
4240 && ttmp->ttyp != VERENA_TRAP
4241 && ttmp->ttyp != ARABELLA_TRAP
4242 && ttmp->ttyp != NELLY_TRAP
4243 && ttmp->ttyp != EVELINE_TRAP
4244 && ttmp->ttyp != KARIN_TRAP
4245 && ttmp->ttyp != JUEN_TRAP
4246 && ttmp->ttyp != ALMUT_TRAP
4247 && ttmp->ttyp != JULIETTA_TRAP
4248 && ttmp->ttyp != KRISTINA_TRAP
4249 && ttmp->ttyp != LOU_TRAP
4250 && ttmp->ttyp != ANASTASIA_TRAP
4251 && ttmp->ttyp != FILLER_TRAP
4252 && ttmp->ttyp != TOXIC_VENOM_TRAP
4253 && ttmp->ttyp != INSANITY_TRAP
4254 && ttmp->ttyp != MADNESS_TRAP
4255 && ttmp->ttyp != JESSICA_TRAP
4256 && ttmp->ttyp != SOLVEJG_TRAP
4257 && ttmp->ttyp != WENDY_TRAP
4258 && ttmp->ttyp != KATHARINA_TRAP
4259 && ttmp->ttyp != ELENA_TRAP
4260 && ttmp->ttyp != THAI_TRAP
4261 && ttmp->ttyp != ELIF_TRAP
4262 && ttmp->ttyp != NADJA_TRAP
4263 && ttmp->ttyp != SANDRA_TRAP
4264 && ttmp->ttyp != NATALJE_TRAP
4265 && ttmp->ttyp != JEANETTA_TRAP
4266 && ttmp->ttyp != YVONNE_TRAP
4267 && ttmp->ttyp != MAURAH_TRAP
4268 && ttmp->ttyp != ANNEMARIE_TRAP
4269 && ttmp->ttyp != JIL_TRAP
4270 && ttmp->ttyp != JANA_TRAP
4271 && ttmp->ttyp != KATRIN_TRAP
4272 && ttmp->ttyp != GUDRUN_TRAP
4273 && ttmp->ttyp != ELLA_TRAP
4274 && ttmp->ttyp != MANUELA_TRAP
4275 && ttmp->ttyp != JENNIFER_TRAP
4276 && ttmp->ttyp != PATRICIA_TRAP
4277 && ttmp->ttyp != ANTJE_TRAP
4278 && ttmp->ttyp != ANTJE_TRAP_X
4279 && ttmp->ttyp != KERSTIN_TRAP
4280 && ttmp->ttyp != LAURA_TRAP
4281 && ttmp->ttyp != LARISSA_TRAP
4282 && ttmp->ttyp != NORA_TRAP
4283 && ttmp->ttyp != NATALIA_TRAP
4284 && ttmp->ttyp != SUSANNE_TRAP
4285 && ttmp->ttyp != LISA_TRAP
4286 && ttmp->ttyp != BRIDGHITTE_TRAP
4287 && ttmp->ttyp != JULIA_TRAP
4288 && ttmp->ttyp != NICOLE_TRAP
4289 && ttmp->ttyp != RITA_TRAP
4291 && ttmp->ttyp != ELEMENTAL_PORTAL
4292 && ttmp->ttyp != GIRLINESS_TRAP
4293 && ttmp->ttyp != FUMBLING_TRAP
4294 && ttmp->ttyp != EGOMONSTER_TRAP
4295 && ttmp->ttyp != FLOODING_TRAP
4296 && ttmp->ttyp != MONSTER_CUBE
4297 && ttmp->ttyp != CURSED_GRAVE
4298 && ttmp->ttyp != LIMITATION_TRAP
4299 && ttmp->ttyp != WEAK_SIGHT_TRAP
4300 && ttmp->ttyp != RANDOM_MESSAGE_TRAP
4302 && ttmp->ttyp != DESECRATION_TRAP
4303 && ttmp->ttyp != STARVATION_TRAP
4304 && ttmp->ttyp != DROPLESS_TRAP
4305 && ttmp->ttyp != LOW_EFFECT_TRAP
4306 && ttmp->ttyp != INVISIBLE_TRAP
4307 && ttmp->ttyp != GHOST_WORLD_TRAP
4308 && ttmp->ttyp != DEHYDRATION_TRAP
4309 && ttmp->ttyp != HATE_TRAP
4310 && ttmp->ttyp != SPACEWARS_TRAP
4311 && ttmp->ttyp != TEMPORARY_RECURSION_TRAP
4312 && ttmp->ttyp != TOTTER_TRAP
4313 && ttmp->ttyp != NONINTRINSICAL_TRAP
4314 && ttmp->ttyp != DROPCURSE_TRAP
4315 && ttmp->ttyp != NAKEDNESS_TRAP
4316 && ttmp->ttyp != ANTILEVEL_TRAP
4317 && ttmp->ttyp != VENTILATOR
4318 && ttmp->ttyp != STEALER_TRAP
4319 && ttmp->ttyp != REBELLION_TRAP
4320 && ttmp->ttyp != CRAP_TRAP
4321 && ttmp->ttyp != MISFIRE_TRAP
4322 && ttmp->ttyp != TRAP_OF_WALLS
4324 && ttmp->ttyp != KOP_CUBE
4325 && ttmp->ttyp != BOSS_SPAWNER
4326 && ttmp->ttyp != CONTAMINATION_TRAP
4328 && ((ttmp->ttyp != PIT
4329 && ttmp->ttyp != SPIKED_PIT
4330 && ttmp->ttyp != GIANT_CHASM
4331 && ttmp->ttyp != SHIT_PIT
4332 && ttmp->ttyp != MANA_PIT
4333 && ttmp->ttyp != ANOXIC_PIT
4334 && ttmp->ttyp != HYPOXIC_PIT
4335 && ttmp->ttyp != ACID_PIT
4336 && ttmp->ttyp != SHAFT_TRAP
4337 && ttmp->ttyp != TRAPDOOR
4338 && ttmp->ttyp != HOLE)
4339 || (!is_flyer(mdat) && (!mon->egotype_flying)
4340 && !is_floater(mdat)
4341 && !is_clinger(mdat))
4342 || In_sokoban(&u.uz))
4344 && (ttmp->ttyp != DEATH_TRAP ||
4345 (nonliving(mon->data) || is_demon(mon->data) || resists_death(mon) || mon->data->msound == MS_NEMESIS || resists_magm(mon)) )
4347 && (ttmp->ttyp != DISINTEGRATION_TRAP ||
4348 (!resists_disint(mon)) )
4350 && (ttmp->ttyp != DRAIN_TRAP ||
4351 (!resists_drli(mon)) )
4353 && (ttmp->ttyp != SLP_GAS_TRAP ||
4354 (!resists_sleep(mon) && !breathless(mdat) && (!mon->egotype_undead) ) )
4355 && (ttmp->ttyp != POISON_GAS_TRAP ||
4356 (!resists_poison(mon) && !breathless(mdat) && (!mon->egotype_undead) ) )
4357 && (ttmp->ttyp != SLOW_GAS_TRAP ||
4358 (!breathless(mdat) && (!mon->egotype_undead) ) )
4359 && (ttmp->ttyp != BEAR_TRAP ||
4360 (mdat->msize > MZ_SMALL &&
4361 !amorphous(mdat) && !is_flyer(mdat) && (!mon->egotype_flying) ))
4362 && (ttmp->ttyp != FIRE_TRAP ||
4363 !resists_fire(mon))
4364 && (ttmp->ttyp != SHOCK_TRAP ||
4365 !resists_elec(mon))
4366 && (ttmp->ttyp != ICE_TRAP ||
4367 !resists_cold(mon))
4368 && (ttmp->ttyp != SQKY_BOARD || (!is_flyer(mdat) && (!mon->egotype_flying) ))
4369 && (ttmp->ttyp != ACID_POOL || (!is_flyer(mdat) && (!mon->egotype_flying) && !is_floater(mdat) && !resists_acid(mon)) )
4370 && (ttmp->ttyp != WATER_POOL || (!is_flyer(mdat) && (!mon->egotype_flying) && !is_floater(mdat) && !is_swimmer(mdat) && !mon->egotype_watersplasher && !amphibious(mdat) && !breathless(mdat) && (!mon->egotype_undead) ) )
4371 && (ttmp->ttyp != WEB || (!amorphous(mdat) && !mon->egotype_webber &&
4372 !webmaker(mdat) && !dmgtype(mdat, AD_WEBS) ))
4374 if (!(flag & ALLOW_TRAPS)) {
4375 /* No more mtrapseen weirdness - just have a random chance of avoiding the trap --Amy
4376 * make sure they don't constantly fall into sokoban holes */
4377 if (rn2(3) || (In_sokoban(&u.uz) && rn2(25) && (ttmp->ttyp == PIT || ttmp->ttyp == SPIKED_PIT
4378 || ttmp->ttyp == GIANT_CHASM || ttmp->ttyp == SHIT_PIT || ttmp->ttyp == MANA_PIT
4379 || ttmp->ttyp == ANOXIC_PIT || ttmp->ttyp == HYPOXIC_PIT || ttmp->ttyp == ACID_PIT || ttmp->ttyp == SHAFT_TRAP || ttmp->ttyp == TRAPDOOR
4380 || ttmp->ttyp == HOLE) ) )
4381 continue;
4383 info[cnt] |= ALLOW_TRAPS;
4387 poss[cnt].x = nx;
4388 poss[cnt].y = ny;
4389 cnt++;
4393 /* The following code assumes that all "wantlava" monsters are also "wantpool". --Amy */
4394 if(!cnt && wantlava && !is_lava(x,y) && !is_styxriver(x,y) && !is_waterypool(x,y) && !is_watertunnel(x,y) ) {
4395 wantlava = FALSE;
4396 wantpool = FALSE;
4397 goto nexttry;
4399 /* The reverse is obviously not true; this check had to be changed to make sure lava-loving monsters don't leave their pools of lava... */
4400 if(!cnt && wantpool && !wantlava && !is_waterypool(x,y) && !is_watertunnel(x,y)) {
4401 wantpool = FALSE;
4402 goto nexttry;
4404 return(cnt);
4407 #endif /* OVL0 */
4408 #ifdef OVL1
4410 /* Monster against monster special attacks; for the specified monster
4411 combinations, this allows one monster to attack another adjacent one
4412 in the absence of Conflict. There is no provision for targetting
4413 other monsters; just hand to hand fighting when they happen to be
4414 next to each other. */
4416 /* Amy keywords: "grudge" "Nephi" (no idea why none of those words appear here) */
4417 STATIC_OVL long
4418 mm_aggression(magr, mdef)
4419 struct monst *magr, /* monster that is currently deciding where to move */
4420 *mdef; /* another monster which is next to it */
4423 if (TimeStopped && !immune_timestop(magr->data) && !immune_timestop(mdef->data) ) return 0L; /* turned out they were still able to bash each other during time stop! */
4425 if (!magr || !mdef) return 0L; /* error - shouldn't happen */
4426 if (DEADMONSTER(magr) || DEADMONSTER(mdef)) return 0L; /* bugfix */
4428 /* Amy edit: if pets are ignored by everything, it can result in them being way too unkillable because they often
4429 * won't attack things that would kill them...
4430 * make sure that things which shouldn't attack pets (Moldoux, shopkeepers, priests...) are exempt
4431 * keyword: dnethack */
4432 if (!magr->mtame && !magr->mpeaceful && (magr->data != &mons[PM_MOLDOUX__THE_DEFENCELESS_MOLD]) && !magr->isshk && !magr->isgd && !magr->ispriest && magr->data->mlet != S_TROVE && (u.petattackenemies >= 0) && mdef->mtame && !(u.usteed && mdef == u.usteed) && (mdef->m_lev > rn2(6)) && ((magr->m_lev - mdef->m_lev) < (2 + rn2(5)) ) && !rn2((mdef->m_lev > 40) ? 3 : (mdef->m_lev > 30) ? 5 : (mdef->m_lev > 20) ? 10 : 20) && (!rn2(5) || mdef->mcanmove) && (!rn2(5) || (mdef->mhpmax > 5 && mdef->mhp > (mdef->mhpmax / 5))) ) return ALLOW_M|ALLOW_TM;
4433 if (!magr->mtame && !magr->mpeaceful && (magr->data != &mons[PM_MOLDOUX__THE_DEFENCELESS_MOLD]) && !magr->isshk && !magr->isgd && !magr->ispriest && magr->data->mlet != S_TROVE && mdef->mtame && !(u.usteed && mdef == u.usteed) && ((attacktype(mdef->data, AT_EXPL)) || (mindless(magr->data) && evilfriday) || magr->mfrenzied ) ) return ALLOW_M|ALLOW_TM;
4435 if (!magr->mtame && !magr->mpeaceful && (magr->data != &mons[PM_MOLDOUX__THE_DEFENCELESS_MOLD]) && mdef->mtame && (PethateEffect || u.uprops[PETHATE_EFFECT].extrinsic || have_pethatestone()) ) return ALLOW_M|ALLOW_TM;
4437 if ((PetLashoutEffect || u.uprops[PET_LASHOUT_EFFECT].extrinsic || have_petlashoutstone()) && magr->mtame && mdef->mtame) return ALLOW_M|ALLOW_TM;
4439 if (Race_if(PM_ALBAE)) return 0L; /* if you're an albae, everything hates you more than anything else --Amy */
4440 if (Role_if(PM_CRUEL_ABUSER) && Qstatf(killed_nemesis) ) return 0L; /* or if you killed the abuser nemesis */
4441 if (Aggravate_monster && rn2(5) ) return 0L; /* aggravate monster makes monsters much more likely to target you and ignore everything else */
4443 /* supposedly purple worms are attracted to shrieking because they
4444 like to eat shriekers, so attack the latter when feasible */
4445 if (magr->data == &mons[PM_PURPLE_WORM] &&
4446 mdef->data == &mons[PM_SHRIEKER])
4447 return ALLOW_M|ALLOW_TM;
4449 /* elves vs. orcs */
4450 if(magr->data->mflags2 & M2_ELF && mdef->data->mflags2 & M2_ORC)
4451 return ALLOW_M|ALLOW_TM;
4452 /* and vice versa */
4453 if(mdef->data->mflags2 & M2_ELF && magr->data->mflags2 & M2_ORC)
4454 return ALLOW_M|ALLOW_TM;
4456 /* angels vs. demons */
4457 if(magr->data->mlet==S_ANGEL && mdef->data->mflags2 & M2_DEMON)
4458 return ALLOW_M|ALLOW_TM;
4459 /* and vice versa */
4460 if(mdef->data->mlet==S_ANGEL && magr->data->mflags2 & M2_DEMON)
4461 return ALLOW_M|ALLOW_TM;
4463 /* woodchucks vs. The Oracle */
4464 if(magr->data == &mons[PM_WOODCHUCK] && mdef->data == &mons[PM_ORACLE])
4465 return ALLOW_M|ALLOW_TM;
4467 /* aurors vs. death eaters */
4468 if(magr->data == &mons[PM_AUROR] && mdef->data == &mons[PM_FELLOW_DEATH_EATER])
4469 return ALLOW_M|ALLOW_TM;
4470 if(mdef->data == &mons[PM_AUROR] && magr->data == &mons[PM_FELLOW_DEATH_EATER])
4471 return ALLOW_M|ALLOW_TM;
4473 /* Stormtroopers vs. Padawans */
4474 if(magr->data == &mons[PM_STORMTROOPER] && mdef->data == &mons[PM_PADAWAN])
4475 return ALLOW_M|ALLOW_TM;
4476 /* and vice versa */
4477 if(mdef->data == &mons[PM_STORMTROOPER] && magr->data == &mons[PM_PADAWAN])
4478 return ALLOW_M|ALLOW_TM;
4479 /* Stormtroopers vs. Jedi */
4480 if(magr->data == &mons[PM_STORMTROOPER] && mdef->data == &mons[PM_JEDI])
4481 return ALLOW_M|ALLOW_TM;
4482 /* and vice versa */
4483 if(mdef->data == &mons[PM_STORMTROOPER] && magr->data == &mons[PM_JEDI])
4484 return ALLOW_M|ALLOW_TM;
4485 if(magr->data == &mons[PM_LASER_STORMTROOPER] && mdef->data == &mons[PM_PADAWAN])
4486 return ALLOW_M|ALLOW_TM;
4487 /* and vice versa */
4488 if(mdef->data == &mons[PM_LASER_STORMTROOPER] && magr->data == &mons[PM_PADAWAN])
4489 return ALLOW_M|ALLOW_TM;
4490 /* Stormtroopers vs. Jedi */
4491 if(magr->data == &mons[PM_LASER_STORMTROOPER] && mdef->data == &mons[PM_JEDI])
4492 return ALLOW_M|ALLOW_TM;
4493 /* and vice versa */
4494 if(mdef->data == &mons[PM_LASER_STORMTROOPER] && magr->data == &mons[PM_JEDI])
4495 return ALLOW_M|ALLOW_TM;
4496 /* Jedi vs. Lord Sidious */
4497 if(magr->data == &mons[PM_LORD_SIDIOUS] && mdef->data == &mons[PM_JEDI])
4498 return ALLOW_M|ALLOW_TM;
4499 /* and vice versa */
4500 if(mdef->data == &mons[PM_LORD_SIDIOUS] && magr->data == &mons[PM_JEDI])
4501 return ALLOW_M|ALLOW_TM;
4503 /* the three stooges */
4504 if (mdef->data == &mons[PM_STOOGE_CURLY] && magr->data == &mons[PM_STOOGE_MOE])
4505 return ALLOW_M|ALLOW_TM;
4506 if (mdef->data == &mons[PM_STOOGE_CURLY] && magr->data == &mons[PM_STOOGE_LARRY])
4507 return ALLOW_M|ALLOW_TM;
4508 if (mdef->data == &mons[PM_STOOGE_MOE] && magr->data == &mons[PM_STOOGE_LARRY])
4509 return ALLOW_M|ALLOW_TM;
4510 if (mdef->data == &mons[PM_STOOGE_MOE] && magr->data == &mons[PM_STOOGE_CURLY])
4511 return ALLOW_M|ALLOW_TM;
4512 if (mdef->data == &mons[PM_STOOGE_LARRY] && magr->data == &mons[PM_STOOGE_CURLY])
4513 return ALLOW_M|ALLOW_TM;
4514 if (mdef->data == &mons[PM_STOOGE_LARRY] && magr->data == &mons[PM_STOOGE_MOE])
4515 return ALLOW_M|ALLOW_TM;
4517 return 0L;
4520 boolean
4521 monnear(mon, x, y)
4522 register struct monst *mon;
4523 register int x,y;
4524 /* Is the square close enough for the monster to move or attack into? */
4526 register int distance = dist2(mon->mx, mon->my, x, y);
4527 if (distance==2 && ( isgridbug(mon->data) || (uwep && uwep->oartifact == ART_EGRID_BUG && mon->data->mlet == S_XAN) || (uarmf && !rn2(10) && itemhasappearance(uarmf, APP_CHESS_BOOTS) ) ) ) return 0;
4528 return((boolean)(distance < 3));
4531 /* really free dead monsters */
4532 void
4533 dmonsfree()
4535 struct monst **mtmp;
4536 int count = 0;
4538 for (mtmp = &fmon; *mtmp;) {
4539 if ((*mtmp)->mhp <= 0) {
4540 struct monst *freetmp = *mtmp;
4541 *mtmp = (*mtmp)->nmon;
4542 dealloc_monst(freetmp);
4543 count++;
4544 } else
4545 mtmp = &(*mtmp)->nmon;
4548 if (count != iflags.purge_monsters)
4549 impossible("dmonsfree: %d removed doesn't match %d pending",
4550 count, iflags.purge_monsters);
4551 iflags.purge_monsters = 0;
4554 #endif /* OVL1 */
4555 #ifdef OVLB
4557 /* called when monster is moved to larger structure */
4558 void
4559 replmon(mtmp, mtmp2)
4560 register struct monst *mtmp, *mtmp2;
4562 struct obj *otmp;
4563 long unpolytime; /* WAC */
4565 /* transfer the monster's inventory */
4566 for (otmp = mtmp2->minvent; otmp; otmp = otmp->nobj) {
4567 #ifdef DEBUG
4568 if (otmp->where != OBJ_MINVENT || otmp->ocarry != mtmp)
4569 panic("replmon: minvent inconsistency");
4570 #endif
4571 otmp->ocarry = mtmp2;
4573 mtmp->minvent = 0;
4575 /* remove the old monster from the map and from `fmon' list */
4576 relmon(mtmp);
4578 /* finish adding its replacement */
4579 if (mtmp == u.usteed) ; else /* don't place steed onto the map */
4580 place_monster(mtmp2, mtmp2->mx, mtmp2->my);
4581 if (mtmp2->wormno) /* update level.monsters[wseg->wx][wseg->wy] */
4582 place_wsegs(mtmp2); /* locations to mtmp2 not mtmp. */
4583 if (emits_light(mtmp2->data)) {
4584 /* since this is so rare, we don't have any `mon_move_light_source' */
4585 new_light_source(mtmp2->mx, mtmp2->my,
4586 emits_light(mtmp2->data),
4587 LS_MONSTER, (void *)mtmp2);
4588 /* here we rely on the fact that `mtmp' hasn't actually been deleted */
4589 del_light_source(LS_MONSTER, (void *)mtmp);
4591 /* If poly'ed, move polytimer along */
4592 if (unpolytime = (stop_timer(UNPOLY_MON, (void *) mtmp))) {
4593 (void) start_timer(unpolytime, TIMER_MONSTER, UNPOLY_MON,
4594 (void *) mtmp2);
4596 mtmp2->nmon = fmon;
4597 fmon = mtmp2;
4598 if (u.ustuck == mtmp) setustuck(mtmp2);
4599 if (u.usteed == mtmp) u.usteed = mtmp2;
4600 if (mtmp2->isshk) replshk(mtmp,mtmp2);
4602 /* discard the old monster */
4603 dealloc_monst(mtmp);
4606 /* release mon from display and monster list */
4607 void
4608 relmon(mon)
4609 register struct monst *mon;
4611 register struct monst *mtmp;
4613 if (fmon == (struct monst *)0) panic ("relmon: no fmon available.");
4615 remove_monster(mon->mx, mon->my);
4617 if(mon == fmon) fmon = fmon->nmon;
4618 else {
4619 for(mtmp = fmon; mtmp && mtmp->nmon != mon; mtmp = mtmp->nmon) ;
4620 if(mtmp) mtmp->nmon = mon->nmon;
4621 else panic("relmon: mon not in list.");
4625 /* remove effects of mtmp from other data structures */
4626 STATIC_OVL void
4627 m_detach(mtmp, mptr)
4628 struct monst *mtmp;
4629 struct permonst *mptr; /* reflects mtmp->data _prior_ to mtmp's death */
4631 mon_stop_timers(mtmp);
4632 if (mtmp->mleashed) m_unleash(mtmp, FALSE);
4633 /* to prevent an infinite relobj-flooreffects-hmon-killed loop */
4634 mtmp->mtrapped = 0;
4635 mtmp->mhp = 0; /* simplify some tests: force mhp to 0 */
4636 if (mtmp->iswiz) wizdead();
4637 if (mtmp->data->msound == MS_NEMESIS && mtmp->mnum >= PM_LORD_CARNARVON && mtmp->mnum <= PM_UPPER_BULL) nemdead();
4638 relobj(mtmp, 0, FALSE);
4639 remove_monster(mtmp->mx, mtmp->my);
4640 if (emits_light(mptr))
4641 del_light_source(LS_MONSTER, (void *)mtmp);
4642 newsym(mtmp->mx,mtmp->my);
4643 unstuck(mtmp);
4644 fill_pit(mtmp->mx, mtmp->my);
4646 if(mtmp->isshk) shkgone(mtmp);
4647 if(mtmp->wormno) wormgone(mtmp);
4648 iflags.purge_monsters++;
4651 /* find the worn amulet of life saving which will save a monster */
4652 struct obj *
4653 mlifesaver(mon)
4654 struct monst *mon;
4656 /*if (!nonliving(mon->data)) {*/
4657 struct obj *otmp = which_armor(mon, W_AMUL);
4659 if (otmp && otmp->otyp == AMULET_OF_MONSTER_SAVING)
4660 return otmp;
4661 /*}*/
4662 return (struct obj *)0;
4665 STATIC_OVL void
4666 lifesaved_monster(mtmp)
4667 struct monst *mtmp;
4669 int visible;
4670 struct obj *lifesave = mlifesaver(mtmp);
4672 if ((mtmp->egotype_amberite || is_amberite(mtmp->data)) && !mvitals[PM_THE_WITCH_KING_OF_ANGMAR].died) {
4673 visible = u.uswallow && u.ustuck == mtmp || cansee(mtmp->mx, mtmp->my);
4674 if (visible) {
4675 pline("But wait...");
4676 pline("%s is unkillable as long as the Witch-King of Angmar is still alive!", Monnam(mtmp));
4677 if (attacktype(mtmp->data, AT_EXPL) || attacktype(mtmp->data, AT_BOOM))
4678 pline("%s reconstitutes!", Monnam(mtmp));
4679 else
4680 pline("%s looks much better!", Monnam(mtmp));
4682 mtmp->mcanmove = 1;
4683 mtmp->masleep = 0;
4684 mtmp->mfrozen = 0;
4685 if (mtmp->mtame) { /* if tame (specifically), frenzy them, otherwise just turn them hostile --Amy */
4686 mtmp->mtame = FALSE;
4687 mtmp->mpeaceful = FALSE;
4688 mtmp->mfrenzied = TRUE;
4689 } else if (mtmp->mpeaceful) mtmp->mpeaceful = FALSE;
4690 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4691 mtmp->mhp = mtmp->mhpmax;
4692 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4693 if (visible)
4694 pline("Unfortunately %s is still genocided...",
4695 mon_nam(mtmp));
4696 } else
4697 return;
4699 } else if (lifesave) {
4700 /* not canseemon; amulets are on the head, so you don't want */
4701 /* to show this for a long worm with only a tail visible. */
4702 /* Nor do you check invisibility, because glowing and disinte- */
4703 /* grating amulets are always visible. */
4704 /* [ALI] Always treat swallower as visible for consistency */
4705 /* with unpoly_monster(). */
4706 visible = u.uswallow && u.ustuck == mtmp ||
4707 cansee(mtmp->mx, mtmp->my);
4708 if (visible) {
4709 pline("But wait...");
4710 pline("%s medallion begins to glow!",
4711 s_suffix(Monnam(mtmp)));
4712 makeknown(AMULET_OF_MONSTER_SAVING);
4713 if (attacktype(mtmp->data, AT_EXPL)
4714 || attacktype(mtmp->data, AT_BOOM))
4715 pline("%s reconstitutes!", Monnam(mtmp));
4716 else
4717 pline("%s looks much better!", Monnam(mtmp));
4718 pline_The("medallion crumbles to dust!");
4720 if (!mtmp->mpeaceful && !mtmp->mtame && lifesave && lifesave->oartifact != ART_NYEHEHEHEHE_) m_useup(mtmp, lifesave);
4721 mtmp->mcanmove = 1;
4722 mtmp->masleep = 0;
4723 mtmp->mfrozen = 0;
4724 if (mtmp->mtame && !mtmp->isminion) {
4725 wary_dog(mtmp, FALSE);
4727 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4728 mtmp->mhp = mtmp->mhpmax;
4729 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4730 if (visible)
4731 pline("Unfortunately %s is still genocided...",
4732 mon_nam(mtmp));
4733 } else
4734 return;
4735 } else if (mtmp->egotype_lifesaver && rn2(5) ) {
4736 visible = u.uswallow && u.ustuck == mtmp ||
4737 cansee(mtmp->mx, mtmp->my);
4738 if (visible) {
4739 pline("But wait...");
4740 pline("%s lifesaves!", Monnam(mtmp));
4741 if (attacktype(mtmp->data, AT_EXPL)
4742 || attacktype(mtmp->data, AT_BOOM))
4743 pline("%s reconstitutes!", Monnam(mtmp));
4744 else
4745 pline("%s looks much better!", Monnam(mtmp));
4747 mtmp->mcanmove = 1;
4748 mtmp->masleep = 0;
4749 mtmp->mfrozen = 0;
4750 if (mtmp->mtame && !mtmp->isminion) {
4751 wary_dog(mtmp, FALSE);
4753 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4754 mtmp->mhp = mtmp->mhpmax;
4755 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4756 if (visible)
4757 pline("Unfortunately %s is still genocided...",
4758 mon_nam(mtmp));
4759 } else
4760 return;
4762 } else if ((mtmp->data == &mons[PM_IMMORTAL_MYSTIC_SCARAB] || mtmp->data == &mons[PM_WRONG_DECISION_MEETING_COURT] || mtmp->data == &mons[PM_ORICHAL_CO]) && rn2(5) ) {
4763 visible = u.uswallow && u.ustuck == mtmp ||
4764 cansee(mtmp->mx, mtmp->my);
4765 if (visible) {
4766 pline("But wait...");
4767 pline("%s lifesaves!", Monnam(mtmp));
4768 if (attacktype(mtmp->data, AT_EXPL)
4769 || attacktype(mtmp->data, AT_BOOM))
4770 pline("%s reconstitutes!", Monnam(mtmp));
4771 else
4772 pline("%s looks much better!", Monnam(mtmp));
4774 mtmp->mcanmove = 1;
4775 mtmp->masleep = 0;
4776 mtmp->mfrozen = 0;
4777 if (mtmp->mtame && !mtmp->isminion) {
4778 wary_dog(mtmp, FALSE);
4780 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4781 mtmp->mhp = mtmp->mhpmax;
4782 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4783 if (visible)
4784 pline("Unfortunately %s is still genocided...",
4785 mon_nam(mtmp));
4786 } else
4787 return;
4789 } else if (FemtrapActiveMarike && rn2(SuperFemtrapMarike ? 5 : 2) && !mtmp->mpeaceful && (mtmp->data->msound == MS_FART_NORMAL || mtmp->data->msound == MS_FART_QUIET || mtmp->data->msound == MS_FART_LOUD)) {
4790 visible = u.uswallow && u.ustuck == mtmp ||
4791 cansee(mtmp->mx, mtmp->my);
4792 if (visible) {
4793 pline("But wait...");
4794 pline("%s doesn't want to stop farting!", Monnam(mtmp));
4795 if (attacktype(mtmp->data, AT_EXPL)
4796 || attacktype(mtmp->data, AT_BOOM))
4797 pline("%s reconstitutes!", Monnam(mtmp));
4798 else
4799 pline("%s looks much better!", Monnam(mtmp));
4801 mtmp->mcanmove = 1;
4802 mtmp->masleep = 0;
4803 mtmp->mfrozen = 0;
4804 if (mtmp->mtame && !mtmp->isminion) {
4805 wary_dog(mtmp, FALSE);
4807 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4808 mtmp->mhp = mtmp->mhpmax;
4809 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4810 if (visible)
4811 pline("Unfortunately %s is still genocided...",
4812 mon_nam(mtmp));
4813 } else
4814 return;
4817 } else if (!rn2(5) && !mtmp->mpeaceful && (LifeSavingBug || u.uprops[LIFE_SAVING_BUG].extrinsic || have_lifesavingstone()) ) {
4818 visible = u.uswallow && u.ustuck == mtmp ||
4819 cansee(mtmp->mx, mtmp->my);
4820 if (visible) {
4821 pline("But wait...");
4822 pline("%s lifesaves!", Monnam(mtmp));
4823 if (attacktype(mtmp->data, AT_EXPL)
4824 || attacktype(mtmp->data, AT_BOOM))
4825 pline("%s reconstitutes!", Monnam(mtmp));
4826 else
4827 pline("%s looks much better!", Monnam(mtmp));
4829 mtmp->mcanmove = 1;
4830 mtmp->masleep = 0;
4831 mtmp->mfrozen = 0;
4832 if (mtmp->mtame && !mtmp->isminion) {
4833 wary_dog(mtmp, FALSE);
4835 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4836 mtmp->mhp = mtmp->mhpmax;
4837 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4838 if (visible)
4839 pline("Unfortunately %s is still genocided...",
4840 mon_nam(mtmp));
4841 } else
4842 return;
4844 } else if (!rn2(2) && !mtmp->mpeaceful && mtmp->data->mlet == S_VAMPIRE && uarmf && uarmf->oartifact == ART_VARIANTISH_DESIGN ) {
4845 visible = u.uswallow && u.ustuck == mtmp ||
4846 cansee(mtmp->mx, mtmp->my);
4847 if (visible) {
4848 pline("But wait...");
4849 pline("%s laughs all the time, and is back at full health instead of dying!", Monnam(mtmp));
4850 if (attacktype(mtmp->data, AT_EXPL)
4851 || attacktype(mtmp->data, AT_BOOM))
4852 pline("%s reconstitutes!", Monnam(mtmp));
4853 else
4854 pline("%s looks much better!", Monnam(mtmp));
4856 mtmp->mcanmove = 1;
4857 mtmp->masleep = 0;
4858 mtmp->mfrozen = 0;
4859 if (mtmp->mtame && !mtmp->isminion) {
4860 wary_dog(mtmp, FALSE);
4862 if (mtmp->mhpmax <= 0) mtmp->mhpmax = 10;
4863 mtmp->mhp = mtmp->mhpmax;
4864 if (mvitals[monsndx(mtmp->data)].mvflags & G_GENOD) {
4865 if (visible)
4866 pline("Unfortunately %s is still genocided...",
4867 mon_nam(mtmp));
4868 } else
4869 return;
4872 mtmp->mhp = 0;
4875 /* WAC -- undo polymorph */
4876 static void
4877 unpoly_monster(mtmp)
4878 struct monst *mtmp;
4880 int visible;
4881 char buf[BUFSZ];
4883 sprintf(buf, "%s", Monnam(mtmp));
4885 /* If there is a timer == monster was poly'ed */
4886 if (stop_timer(UNPOLY_MON, (void *) mtmp)) {
4887 /* [ALI] Always treat swallower as visible so that the message
4888 * indicating that the monster hasn't died comes _before_ any
4889 * message about breaking out of the "new" monster.
4891 visible = u.uswallow && u.ustuck == mtmp || cansee(mtmp->mx,mtmp->my);
4892 mtmp->mhp = mtmp->mhpmax;
4893 if (visible)
4894 pline("But wait...");
4895 if ((newcham(mtmp, &mons[mtmp->oldmonnm], FALSE, visible)) && rn2(25))
4896 mtmp->mhp = mtmp->mhpmax/2; /* 4% risk of the unpolymorph killing the monster. --Amy */
4897 else {
4898 if (visible)
4899 pline("%s shudders!", Monnam(mtmp));
4900 mtmp->mhp = 0;
4905 void
4906 mondead(mtmp)
4907 register struct monst *mtmp;
4909 struct permonst *mptr;
4910 int tmp;
4911 int copcnt; /* Angry shopkeepers and guards will send in the police and sephirah! --Amy */
4912 int tryct = 0;
4913 int x, y;
4914 int rtrap;
4915 register struct obj *trophy;
4917 /* WAC just in case caller forgot to...*/
4918 if (mtmp->mhp) mtmp->mhp = -1;
4920 if (mtmp->isshk && !strncmpi(shkname(mtmp), "Izchak", 6) ) { /* Thou must not kill Izchak or allow him to die. --Amy */
4922 adjalign(-500);
4923 change_luck(-10);
4924 You_feel("the air around you grow charged...");
4925 pline("Suddenly, you realize that %s has noticed you...", u_gname());
4926 /* Throw everything we have at the player */
4927 u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++;
4928 prayer_done();
4929 god_zaps_you(u.ualign.type);
4932 if (mtmp->handytime) {
4933 increasesincounter(3);
4934 u.alignlim -= 3;
4935 adjalign(-100);
4936 change_luck(-3);
4937 You("allowed someone who was on the phone to die! The gods certainly aren't very pleased.");
4940 if (uarmh && uarmh->oartifact == ART_SUDUNSEL) mtmp->mgold = 0;
4942 mtmp->flagged_for_death = FALSE;
4944 if(mtmp->isgd) {
4945 /* if we're going to abort the death, it *must* be before
4946 * the m_detach or there will be relmon problems later */
4947 if(!grddead(mtmp)) return;
4950 mptr = mtmp->data;
4952 /* WAC First check that monster can unpoly */
4953 unpoly_monster(mtmp);
4954 if (mtmp->mhp > 0) return;
4956 lifesaved_monster(mtmp);
4957 if (mtmp->mhp > 0) return;
4959 /* Player is thrown from his steed when it dies */
4960 if (mtmp == u.usteed)
4961 dismount_steed(DISMOUNT_GENERIC);
4963 mptr = mtmp->data; /* save this for m_detach() */
4964 /* restore chameleon, lycanthropes to true form at death */
4965 if (mtmp->cham)
4966 set_mon_data(mtmp, &mons[cham_to_pm[mtmp->cham]], -1);
4967 else if (mtmp->data == &mons[PM_WEREJACKAL])
4968 set_mon_data(mtmp, &mons[PM_HUMAN_WEREJACKAL], -1);
4969 else if (mtmp->data == &mons[PM_WEREWOLF])
4970 set_mon_data(mtmp, &mons[PM_HUMAN_WEREWOLF], -1);
4971 else if (mtmp->data == &mons[PM_WERERAT])
4972 set_mon_data(mtmp, &mons[PM_HUMAN_WERERAT], -1);
4973 else if (mtmp->data == &mons[PM_WERERABBIT])
4974 set_mon_data(mtmp, &mons[PM_HUMAN_WERERABBIT], -1);
4975 else if (mtmp->data == &mons[PM_WEREBOAR])
4976 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBOAR], -1);
4977 else if (mtmp->data == &mons[PM_VORPAL_WERE_ALHOONTRICE_ZOMBIE])
4978 set_mon_data(mtmp, &mons[PM_HUMAN_VORPAL_WERE_ALHOONTRICE_ZOMBIE], -1);
4979 else if (mtmp->data == &mons[PM_WERELOCUST])
4980 set_mon_data(mtmp, &mons[PM_HUMAN_WERELOCUST], -1);
4981 else if (mtmp->data == &mons[PM_WEREPANTHER])
4982 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPANTHER], -1);
4983 else if (mtmp->data == &mons[PM_WERETIGER])
4984 set_mon_data(mtmp, &mons[PM_HUMAN_WERETIGER], -1);
4985 else if (mtmp->data == &mons[PM_WERESNAKE])
4986 set_mon_data(mtmp, &mons[PM_HUMAN_WERESNAKE], -1);
4987 else if (mtmp->data == &mons[PM_WERESPIDER])
4988 set_mon_data(mtmp, &mons[PM_HUMAN_WERESPIDER], -1);
4989 else if (mtmp->data == &mons[PM_WEREGIANT])
4990 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGIANT], -1);
4991 else if (mtmp->data == &mons[PM_WERELICHEN])
4992 set_mon_data(mtmp, &mons[PM_HUMAN_WERELICHEN], -1);
4993 else if (mtmp->data == &mons[PM_WEREVORTEX])
4994 set_mon_data(mtmp, &mons[PM_HUMAN_WEREVORTEX], -1);
4995 else if (mtmp->data == &mons[PM_WERECOW])
4996 set_mon_data(mtmp, &mons[PM_HUMAN_WERECOW], -1);
4997 else if (mtmp->data == &mons[PM_WEREBEAR])
4998 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBEAR], -1);
4999 else if (mtmp->data == &mons[PM_WEREBRONZEGRAM])
5000 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBRONZEGRAM], -1);
5001 else if (mtmp->data == &mons[PM_WERECHROMEGRAM])
5002 set_mon_data(mtmp, &mons[PM_HUMAN_WERECHROMEGRAM], -1);
5003 else if (mtmp->data == &mons[PM_WEREDEMON])
5004 set_mon_data(mtmp, &mons[PM_HUMAN_WEREDEMON], -1);
5005 else if (mtmp->data == &mons[PM_WEREPHANT])
5006 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPHANT], -1);
5007 else if (mtmp->data == &mons[PM_WEREPIERCER])
5008 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPIERCER], -1);
5009 else if (mtmp->data == &mons[PM_WEREPENETRATOR])
5010 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPENETRATOR], -1);
5011 else if (mtmp->data == &mons[PM_WERESMASHER])
5012 set_mon_data(mtmp, &mons[PM_HUMAN_WERESMASHER], -1);
5013 else if (mtmp->data == &mons[PM_WERENYMPH])
5014 set_mon_data(mtmp, &mons[PM_HUMAN_WERENYMPH], -1);
5015 else if (mtmp->data == &mons[PM_WEREBEE])
5016 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBEE], -1);
5017 else if (mtmp->data == &mons[PM_WEREMIMIC])
5018 set_mon_data(mtmp, &mons[PM_HUMAN_WEREMIMIC], -1);
5019 else if (mtmp->data == &mons[PM_WEREPERMAMIMIC])
5020 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPERMAMIMIC], -1);
5021 else if (mtmp->data == &mons[PM_WERECOCKATRICE])
5022 set_mon_data(mtmp, &mons[PM_HUMAN_WERECOCKATRICE], -1);
5023 else if (mtmp->data == &mons[PM_WERESOLDIERANT])
5024 set_mon_data(mtmp, &mons[PM_HUMAN_WERESOLDIERANT], -1);
5025 else if (mtmp->data == &mons[PM_WERETROLL])
5026 set_mon_data(mtmp, &mons[PM_HUMAN_WERETROLL], -1);
5027 else if (mtmp->data == &mons[PM_WEREBAT])
5028 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBAT], -1);
5029 else if (mtmp->data == &mons[PM_WEREMINDFLAYER])
5030 set_mon_data(mtmp, &mons[PM_HUMAN_WEREMINDFLAYER], -1);
5031 else if (mtmp->data == &mons[PM_WEREGHOST])
5032 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGHOST], -1);
5033 else if (mtmp->data == &mons[PM_WEREPIRANHA])
5034 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPIRANHA], -1);
5035 else if (mtmp->data == &mons[PM_WEREEEL])
5036 set_mon_data(mtmp, &mons[PM_HUMAN_WEREEEL], -1);
5037 else if (mtmp->data == &mons[PM_WEREFLYFISH])
5038 set_mon_data(mtmp, &mons[PM_HUMAN_WEREFLYFISH], -1);
5039 else if (mtmp->data == &mons[PM_WEREKRAKEN])
5040 set_mon_data(mtmp, &mons[PM_HUMAN_WEREKRAKEN], -1);
5041 else if (mtmp->data == &mons[PM_WERELICH])
5042 set_mon_data(mtmp, &mons[PM_HUMAN_WERELICH], -1);
5043 else if (mtmp->data == &mons[PM_WEREJABBERWOCK])
5044 set_mon_data(mtmp, &mons[PM_HUMAN_WEREJABBERWOCK], -1);
5045 else if (mtmp->data == &mons[PM_WEREGRIDBUG])
5046 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGRIDBUG], -1);
5047 else if (mtmp->data == &mons[PM_WEREACIDBLOB])
5048 set_mon_data(mtmp, &mons[PM_HUMAN_WEREACIDBLOB], -1);
5049 else if (mtmp->data == &mons[PM_WEREFOX])
5050 set_mon_data(mtmp, &mons[PM_HUMAN_WEREFOX], -1);
5051 else if (mtmp->data == &mons[PM_WEREMONKEY])
5052 set_mon_data(mtmp, &mons[PM_HUMAN_WEREMONKEY], -1);
5053 else if (mtmp->data == &mons[PM_WEREFLOATINGEYE])
5054 set_mon_data(mtmp, &mons[PM_HUMAN_WEREFLOATINGEYE], -1);
5055 else if (mtmp->data == &mons[PM_WEREGIANTANT])
5056 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGIANTANT], -1);
5057 else if (mtmp->data == &mons[PM_WEREKOBOLD])
5058 set_mon_data(mtmp, &mons[PM_HUMAN_WEREKOBOLD], -1);
5059 else if (mtmp->data == &mons[PM_WERELEPRECHAUN])
5060 set_mon_data(mtmp, &mons[PM_HUMAN_WERELEPRECHAUN], -1);
5061 else if (mtmp->data == &mons[PM_WEREHORSE])
5062 set_mon_data(mtmp, &mons[PM_HUMAN_WEREHORSE], -1);
5063 else if (mtmp->data == &mons[PM_WERERUSTMONSTER])
5064 set_mon_data(mtmp, &mons[PM_HUMAN_WERERUSTMONSTER], -1);
5065 else if (mtmp->data == &mons[PM_WEREBLACKLIGHT])
5066 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBLACKLIGHT], -1);
5067 else if (mtmp->data == &mons[PM_WEREAUTON])
5068 set_mon_data(mtmp, &mons[PM_HUMAN_WEREAUTON], -1);
5069 else if (mtmp->data == &mons[PM_WEREGREMLIN])
5070 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGREMLIN], -1);
5071 else if (mtmp->data == &mons[PM_WEREGREENSLIME])
5072 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGREENSLIME], -1);
5073 else if (mtmp->data == &mons[PM_WEREJELLY])
5074 set_mon_data(mtmp, &mons[PM_HUMAN_WEREJELLY], -1);
5075 else if (mtmp->data == &mons[PM_WEREXAN])
5076 set_mon_data(mtmp, &mons[PM_HUMAN_WEREXAN], -1);
5077 else if (mtmp->data == &mons[PM_WEREMUMAK])
5078 set_mon_data(mtmp, &mons[PM_HUMAN_WEREMUMAK], -1);
5079 else if (mtmp->data == &mons[PM_WERECENTAUR])
5080 set_mon_data(mtmp, &mons[PM_HUMAN_WERECENTAUR], -1);
5081 else if (mtmp->data == &mons[PM_WERECOUATL])
5082 set_mon_data(mtmp, &mons[PM_HUMAN_WERECOUATL], -1);
5083 else if (mtmp->data == &mons[PM_WEREGELATINOUSCUBE])
5084 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGELATINOUSCUBE], -1);
5085 else if (mtmp->data == &mons[PM_WEREAIRELEMENTAL])
5086 set_mon_data(mtmp, &mons[PM_HUMAN_WEREAIRELEMENTAL], -1);
5087 else if (mtmp->data == &mons[PM_WEREEARTHELEMENTAL])
5088 set_mon_data(mtmp, &mons[PM_HUMAN_WEREEARTHELEMENTAL], -1);
5089 else if (mtmp->data == &mons[PM_WEREFIREELEMENTAL])
5090 set_mon_data(mtmp, &mons[PM_HUMAN_WEREFIREELEMENTAL], -1);
5091 else if (mtmp->data == &mons[PM_WEREWATERELEMENTAL])
5092 set_mon_data(mtmp, &mons[PM_HUMAN_WEREWATERELEMENTAL], -1);
5093 else if (mtmp->data == &mons[PM_WEREASTRALELEMENTAL])
5094 set_mon_data(mtmp, &mons[PM_HUMAN_WEREASTRALELEMENTAL], -1);
5095 else if (mtmp->data == &mons[PM_WEREXORN])
5096 set_mon_data(mtmp, &mons[PM_HUMAN_WEREXORN], -1);
5097 else if (mtmp->data == &mons[PM_WERESTALKER])
5098 set_mon_data(mtmp, &mons[PM_HUMAN_WERESTALKER], -1);
5099 else if (mtmp->data == &mons[PM_WEREDRACONIAN])
5100 set_mon_data(mtmp, &mons[PM_HUMAN_WEREDRACONIAN], -1);
5101 else if (mtmp->data == &mons[PM_WEREUMBERHULK])
5102 set_mon_data(mtmp, &mons[PM_HUMAN_WEREUMBERHULK], -1);
5103 else if (mtmp->data == &mons[PM_WEREVAMPIRE])
5104 set_mon_data(mtmp, &mons[PM_HUMAN_WEREVAMPIRE], -1);
5105 else if (mtmp->data == &mons[PM_WEREKILLERBEE])
5106 set_mon_data(mtmp, &mons[PM_HUMAN_WEREKILLERBEE], -1);
5107 else if (mtmp->data == &mons[PM_WEREKANGAROO])
5108 set_mon_data(mtmp, &mons[PM_HUMAN_WEREKANGAROO], -1);
5109 else if (mtmp->data == &mons[PM_WEREGRUE])
5110 set_mon_data(mtmp, &mons[PM_HUMAN_WEREGRUE], -1);
5111 else if (mtmp->data == &mons[PM_WERECOINS])
5112 set_mon_data(mtmp, &mons[PM_HUMAN_WERECOINS], -1);
5113 else if (mtmp->data == &mons[PM_WERETRAPPER])
5114 set_mon_data(mtmp, &mons[PM_HUMAN_WERETRAPPER], -1);
5115 else if (mtmp->data == &mons[PM_WERESHADE])
5116 set_mon_data(mtmp, &mons[PM_HUMAN_WERESHADE], -1);
5117 else if (mtmp->data == &mons[PM_WEREDISENCHANTER])
5118 set_mon_data(mtmp, &mons[PM_HUMAN_WEREDISENCHANTER], -1);
5119 else if (mtmp->data == &mons[PM_WERENAGA])
5120 set_mon_data(mtmp, &mons[PM_HUMAN_WERENAGA], -1);
5121 else if (mtmp->data == &mons[PM_WEREWORM])
5122 set_mon_data(mtmp, &mons[PM_HUMAN_WEREWORM], -1);
5123 else if (mtmp->data == &mons[PM_WEREDRAGON])
5124 set_mon_data(mtmp, &mons[PM_HUMAN_WEREDRAGON], -1);
5125 else if (mtmp->data == &mons[PM_WEREWEDGESANDAL])
5126 set_mon_data(mtmp, &mons[PM_HUMAN_WEREWEDGESANDAL], -1);
5127 else if (mtmp->data == &mons[PM_WEREHUGGINGBOOT])
5128 set_mon_data(mtmp, &mons[PM_HUMAN_WEREHUGGINGBOOT], -1);
5129 else if (mtmp->data == &mons[PM_WEREPEEPTOE])
5130 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPEEPTOE], -1);
5131 else if (mtmp->data == &mons[PM_WERESEXYLEATHERPUMP])
5132 set_mon_data(mtmp, &mons[PM_HUMAN_WERESEXYLEATHERPUMP], -1);
5133 else if (mtmp->data == &mons[PM_WEREBLOCKHEELEDCOMBATBOOT])
5134 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBLOCKHEELEDCOMBATBOOT], -1);
5135 else if (mtmp->data == &mons[PM_WERECOMBATSTILETTO])
5136 set_mon_data(mtmp, &mons[PM_HUMAN_WERECOMBATSTILETTO], -1);
5137 else if (mtmp->data == &mons[PM_WEREBEAUTIFULFUNNELHEELEDPUMP])
5138 set_mon_data(mtmp, &mons[PM_HUMAN_WEREBEAUTIFULFUNNELHEELEDPUMP], -1);
5139 else if (mtmp->data == &mons[PM_WEREPROSTITUTESHOE])
5140 set_mon_data(mtmp, &mons[PM_HUMAN_WEREPROSTITUTESHOE], -1);
5141 else if (mtmp->data == &mons[PM_WERESTILETTOSANDAL])
5142 set_mon_data(mtmp, &mons[PM_HUMAN_WERESTILETTOSANDAL], -1);
5143 else if (mtmp->data == &mons[PM_WEREUNFAIRSTILETTO])
5144 set_mon_data(mtmp, &mons[PM_HUMAN_WEREUNFAIRSTILETTO], -1);
5145 else if (mtmp->data == &mons[PM_WEREWINTERSTILETTO])
5146 set_mon_data(mtmp, &mons[PM_HUMAN_WEREWINTERSTILETTO], -1);
5148 /* if MAXMONNO monsters of a given type have died, and it
5149 * can be done, extinguish that monster.
5151 * mvitals[].died does double duty as total number of dead monsters
5152 * and as experience factor for the player killing more monsters.
5153 * this means that a dragon dying by other means reduces the
5154 * experience the player gets for killing a dragon directly; this
5155 * is probably not too bad, since the player likely finagled the
5156 * first dead dragon via ring of conflict or pets, and extinguishing
5157 * based on only player kills probably opens more avenues of abuse
5158 * for rings of conflict and such.
5160 /* KMH -- Yes, keep spell monsters in the count */
5161 tmp = monsndx(mtmp->data);
5163 if (tmp == PM_BLACKY) {
5164 if (wizard) pline("Blacky died!");
5165 BlackNgWalls = 0L;
5168 if (tmp == PM_DOUBLE_AURORA_BOMBER) {
5169 getnastytrapintrinsic();
5172 if (tmp == PM_VAILABLE__EXIT_ANYWAY_) {
5173 NastinessProblem += 100000;
5176 if (tmp == PM_SLICK_RUEA) {
5177 int nastytrapdur = (Role_if(PM_GRADUATE) ? 60 : Role_if(PM_GEEK) ? 120 : 240);
5178 if (!nastytrapdur) nastytrapdur = 240; /* fail safe */
5179 int blackngdur = (Role_if(PM_GRADUATE) ? 2000 : Role_if(PM_GEEK) ? 1000 : 500);
5180 if (!blackngdur ) blackngdur = 500; /* fail safe */
5182 randomnastytrapeffect(rnz(nastytrapdur * (monster_difficulty() + 1)), blackngdur - (monster_difficulty() * 3));
5183 randomnastytrapeffect(rnz(nastytrapdur * (monster_difficulty() + 1)), blackngdur - (monster_difficulty() * 3));
5184 randomnastytrapeffect(rnz(nastytrapdur * (monster_difficulty() + 1)), blackngdur - (monster_difficulty() * 3));
5188 if (tmp == PM_SHEER_SPACER) {
5189 make_frozen(HFrozen + rnz(1000),FALSE);
5190 if (HFrozen > 0) set_itimeout(&HeavyFrozen, HFrozen);
5193 if (tmp == PM_BULLETATOR_ZERO) {
5194 randomfeminismtrap(rnz( (level_difficulty() + 2) * rnd(50)));
5197 if (tmp == PM_MOLDOUX__THE_DEFENCELESS_MOLD) {
5198 pline("This monster was under the protection of a Great Wyrm of Power!");
5199 verbalize("Harharhar mortal, now you DIE!!!");
5200 (void) makemon(&mons[PM_GREAT_WYRM_OF_POWER], u.ux, u.uy, MM_ANGRY|MM_FRENZIED|MM_XFRENZIED);
5203 if (tmp == PM_ARIANE_S_FLEECY_COMBAT_BOOT) {
5204 pline("This monster was under the protection of a Great Wyrm of Power!");
5205 verbalize("Harharhar mortal, now you DIE!!!");
5206 (void) makemon(&mons[PM_GREAT_WYRM_OF_POWER], u.ux, u.uy, MM_ANGRY|MM_FRENZIED|MM_XFRENZIED);
5209 if (tmp == PM_GUDRUN_THE_FEMINIST) {
5210 if (u.gudrunspawncount > 0) {
5211 u.gudrunspawncount--;
5212 verbalize("Ahh... how did you do that... guess you're not as weak as you look, %s... alright, as a reward I'll allow you to train a skill of your choice.", playeraliasname);
5213 doubleskilltraining();
5217 if (tmp == PM_ELLA_THE_FEMINIST) {
5218 if (u.ellaspawncount > 0) {
5219 u.ellaspawncount--;
5220 verbalize("This is impossible! %s, you cannot have defeated me! I... I will... *groan* oh well, here, you'll get your reward, but next time I'll bludgeon you for sure...", playeraliasname);
5222 int skillimprove = randomgoodskill();
5224 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5225 unrestrict_weapon_skill(skillimprove);
5226 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5227 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5228 unrestrict_weapon_skill(skillimprove);
5229 P_MAX_SKILL(skillimprove) = P_BASIC;
5230 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5231 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5232 P_MAX_SKILL(skillimprove) = P_SKILLED;
5233 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5234 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5235 P_MAX_SKILL(skillimprove) = P_EXPERT;
5236 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5237 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5238 P_MAX_SKILL(skillimprove) = P_MASTER;
5239 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5240 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5241 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5242 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5243 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5244 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5245 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5246 } else {
5247 adjattrib(rn2(A_MAX), 1, 0, TRUE);
5250 if (Race_if(PM_RUSMOT)) {
5251 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5252 unrestrict_weapon_skill(skillimprove);
5253 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5254 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5255 unrestrict_weapon_skill(skillimprove);
5256 P_MAX_SKILL(skillimprove) = P_BASIC;
5257 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5258 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5259 P_MAX_SKILL(skillimprove) = P_SKILLED;
5260 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5261 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5262 P_MAX_SKILL(skillimprove) = P_EXPERT;
5263 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5264 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5265 P_MAX_SKILL(skillimprove) = P_MASTER;
5266 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5267 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5268 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5269 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5270 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5271 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5272 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5273 } else {
5274 adjattrib(rn2(A_MAX), 1, 0, TRUE);
5282 if (tmp == PM_HIGHSCORE_DUMMY) {
5283 int highscoredummies = 5;
5284 while (highscoredummies > 0) {
5285 highscoredummies--;
5286 makespacewarstrap();
5287 (void) makemon(insidemon(), 0, 0, MM_ANGRY);
5288 wandoffleecyterrain();
5293 if (tmp == PM_GUNNHILD_S_GENERAL_STORE) { /* create traps on the level, disregarding special probability checks */
5295 while (rn2(25)) {
5297 boolean canbeinawall = FALSE;
5298 if (!rn2(Passes_walls ? 5 : 25)) canbeinawall = TRUE;
5300 for (tryct = 0; tryct < 2000; tryct++) {
5301 x = rn1(COLNO-3,2);
5302 y = rn2(ROWNO);
5304 if (isok(x, y) && ((levl[x][y].typ > DBWALL) || canbeinawall) && !(t_at(x, y)) ) {
5306 rtrap = rnd(TRAPNUM-1);
5307 if (rtrap == MAGIC_PORTAL) rtrap = ROCKTRAP;
5308 if (rtrap == S_PRESSING_TRAP) rtrap = ROCKTRAP;
5309 if (rtrap == WISHING_TRAP) rtrap = BLINDNESS_TRAP;
5310 if (In_sokoban(&u.uz) && rn2(10) && (rtrap == HOLE || rtrap == TRAPDOOR || rtrap == SHAFT_TRAP || rtrap == CURRENT_SHAFT || rtrap == PIT || rtrap == SPIKED_PIT || rtrap == GIANT_CHASM || rtrap == SHIT_PIT || rtrap == MANA_PIT || rtrap == ANOXIC_PIT || rtrap == HYPOXIC_PIT || rtrap == ACID_PIT)) rtrap = ROCKTRAP;
5311 if (In_sokoban(&u.uz) && rn2(100) && rtrap == NUPESELL_TRAP) rtrap = FIRE_TRAP;
5312 if (rtrap == ELDER_TENTACLING_TRAP) rtrap = FIRE_TRAP;
5313 if (rtrap == DATA_DELETE_TRAP) rtrap = RUST_TRAP;
5314 if (rtrap == ARTIFACT_JACKPOT_TRAP) rtrap = MAGIC_TRAP;
5315 if (rtrap == GOOD_ARTIFACT_TRAP) rtrap = WEB;
5316 if (rtrap == BOON_TRAP) rtrap = MAGIC_BEAM_TRAP;
5317 if (rtrap == LEVEL_TELEP && (level.flags.noteleport || Race_if(PM_STABILISATOR) || Is_knox(&u.uz) || Is_blackmarket(&u.uz) || Is_aligned_quest(&u.uz) || In_endgame(&u.uz) || In_sokoban(&u.uz) ) ) rtrap = ANTI_MAGIC;
5318 if (rtrap == LEVEL_BEAMER && (level.flags.noteleport || Race_if(PM_STABILISATOR) || Is_knox(&u.uz) || Is_blackmarket(&u.uz) || Is_aligned_quest(&u.uz) || In_endgame(&u.uz) || In_sokoban(&u.uz) ) ) rtrap = ANTI_MAGIC;
5319 if (rtrap == BRANCH_TELEPORTER && (level.flags.noteleport || Race_if(PM_STABILISATOR) || Is_knox(&u.uz) || Is_blackmarket(&u.uz) || Is_aligned_quest(&u.uz) || In_endgame(&u.uz) || In_sokoban(&u.uz) ) ) rtrap = ANTI_MAGIC;
5320 if (rtrap == BRANCH_BEAMER && (level.flags.noteleport || Race_if(PM_STABILISATOR) || Is_knox(&u.uz) || Is_blackmarket(&u.uz) || Is_aligned_quest(&u.uz) || In_endgame(&u.uz) || In_sokoban(&u.uz) ) ) rtrap = ANTI_MAGIC;
5321 if (rtrap == NEXUS_TRAP && (level.flags.noteleport || Race_if(PM_STABILISATOR) || Is_knox(&u.uz) || Is_blackmarket(&u.uz) || Is_aligned_quest(&u.uz) || In_endgame(&u.uz) || In_sokoban(&u.uz) ) ) rtrap = ANTI_MAGIC;
5322 if (rtrap == TELEP_TRAP && (level.flags.noteleport || Race_if(PM_STABILISATOR)) ) rtrap = SQKY_BOARD;
5323 if (rtrap == PHASEPORTER && (level.flags.noteleport || Race_if(PM_STABILISATOR)) ) rtrap = SQKY_BOARD;
5324 if (rtrap == PHASE_BEAMER && (level.flags.noteleport || Race_if(PM_STABILISATOR)) ) rtrap = SQKY_BOARD;
5325 if (rtrap == BEAMER_TRAP && (level.flags.noteleport || Race_if(PM_STABILISATOR)) ) rtrap = SQKY_BOARD;
5326 if ((rtrap == TRAPDOOR || rtrap == HOLE || rtrap == SHAFT_TRAP || rtrap == CURRENT_SHAFT) && !Can_fall_thru(&u.uz) && !Is_stronghold(&u.uz) ) rtrap = ROCKTRAP;
5327 if (rtrap == ACTIVE_SUPERSCROLLER_TRAP) rtrap = SUPERSCROLLER_TRAP;
5328 if (rtrap == AUTOMATIC_SWITCHER) rtrap = UNKNOWN_TRAP;
5330 (void) maketrap(x, y, rtrap, 100, FALSE);
5331 break;
5340 /* item masters and similar stuff shouldn't appear on the list so the player can't peek with ctrl-K! --Amy */
5341 if (mvitals[tmp].died < 9999999 && tmp != PM_ITEM_MASTER && tmp != PM_GOOD_ITEM_MASTER && tmp != PM_BAD_ITEM_MASTER && tmp != PM_SCROLLER_MASTER && tmp != PM_HOLE_MASTER && tmp != PM_BOULDER_MASTER && tmp != PM_TRAP_MASTER) mvitals[tmp].died++;
5343 /* if it's a (possibly polymorphed) quest leader, mark him as dead */
5344 if (mtmp->m_id == quest_status.leader_m_id)
5345 quest_status.leader_is_dead = TRUE;
5346 #ifdef MAIL
5347 /* if the mail daemon dies, no more mail delivery. -3. */
5348 if (tmp == PM_MAIL_DAEMON) mvitals[tmp].mvflags |= G_GENOD;
5349 #endif
5351 if (mtmp->data->mlet == S_KOP) {
5353 /* Dead Kops may come back. */
5354 switch(rnd( (uarmh && itemhasappearance(uarmh, APP_ANTI_GOVERNMENT_HELMET) ) ? 50 : RngeAntiGovernment ? 50 : 25)) {
5355 case 1: /* returns near the stairs */
5356 (void) makemon(mtmp->data,xdnstair,ydnstair,MM_ADJACENTOK);
5357 break;
5358 case 2: /* randomly */
5359 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5360 break;
5361 case 3: /* returns near the stairs */
5362 (void) makemon(mkclass(S_KOP,0),xdnstair,ydnstair,MM_ADJACENTOK);
5363 break;
5364 case 4: /* randomly */
5365 (void) makemon(mkclass(S_KOP,0),0,0,NO_MM_FLAGS);
5366 break;
5367 default:
5368 break;
5372 if (uarmf && uarmf->oartifact == ART_DESEAMING_GAME && !rn2(50) && !(mtmp->data->msound == MS_DEAD) && tmp != PM_UNFORTUNATE_VICTIM && tmp != PM_SCROLLER_MASTER && tmp != PM_BOULDER_MASTER && tmp != PM_ITEM_MASTER && tmp != PM_GOOD_ITEM_MASTER && tmp != PM_BAD_ITEM_MASTER && tmp != PM_HOLE_MASTER && tmp != PM_TRAP_MASTER && !(mtmp->data->geno & G_UNIQ) ) {
5374 int attempts = 0;
5375 struct permonst *pm = 0;
5377 if (Aggravate_monster) {
5378 u.aggravation = 1;
5379 reset_rndmonst(NON_PM);
5382 newbossSING:
5383 do {
5384 pm = rndmonst();
5385 attempts++;
5386 if (attempts && (attempts % 10000 == 0)) u.mondiffhack++;
5387 if (!rn2(2000)) reset_rndmonst(NON_PM);
5389 } while ( (!pm || (pm && !(pm->msound == MS_SHOE )) || (pm && !(type_is_pname(pm))) ) && attempts < 50000);
5391 if (!pm && rn2(50) ) {
5392 attempts = 0;
5393 goto newbossSING;
5395 if (pm && !(pm->msound == MS_SHOE) && rn2(50) ) {
5396 attempts = 0;
5397 goto newbossSING;
5399 if (pm && !(type_is_pname(pm)) && rn2(50) ) {
5400 attempts = 0;
5401 goto newbossSING;
5404 if (pm) {
5405 struct monst *singbitch;
5406 singbitch = makemon(pm, 0, 0, MM_ANGRY); /* not frenzied --Amy */
5407 if (singbitch) singbitch->singannoyance = TRUE;
5410 u.aggravation = 0;
5411 u.mondiffhack = 0;
5415 /* Respawn trap effect by Amy. Gotta limit it somehow, to ensure that the game doesn't become completely impossible
5416 * for characters who have the effect intrinsically. It used to be that the # of newly spawned monsters was
5417 * on average exactly the amount that you killed, which is very problematic for trolls and other revivers.
5418 * So, now the born counter (which can go over 255, yay!) matters and will make it less and less likely for
5419 * a monster to respawn if many of it were already spawned. Good thing this mechanism of monster "respawn" uses
5420 * a function that increases the counter, huh? */
5422 if ( (RespawnProblem || u.uprops[RESPAWN_BUG].extrinsic || (uimplant && uimplant->oartifact == ART_YOU_SHOULD_SURRENDER) || autismweaponcheck(ART_HOL_ON_MAN) || (uarmc && uarmc->oartifact == ART_PERCENTIOEOEPSPERCENTD_THI) || have_respawnstone() || (uarm && uarm->oartifact == ART_BECAUSE_YOU_LOSE) ) && !(mtmp->data->msound == MS_DEAD) && tmp != PM_UNFORTUNATE_VICTIM && tmp != PM_SCROLLER_MASTER && tmp != PM_BOULDER_MASTER && tmp != PM_ITEM_MASTER && tmp != PM_GOOD_ITEM_MASTER && tmp != PM_BAD_ITEM_MASTER && tmp != PM_HOLE_MASTER && tmp != PM_TRAP_MASTER && !(mtmp->data->geno & G_UNIQ) ) {
5423 switch(rnd(10)) {
5424 case 1:
5425 if (mvitals[mtmp->mnum].born > 100 && rn2(10)) break;
5426 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5427 break;
5428 case 2:
5429 if (mvitals[mtmp->mnum].born > 200 && rn2(10)) break;
5430 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5431 break;
5432 case 3:
5433 if (mvitals[mtmp->mnum].born > 500 && rn2(10)) break;
5434 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5435 break;
5436 case 4:
5437 if (mvitals[mtmp->mnum].born > 750 && rn2(10)) break;
5438 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5439 break;
5440 case 5:
5441 if (mvitals[mtmp->mnum].born > 1000 && rn2(10)) break;
5442 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5443 break;
5444 case 6:
5445 if (mvitals[mtmp->mnum].born > 1500 && rn2(10)) break;
5446 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5447 break;
5448 case 7:
5449 if (mvitals[mtmp->mnum].born > 2000 && rn2(10)) break;
5450 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5451 break;
5452 case 8:
5453 if (mvitals[mtmp->mnum].born > 50 && rn2(10)) break;
5454 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5455 break;
5456 case 9:
5457 if (mvitals[mtmp->mnum].born > 5000 && rn2(10)) break;
5458 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5459 if (rn2(10)) break;
5460 (void) makemon(mtmp->data,0,0,NO_MM_FLAGS);
5461 break;
5462 case 10:
5463 default:
5464 break;
5468 if (FemtrapActiveJasieen && !In_endgame(&u.uz) && rn2(10) && (mtmp->data->msound == MS_STENCH || mtmp->data->msound == MS_FART_NORMAL || mtmp->data->msound == MS_FART_QUIET || mtmp->data->msound == MS_FART_LOUD) ) {
5469 register struct monst *jasieenmon;
5470 jasieenmon = makemon(mtmp->data,0,0,NO_MM_FLAGS);
5471 if (jasieenmon) {
5472 if (rn2(3)) u_teleport_monD(jasieenmon, FALSE);
5473 else if (rn2(2)) u_teleport_monB(jasieenmon, FALSE);
5474 else u_teleport_monC(jasieenmon, FALSE);
5478 if (tmp == PM_BIG_BULLETATOR_T && rn2(5)) {
5479 (void) makemon(&mons[PM_BIG_BULLETATOR_T],0,0,NO_MM_FLAGS);
5482 /* apparently this is only in m_detach() now --Amy
5483 if(mtmp->iswiz) wizdead();
5484 if(mtmp->data->msound == MS_NEMESIS && mtmp->mnum >= PM_LORD_CARNARVON && mtmp->mnum <= PM_UPPER_BULL) nemdead();
5487 if (tmp == PM_SUPER_SLOW_TURTLE) {
5488 adjalign(-100);
5489 increasesincounter(5);
5490 u.alignlim -= 5;
5491 You_feel("really bad about the death of this turtle...");
5494 if(tmp == PM_ANASTASIA_STEELE) { /* very bad! */
5496 change_luck(-10);
5497 increasesincounter(20);
5498 u.alignlim -= 20;
5499 adjalign(-200);
5500 u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++; u.ugangr++;
5501 prayer_done();
5505 if (tmp == PM_ALIGNED_PRIEST || tmp == PM_MASTER_PRIEST || tmp == PM_EXCEPTIONAL_PRIEST || tmp == PM_EXPERIENCED_PRIEST || tmp == PM_ELITE_PRIEST || tmp == PM_HIGH_PRIEST || tmp == PM_DNETHACK_ELDER_PRIEST_TM_) { /* you murderer! */
5506 angry_guards(FALSE); /* The guards are on the side of Moloch's priests (not a bug). */
5509 if(tmp == PM_SHOPKEEPER || tmp == PM_MASTER_SHOPKEEPER || tmp == PM_EXPERIENCED_SHOPKEEPER || tmp == PM_EXCEPTIONAL_SHOPKEEPER || tmp == PM_ELITE_SHOPKEEPER || tmp == PM_CROUPIER || tmp == PM_MASTER_CROUPIER || tmp == PM_EXPERIENCED_CROUPIER || tmp == PM_EXCEPTIONAL_CROUPIER || tmp == PM_ELITE_CROUPIER || tmp == PM_BLACK_MARKETEER || tmp == PM_GUARD || tmp == PM_MASTER_GUARD || tmp == PM_EXPERIENCED_GUARD || tmp == PM_EXCEPTIONAL_GUARD || tmp == PM_ELITE_GUARD || ((tmp == PM_ALIGNED_PRIEST || tmp == PM_MASTER_PRIEST || tmp == PM_EXPERIENCED_PRIEST || tmp == PM_EXCEPTIONAL_PRIEST || tmp == PM_ELITE_PRIEST || tmp == PM_HIGH_PRIEST || tmp == PM_DNETHACK_ELDER_PRIEST_TM_) && mtmp->malign <= 0 && ((int)EPRI(mtmp)->shralign != A_NONE) ) ) {
5510 u.pompejiwantedlevel++;
5511 u.pompejipermanentrecord++;
5514 if(tmp == PM_SHOPKEEPER || tmp == PM_MASTER_SHOPKEEPER || tmp == PM_EXPERIENCED_SHOPKEEPER || tmp == PM_EXCEPTIONAL_SHOPKEEPER || tmp == PM_ELITE_SHOPKEEPER || tmp == PM_BLACK_MARKETEER || tmp == PM_GUARD || tmp == PM_MASTER_GUARD || tmp == PM_EXPERIENCED_GUARD || tmp == PM_EXCEPTIONAL_GUARD || tmp == PM_ELITE_GUARD || tmp == PM_CROUPIER || tmp == PM_MASTER_CROUPIER || tmp == PM_EXPERIENCED_CROUPIER || tmp == PM_EXCEPTIONAL_CROUPIER || tmp == PM_ELITE_CROUPIER) /* punishment */ {
5516 pline("The twit quickly called the kops, and it seems they're out to get you!");
5517 angry_guards(FALSE); /* Porkman observed the towns remaining peaceful if you murder all the shopkeepers... */
5518 u.cnd_kopsummonamount++;
5519 copcnt = rnd(monster_difficulty() ) + 1;
5520 if (rn2(5)) copcnt = (copcnt / (rnd(4) + 1)) + 1;
5521 if (Role_if(PM_CAMPERSTRIKER)) copcnt *= (rn2(5) ? 2 : rn2(5) ? 3 : 5);
5523 if (uarmh && itemhasappearance(uarmh, APP_ANTI_GOVERNMENT_HELMET) ) {
5524 copcnt = (copcnt / 2) + 1;
5527 if (RngeAntiGovernment) {
5528 copcnt = (copcnt / 2) + 1;
5531 while(--copcnt >= 0) {
5532 (void) makemon(mkclass(S_KOP,0), u.ux, u.uy, MM_ANGRY|MM_FRENZIED);
5534 if (!rn2(100)) {
5536 int koptryct = 0;
5537 int kox, koy;
5539 for (koptryct = 0; koptryct < 2000; koptryct++) {
5540 kox = rn1(COLNO-3,2);
5541 koy = rn2(ROWNO);
5543 if (kox && koy && isok(kox, koy) && (levl[kox][koy].typ > DBWALL) && !(t_at(kox, koy)) ) {
5544 (void) maketrap(kox, koy, KOP_CUBE, 0, FALSE);
5545 break;
5551 } /* while */
5555 if(mtmp->data == &mons[PM_MEDUSA] && !u.medusaremoved) {
5556 u.medusaremoved = 1;
5557 u.uhpmax += rnd(3);
5558 u.uenmax += rnd(3);
5559 if (Upolyd) u.mhmax += rnd(3);
5562 if (mtmp->data == &mons[PM_SUMATRA_CHIEF]) {
5563 You("gain the secret knowledge of the Sumatra Chief!");
5564 learntech_or_leveltech(T_JAVELIN_FORGING, FROMOUTSIDE, 1);
5568 if(mtmp->data == &mons[PM_MOTHERFUCKER_GLASS_GOLEM] && !u.glassgolemdown) {
5569 u.glassgolemdown = 1;
5570 pline("Congratulations, the glass golem is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
5571 trophy = mksobj(HELM_OF_TELEPATHY, FALSE, FALSE, FALSE);
5572 if (trophy) {
5573 trophy = oname(trophy, artiname(ART_HELM_OF_KNOWLEDGE));
5574 dropy(trophy);
5576 de_energise_artifact(ART_HELM_OF_KNOWLEDGE);
5577 de_energise_artifact(ART_BOOTS_OF_THE_MACHINE);
5579 learntech_or_leveltech(T_SECURE_IDENTIFY, FROMOUTSIDE, 1);
5580 You("also learn the secure identify technique, and it can be used twice as often for the remaining game.");
5584 if(mtmp->data == &mons[PM_THE_WITCH_KING_OF_ANGMAR] && !u.angmarcomplete) {
5585 u.angmarcomplete = 1;
5586 pline("Congratulations, the witch-king is defeated! As a reward, you gain 5 extra skill slots!");
5587 u.weapon_slots += 5;
5590 if(mtmp->data == &mons[u.rivalneminum] && !u.rivalquestcomplete) {
5591 u.rivalquestcomplete = 1;
5592 pline("Congratulations, your rival nemesis is defeated! As a reward, you gain 5 extra skill slots!");
5593 u.weapon_slots += 5;
5596 if(mtmp->data == &mons[PM_VERA_THE_ICE_QUEEN] && !u.veradown) {
5598 int rndskill = P_DAGGER;
5600 (void) makemon(&mons[PM_ELAINE_THE_ENCHANTRESS], u.ux, u.uy, MM_ANGRY|MM_ADJACENTOK);
5602 u.veradown = 1;
5603 pline("Congratulations, Vera is defeated! All of your skills are trained by one point!");
5605 for (rndskill = P_DAGGER; rndskill < P_NUM_SKILLS; rndskill++) {
5606 P_ADVANCE(rndskill)++;
5609 verbalize("What? Why did you have to do that to Vera??? She... she was my rival, but I kind of liked her anyway... why did you have to kill her, you evil monster? Well, I guess now I have to avenge her death by bludgeoning you...");
5613 if(mtmp->data == &mons[PM_ELAINE_THE_ENCHANTRESS] && !u.elainedown) {
5615 u.elainedown = 1;
5616 pline("Congratulations, Elaine is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
5618 trophy = mksobj(POT_TECH_LEVEL_UP, FALSE, FALSE, FALSE);
5619 if (trophy) {
5620 trophy->prmcurse = trophy->hvycurse = trophy->cursed = trophy->morgcurse = trophy->evilcurse = trophy->bbrcurse = trophy->stckcurse = 0;
5621 dropy(trophy);
5623 trophy = mksobj(POT_TECH_LEVEL_UP, FALSE, FALSE, FALSE);
5624 if (trophy) {
5625 trophy->prmcurse = trophy->hvycurse = trophy->cursed = trophy->morgcurse = trophy->evilcurse = trophy->bbrcurse = trophy->stckcurse = 0;
5626 dropy(trophy);
5628 trophy = mksobj(POT_TECH_LEVEL_UP, FALSE, FALSE, FALSE);
5629 if (trophy) {
5630 trophy->prmcurse = trophy->hvycurse = trophy->cursed = trophy->morgcurse = trophy->evilcurse = trophy->bbrcurse = trophy->stckcurse = 0;
5631 dropy(trophy);
5633 trophy = mksobj(POT_TECH_LEVEL_UP, FALSE, FALSE, FALSE);
5634 if (trophy) {
5635 trophy->prmcurse = trophy->hvycurse = trophy->cursed = trophy->morgcurse = trophy->evilcurse = trophy->bbrcurse = trophy->stckcurse = 0;
5636 dropy(trophy);
5638 trophy = mksobj(POT_TECH_LEVEL_UP, FALSE, FALSE, FALSE);
5639 if (trophy) {
5640 trophy->prmcurse = trophy->hvycurse = trophy->cursed = trophy->morgcurse = trophy->evilcurse = trophy->bbrcurse = trophy->stckcurse = 0;
5641 dropy(trophy);
5646 if(mtmp->data == &mons[PM_STAHNGNIR__THE_STEEL_GIANT_LORD] && !u.stahngnirdown) {
5647 u.stahngnirdown = 1;
5648 pline("Congratulations, Lord Stahngnir is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
5650 trophy = mksobj(MATERIAL_KIT, FALSE, FALSE, FALSE);
5651 if (trophy) {
5652 dropy(trophy);
5655 switch (rnd(10)) {
5657 case 1:
5658 case 2:
5659 case 3:
5660 case 4:
5661 case 5:
5662 case 6:
5663 trophy = mksobj(SCR_INFERIOR_MATERIAL, FALSE, FALSE, FALSE);
5664 if (trophy) {
5665 trophy->quan = 3;
5666 trophy->owt = weight(trophy);
5667 dropy(trophy);
5669 break;
5670 case 7:
5671 case 8:
5672 case 9:
5673 trophy = mksobj(SCR_REGULAR_MATERIAL, FALSE, FALSE, FALSE);
5674 if (trophy) {
5675 trophy->quan = 3;
5676 trophy->owt = weight(trophy);
5677 dropy(trophy);
5679 break;
5680 case 10:
5681 trophy = mksobj(SCR_REGULAR_MATERIAL, FALSE, FALSE, FALSE);
5682 if (trophy) {
5683 trophy->quan = 3;
5684 trophy->owt = weight(trophy);
5685 dropy(trophy);
5687 break;
5692 if(mtmp->data == &mons[PM_ARIANE__LADY_OF_THE_ELEMENTS] && !u.arianedown) {
5693 u.arianedown = 1;
5695 if (practicantterror) {
5696 pline("%s booms: 'Didn't I tell you that you're not allowed to harm your fellow practicants! Ariane was a promising scientist in this laboratory, unlike you little maggot! All you ever do is step out of line and cause trouble! For that, you'll pay 50000 zorkmids right now and hope that it'll be enough to cover for Ariane's resurrection costs.'", noroelaname());
5697 fineforpracticant(50000, 0, 0);
5700 pline("Congratulations, Ariane is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
5702 learntech_or_leveltech(T_ELEMENTAL_IMBUE, FROMOUTSIDE, 1);
5703 You("learn how to perform elemental imbue!");
5705 boolean havegifts = u.ugifts;
5707 if (!havegifts) u.ugifts++;
5709 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
5710 if (trophy) {
5711 dropy(trophy);
5712 int trophyskill = get_obj_skill(trophy, TRUE);
5713 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
5714 unrestrict_weapon_skill(trophyskill);
5715 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
5716 unrestrict_weapon_skill(trophyskill);
5717 P_MAX_SKILL(trophyskill) = P_BASIC;
5718 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
5719 P_MAX_SKILL(trophyskill) = P_SKILLED;
5720 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
5721 P_MAX_SKILL(trophyskill) = P_EXPERT;
5722 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
5723 P_MAX_SKILL(trophyskill) = P_MASTER;
5724 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
5725 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
5726 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
5727 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
5729 if (Race_if(PM_RUSMOT)) {
5730 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
5731 unrestrict_weapon_skill(trophyskill);
5732 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
5733 unrestrict_weapon_skill(trophyskill);
5734 P_MAX_SKILL(trophyskill) = P_BASIC;
5735 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
5736 P_MAX_SKILL(trophyskill) = P_SKILLED;
5737 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
5738 P_MAX_SKILL(trophyskill) = P_EXPERT;
5739 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
5740 P_MAX_SKILL(trophyskill) = P_MASTER;
5741 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
5742 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
5743 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
5744 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
5747 discover_artifact(trophy->oartifact);
5748 if (!havegifts) u.ugifts--;
5751 havegifts = u.ugifts;
5753 if (!havegifts) u.ugifts++;
5755 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
5756 if (trophy) {
5757 dropy(trophy);
5758 int trophyskill = get_obj_skill(trophy, TRUE);
5759 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
5760 unrestrict_weapon_skill(trophyskill);
5761 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
5762 unrestrict_weapon_skill(trophyskill);
5763 P_MAX_SKILL(trophyskill) = P_BASIC;
5764 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
5765 P_MAX_SKILL(trophyskill) = P_SKILLED;
5766 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
5767 P_MAX_SKILL(trophyskill) = P_EXPERT;
5768 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
5769 P_MAX_SKILL(trophyskill) = P_MASTER;
5770 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
5771 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
5772 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
5773 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
5775 if (Race_if(PM_RUSMOT)) {
5776 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
5777 unrestrict_weapon_skill(trophyskill);
5778 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
5779 unrestrict_weapon_skill(trophyskill);
5780 P_MAX_SKILL(trophyskill) = P_BASIC;
5781 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
5782 P_MAX_SKILL(trophyskill) = P_SKILLED;
5783 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
5784 P_MAX_SKILL(trophyskill) = P_EXPERT;
5785 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
5786 P_MAX_SKILL(trophyskill) = P_MASTER;
5787 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
5788 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
5789 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
5790 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
5793 discover_artifact(trophy->oartifact);
5794 if (!havegifts) u.ugifts--;
5797 int skillimprove = randomgoodskill();
5799 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5800 unrestrict_weapon_skill(skillimprove);
5801 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5802 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5803 unrestrict_weapon_skill(skillimprove);
5804 P_MAX_SKILL(skillimprove) = P_BASIC;
5805 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5806 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5807 P_MAX_SKILL(skillimprove) = P_SKILLED;
5808 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5809 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5810 P_MAX_SKILL(skillimprove) = P_EXPERT;
5811 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5812 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5813 P_MAX_SKILL(skillimprove) = P_MASTER;
5814 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5815 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5816 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5817 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5818 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5819 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5820 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5823 skillimprove = randomgoodskill();
5825 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5826 unrestrict_weapon_skill(skillimprove);
5827 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5828 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5829 unrestrict_weapon_skill(skillimprove);
5830 P_MAX_SKILL(skillimprove) = P_BASIC;
5831 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5832 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5833 P_MAX_SKILL(skillimprove) = P_SKILLED;
5834 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5835 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5836 P_MAX_SKILL(skillimprove) = P_EXPERT;
5837 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5838 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5839 P_MAX_SKILL(skillimprove) = P_MASTER;
5840 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5841 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5842 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5843 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5844 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5845 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5846 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5849 skillimprove = randomgoodskill();
5851 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5852 unrestrict_weapon_skill(skillimprove);
5853 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5854 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5855 unrestrict_weapon_skill(skillimprove);
5856 P_MAX_SKILL(skillimprove) = P_BASIC;
5857 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5858 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5859 P_MAX_SKILL(skillimprove) = P_SKILLED;
5860 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5861 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5862 P_MAX_SKILL(skillimprove) = P_EXPERT;
5863 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5864 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5865 P_MAX_SKILL(skillimprove) = P_MASTER;
5866 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5867 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5868 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5869 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5870 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5871 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5872 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5875 if (Race_if(PM_RUSMOT)) {
5876 skillimprove = randomgoodskill();
5878 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5879 unrestrict_weapon_skill(skillimprove);
5880 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5881 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5882 unrestrict_weapon_skill(skillimprove);
5883 P_MAX_SKILL(skillimprove) = P_BASIC;
5884 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5885 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5886 P_MAX_SKILL(skillimprove) = P_SKILLED;
5887 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5888 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5889 P_MAX_SKILL(skillimprove) = P_EXPERT;
5890 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5891 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5892 P_MAX_SKILL(skillimprove) = P_MASTER;
5893 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5894 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5895 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5896 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5897 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5898 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5899 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5902 skillimprove = randomgoodskill();
5904 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5905 unrestrict_weapon_skill(skillimprove);
5906 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5907 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5908 unrestrict_weapon_skill(skillimprove);
5909 P_MAX_SKILL(skillimprove) = P_BASIC;
5910 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5911 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5912 P_MAX_SKILL(skillimprove) = P_SKILLED;
5913 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5914 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5915 P_MAX_SKILL(skillimprove) = P_EXPERT;
5916 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5917 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5918 P_MAX_SKILL(skillimprove) = P_MASTER;
5919 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5920 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5921 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5922 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5923 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5924 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5925 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5928 skillimprove = randomgoodskill();
5930 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
5931 unrestrict_weapon_skill(skillimprove);
5932 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5933 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
5934 unrestrict_weapon_skill(skillimprove);
5935 P_MAX_SKILL(skillimprove) = P_BASIC;
5936 pline("You can now learn the %s skill.", wpskillname(skillimprove));
5937 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
5938 P_MAX_SKILL(skillimprove) = P_SKILLED;
5939 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5940 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
5941 P_MAX_SKILL(skillimprove) = P_EXPERT;
5942 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5943 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
5944 P_MAX_SKILL(skillimprove) = P_MASTER;
5945 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5946 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
5947 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
5948 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5949 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
5950 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
5951 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
5958 if(mtmp->data == &mons[PM_KALWINA] && !u.emynluincomplete) {
5959 u.emynluincomplete = 1;
5960 de_energise_artifact(ART_KAL);
5961 pline("Congratulations, you broke the curse of Emyn Luin! As a reward, you'll gain extra spell memory when learning a new spell, your techniques time out faster so they can be used more often, and your skills train slightly faster!");
5964 if(mtmp->data == &mons[PM_THE_MINOTAUR_OF_THE_MAZE] && !u.minotaurmazecomplete) {
5965 u.minotaurmazecomplete = 1;
5966 pline("Congratulations, the minotaur is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
5968 boolean havegifts = u.ugifts;
5970 if (!havegifts) u.ugifts++;
5972 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
5973 if (trophy) {
5974 dropy(trophy);
5975 int trophyskill = get_obj_skill(trophy, TRUE);
5976 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
5977 unrestrict_weapon_skill(trophyskill);
5978 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
5979 unrestrict_weapon_skill(trophyskill);
5980 P_MAX_SKILL(trophyskill) = P_BASIC;
5981 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
5982 P_MAX_SKILL(trophyskill) = P_SKILLED;
5983 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
5984 P_MAX_SKILL(trophyskill) = P_EXPERT;
5985 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
5986 P_MAX_SKILL(trophyskill) = P_MASTER;
5987 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
5988 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
5989 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
5990 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
5992 if (Race_if(PM_RUSMOT)) {
5993 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
5994 unrestrict_weapon_skill(trophyskill);
5995 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
5996 unrestrict_weapon_skill(trophyskill);
5997 P_MAX_SKILL(trophyskill) = P_BASIC;
5998 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
5999 P_MAX_SKILL(trophyskill) = P_SKILLED;
6000 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6001 P_MAX_SKILL(trophyskill) = P_EXPERT;
6002 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6003 P_MAX_SKILL(trophyskill) = P_MASTER;
6004 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6005 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6006 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6007 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6010 discover_artifact(trophy->oartifact);
6011 if (!havegifts) u.ugifts--;
6014 int skillimprove = randomgoodskill();
6016 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6017 unrestrict_weapon_skill(skillimprove);
6018 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6019 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6020 unrestrict_weapon_skill(skillimprove);
6021 P_MAX_SKILL(skillimprove) = P_BASIC;
6022 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6023 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6024 P_MAX_SKILL(skillimprove) = P_SKILLED;
6025 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6026 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6027 P_MAX_SKILL(skillimprove) = P_EXPERT;
6028 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6029 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6030 P_MAX_SKILL(skillimprove) = P_MASTER;
6031 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6032 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6033 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6034 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6035 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6036 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6037 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6040 if (Race_if(PM_RUSMOT)) {
6041 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6042 unrestrict_weapon_skill(skillimprove);
6043 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6044 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6045 unrestrict_weapon_skill(skillimprove);
6046 P_MAX_SKILL(skillimprove) = P_BASIC;
6047 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6048 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6049 P_MAX_SKILL(skillimprove) = P_SKILLED;
6050 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6051 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6052 P_MAX_SKILL(skillimprove) = P_EXPERT;
6053 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6054 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6055 P_MAX_SKILL(skillimprove) = P_MASTER;
6056 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6057 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6058 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6059 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6060 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6061 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6062 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6066 learntech_or_leveltech(T_CURE_AMNESIA, FROMOUTSIDE, 1);
6067 You("learn how to perform cure amnesia!");
6071 if(mtmp->data == &mons[PM_EROGENOUS_KATIA] && !u.katiaremoved) {
6072 u.katiaremoved = 1;
6073 pline("Congratulations, Erogenous Katia is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
6074 trophy = mksobj(BATH_TOWEL, FALSE, FALSE, FALSE);
6075 if (trophy) {
6076 trophy = oname(trophy, artiname(ART_KATIA_S_SOFT_COTTON));
6077 dropy(trophy);
6081 if(mtmp->data == &mons[PM_BOFH] && !u.bofhremoved) {
6082 u.bofhremoved = 1;
6083 pline("Congratulations, the Bastard Operator From Hell is defeated! Your reward was dropped at your %s.", makeplural(body_part(FOOT)));
6084 trophy = mksobj(HITCHHIKER_S_GUIDE_TO_THE_GALA, FALSE, FALSE, FALSE);
6085 if (trophy) {
6086 trophy = oname(trophy, artiname(ART_BIZARRO_ORGASMATRON));
6087 dropy(trophy);
6089 de_energise_artifact(ART_BIZARRO_ORGASMATRON);
6091 boolean havegifts = u.ugifts;
6093 if (!havegifts) u.ugifts++;
6095 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6096 if (trophy) {
6097 dropy(trophy);
6098 int trophyskill = get_obj_skill(trophy, TRUE);
6099 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6100 unrestrict_weapon_skill(trophyskill);
6101 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6102 unrestrict_weapon_skill(trophyskill);
6103 P_MAX_SKILL(trophyskill) = P_BASIC;
6104 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6105 P_MAX_SKILL(trophyskill) = P_SKILLED;
6106 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6107 P_MAX_SKILL(trophyskill) = P_EXPERT;
6108 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6109 P_MAX_SKILL(trophyskill) = P_MASTER;
6110 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6111 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6112 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6113 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6115 if (Race_if(PM_RUSMOT)) {
6116 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6117 unrestrict_weapon_skill(trophyskill);
6118 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6119 unrestrict_weapon_skill(trophyskill);
6120 P_MAX_SKILL(trophyskill) = P_BASIC;
6121 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6122 P_MAX_SKILL(trophyskill) = P_SKILLED;
6123 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6124 P_MAX_SKILL(trophyskill) = P_EXPERT;
6125 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6126 P_MAX_SKILL(trophyskill) = P_MASTER;
6127 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6128 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6129 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6130 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6133 discover_artifact(trophy->oartifact);
6134 if (!havegifts) u.ugifts--;
6137 int skillimprove = randomgoodskill();
6139 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6140 unrestrict_weapon_skill(skillimprove);
6141 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6142 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6143 unrestrict_weapon_skill(skillimprove);
6144 P_MAX_SKILL(skillimprove) = P_BASIC;
6145 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6146 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6147 P_MAX_SKILL(skillimprove) = P_SKILLED;
6148 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6149 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6150 P_MAX_SKILL(skillimprove) = P_EXPERT;
6151 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6152 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6153 P_MAX_SKILL(skillimprove) = P_MASTER;
6154 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6155 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6156 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6157 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6158 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6159 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6160 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6163 skillimprove = randomgoodskill();
6165 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6166 unrestrict_weapon_skill(skillimprove);
6167 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6168 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6169 unrestrict_weapon_skill(skillimprove);
6170 P_MAX_SKILL(skillimprove) = P_BASIC;
6171 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6172 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6173 P_MAX_SKILL(skillimprove) = P_SKILLED;
6174 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6175 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6176 P_MAX_SKILL(skillimprove) = P_EXPERT;
6177 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6178 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6179 P_MAX_SKILL(skillimprove) = P_MASTER;
6180 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6181 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6182 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6183 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6184 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6185 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6186 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6189 skillimprove = randomgoodskill();
6191 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6192 unrestrict_weapon_skill(skillimprove);
6193 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6194 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6195 unrestrict_weapon_skill(skillimprove);
6196 P_MAX_SKILL(skillimprove) = P_BASIC;
6197 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6198 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6199 P_MAX_SKILL(skillimprove) = P_SKILLED;
6200 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6201 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6202 P_MAX_SKILL(skillimprove) = P_EXPERT;
6203 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6204 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6205 P_MAX_SKILL(skillimprove) = P_MASTER;
6206 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6207 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6208 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6209 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6210 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6211 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6212 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6215 if (Race_if(PM_RUSMOT)) {
6216 skillimprove = randomgoodskill();
6218 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6219 unrestrict_weapon_skill(skillimprove);
6220 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6221 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6222 unrestrict_weapon_skill(skillimprove);
6223 P_MAX_SKILL(skillimprove) = P_BASIC;
6224 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6225 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6226 P_MAX_SKILL(skillimprove) = P_SKILLED;
6227 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6228 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6229 P_MAX_SKILL(skillimprove) = P_EXPERT;
6230 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6231 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6232 P_MAX_SKILL(skillimprove) = P_MASTER;
6233 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6234 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6235 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6236 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6237 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6238 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6239 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6242 skillimprove = randomgoodskill();
6244 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6245 unrestrict_weapon_skill(skillimprove);
6246 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6247 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6248 unrestrict_weapon_skill(skillimprove);
6249 P_MAX_SKILL(skillimprove) = P_BASIC;
6250 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6251 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6252 P_MAX_SKILL(skillimprove) = P_SKILLED;
6253 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6254 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6255 P_MAX_SKILL(skillimprove) = P_EXPERT;
6256 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6257 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6258 P_MAX_SKILL(skillimprove) = P_MASTER;
6259 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6260 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6261 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6262 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6263 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6264 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6265 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6268 skillimprove = randomgoodskill();
6270 if (P_MAX_SKILL(skillimprove) == P_ISRESTRICTED) {
6271 unrestrict_weapon_skill(skillimprove);
6272 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6273 } else if (P_MAX_SKILL(skillimprove) == P_UNSKILLED) {
6274 unrestrict_weapon_skill(skillimprove);
6275 P_MAX_SKILL(skillimprove) = P_BASIC;
6276 pline("You can now learn the %s skill.", wpskillname(skillimprove));
6277 } else if (rn2(2) && P_MAX_SKILL(skillimprove) == P_BASIC) {
6278 P_MAX_SKILL(skillimprove) = P_SKILLED;
6279 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6280 } else if (!rn2(4) && P_MAX_SKILL(skillimprove) == P_SKILLED) {
6281 P_MAX_SKILL(skillimprove) = P_EXPERT;
6282 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6283 } else if (!rn2(10) && P_MAX_SKILL(skillimprove) == P_EXPERT) {
6284 P_MAX_SKILL(skillimprove) = P_MASTER;
6285 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6286 } else if (!rn2(100) && P_MAX_SKILL(skillimprove) == P_MASTER) {
6287 P_MAX_SKILL(skillimprove) = P_GRAND_MASTER;
6288 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6289 } else if (!rn2(200) && P_MAX_SKILL(skillimprove) == P_GRAND_MASTER) {
6290 P_MAX_SKILL(skillimprove) = P_SUPREME_MASTER;
6291 pline("Your knowledge of the %s skill increases.", wpskillname(skillimprove));
6298 if(mtmp->data == &mons[PM_TIKSRVZLLAT] && !u.tiksrvzllatdown) {
6299 u.tiksrvzllatdown = 1;
6300 pline("Congratulations, Tiksrvzllat is defeated! Your reward was dropped at your %s. Also, you gain permanent bonuses to your chance to hit, damage and spellcasting success chances.", makeplural(body_part(FOOT)));
6302 boolean havegifts = u.ugifts;
6304 if (!havegifts) u.ugifts++;
6306 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6307 if (trophy) {
6308 dropy(trophy);
6309 int trophyskill = get_obj_skill(trophy, TRUE);
6310 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6311 unrestrict_weapon_skill(trophyskill);
6312 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6313 unrestrict_weapon_skill(trophyskill);
6314 P_MAX_SKILL(trophyskill) = P_BASIC;
6315 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6316 P_MAX_SKILL(trophyskill) = P_SKILLED;
6317 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6318 P_MAX_SKILL(trophyskill) = P_EXPERT;
6319 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6320 P_MAX_SKILL(trophyskill) = P_MASTER;
6321 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6322 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6323 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6324 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6326 if (Race_if(PM_RUSMOT)) {
6327 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6328 unrestrict_weapon_skill(trophyskill);
6329 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6330 unrestrict_weapon_skill(trophyskill);
6331 P_MAX_SKILL(trophyskill) = P_BASIC;
6332 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6333 P_MAX_SKILL(trophyskill) = P_SKILLED;
6334 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6335 P_MAX_SKILL(trophyskill) = P_EXPERT;
6336 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6337 P_MAX_SKILL(trophyskill) = P_MASTER;
6338 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6339 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6340 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6341 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6344 discover_artifact(trophy->oartifact);
6346 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6347 if (trophy) {
6348 dropy(trophy);
6349 int trophyskill = get_obj_skill(trophy, TRUE);
6350 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6351 unrestrict_weapon_skill(trophyskill);
6352 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6353 unrestrict_weapon_skill(trophyskill);
6354 P_MAX_SKILL(trophyskill) = P_BASIC;
6355 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6356 P_MAX_SKILL(trophyskill) = P_SKILLED;
6357 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6358 P_MAX_SKILL(trophyskill) = P_EXPERT;
6359 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6360 P_MAX_SKILL(trophyskill) = P_MASTER;
6361 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6362 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6363 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6364 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6366 if (Race_if(PM_RUSMOT)) {
6367 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6368 unrestrict_weapon_skill(trophyskill);
6369 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6370 unrestrict_weapon_skill(trophyskill);
6371 P_MAX_SKILL(trophyskill) = P_BASIC;
6372 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6373 P_MAX_SKILL(trophyskill) = P_SKILLED;
6374 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6375 P_MAX_SKILL(trophyskill) = P_EXPERT;
6376 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6377 P_MAX_SKILL(trophyskill) = P_MASTER;
6378 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6379 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6380 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6381 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6384 discover_artifact(trophy->oartifact);
6386 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6387 if (trophy) {
6388 dropy(trophy);
6389 int trophyskill = get_obj_skill(trophy, TRUE);
6390 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6391 unrestrict_weapon_skill(trophyskill);
6392 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6393 unrestrict_weapon_skill(trophyskill);
6394 P_MAX_SKILL(trophyskill) = P_BASIC;
6395 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6396 P_MAX_SKILL(trophyskill) = P_SKILLED;
6397 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6398 P_MAX_SKILL(trophyskill) = P_EXPERT;
6399 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6400 P_MAX_SKILL(trophyskill) = P_MASTER;
6401 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6402 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6403 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6404 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6406 if (Race_if(PM_RUSMOT)) {
6407 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6408 unrestrict_weapon_skill(trophyskill);
6409 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6410 unrestrict_weapon_skill(trophyskill);
6411 P_MAX_SKILL(trophyskill) = P_BASIC;
6412 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6413 P_MAX_SKILL(trophyskill) = P_SKILLED;
6414 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6415 P_MAX_SKILL(trophyskill) = P_EXPERT;
6416 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6417 P_MAX_SKILL(trophyskill) = P_MASTER;
6418 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6419 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6420 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6421 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6424 discover_artifact(trophy->oartifact);
6426 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6427 if (trophy) {
6428 dropy(trophy);
6429 int trophyskill = get_obj_skill(trophy, TRUE);
6430 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6431 unrestrict_weapon_skill(trophyskill);
6432 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6433 unrestrict_weapon_skill(trophyskill);
6434 P_MAX_SKILL(trophyskill) = P_BASIC;
6435 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6436 P_MAX_SKILL(trophyskill) = P_SKILLED;
6437 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6438 P_MAX_SKILL(trophyskill) = P_EXPERT;
6439 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6440 P_MAX_SKILL(trophyskill) = P_MASTER;
6441 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6442 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6443 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6444 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6446 if (Race_if(PM_RUSMOT)) {
6447 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6448 unrestrict_weapon_skill(trophyskill);
6449 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6450 unrestrict_weapon_skill(trophyskill);
6451 P_MAX_SKILL(trophyskill) = P_BASIC;
6452 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6453 P_MAX_SKILL(trophyskill) = P_SKILLED;
6454 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6455 P_MAX_SKILL(trophyskill) = P_EXPERT;
6456 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6457 P_MAX_SKILL(trophyskill) = P_MASTER;
6458 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6459 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6460 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6461 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6464 discover_artifact(trophy->oartifact);
6466 trophy = mk_artifact((struct obj *)0, !rn2(3) ? A_CHAOTIC : rn2(2) ? A_NEUTRAL : A_LAWFUL, TRUE);
6467 if (trophy) {
6468 dropy(trophy);
6469 int trophyskill = get_obj_skill(trophy, TRUE);
6470 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6471 unrestrict_weapon_skill(trophyskill);
6472 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6473 unrestrict_weapon_skill(trophyskill);
6474 P_MAX_SKILL(trophyskill) = P_BASIC;
6475 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6476 P_MAX_SKILL(trophyskill) = P_SKILLED;
6477 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6478 P_MAX_SKILL(trophyskill) = P_EXPERT;
6479 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6480 P_MAX_SKILL(trophyskill) = P_MASTER;
6481 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6482 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6483 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6484 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6486 if (Race_if(PM_RUSMOT)) {
6487 if (P_MAX_SKILL(trophyskill) == P_ISRESTRICTED) {
6488 unrestrict_weapon_skill(trophyskill);
6489 } else if (P_MAX_SKILL(trophyskill) == P_UNSKILLED) {
6490 unrestrict_weapon_skill(trophyskill);
6491 P_MAX_SKILL(trophyskill) = P_BASIC;
6492 } else if (rn2(2) && P_MAX_SKILL(trophyskill) == P_BASIC) {
6493 P_MAX_SKILL(trophyskill) = P_SKILLED;
6494 } else if (!rn2(4) && P_MAX_SKILL(trophyskill) == P_SKILLED) {
6495 P_MAX_SKILL(trophyskill) = P_EXPERT;
6496 } else if (!rn2(10) && P_MAX_SKILL(trophyskill) == P_EXPERT) {
6497 P_MAX_SKILL(trophyskill) = P_MASTER;
6498 } else if (!rn2(100) && P_MAX_SKILL(trophyskill) == P_MASTER) {
6499 P_MAX_SKILL(trophyskill) = P_GRAND_MASTER;
6500 } else if (!rn2(200) && P_MAX_SKILL(trophyskill) == P_GRAND_MASTER) {
6501 P_MAX_SKILL(trophyskill) = P_SUPREME_MASTER;
6504 discover_artifact(trophy->oartifact);
6505 if (!havegifts) u.ugifts--;
6510 #ifdef RECORD_ACHIEVE
6511 if(mtmp->data == &mons[PM_MEDUSA]) {
6513 if (!achieve.killed_medusa) {
6515 achieve.killed_medusa = 1;
6516 qt_pager(QT_MEDUSA);
6518 trophy_get();
6519 if (!Race_if(PM_BABYLONIAN)) {
6520 u.weapon_slots += 1;
6521 pline("As a bonus, you gain an additional skill slot!");
6527 if(mtmp->data == &mons[PM_NIGHTMARE]) {
6529 if (!achieve.killed_nightmare) {
6531 achieve.killed_nightmare = 1;
6532 trophy_get();
6533 if (!Race_if(PM_BABYLONIAN)) {
6534 u.weapon_slots += 1;
6535 pline("As a bonus, you gain an additional skill slot!");
6541 if(mtmp->data == &mons[PM_VECNA]) {
6543 if (!achieve.killed_vecna) {
6545 achieve.killed_vecna = 1;
6546 trophy_get();
6547 if (!Race_if(PM_BABYLONIAN)) {
6548 u.weapon_slots += 1;
6549 pline("As a bonus, you gain an additional skill slot!");
6554 if(mtmp->data == &mons[PM_BEHOLDER]) {
6556 if (!achieve.killed_beholder) {
6557 achieve.killed_beholder = 1;
6559 trophy_get();
6560 if (!Race_if(PM_BABYLONIAN)) {
6561 u.weapon_slots += 1;
6562 pline("As a bonus, you gain an additional skill slot!");
6568 if(mtmp->data == &mons[PM_RUGGO_THE_GNOME_KING]) {
6570 if (!achieve.killed_ruggo) {
6571 achieve.killed_ruggo = 1;
6573 trophy_get();
6578 if(mtmp->data == &mons[PM_KROO_THE_KOBOLD_KING]) {
6580 if (!achieve.killed_kroo) {
6581 achieve.killed_kroo = 1;
6583 trophy_get();
6588 if(mtmp->data == &mons[PM_GRUND_THE_ORC_KING]) {
6590 if (!achieve.killed_grund) {
6591 achieve.killed_grund = 1;
6593 trophy_get();
6599 if(mtmp->data == &mons[PM_VERA_THE_ICE_QUEEN]) {
6601 if (!achieveX.killed_vera) {
6602 achieveX.killed_vera = 1;
6604 trophy_get();
6610 if(mtmp->data == &mons[PM_ELAINE_THE_ENCHANTRESS]) {
6612 if (!achieveX.killed_elaine) {
6613 achieveX.killed_elaine = 1;
6615 trophy_get();
6621 if(mtmp->data == &mons[PM_THE_LARGEST_GIANT]) {
6623 if (!achieve.killed_largestgiant) {
6624 achieve.killed_largestgiant = 1;
6626 trophy_get();
6631 if(mtmp->data == &mons[PM_SHELOB]) {
6633 if (!achieve.killed_shelob) {
6634 achieve.killed_shelob = 1;
6636 trophy_get();
6641 if(mtmp->data == &mons[PM_GIRTAB]) {
6643 if (!achieve.killed_girtab) {
6644 achieve.killed_girtab = 1;
6646 trophy_get();
6651 if(mtmp->data == &mons[PM_APHRODITE]) {
6653 if (!achieve.killed_aphrodite) {
6654 achieve.killed_aphrodite = 1;
6656 trophy_get();
6661 if(mtmp->data == &mons[PM_DOCTOR_FRANKENSTEIN]) {
6663 if (!achieve.killed_frankenstein) {
6665 achieve.killed_frankenstein = 1;
6666 trophy_get();
6671 if(mtmp->data == &mons[PM_CROESUS]) {
6673 if (!achieve.killed_croesus) {
6674 achieve.killed_croesus = 1;
6676 trophy_get();
6681 if(mtmp->data == &mons[PM_FATHER_DAGON]) {
6683 if (!achieve.killed_dagon) {
6684 achieve.killed_dagon = 1;
6686 trophy_get();
6691 if(mtmp->data == &mons[PM_MOTHER_HYDRA]) {
6693 if (!achieve.killed_hydra) {
6694 achieve.killed_hydra = 1;
6696 trophy_get();
6702 if(mtmp->data == &mons[PM_DNETHACK_ELDER_PRIEST_TM_]) {
6704 /* did you win the game? then you may find the artifact robe randomly generated now --Amy */
6705 if (u.freeplaymode) de_energise_artifact(ART_MOTHERFUCKER_TROPHY);
6707 if (!achieveX.killed_elderpriest) {
6709 achieveX.killed_elderpriest = 1;
6711 trophy_get();
6717 if(mtmp->data == &mons[PM_MOTHERFUCKER_GLASS_GOLEM]) {
6719 if (!achieveX.killed_glassgolem) {
6721 achieveX.killed_glassgolem = 1;
6723 trophy_get();
6729 if(mtmp->data == &mons[PM_TIKSRVZLLAT]) {
6731 if (!achieveX.killed_tiksrvzllat) {
6733 achieveX.killed_tiksrvzllat = 1;
6735 trophy_get();
6741 if(mtmp->data == &mons[PM_BOFH]) {
6743 if (!achieveX.killed_bofh) {
6745 achieveX.killed_bofh = 1;
6747 trophy_get();
6753 if(mtmp->data == &mons[PM_EROGENOUS_KATIA]) {
6755 de_energise_artifact(ART_KATIA_S_SOFT_COTTON);
6757 if (!achieveX.killed_katia) {
6759 achieveX.killed_katia = 1;
6761 trophy_get();
6767 if(mtmp->data == &mons[PM_THE_WITCH_KING_OF_ANGMAR]) {
6769 if (!achieveX.killed_witchking) {
6771 achieveX.killed_witchking = 1;
6773 trophy_get();
6779 if(mtmp->data == &mons[PM_STAHNGNIR__THE_STEEL_GIANT_LORD]) {
6781 de_energise_artifact(ART_STAHNGNIR_S_BASHHUNK);
6783 if (!achieveX.killed_stahngnir) {
6785 achieveX.killed_stahngnir = 1;
6787 trophy_get();
6793 if(mtmp->data == &mons[u.rivalneminum]) {
6795 if (quest_status.killed_nemesis) {
6796 int quartinum = ART_ORB_OF_DETECTION;
6797 while (quartinum <= ART_PENUMBRAL_LASSO) {
6798 de_energise_artifact(quartinum);
6799 quartinum++;
6803 if (!achieveX.completed_rivalquest) {
6805 achieveX.completed_rivalquest = 1;
6807 trophy_get();
6808 if (!Race_if(PM_BABYLONIAN)) {
6809 u.weapon_slots += 1;
6810 pline("As a bonus, you gain an additional skill slot!");
6817 if(mtmp->data == &mons[PM_ARIANE__LADY_OF_THE_ELEMENTS]) {
6819 if (!achieveX.killed_ariane) {
6821 achieveX.killed_ariane = 1;
6823 trophy_get();
6829 if(mtmp->data == &mons[PM_KALWINA]) {
6831 if (!achieveX.killed_kalwina) {
6833 achieveX.killed_kalwina = 1;
6835 trophy_get();
6841 if(mtmp->data == &mons[PM_THE_MINOTAUR_OF_THE_MAZE]) {
6843 if (!achieveX.killed_minotaur) {
6845 achieveX.killed_minotaur = 1;
6847 trophy_get();
6854 #ifdef LIVELOGFILE
6855 livelog_achieve_update();
6856 #endif
6857 #endif
6859 if(memory_is_invisible(mtmp->mx, mtmp->my))
6860 unmap_object(mtmp->mx, mtmp->my);
6861 m_detach(mtmp, mptr);
6864 /* TRUE if corpse might be dropped, magr may die if mon was swallowed */
6865 boolean
6866 corpse_chance(mon, magr, was_swallowed)
6867 struct monst *mon;
6868 struct monst *magr; /* killer, if swallowed */
6869 boolean was_swallowed; /* digestion */
6871 struct permonst *mdat = mon->data;
6872 int i, tmp;
6873 boolean trolling = 0;
6874 boolean hasexploded = 0;
6876 int monsx, monsy;
6877 boolean terrainok = FALSE;
6878 if (mon) {
6879 monsx = mon->mx;
6880 monsy = mon->my;
6881 if (isok(monsx, monsy)) terrainok = TRUE;
6884 if (terrainok && mdat == &mons[PM_WATERFIELD_NYMPH]) {
6885 if (levl[monsx][monsy].typ == ROOM || levl[monsx][monsy].typ == CORR || (levl[monsx][monsy].typ >= ICE && levl[monsx][monsy].typ <= CRYPTFLOOR) || (levl[monsx][monsy].typ >= AIR && levl[monsx][monsy].typ <= RAINCLOUD)) {
6886 levl[monsx][monsy].typ = POOL;
6887 blockorunblock_point(monsx,monsy);
6888 if(cansee(monsx,monsy)) {
6889 newsym(monsx,monsy);
6893 if (terrainok && mdat == &mons[PM_DEEP_POOL_NYMPH]) {
6894 if (levl[monsx][monsy].typ == ROOM || levl[monsx][monsy].typ == CORR || (levl[monsx][monsy].typ >= ICE && levl[monsx][monsy].typ <= CRYPTFLOOR) || (levl[monsx][monsy].typ >= AIR && levl[monsx][monsy].typ <= RAINCLOUD)) {
6895 levl[monsx][monsy].typ = MOAT;
6896 blockorunblock_point(monsx,monsy);
6897 if(cansee(monsx,monsy)) {
6898 newsym(monsx,monsy);
6902 if (terrainok && mdat == &mons[PM_LAVALAND_NYMPH]) {
6903 if (levl[monsx][monsy].typ == ROOM || levl[monsx][monsy].typ == CORR || (levl[monsx][monsy].typ >= ICE && levl[monsx][monsy].typ <= CRYPTFLOOR) || (levl[monsx][monsy].typ >= AIR && levl[monsx][monsy].typ <= RAINCLOUD)) {
6904 levl[monsx][monsy].typ = LAVAPOOL;
6905 blockorunblock_point(monsx,monsy);
6906 if(cansee(monsx,monsy)) {
6907 newsym(monsx,monsy);
6912 if (mdat == &mons[PM_VLAD_THE_IMPALER] || (mdat->mlet == S_LICH && mdat != &mons[PM_LICHZARD] && !(mon->egotype_troll || (is_reviver(mdat))) ) ) {
6913 if (cansee(mon->mx, mon->my) && !was_swallowed)
6914 pline("%s body crumbles into dust.", s_suffix(Monnam(mon)));
6915 if (PlayerHearsSoundEffects) pline(issoviet ? "Vy ne poluchite trup. Ya udivlen, chto vy dazhe udalos' pobedit' takogo monstra, dolzhno byt', udacha, potomu chto ty na samom dele ochen' plokhoy igrok..." : "Dueouaaaaaaaaaah.");
6916 /* KMH -- make_corpse() handles Vecna */
6917 return (mdat == &mons[PM_VECNA]);
6920 /* Gas spores always explode upon death */
6921 for(i = 0; i < NATTK; i++) {
6922 if (mdat->mattk[i].aatyp == AT_BOOM) {
6923 if (mdat->mattk[i].damn)
6924 tmp = d((int)mdat->mattk[i].damn,
6925 (int)mdat->mattk[i].damd);
6926 else if(mdat->mattk[i].damd)
6927 tmp = d((int)mdat->mlevel+1, (int)mdat->mattk[i].damd);
6928 else tmp = 0;
6929 if (was_swallowed && magr) {
6930 if (magr == &youmonst) {
6931 There("is an explosion in your %s!",
6932 body_part(STOMACH));
6933 sprintf(killer_buf, "%s explosion",
6934 s_suffix(mdat->mname));
6935 if (Half_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) tmp = (tmp+1) / 2;
6936 if (StrongHalf_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) tmp = (tmp+1) / 2;
6937 losehp(tmp, killer_buf, KILLED_BY_AN);
6938 } else {
6939 if (flags.soundok) You_hear("an explosion.");
6940 magr->mhp -= tmp;
6941 if (magr->mhp < 1) mondied(magr);
6942 if (magr->mhp < 1) { /* maybe lifesaved */
6943 if (canspotmon(magr))
6944 pline("%s rips open!", Monnam(magr));
6945 } else if (canseemon(magr))
6946 pline("%s seems to have indigestion.",
6947 Monnam(magr));
6950 return FALSE;
6953 if (mon->egotype_troll || (is_reviver(mdat))) trolling = 1;
6954 sprintf(killer_buf, "%s explosion", s_suffix(mdat->mname));
6955 killer = killer_buf;
6956 killer_format = KILLED_BY_AN;
6957 explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS);
6958 if (!trolling) return (FALSE);
6959 } else if (mon->egotype_exploder && !hasexploded) {
6960 hasexploded = TRUE;
6961 tmp = d(2, 1 + (mon->m_lev * 5) );
6962 if (was_swallowed && magr) {
6963 if (magr == &youmonst) {
6964 There("is an explosion in your %s!",
6965 body_part(STOMACH));
6966 sprintf(killer_buf, "%s explosion",
6967 s_suffix(mdat->mname));
6968 if (Half_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) tmp = (tmp+1) / 2;
6969 if (StrongHalf_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) tmp = (tmp+1) / 2;
6970 losehp(tmp, killer_buf, KILLED_BY_AN);
6971 } else {
6972 if (flags.soundok) You_hear("an explosion.");
6973 magr->mhp -= tmp;
6974 if (magr->mhp < 1) mondied(magr);
6975 if (magr->mhp < 1) { /* maybe lifesaved */
6976 if (canspotmon(magr))
6977 pline("%s rips open!", Monnam(magr));
6978 } else if (canseemon(magr))
6979 pline("%s seems to have indigestion.",
6980 Monnam(magr));
6983 return FALSE;
6986 if (mon->egotype_troll || (is_reviver(mdat))) trolling = 1;
6987 sprintf(killer_buf, "%s explosion", s_suffix(mdat->mname));
6988 killer = killer_buf;
6989 killer_format = KILLED_BY_AN;
6990 explode(mon->mx, mon->my, -1, tmp, MON_EXPLODE, EXPL_NOXIOUS);
6991 if (!trolling) return (FALSE);
6995 /* freeplay mode isn't supposed to devolve into the player farming reviving bosses... --Amy */
6996 if (u.freeplaymode) {
6997 if (mdat == &mons[PM_CTHULHU]) return FALSE;
6998 if (is_rider(mdat)) return FALSE;
6999 if (is_deadlysin(mdat)) return FALSE;
7002 /* Cthulhu Deliquesces... */
7003 if (mdat == &mons[PM_CTHULHU]) {
7004 if (cansee(mon->mx, mon->my))
7005 pline("%s body deliquesces into a cloud of noxious gas!",
7006 s_suffix(Monnam(mon)));
7007 else
7008 You_hear("hissing and bubbling!");
7009 /* ...into a stinking cloud... */
7010 (void) create_cthulhu_death_cloud(mon->mx, mon->my, 3, 8);
7011 return (FALSE);
7014 /* must duplicate this below check in xkilled() since it results in
7015 * creating no objects as well as no corpse
7017 if (level_specific_nocorpse(mdat))
7018 return FALSE;
7020 if ( (u.uprops[STARVATION_EFFECT].extrinsic || StarvationEffect || (uarmc && uarmc->oartifact == ART_FEMMY_FATALE) || have_starvationstone() || (ublindf && ublindf->oartifact == ART_TOTAL_PERSPECTIVE_VORTEX) ) && STARVATION_SPECIFIC_NOCORPSE(mdat))
7021 return FALSE;
7023 /* generally lower chance to leave corpses for balancing reasons, but only if the player is advanced enough --Amy */
7024 if (!rn2(3) && !((u.urexp < 10000) && (moves < 10000)) && !mon->egotype_troll && !(is_reviver(mdat) && !(mdat->mlet == S_FUNGUS) ) && !(mdat == &mons[PM_TROLL_ZOMBIE]) && !(mdat == &mons[PM_VECNA]) && !(mdat == &mons[PM_NIGHTMARE]) && !(mdat == &mons[PM_BEHOLDER]) && !(mdat == &mons[PM_MEDUSA]) && !(mdat == &mons[PM_EGO_TROLL_MUMMY]) && !(mdat == &mons[PM_EVIL_TROLL_MUMMY]) && !(mdat == &mons[PM_TROLL_PERMAMIMIC_MUMMY]) && !(mdat == &mons[PM_TROLL_MUMMY]) && !mon->mtame)
7025 return FALSE;
7027 /* make it even less likely later in the game, because monsters are spawning more often anyway
7028 * floor value (at least rn2(7)) because we don't want phantom race player characters to have no chance at all */
7029 if (!timebasedlowerchance() && !timebasedlowerchance() && !(uwep && uwep->oartifact == ART_MEAT_S_BACK_ON_THE_MENU) && rn2(7) && !is_reviver(mdat) && !mon->egotype_troll && !(mdat == &mons[PM_TROLL_ZOMBIE]) && !(mdat == &mons[PM_VECNA]) && !(mdat == &mons[PM_NIGHTMARE]) && !(mdat == &mons[PM_BEHOLDER]) && !(mdat == &mons[PM_MEDUSA]) && !(mdat == &mons[PM_EGO_TROLL_MUMMY]) && !(mdat == &mons[PM_EVIL_TROLL_MUMMY]) && !(mdat == &mons[PM_TROLL_PERMAMIMIC_MUMMY]) && !(mdat == &mons[PM_TROLL_MUMMY]) && !mon->mtame)
7030 return FALSE;
7032 if (mon->egotype_troll || (is_reviver(mdat) && !(mdat->mlet == S_FUNGUS) ) || bigmonst(mdat) || mdat == &mons[PM_LIZARD] || mdat == &mons[PM_CAVE_LIZARD] || mdat == &mons[PM_CHAOS_LIZARD] || mdat == &mons[PM_CHAOTIC_LIZARD] || mdat == &mons[PM_LIZARD_EEL] || mdat == &mons[PM_EEL_LIZARD] || mdat == &mons[PM_INNOCLIZARD] || mdat == &mons[PM_FAT_LIZARD] || mdat == &mons[PM_BLUE_LIZARD] || mdat == &mons[PM_DARKEN_LIZARD] || mdat == &mons[PM_GRASS_LIZARD] || mdat == &mons[PM_PERFUSWAP_LIZARD] || mdat == &mons[PM_ALL_SUPPLY_LIZARD] || mdat == &mons[PM_TOPSIDE_LIZARD] || mdat == &mons[PM_DEAD_LIZARD] || mdat == &mons[PM_STOPWATCH_LIZARD] || mdat == &mons[PM_RUNE_LIZARD] || mdat == &mons[PM_YUNICOR_LIZARD] || mdat == &mons[PM_SPECTRAL_LIZARD] || mdat == &mons[PM_SWAMP_LIZARD] || mdat == &mons[PM_SPITTING_LIZARD] || mdat == &mons[PM_ROCK_LIZARD] || mdat == &mons[PM_WILL_STONE_LIZARD] || mdat == &mons[PM_WILL_RATCH_LIZARD] || mdat == &mons[PM_LICHZARD] || mdat == &mons[PM_SKELLIZARD] || mdat == &mons[PM_BABY_CAVE_LIZARD] || mdat == &mons[PM_NIGHT_LIZARD] || mdat == &mons[PM_LIZARD_MAN] || mdat == &mons[PM_LIZARD_KING] || mdat == &mons[PM_LIZARD_OF_YENDOR] || mdat == &mons[PM_ANTI_STONE_LIZARD] || mdat == &mons[PM_GIANT_LIZARD] || mdat == &mons[PM_HIDDEN_LIZARD] || mdat == &mons[PM_DEFORMED_LIZARD] || mdat == &mons[PM_MIMIC_LIZARD] || mdat == &mons[PM_CLINGING_LIZARD] || mdat == &mons[PM_HUGE_LIZARD] || mdat == &mons[PM_PACKED_LIZARD] || mdat == &mons[PM_UNSILIZARD] || mdat == &mons[PM_SILILIZARD] || mdat == &mons[PM_CORK_ESPADRILLE] || mdat == &mons[PM_VERY_SLOW_HUGE_LIZARD] || mdat == &mons[PM_PREHISTORIC_CAVE_LIZARD] || mdat == &mons[PM_KARMIC_LIZARD] || mdat == &mons[PM_GREEN_LIZARD] || mdat == &mons[PM_SCORZARD] || mdat == &mons[PM_DIGLIZARD] || mdat == &mons[PM_DIGGING_LIZARD] || mdat == &mons[PM_SAND_TIDE] || mdat == &mons[PM_O_P_E_L] || mdat == &mons[PM_MONSTER_LIZARD] || mdat == &mons[PM_FBI_AGENT] || mdat == &mons[PM_OWN_SMOKE] || mdat == &mons[PM_GRANDPA] || mdat == &mons[PM_ELONA_LIZARD_MAN] || mdat == &mons[PM_TOUCAN] || mdat == &mons[PM_GIANT_TOUCAN] || mdat == &mons[PM_CLOCKBACK_LIZARD] || mdat == &mons[PM_PRESSLIZARD] || mdat == &mons[PM_STATIOLIZARD] || mdat == &mons[PM_GIBLIZARD] || mdat == &mons[PM_CASINO_LIZARD]|| mdat == &mons[PM_LIZARD_MAGE] || mdat == &mons[PM_BLACK_LIZARDMAN] || mdat == &mons[PM_ASSASSIN_LIZARD] || mdat == &mons[PM_DANGEROUS_ASSASSIN_LIZARD] || mdat == &mons[PM_BLIZZARD_LIZARD] || mdat == &mons[PM_HELTH_LIZARD] || mdat == &mons[PM_NORMAL_LIZARD] || mdat == &mons[PM_ADULT_LIZARD] || mdat == &mons[PM_LIZZY] || mdat == &mons[PM_LIZARD_PRINCE] || mdat == &mons[PM_FIRE_LIZARD] || mdat == &mons[PM_LIGHTNING_LIZARD] || mdat == &mons[PM_ICE_LIZARD] || mdat == &mons[PM_BLACK_LIZARD] || mdat == &mons[PM_KATNISS]
7033 || is_golem(mdat)
7034 || is_mplayer(mdat)
7035 || is_umplayer(mdat)
7036 || is_deadlysin(mdat)
7037 || is_rider(mdat))
7038 return TRUE;
7040 return (boolean) (!rn2((int) /* why the heck does frequency matter for this??? --Amy */
7041 (2 /*+ ((int)(mdat->geno & G_FREQ)<2)*/ + verysmall(mdat))));
7044 /* drop (perhaps) a cadaver and remove monster */
7045 void
7046 mondied(mdef)
7047 register struct monst *mdef;
7049 mondead(mdef);
7050 if (mdef->mhp > 0) return; /* lifesaved */
7052 if (corpse_chance(mdef, (struct monst *)0, FALSE) /*&&
7053 (accessible(mdef->mx, mdef->my) || is_waterypool(mdef->mx, mdef->my))*/)
7054 (void) make_corpse(mdef);
7057 /* monster disappears, not dies */
7058 void
7059 mongone(mdef)
7060 register struct monst *mdef;
7062 mdef->mhp = 0; /* can skip some inventory bookkeeping */
7063 /* Player is thrown from his steed when it disappears */
7064 if (mdef == u.usteed)
7065 dismount_steed(DISMOUNT_GENERIC);
7067 /* drop special items like the Amulet so that a dismissed Kop or nurse
7068 can't remove them from the game */
7069 /* Amy edit: unless you're playing the evil variant :P */
7071 if (isevilvariant) {
7072 struct obj *obj, *otmp;
7074 for (obj = mdef->minvent; obj; obj = otmp) {
7075 otmp = obj->nobj;
7076 if (obj && obj->otyp == AMULET_OF_YENDOR && !u.freeplaymode) {
7077 u.youaredead = 1;
7078 u.youarereallydead = 1;
7079 pline("Oh no! The monster that was holding the Amulet of Yendor has left the dungeon and since your game is no longer winnable now, it ends here. Sorry.");
7080 killer_format = NO_KILLER_PREFIX;
7081 killer = "allowed the Amulet of Yendor to be removed from the dungeon";
7082 done(DIED);
7083 done(DIED);
7084 done(QUIT); /* sorry but your game *really* ends here --Amy */
7088 if (obj && (obj->otyp == CANDELABRUM_OF_INVOCATION || obj->otyp == BELL_OF_OPENING || obj->otyp == SPE_BOOK_OF_THE_DEAD) && !u.uevent.invoked && !u.freeplaymode) {
7089 u.youaredead = 1;
7090 u.youarereallydead = 1;
7091 pline("Oh no! One of the special items that were required to win the game has just been removed from the dungeon, and therefore your game is now over. Sorry.");
7092 killer_format = NO_KILLER_PREFIX;
7093 killer = "allowed an invocation artifact to be removed from the dungeon";
7094 done(DIED);
7095 done(DIED);
7096 done(QUIT); /* sorry but your game *really* ends here --Amy */
7104 mdrop_special_objs(mdef);
7105 /* release rest of monster's inventory--it is removed from game */
7106 discard_minvent(mdef);
7107 #ifndef GOLDOBJ
7108 mdef->mgold = 0L;
7109 #endif
7110 m_detach(mdef, mdef->data);
7113 /* drop a statue or rock and remove monster */
7114 void
7115 monstone(mdef)
7116 register struct monst *mdef;
7118 struct obj *otmp, *obj, *oldminvent;
7119 xchar x = mdef->mx, y = mdef->my;
7120 boolean wasinside = FALSE;
7122 /* we have to make the statue before calling mondead, to be able to
7123 * put inventory in it, and we have to check for lifesaving before
7124 * making the statue....
7126 lifesaved_monster(mdef);
7127 if (mdef->mhp > 0) return;
7129 mdef->mtrapped = 0; /* (see m_detach) */
7131 if ((int)mdef->data->msize > MZ_TINY ||
7132 !rn2(2 /*+ ((int) (mdef->data->geno & G_FREQ) > 2) */ )) {
7133 oldminvent = 0;
7134 /* some objects may end up outside the statue */
7135 while ((obj = mdef->minvent) != 0) {
7136 obj_extract_self(obj);
7137 if (obj->owornmask)
7138 update_mon_intrinsics(mdef, obj, FALSE, TRUE);
7139 obj_no_longer_held(obj);
7140 if (obj->owornmask & W_WEP)
7141 setmnotwielded(mdef,obj);
7142 obj->owornmask = 0L;
7143 if (obj->otyp == BOULDER ||
7144 #if 0 /* monsters don't carry statues */
7145 (obj->otyp == STATUE && mons[obj->corpsenm].msize >= mdef->data->msize) ||
7146 #endif
7147 obj_resists(obj, 0, 0)) {
7148 if (flooreffects(obj, x, y, "fall")) continue;
7149 place_object(obj, x, y);
7150 } else {
7151 if (obj->lamplit) end_burn(obj, TRUE);
7152 obj->nobj = oldminvent;
7153 oldminvent = obj;
7156 /* defer statue creation until after inventory removal
7157 so that saved monster traits won't retain any stale
7158 item-conferred attributes */
7159 otmp = mkcorpstat(STATUE, KEEPTRAITS(mdef) ? mdef : 0,
7160 mdef->data, x, y, FALSE);
7161 if (mdef->mnamelth) otmp = oname(otmp, NAME(mdef));
7162 while ((obj = oldminvent) != 0) {
7163 oldminvent = obj->nobj;
7165 /* reduce amount of musable items the player can use --Amy */
7166 if (is_musable(obj) && obj->mstartinvent && !(obj->oartifact) && !(obj->fakeartifact && timebasedlowerchance()) && (!rn2(3) || (rn2(100) < u.musableremovechance) || (rn2(4) && (obj->otyp == POT_BLOOD || obj->otyp == POT_VAMPIRE_BLOOD) ) || LootcutBug || u.uprops[LOOTCUT_BUG].extrinsic || have_lootcutstone() || (mdef->data->msound == MS_FLUIDATOR) || (mdef->data->msound == MS_BULLETATOR) || splittinggremlin(mdef->data) || splittinglavagremlin(mdef->data) || !timebasedlowerchance() || (!timebasedlowerchance() && ((u.urexp > 10000) || (moves > 10000)) ) ) && !(mdef->data == &mons[PM_GOOD_ITEM_MASTER]) && !(mdef->data == &mons[PM_BAD_ITEM_MASTER]) ) delobj(obj);
7167 else if (obj->mstartinventB && !(obj->oartifact) && !(obj->fakeartifact && timebasedlowerchance()) && (!rn2(4) || (rn2(100) < u.equipmentremovechance) || !timebasedlowerchance() ) && !(mdef->data == &mons[PM_GOOD_ITEM_MASTER]) && !(mdef->data == &mons[PM_BAD_ITEM_MASTER]) ) delobj(obj);
7168 else if (obj->mstartinventC && !(obj->oartifact) && !(obj->fakeartifact && !rn2(10)) && rn2(10) && !(mdef->data == &mons[PM_GOOD_ITEM_MASTER]) && !(mdef->data == &mons[PM_BAD_ITEM_MASTER]) ) delobj(obj);
7169 else if (obj->mstartinventE && !(obj->oartifact) && !(obj->fakeartifact && !rn2(20)) && rn2(20) && !(mdef->data == &mons[PM_GOOD_ITEM_MASTER]) && !(mdef->data == &mons[PM_BAD_ITEM_MASTER]) ) delobj(obj);
7170 else if (obj->mstartinventD && !(obj->oartifact) && !(obj->fakeartifact && !rn2(4)) && rn2(4) && !(mdef->data == &mons[PM_GOOD_ITEM_MASTER]) && !(mdef->data == &mons[PM_BAD_ITEM_MASTER]) ) delobj(obj);
7171 else if (obj->mstartinventX) delobj(obj);
7172 else (void) add_to_container(otmp, obj, TRUE);
7174 #ifndef GOLDOBJ
7175 if (mdef->mgold) {
7176 struct obj *au;
7177 au = mksobj(GOLD_PIECE, FALSE, FALSE, FALSE);
7178 au->quan = mdef->mgold;
7179 au->owt = weight(au);
7180 (void) add_to_container(otmp, au, TRUE);
7181 mdef->mgold = 0;
7183 #endif
7184 /* Archeologists should not break unique statues */
7185 if (mdef->data->geno & G_UNIQ)
7186 otmp->spe = 1;
7187 otmp->owt = weight(otmp);
7188 } else
7189 otmp = mksobj_at(ROCK, x, y, TRUE, FALSE, FALSE);
7191 if (otmp) stackobj(otmp);
7192 /* mondead() already does this, but we must do it before the newsym */
7193 if(memory_is_invisible(x, y))
7194 unmap_object(x, y);
7195 if (cansee(x, y)) newsym(x,y);
7196 /* We don't currently trap the hero in the statue in this case but we could */
7197 if (u.uswallow && u.ustuck == mdef) wasinside = TRUE;
7198 (void) stop_timer(UNPOLY_MON, (void *) mdef);
7199 mondead(mdef);
7200 if (wasinside) {
7201 if (is_animal(mdef->data))
7202 You("%s through an opening in the new %s.",
7203 locomotion(youmonst.data, "jump"),
7204 otmp ? xname(otmp) : "item");
7208 /* another monster has killed the monster mdef */
7209 void
7210 monkilled(mdef, fltxt, how)
7211 register struct monst *mdef;
7212 const char *fltxt;
7213 int how;
7215 boolean be_sad = FALSE; /* true if unseen pet is killed */
7217 if ((mdef->wormno ? worm_known(mdef) : cansee(mdef->mx, mdef->my))
7218 && fltxt)
7219 pline("%s is %s%s%s!", Monnam(mdef),
7220 nonliving(mdef->data) ? "destroyed" : "killed",
7221 *fltxt ? " by the " : "",
7222 fltxt
7224 else
7225 be_sad = (mdef->mtame != 0 && !mdef->isspell);
7227 if (mdef->mtame != 0 && uarmc && itemhasappearance(uarmc, APP_POKE_MONGO_CLOAK) ) {
7228 pline("You allowed a pet to die, thereby incurring the wrath of the gods!");
7229 u.ugangr += rnd(3);
7232 if (mdef->mtame != 0 && !mdef->isspell) u.cnd_petdeathcount++;
7234 /* no corpses if digested or disintegrated */
7235 if(how == AD_DGST || how == -AD_RBRE)
7236 mondead(mdef);
7237 else
7238 mondied(mdef);
7240 if (be_sad && mdef->mhp <= 0) {
7241 You(FunnyHallu ? "are feeling totally down for a moment, then it passes." : (Role_if(PM_PIRATE) || Role_if(PM_KORSAIR) || PirateSpeakOn) ? "hang the jib for a moment, then it passes." : "have a sad feeling for a moment, then it passes.");
7242 if (PlayerHearsSoundEffects) pline(issoviet ? "Da! Vash pitomets umer! Tip bloka l'da ochen' pozabavilo!" : "Daeaeae-aeaeaeaeae!");
7248 /* WAC -- another monster has killed the monster mdef and you get exp. */
7249 void
7250 mon_xkilled(mdef, fltxt, how)
7251 register struct monst *mdef;
7252 const char *fltxt;
7253 int how;
7255 boolean be_sad = FALSE; /* true if unseen pet is killed */
7257 if ((mdef->wormno ? worm_known(mdef) : cansee(mdef->mx, mdef->my))
7258 && fltxt)
7259 pline("%s is %s%s%s!", Monnam(mdef),
7260 nonliving(mdef->data) ? "destroyed" : "killed",
7261 *fltxt ? " by the " : "",
7262 fltxt);
7263 else
7264 be_sad = (mdef->mtame != 0 && !mdef->isspell);
7266 if (mdef->mtame != 0 && !mdef->isspell) u.cnd_petdeathcount++;
7268 /* no corpses if digested or disintegrated */
7269 if(how == AD_DGST || how == -AD_RBRE)
7270 xkilled(mdef,2);
7271 else
7272 xkilled(mdef,0);
7274 if (be_sad && mdef->mhp <= 0) {
7275 You(FunnyHallu ? "are feeling totally down for a moment, then it passes." : (Role_if(PM_PIRATE) || Role_if(PM_KORSAIR) || PirateSpeakOn) ? "hang the jib for a moment, then it passes." : "have a sad feeling for a moment, then it passes.");
7276 if (PlayerHearsSoundEffects) pline(issoviet ? "Da! Vash pitomets umer! Tip bloka l'da ochen' pozabavilo!" : "Daeaeae-aeaeaeaeae!");
7281 void
7282 unstuck(mtmp)
7283 register struct monst *mtmp;
7285 if(u.ustuck == mtmp) {
7286 if(u.uswallow){
7287 u.ux = mtmp->mx;
7288 u.uy = mtmp->my;
7289 u.uswallow = 0;
7290 u.uswldtim = 0;
7291 if (Punished) placebc();
7292 vision_full_recalc = 1;
7293 docrt();
7295 setustuck(0);
7299 void
7300 killed(mtmp)
7301 register struct monst *mtmp;
7303 xkilled(mtmp, 1);
7306 /* the player has killed the monster mtmp */
7307 void
7308 xkilled(mtmp, dest)
7309 register struct monst *mtmp;
7311 * Dest=1, normal; dest=0, don't print message; dest=2, don't drop corpse
7312 * either; dest=3, message but no corpse
7314 int dest;
7316 register int tmp, x = mtmp->mx, y = mtmp->my;
7317 register struct permonst *mdat;
7318 int mndx;
7319 register struct obj *otmp;
7320 register struct trap *t;
7321 boolean redisp = FALSE;
7322 boolean wasinside = u.uswallow && (u.ustuck == mtmp);
7324 mdat = mtmp->data; /* mondead can change that, see below */
7326 if (practicantterror && !u.pract_shopkeepers) {
7327 if (mdat == &mons[PM_SHOPKEEPER] || mdat == &mons[PM_MASTER_SHOPKEEPER] || mdat == &mons[PM_EXCEPTIONAL_SHOPKEEPER] || mdat == &mons[PM_EXPERIENCED_SHOPKEEPER] || mdat == &mons[PM_ELITE_SHOPKEEPER]) u.pract_shopkeepercount++;
7328 if (u.pract_shopkeepercount >= 5) {
7329 pline("%s rings out: '8000 zorkmids, payable right away to my account. Last warning. Kill any more shopkeepers and I'm enormously cracking your cardboard boxes.'", noroelaname());
7330 fineforpracticant(8000, 0, 0);
7331 u.pract_shopkeepers = TRUE;
7334 if (practicantterror && !u.pract_peacedisturb) {
7335 if (mdat == &mons[PM_SHOPKEEPER] || mdat == &mons[PM_MASTER_SHOPKEEPER] || mdat == &mons[PM_EXPERIENCED_SHOPKEEPER] || mdat == &mons[PM_EXCEPTIONAL_SHOPKEEPER] || mdat == &mons[PM_ELITE_SHOPKEEPER] || mdat == &mons[PM_GUARD] || mdat == &mons[PM_MASTER_GUARD] || mdat == &mons[PM_EXPERIENCED_GUARD] || mdat == &mons[PM_EXCEPTIONAL_GUARD] || mdat == &mons[PM_ELITE_GUARD] || mdat == &mons[PM_CROUPIER] || mdat == &mons[PM_MASTER_CROUPIER] || mdat == &mons[PM_EXPERIENCED_CROUPIER] || mdat == &mons[PM_EXCEPTIONAL_CROUPIER] || mdat == &mons[PM_ELITE_CROUPIER] || mdat == &mons[PM_ALIGNED_PRIEST] || mdat == &mons[PM_ELITE_PRIEST] || mdat == &mons[PM_EXCEPTIONAL_PRIEST] || mdat == &mons[PM_EXPERIENCED_PRIEST] || mdat == &mons[PM_MASTER_PRIEST] || mdat == &mons[PM_HIGH_PRIEST] || mdat == &mons[PM_DNETHACK_ELDER_PRIEST_TM_] || mdat == &mons[PM_WATCHMAN] || mdat == &mons[PM_WATCH_CAPTAIN] || mdat == &mons[PM_WATCH_LIEUTENANT] || mdat == &mons[PM_WATCH_LEADER]) u.pract_disturbcount++;
7337 if (u.pract_disturbcount >= 20) {
7338 pline("%s thunders: 'That was the last straw for you! From now on you pay the conventional penalty for too many murders without permission, for the rest of your life!'", noroelaname());
7339 u.pract_conv3timer = 5000;
7340 u.pract_peacedisturb = TRUE;
7344 /* KMH, conduct */
7345 u.uconduct.killer++;
7347 /* this probably isn't foolproof, but if a monster's death is processed while the player's symbiote is attacking,
7348 * we assume that the player's symbiote has killed the monster --Amy */
7349 if (u.symbioteattacking) {
7350 u.cnd_symbiotekills++;
7351 mightbooststat(A_CHA);
7352 symbiotemaygainhealth();
7355 if ((mtmp->data->msound == MS_HCALIEN) && !mtmp->mrevived) mightbooststat(A_INT);
7357 if ((mtmp->data->geno & G_UNIQ) && !mtmp->mrevived) mightbooststat(A_CON);
7359 if (Role_if(PM_DANCER) && u.dancercombostrike) {
7360 u.dancercombostrike = 0;
7361 u.dancercomboactive = FALSE;
7362 You("finish dancing.");
7365 if (Role_if(PM_BLOODSEEKER)) healup(mtmp->m_lev, 0, FALSE, FALSE); /* special ability called "Stygwyr's Thirst" */
7366 if (uwep && uwep->oartifact == ART_ALDEBARAN_FORM) healup(mtmp->m_lev, 0, FALSE, FALSE);
7367 if (uwep && uwep->oartifact == ART_FOR_STYGWYR_) healup(mtmp->m_lev, 0, FALSE, FALSE);
7369 if (uwep && uwep->oartifact == ART_TECPATL_OF_HUHETOTL) {
7370 u.ublesscnt -= 50;
7371 if (u.ublesscnt < 0) u.ublesscnt = 0; /* fail safe */
7374 if (uwep && uwep->oartifact == ART_SOUL_EDGE) healup(1, 0, FALSE, FALSE);
7375 if (uwep && uwep->oartifact == ART_WIERD_ACCENT) healup(1, 0, FALSE, FALSE);
7377 if (!PlayerCannotUseSkills && ((uarm && uarm->oartifact == ART_ALPHA_TAURI) || (uwep && uwep->otyp == LASER_FLYAXE) || Role_if(PM_HEDDERJEDI)) && uwep && (Flying || (uwep->oartifact == ART_ALDEBARAN_FORM)) && ((is_lightsaber(uwep) && uwep->lamplit) || !rn2(3) ) ) {
7378 int alphatauriheal = 0;
7379 if (u.aldebaranskill >= 20) alphatauriheal++;
7380 if (u.aldebaranskill >= 160) alphatauriheal++;
7381 if (u.aldebaranskill >= 540) alphatauriheal++;
7382 if (u.aldebaranskill >= 1280) alphatauriheal++;
7383 if (u.aldebaranskill >= 2500) alphatauriheal++;
7384 if (u.aldebaranskill >= 4320) alphatauriheal++;
7385 healup(alphatauriheal, 0, FALSE, FALSE);
7388 if (!SkillTrainingImpossible) {
7389 if (uwep && uwep->lamplit && ((uwep->oartifact == ART_ALDEBARAN_FORM) || (is_lightsaber(uwep) && Flying) ) ) {
7390 u.aldebaranturns++;
7391 if (u.aldebaranturns >= 2) {
7392 u.aldebaranturns = 0;
7393 u.aldebaranskill++;
7394 if ((uwep && uwep->oartifact == ART_ALDEBARAN_FORM) || (Role_if(PM_HEDDERJEDI)) || (uarm && uarm->oartifact == ART_ALPHA_TAURI)) {
7395 if (u.aldebaranskill == 20) You("are now more skilled in form XI (Aldebaran).");
7396 if (u.aldebaranskill == 160) You("are now more skilled in form XI (Aldebaran).");
7397 if (u.aldebaranskill == 540) You("are now more skilled in form XI (Aldebaran).");
7398 if (u.aldebaranskill == 1280) You("are now more skilled in form XI (Aldebaran).");
7399 if (u.aldebaranskill == 2500) You("are now more skilled in form XI (Aldebaran).");
7400 if (u.aldebaranskill == 4320) You("are now most skilled in form XI (Aldebaran).");
7406 if (Race_if(PM_ETHEREALOID) && !rn2(2)) healup(mtmp->m_lev, 0, FALSE, FALSE);
7407 if (Race_if(PM_INCORPOREALOID) && !rn2(2)) healup(mtmp->m_lev, 0, FALSE, FALSE);
7408 /* Demo wants a complicated calculation for how many HP the etherealoid gains from a kill... I took the easy way out */
7410 if (uwep && uwep->oartifact == ART_GOLDIFICATION && mtmp->m_lev > 0) {
7411 u.ugold += mtmp->m_lev;
7413 if (uwep && uwep->oartifact == ART_PRICK_BEARER_S_RANSOM && mtmp->m_lev > 0) {
7414 u.ugold += mtmp->m_lev;
7417 if (uimplant && uimplant->oartifact == ART_ETERNAL_SORENESS && !rn2(50)) {
7418 u.uhpmax++;
7419 if (Upolyd) u.mhmax++;
7420 if (uinsymbiosis) {
7421 u.usymbiote.mhpmax++;
7422 if (u.usymbiote.mhpmax > 500) u.usymbiote.mhpmax = 500;
7423 maybe_evolve_symbiote();
7427 if (uwep && uwep->oartifact == ART_RIP_STRATEGY) healup(mtmp->m_lev, 0, FALSE, FALSE);
7429 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_BURN_BABY_BURN) {
7430 healup(mtmp->m_lev, 0, FALSE, FALSE);
7431 u.uen += mtmp->m_lev;
7432 if (u.uen > u.uenmax) u.uen = u.uenmax;
7435 if (uarmf && itemhasappearance(uarmf, APP_RED_SNEAKERS)) healup( (mtmp->m_lev / 3), 0, FALSE, FALSE);
7437 if (Manaleech && !rn2(3) ) { /* leech mana from killed monsters */
7438 u.uen += rno(mtmp->m_lev + 1); /* rno instead of rnd, and added rn2 above, due to this property being too unbalanced --Amy */
7439 if (u.uen > u.uenmax) u.uen = u.uenmax;
7442 if (StrongManaleech && !rn2(3) ) { /* leech mana from killed monsters */
7443 u.uen += rno(mtmp->m_lev + 1); /* rno instead of rnd, and added rn2 above, due to this property being too unbalanced --Amy */
7444 if (u.uen > u.uenmax) u.uen = u.uenmax;
7447 if (uarmc && itemhasappearance(uarmc, APP_ENERGIZER_CLOAK) && !rn2(3) ) {
7448 u.uen += rno((mtmp->m_lev + 5) / 5);
7449 if (u.uen > u.uenmax) u.uen = u.uenmax;
7453 if (dest & 1) {
7454 const char *verb = nonliving(mtmp->data) ? "destroy" : "kill";
7456 if (!wasinside && !canspotmon(mtmp))
7457 You("%s it!", verb);
7458 else {
7459 You("%s %s!", verb,
7460 !mtmp->mtame ? mon_nam(mtmp) :
7461 x_monnam(mtmp,
7462 mtmp->mnamelth ? ARTICLE_NONE : ARTICLE_THE,
7463 "poor",
7464 mtmp->mnamelth ? SUPPRESS_SADDLE : 0,
7465 FALSE));
7469 if (mtmp->mtrapped && (t = t_at(x, y)) != 0 &&
7470 (t->ttyp == PIT || t->ttyp == SPIKED_PIT || t->ttyp == GIANT_CHASM || t->ttyp == SHIT_PIT || t->ttyp == MANA_PIT || t->ttyp == ANOXIC_PIT || t->ttyp == HYPOXIC_PIT || t->ttyp == ACID_PIT) &&
7471 sobj_at(BOULDER, x, y))
7472 dest |= 2; /*
7473 * Prevent corpses/treasure being created "on top"
7474 * of the boulder that is about to fall in. This is
7475 * out of order, but cannot be helped unless this
7476 * whole routine is rearranged.
7479 /* your pet knows who just killed it...watch out */
7480 if (mtmp->mtame && !mtmp->isminion) EDOG(mtmp)->killed_by_u = 1;
7482 /* dispose of monster and make cadaver */
7483 if(stoned) monstone(mtmp);
7484 else mondead(mtmp);
7486 if (mtmp->mhp > 0) { /* monster cheated death */
7487 /* Cannot put the non-visible lifesaving message in
7488 * lifesaved_monster()/unpoly_monster() since the message
7489 * appears only when you kill it (as opposed to visible
7490 * lifesaving which always appears).
7492 stoned = FALSE;
7493 if ((!u.uswallow || u.ustuck != mtmp) && !cansee(x, y))
7494 pline("Maybe not...");
7495 return;
7498 mdat = mtmp->data; /* note: mondead can change mtmp->data */
7499 mndx = monsndx(mdat);
7501 if (stoned) {
7502 stoned = FALSE;
7503 goto cleanup;
7506 if((dest & 2) || level_specific_nocorpse(mdat))
7507 goto cleanup;
7509 #ifdef MAIL
7510 if(mdat == &mons[PM_MAIL_DAEMON]) {
7511 stackobj(mksobj_at(SCR_MAIL, x, y, FALSE, FALSE, FALSE));
7512 redisp = TRUE;
7514 #endif
7516 /* In Soviet Russia, you may certainly never get something from a monster if it dies while you're engulfed by it
7517 * or while the monster is in a wall. After all, that would be a violation of the Kreml's regulations. Not that the
7518 * items generated that way would do any harm to anyone, but of course "rules are rules"... --Amy */
7520 if (issoviet && (x == u.ux) && (y == u.uy) ) goto sovietnothing;
7522 if((!accessible(x, y) && !is_waterypool(x, y) && !is_watertunnel(x,y)) ||
7523 (x == u.ux && y == u.uy)) {
7524 /* might be mimic in wall or corpse in lava or on player's spot */
7525 redisp = TRUE;
7526 if(wasinside) spoteffects(TRUE);
7527 if (issoviet) goto sovietnothing;
7528 } /*else*/ if(/*x != u.ux || y != u.uy && */!attacktype(mdat, AT_MULTIPLY) && (!mtmp->isspell) && (!mtmp->egotype_multiplicator) ) { /* multipliers could otherwise be farmed */
7529 /* might be here after swallowed */
7531 /* Throw a bone to vampiric and ghast players who cannot unstone themselves easily. --Amy */
7532 if ((mdat == &mons[PM_LIZARD] || mdat == &mons[PM_CAVE_LIZARD] || mdat == &mons[PM_PREHISTORIC_CAVE_LIZARD] || mdat == &mons[PM_CHAOS_LIZARD] || mdat == &mons[PM_HUGE_LIZARD] || mdat == &mons[PM_CORK_ESPADRILLE] || mdat == &mons[PM_PACKED_LIZARD] || mdat == &mons[PM_UNSILIZARD] || mdat == &mons[PM_SILILIZARD] || mdat == &mons[PM_VERY_SLOW_HUGE_LIZARD] || mdat == &mons[PM_CHAOTIC_LIZARD] || mdat == &mons[PM_SAND_TIDE] || mdat == &mons[PM_O_P_E_L] || mdat == &mons[PM_FIRE_LIZARD] || mdat == &mons[PM_ROCK_LIZARD] || mdat == &mons[PM_WILL_STONE_LIZARD] || mdat == &mons[PM_WILL_RATCH_LIZARD] || mdat == &mons[PM_BABY_CAVE_LIZARD] || mdat == &mons[PM_LICHZARD] || mdat == &mons[PM_SKELLIZARD] || mdat == &mons[PM_NIGHT_LIZARD] || mdat == &mons[PM_FBI_AGENT] || mdat == &mons[PM_OWN_SMOKE] || mdat == &mons[PM_DIGLIZARD] || mdat == &mons[PM_DIGGING_LIZARD] || mdat == &mons[PM_GRANDPA] || mdat == &mons[PM_ELONA_LIZARD_MAN] || mdat == &mons[PM_TOUCAN] || mdat == &mons[PM_GIANT_TOUCAN] || mdat == &mons[PM_LIZZY] || mdat == &mons[PM_LIZARD_MAGE] || mdat == &mons[PM_BLACK_LIZARDMAN] || mdat == &mons[PM_ASSASSIN_LIZARD] || mdat == &mons[PM_DANGEROUS_ASSASSIN_LIZARD] || mdat == &mons[PM_BLIZZARD_LIZARD] || mdat == &mons[PM_CLOCKBACK_LIZARD] || mdat == &mons[PM_PRESSLIZARD] || mdat == &mons[PM_STATIOLIZARD] || mdat == &mons[PM_GIBLIZARD] || mdat == &mons[PM_CASINO_LIZARD] || mdat == &mons[PM_LIZARD_PRINCE] || mdat == &mons[PM_ADULT_LIZARD] || mdat == &mons[PM_HELTH_LIZARD] || mdat == &mons[PM_NORMAL_LIZARD] || mdat == &mons[PM_LIGHTNING_LIZARD] || mdat == &mons[PM_KARMIC_LIZARD] || mdat == &mons[PM_GREEN_LIZARD] || mdat == &mons[PM_BLACK_LIZARD] || mdat == &mons[PM_SCORZARD] || mdat == &mons[PM_MONSTER_LIZARD] || mdat == &mons[PM_ICE_LIZARD] || mdat == &mons[PM_GRASS_LIZARD] || mdat == &mons[PM_PERFUSWAP_LIZARD] || mdat == &mons[PM_ALL_SUPPLY_LIZARD] || mdat == &mons[PM_TOPSIDE_LIZARD] || mdat == &mons[PM_DEAD_LIZARD] || mdat == &mons[PM_RUNE_LIZARD] || mdat == &mons[PM_YUNICOR_LIZARD] || mdat == &mons[PM_STOPWATCH_LIZARD] || mdat == &mons[PM_SPECTRAL_LIZARD] || mdat == &mons[PM_BLUE_LIZARD] || mdat == &mons[PM_DARKEN_LIZARD] || mdat == &mons[PM_SWAMP_LIZARD] || mdat == &mons[PM_SPITTING_LIZARD] || mdat == &mons[PM_LIZARD_EEL] || mdat == &mons[PM_INNOCLIZARD] || mdat == &mons[PM_FAT_LIZARD] || mdat == &mons[PM_HIDDEN_LIZARD] || mdat == &mons[PM_DEFORMED_LIZARD] || mdat == &mons[PM_MIMIC_LIZARD] || mdat == &mons[PM_CLINGING_LIZARD] || mdat == &mons[PM_LIZARD_MAN] || mdat == &mons[PM_LIZARD_OF_YENDOR] || mdat == &mons[PM_LIZARD_KING] || mdat == &mons[PM_GIANT_LIZARD] || mdat == &mons[PM_EEL_LIZARD] || mdat == &mons[PM_ANTI_STONE_LIZARD]) && !rn2(5) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(POT_ACID, x, y, TRUE, FALSE, FALSE);
7533 /* of course the acid potions are useful for other races too, if they run out of lizard corpses */
7535 if ((mdat == &mons[PM_SQUIRREL] || mdat == &mons[PM_IGUANA] || mdat == &mons[PM_HELPFUL_SQUIRREL] || mdat == &mons[PM_STAR_SQUIRREL] || mdat == &mons[PM_BIG_IGUANA]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(CARROT, x, y, TRUE, FALSE, FALSE);
7536 if ((mdat == &mons[PM_SQUIRREL] || mdat == &mons[PM_IGUANA] || mdat == &mons[PM_HELPFUL_SQUIRREL] || mdat == &mons[PM_STAR_SQUIRREL] || mdat == &mons[PM_BIG_IGUANA]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(BANANA, x, y, TRUE, FALSE, FALSE);
7537 if ((mdat == &mons[PM_SQUIRREL] || mdat == &mons[PM_IGUANA] || mdat == &mons[PM_HELPFUL_SQUIRREL] || mdat == &mons[PM_STAR_SQUIRREL] || mdat == &mons[PM_BIG_IGUANA]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(MELON, x, y, TRUE, FALSE, FALSE);
7538 if ((mdat == &mons[PM_SQUIRREL] || mdat == &mons[PM_IGUANA] || mdat == &mons[PM_HELPFUL_SQUIRREL] || mdat == &mons[PM_STAR_SQUIRREL] || mdat == &mons[PM_BIG_IGUANA]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(PEAR, x, y, TRUE, FALSE, FALSE);
7539 if ((mdat == &mons[PM_SQUIRREL] || mdat == &mons[PM_IGUANA] || mdat == &mons[PM_HELPFUL_SQUIRREL] || mdat == &mons[PM_STAR_SQUIRREL] || mdat == &mons[PM_BIG_IGUANA]) && !rn2(50) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(ASIAN_PEAR, x, y, TRUE, FALSE, FALSE);
7541 if ((mdat == &mons[PM_GECKO] || mdat == &mons[PM_GIANT_GECKO] || mdat == &mons[PM_FLYING_GECKO]) && !rn2(40) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(EUCALYPTUS_LEAF, x, y, TRUE, FALSE, FALSE);
7543 if ((mdat == &mons[PM_RHAUMBUSUN] || mdat == &mons[PM_FEMBUSUN] || mdat == &mons[PM_BLOODBUSUN] || mdat == &mons[PM_BIG_RHAUMBUSUN]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_FIRE, x, y, TRUE, FALSE, FALSE);
7545 if ((mdat == &mons[PM_SALAMANDER] || mdat == &mons[PM_SALAMANDER_SLAVE] || mdat == &mons[PM_SALAMANDER_PRISONER] || mdat == &mons[PM_SALAMANDER_MAGE] || mdat == &mons[PM_SALAMANDER_SHAMAN] || mdat == &mons[PM_PARALYSIS_WHIP_SALAMANDER] || mdat == &mons[PM_POISON_WHIP_SALAMANDER] || mdat == &mons[PM_FROST_SALAMANDER] || mdat == &mons[PM_KOMODO_DRAGON] || mdat == &mons[PM_PETTY_KOMODO_DRAGON] || mdat == &mons[PM_HISSER_KOMODO_DRAGON]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(CREAM_PIE, x, y, TRUE, FALSE, FALSE);
7546 if ((mdat == &mons[PM_SALAMANDER] || mdat == &mons[PM_SALAMANDER_SLAVE] || mdat == &mons[PM_SALAMANDER_PRISONER] || mdat == &mons[PM_SALAMANDER_MAGE] || mdat == &mons[PM_SALAMANDER_SHAMAN] || mdat == &mons[PM_PARALYSIS_WHIP_SALAMANDER] || mdat == &mons[PM_POISON_WHIP_SALAMANDER] || mdat == &mons[PM_FROST_SALAMANDER] || mdat == &mons[PM_KOMODO_DRAGON] || mdat == &mons[PM_PETTY_KOMODO_DRAGON] || mdat == &mons[PM_HISSER_KOMODO_DRAGON]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(APPLE, x, y, TRUE, FALSE, FALSE);
7547 if ((mdat == &mons[PM_SALAMANDER] || mdat == &mons[PM_SALAMANDER_SLAVE] || mdat == &mons[PM_SALAMANDER_PRISONER] || mdat == &mons[PM_SALAMANDER_MAGE] || mdat == &mons[PM_SALAMANDER_SHAMAN] || mdat == &mons[PM_PARALYSIS_WHIP_SALAMANDER] || mdat == &mons[PM_POISON_WHIP_SALAMANDER] || mdat == &mons[PM_FROST_SALAMANDER] || mdat == &mons[PM_KOMODO_DRAGON] || mdat == &mons[PM_PETTY_KOMODO_DRAGON] || mdat == &mons[PM_HISSER_KOMODO_DRAGON]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(ORANGE, x, y, TRUE, FALSE, FALSE);
7548 if ((mdat == &mons[PM_SALAMANDER] || mdat == &mons[PM_SALAMANDER_SLAVE] || mdat == &mons[PM_SALAMANDER_PRISONER] || mdat == &mons[PM_SALAMANDER_MAGE] || mdat == &mons[PM_SALAMANDER_SHAMAN] || mdat == &mons[PM_PARALYSIS_WHIP_SALAMANDER] || mdat == &mons[PM_POISON_WHIP_SALAMANDER] || mdat == &mons[PM_FROST_SALAMANDER] || mdat == &mons[PM_KOMODO_DRAGON] || mdat == &mons[PM_PETTY_KOMODO_DRAGON] || mdat == &mons[PM_HISSER_KOMODO_DRAGON]) && !rn2(20) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && timebasedlowerchance() && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(LEMON, x, y, TRUE, FALSE, FALSE);
7550 if (mdat == &mons[PM_SMALL_ITEM_TROVE]) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7552 if (mdat == &mons[PM_ITEM_TROVE]) {
7553 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7554 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7557 if (mdat == &mons[PM_LARGE_ITEM_TROVE]) {
7558 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7559 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7560 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7563 if (mdat == &mons[PM_GIANT_ITEM_TROVE]) {
7564 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7565 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7566 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7567 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7570 if (mdat == &mons[PM_ENORMOUS_ITEM_TROVE]) {
7571 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7572 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7573 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7574 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7575 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7578 if (mdat == &mons[PM_UNIHORN_TROVE]) otmp = mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
7580 if (mdat == &mons[PM_MEGA_UNIHORN_TROVE]) {
7581 otmp = mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
7582 otmp = mksobj_at(UNICORN_HORN, x, y, TRUE, FALSE, FALSE);
7585 if (mdat == &mons[PM_POTION_TROVE]) otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7586 if (mdat == &mons[PM_WEAPON_TROVE]) otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7587 if (mdat == &mons[PM_ARMOR_TROVE]) otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7588 if (mdat == &mons[PM_RING_TROVE]) otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7589 if (mdat == &mons[PM_AMULET_TROVE]) otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7590 if (mdat == &mons[PM_IMPLANT_TROVE]) otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7591 if (mdat == &mons[PM_TOOL_TROVE]) otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7592 if (mdat == &mons[PM_FOOD_TROVE]) otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7593 if (mdat == &mons[PM_SCROLL_TROVE]) otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7594 if (mdat == &mons[PM_SPELLBOOK_TROVE]) otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7595 if (mdat == &mons[PM_WAND_TROVE]) otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7596 if (mdat == &mons[PM_GEM_TROVE]) otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7598 if (mdat == &mons[PM_LARGE_POTION_TROVE]) {
7599 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7600 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7602 if (mdat == &mons[PM_LARGE_WEAPON_TROVE]) {
7603 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7604 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7606 if (mdat == &mons[PM_LARGE_ARMOR_TROVE]) {
7607 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7608 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7610 if (mdat == &mons[PM_LARGE_RING_TROVE]) {
7611 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7612 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7614 if (mdat == &mons[PM_LARGE_AMULET_TROVE]) {
7615 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7616 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7618 if (mdat == &mons[PM_LARGE_IMPLANT_TROVE]) {
7619 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7620 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7622 if (mdat == &mons[PM_LARGE_TOOL_TROVE]) {
7623 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7624 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7626 if (mdat == &mons[PM_LARGE_FOOD_TROVE]) {
7627 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7628 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7630 if (mdat == &mons[PM_LARGE_SCROLL_TROVE]) {
7631 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7632 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7634 if (mdat == &mons[PM_LARGE_SPELLBOOK_TROVE]) {
7635 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7636 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7638 if (mdat == &mons[PM_LARGE_WAND_TROVE]) {
7639 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7640 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7642 if (mdat == &mons[PM_LARGE_GEM_TROVE]) {
7643 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7644 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7645 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7648 if (mdat == &mons[PM_BIG_POTION_TROVE]) {
7649 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7650 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7651 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7653 if (mdat == &mons[PM_BIG_WEAPON_TROVE]) {
7654 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7655 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7656 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7658 if (mdat == &mons[PM_BIG_ARMOR_TROVE]) {
7659 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7660 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7661 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7663 if (mdat == &mons[PM_BIG_RING_TROVE]) {
7664 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7665 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7666 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7668 if (mdat == &mons[PM_BIG_AMULET_TROVE]) {
7669 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7670 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7671 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7673 if (mdat == &mons[PM_BIG_IMPLANT_TROVE]) {
7674 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7675 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7676 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7678 if (mdat == &mons[PM_BIG_TOOL_TROVE]) {
7679 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7680 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7681 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7683 if (mdat == &mons[PM_BIG_FOOD_TROVE]) {
7684 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7685 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7686 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7688 if (mdat == &mons[PM_BIG_SCROLL_TROVE]) {
7689 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7690 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7691 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7693 if (mdat == &mons[PM_BIG_SPELLBOOK_TROVE]) {
7694 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7695 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7696 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7698 if (mdat == &mons[PM_BIG_WAND_TROVE]) {
7699 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7700 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7701 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7703 if (mdat == &mons[PM_BIG_GEM_TROVE]) {
7704 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7705 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7706 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7707 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7708 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7711 if (mdat == &mons[PM_GIANT_POTION_TROVE]) {
7712 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7713 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7714 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7715 otmp = mkobj_at(POTION_CLASS, x, y, TRUE, FALSE);
7717 if (mdat == &mons[PM_GIANT_WEAPON_TROVE]) {
7718 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7719 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7720 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7721 otmp = mkobj_at(WEAPON_CLASS, x, y, TRUE, FALSE);
7723 if (mdat == &mons[PM_GIANT_ARMOR_TROVE]) {
7724 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7725 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7726 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7727 otmp = mkobj_at(ARMOR_CLASS, x, y, TRUE, FALSE);
7729 if (mdat == &mons[PM_GIANT_RING_TROVE]) {
7730 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7731 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7732 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7733 otmp = mkobj_at(RING_CLASS, x, y, TRUE, FALSE);
7735 if (mdat == &mons[PM_GIANT_AMULET_TROVE]) {
7736 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7737 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7738 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7739 otmp = mkobj_at(AMULET_CLASS, x, y, TRUE, FALSE);
7741 if (mdat == &mons[PM_GIANT_IMPLANT_TROVE]) {
7742 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7743 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7744 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7745 otmp = mkobj_at(IMPLANT_CLASS, x, y, TRUE, FALSE);
7747 if (mdat == &mons[PM_GIANT_TOOL_TROVE]) {
7748 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7749 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7750 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7751 otmp = mkobj_at(TOOL_CLASS, x, y, TRUE, FALSE);
7753 if (mdat == &mons[PM_GIANT_FOOD_TROVE]) {
7754 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7755 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7756 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7757 otmp = mkobj_at(FOOD_CLASS, x, y, TRUE, FALSE);
7759 if (mdat == &mons[PM_GIANT_SCROLL_TROVE]) {
7760 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7761 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7762 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7763 otmp = mkobj_at(SCROLL_CLASS, x, y, TRUE, FALSE);
7765 if (mdat == &mons[PM_GIANT_SPELLBOOK_TROVE]) {
7766 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7767 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7768 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7769 otmp = mkobj_at(SPBOOK_CLASS, x, y, TRUE, FALSE);
7771 if (mdat == &mons[PM_GIANT_WAND_TROVE]) {
7772 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7773 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7774 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7775 otmp = mkobj_at(WAND_CLASS, x, y, TRUE, FALSE);
7777 if (mdat == &mons[PM_GIANT_GEM_TROVE]) {
7778 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7779 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7780 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7781 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7782 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7783 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7784 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7785 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7786 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7787 otmp = mkobj_at(GEM_CLASS, x, y, TRUE, FALSE);
7790 if (!rn2(100) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && (Race_if(PM_ANGBANDER) || (uarmc && itemhasappearance(uarmc, APP_ANGBAND_CLOAK) ) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_TELEPORTATION, x, y, TRUE, FALSE, FALSE);
7791 if (!rn2(100) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && Race_if(PM_ANGBANDER) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_IDENTIFY, x, y, TRUE, FALSE, FALSE);
7792 if (!rn2(100) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && RngeAngband && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_TELEPORTATION, x, y, TRUE, FALSE, FALSE);
7794 if (!rn2(500) && !ishardmoder && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_CURE, x, y, TRUE, FALSE, FALSE);
7795 if (!rn2(Race_if(PM_ROHIRRIM) ? 100 : 250) && !ishardmoder && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_PHASE_DOOR, x, y, TRUE, FALSE, FALSE);
7796 if (!rn2(100) && !splittinggremlin(mdat) && !ishardmoder && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(rn2(25) ? SCR_MANA : SCR_GREATER_MANA_RESTORATION, x, y, TRUE, FALSE, FALSE);
7797 if (!rn2(120) && !splittinggremlin(mdat) && !ishardmoder && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_STANDARD_ID, x, y, TRUE, FALSE, FALSE);
7798 if (!rn2(100) && !splittinggremlin(mdat) && !ishardmoder && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_HEAL_OTHER, x, y, TRUE, FALSE, FALSE);
7799 if (!rn2(40) && !splittinggremlin(mdat) && !ishardmoder && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(rn2(25) ? SCR_HEALING : SCR_EXTRA_HEALING, x, y, TRUE, FALSE, FALSE);
7801 if (uarmg && uarmg->oartifact == ART_SCROLLSCROLLSCROLL) {
7802 if (!rn2(500) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_CURE, x, y, TRUE, FALSE, FALSE);
7803 if (!rn2(250) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_PHASE_DOOR, x, y, TRUE, FALSE, FALSE);
7804 if (!rn2(100) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(rn2(25) ? SCR_MANA : SCR_GREATER_MANA_RESTORATION, x, y, TRUE, FALSE, FALSE);
7805 if (!rn2(120) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_STANDARD_ID, x, y, TRUE, FALSE, FALSE);
7806 if (!rn2(100) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(SCR_HEAL_OTHER, x, y, TRUE, FALSE, FALSE);
7807 if (!rn2(40) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(rn2(25) ? SCR_HEALING : SCR_EXTRA_HEALING, x, y, TRUE, FALSE, FALSE);
7810 if (!rn2(500) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && timebasedlowerchance() && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && (rn2(100) > u.usefulitemchance) ) otmp = mksobj_at(usefulitem(), x, y, TRUE, FALSE, FALSE);
7812 /* you should not be able to farm trolls, gremlins, long worms etc. --Amy */
7813 if (!rn2( (Race_if(PM_DROW) ? 100 : Race_if(PM_DOPPELGANGER) ? 150 : 30) ) && !(YouDoNotGetDeathDrops || (mtmp->data->msound == MS_FLUIDATOR) || (mtmp->data->msound == MS_BULLETATOR) ) && !is_reviver(mdat) && !is_rider(mdat) && !is_deadlysin(mdat) && !splittinggremlin(mdat) && !splittinglavagremlin(mdat) && mdat != &mons[PM_DUMMY_MONSTER_NEEDED_FOR_VISUAL_INTERFACE] && mdat != &mons[PM_LONG_WORM] && mdat != &mons[PM_GHOST] && mdat != &mons[PM_TROLL_ZOMBIE] && mdat != &mons[PM_TROLL_MUMMY] && mdat != &mons[PM_EVIL_TROLL_MUMMY] && mdat != &mons[PM_TROLL_PERMAMIMIC_MUMMY] && mdat != &mons[PM_EGO_TROLL_MUMMY] && (timebasedlowerchance() || timebasedlowerchance() || (timebasedlowerchance() && rn2(2)) ) && (rn2(100) > u.usefulitemchance) && !(issoviet && (mvitals[mndx].mvflags & G_NOCORPSE)) && !(issoviet && nohands(mdat))
7814 /* lowered overall chance, but see below for a chance to get extra items --Amy
7815 * Drow and especially Doppelgangers are super-powerful anyway, so I decided to nerf them a bit. */
7816 && (!issoviet || (mdat->mlet != S_KOP))
7817 ) { /* allow death drops for every monster type --Amy */
7818 int typ;
7820 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7821 if (RngeScrounging && !rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7823 if (!rn2(32) && (rn2(100) > u.usefulitemchance) ) {
7824 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7826 if (!rn2(96) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7827 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7828 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7830 if (!rn2(288) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7831 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7832 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7833 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7835 if (!rn2(864) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7836 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7837 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7838 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7839 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7841 if (!rn2(2592) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7842 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7843 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7844 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7845 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7846 if (!rn2(81)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7848 if (!rn2(7776) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7849 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7850 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7851 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7852 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7853 if (!rn2(81)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7854 if (!rn2(243)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7856 if (!rn2(23328) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7857 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7858 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7859 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7860 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7861 if (!rn2(81)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7862 if (!rn2(243)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7863 if (!rn2(729)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7865 if (!rn2(69984) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7866 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7867 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7868 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7869 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7870 if (!rn2(81)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7871 if (!rn2(243)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7872 if (!rn2(729)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7873 if (!rn2(2187)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7875 if (!rn2(209952) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7876 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7877 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7878 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7879 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7880 if (!rn2(81)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7881 if (!rn2(243)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7882 if (!rn2(729)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7883 if (!rn2(2187)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7884 if (!rn2(6561)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7886 if (!rn2(629856) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) && (rn2(100) > u.usefulitemchance) ) {
7887 otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7888 if (!rn2(3)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE); /* small chance to get even more stuff --Amy */
7889 if (!rn2(9)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7890 if (!rn2(27)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7891 if (!rn2(81)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7892 if (!rn2(243)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7893 if (!rn2(729)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7894 if (!rn2(2187)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7895 if (!rn2(6561)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7896 if (!rn2(19683)) otmp = mkobj_at(RANDOM_CLASS, x, y, TRUE, FALSE);
7899 /* Don't create large objects from small monsters */
7900 /*if (otmp) typ = otmp->otyp;*/
7901 /*if (mdat->msize < MZ_HUMAN && typ != FOOD_RATION
7902 && typ != LEATHER_LEASH
7903 && typ != INKA_LEASH
7904 && typ != ADAMANT_LEASH
7905 && typ != FIGURINE
7906 && (otmp->owt > 3 ||
7907 objects[typ].oc_big oc_bimanual/oc_bulky ||
7908 is_spear(otmp) || is_pole(otmp) ||
7909 typ == MORNING_STAR)) {
7910 delobj(otmp);
7911 } else */
7913 redisp = TRUE; /*just always create the object --Amy*/
7915 /* Whether or not it always makes a corpse is, in theory,
7916 * different from whether or not the corpse is "special";
7917 * if we want both, we have to specify it explicitly.
7919 if (corpse_chance(mtmp, (struct monst *)0, FALSE))
7920 (void) make_corpse(mtmp);
7923 sovietnothing:
7925 /*if(redisp)*/ newsym(x,y);
7926 cleanup:
7927 /* punish bad behaviour */
7929 if ( Role_if(PM_LADIESMAN) && !flags.female && mtmp->female && humanoid(mtmp->data) ) {
7931 You(FunnyHallu ? "feel very bad for killing your future wife." : "feel very bad for killing a defenseless woman.");
7932 adjalign(-25);
7933 increasesincounter(1);
7934 u.alignlim--;
7935 change_luck(-1);
7939 /* Batman may not kill women, but you can be a female batman and it would be unfair to only punish males. --Amy */
7940 if ( Race_if(PM_BATMAN) && ((!flags.female && mtmp->female) || (flags.female && !mtmp->female)) && humanoid(mtmp->data)) {
7942 FunnyHallu ? You_feel("very bad for killing your future %s.", flags.female ? "husband" : "wife") : You_feel("very bad for killing a defenseless %s.", flags.female ? "man" : "woman");
7943 adjalign(-25);
7944 increasesincounter(1);
7945 u.alignlim--;
7946 change_luck(-1);
7950 if(is_human(mdat) && (!always_hostile(mdat) && mtmp->malign <= 0) &&
7951 (mndx < PM_ARCHEOLOGIST || mndx > PM_WIZARD) &&
7952 u.ualign.type != A_CHAOTIC) {
7954 if (always_peaceful(mdat)) { /* being penalized for killing maia, imperials etc. was just stupid. --Amy */
7955 HTelepat &= ~INTRINSIC;
7956 change_luck( u.ualign.type == A_LAWFUL ? -2 : -1); /* lower penalty for neutrals --Amy */
7957 You(FunnyHallu ? "killed someone you weren't supposed to - whoops!" : "murderer!");
7959 if (Role_if(PM_CELLAR_CHILD)) {
7960 register int cellarvar = rnz(25000);
7961 incr_itimeout(&HAggravate_monster, cellarvar);
7962 u.cellargravate += cellarvar;
7965 if (Role_if(PM_PALADIN)) { /* more severe murderer penalties */
7966 increasesincounter(5);
7967 u.alignlim -= 5;
7968 change_luck(-1);
7969 adjalign(-50);
7972 if(u.ualign.type == A_LAWFUL) {
7973 increasesincounter(3);
7974 u.alignlim -= 3;
7975 } /*fall through*/
7976 increasesincounter(2);
7977 u.alignlim -= 2;
7978 if (Blind && !Blind_telepat)
7979 see_monsters(); /* Can't sense monsters any more. */
7981 adjalign(u.ualign.type == A_LAWFUL ? -2 : -1);
7984 if((mtmp->mpeaceful && !rn2(2)) || mtmp->mtame) change_luck(-1);
7985 if (is_unicorn(mdat) && mndx != PM_MOLOCH_ALIGNED_UNICORN && sgn(u.ualign.type) == sgn(mdat->maligntyp)) {
7986 change_luck(-5);
7987 You_feel("guilty...");
7990 if ( (Role_if(PM_ACTIVISTOR) || Race_if(PM_PEACEMAKER)) && mdat == &mons[PM_TOPMODEL]) { /* very bad idea! --Amy */
7991 You_feel("guilty for killing an innocent girl.");
7992 change_luck(-5);
7993 increasesincounter(10);
7994 u.alignlim -= 10;
7995 adjalign(-50);
7996 u.ugangr++; u.ugangr++; u.ugangr++;
7997 prayer_done();
8000 /* give experience points */
8001 tmp = experience(mtmp, (int)mvitals[mndx].died + 1);
8002 more_experienced(tmp, 0);
8003 newexplevel(); /* will decide if you go up */
8005 if (uarmf && uarmf->oartifact == ART_FANNY_S_BROOK_THAT_YOU_MIS && flags.female && !In_endgame(&u.uz)) {
8006 if (humanoid(mtmp->data) && !mtmp->female && (mtmp->data->geno & G_UNIQ) && !Role_if(PM_FEMINIST)) {
8007 feministtransformation();
8008 pline("Well done, now you're a feminist.");
8012 if (!rn2(19150)) { /* evil patch idea by jonadab: summon a boss */
8013 pline("The RNG decides to send in reinforcements to punish people who kill innocent monsters.");
8015 int attempts = 0;
8016 register struct permonst *ptrZ;
8018 if (Aggravate_monster) {
8019 u.aggravation = 1;
8020 reset_rndmonst(NON_PM);
8023 newbossA:
8024 do {
8025 ptrZ = rndmonst();
8026 attempts++;
8027 if (attempts && (attempts % 10000 == 0)) u.mondiffhack++;
8028 if (!rn2(2000)) reset_rndmonst(NON_PM);
8030 } while ( (!ptrZ || (ptrZ && !(ptrZ->geno & G_UNIQ))) && attempts < 50000);
8032 if (ptrZ && ptrZ->geno & G_UNIQ) {
8033 if (wizard) pline("monster generation: %s", ptrZ->mname);
8034 (void) makemon(ptrZ, u.ux, u.uy, NO_MM_FLAGS);
8036 else if (rn2(50)) {
8037 attempts = 0;
8038 goto newbossA;
8041 u.aggravation = 0;
8042 u.mondiffhack = 0;
8046 if (mdat->maligntyp > 0 && is_nethermist(mtmp->mx, mtmp->my) ) {
8047 levl[mtmp->mx][mtmp->my].typ = CORR;
8048 if (cansee(mtmp->mx,mtmp->my)) {
8049 pline("The nether mist dissipates.");
8050 u.cnd_nethermistremoved++;
8051 newsym(mtmp->mx, mtmp->my);
8053 if ((u.cnd_nethermistremoved % 20) == 0) {
8054 learntech_or_leveltech(T_RESTORE_LIFE_LEVELS, FROMOUTSIDE, 1);
8055 pline("As a reward for dissipating so many nether mist tiles, you learn how to restore your life levels!");
8061 /* adjust alignment points */
8062 if (mtmp->m_id == quest_status.leader_m_id) { /* REAL BAD! */
8063 adjalign(-(u.ualign.record+u.alignlim/2));
8064 pline("That was %sa bad idea...",
8065 u.uevent.qcompleted ? "probably " : "");
8066 } else if (mdat->msound == MS_NEMESIS) /* Real good! */
8067 adjalign((u.alignlim/4));
8068 else if (mdat->msound == MS_GUARDIAN) { /* Bad */
8069 adjalign(-(u.alignlim/8));
8070 if (!FunnyHallu) pline("That was probably a bad idea...");
8071 else pline("Whoopsie-daisy!");
8072 } else if (mtmp->ispriest) {
8073 adjalign((p_coaligned(mtmp)) ? -2 : 2);
8074 /* cancel divine protection for killing your priest */
8075 if (p_coaligned(mtmp)) u.ublessed = 0;
8076 if (mdat->maligntyp == A_NONE)
8077 adjalign(u.alignlim / 4); /* BIG bonus */
8078 } else if (mtmp->mtame) {
8079 adjalign(-50); /* bad!! */
8080 /* your god is mighty displeased... */
8081 if (!FunnyHallu) {(Role_if(PM_PIRATE) || Role_if(PM_KORSAIR) || PirateSpeakOn) ? pline("Batten down the hatches!") : You_hear("the rumble of distant thunder...");}
8082 else You_hear("the studio audience applaud!");
8083 if (PlayerHearsSoundEffects) pline(issoviet ? "Molodets, geroy - ty ubil sobstvennogo domashnego zhivotnogo, potomu chto vy byli glupy. Vy na samom dele sovetskaya Pyat' Lo? Potomu chto on ne igrayet namnogo khuzhe, chem vy." : "Wummm. Wummmmmmmm!");
8085 if (uarmc && itemhasappearance(uarmc, APP_POKE_MONGO_CLOAK) ) {
8086 pline("You killed your pet, thereby incurring the wrath of the gods!");
8087 u.ugangr += rnd(3);
8090 } else if (mtmp->mpeaceful) {
8091 adjalign(-15);
8092 if (!FunnyHallu) pline("The gods will probably not appreciate this...");
8093 else pline("Whoopsie-daisy!");
8096 /* malign was already adjusted for u.ualign.type and randomization */
8097 adjalign(mtmp->malign);
8099 if (practicantterror && (mtmp->data->geno & G_UNIQ) && mtmp->data->msound != MS_NEMESIS && !u.pract_bosskill) {
8100 pline("%s thunders: 'You destroyed the guardian that had cost 5000 zorkmids and have to pay twice that amount, because I'm Dictator Noroela and therefore can define the amount of your fine myself.'", noroelaname());
8101 fineforpracticant(10000, 0, 0);
8102 u.pract_bosskill = TRUE;
8105 if (Role_if(PM_ANACHRONOUNBINDER) && (mtmp->data->geno & G_UNIQ)) {
8106 pline("As a reward for killing a boss monster, your skill training is temporarily doubled!");
8107 u.acutraining += rnz(200 + (mtmp->m_lev * 20));
8110 #ifdef LIVELOG_BONES_KILLER
8111 livelog_bones_killed(mtmp);
8112 #endif
8115 /* changes the monster into a stone monster of the same type */
8116 /* this should only be called when poly_when_stoned() is true */
8117 void
8118 mon_to_stone(mtmp)
8119 register struct monst *mtmp;
8121 boolean polymorphed = mtmp->oldmonnm != monsndx(mtmp->data);
8123 /* change by Amy: higher-level golems, if they can be turned to stone, will turn into better stone golems */
8124 int newchamgolem = PM_STONE_GOLEM;
8125 if (mtmp->data->mlevel >= 20) newchamgolem = PM_LARGE_STONE_GOLEM;
8126 if (mtmp->data->mlevel >= 30) newchamgolem = PM_HUGE_STONE_GOLEM;
8127 if (mtmp->data->mlevel >= 40) newchamgolem = PM_GIANT_STONE_GOLEM;
8128 if (mtmp->data->mlevel >= 50) newchamgolem = PM_HIGH_END_STONE_GOLEM;
8129 if (mtmp->data->mlevel >= 70) newchamgolem = PM_UBER_STONE_GOLEM;
8130 if (mtmp->data->mlevel >= 100) newchamgolem = PM_ULTRA_STONE_GOLEM;
8132 if(mtmp->data->mlet == S_GOLEM) {
8133 /* it's a golem, and not a stone golem */
8134 if(canseemon(mtmp))
8135 pline("%s solidifies...", Monnam(mtmp));
8136 if (newcham(mtmp, &mons[newchamgolem], FALSE, FALSE)) {
8137 if (!polymorphed)
8138 mtmp->oldmonnm = newchamgolem; /* Change is permanent */
8139 if(canseemon(mtmp))
8140 pline("Now it's %s.", an(mtmp->data->mname));
8141 } else {
8142 if(canseemon(mtmp))
8143 pline("... and returns to normal.");
8145 } else
8146 impossible("Can't polystone %s!", a_monnam(mtmp));
8149 void
8150 mnexto(mtmp) /* Make monster mtmp next to you (if possible) */
8151 struct monst *mtmp;
8153 coord mm;
8155 if (mtmp == u.usteed) {
8156 /* Keep your steed in sync with you instead */
8157 mtmp->mx = u.ux;
8158 mtmp->my = u.uy;
8159 return;
8162 if(!enexto(&mm, u.ux, u.uy, mtmp->data)) return;
8163 rloc_to(mtmp, mm.x, mm.y);
8165 if (mtmp->singannoyance && !u.singtrapocc && !u.katitrapocc && !um_dist(mtmp->mx, mtmp->my, 1) && !mtmp->mpeaceful) {
8166 singclean(mtmp);
8169 return;
8172 /* mnearto()
8173 * Put monster near (or at) location if possible.
8174 * Returns:
8175 * 1 - if a monster was moved from x, y to put mtmp at x, y.
8176 * 0 - in most cases.
8178 boolean
8179 mnearto(mtmp,x,y,move_other)
8180 register struct monst *mtmp;
8181 xchar x, y;
8182 boolean move_other; /* make sure mtmp gets to x, y! so move m_at(x, y) */
8184 struct monst *othermon = (struct monst *)0;
8185 xchar newx, newy;
8186 coord mm;
8188 if ((mtmp->mx == x) && (mtmp->my == y)) return(FALSE);
8190 if (move_other && (othermon = m_at(x, y))) {
8191 if (othermon->wormno)
8192 remove_worm(othermon);
8193 else
8194 remove_monster(x, y);
8197 newx = x;
8198 newy = y;
8200 if (!goodpos(newx, newy, mtmp, 0)) {
8201 /* actually we have real problems if enexto ever fails.
8202 * migrating_mons that need to be placed will cause
8203 * no end of trouble.
8205 if (!enexto(&mm, newx, newy, mtmp->data)) return(FALSE);
8206 newx = mm.x; newy = mm.y;
8209 rloc_to(mtmp, newx, newy);
8211 if (move_other && othermon) {
8212 othermon->mx = othermon->my = 0;
8213 (void) mnearto(othermon, x, y, FALSE);
8214 if ((othermon->mx != x) || (othermon->my != y))
8215 return(TRUE);
8218 return(FALSE);
8222 static const char *poiseff[] = {
8224 " feel weaker", "r brain is on fire",
8225 "r judgement is impaired", "r muscles won't obey you",
8226 " feel very sick", " break out in hives"
8229 void
8230 poisontell(typ)
8232 int typ;
8234 pline("You%s.", poiseff[typ]);
8235 pline("You lose %s", typ == 0 ? "Strength" : typ == 1 ? "Intelligence" : typ == 2 ? "Wisdom" : typ == 3 ? "Dexterity" : typ == 4 ? "Constitution" : "Charisma");
8238 void
8239 poisoned(string, typ, pname, fatal)
8240 const char *string, *pname;
8241 int typ, fatal;
8243 int i, plural, kprefix = KILLED_BY_AN;
8244 boolean thrown_weapon = (fatal < 0);
8246 if (chromeprotection()) return;
8248 u.cnd_poisonamount++;
8250 if (thrown_weapon) fatal = -fatal;
8251 if(strcmp(string, "blast") && !thrown_weapon) {
8252 /* 'blast' has already given a 'poison gas' message */
8253 /* so have "poison arrow", "poison dart", etc... */
8254 plural = (string[strlen(string) - 1] == 's')? 1 : 0;
8255 /* avoid "The" Orcus's sting was poisoned... */
8256 pline("%s%s %s poisoned!", isupper((int)*string) ? "" : "The ",
8257 string, plural ? "were" : "was");
8260 if (Race_if(PM_VIETIS)) {
8261 if(Poison_resistance && rn2(StrongPoison_resistance ? 5 : 2) ) {
8262 if(!strcmp(string, "blast")) shieldeff(u.ux, u.uy);
8263 pline_The("poison doesn't seem to affect you.");
8265 if(!rn2(StrongPoison_resistance ? 20 : 4)) {
8266 /* Check that a stat change was made */
8268 if (uarmg && uarmg->oartifact == ART_POISON_HAND && rn2(2)) return;
8270 if (adjattrib(typ, -1, 1, TRUE)) {
8271 pline("You%s!", poiseff[typ]);
8272 pline("You lose %s", typ == 0 ? "Strength" : typ == 1 ? "Intelligence" : typ == 2 ? "Wisdom" : typ == 3 ? "Dexterity" : typ == 4 ? "Constitution" : "Charisma"); }
8274 return;
8276 } else {
8277 if(Poison_resistance && rn2(StrongPoison_resistance ? 20 : 5) ) {
8278 if(!strcmp(string, "blast")) shieldeff(u.ux, u.uy);
8279 pline_The("poison doesn't seem to affect you.");
8281 if (uarmg && uarmg->oartifact == ART_POISON_HAND && rn2(2)) return;
8283 if(!rn2(StrongPoison_resistance ? 100 : 20)) {
8284 /* Check that a stat change was made */
8285 if (adjattrib(typ, -1, 1, TRUE)) {
8286 pline("You%s!", poiseff[typ]);
8287 pline("You lose %s", typ == 0 ? "Strength" : typ == 1 ? "Intelligence" : typ == 2 ? "Wisdom" : typ == 3 ? "Dexterity" : typ == 4 ? "Constitution" : "Charisma"); }
8289 return;
8292 /* suppress killer prefix if it already has one */
8293 if ((i = name_to_mon(pname)) >= LOW_PM && mons[i].geno & G_UNIQ) {
8294 kprefix = KILLED_BY;
8295 if (!type_is_pname(&mons[i])) pname = the(pname);
8296 } else if (!strncmpi(pname, "the ", 4) ||
8297 !strncmpi(pname, "an ", 3) ||
8298 !strncmpi(pname, "a ", 2)) {
8299 /*[ does this need a plural check too? ]*/
8300 kprefix = KILLED_BY;
8302 i = rn2(fatal + 20*thrown_weapon);
8303 if(i == 0 && (!Poison_resistance || (Race_if(PM_VIETIS) && !StrongPoison_resistance)) && !(uarmf && uarmf->oartifact == ART_PURPLE_JUNGLE) && !(uarms && uarms->oartifact == ART_ANTINSTANT_DEATH) && typ != A_CHA && !rn2((Race_if(PM_VIETIS) && !Poison_resistance) ? 10 : 100)) {
8304 if (Invulnerable || (StrongWonderlegs && !rn2(10) && Wounded_legs) || ((PlayerInBlockHeels || PlayerInWedgeHeels) && tech_inuse(T_EXTREME_STURDINESS) && !rn2(2) ) || (Stoned_chiller && Stoned && !(u.stonedchilltimer) && !rn2(3)) )
8305 pline("You are unharmed!");
8306 else {
8307 u.uhp = -1;
8308 pline_The("poison was deadly...");
8310 } else if(i <= 5) {
8312 if (uarmg && uarmg->oartifact == ART_POISON_HAND && rn2(2)) goto statchangedone;
8314 /* Check that a stat change was made */
8315 if (adjattrib(typ, thrown_weapon ? -1 : StrongPoison_resistance ? -1 : Poison_resistance ? -rno(3) : -rnd(5), 1, TRUE)) {
8316 pline("You%s!", poiseff[typ]);
8317 pline("You lose %s", typ == 0 ? "Strength" : typ == 1 ? "Intelligence" : typ == 2 ? "Wisdom" : typ == 3 ? "Dexterity" : typ == 4 ? "Constitution" : "Charisma");
8320 statchangedone:
8321 /* still does damage --Amy */
8322 i = thrown_weapon ? rnd(6) : rn1(10,6);
8323 if(Half_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) i = (i+1) / 2;
8324 if(StrongHalf_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) i = (i+1) / 2;
8325 losehp(i, pname, kprefix);
8327 } else {
8328 i = thrown_weapon ? rnd(6) : rn1(10,6);
8329 if(Half_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) i = (i+1) / 2;
8330 if(StrongHalf_physical_damage && (rn2(2) || (uwep && uwep->oartifact == ART_SOOTHE_)) ) i = (i+1) / 2;
8331 losehp(i, pname, kprefix);
8333 if(u.uhp < 1) {
8334 u.youaredead = 1;
8335 killer_format = kprefix;
8336 killer = pname;
8337 /* "Poisoned by a poisoned ___" is redundant */
8338 done(strstri(pname, "poison") ? DIED : POISONING);
8339 u.youaredead = 0;
8341 (void) encumber_msg();
8344 /* monster responds to player action; not the same as a passive attack */
8345 /* assumes reason for response has been tested, and response _must_ be made */
8346 void
8347 m_respond(mtmp)
8348 register struct monst *mtmp;
8350 if(mtmp->data->msound == MS_SHRIEK) {
8351 if(flags.soundok) {
8352 pline("%s shrieks.", Monnam(mtmp));
8353 stop_occupation();
8356 if (Aggravate_monster) {
8357 u.aggravation = 1;
8358 reset_rndmonst(NON_PM);
8361 /* [Tom] took out the weird purple worm thing and lowered prob from 10 */
8362 if (!rn2(8)) {
8363 /* if (!rn2(13))
8364 (void) makemon(&mons[PM_PURPLE_WORM], 0, 0, NO_MM_FLAGS);
8365 else */
8366 (void) makemon((struct permonst *)0, 0, 0, NO_MM_FLAGS);
8370 u.aggravation = 0;
8372 aggravate();
8374 if(!mtmp->egotype_farter && mtmp->data->msound == MS_FART_QUIET && !(uarmf && uarmf->oartifact == ART_END_OF_LEWDNESS) ) {
8375 if (!FemtrapActiveJennifer) pline("%s produces %s farting noises with %s %s butt.", Monnam(mtmp), rn2(2) ? "tender" : "soft", mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
8376 u.cnd_fartingcount++;
8377 if (Role_if(PM_CLIMACTERIAL)) climtrainsqueaking(1);
8378 if (Role_if(PM_BUTT_LOVER) && !rn2(20)) buttlovertrigger();
8379 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
8381 if (uarmf && uarmf->oartifact == ART_SARAH_S_GRANNY_WEAR) {
8382 healup((level_difficulty() + 5), 0, FALSE, FALSE);
8383 goto sarahdone;
8386 if (uarmf && uarmf->oartifact == ART_ELIANE_S_SHIN_SMASH) {
8387 pline("The farting gas destroys your footwear instantly.");
8388 useup(uarmf);
8390 if (mtmp->butthurt) mtmp->butthurt--;
8391 if (mtmp->butthurt) mtmp->butthurt--;
8392 if (mtmp->butthurt) mtmp->butthurt--;
8393 if (uarmf && uarmf->oartifact == ART_ELIANE_S_COMBAT_SNEAKERS) {
8394 pline("Eek! You can't stand farting gas!");
8395 badeffect();
8396 badeffect();
8397 badeffect();
8398 badeffect();
8400 if (!extralongsqueak()) badeffect();
8402 if (uarmh && itemhasappearance(uarmh, APP_BREATH_CONTROL_HELMET) ) {
8403 pline("Your breath control helmet keeps pumping the farting gas into your %s...", body_part(NOSE));
8404 badeffect();
8405 badeffect();
8408 if (uarmh && uarmh->oartifact == ART_VACUUM_CLEANER_DEATH) {
8409 pline("The farting gas almost asphyxiates you!");
8410 badeffect();
8411 badeffect();
8412 badeffect();
8413 badeffect();
8414 badeffect();
8415 losehp(rnd(u.ulevel * 3), "suffocating on farting gas", KILLED_BY);
8418 if (!rn2(20)) increasesanity(1);
8420 sarahdone:
8421 if(!mtmp->egotype_farter && mtmp->data->msound == MS_FART_NORMAL && !(uarmf && uarmf->oartifact == ART_END_OF_LEWDNESS)) {
8422 pline("%s produces %s farting noises with %s %s butt.", Monnam(mtmp), rn2(2) ? "beautiful" : "squeaky", mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
8423 u.cnd_fartingcount++;
8424 if (Role_if(PM_CLIMACTERIAL)) climtrainsqueaking(1);
8425 if (Role_if(PM_BUTT_LOVER) && !rn2(20)) buttlovertrigger();
8426 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
8427 if (uarmf && uarmf->oartifact == ART_ELIANE_S_SHIN_SMASH) {
8428 pline("The farting gas destroys your footwear instantly.");
8429 useup(uarmf);
8431 if (mtmp->butthurt) mtmp->butthurt--;
8432 if (mtmp->butthurt) mtmp->butthurt--;
8433 if (uarmf && uarmf->oartifact == ART_ELIANE_S_COMBAT_SNEAKERS) {
8434 pline("Eek! You can't stand farting gas!");
8435 badeffect();
8436 badeffect();
8437 badeffect();
8438 badeffect();
8440 if (!extralongsqueak()) badeffect();
8442 if (uarmh && itemhasappearance(uarmh, APP_BREATH_CONTROL_HELMET) ) {
8443 pline("Your breath control helmet keeps pumping the farting gas into your %s...", body_part(NOSE));
8444 badeffect();
8445 badeffect();
8448 if (uarmh && uarmh->oartifact == ART_VACUUM_CLEANER_DEATH) {
8449 pline("The farting gas almost asphyxiates you!");
8450 badeffect();
8451 badeffect();
8452 badeffect();
8453 badeffect();
8454 badeffect();
8455 losehp(rnd(u.ulevel * 3), "suffocating on farting gas", KILLED_BY);
8458 if (!rn2(20) && !(FemtrapActiveSueLyn && mtmp->female && !mtmp->mfrenzied) ) increasesanity(1);
8460 if (FemtrapActiveSueLyn && mtmp->female && !mtmp->mfrenzied) {
8461 if (u.alla < 1000) gain_alla(1);
8462 else reducesanity(1);
8463 pline("This is actually enjoyable.");
8465 if (uarmf && uarmf->oartifact == ART_ELENA_S_REWARD) {
8466 gain_alla(5);
8467 u.usanity += 5; /* doesn't cause bad side effects */
8468 if (!rn2(20) && multi >= 0) {
8469 nomul(-20, "unconscious from inhaling too much farting gas", TRUE);
8471 if (quest_status.killed_nemesis) {
8472 mtmp->mfrenzied = FALSE;
8473 mtmp->mpeaceful = TRUE;
8474 } else {
8475 make_stunned(HStun + 2, FALSE); /* to suppress teleport control that you might have */
8476 (void) safe_teleds_normalterrain(FALSE); /* to minimize the chance that the monster follows */
8478 d_level dtmp;
8480 if (((u.uhave.amulet) && !u.freeplaymode) || CannotTeleport || (u.usteed && mon_has_amulet(u.usteed))) {
8481 pline("You shudder for a moment.");
8482 } else if (playerlevelportdisabled()) {
8483 pline("You shudder for a moment.");
8484 } else {
8486 dtmp.dnum = dname_to_dnum("The Dungeons of Doom");
8487 dtmp.dlevel = 1;
8488 schedule_goto(&dtmp, FALSE, FALSE, 0, (char *)0, (char *)0);
8495 if(!mtmp->egotype_farter && mtmp->data->msound == MS_FART_LOUD && !(uarmf && uarmf->oartifact == ART_END_OF_LEWDNESS)) {
8496 pline("%s produces %s farting noises with %s %s butt.", Monnam(mtmp), rn2(2) ? "disgusting" : "loud", mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
8497 u.cnd_fartingcount++;
8498 if (Role_if(PM_CLIMACTERIAL)) climtrainsqueaking(1);
8499 if (Role_if(PM_BUTT_LOVER) && !rn2(20)) buttlovertrigger();
8500 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
8501 if (uarmf && uarmf->oartifact == ART_ELIANE_S_SHIN_SMASH) {
8502 pline("The farting gas destroys your footwear instantly.");
8503 useup(uarmf);
8505 if (mtmp->butthurt) mtmp->butthurt--;
8506 if (uarmf && uarmf->oartifact == ART_ELIANE_S_COMBAT_SNEAKERS) {
8507 pline("Eek! You can't stand farting gas!");
8508 badeffect();
8509 badeffect();
8510 badeffect();
8511 badeffect();
8513 if (!extralongsqueak()) badeffect();
8515 if (uarmh && itemhasappearance(uarmh, APP_BREATH_CONTROL_HELMET) ) {
8516 pline("Your breath control helmet keeps pumping the farting gas into your %s...", body_part(NOSE));
8517 badeffect();
8518 badeffect();
8521 if (uarmh && uarmh->oartifact == ART_VACUUM_CLEANER_DEATH) {
8522 pline("The farting gas almost asphyxiates you!");
8523 badeffect();
8524 badeffect();
8525 badeffect();
8526 badeffect();
8527 badeffect();
8528 losehp(rnd(u.ulevel * 3), "suffocating on farting gas", KILLED_BY);
8530 if (uarmf && uarmf->oartifact == ART_EXHAUST_DAMAGE) {
8531 u.tremblingamount++;
8532 drain_alla(1);
8533 pline("Boah, the farting gas keeps stinking even after %s stopped!", mon_nam(mtmp));
8536 if (!rn2(20)) increasesanity(1);
8538 if (mtmp->egotype_farter && !(uarmf && uarmf->oartifact == ART_END_OF_LEWDNESS)) {
8539 pline("%s produces %s farting noises with %s %s butt.", Monnam(mtmp), !rn2(6) ? "disgusting" : !rn2(5) ? "loud" : !rn2(4) ? "tender" : !rn2(3) ? "soft" : !rn2(2) ? "beautiful" : "squeaky", mhis(mtmp), mtmp->female ? "sexy" : "ugly" );
8540 u.cnd_fartingcount++;
8541 if (Role_if(PM_CLIMACTERIAL)) climtrainsqueaking(1);
8542 if (Role_if(PM_BUTT_LOVER) && !rn2(20)) buttlovertrigger();
8543 if (Role_if(PM_SOCIAL_JUSTICE_WARRIOR)) sjwtrigger();
8544 if (uarmf && uarmf->oartifact == ART_ELIANE_S_SHIN_SMASH) {
8545 pline("The farting gas destroys your footwear instantly.");
8546 useup(uarmf);
8548 if (uarmf && uarmf->oartifact == ART_ELIANE_S_COMBAT_SNEAKERS) {
8549 pline("Eek! You can't stand farting gas!");
8550 badeffect();
8551 badeffect();
8552 badeffect();
8553 badeffect();
8555 if (!extralongsqueak()) badeffect();
8557 if (uarmh && itemhasappearance(uarmh, APP_BREATH_CONTROL_HELMET) ) {
8558 pline("Your breath control helmet keeps pumping the farting gas into your %s...", body_part(NOSE));
8559 badeffect();
8560 badeffect();
8563 if (uarmh && uarmh->oartifact == ART_VACUUM_CLEANER_DEATH) {
8564 pline("The farting gas almost asphyxiates you!");
8565 badeffect();
8566 badeffect();
8567 badeffect();
8568 badeffect();
8569 badeffect();
8570 losehp(rnd(u.ulevel * 3), "suffocating on farting gas", KILLED_BY);
8573 if (!rn2(20)) increasesanity(1);
8576 if(mtmp->data->msound == MS_SOUND || mtmp->egotype_sounder) {
8577 pline("%s lets out an ear-splitting scream!", Monnam(mtmp) );
8578 make_stunned(HStun + (mtmp->m_lev + 2), TRUE);
8579 if (isevilvariant || !rn2(issoviet ? 2 : 5)) (void)destroy_item(POTION_CLASS, AD_COLD);
8580 wake_nearby();
8583 if(mtmp->data->msound == MS_PANTS) {
8584 u.cnd_pantsmell++;
8585 pline("You catch a whiff from %s...", mon_nam(mtmp) );
8586 contaminate(rnd((mtmp->m_lev + 1) * 2), TRUE);
8587 increasesanity(rnd((mtmp->m_lev + 1) * 2));
8589 if(mtmp->data->msound == MS_SOCKS && !(uarmf && uarmf->oartifact == ART_KATHARINA_S_SIGH) ) {
8590 u.cnd_socksmell++;
8591 pline("You inhale the beguiling smell that emanates from %s...", mon_nam(mtmp) );
8593 int armpro, armprolimit;
8595 armpro = magic_negation(&youmonst);
8596 armprolimit = 75;
8597 if (!(PlayerCannotUseSkills)) {
8599 switch (P_SKILL(P_SPIRITUALITY)) {
8600 default: armprolimit = 75; break;
8601 case P_BASIC: armprolimit = 78; break;
8602 case P_SKILLED: armprolimit = 81; break;
8603 case P_EXPERT: armprolimit = 84; break;
8604 case P_MASTER: armprolimit = 87; break;
8605 case P_GRAND_MASTER: armprolimit = 90; break;
8606 case P_SUPREME_MASTER: armprolimit = 93; break;
8610 if ((rn2(3) >= armpro) || ((rnd(100) > armprolimit) && ((armpro < 4) || (rnd(armpro) < 4) ) ) ) {
8611 if (isstunfish) nomul(-(rnz(7)), "unconscious from smelling worn socks", TRUE);
8612 else nomul(-(rn1(3, 4)), "unconscious from smelling worn socks", TRUE); /* chain paralysis is possible */
8613 nomovemsg = 0;
8617 if(mtmp->data == &mons[PM_MEDUSA]) {
8618 register int i;
8619 for(i = 0; i < NATTK; i++)
8620 if(mtmp->data->mattk[i].aatyp == AT_GAZE) {
8621 (void) gazemu(mtmp, &mtmp->data->mattk[i]);
8622 break;
8627 #endif /* OVLB */
8628 #ifdef OVL2
8630 void
8631 setmangry(mtmp)
8632 register struct monst *mtmp;
8634 struct permonst *mdat;
8635 mdat = mtmp->data;
8637 mtmp->mstrategy &= ~STRAT_WAITMASK;
8638 /* Even if the black marketeer is already angry he may not have called
8639 * for his assistants if he or his staff have not been assaulted yet.
8641 if (Is_blackmarket(&u.uz) && !mtmp->mpeaceful && mtmp->isshk)
8642 blkmar_guards(mtmp);
8643 if(!mtmp->mpeaceful) return;
8644 if(mtmp->mtame) return;
8645 mtmp->mpeaceful = 0;
8647 if (uarmf && uarmf->oartifact == ART_VARIANTISH_DESIGN) {
8649 int effectradius = 20;
8650 register struct monst *mtmp2;
8651 struct edog* edog;
8653 for (mtmp2 = fmon; mtmp2; mtmp2 = mtmp2->nmon) {
8654 if (rn2(3) && distu(mtmp2->mx,mtmp2->my) < effectradius && (mtmp != mtmp2) ) {
8655 if (mtmp2->mtame) {
8656 edog = (mtmp2->isminion) ? 0 : EDOG(mtmp2);
8657 if (mtmp2->mtame <= rnd(21) || (edog && edog->abuse >= rn2(6) )) {
8659 int untamingchance = 10;
8661 if (!(PlayerCannotUseSkills)) {
8662 switch (P_SKILL(P_PETKEEPING)) {
8663 default: untamingchance = 10; break;
8664 case P_BASIC: untamingchance = 9; break;
8665 case P_SKILLED: untamingchance = 8; break;
8666 case P_EXPERT: untamingchance = 7; break;
8667 case P_MASTER: untamingchance = 6; break;
8668 case P_GRAND_MASTER: untamingchance = 5; break;
8669 case P_SUPREME_MASTER: untamingchance = 4; break;
8673 if (untamingchance > rnd(10) && !(Role_if(PM_DRAGONMASTER) && uarms && Is_dragon_shield(uarms) && mtmp2->data->mlet == S_DRAGON) && !((rnd(30 - ACURR(A_CHA))) < 4) ) {
8675 mtmp2->mtame = mtmp2->mpeaceful = 0;
8676 if (mtmp2->mleashed) { m_unleash(mtmp2,FALSE); }
8680 } else if (mtmp2->mpeaceful && !is_infrastructure_monster(mtmp2)) {
8681 mtmp2->mpeaceful = 0;
8682 } else {
8683 if (!is_infrastructure_monster(mtmp2)) {
8684 if (!rn2(5)) mtmp2->mfrenzied = 1;
8685 mtmp2->mhp = mtmp2->mhpmax;
8695 if ((mtmp->isshk || mtmp->ispriest || mtmp->isgd || (mdat == &mons[PM_WATCHMAN]) || (mdat == &mons[PM_WATCH_CAPTAIN]) || (mdat == &mons[PM_WATCH_LEADER]) || (mdat == &mons[PM_WATCH_LIEUTENANT])) && !rn2(20)) {
8698 int koptryct;
8699 int kox, koy;
8701 newkopcube:
8702 koptryct = 0;
8704 for (koptryct = 0; koptryct < 2000; koptryct++) {
8705 kox = rn1(COLNO-3,2);
8706 koy = rn2(ROWNO);
8708 if (kox && koy && isok(kox, koy) && (levl[kox][koy].typ > DBWALL) && !(t_at(kox, koy)) ) {
8709 (void) maketrap(kox, koy, KOP_CUBE, 0, FALSE);
8710 break;
8713 if (rn2(2)) goto newkopcube;
8717 if(mtmp->ispriest) {
8718 if(p_coaligned(mtmp)) adjalign(-50); /* very bad */
8719 else adjalign(2);
8720 } else {
8721 adjalign(-5); /* attacking peaceful monsters is bad */
8724 if (mtmp->isshk && !strncmpi(shkname(mtmp), "Izchak", 6) ) {
8726 adjalign(-50);
8730 if (Role_if(PM_PALADIN)) adjalign(-20);
8732 if (couldsee(mtmp->mx, mtmp->my)) {
8733 if (humanoid(mtmp->data) || mtmp->isshk || mtmp->isgd) {
8734 pline("%s gets angry!", Monnam(mtmp));
8735 if (flags.verbose && flags.soundok) growl(mtmp);
8737 else if (flags.verbose && flags.soundok) growl(mtmp);
8740 /* Don't misbehave in the Black Market or else... */
8741 if (Is_blackmarket(&u.uz)) {
8742 if (mtmp->isshk)
8743 blkmar_guards(mtmp);
8744 else if (NAME(mtmp) && *NAME(mtmp)) {
8745 /* non-tame named monsters are presumably
8746 * black marketeer's assistants */
8747 struct monst *shkp;
8748 shkp = shop_keeper(inside_shop(mtmp->mx, mtmp->my));
8749 if (shkp) wakeup(shkp);
8753 /* attacking your own quest leader will anger his or her guardians */
8754 if (!flags.mon_moving && /* should always be the case here */
8755 mtmp->data == &mons[quest_info(MS_LEADER)]) {
8756 struct monst *mon;
8757 struct permonst *q_guardian = &mons[quest_info(MS_GUARDIAN)];
8758 int got_mad = 0;
8760 /* guardians will sense this attack even if they can't see it */
8761 for (mon = fmon; mon; mon = mon->nmon)
8762 if (!DEADMONSTER(mon) && mon->data == q_guardian && mon->mpeaceful) {
8763 mon->mpeaceful = 0;
8764 if (canseemon(mon)) ++got_mad;
8766 if (got_mad && !Hallucination)
8767 pline_The("%s appear%s to be angry too...",
8768 got_mad == 1 ? q_guardian->mname :
8769 makeplural(q_guardian->mname),
8770 got_mad == 1 ? "s" : "");
8774 void
8775 wakeup(mtmp)
8776 register struct monst *mtmp;
8778 if (mtmp->masleep && !rn2(3)) {
8779 mtmp->mcanmove = 1;
8780 mtmp->masleep = 0;
8781 mtmp->mfrozen = 0;
8783 mtmp->msleeping = 0;
8784 mtmp->meating = 0; /* assume there's no salvagable food left */
8785 setmangry(mtmp);
8786 if(mtmp->m_ap_type) seemimic(mtmp);
8787 else if (flags.forcefight && !flags.mon_moving && mtmp->mundetected) {
8788 mtmp->mundetected = 0;
8789 newsym(mtmp->mx, mtmp->my);
8793 /* Wake up nearby monsters. */
8794 void
8795 wake_nearby()
8797 register struct monst *mtmp;
8799 /* Amy edit: stealth gives a chance of the monster not waking up; aggravate monster reduces that chance */
8800 int stealthchance = 0;
8801 if (Stealth) stealthchance += 20;
8802 if (StrongStealth) stealthchance += 30;
8803 if (Aggravate_monster) stealthchance /= 2;
8804 if (StrongAggravate_monster) stealthchance /= 2;
8805 if (stealthchance < 0) stealthchance = 0; /* less than 0% chance makes no sense anyway --Amy */
8806 if (stealthchance > 0) stealthchance = rnd(stealthchance); /* some randomness */
8808 for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
8809 if (!DEADMONSTER(mtmp) && (rnd(100) > stealthchance) && !(uarmc && uarmc->oartifact == ART_CLANCY_S_FURTIVENESS && rn2(3)) && !(Race_if(PM_VIETIS) && rn2(3)) && !(Race_if(PM_KUTAR) && rn2(3)) && distu(mtmp->mx,mtmp->my) < level_difficulty()*20) {
8811 if (mtmp->data->msound == MS_SNORE) continue; /* won't wake up from this effect */
8813 mtmp->msleeping = 0;
8814 if (mtmp->mtame && !mtmp->isminion)
8815 EDOG(mtmp)->whistletime = moves;
8819 if (!rn2(250)) for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
8820 if (!DEADMONSTER(mtmp) && (rnd(100) > stealthchance) && !(uarmc && uarmc->oartifact == ART_CLANCY_S_FURTIVENESS && rn2(3)) && !(Race_if(PM_VIETIS) && rn2(3)) && !(Race_if(PM_KUTAR) && rn2(3)) ) {
8821 if (mtmp->data->msound == MS_SNORE) continue; /* won't wake up from this effect */
8823 mtmp->msleeping = 0;
8824 if (mtmp->mtame && !mtmp->isminion)
8825 EDOG(mtmp)->whistletime = moves;
8831 /* Wake up monsters near some particular location.
8832 * Amy edit: not guaranteed, and less likely with greater distance */
8833 void
8834 wake_nearto(x, y, distance)
8835 register int x, y, distance;
8837 register struct monst *mtmp;
8838 int wakedistance;
8840 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
8841 if (!DEADMONSTER(mtmp) && !(uarmc && uarmc->oartifact == ART_CLANCY_S_FURTIVENESS && rn2(3)) && !(Race_if(PM_VIETIS) && rn2(3)) && !(Race_if(PM_KUTAR) && rn2(3)) && mtmp->msleeping && (distance == 0 ||
8842 dist2(mtmp->mx, mtmp->my, x, y) < distance)) {
8844 if (mtmp->data->msound == MS_SNORE) continue; /* won't wake up from this effect */
8846 if (distance > 1) wakedistance = rnd(distance);
8847 if (rn2(2) && ( (distance == 0) || (dist2(mtmp->mx, mtmp->my, x, y) < wakedistance)) ) {
8848 mtmp->msleeping = 0;
8854 /* NOTE: we must check for mimicry before calling this routine */
8855 void
8856 seemimic(mtmp)
8857 register struct monst *mtmp;
8860 /* can't uncover certain types of monsters --Amy */
8861 if (permamimic(mtmp->data) || mtmp->egotype_permamimic ) return;
8863 unsigned old_app = mtmp->mappearance;
8864 uchar old_ap_type = mtmp->m_ap_type;
8866 mtmp->m_ap_type = M_AP_NOTHING;
8867 mtmp->mappearance = 0;
8870 * Discovered mimics don't block light.
8872 if (((old_ap_type == M_AP_FURNITURE &&
8873 (old_app == S_hcdoor || old_app == S_vcdoor)) ||
8874 (old_ap_type == M_AP_OBJECT && old_app == BOULDER)) &&
8875 !does_block(mtmp->mx, mtmp->my, &levl[mtmp->mx][mtmp->my]))
8876 unblock_point(mtmp->mx, mtmp->my);
8878 newsym(mtmp->mx,mtmp->my);
8881 /* force all chameleons to become normal */
8882 void
8883 rescham()
8885 register struct monst *mtmp;
8886 int mcham;
8888 for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
8889 if (DEADMONSTER(mtmp)) continue;
8890 if (permamimic(mtmp->data) || mtmp->egotype_permamimic ) continue;
8891 mcham = (int) mtmp->cham;
8892 if (mcham) {
8893 mtmp->cham = CHAM_ORDINARY;
8894 (void) newcham(mtmp, &mons[cham_to_pm[mcham]], FALSE,
8895 canseemon(mtmp));
8897 if(is_were(mtmp->data) && mtmp->data->mlet != S_HUMAN)
8898 new_were(mtmp);
8899 if(mtmp->m_ap_type && cansee(mtmp->mx, mtmp->my)) {
8900 seemimic(mtmp);
8901 /* we pretend that the mimic doesn't */
8902 /* know that it has been unmasked. */
8903 mtmp->msleeping = 1;
8908 /* Let the chameleons change again -dgk */
8909 void
8910 restartcham()
8912 register struct monst *mtmp;
8914 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
8915 if (DEADMONSTER(mtmp)) continue;
8916 mtmp->cham = pm_to_cham(monsndx(mtmp->data));
8917 if((mtmp->data->mlet == S_MIMIC || standardmimic(mtmp->data) || mtmp->egotype_mimic ) && mtmp->msleeping &&
8918 cansee(mtmp->mx, mtmp->my)) {
8919 set_mimic_sym(mtmp);
8920 newsym(mtmp->mx,mtmp->my);
8925 /* called when restoring a monster from a saved level; protection
8926 against shape-changing might be different now than it was at the
8927 time the level was saved. */
8928 void
8929 restore_cham(mon)
8930 struct monst *mon;
8932 int mcham;
8934 if (Protection_from_shape_changers) {
8935 mcham = (int) mon->cham;
8936 if (mcham) {
8937 mon->cham = CHAM_ORDINARY;
8938 (void) newcham(mon, &mons[cham_to_pm[mcham]], FALSE, FALSE);
8939 } else if (is_were(mon->data) && !is_human(mon->data)) {
8940 new_were(mon);
8942 } else if (mon->cham == CHAM_ORDINARY) {
8943 mon->cham = pm_to_cham(monsndx(mon->data));
8947 /* unwatched hiders may hide again; if so, a 1 is returned. */
8948 STATIC_OVL boolean
8949 restrap(mtmp)
8950 register struct monst *mtmp;
8952 if(mtmp->cham || mtmp->mcan || mtmp->m_ap_type ||
8953 cansee(mtmp->mx, mtmp->my) || rn2(3) || (mtmp == u.ustuck) ||
8954 (sensemon(mtmp) && distu(mtmp->mx, mtmp->my) <= 2))
8955 return(FALSE);
8957 if(mtmp->data->mlet == S_MIMIC || standardmimic(mtmp->data) || mtmp->egotype_mimic ) {
8958 set_mimic_sym(mtmp);
8959 return(TRUE);
8960 } else /* allow piercers and suchlike to hide on all terrain types --Amy */
8961 /*if(levl[mtmp->mx][mtmp->my].typ == ROOM)*/ {
8962 mtmp->mundetected = 1;
8963 return(TRUE);
8966 return(FALSE);
8969 int *animal_list = 0; /* list of PM values for animal monsters */
8970 int animal_list_count;
8972 void
8973 mon_animal_list(construct)
8974 boolean construct;
8976 if (construct) {
8977 int animal_temp[SPECIAL_PM];
8978 int i, n;
8980 /* if (animal_list) impossible("animal_list already exists"); */
8982 for (n = 0, i = LOW_PM; i < SPECIAL_PM; i++)
8983 if (is_animal(&mons[i])) animal_temp[n++] = i;
8984 /* if (n == 0) animal_temp[n++] = NON_PM; */
8986 animal_list = (int *)alloc(n * sizeof *animal_list);
8987 (void) memcpy((void *)animal_list,
8988 (void *)animal_temp,
8989 n * sizeof *animal_list);
8990 animal_list_count = n;
8991 } else { /* release */
8992 if (animal_list) free((void *)animal_list), animal_list = 0;
8993 animal_list_count = 0;
8997 STATIC_OVL int
8998 pick_animal()
9000 if (!animal_list) mon_animal_list(TRUE);
9002 return animal_list[rn2(animal_list_count)];
9005 STATIC_OVL int
9006 select_newcham_form(mon)
9007 struct monst *mon;
9009 int mndx = NON_PM;
9010 struct permonst *pm;
9012 int chambaselvl; /* base level of the unpolymorphed shapechanger --Amy */
9013 /* basically, what we want here is that the shapechanger is exceedingly unlikely to turn into something of a much
9014 * higher level than its base form; it shouldn't be completely impossible, but rare enough to not turn all
9015 * shapeshifters into a crapshoot a la "did it change into a level 50 ubermonster or not?" */
9017 switch (mon->cham) {
9019 case CHAM_CHAMELEON: chambaselvl = 6; break;
9020 case CHAM_EVIL_CHAMELEON: chambaselvl = 6; break;
9021 case CHAM_DOPPELGANGER: chambaselvl = 9; break;
9022 case CHAM_DOPPLEZON: chambaselvl = 10; break;
9023 case CHAM_SANDESTIN: chambaselvl = 13; break;
9024 case CHAM_MISSINGNO: chambaselvl = 10; break;
9025 case CHAM_TRANSFORMER: chambaselvl = 10; break;
9026 case CHAM_WARPER: chambaselvl = 20; break;
9027 case CHAM_CHAOS_SHAPECHANGER: chambaselvl = 11; break;
9028 case CHAM_SANDWICH: chambaselvl = 6; break;
9029 case CHAM_KARMA_CHAMELEON: chambaselvl = 6; break;
9030 case CHAM_CHANGERING_KELPIE: chambaselvl = 5; break;
9031 case CHAM_EACH_UISGE: chambaselvl = 20; break;
9032 case CHAM_JUNOW_TRICE: chambaselvl = 10; break;
9033 case CHAM_POLY_FLAYER: chambaselvl = 15; break;
9034 case CHAM_WILD_CHANGE_NYMPH: chambaselvl = 5; break;
9035 case CHAM_VERY_POLY_NYMPH: chambaselvl = 20; break;
9036 case CHAM_CORTEGEX: chambaselvl = 15; break;
9037 case CHAM_CHANGE_EXPLODER: chambaselvl = 10; break;
9038 case CHAM_BAM_CHAM: chambaselvl = 16; break;
9039 case CHAM_LAURA_S_PARLOR_TRICK: chambaselvl = 10; break;
9040 case CHAM_LAURA_S_MASTERPIECE: chambaselvl = 32; break;
9041 case CHAM_TSCHANG_SEPHIRAH: chambaselvl = 10; break;
9042 case CHAM_GLONK_SEPHIRAH: chambaselvl = 25; break;
9043 case CHAM_KUSCHOING_SEPHIRAH: chambaselvl = 40; break;
9044 case CHAM_ULTRA_DESTRUCTIVE_MONSTER: chambaselvl = 20; break;
9045 case CHAM_DARN_DEMENTOR: chambaselvl = 15; break;
9046 case CHAM_SHOEMELEON: chambaselvl = 10; break;
9047 case CHAM_POLYFESHNEE: chambaselvl = 11; break;
9048 case CHAM_COVETOUSLEON: chambaselvl = 17; break;
9049 case CHAM_WHORED_HORE: chambaselvl = 22; break;
9050 case CHAM_LULU_ASS: chambaselvl = 8; break;
9051 case CHAM_TENDER_JESSE: chambaselvl = 5; break;
9052 case CHAM_ELEROTIC_DREAM_WOMAN: chambaselvl = 20; break;
9053 case CHAM_MARTIIN: chambaselvl = 10; break;
9054 case CHAM_FOREPREACHER_CONVERTER: chambaselvl = 14; break;
9055 case CHAM_RICTIM_TERRORIZER: chambaselvl = 10; break;
9056 case CHAM_POLYMORPHITIC_WOLF: chambaselvl = 9; break;
9057 case CHAM_OFFDIVER: chambaselvl = 8; break;
9058 case CHAM_SLUMBER_HULK: chambaselvl = 10; break;
9059 case CHAM_IVEL_WUXTINA: chambaselvl = 20; break;
9060 case CHAM_EARLY_LEON: chambaselvl = 0; break;
9061 case CHAM_CHAMECHAUN: chambaselvl = 6; break;
9062 case CHAM_METAL_DOPPELGANGER: chambaselvl = 9; break;
9063 case CHAM_GHELEON: chambaselvl = 6; break;
9064 case CHAM_LAMECHAM: chambaselvl = 6; break;
9065 case CHAM_SHAPESHIFTING_EXPERTISE: chambaselvl = 9; break;
9066 case CHAM_RAINBOW_SPHERE: chambaselvl = 10; break;
9067 case CHAM_ELONA_BADGER: chambaselvl = 23; break;
9068 case CHAM_ZRUTINATOR: chambaselvl = 25; break;
9069 case CHAM_METAMORPHOSE: chambaselvl = 51; break;
9070 case CHAM_GREEN_SLAAD: chambaselvl = 24; break;
9071 case CHAM_CHANGELING: chambaselvl = 8; break;
9072 case CHAM_CHANGELING_MUMMY: chambaselvl = 6; break;
9073 case CHAM_CHANGELING_ZOMBIE: chambaselvl = 4; break;
9074 case CHAM_COCKAMELEON: chambaselvl = 5; break;
9075 case CHAM_CHARMONIE: chambaselvl = 90; break;
9076 case CHAM_EDOTO: chambaselvl = 45; break;
9077 case CHAM_PURPLE_R: chambaselvl = 12; break;
9078 case CHAM_VAMPSHIFTER: chambaselvl = 12; break;
9079 case CHAM_UNGENOCIDABLE_VAMPSHIFTER: chambaselvl = 12; break;
9080 case CHAM_CHAMELON: chambaselvl = 16; break;
9081 case CHAM_COMMA_CHAMELEON: chambaselvl = 6; break;
9082 case CHAM_UNIQUE_SHIFTER: chambaselvl = 25; break;
9083 case CHAM_PLAYER_CHANGELING: chambaselvl = 8; break;
9084 case CHAM_DITTO: chambaselvl = 12; break;
9085 case CHAM_GIANT_CHAMELEON: chambaselvl = 10; break;
9086 /* gah they made it so that regular polymorphs, e.g. via potion, also use this function! */
9087 default:
9088 if (mon->oldmonnm) chambaselvl = mons[mon->oldmonnm].mlevel;
9089 else chambaselvl = mon->data->mlevel;
9090 break;
9093 switch (mon->cham) {
9094 case CHAM_SANDESTIN:
9095 case CHAM_CHAOS_SHAPECHANGER:
9096 case CHAM_DOPPLEZON:
9097 if (!rn2(7)) {
9098 sandestinchoice:
9099 mndx = pick_nasty();
9100 pm = &mons[mndx];
9101 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto sandestinchoice;
9102 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto sandestinchoice;
9103 if (uncommon2(pm) && !rn2(4)) goto sandestinchoice;
9104 if (uncommon3(pm) && !rn2(3)) goto sandestinchoice;
9105 if (uncommon5(pm) && !rn2(2)) goto sandestinchoice;
9106 if (uncommon7(pm) && rn2(3)) goto sandestinchoice;
9107 if (uncommon10(pm) && rn2(5)) goto sandestinchoice;
9108 if (is_jonadabmonster(pm) && rn2(20)) goto sandestinchoice;
9110 break;
9111 case CHAM_WARPER:
9112 if (!rn2(7)) {
9113 warperchoice:
9114 mndx = rn2(NUMMONS);
9115 pm = &mons[mndx];
9116 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto warperchoice;
9117 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto warperchoice;
9118 if (uncommon2(pm) && !rn2(4)) goto warperchoice;
9119 if (uncommon3(pm) && !rn2(3)) goto warperchoice;
9120 if (uncommon5(pm) && !rn2(2)) goto warperchoice;
9121 if (uncommon7(pm) && rn2(3)) goto warperchoice;
9122 if (uncommon10(pm) && rn2(5)) goto warperchoice;
9123 if (is_jonadabmonster(pm) && rn2(20)) goto warperchoice;
9125 break;
9126 case CHAM_SANDWICH:
9127 sandwichchoice:
9128 mndx = rn2(NUMMONS);
9129 pm = &mons[mndx];
9130 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto sandwichchoice;
9131 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto sandwichchoice;
9132 if (uncommon2(pm) && !rn2(4)) goto sandwichchoice;
9133 if (uncommon3(pm) && !rn2(3)) goto sandwichchoice;
9134 if (uncommon5(pm) && !rn2(2)) goto sandwichchoice;
9135 if (uncommon7(pm) && rn2(3)) goto sandwichchoice;
9136 if (uncommon10(pm) && rn2(5)) goto sandwichchoice;
9137 if (is_jonadabmonster(pm) && rn2(20)) goto sandwichchoice;
9138 if (rn2(10000) && !(pm->mlet == S_BLOB || pm->mlet == S_PUDDING || pm->mlet == S_JELLY) ) goto sandwichchoice;
9139 break;
9140 case CHAM_JUNOW_TRICE:
9141 junowchoice:
9142 mndx = rn2(NUMMONS);
9143 pm = &mons[mndx];
9144 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto junowchoice;
9145 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto junowchoice;
9146 if (uncommon2(pm) && !rn2(4)) goto junowchoice;
9147 if (uncommon3(pm) && !rn2(3)) goto junowchoice;
9148 if (uncommon5(pm) && !rn2(2)) goto junowchoice;
9149 if (uncommon7(pm) && rn2(3)) goto junowchoice;
9150 if (uncommon10(pm) && rn2(5)) goto junowchoice;
9151 if (is_jonadabmonster(pm) && rn2(20)) goto junowchoice;
9152 if (rn2(10000) && !(pm->mlet == S_COCKATRICE) ) goto junowchoice;
9153 break;
9154 case CHAM_POLY_FLAYER:
9155 flayerchoice:
9156 mndx = rn2(NUMMONS);
9157 pm = &mons[mndx];
9158 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto flayerchoice;
9159 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto flayerchoice;
9160 if (uncommon2(pm) && !rn2(4)) goto flayerchoice;
9161 if (uncommon3(pm) && !rn2(3)) goto flayerchoice;
9162 if (uncommon5(pm) && !rn2(2)) goto flayerchoice;
9163 if (uncommon7(pm) && rn2(3)) goto flayerchoice;
9164 if (uncommon10(pm) && rn2(5)) goto flayerchoice;
9165 if (is_jonadabmonster(pm) && rn2(20)) goto flayerchoice;
9166 if (rn2(10000) && !(dmgtype(pm, AD_DRIN)) ) goto flayerchoice;
9167 break;
9168 case CHAM_WILD_CHANGE_NYMPH:
9169 case CHAM_VERY_POLY_NYMPH:
9170 nymphchoice:
9171 mndx = rn2(NUMMONS);
9172 pm = &mons[mndx];
9173 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto nymphchoice;
9174 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto nymphchoice;
9175 if (uncommon2(pm) && !rn2(4)) goto nymphchoice;
9176 if (uncommon3(pm) && !rn2(3)) goto nymphchoice;
9177 if (uncommon5(pm) && !rn2(2)) goto nymphchoice;
9178 if (uncommon7(pm) && rn2(3)) goto nymphchoice;
9179 if (uncommon10(pm) && rn2(5)) goto nymphchoice;
9180 if (is_jonadabmonster(pm) && rn2(20)) goto nymphchoice;
9181 if (rn2(10000) && !(pm->mlet == S_NYMPH) ) goto nymphchoice;
9182 break;
9183 case CHAM_CORTEGEX:
9184 vortexchoice:
9185 mndx = rn2(NUMMONS);
9186 pm = &mons[mndx];
9187 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto vortexchoice;
9188 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto vortexchoice;
9189 if (uncommon2(pm) && !rn2(4)) goto vortexchoice;
9190 if (uncommon3(pm) && !rn2(3)) goto vortexchoice;
9191 if (uncommon5(pm) && !rn2(2)) goto vortexchoice;
9192 if (uncommon7(pm) && rn2(3)) goto vortexchoice;
9193 if (uncommon10(pm) && rn2(5)) goto vortexchoice;
9194 if (is_jonadabmonster(pm) && rn2(20)) goto vortexchoice;
9195 if (rn2(10000) && !(pm->mlet == S_VORTEX) ) goto vortexchoice;
9196 break;
9197 case CHAM_CHANGE_EXPLODER:
9198 lightchoice:
9199 mndx = rn2(NUMMONS);
9200 pm = &mons[mndx];
9201 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto lightchoice;
9202 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto lightchoice;
9203 if (uncommon2(pm) && !rn2(4)) goto lightchoice;
9204 if (uncommon3(pm) && !rn2(3)) goto lightchoice;
9205 if (uncommon5(pm) && !rn2(2)) goto lightchoice;
9206 if (uncommon7(pm) && rn2(3)) goto lightchoice;
9207 if (uncommon10(pm) && rn2(5)) goto lightchoice;
9208 if (is_jonadabmonster(pm) && rn2(20)) goto lightchoice;
9209 if (rn2(10000) && !(pm->mlet == S_LIGHT) ) goto lightchoice;
9210 break;
9211 case CHAM_BAM_CHAM:
9212 dragonchoice:
9213 mndx = rn2(NUMMONS);
9214 pm = &mons[mndx];
9215 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto dragonchoice;
9216 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto dragonchoice;
9217 if (uncommon2(pm) && !rn2(4)) goto dragonchoice;
9218 if (uncommon3(pm) && !rn2(3)) goto dragonchoice;
9219 if (uncommon5(pm) && !rn2(2)) goto dragonchoice;
9220 if (uncommon7(pm) && rn2(3)) goto dragonchoice;
9221 if (uncommon10(pm) && rn2(5)) goto dragonchoice;
9222 if (is_jonadabmonster(pm) && rn2(20)) goto dragonchoice;
9223 if (rn2(10000) && !(pm->mlet == S_DRAGON) ) goto dragonchoice;
9224 break;
9225 case CHAM_LAURA_S_PARLOR_TRICK:
9226 case CHAM_LAURA_S_MASTERPIECE:
9227 elementalchoice:
9228 mndx = rn2(NUMMONS);
9229 pm = &mons[mndx];
9230 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto elementalchoice;
9231 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto elementalchoice;
9232 if (uncommon2(pm) && !rn2(4)) goto elementalchoice;
9233 if (uncommon3(pm) && !rn2(3)) goto elementalchoice;
9234 if (uncommon5(pm) && !rn2(2)) goto elementalchoice;
9235 if (uncommon7(pm) && rn2(3)) goto elementalchoice;
9236 if (uncommon10(pm) && rn2(5)) goto elementalchoice;
9237 if (is_jonadabmonster(pm) && rn2(20)) goto elementalchoice;
9238 if (rn2(10000) && !(pm->mlet == S_ELEMENTAL) ) goto elementalchoice;
9239 break;
9240 case CHAM_TSCHANG_SEPHIRAH:
9241 case CHAM_GLONK_SEPHIRAH:
9242 case CHAM_KUSCHOING_SEPHIRAH:
9243 kopchoice:
9244 mndx = rn2(NUMMONS);
9245 pm = &mons[mndx];
9246 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto kopchoice;
9247 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto kopchoice;
9248 if (uncommon2(pm) && !rn2(4)) goto kopchoice;
9249 if (uncommon3(pm) && !rn2(3)) goto kopchoice;
9250 if (uncommon5(pm) && !rn2(2)) goto kopchoice;
9251 if (uncommon7(pm) && rn2(3)) goto kopchoice;
9252 if (uncommon10(pm) && rn2(5)) goto kopchoice;
9253 if (is_jonadabmonster(pm) && rn2(20)) goto kopchoice;
9254 if (rn2(10000) && !(pm->mlet == S_KOP) ) goto kopchoice;
9255 break;
9256 case CHAM_ULTRA_DESTRUCTIVE_MONSTER:
9257 case CHAM_PURPLE_R:
9258 rustmonsterchoice:
9259 mndx = rn2(NUMMONS);
9260 pm = &mons[mndx];
9261 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto rustmonsterchoice;
9262 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto rustmonsterchoice;
9263 if (uncommon2(pm) && !rn2(4)) goto rustmonsterchoice;
9264 if (uncommon3(pm) && !rn2(3)) goto rustmonsterchoice;
9265 if (uncommon5(pm) && !rn2(2)) goto rustmonsterchoice;
9266 if (uncommon7(pm) && rn2(3)) goto rustmonsterchoice;
9267 if (uncommon10(pm) && rn2(5)) goto rustmonsterchoice;
9268 if (is_jonadabmonster(pm) && rn2(20)) goto rustmonsterchoice;
9269 if (rn2(10000) && !(pm->mlet == S_RUSTMONST) ) goto rustmonsterchoice;
9270 break;
9271 case CHAM_UNGENOCIDABLE_VAMPSHIFTER:
9272 case CHAM_VAMPSHIFTER:
9273 vampirechoice:
9274 mndx = rn2(NUMMONS);
9275 pm = &mons[mndx];
9276 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto vampirechoice;
9277 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto vampirechoice;
9278 if (uncommon2(pm) && !rn2(4)) goto vampirechoice;
9279 if (uncommon3(pm) && !rn2(3)) goto vampirechoice;
9280 if (uncommon5(pm) && !rn2(2)) goto vampirechoice;
9281 if (uncommon7(pm) && rn2(3)) goto vampirechoice;
9282 if (uncommon10(pm) && rn2(5)) goto vampirechoice;
9283 if (is_jonadabmonster(pm) && rn2(20)) goto vampirechoice;
9284 if (rn2(10000) && !(pm->mlet == S_VAMPIRE) ) goto vampirechoice;
9285 break;
9286 case CHAM_DARN_DEMENTOR:
9287 ghostchoice:
9288 mndx = rn2(NUMMONS);
9289 pm = &mons[mndx];
9290 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto ghostchoice;
9291 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto ghostchoice;
9292 if (uncommon2(pm) && !rn2(4)) goto ghostchoice;
9293 if (uncommon3(pm) && !rn2(3)) goto ghostchoice;
9294 if (uncommon5(pm) && !rn2(2)) goto ghostchoice;
9295 if (uncommon7(pm) && rn2(3)) goto ghostchoice;
9296 if (uncommon10(pm) && rn2(5)) goto ghostchoice;
9297 if (is_jonadabmonster(pm) && rn2(20)) goto ghostchoice;
9298 if (rn2(10000) && !(pm->mlet == S_GHOST) ) goto ghostchoice;
9299 break;
9300 case CHAM_CHAMELON:
9301 chamelonchoice:
9302 mndx = rn2(NUMMONS);
9303 pm = &mons[mndx];
9304 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto chamelonchoice;
9305 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto chamelonchoice;
9306 if (uncommon2(pm) && !rn2(4)) goto chamelonchoice;
9307 if (uncommon3(pm) && !rn2(3)) goto chamelonchoice;
9308 if (uncommon5(pm) && !rn2(2)) goto chamelonchoice;
9309 if (uncommon7(pm) && rn2(3)) goto chamelonchoice;
9310 if (uncommon10(pm) && rn2(5)) goto chamelonchoice;
9311 if (is_jonadabmonster(pm) && rn2(20)) goto chamelonchoice;
9312 if (rn2(10000) && !(pm->mlet == S_BAD_FOOD) ) goto chamelonchoice;
9313 break;
9314 case CHAM_SHOEMELEON:
9315 shoechoice:
9316 mndx = rn2(NUMMONS);
9317 pm = &mons[mndx];
9318 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto shoechoice;
9319 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto shoechoice;
9320 if (uncommon2(pm) && !rn2(4)) goto shoechoice;
9321 if (uncommon3(pm) && !rn2(3)) goto shoechoice;
9322 if (uncommon5(pm) && !rn2(2)) goto shoechoice;
9323 if (uncommon7(pm) && rn2(3)) goto shoechoice;
9324 if (uncommon10(pm) && rn2(5)) goto shoechoice;
9325 if (is_jonadabmonster(pm) && rn2(20)) goto shoechoice;
9326 if (rn2(10000) && !(pm->msound == MS_SHOE) ) goto shoechoice;
9327 break;
9328 case CHAM_POLYFESHNEE:
9329 demonchoice:
9330 mndx = rn2(NUMMONS);
9331 pm = &mons[mndx];
9332 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto demonchoice;
9333 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto demonchoice;
9334 if (uncommon2(pm) && !rn2(4)) goto demonchoice;
9335 if (uncommon3(pm) && !rn2(3)) goto demonchoice;
9336 if (uncommon5(pm) && !rn2(2)) goto demonchoice;
9337 if (uncommon7(pm) && rn2(3)) goto demonchoice;
9338 if (uncommon10(pm) && rn2(5)) goto demonchoice;
9339 if (is_jonadabmonster(pm) && rn2(20)) goto demonchoice;
9340 if (rn2(10000) && !(is_demon(pm)) ) goto demonchoice;
9341 break;
9342 case CHAM_COVETOUSLEON:
9343 covetouschoice:
9344 mndx = rn2(NUMMONS);
9345 pm = &mons[mndx];
9346 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto covetouschoice;
9347 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto covetouschoice;
9348 if (uncommon2(pm) && !rn2(4)) goto covetouschoice;
9349 if (uncommon3(pm) && !rn2(3)) goto covetouschoice;
9350 if (uncommon5(pm) && !rn2(2)) goto covetouschoice;
9351 if (uncommon7(pm) && rn2(3)) goto covetouschoice;
9352 if (uncommon10(pm) && rn2(5)) goto covetouschoice;
9353 if (is_jonadabmonster(pm) && rn2(20)) goto covetouschoice;
9354 if (rn2(10000) && !(is_covetous(pm)) ) goto covetouschoice;
9355 break;
9356 case CHAM_WHORED_HORE:
9357 whorechoice:
9358 mndx = rn2(NUMMONS);
9359 pm = &mons[mndx];
9360 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto whorechoice;
9361 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto whorechoice;
9362 if (uncommon2(pm) && !rn2(4)) goto whorechoice;
9363 if (uncommon3(pm) && !rn2(3)) goto whorechoice;
9364 if (uncommon5(pm) && !rn2(2)) goto whorechoice;
9365 if (uncommon7(pm) && rn2(3)) goto whorechoice;
9366 if (uncommon10(pm) && rn2(5)) goto whorechoice;
9367 if (is_jonadabmonster(pm) && rn2(20)) goto whorechoice;
9368 if (rn2(10000) && !(pm->msound == MS_WHORE) ) goto whorechoice;
9369 break;
9370 case CHAM_LULU_ASS:
9371 fartloudchoice:
9372 mndx = rn2(NUMMONS);
9373 pm = &mons[mndx];
9374 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto fartloudchoice;
9375 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto fartloudchoice;
9376 if (uncommon2(pm) && !rn2(4)) goto fartloudchoice;
9377 if (uncommon3(pm) && !rn2(3)) goto fartloudchoice;
9378 if (uncommon5(pm) && !rn2(2)) goto fartloudchoice;
9379 if (uncommon7(pm) && rn2(3)) goto fartloudchoice;
9380 if (uncommon10(pm) && rn2(5)) goto fartloudchoice;
9381 if (is_jonadabmonster(pm) && rn2(20)) goto fartloudchoice;
9382 if (rn2(10000) && !(pm->msound == MS_FART_LOUD) ) goto fartloudchoice;
9383 break;
9384 case CHAM_TENDER_JESSE:
9385 fartquietchoice:
9386 mndx = rn2(NUMMONS);
9387 pm = &mons[mndx];
9388 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto fartquietchoice;
9389 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto fartquietchoice;
9390 if (uncommon2(pm) && !rn2(4)) goto fartquietchoice;
9391 if (uncommon3(pm) && !rn2(3)) goto fartquietchoice;
9392 if (uncommon5(pm) && !rn2(2)) goto fartquietchoice;
9393 if (uncommon7(pm) && rn2(3)) goto fartquietchoice;
9394 if (uncommon10(pm) && rn2(5)) goto fartquietchoice;
9395 if (is_jonadabmonster(pm) && rn2(20)) goto fartquietchoice;
9396 if (rn2(10000) && !(pm->msound == MS_FART_QUIET) ) goto fartquietchoice;
9397 break;
9398 case CHAM_ELEROTIC_DREAM_WOMAN:
9399 fartnormalchoice:
9400 mndx = rn2(NUMMONS);
9401 pm = &mons[mndx];
9402 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto fartnormalchoice;
9403 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto fartnormalchoice;
9404 if (uncommon2(pm) && !rn2(4)) goto fartnormalchoice;
9405 if (uncommon3(pm) && !rn2(3)) goto fartnormalchoice;
9406 if (uncommon5(pm) && !rn2(2)) goto fartnormalchoice;
9407 if (uncommon7(pm) && rn2(3)) goto fartnormalchoice;
9408 if (uncommon10(pm) && rn2(5)) goto fartnormalchoice;
9409 if (is_jonadabmonster(pm) && rn2(20)) goto fartnormalchoice;
9410 if (rn2(10000) && !(pm->msound == MS_FART_NORMAL) ) goto fartnormalchoice;
9411 break;
9412 case CHAM_MARTIIN:
9413 scentchoice:
9414 mndx = rn2(NUMMONS);
9415 pm = &mons[mndx];
9416 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto scentchoice;
9417 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto scentchoice;
9418 if (uncommon2(pm) && !rn2(4)) goto scentchoice;
9419 if (uncommon3(pm) && !rn2(3)) goto scentchoice;
9420 if (uncommon5(pm) && !rn2(2)) goto scentchoice;
9421 if (uncommon7(pm) && rn2(3)) goto scentchoice;
9422 if (uncommon10(pm) && rn2(5)) goto scentchoice;
9423 if (is_jonadabmonster(pm) && rn2(20)) goto scentchoice;
9424 if (rn2(10000) && !(pm->msound == MS_STENCH) ) goto scentchoice;
9425 break;
9426 case CHAM_FOREPREACHER_CONVERTER:
9427 convertchoice:
9428 mndx = rn2(NUMMONS);
9429 pm = &mons[mndx];
9430 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto convertchoice;
9431 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto convertchoice;
9432 if (uncommon2(pm) && !rn2(4)) goto convertchoice;
9433 if (uncommon3(pm) && !rn2(3)) goto convertchoice;
9434 if (uncommon5(pm) && !rn2(2)) goto convertchoice;
9435 if (uncommon7(pm) && rn2(3)) goto convertchoice;
9436 if (uncommon10(pm) && rn2(5)) goto convertchoice;
9437 if (is_jonadabmonster(pm) && rn2(20)) goto convertchoice;
9438 if (rn2(10000) && !(pm->msound == MS_CONVERT) ) goto convertchoice;
9439 break;
9440 case CHAM_RICTIM_TERRORIZER:
9441 hcalienchoice:
9442 mndx = rn2(NUMMONS);
9443 pm = &mons[mndx];
9444 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto hcalienchoice;
9445 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto hcalienchoice;
9446 if (uncommon2(pm) && !rn2(4)) goto hcalienchoice;
9447 if (uncommon3(pm) && !rn2(3)) goto hcalienchoice;
9448 if (uncommon5(pm) && !rn2(2)) goto hcalienchoice;
9449 if (uncommon7(pm) && rn2(3)) goto hcalienchoice;
9450 if (uncommon10(pm) && rn2(5)) goto hcalienchoice;
9451 if (is_jonadabmonster(pm) && rn2(20)) goto hcalienchoice;
9452 if (rn2(10000) && !(pm->msound == MS_HCALIEN) ) goto hcalienchoice;
9453 break;
9454 case CHAM_POLYMORPHITIC_WOLF:
9455 spacewarschoice:
9456 mndx = rn2(NUMMONS);
9457 pm = &mons[mndx];
9458 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto spacewarschoice;
9459 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto spacewarschoice;
9460 if (uncommon2(pm) && !rn2(4)) goto spacewarschoice;
9461 if (uncommon3(pm) && !rn2(3)) goto spacewarschoice;
9462 if (uncommon5(pm) && !rn2(2)) goto spacewarschoice;
9463 if (uncommon7(pm) && rn2(3)) goto spacewarschoice;
9464 if (uncommon10(pm) && rn2(5)) goto spacewarschoice;
9465 if (is_jonadabmonster(pm) && rn2(20)) goto spacewarschoice;
9466 if (rn2(10000) && !(is_cowmonster(pm)) ) goto spacewarschoice;
9467 break;
9468 case CHAM_DITTO:
9469 dittochoice:
9470 mndx = rn2(NUMMONS);
9471 pm = &mons[mndx];
9472 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto dittochoice;
9473 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto dittochoice;
9474 if (uncommon2(pm) && !rn2(4)) goto dittochoice;
9475 if (uncommon3(pm) && !rn2(3)) goto dittochoice;
9476 if (uncommon5(pm) && !rn2(2)) goto dittochoice;
9477 if (uncommon7(pm) && rn2(3)) goto dittochoice;
9478 if (uncommon10(pm) && rn2(5)) goto dittochoice;
9479 if (is_jonadabmonster(pm) && rn2(20)) goto dittochoice;
9480 if (rn2(10000) && !(is_pokemon(pm)) ) goto dittochoice;
9481 break;
9482 case CHAM_OFFDIVER:
9483 jokechoice:
9484 mndx = rn2(NUMMONS);
9485 pm = &mons[mndx];
9486 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto jokechoice;
9487 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto jokechoice;
9488 if (uncommon2(pm) && !rn2(4)) goto jokechoice;
9489 if (uncommon3(pm) && !rn2(3)) goto jokechoice;
9490 if (uncommon5(pm) && !rn2(2)) goto jokechoice;
9491 if (uncommon7(pm) && rn2(3)) goto jokechoice;
9492 if (uncommon10(pm) && rn2(5)) goto jokechoice;
9493 if (is_jonadabmonster(pm) && rn2(20)) goto jokechoice;
9494 if (rn2(10000) && !(is_jokemonster(pm)) ) goto jokechoice;
9495 break;
9496 case CHAM_SLUMBER_HULK:
9497 randomizedchoice:
9498 mndx = rn2(NUMMONS);
9499 pm = &mons[mndx];
9500 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto randomizedchoice;
9501 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto randomizedchoice;
9502 if (uncommon2(pm) && !rn2(4)) goto randomizedchoice;
9503 if (uncommon3(pm) && !rn2(3)) goto randomizedchoice;
9504 if (uncommon5(pm) && !rn2(2)) goto randomizedchoice;
9505 if (uncommon7(pm) && rn2(3)) goto randomizedchoice;
9506 if (uncommon10(pm) && rn2(5)) goto randomizedchoice;
9507 if (is_jonadabmonster(pm) && rn2(20)) goto randomizedchoice;
9508 if (rn2(10000) && !(is_randomizedmonster(pm)) ) goto randomizedchoice;
9509 break;
9510 case CHAM_IVEL_WUXTINA:
9511 evilchoice:
9512 mndx = rn2(NUMMONS);
9513 pm = &mons[mndx];
9514 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto evilchoice;
9515 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto evilchoice;
9516 if (uncommon2(pm) && !rn2(4)) goto evilchoice;
9517 if (uncommon3(pm) && !rn2(3)) goto evilchoice;
9518 if (uncommon5(pm) && !rn2(2)) goto evilchoice;
9519 if (uncommon7(pm) && rn2(3)) goto evilchoice;
9520 if (uncommon10(pm) && rn2(5)) goto evilchoice;
9521 if (is_jonadabmonster(pm) && rn2(20)) goto evilchoice;
9522 if (rn2(10000) && !(is_evilpatchmonster(pm)) ) goto evilchoice;
9523 break;
9524 case CHAM_ZRUTINATOR:
9526 zevilchoice:
9527 mndx = rn2(NUMMONS);
9528 pm = &mons[mndx];
9529 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto zevilchoice;
9530 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto zevilchoice;
9531 if (uncommon2(pm) && !rn2(4)) goto zevilchoice;
9532 if (uncommon3(pm) && !rn2(3)) goto zevilchoice;
9533 if (uncommon5(pm) && !rn2(2)) goto zevilchoice;
9534 if (uncommon7(pm) && rn2(3)) goto zevilchoice;
9535 if (uncommon10(pm) && rn2(5)) goto zevilchoice;
9536 if (is_jonadabmonster(pm) && rn2(20)) goto zevilchoice;
9537 if (rn2(10000) && !(is_evilpatchmonster(pm)) ) goto zevilchoice;
9538 break;
9539 case CHAM_GREEN_SLAAD:
9540 slaadchoice:
9541 mndx = rn2(NUMMONS);
9542 pm = &mons[mndx];
9543 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto slaadchoice;
9544 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto slaadchoice;
9545 if (uncommon2(pm) && !rn2(4)) goto slaadchoice;
9546 if (uncommon3(pm) && !rn2(3)) goto slaadchoice;
9547 if (uncommon5(pm) && !rn2(2)) goto slaadchoice;
9548 if (uncommon7(pm) && rn2(3)) goto slaadchoice;
9549 if (uncommon10(pm) && rn2(5)) goto slaadchoice;
9550 if (is_jonadabmonster(pm) && rn2(20)) goto slaadchoice;
9551 if (rn2(10000) && !(humanoid(pm)) ) goto slaadchoice;
9552 break;
9553 case CHAM_EARLY_LEON:
9554 earlyleonchoice:
9555 mndx = rn2(NUMMONS);
9556 pm = &mons[mndx];
9557 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto earlyleonchoice;
9558 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto earlyleonchoice;
9559 if (uncommon2(pm) && !rn2(4)) goto earlyleonchoice;
9560 if (uncommon3(pm) && !rn2(3)) goto earlyleonchoice;
9561 if (uncommon5(pm) && !rn2(2)) goto earlyleonchoice;
9562 if (uncommon7(pm) && rn2(3)) goto earlyleonchoice;
9563 if (uncommon10(pm) && rn2(5)) goto earlyleonchoice;
9564 if (is_jonadabmonster(pm) && rn2(20)) goto earlyleonchoice;
9565 if (rn2(10000) && (pm->mlevel > 5)) goto earlyleonchoice;
9566 break;
9567 case CHAM_METAMORPHOSE:
9568 case CHAM_SHAPESHIFTING_EXPERTISE:
9569 metamorphchoice:
9570 mndx = rn2(NUMMONS);
9571 pm = &mons[mndx];
9572 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto metamorphchoice;
9573 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto metamorphchoice;
9574 if (uncommon2(pm) && !rn2(4)) goto metamorphchoice;
9575 if (uncommon3(pm) && !rn2(3)) goto metamorphchoice;
9576 if (uncommon5(pm) && !rn2(2)) goto metamorphchoice;
9577 if (uncommon7(pm) && rn2(3)) goto metamorphchoice;
9578 if (uncommon10(pm) && rn2(5)) goto metamorphchoice;
9579 if (is_jonadabmonster(pm) && rn2(20)) goto metamorphchoice;
9580 break;
9581 case CHAM_UNIQUE_SHIFTER:
9582 uniqueshiftchoice:
9583 mndx = rn2(NUMMONS);
9584 pm = &mons[mndx];
9585 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto uniqueshiftchoice;
9586 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto uniqueshiftchoice;
9587 if (uncommon2(pm) && !rn2(4)) goto uniqueshiftchoice;
9588 if (uncommon3(pm) && !rn2(3)) goto uniqueshiftchoice;
9589 if (uncommon5(pm) && !rn2(2)) goto uniqueshiftchoice;
9590 if (uncommon7(pm) && rn2(3)) goto uniqueshiftchoice;
9591 if (uncommon10(pm) && rn2(5)) goto uniqueshiftchoice;
9592 if (is_jonadabmonster(pm) && rn2(20)) goto uniqueshiftchoice;
9593 if ((pm->geno & G_FREQ) < 1) goto uniqueshiftchoice;
9594 if (rn2(10000) && !(pm->geno & G_UNIQ)) goto uniqueshiftchoice;
9595 break;
9597 case CHAM_DOPPELGANGER:
9598 case CHAM_METAL_DOPPELGANGER:
9599 case CHAM_MISSINGNO:
9600 case CHAM_TRANSFORMER:
9601 if (!rn2(20)) mndx = pick_nasty();
9602 else if (!rn2(7)) mndx = rn1(PM_WIZARD - PM_ARCHEOLOGIST + 1,
9603 PM_ARCHEOLOGIST);
9604 break;
9605 case CHAM_CHARMONIE:
9606 mndx = rn1(PM_DEMOGORGON - PM_JUIBLEX + 1, PM_JUIBLEX);
9607 break;
9608 case CHAM_EDOTO:
9609 edotochoice:
9610 mndx = rn2(NUMMONS);
9611 pm = &mons[mndx];
9612 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto edotochoice;
9613 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto edotochoice;
9614 if (uncommon2(pm) && !rn2(4)) goto edotochoice;
9615 if (uncommon3(pm) && !rn2(3)) goto edotochoice;
9616 if (uncommon5(pm) && !rn2(2)) goto edotochoice;
9617 if (uncommon7(pm) && rn2(3)) goto edotochoice;
9618 if (uncommon10(pm) && rn2(5)) goto edotochoice;
9619 if (is_jonadabmonster(pm) && rn2(20)) goto edotochoice;
9620 if (rn2(10000) && !(pm->mlet == S_ARCHFIEND) ) goto edotochoice;
9621 break;
9622 case CHAM_RAINBOW_SPHERE:
9623 rainbowchoice:
9624 mndx = rn2(NUMMONS);
9625 pm = &mons[mndx];
9626 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto rainbowchoice;
9627 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto rainbowchoice;
9628 if (uncommon2(pm) && !rn2(4)) goto rainbowchoice;
9629 if (uncommon3(pm) && !rn2(3)) goto rainbowchoice;
9630 if (uncommon5(pm) && !rn2(2)) goto rainbowchoice;
9631 if (uncommon7(pm) && rn2(3)) goto rainbowchoice;
9632 if (uncommon10(pm) && rn2(5)) goto rainbowchoice;
9633 if (is_jonadabmonster(pm) && rn2(20)) goto rainbowchoice;
9634 if (rn2(10000) && !(attacktype(pm, AT_EXPL) ) ) goto rainbowchoice;
9635 break;
9636 case CHAM_CHAMELEON:
9637 case CHAM_EVIL_CHAMELEON:
9638 case CHAM_COMMA_CHAMELEON:
9639 case CHAM_CHAMECHAUN:
9640 case CHAM_GHELEON:
9641 case CHAM_LAMECHAM:
9642 case CHAM_ELONA_BADGER:
9643 case CHAM_COCKAMELEON:
9644 case CHAM_CHANGELING:
9645 case CHAM_PLAYER_CHANGELING:
9646 case CHAM_CHANGELING_ZOMBIE:
9647 case CHAM_CHANGELING_MUMMY:
9648 case CHAM_KARMA_CHAMELEON:
9649 case CHAM_CHANGERING_KELPIE:
9650 case CHAM_EACH_UISGE:
9651 case CHAM_GIANT_CHAMELEON:
9652 if (!rn2(7)) {
9653 chameleonchoice:
9654 mndx = pick_animal();
9655 pm = &mons[mndx];
9656 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto chameleonchoice;
9657 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto chameleonchoice;
9658 if (uncommon2(pm) && !rn2(4)) goto chameleonchoice;
9659 if (uncommon3(pm) && !rn2(3)) goto chameleonchoice;
9660 if (uncommon5(pm) && !rn2(2)) goto chameleonchoice;
9661 if (uncommon7(pm) && rn2(3)) goto chameleonchoice;
9662 if (uncommon10(pm) && rn2(5)) goto chameleonchoice;
9663 if (is_jonadabmonster(pm) && rn2(20)) goto chameleonchoice;
9666 break;
9667 case CHAM_ORDINARY:
9669 struct obj *m_armr = which_armor(mon, W_ARM);
9671 if (m_armr && Is_dragon_scales(m_armr))
9672 mndx = Dragon_scales_to_pm(m_armr) - mons;
9673 else if (m_armr && Is_dragon_mail(m_armr))
9674 mndx = Dragon_mail_to_pm(m_armr) - mons;
9676 break;
9678 #ifdef WIZARD
9679 /* For debugging only: allow control of polymorphed monster; not saved */
9680 if (wizard && iflags.mon_polycontrol) {
9681 char pprompt[BUFSZ], buf[BUFSZ];
9682 int tries = 0;
9683 do {
9684 sprintf(pprompt,
9685 "Change %s into what kind of monster? [type the name]",
9686 mon_nam(mon));
9687 getlin(pprompt,buf);
9688 mndx = name_to_mon(buf);
9689 if (mndx < LOW_PM)
9690 You("cannot polymorph %s into that.", mon_nam(mon));
9691 else break;
9692 } while(++tries < 5);
9693 if (tries==5) pline("%s", thats_enough_tries);
9695 #endif /*WIZARD*/
9696 if (mndx == NON_PM) {
9697 findrandomform:
9698 mndx = rn1(SPECIAL_PM - LOW_PM, LOW_PM);
9699 pm = &mons[mndx];
9701 if (rnd(pm->mlevel + 1) > (mon->m_lev + 10) ) goto findrandomform;
9702 if (rnd(pm->mlevel + 1) > (chambaselvl + rn2(11))) goto findrandomform;
9703 if (uncommon2(pm) && !rn2(4)) goto findrandomform;
9704 if (uncommon3(pm) && !rn2(3)) goto findrandomform;
9705 if (uncommon5(pm) && !rn2(2)) goto findrandomform;
9706 if (uncommon7(pm) && rn2(3)) goto findrandomform;
9707 if (uncommon10(pm) && rn2(5)) goto findrandomform;
9708 if (is_jonadabmonster(pm) && rn2(20)) goto findrandomform;
9710 return mndx;
9714 /* make a chameleon look like a new monster; returns 1 if it actually changed */
9715 /* [ALI] Special case: Don't print a message if hero can neither spot the
9716 * original _or_ the new monster (avoids "It turns into it!").
9719 newcham(mtmp, mdat, polyspot, msg)
9720 struct monst *mtmp;
9721 struct permonst *mdat;
9722 boolean polyspot; /* change is the result of wand or spell of polymorph */
9723 boolean msg;
9725 int mhp, hpn, hpd;
9726 int mndx, tryct;
9727 int couldsee = canseemon(mtmp);
9728 struct permonst *olddata = mtmp->data;
9729 char oldname[BUFSZ];
9730 boolean alt_mesg = FALSE; /* Avoid "<rank> turns into a <rank>" */
9732 if (RngePolyvision) {
9733 strcpy(oldname, noit_Monnam(mtmp));
9734 } else if (msg) {
9735 /* like Monnam() but never mention saddle */
9736 strcpy(oldname, x_monnam(mtmp, ARTICLE_THE, (char *)0,
9737 SUPPRESS_SADDLE, FALSE));
9738 oldname[0] = highc(oldname[0]);
9741 /* mdat = 0 -> caller wants a random monster shape */
9742 tryct = 0;
9743 if(mdat == 0) {
9744 while (++tryct <= 100) {
9745 mndx = select_newcham_form(mtmp);
9746 mdat = &mons[mndx];
9747 if ((mvitals[mndx].mvflags & G_GENOD) != 0 ||
9748 is_placeholder(mdat)) continue;
9749 /* polyok rules out all M2_PNAME and M2_WERE's;
9750 select_newcham_form might deliberately pick a player
9751 character type, so we can't arbitrarily rule out all
9752 human forms any more
9753 Amy edit: oh my god they disallowed M2_HUMAN this is intolerable
9754 also, unique shifters should be able to pick M2_NOPOLY forms, this is by design */
9755 if (is_mplayer(mdat) || is_umplayer(mdat) || monpolyok(mdat) || (mtmp->cham == CHAM_EDOTO && mdat->mlet == S_ARCHFIEND) || (mtmp->cham == CHAM_CHARMONIE && mndx >= PM_JUIBLEX && mndx <= PM_DEMOGORGON) || (mtmp->cham == CHAM_UNIQUE_SHIFTER && ((mdat->geno & G_FREQ) > 0) && (mdat->geno & G_UNIQ) ) )
9756 break;
9758 if (tryct > 100) return 0; /* Should never happen */
9759 } else if (mvitals[monsndx(mdat)].mvflags & G_GENOD)
9760 return(0); /* passed in mdat is genocided */
9762 if(is_male(mdat)) {
9763 if(mtmp->female) mtmp->female = FALSE;
9764 } else if (is_female(mdat)) {
9765 if(!mtmp->female) mtmp->female = TRUE;
9766 } else if (!is_neuter(mdat)) {
9767 if(!rn2(10)) mtmp->female = !mtmp->female;
9770 if (In_endgame(&u.uz) && is_mplayer(olddata)) {
9771 /* mplayers start out as "Foo the Bar", but some of the
9772 * titles are inappropriate when polymorphed, particularly
9773 * into the opposite sex. players don't use ranks when
9774 * polymorphed, so dropping the rank for mplayers seems
9775 * reasonable.
9777 char *p = index(NAME(mtmp), ' ');
9778 if (p) {
9779 *p = '\0';
9780 mtmp->mnamelth = p - NAME(mtmp) + 1;
9784 if(mdat == mtmp->data) return(0); /* still the same monster */
9786 /* [ALI] Detect transforming between player monsters with the
9787 * same rank title to avoid badly formed messages.
9788 * Similarly for were creatures transforming to their alt. form.
9790 if (msg && is_mplayer(olddata) && is_mplayer(mdat)) {
9791 const struct Role *role;
9792 int i, oldmndx;
9794 mndx = monsndx(mdat);
9795 oldmndx = monsndx(olddata);
9796 for (role = roles; role->name.m; role++) {
9797 if (role->femalenum == NON_PM)
9798 continue;
9799 if ((mndx == role->femalenum && oldmndx == role->malenum) ||
9800 (mndx == role->malenum && oldmndx == role->femalenum)) {
9801 /* Find the rank */
9802 for (i = xlev_to_rank(mtmp->m_lev); i >= 0; i--)
9803 if (role->rank[i].m) {
9804 /* Only need alternate message if no female form */
9805 alt_mesg = !role->rank[i].f;
9806 break;
9810 } else if (msg && is_were(olddata) &&
9811 monsndx(mdat) == counter_were(monsndx(olddata)))
9812 alt_mesg = TRUE;
9814 /* WAC - At this point, the transformation is going to happen */
9815 /* Reset values, remove worm tails, change levels...etc. */
9817 if(mtmp->wormno) { /* throw tail away */
9818 wormgone(mtmp);
9819 place_monster(mtmp, mtmp->mx, mtmp->my);
9822 hpn = mtmp->mhp;
9823 hpd = (int)mtmp->m_lev*8; /* The "level < 50" check was screwing up the chameleons. --Amy */
9824 if(!hpd) hpd = 4;
9826 mtmp->m_lev = adj_lev(mdat); /* new monster level */
9828 mhp = (int)mtmp->m_lev*8;
9829 if(!mhp) mhp = 4;
9831 /* new hp: same fraction of max as before */
9832 #ifndef LINT
9833 mtmp->mhp = (int)(((long)hpn*(long)mhp)/(long)hpd);
9834 #endif
9835 if(mtmp->mhp < 0) mtmp->mhp = hpn; /* overflow */
9836 /* Unlikely but not impossible; a 1HD creature with 1HP that changes into a
9837 0HD creature will require this statement */
9838 if (!mtmp->mhp) mtmp->mhp = 1;
9840 /* and the same for maximum hit points */
9841 hpn = mtmp->mhpmax;
9842 #ifndef LINT
9843 mtmp->mhpmax = (int)(((long)hpn*(long)mhp)/(long)hpd);
9844 #endif
9845 if(mtmp->mhpmax < 0) mtmp->mhpmax = hpn; /* overflow */
9846 if (!mtmp->mhpmax) mtmp->mhpmax = 1;
9848 /* take on the new form... */
9849 set_mon_data(mtmp, mdat, 0);
9851 if (emits_light(olddata) != emits_light(mtmp->data)) {
9852 /* used to give light, now doesn't, or vice versa,
9853 or light's range has changed */
9854 if (emits_light(olddata))
9855 del_light_source(LS_MONSTER, (void *)mtmp);
9856 if (emits_light(mtmp->data))
9857 new_light_source(mtmp->mx, mtmp->my, emits_light(mtmp->data),
9858 LS_MONSTER, (void *)mtmp);
9860 if (!mtmp->perminvis || pm_invisible(olddata))
9861 mtmp->perminvis = pm_invisible(mdat);
9862 mtmp->minvis = mtmp->invis_blkd ? 0 : mtmp->perminvis;
9863 if (!(hides_under(mdat) && OBJ_AT(mtmp->mx, mtmp->my)) &&
9864 !(mdat->mlet == S_EEL && (is_waterypool(mtmp->mx, mtmp->my) || is_watertunnel(mtmp->mx, mtmp->my) || is_shiftingsand(mtmp->mx, mtmp->my) ) ))
9865 mtmp->mundetected = 0;
9866 if (u.usteed) {
9867 if (touch_petrifies(u.usteed->data) && (!Stone_resistance || (!IntStone_resistance && !rn2(20)) ) && !(uarmg && !FingerlessGloves && uarmu && uarm && uarmc) && rnl(3)) {
9868 char buf[BUFSZ];
9870 pline("You touch %s.", mon_nam(u.usteed));
9871 sprintf(buf, "riding a petrifying monster");
9872 instapetrify(buf);
9874 if (!can_ride(u.usteed)) dismount_steed(DISMOUNT_POLY);
9877 #ifndef DCC30_BUG
9878 if (mdat == &mons[PM_LONG_WORM] && (mtmp->wormno = get_wormno()) != 0) {
9879 #else
9880 /* DICE 3.0 doesn't like assigning and comparing mtmp->wormno in the
9881 * same expression.
9883 if (mdat == &mons[PM_LONG_WORM] &&
9884 (mtmp->wormno = get_wormno(), mtmp->wormno != 0)) {
9885 #endif
9886 /* we can now create worms with tails - 11/91 */
9887 initworm(mtmp, rn2(5));
9888 if (count_wsegs(mtmp))
9889 place_worm_tail_randomly(mtmp, mtmp->mx, mtmp->my);
9892 newsym(mtmp->mx,mtmp->my);
9894 if (RngePolyvision) {
9895 uchar save_mnamelth = mtmp->mnamelth;
9896 mtmp->mnamelth = 0;
9897 pline("%s polymorphs into %s!", oldname, a_noit_monnam(mtmp));
9898 mtmp->mnamelth = save_mnamelth;
9900 } else if (msg && (u.uswallow && mtmp == u.ustuck || canspotmon(mtmp))) {
9901 if (alt_mesg && is_mplayer(mdat))
9902 pline("%s is suddenly very %s!", oldname,
9903 mtmp->female ? "feminine" : "masculine");
9904 else if (alt_mesg)
9905 pline("%s changes into a %s!", oldname,
9906 is_human(mdat) ? "human" : mdat->mname + 4);
9907 else {
9908 uchar save_mnamelth = mtmp->mnamelth;
9909 mtmp->mnamelth = 0;
9910 pline("%s turns into %s!", oldname,
9911 mdat == &mons[PM_GREEN_SLIME] ? "slime" :
9912 x_monnam(mtmp, ARTICLE_A, (char*)0, SUPPRESS_SADDLE, FALSE));
9913 mtmp->mnamelth = save_mnamelth;
9915 } else if (msg && couldsee)
9916 /* No message if we only sensed the monster previously */
9917 pline("%s suddenly disappears!", oldname);
9919 /* [ALI] In Slash'EM, this must come _after_ "<mon> turns into <mon>"
9920 * since it's possible to get both messages.
9922 if (u.ustuck == mtmp) {
9923 if(u.uswallow) {
9924 if(!attacktype(mdat,AT_ENGL)) {
9925 /* Does mdat care? */
9926 if (!noncorporeal(mdat) && !amorphous(mdat) &&
9927 !is_whirly(mdat) &&
9928 (mdat != &mons[PM_YELLOW_LIGHT])) {
9929 You("break out of %s%s!", mon_nam(mtmp),
9930 (is_animal(mdat)?
9931 "'s stomach" : ""));
9932 mtmp->mhp *= 4;
9933 mtmp->mhp /= 5; /* prevent easy Jubilex killing --Amy */
9934 if (mtmp->mhp < 1) mtmp->mhp = 1; /* fail safe */
9936 expels(mtmp, olddata, FALSE);
9937 } else {
9938 /* update swallow glyphs for new monster */
9939 swallowed(0);
9941 } else if (!sticks(mdat) && !sticks(youmonst.data))
9942 unstuck(mtmp);
9945 possibly_unwield(mtmp, polyspot); /* might lose use of weapon */
9946 mon_break_armor(mtmp, polyspot);
9947 if (!(mtmp->misc_worn_check & W_ARMG))
9948 mselftouch(mtmp, "No longer petrify-resistant, ",
9949 !flags.mon_moving);
9950 m_dowear(mtmp, FALSE);
9952 /* This ought to re-test can_carry() on each item in the inventory
9953 * rather than just checking ex-giants & boulders, but that'd be
9954 * pretty expensive to perform. If implemented, then perhaps
9955 * minvent should be sorted in order to drop heaviest items first.
9957 /* former giants can't continue carrying boulders */
9958 if (mtmp->minvent && !throws_rocks(mdat)) {
9959 register struct obj *otmp, *otmp2;
9961 for (otmp = mtmp->minvent; otmp; otmp = otmp2) {
9962 otmp2 = otmp->nobj;
9963 if (otmp->otyp == BOULDER) {
9964 /* this keeps otmp from being polymorphed in the
9965 same zap that the monster that held it is polymorphed */
9966 if (polyspot) bypass_obj(otmp);
9967 obj_extract_self(otmp);
9968 /* probably ought to give some "drop" message here */
9969 if (flooreffects(otmp, mtmp->mx, mtmp->my, "")) continue;
9970 place_object(otmp, mtmp->mx, mtmp->my);
9975 return(1);
9978 /* sometimes an egg will be special */
9979 #define BREEDER_EGG (!rn2(77))
9982 * Determine if the given monster number can be hatched from an egg.
9983 * Return the monster number to use as the egg's corpsenm. Return
9984 * NON_PM if the given monster can't be hatched.
9987 can_be_hatched(mnum)
9988 int mnum;
9990 /* ranger quest nemesis has the oviparous bit set, making it
9991 be possible to wish for eggs of that unique monster; turn
9992 such into ordinary eggs rather than forbidding them outright */
9993 if (mnum == PM_SCORPIUS) mnum = PM_SCORPION;
9995 mnum = little_to_big(mnum);
9997 * Queen bees lay killer bee eggs (usually), but killer bees don't
9998 * grow into queen bees. Ditto for [winged-]gargoyles.
10000 if (mnum == PM_KILLER_BEE || mnum == PM_GARGOYLE ||
10001 (lays_eggs(&mons[mnum]) && (BREEDER_EGG ||
10002 (mnum != PM_QUEEN_BEE && mnum != PM_WINGED_GARGOYLE))))
10003 return mnum;
10004 return NON_PM;
10007 /* type of egg laid by #sit; usually matches parent */
10009 egg_type_from_parent(mnum, force_ordinary)
10010 int mnum; /* parent monster; caller must handle lays_eggs() check */
10011 boolean force_ordinary;
10013 if (force_ordinary || !BREEDER_EGG) {
10014 if (mnum == PM_QUEEN_BEE) mnum = PM_KILLER_BEE;
10015 else if (mnum == PM_WINGED_GARGOYLE) mnum = PM_GARGOYLE;
10017 return mnum;
10020 /* decide whether an egg of the indicated monster type is viable; */
10021 /* also used to determine whether an egg or tin can be created... */
10022 boolean
10023 dead_species(m_idx, egg)
10024 int m_idx;
10025 boolean egg;
10028 * For monsters with both baby and adult forms, genociding either
10029 * form kills all eggs of that monster. Monsters with more than
10030 * two forms (small->large->giant mimics) are more or less ignored;
10031 * fortunately, none of them have eggs. Species extinction due to
10032 * overpopulation does not kill eggs.
10034 return (boolean)
10035 (m_idx >= LOW_PM &&
10036 ((mvitals[m_idx].mvflags & G_GENOD) != 0 ||
10037 (egg &&
10038 (mvitals[big_to_little(m_idx)].mvflags & G_GENOD) != 0)));
10041 /* kill off any eggs of genocided monsters */
10042 STATIC_OVL void
10043 kill_eggs(obj_list)
10044 struct obj *obj_list;
10046 struct obj *otmp;
10048 for (otmp = obj_list; otmp; otmp = otmp->nobj)
10049 if (otmp->otyp == EGG) {
10050 if (dead_species(otmp->corpsenm, TRUE)) {
10052 * It seems we could also just catch this when
10053 * it attempted to hatch, so we wouldn't have to
10054 * search all of the objlists.. or stop all
10055 * hatch timers based on a corpsenm.
10057 kill_egg(otmp);
10059 #if 0 /* not used */
10060 } else if (otmp->otyp == TIN) {
10061 if (dead_species(otmp->corpsenm, FALSE))
10062 otmp->corpsenm = NON_PM; /* empty tin */
10063 } else if (otmp->otyp == CORPSE) {
10064 if (dead_species(otmp->corpsenm, FALSE))
10065 ; /* not yet implemented... */
10066 #endif
10067 } else if (Has_contents(otmp)) {
10068 kill_eggs(otmp->cobj);
10072 /* kill all monsters that are flagged for death */
10073 void
10074 kill_deathmarked_monsters()
10076 struct monst *mtmp, *mtmp2;
10077 for (mtmp = fmon; mtmp; mtmp = mtmp2) {
10078 mtmp2 = mtmp->nmon;
10079 if (DEADMONSTER(mtmp)) continue;
10080 if (mtmp->flagged_for_death) {
10081 monkilled(mtmp, "", AD_PHYS);
10087 /* kill all members of genocided species */
10088 void
10089 kill_genocided_monsters()
10091 struct monst *mtmp, *mtmp2;
10092 boolean kill_cham[CHAM_MAX_INDX+1];
10093 int mndx;
10095 kill_cham[CHAM_ORDINARY] = FALSE; /* (this is mndx==0) */
10096 for (mndx = 1; mndx <= CHAM_MAX_INDX; mndx++)
10097 kill_cham[mndx] = (mvitals[cham_to_pm[mndx]].mvflags & G_GENOD) != 0;
10099 * Called during genocide, and again upon level change. The latter
10100 * catches up with any migrating monsters as they finally arrive at
10101 * their intended destinations, so possessions get deposited there.
10103 * Chameleon handling:
10104 * 1) if chameleons have been genocided, destroy them
10105 * regardless of current form;
10106 * 2) otherwise, force every chameleon which is imitating
10107 * any genocided species to take on a new form.
10109 for (mtmp = fmon; mtmp; mtmp = mtmp2) {
10110 mtmp2 = mtmp->nmon;
10111 if (DEADMONSTER(mtmp)) continue;
10112 mndx = monsndx(mtmp->data);
10113 if ((mvitals[mndx].mvflags & G_GENOD) || kill_cham[mtmp->cham]) {
10114 if (mtmp->cham && !kill_cham[mtmp->cham])
10115 /* [ALI] Chameleons are not normally subject to
10116 * system shock, but genocide is a special case.
10118 (void) mon_spec_poly(mtmp, (struct permonst *)0, 0L,
10119 FALSE, FALSE, TRUE, TRUE);
10120 else
10121 mondead(mtmp);
10123 if (mtmp->minvent) kill_eggs(mtmp->minvent);
10126 kill_eggs(invent);
10127 kill_eggs(fobj);
10128 kill_eggs(level.buriedobjlist);
10133 #endif /* OVL2 */
10134 #ifdef OVLB
10136 void
10137 golemeffects(mon, damtype, dam)
10138 register struct monst *mon;
10139 int damtype, dam;
10141 int heal=0, slow=0;
10143 if (mon->data == &mons[PM_FLESH_GOLEM]) {
10144 if (damtype == AD_ELEC) heal = dam / 6;
10145 else if (damtype == AD_FIRE || damtype == AD_COLD) slow = 1;
10146 } else if (mon->data == &mons[PM_IRON_GOLEM]) {
10147 if (damtype == AD_ELEC) slow = 1;
10148 else if (damtype == AD_FIRE) heal = dam;
10149 } else {
10150 return;
10152 if (slow) {
10153 if (mon->mspeed != MSLOW)
10154 mon_adjust_speed(mon, -1, (struct obj *)0);
10156 if (heal) {
10157 if (mon->mhp < mon->mhpmax) {
10158 mon->mhp += dam;
10159 if (mon->mhp > mon->mhpmax) mon->mhp = mon->mhpmax;
10160 if (cansee(mon->mx, mon->my))
10161 pline("%s seems healthier.", Monnam(mon));
10166 boolean
10167 angry_guards(silent)
10168 register boolean silent;
10170 register struct monst *mtmp;
10171 register int ct = 0, nct = 0, sct = 0, slct = 0;
10172 int copcnt;
10174 for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
10175 if (DEADMONSTER(mtmp)) continue;
10176 if((mtmp->data == &mons[PM_WATCHMAN] || mtmp->data == &mons[PM_WATCH_LIEUTENANT] ||
10177 mtmp->data == &mons[PM_WATCH_CAPTAIN] || mtmp->data == &mons[PM_WATCH_LEADER])
10178 && mtmp->mpeaceful) {
10179 ct++;
10180 if(cansee(mtmp->mx, mtmp->my) && mtmp->mcanmove) {
10181 if (distu(mtmp->mx, mtmp->my) == 2) nct++;
10182 else sct++;
10184 if (mtmp->msleeping || mtmp->mfrozen) {
10185 slct++;
10186 mtmp->msleeping = mtmp->mfrozen = 0;
10188 mtmp->mpeaceful = 0;
10191 if(ct) {
10192 if(!silent) { /* do we want pline msgs? */
10193 if(slct) pline_The("guard%s wake%s up!",
10194 slct > 1 ? "s" : "", slct == 1 ? "s" : "");
10195 if(nct || sct) {
10196 if(nct) pline_The("guard%s get%s angry!",
10197 nct == 1 ? "" : "s", nct == 1 ? "s" : "");
10198 else if(!Blind)
10199 You("see %sangry guard%s approaching!",
10200 sct == 1 ? "an " : "", sct > 1 ? "s" : "");
10201 } else if(flags.soundok)
10202 You_hear("the shrill sound of a guard's whistle.");
10203 if (PlayerHearsSoundEffects) pline(issoviet ? "Davayte posmotrim, sposobna li ubezhat' ot chasov v obshchey slozhnosti neudachnik! Vozmozhno net!" : "Pfiiiiiiiiiie!");
10206 u.cnd_kopsummonamount++;
10207 copcnt = rnd(monster_difficulty() ) + 1;
10208 if (rn2(5)) copcnt = (copcnt / (rnd(4) + 1)) + 1;
10209 if (Role_if(PM_CAMPERSTRIKER)) copcnt *= (rn2(5) ? 2 : rn2(5) ? 3 : 5);
10211 if (uarmh && itemhasappearance(uarmh, APP_ANTI_GOVERNMENT_HELMET) ) {
10212 copcnt = (copcnt / 2) + 1;
10215 if (RngeAntiGovernment) {
10216 copcnt = (copcnt / 2) + 1;
10219 while(--copcnt >= 0) {
10220 (void) makemon(mkclass(S_KOP,0), u.ux, u.uy, MM_ANGRY|MM_FRENZIED);
10222 if (!rn2(100)) {
10224 int koptryct = 0;
10225 int kox, koy;
10227 for (koptryct = 0; koptryct < 2000; koptryct++) {
10228 kox = rn1(COLNO-3,2);
10229 koy = rn2(ROWNO);
10231 if (kox && koy && isok(kox, koy) && (levl[kox][koy].typ > DBWALL) && !(t_at(kox, koy)) ) {
10232 (void) maketrap(kox, koy, KOP_CUBE, 0, FALSE);
10233 break;
10239 } /* while */
10241 return(TRUE);
10243 return(FALSE);
10246 void
10247 pacify_guards()
10249 register struct monst *mtmp;
10251 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
10252 if (DEADMONSTER(mtmp)) continue;
10253 if (mtmp->data == &mons[PM_WATCHMAN] || mtmp->data == &mons[PM_WATCH_LIEUTENANT] ||
10254 mtmp->data == &mons[PM_WATCH_CAPTAIN] || mtmp->data == &mons[PM_WATCH_LEADER]) {
10255 if (!mtmp->mfrenzied) mtmp->mpeaceful = 1;
10260 boolean
10261 damage_mon(mon,amount,type)
10262 struct monst* mon;
10263 int amount;
10264 int type;
10266 mon->mhp -= amount;
10267 return (mon->mhp < 1);
10270 void
10271 mimic_hit_msg(mtmp, otyp)
10272 struct monst *mtmp;
10273 short otyp;
10275 int ap = mtmp->mappearance;
10277 switch(mtmp->m_ap_type) {
10278 case M_AP_NOTHING:
10279 case M_AP_FURNITURE:
10280 case M_AP_MONSTER:
10281 break;
10282 case M_AP_OBJECT:
10283 if (otyp == SPE_HEALING || otyp == SPE_EXTRA_HEALING || otyp == SPE_FULL_HEALING) {
10284 pline("%s seems a more vivid %s than before.",
10285 The(simple_typename(ap)),
10286 c_obj_colors[objects[ap].oc_color]);
10288 break;
10292 /* symbiosis skill by Amy */
10293 void
10294 turnmonintosymbiote(mtmp, holdeneffect)
10295 struct monst *mtmp;
10296 boolean holdeneffect;
10298 /* reset any existing symbiote structure first */
10300 if (uinsymbiosis) {
10301 if (u.usymbiote.cursed) {
10302 pline(FunnyHallu ? "Apparently Morgoth himself decided to curse you with some ancient hex." : "Since your current symbiote is cursed, you cannot get a new one.");
10303 return;
10306 if (uarmf && itemhasappearance(uarmf, APP_REMORA_HEELS) && u.usymbiote.mnum == PM_REMORA) {
10307 if (uarmf->spe > -1) uarmf->spe = -1;
10310 u.cnd_symbiotesdied++;
10311 pline(FunnyHallu ? "Damn, you feel like you killed a part of yourself..." : "You discard your current symbiote to make room for the new one.");
10314 u.usymbiote.active = 0;
10315 u.usymbiote.mnum = PM_PLAYERMON;
10316 u.usymbiote.mhp = 0;
10317 u.usymbiote.mhpmax = 0;
10318 u.usymbiote.cursed = u.usymbiote.hvycurse = u.usymbiote.prmcurse = u.usymbiote.bbcurse = u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.stckcurse = 0;
10320 /* now set the new symbiote's stats */
10322 u.shutdowntime = 0;
10323 u.usymbiote.active = 1;
10324 u.usymbiote.mnum = mtmp->mnum;
10325 u.usymbiote.mhpmax = mtmp->mhpmax;
10326 if (Race_if(PM_BABYLONIAN) && mons[u.usymbiote.mnum].mlet == S_TURRET) u.usymbiote.mhpmax *= 2;
10327 if (uimplant && uimplant->oartifact == ART_RIVERS_OF_BABYLON) {
10328 u.usymbiote.mhpmax *= (powerfulimplants() ? 125 : 110);
10329 u.usymbiote.mhpmax /= 100;
10332 if ((u.usymbiote.mnum != PM_SLICK_RUEA) && (u.usymbiote.mnum != PM_SHEER_SPACER) && (u.usymbiote.mnum != PM_DOUBLE_AURORA_BOMBER) && (u.usymbiote.mnum != PM_CRITICALLY_INJURED_THIEF) && (u.usymbiote.mnum != PM_CRITICALLY_INJURED_JEDI) && u.usymbiote.mhpmax < (mons[u.usymbiote.mnum].mlevel * 8)) {
10333 u.usymbiote.mhpmax += mons[u.usymbiote.mnum].mlevel;
10334 if (u.usymbiote.mhpmax > (mons[u.usymbiote.mnum].mlevel * 8)) u.usymbiote.mhpmax = (mons[u.usymbiote.mnum].mlevel * 8);
10336 /* high skill, especially coupled with high charisma, means they don't start with anemic health --Amy */
10337 if (!PlayerCannotUseSkills) {
10339 int minimumhealth = 0;
10341 switch (P_SKILL(P_SYMBIOSIS)) {
10342 default: break;
10343 case P_BASIC: minimumhealth = 10; break;
10344 case P_SKILLED: minimumhealth = 20; break;
10345 case P_EXPERT: minimumhealth = 30; break;
10346 case P_MASTER: minimumhealth = 50; break;
10347 case P_GRAND_MASTER: minimumhealth = 70; break;
10348 case P_SUPREME_MASTER: minimumhealth = 100; break;
10351 if (ACURR(A_CHA) > 9) {
10352 minimumhealth *= (100 + ( (ACURR(A_CHA) - 9) * 3) );
10353 minimumhealth /= 100;
10356 if (u.usymbiote.mhpmax < minimumhealth) u.usymbiote.mhpmax = minimumhealth;
10362 if (u.usymbiote.mnum == PM_SLICK_RUEA || u.usymbiote.mnum == PM_SHEER_SPACER || u.usymbiote.mnum == PM_DOUBLE_AURORA_BOMBER || u.usymbiote.mnum == PM_CRITICALLY_INJURED_THIEF || u.usymbiote.mnum == PM_CRITICALLY_INJURED_JEDI) u.usymbiote.mhpmax = 1;
10364 if (u.usymbiote.mhpmax > 500) u.usymbiote.mhpmax = 500; /* cap value */
10366 /* symbiote HP start out lower (but can heal back up) if the monster wasn't wounded;
10367 * supposed to simulate catching a pokemon, but without it actually affecting catch rate */
10368 u.usymbiote.mhp = (u.usymbiote.mhpmax / 2);
10369 if (u.usymbiote.mhp < 1) u.usymbiote.mhp = 1;
10370 while ((mtmp->mhp < mtmp->mhpmax) && (mtmp->mhp > 0) && (mtmp->mhpmax > 0)) {
10371 mtmp->mhp++;
10372 u.usymbiote.mhp++;
10374 if (u.usymbiote.mhp > u.usymbiote.mhpmax) u.usymbiote.mhp = u.usymbiote.mhpmax;
10375 u.usymbiote.cursed = u.usymbiote.hvycurse = u.usymbiote.prmcurse = u.usymbiote.bbcurse = u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.stckcurse = 0; /* caller may override this */
10377 pline("%s becomes your new symbiote!", noit_Monnam(mtmp));
10378 pline("Use #monster to manage your symbiote.");
10379 if (flags.showsymbiotehp) flags.botl = TRUE;
10380 use_skill(P_SYMBIOSIS, rnd(5));
10382 if (!holdeneffect) mongone(mtmp);
10385 void
10386 getrandomsymbiote(extrahealth, canbeother)
10387 boolean extrahealth;
10388 boolean canbeother;
10390 struct permonst *pm = 0;
10391 int attempts = 0;
10393 newsymbiotetry:
10394 attempts = 0;
10395 pm = (struct permonst *)0;
10397 if (canbeother) {
10398 do {
10399 pm = rndmonst();
10400 attempts++;
10401 if (!rn2(2000)) reset_rndmonst(NON_PM);
10403 } while ( (!pm || (pm && (!cannot_be_tamed(pm) ) )) && attempts < 500000);
10405 if (!pm || (pm && (!cannot_be_tamed(pm) ) )) {
10406 pline("For some reason, symbiote creation failed.");
10407 return;
10410 } else if (!Race_if(PM_GOAULD)) {
10411 do {
10412 pm = rndmonst();
10413 attempts++;
10414 if (!rn2(2000)) reset_rndmonst(NON_PM);
10416 } while ( (!pm || (pm && (!(stationary(pm) || pm->mmove == 0 || pm->mlet == S_TURRET) || cannot_be_tamed(pm) ) )) && attempts < 500000);
10418 if (!pm || (pm && (!(stationary(pm) || pm->mmove == 0 || pm->mlet == S_TURRET) || cannot_be_tamed(pm) ) )) {
10419 pline("For some reason, symbiote creation failed.");
10420 return;
10422 } else { /* player is goauld */
10423 do {
10424 pm = rndmonst();
10425 attempts++;
10426 if (!rn2(2000)) reset_rndmonst(NON_PM);
10428 } while ( (!pm || (pm && ((stationary(pm) || pm->mmove == 0 || pm->mlet == S_TURRET) || cannot_be_tamed(pm) ) )) && attempts < 500000);
10430 if (!pm || (pm && ((stationary(pm) || pm->mmove == 0 || pm->mlet == S_TURRET) || cannot_be_tamed(pm) ) )) {
10431 pline("For some reason, symbiote creation failed.");
10432 return;
10436 /* it would be truly mean to give you some ultra-heavy cursed symbiote that makes you instantly overloaded --Amy */
10437 if (symbioteweight(monsndx(pm)) >= (weight_cap() * 2) ) {
10438 goto newsymbiotetry;
10441 /* reset any existing symbiote structure first */
10443 if (uinsymbiosis) {
10444 if (u.usymbiote.cursed) {
10445 pline("An attempt to replace your symbiote was done, but failed. Maybe your current symbiote is cursed?");
10446 return;
10449 if (uarmf && itemhasappearance(uarmf, APP_REMORA_HEELS) && u.usymbiote.mnum == PM_REMORA) {
10450 if (uarmf->spe > -1) uarmf->spe = -1;
10453 u.cnd_symbiotesdied++;
10454 pline(FunnyHallu ? "Did you just quaff FEV-spiked water?" : "Your current symbiote vanishes.");
10457 u.usymbiote.active = 0;
10458 u.usymbiote.mnum = PM_PLAYERMON;
10459 u.usymbiote.mhp = 0;
10460 u.usymbiote.mhpmax = 0;
10461 u.usymbiote.cursed = u.usymbiote.hvycurse = u.usymbiote.prmcurse = u.usymbiote.bbcurse = u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.stckcurse = 0;
10463 /* now set the new symbiote's stats */
10465 u.shutdowntime = 0;
10466 u.usymbiote.active = 1;
10467 u.usymbiote.mnum = monsndx(pm); /* permonst to number conversion */
10468 u.usymbiote.mhpmax = (pm->mlevel * 8);
10469 if (u.usymbiote.mhpmax < 4) u.usymbiote.mhpmax = 4;
10470 if (extrahealth) {
10471 u.usymbiote.mhpmax *= 3;
10472 u.usymbiote.mhpmax /= 2;
10475 if (uimplant && uimplant->oartifact == ART_RIVERS_OF_BABYLON) {
10476 u.usymbiote.mhpmax *= (powerfulimplants() ? 125 : 110);
10477 u.usymbiote.mhpmax /= 100;
10480 /* high skill, especially coupled with high charisma, means they don't start with anemic health --Amy */
10481 if (!PlayerCannotUseSkills) {
10483 int minimumhealth = 0;
10485 switch (P_SKILL(P_SYMBIOSIS)) {
10486 default: break;
10487 case P_BASIC: minimumhealth = 10; break;
10488 case P_SKILLED: minimumhealth = 20; break;
10489 case P_EXPERT: minimumhealth = 30; break;
10490 case P_MASTER: minimumhealth = 50; break;
10491 case P_GRAND_MASTER: minimumhealth = 70; break;
10492 case P_SUPREME_MASTER: minimumhealth = 100; break;
10495 if (ACURR(A_CHA) > 9) {
10496 minimumhealth *= (100 + ( (ACURR(A_CHA) - 9) * 3) );
10497 minimumhealth /= 100;
10500 if (u.usymbiote.mhpmax < minimumhealth) u.usymbiote.mhpmax = minimumhealth;
10504 if (u.usymbiote.mnum == PM_SLICK_RUEA || u.usymbiote.mnum == PM_SHEER_SPACER || u.usymbiote.mnum == PM_DOUBLE_AURORA_BOMBER || u.usymbiote.mnum == PM_CRITICALLY_INJURED_THIEF || u.usymbiote.mnum == PM_CRITICALLY_INJURED_JEDI) u.usymbiote.mhpmax = 1;
10506 if (u.usymbiote.mhpmax > 500) u.usymbiote.mhpmax = 500; /* cap value */
10508 /* symbiote HP start out at half of the maximum if you get a random one */
10509 u.usymbiote.mhp = (u.usymbiote.mhpmax / 2);
10510 if (u.usymbiote.mhp < 1) u.usymbiote.mhp = 1;
10511 if (u.usymbiote.mhp > u.usymbiote.mhpmax) u.usymbiote.mhp = u.usymbiote.mhpmax;
10512 u.usymbiote.cursed = u.usymbiote.hvycurse = u.usymbiote.prmcurse = u.usymbiote.bbcurse = u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.stckcurse = 0;
10514 /* now have a chance for it to be cursed */
10515 if (!rn2(isfriday ? 3 : 6)) cursesymbiote();
10516 if (Role_if(PM_CAMPERSTRIKER) && !rn2(isfriday ? 3 : 6)) cursesymbiote();
10517 if (iscurser && rn2(5)) cursesymbiote();
10518 if (u.genericcursechance && (u.genericcursechance >= rnd(100)) ) cursesymbiote();
10519 if (uinsymbiosis && u.usymbiote.cursed) {
10520 if (u.stickycursechance && (u.stickycursechance >= rnd(100)) ) u.usymbiote.stckcurse = 1;
10521 if (u.heavycursechance && (u.heavycursechance >= rnd(100)) ) u.usymbiote.hvycurse = 1;
10522 if (u.usymbiote.hvycurse && u.primecursechance && (u.primecursechance >= rnd(100)) ) u.usymbiote.prmcurse = 1;
10525 if (touch_petrifies(pm) && (!Stone_resistance || (!IntStone_resistance && !rn2(20))) ) {
10526 if (poly_when_stoned(youmonst.data) && polymon(PM_STONE_GOLEM))
10527 display_nhwindow(WIN_MESSAGE, FALSE);
10528 else {
10529 static char kbuf[BUFSZ];
10530 pline("Unfortunately the symbiote you got is of a petrifying kind.");
10531 sprintf(kbuf, "symbiosis accident");
10532 instapetrify(kbuf);
10536 if (slime_on_touch(pm) && !Slimed && !flaming(youmonst.data) && !Unchanging && !slime_on_touch(youmonst.data)) {
10537 You("don't feel very well.");
10538 make_slimed(100);
10539 killer_format = KILLED_BY_AN;
10540 delayed_killer = "slimed by a symbiosis accident";
10543 pline("%s becomes your new symbiote!", mons[u.usymbiote.mnum].mname);
10544 pline("Use #monster to manage your symbiote.");
10545 if (flags.showsymbiotehp) flags.botl = TRUE;
10546 use_skill(P_SYMBIOSIS, rnd(5));
10550 void
10551 killsymbiote()
10553 if (uarmf && itemhasappearance(uarmf, APP_REMORA_HEELS) && u.usymbiote.mnum == PM_REMORA) {
10554 if (uarmf->spe > -1) uarmf->spe = -1;
10557 if (uamul && uamul->otyp == AMULET_OF_SYMBIOTE_SAVING) {
10558 makeknown(AMULET_OF_SYMBIOTE_SAVING);
10559 useup(uamul);
10560 u.usymbiote.mhp = u.usymbiote.mhpmax;
10561 Your("symbiote glows, and your amulet crumbles to dust!");
10562 } else {
10563 u.usymbiote.active = 0;
10564 u.usymbiote.mnum = PM_PLAYERMON;
10565 u.usymbiote.mhp = 0;
10566 u.usymbiote.mhpmax = 0;
10567 u.usymbiote.cursed = u.usymbiote.hvycurse = u.usymbiote.prmcurse = u.usymbiote.bbcurse = u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.stckcurse = 0;
10568 if (flags.showsymbiotehp) flags.botl = TRUE;
10569 u.cnd_symbiotesdied++;
10573 void
10574 uncursesymbiote(guaranteed)
10575 boolean guaranteed;
10577 if (!uinsymbiosis) return;
10579 if (guaranteed) {
10580 u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.bbcurse = u.usymbiote.prmcurse = u.usymbiote.hvycurse = u.usymbiote.cursed = u.usymbiote.stckcurse = 0;
10581 if (flags.showsymbiotehp) flags.botl = TRUE;
10582 return;
10585 if ((u.usymbiote.morgcurse || u.usymbiote.evilcurse || u.usymbiote.bbcurse) && !rn2(100) ) {
10586 u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.bbcurse = u.usymbiote.prmcurse = u.usymbiote.hvycurse = u.usymbiote.cursed = u.usymbiote.stckcurse = 0;
10588 else if (u.usymbiote.prmcurse && !(u.usymbiote.morgcurse || u.usymbiote.evilcurse || u.usymbiote.bbcurse) && !rn2(10) ) {
10589 u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.bbcurse = u.usymbiote.prmcurse = u.usymbiote.hvycurse = u.usymbiote.cursed = u.usymbiote.stckcurse = 0;
10591 else if (!(u.usymbiote.prmcurse) && !(u.usymbiote.morgcurse || u.usymbiote.evilcurse || u.usymbiote.bbcurse) && u.usymbiote.hvycurse && !rn2(3) ) {
10592 u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.bbcurse = u.usymbiote.prmcurse = u.usymbiote.hvycurse = u.usymbiote.cursed = u.usymbiote.stckcurse = 0;
10594 else if (!(u.usymbiote.prmcurse) && !u.usymbiote.hvycurse && !(u.usymbiote.morgcurse || u.usymbiote.evilcurse || u.usymbiote.bbcurse) ) u.usymbiote.morgcurse = u.usymbiote.evilcurse = u.usymbiote.bbcurse = u.usymbiote.prmcurse = u.usymbiote.hvycurse = u.usymbiote.cursed = u.usymbiote.stckcurse = 0;
10596 if (flags.showsymbiotehp) flags.botl = TRUE;
10600 void
10601 cursesymbiote()
10603 if (!uinsymbiosis) return;
10604 if (!rn2(isfriday ? 50 : 100)) u.usymbiote.stckcurse = 1;
10606 if (u.stickycursechance && (u.stickycursechance >= rnd(100)) ) u.usymbiote.stckcurse = 1;
10607 if (Role_if(PM_CELLAR_CHILD) && !rn2(10)) u.usymbiote.stckcurse = 1;
10609 if (u.usymbiote.cursed) {
10610 if (!u.usymbiote.hvycurse && !rn2(5)) u.usymbiote.hvycurse = 1;
10611 else if (u.usymbiote.hvycurse && !u.usymbiote.prmcurse && !rn2(25)) u.usymbiote.prmcurse = 1;
10612 else if (u.usymbiote.prmcurse && !rn2(250)) {
10613 if (!rn2(3)) u.usymbiote.morgcurse = 1;
10614 else if (!rn2(2)) u.usymbiote.evilcurse = 1;
10615 else u.usymbiote.bbcurse = 1;
10617 } else {
10618 u.usymbiote.cursed = 1;
10619 if (!u.usymbiote.hvycurse && !u.usymbiote.prmcurse && !(u.usymbiote.morgcurse || u.usymbiote.evilcurse || u.usymbiote.bbcurse) && !rn2(isfriday ? 20 : 35)) u.usymbiote.hvycurse = 1;
10620 if (u.usymbiote.hvycurse && !u.usymbiote.prmcurse && !(u.usymbiote.morgcurse || u.usymbiote.evilcurse || u.usymbiote.bbcurse) && !rn2(isfriday ? 100 : 225)) u.usymbiote.prmcurse = 1;
10621 if (u.usymbiote.prmcurse && !rn2(isfriday ? 1000 : 6255)) {
10622 if (!rn2(3)) u.usymbiote.morgcurse = 1;
10623 else if (!rn2(2)) u.usymbiote.evilcurse = 1;
10624 else u.usymbiote.bbcurse = 1;
10628 if (flags.showsymbiotehp) flags.botl = TRUE;
10632 /* will you get to use the melee attack of your symbiote? --Amy */
10633 boolean
10634 symbiotemelee()
10636 if (!uactivesymbiosis) return FALSE;
10638 if (u.usymbiote.mhpmax >= 5 && u.usymbiote.mhp <= (u.usymbiote.mhpmax / 5) && rn2(5)) return FALSE;
10640 int symchance = 0;
10642 if (Role_if(PM_SYMBIANT)) {
10643 if (!PlayerCannotUseSkills) {
10644 switch (P_SKILL(P_SYMBIOSIS)) {
10645 default: symchance = 12; break;
10646 case P_BASIC: symchance = 14; break;
10647 case P_SKILLED: symchance = 16; break;
10648 case P_EXPERT: symchance = 18; break;
10649 case P_MASTER: symchance = 20; break;
10650 case P_GRAND_MASTER: symchance = 22; break;
10651 case P_SUPREME_MASTER: symchance = 24; break;
10653 } else {
10654 symchance = 20;
10657 } else {
10659 if (!PlayerCannotUseSkills) {
10660 switch (P_SKILL(P_SYMBIOSIS)) {
10661 default: symchance = 10; break;
10662 case P_BASIC: symchance = 11; break;
10663 case P_SKILLED: symchance = 12; break;
10664 case P_EXPERT: symchance = 13; break;
10665 case P_MASTER: symchance = 14; break;
10666 case P_GRAND_MASTER: symchance = 15; break;
10667 case P_SUPREME_MASTER: symchance = 16; break;
10669 } else {
10670 symchance = 10;
10674 switch (u.symbioteaggressivity) {
10675 case 5:
10676 if (rn2(10)) return 0; break;
10677 case 10:
10678 if (rn2(5)) return 0; break;
10679 case 12:
10680 if (rn2(3)) return 0; break;
10681 case 15:
10682 if (!rn2(2)) return 0; break;
10683 case 20:
10684 if (!rn2(4)) return 0; break;
10685 default:
10686 case 25:
10687 break;
10688 case 33:
10689 symchance += 3; break;
10690 case 40:
10691 symchance += 6; break;
10692 case 50:
10693 symchance += 9; break;
10694 case 60:
10695 symchance += 12; break;
10696 case 75:
10697 symchance += 15; break;
10700 if (have_luckypack()) symchance += 5;
10702 symchance += boost_power_value();
10704 if (symchance > 50) symchance = 50; /* fail safe */
10706 if (rn2(100) < symchance) return TRUE;
10707 return FALSE;
10710 /* will your symbiote retaliate against something that tried to melee you? --Amy */
10711 boolean
10712 symbiotepassive()
10714 if (!uactivesymbiosis) return FALSE;
10716 if (u.usymbiote.mhpmax >= 5 && u.usymbiote.mhp <= (u.usymbiote.mhpmax / 5) && rn2(5)) return FALSE;
10718 int symchance = 0;
10720 if (Role_if(PM_SYMBIANT)) {
10721 if (!PlayerCannotUseSkills) {
10722 switch (P_SKILL(P_SYMBIOSIS)) {
10723 default: symchance = 25; break;
10724 case P_BASIC: symchance = 27; break;
10725 case P_SKILLED: symchance = 29; break;
10726 case P_EXPERT: symchance = 31; break;
10727 case P_MASTER: symchance = 33; break;
10728 case P_GRAND_MASTER: symchance = 35; break;
10729 case P_SUPREME_MASTER: symchance = 37; break;
10731 } else {
10732 symchance = 30;
10735 } else {
10737 if (!PlayerCannotUseSkills) {
10738 switch (P_SKILL(P_SYMBIOSIS)) {
10739 default: symchance = 20; break;
10740 case P_BASIC: symchance = 21; break;
10741 case P_SKILLED: symchance = 23; break;
10742 case P_EXPERT: symchance = 24; break;
10743 case P_MASTER: symchance = 26; break;
10744 case P_GRAND_MASTER: symchance = 27; break;
10745 case P_SUPREME_MASTER: symchance = 29; break;
10747 } else {
10748 symchance = 20;
10752 switch (u.symbioteaggressivity) {
10753 case 5:
10754 if (rn2(10)) return 0; break;
10755 case 10:
10756 if (rn2(5)) return 0; break;
10757 case 12:
10758 if (rn2(3)) return 0; break;
10759 case 15:
10760 if (!rn2(2)) return 0; break;
10761 case 20:
10762 if (!rn2(4)) return 0; break;
10763 default:
10764 case 25:
10765 break;
10766 case 33:
10767 symchance += 3; break;
10768 case 40:
10769 symchance += 6; break;
10770 case 50:
10771 symchance += 9; break;
10772 case 60:
10773 symchance += 12; break;
10774 case 75:
10775 symchance += 15; break;
10778 if (have_luckypack()) symchance += 5;
10780 symchance += boost_power_value();
10782 if (symchance > 75) symchance = 75; /* fail safe */
10784 if (rn2(100) < symchance) return TRUE;
10785 return FALSE;
10788 /* symbiote has killed something, and may now gain health --Amy */
10789 void
10790 symbiotemaygainhealth()
10792 if (!uinsymbiosis) return;
10793 if (u.usymbiote.mnum == PM_CRITICALLY_INJURED_THIEF) return;
10794 if (u.usymbiote.mnum == PM_CRITICALLY_INJURED_JEDI) return;
10795 if (u.usymbiote.mnum == PM_SLICK_RUEA) return;
10796 if (u.usymbiote.mnum == PM_SHEER_SPACER) return;
10797 if (u.usymbiote.mnum == PM_DOUBLE_AURORA_BOMBER) return;
10799 int symbiohealthgainchance = 1;
10801 if (u.usymbiote.mhpmax >= 20) symbiohealthgainchance = 3;
10802 if (u.usymbiote.mhpmax >= 30) symbiohealthgainchance = 5;
10803 if (u.usymbiote.mhpmax >= 40) symbiohealthgainchance = 7;
10804 if (u.usymbiote.mhpmax >= 50) symbiohealthgainchance = (u.usymbiote.mhpmax / 5);
10806 if (!rn2(symbiohealthgainchance)) {
10807 if (Role_if(PM_SYMBIANT) || Race_if(PM_GOAULD)) u.usymbiote.mhpmax += rnd(5);
10808 else u.usymbiote.mhpmax++;
10809 maybe_evolve_symbiote();
10811 if (u.usymbiote.mhpmax > 500) u.usymbiote.mhpmax = 500;
10812 u.usymbiote.mhp++;
10813 if (u.usymbiote.mhp > u.usymbiote.mhpmax) u.usymbiote.mhp = u.usymbiote.mhpmax;
10815 if (flags.showsymbiotehp) flags.botl = TRUE;
10819 /* symbiote has gained experience; check whether it evolves --Amy */
10820 void
10821 maybe_evolve_symbiote()
10823 int oldtype, newtype;
10824 if (!uinsymbiosis) return;
10826 oldtype = u.usymbiote.mnum;
10827 newtype = little_to_big(oldtype);
10829 if (oldtype != newtype) {
10830 if (u.usymbiote.mhpmax >= (mons[newtype].mlevel * 10)) {
10831 pline("What? Your %s symbiote is evolving!", mons[u.usymbiote.mnum].mname );
10832 pline("%s evolved into %s!", mons[u.usymbiote.mnum].mname, mons[newtype].mname );
10833 u.usymbiote.mnum = newtype;
10838 #endif /* OVLB */
10840 /*mon.c*/