Fandom

Wikihack

Source:SLASH'EM 0.0.7E7F2/muse.c

2,034pages on
this wiki
Add New Page
Talk0

Ad blocker interference detected!


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

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

Below is the full text to muse.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/muse.c#line123]], for example.

The latest source code for vanilla NetHack is at Source code.


The NetHack General Public License applies to screenshots, source code and other content from NetHack.
1.    /*	SCCS Id: @(#)muse.c	3.4	2002/12/23	*/
2.    /*	Copyright (C) 1990 by Ken Arromdee			   */
3.    /* NetHack may be freely redistributed.  See license for details.  */
4.    
5.    /*
6.     * Monster item usage routines.
7.     */
8.    
9.    #include "hack.h"
10.   #include "edog.h"
11.   
12.   extern const int monstr[];
13.   
14.   boolean m_using = FALSE;
15.   
16.   /* Let monsters use magic items.  Arbitrary assumptions: Monsters only use
17.    * scrolls when they can see, monsters know when wands have 0 charges, monsters
18.    * cannot recognize if items are cursed are not, monsters which are confused
19.    * don't know not to read scrolls, etc....
20.    */
21.   
22.   #if 0
23.   STATIC_DCL struct permonst *FDECL(muse_newcham_mon, (struct monst *));
24.   #endif
25.   STATIC_DCL int FDECL(precheck, (struct monst *,struct obj *));
26.   STATIC_DCL void FDECL(mzapmsg, (struct monst *,struct obj *,BOOLEAN_P));
27.   STATIC_DCL void FDECL(mreadmsg, (struct monst *,struct obj *));
28.   STATIC_DCL void FDECL(mquaffmsg, (struct monst *,struct obj *));
29.   STATIC_PTR int FDECL(mbhitm, (struct monst *,struct obj *));
30.   STATIC_DCL void FDECL(mbhit,
31.   	(struct monst *,int,int FDECL((*),(MONST_P,OBJ_P)),
32.   	int FDECL((*),(OBJ_P,OBJ_P)),struct obj *));
33.   STATIC_DCL void FDECL(you_aggravate, (struct monst *));
34.   STATIC_DCL void FDECL(mon_consume_unstone, (struct monst *,struct obj *,
35.   	BOOLEAN_P,BOOLEAN_P));
36.   
37.   static struct musable {
38.   	struct obj *offensive;
39.   	struct obj *defensive;
40.   	struct obj *misc;
41.   	int has_offense, has_defense, has_misc;
42.   	/* =0, no capability; otherwise, different numbers.
43.   	 * If it's an object, the object is also set (it's 0 otherwise).
44.   	 */
45.   } m;
46.   static int trapx, trapy;
47.   static boolean zap_oseen;
48.   	/* for wands which use mbhitm and are zapped at players.  We usually
49.   	 * want an oseen local to the function, but this is impossible since the
50.   	 * function mbhitm has to be compatible with the normal zap routines,
51.   	 * and those routines don't remember who zapped the wand.
52.   	 */
53.   
54.   /* Any preliminary checks which may result in the monster being unable to use
55.    * the item.  Returns 0 if nothing happened, 2 if the monster can't do anything
56.    * (i.e. it teleported) and 1 if it's dead.
57.    */
58.   STATIC_OVL int
59.   precheck(mon, obj)
60.   struct monst *mon;
61.   struct obj *obj;
62.   {
63.   	boolean vis;
64.   
65.   	if (!obj) return 0;
66.   	vis = cansee(mon->mx, mon->my);
67.   
68.   	if (obj->oclass == POTION_CLASS) {
69.   	    coord cc;
70.   	    static const char *empty = "The potion turns out to be empty.";
71.   	    const char *potion_descr;
72.   	    struct monst *mtmp;
73.   #define POTION_OCCUPANT_CHANCE(n) (13 + 2*(n))	/* also in potion.c */
74.   
75.   	    potion_descr = OBJ_DESCR(objects[obj->otyp]);
76.   	    if (potion_descr && !strcmp(potion_descr, "milky")) {
77.   	        if ( flags.ghost_count < MAXMONNO &&
78.   		    !rn2(POTION_OCCUPANT_CHANCE(flags.ghost_count))) {
79.   		    if (!enexto(&cc, mon->mx, mon->my, &mons[PM_GHOST])) return 0;
80.   		    mquaffmsg(mon, obj);
81.   		    m_useup(mon, obj);
82.   		    mtmp = makemon(&mons[PM_GHOST], cc.x, cc.y, NO_MM_FLAGS);
83.   		    if (!mtmp) {
84.   			if (vis) pline(empty);
85.   		    } else {
86.   			if (vis) {
87.   			    pline("As %s opens the bottle, an enormous %s emerges!",
88.   			       mon_nam(mon),
89.   			       Hallucination ? rndmonnam() : (const char *)"ghost");
90.   			    pline("%s is frightened to death, and unable to move.",
91.   				    Monnam(mon));
92.   			}
93.   			mon->mcanmove = 0;
94.   			mon->mfrozen = 3;
95.   		    }
96.   		    return 2;
97.   		}
98.   	    }
99.   	    if (potion_descr && !strcmp(potion_descr, "smoky") &&
100.  		    flags.djinni_count < MAXMONNO &&
101.  		    !rn2(POTION_OCCUPANT_CHANCE(flags.djinni_count))) {
102.  		if (!enexto(&cc, mon->mx, mon->my, &mons[PM_DJINNI])) return 0;
103.  		mquaffmsg(mon, obj);
104.  		m_useup(mon, obj);
105.  		mtmp = makemon(&mons[PM_DJINNI], cc.x, cc.y, NO_MM_FLAGS);
106.  		if (!mtmp) {
107.  		    if (vis) pline(empty);
108.  		} else {
109.  		    if (vis)
110.  			pline("In a cloud of smoke, %s emerges!",
111.  							a_monnam(mtmp));
112.  		    pline("%s speaks.", vis ? Monnam(mtmp) : Something);
113.  		/* I suspect few players will be upset that monsters */
114.  		/* can't wish for wands of death here.... */
115.  		    if (rn2(2)) {
116.  			verbalize("You freed me!");
117.  			mtmp->mpeaceful = 1;
118.  			set_malign(mtmp);
119.  		    } else {
120.  			verbalize("It is about time.");
121.  			if (vis) pline("%s vanishes.", Monnam(mtmp));
122.  			mongone(mtmp);
123.  		    }
124.  		}
125.  		return 2;
126.  	    }
127.  	}
128.  	if (obj->oclass == WAND_CLASS && obj->cursed && !rn2(100)) {
129.  	    int dam = d(obj->spe+2, 6);
130.  
131.  	    if (flags.soundok) {
132.  		if (vis) pline("%s zaps %s, which suddenly explodes!",
133.  			Monnam(mon), an(xname(obj)));
134.  		else You_hear("a zap and an explosion in the distance.");
135.  	    }
136.  	    m_useup(mon, obj);
137.  	    if (mon->mhp <= dam) {
138.  		monkilled(mon, "", AD_RBRE);
139.  		return 1;
140.  	    }
141.  	    else mon->mhp -= dam;
142.  	    m.has_defense = m.has_offense = m.has_misc = 0;
143.  	    /* Only one needed to be set to 0 but the others are harmless */
144.  	}
145.  	return 0;
146.  }
147.  
148.  STATIC_OVL void
149.  mzapmsg(mtmp, otmp, self)
150.  struct monst *mtmp;
151.  struct obj *otmp;
152.  boolean self;
153.  {
154.  	if (!canseemon(mtmp)) {
155.  		if (flags.soundok)
156.  			You_hear("a %s zap.",
157.  					(distu(mtmp->mx,mtmp->my) <= (BOLT_LIM+1)*(BOLT_LIM+1)) ?
158.  					"nearby" : "distant");
159.  	} else if (self)
160.  		pline("%s zaps %sself with %s!",
161.  		      Monnam(mtmp), mhim(mtmp), doname(otmp));
162.  	else {
163.  		pline("%s zaps %s!", Monnam(mtmp), an(xname(otmp)));
164.  		stop_occupation();
165.  	}
166.  }
167.  
168.  STATIC_OVL void
169.  mreadmsg(mtmp, otmp)
170.  struct monst *mtmp;
171.  struct obj *otmp;
172.  {
173.  	boolean vismon = canseemon(mtmp);
174.  	char onambuf[BUFSZ];
175.  	short saverole;
176.  	unsigned savebknown;
177.  
178.  	if (!vismon && !flags.soundok)
179.  	    return;		/* no feedback */
180.  
181.  	otmp->dknown = 1;  /* seeing or hearing it read reveals its label */
182.  	/* shouldn't be able to hear curse/bless status of unseen scrolls;
183.  	   for priest characters, bknown will always be set during naming */
184.  	savebknown = otmp->bknown;
185.  	saverole = Role_switch;
186.  	if (!vismon) {
187.  	    otmp->bknown = 0;
188.  	    if (Role_if(PM_PRIEST)) Role_switch = 0;
189.  	}
190.  	Strcpy(onambuf, singular(otmp, doname));
191.  	Role_switch = saverole;
192.  	otmp->bknown = savebknown;
193.  
194.  	if (vismon)
195.  	    pline("%s reads %s!", Monnam(mtmp), onambuf);
196.  	else
197.  	    You_hear("%s reading %s.",
198.  		x_monnam(mtmp, ARTICLE_A, (char *)0,
199.  		    (SUPPRESS_IT|SUPPRESS_INVISIBLE|SUPPRESS_SADDLE), FALSE),
200.  		onambuf);
201.  
202.  	if (mtmp->mconf)
203.  	    pline("Being confused, %s mispronounces the magic words...",
204.  		  vismon ? mon_nam(mtmp) : mhe(mtmp));
205.  }
206.  
207.  STATIC_OVL void
208.  mquaffmsg(mtmp, otmp)
209.  struct monst *mtmp;
210.  struct obj *otmp;
211.  {
212.  	if (canseemon(mtmp)) {
213.  		otmp->dknown = 1;
214.  		pline("%s drinks %s!", Monnam(mtmp), singular(otmp, doname));
215.  	} else
216.  		if (flags.soundok)
217.  			You_hear("a chugging sound.");
218.  }
219.  
220.  /* Defines for various types of stuff.  The order in which monsters prefer
221.   * to use them is determined by the order of the code logic, not the
222.   * numerical order in which they are defined.
223.   */
224.  #define MUSE_SCR_TELEPORTATION 1
225.  #define MUSE_WAN_TELEPORTATION_SELF 2
226.  #define MUSE_POT_HEALING 3
227.  #define MUSE_POT_EXTRA_HEALING 4
228.  #define MUSE_WAN_DIGGING 5
229.  #define MUSE_TRAPDOOR 6
230.  #define MUSE_TELEPORT_TRAP 7
231.  #define MUSE_UPSTAIRS 8
232.  #define MUSE_DOWNSTAIRS 9
233.  #define MUSE_WAN_CREATE_MONSTER 10
234.  #define MUSE_SCR_CREATE_MONSTER 11
235.  #define MUSE_UP_LADDER 12
236.  #define MUSE_DN_LADDER 13
237.  #define MUSE_SSTAIRS 14
238.  #define MUSE_WAN_TELEPORTATION 15
239.  #define MUSE_BUGLE 16
240.  #define MUSE_UNICORN_HORN 17
241.  #define MUSE_POT_FULL_HEALING 18
242.  #define MUSE_LIZARD_CORPSE 19
243.  /* [Tom] my new items... */
244.  #define MUSE_WAN_HEALING 20
245.  #define MUSE_WAN_EXTRA_HEALING 21
246.  #define MUSE_WAN_CREATE_HORDE 22
247.  #define MUSE_POT_VAMPIRE_BLOOD 23
248.  /*
249.  #define MUSE_INNATE_TPT 9999
250.   * We cannot use this.  Since monsters get unlimited teleportation, if they
251.   * were allowed to teleport at will you could never catch them.  Instead,
252.   * assume they only teleport at random times, despite the inconsistency that if
253.   * you polymorph into one you teleport at will.
254.   */
255.  
256.  /* Select a defensive item/action for a monster.  Returns TRUE iff one is
257.   * found.
258.   */
259.  boolean
260.  find_defensive(mtmp)
261.  struct monst *mtmp;
262.  {
263.  	register struct obj *obj = 0;
264.  	struct trap *t;
265.  	int x=mtmp->mx, y=mtmp->my;
266.  	boolean stuck = (mtmp == u.ustuck);
267.  	boolean immobile = (mtmp->data->mmove == 0);
268.  	int fraction;
269.  
270.  	if (is_animal(mtmp->data) || mindless(mtmp->data))
271.  		return FALSE;
272.  	if(dist2(x, y, mtmp->mux, mtmp->muy) > 25)
273.  		return FALSE;
274.  	if (u.uswallow && stuck) return FALSE;
275.  
276.  	m.defensive = (struct obj *)0;
277.  	m.has_defense = 0;
278.  
279.  	/* since unicorn horns don't get used up, the monster would look
280.  	 * silly trying to use the same cursed horn round after round
281.  	 */
282.  	if (mtmp->mconf || mtmp->mstun || !mtmp->mcansee) {
283.  	    if (!is_unicorn(mtmp->data) && !nohands(mtmp->data)) {
284.  		for(obj = mtmp->minvent; obj; obj = obj->nobj)
285.  		    if (obj->otyp == UNICORN_HORN && !obj->cursed)
286.  			break;
287.  	    }
288.  	    if (obj || is_unicorn(mtmp->data)) {
289.  		m.defensive = obj;
290.  		m.has_defense = MUSE_UNICORN_HORN;
291.  		return TRUE;
292.  	    }
293.  	}
294.  
295.  	if (mtmp->mconf) {
296.  	    for(obj = mtmp->minvent; obj; obj = obj->nobj) {
297.  		if (obj->otyp == CORPSE && obj->corpsenm == PM_LIZARD) {
298.  		    m.defensive = obj;
299.  		    m.has_defense = MUSE_LIZARD_CORPSE;
300.  		    return TRUE;
301.  		}
302.  	    }
303.  	}
304.  
305.  	/* It so happens there are two unrelated cases when we might want to
306.  	 * check specifically for healing alone.  The first is when the monster
307.  	 * is blind (healing cures blindness).  The second is when the monster
308.  	 * is peaceful; then we don't want to flee the player, and by
309.  	 * coincidence healing is all there is that doesn't involve fleeing.
310.  	 * These would be hard to combine because of the control flow.
311.  	 * Pestilence won't use healing even when blind.
312.  	 */
313.  	if (!mtmp->mcansee && !nohands(mtmp->data) &&
314.  		mtmp->data != &mons[PM_PESTILENCE]) {
315.  	    if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) != 0) {
316.  		m.defensive = obj;
317.  		m.has_defense = MUSE_POT_FULL_HEALING;
318.  		return TRUE;
319.  	    }
320.  	    if ((obj = m_carrying(mtmp, POT_EXTRA_HEALING)) != 0) {
321.  		m.defensive = obj;
322.  		m.has_defense = MUSE_POT_EXTRA_HEALING;
323.  		return TRUE;
324.  	    }
325.  	    if ((obj = m_carrying(mtmp, POT_HEALING)) != 0) {
326.  		m.defensive = obj;
327.  		m.has_defense = MUSE_POT_HEALING;
328.  		return TRUE;
329.  	    }
330.  	    if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) !=0) {
331.  		m.defensive = obj;
332.  		m.has_defense = MUSE_POT_FULL_HEALING;
333.  		return TRUE;
334.  	    }
335.  	}
336.  
337.  	fraction = u.ulevel < 10 ? 5 : u.ulevel < 14 ? 4 : 3;
338.  	if(mtmp->mhp >= mtmp->mhpmax ||
339.  			(mtmp->mhp >= 10 && mtmp->mhp*fraction >= mtmp->mhpmax))
340.  		return FALSE;
341.  
342.  	if (mtmp->mpeaceful) {
343.  	    if (!nohands(mtmp->data)) {
344.  		if ((obj = m_carrying(mtmp, POT_FULL_HEALING)) != 0) {
345.  		    m.defensive = obj;
346.  		    m.has_defense = MUSE_POT_FULL_HEALING;
347.  		    return TRUE;
348.  		}
349.  		if ((obj = m_carrying(mtmp, POT_EXTRA_HEALING)) != 0) {
350.  		    m.defensive = obj;
351.  		    m.has_defense = MUSE_POT_EXTRA_HEALING;
352.  		    return TRUE;
353.  		}
354.  		if ((obj = m_carrying(mtmp, POT_HEALING)) != 0) {
355.  		    m.defensive = obj;
356.  		    m.has_defense = MUSE_POT_HEALING;
357.  		    return TRUE;
358.  		}
359.  		if (is_vampire(mtmp->data) &&
360.  		  (obj = m_carrying(mtmp, POT_VAMPIRE_BLOOD)) !=0) {
361.  		    m.defensive = obj;
362.  		    m.has_defense = MUSE_POT_VAMPIRE_BLOOD;
363.  		    return TRUE;
364.  		}
365.  	    }
366.  	    return FALSE;
367.  	}
368.  
369.  	if (levl[x][y].typ == STAIRS && !stuck && !immobile) {
370.  		if (x == xdnstair && y == ydnstair && !is_floater(mtmp->data))
371.  			m.has_defense = MUSE_DOWNSTAIRS;
372.  		if (x == xupstair && y == yupstair && ledger_no(&u.uz) != 1)
373.  	/* Unfair to let the monsters leave the dungeon with the Amulet */
374.  	/* (or go to the endlevel since you also need it, to get there) */
375.  			m.has_defense = MUSE_UPSTAIRS;
376.  	} else if (levl[x][y].typ == LADDER && !stuck && !immobile) {
377.  		if (x == xupladder && y == yupladder)
378.  			m.has_defense = MUSE_UP_LADDER;
379.  		if (x == xdnladder && y == ydnladder && !is_floater(mtmp->data))
380.  			m.has_defense = MUSE_DN_LADDER;
381.  	} else if (sstairs.sx && sstairs.sx == x && sstairs.sy == y) {
382.  		m.has_defense = MUSE_SSTAIRS;
383.  	} else if (!stuck && !immobile) {
384.  	/* Note: trap doors take precedence over teleport traps. */
385.  		int xx, yy;
386.  
387.  		for(xx = x-1; xx <= x+1; xx++) for(yy = y-1; yy <= y+1; yy++)
388.  		if (isok(xx,yy))
389.  		if (xx != u.ux && yy != u.uy)
390.  		if (mtmp->data != &mons[PM_GRID_BUG] || xx == x || yy == y)
391.  		if ((xx==x && yy==y) || !level.monsters[xx][yy])
392.  		if ((t = t_at(xx,yy)) != 0)
393.  		if ((verysmall(mtmp->data) || throws_rocks(mtmp->data) ||
394.  		     passes_walls(mtmp->data)) || !sobj_at(BOULDER, xx, yy))
395.  		if (!onscary(xx,yy,mtmp)) {
396.  			if ((t->ttyp == TRAPDOOR || t->ttyp == HOLE)
397.  				&& !is_floater(mtmp->data)
398.  				&& !mtmp->isshk && !mtmp->isgd
399.  				&& !mtmp->ispriest
400.  				&& Can_fall_thru(&u.uz)
401.  						) {
402.  				trapx = xx;
403.  				trapy = yy;
404.  				m.has_defense = MUSE_TRAPDOOR;
405.  			} else if (t->ttyp == TELEP_TRAP && m.has_defense != MUSE_TRAPDOOR) {
406.  				trapx = xx;
407.  				trapy = yy;
408.  				m.has_defense = MUSE_TELEPORT_TRAP;
409.  			}
410.  		}
411.  	}
412.  
413.  	if (nohands(mtmp->data))	/* can't use objects */
414.  		goto botm;
415.  
416.  	if (is_mercenary(mtmp->data) && (obj = m_carrying(mtmp, BUGLE))) {
417.  		int xx, yy;
418.  		struct monst *mon;
419.  
420.  		/* Distance is arbitrary.  What we really want to do is
421.  		 * have the soldier play the bugle when it sees or
422.  		 * remembers soldiers nearby...
423.  		 */
424.  		for(xx = x-3; xx <= x+3; xx++) for(yy = y-3; yy <= y+3; yy++)
425.  		if (isok(xx,yy))
426.  		if ((mon = m_at(xx,yy)) && is_mercenary(mon->data) &&
427.  				mon->data != &mons[PM_GUARD] &&
428.  				(mon->msleeping || (!mon->mcanmove))) {
429.  			m.defensive = obj;
430.  			m.has_defense = MUSE_BUGLE;
431.  		}
432.  	}
433.  
434.  	/* use immediate physical escape prior to attempting magic */
435.  	if (m.has_defense)    /* stairs, trap door or tele-trap, bugle alert */
436.  		goto botm;
437.  
438.  	/* kludge to cut down on trap destruction (particularly portals) */
439.  	t = t_at(x,y);
440.  	if (t && (t->ttyp == PIT || t->ttyp == SPIKED_PIT ||
441.  		  t->ttyp == WEB || t->ttyp == BEAR_TRAP))
442.  		t = 0;		/* ok for monster to dig here */
443.  
444.  #define nomore(x) if(m.has_defense==x) continue;
445.  	for (obj = mtmp->minvent; obj; obj = obj->nobj) {
446.  		/* don't always use the same selection pattern */
447.  		if (m.has_defense && !rn2(3)) break;
448.  
449.  		/* nomore(MUSE_WAN_DIGGING); */
450.  		if (m.has_defense == MUSE_WAN_DIGGING) break;
451.  		if (obj->otyp == WAN_DIGGING && obj->spe > 0 && !stuck && !t
452.  		    && !mtmp->isshk && !mtmp->isgd && !mtmp->ispriest
453.  		    && !is_floater(mtmp->data)
454.  		    /* monsters digging in Sokoban can ruin things */
455.  		    && !In_sokoban(&u.uz)
456.  		    /* digging wouldn't be effective; assume they know that */
457.  		    && !(levl[x][y].wall_info & W_NONDIGGABLE)
458.  		    && !(Is_botlevel(&u.uz) || In_endgame(&u.uz))
459.  		    && !(is_ice(x,y) || is_pool(x,y) || is_lava(x,y))
460.  		    && !(mtmp->data == &mons[PM_VLAD_THE_IMPALER]
461.  			 && In_V_tower(&u.uz))) {
462.  			m.defensive = obj;
463.  			m.has_defense = MUSE_WAN_DIGGING;
464.  		}
465.  		nomore(MUSE_WAN_TELEPORTATION_SELF);
466.  		nomore(MUSE_WAN_TELEPORTATION);
467.  		if(obj->otyp == WAN_TELEPORTATION && obj->spe > 0) {
468.  		    /* use the TELEP_TRAP bit to determine if they know
469.  		     * about noteleport on this level or not.  Avoids
470.  		     * ineffective re-use of teleportation.  This does
471.  		     * mean if the monster leaves the level, they'll know
472.  		     * about teleport traps.
473.  		     */
474.  		    if (!level.flags.noteleport ||
475.  			!(mtmp->mtrapseen & (1 << (TELEP_TRAP-1)))) {
476.  			m.defensive = obj;
477.  			m.has_defense = (mon_has_amulet(mtmp))
478.  				? MUSE_WAN_TELEPORTATION
479.  				: MUSE_WAN_TELEPORTATION_SELF;
480.  		    }
481.  		}
482.  		nomore(MUSE_SCR_TELEPORTATION);
483.  		if(obj->otyp == SCR_TELEPORTATION && mtmp->mcansee
484.  		   && haseyes(mtmp->data)
485.  		   && (!obj->cursed ||
486.  		       (!(mtmp->isshk && inhishop(mtmp))
487.  			    && !mtmp->isgd && !mtmp->ispriest))) {
488.  		    /* see WAN_TELEPORTATION case above */
489.  		    if (!level.flags.noteleport ||
490.  			!(mtmp->mtrapseen & (1 << (TELEP_TRAP-1)))) {
491.  			m.defensive = obj;
492.  			m.has_defense = MUSE_SCR_TELEPORTATION;
493.  		    }
494.  		}
495.  
496.  	    if (mtmp->data != &mons[PM_PESTILENCE]) {
497.  		nomore(MUSE_POT_FULL_HEALING);
498.  		if(obj->otyp == POT_FULL_HEALING) {
499.  			m.defensive = obj;
500.  			m.has_defense = MUSE_POT_FULL_HEALING;
501.  		}
502.  		nomore(MUSE_POT_EXTRA_HEALING);
503.  		if(obj->otyp == POT_EXTRA_HEALING) {
504.  			m.defensive = obj;
505.  			m.has_defense = MUSE_POT_EXTRA_HEALING;
506.  		}
507.  		nomore(MUSE_WAN_CREATE_MONSTER);
508.  		if(obj->otyp == WAN_CREATE_MONSTER && obj->spe > 0) {
509.  			m.defensive = obj;
510.  			m.has_defense = MUSE_WAN_CREATE_MONSTER;
511.  		}
512.  		nomore(MUSE_WAN_CREATE_HORDE);
513.  		if(obj->otyp == WAN_CREATE_HORDE && obj->spe > 0) {
514.  			m.defensive = obj;
515.  			m.has_defense = MUSE_WAN_CREATE_HORDE;
516.  		}
517.  		nomore(MUSE_POT_HEALING);
518.  		if(obj->otyp == POT_HEALING) {
519.  			m.defensive = obj;
520.  			m.has_defense = MUSE_POT_HEALING;
521.  		}
522.  		nomore(MUSE_WAN_HEALING);
523.  		if(obj->otyp == WAN_HEALING && obj->spe > 0) {
524.  			m.defensive = obj;
525.  			m.has_defense = MUSE_WAN_HEALING;
526.  		}
527.  		nomore(MUSE_WAN_EXTRA_HEALING);
528.  		if(obj->otyp == WAN_EXTRA_HEALING && obj->spe > 0) {
529.  			m.defensive = obj;
530.  			m.has_defense = MUSE_WAN_EXTRA_HEALING;
531.  		}
532.  		nomore(MUSE_POT_VAMPIRE_BLOOD);
533.  		if(is_vampire(mtmp->data) && obj->otyp == POT_VAMPIRE_BLOOD) {
534.  			m.defensive = obj;
535.  			m.has_defense = MUSE_POT_VAMPIRE_BLOOD;
536.  		}
537.  	    } else {	/* Pestilence */
538.  		nomore(MUSE_POT_FULL_HEALING);
539.  		if (obj->otyp == POT_SICKNESS) {
540.  			m.defensive = obj;
541.  			m.has_defense = MUSE_POT_FULL_HEALING;
542.  		}
543.  		nomore(MUSE_WAN_CREATE_MONSTER);
544.  		if (obj->otyp == WAN_CREATE_MONSTER && obj->spe > 0) {
545.  			m.defensive = obj;
546.  			m.has_defense = MUSE_WAN_CREATE_MONSTER;
547.  		}
548.  	    }
549.  		nomore(MUSE_SCR_CREATE_MONSTER);
550.  		if(obj->otyp == SCR_CREATE_MONSTER) {
551.  			m.defensive = obj;
552.  			m.has_defense = MUSE_SCR_CREATE_MONSTER;
553.  		}
554.  	}
555.  botm:	return((boolean)(!!m.has_defense));
556.  #undef nomore
557.  }
558.  
559.  /* Perform a defensive action for a monster.  Must be called immediately
560.   * after find_defensive().  Return values are 0: did something, 1: died,
561.   * 2: did something and can't attack again (i.e. teleported).
562.   */
563.  int
564.  use_defensive(mtmp)
565.  struct monst *mtmp;
566.  {
567.  	int i, fleetim, how = 0;
568.  	struct obj *otmp = m.defensive;
569.  	boolean vis, vismon, oseen;
570.  	const char *mcsa = "%s can see again.";
571.  
572.  	if ((i = precheck(mtmp, otmp)) != 0) return i;
573.  	vis = cansee(mtmp->mx, mtmp->my);
574.  	vismon = canseemon(mtmp);
575.  	oseen = otmp && vismon;
576.  
577.  	/* when using defensive choice to run away, we want monster to avoid
578.  	   rushing right straight back; don't override if already scared */
579.  	fleetim = !mtmp->mflee ? (33 - (30 * mtmp->mhp / mtmp->mhpmax)) : 0;
580.  #define m_flee(m)	if (fleetim && !m->iswiz) \
581.  			{ monflee(m, fleetim, FALSE, FALSE); }
582.  
583.  	switch(m.has_defense) {
584.  	case MUSE_UNICORN_HORN:
585.  		if (vismon) {
586.  		    if (otmp)
587.  			pline("%s uses a unicorn horn!", Monnam(mtmp));
588.  		    else
589.  			pline_The("tip of %s's horn glows!", mon_nam(mtmp));
590.  		}
591.  		if (!mtmp->mcansee) {
592.  		    mtmp->mcansee = 1;
593.  		    mtmp->mblinded = 0;
594.  		    if (vismon) pline(mcsa, Monnam(mtmp));
595.  		} else if (mtmp->mconf || mtmp->mstun) {
596.  		    mtmp->mconf = mtmp->mstun = 0;
597.  		    if (vismon)
598.  			pline("%s seems steadier now.", Monnam(mtmp));
599.  		} else impossible("No need for unicorn horn?");
600.  		return 2;
601.  	case MUSE_BUGLE:
602.  		if (vismon)
603.  			pline("%s plays %s!", Monnam(mtmp), doname(otmp));
604.  		else if (flags.soundok)
605.  			You_hear("a bugle playing reveille!");
606.  		awaken_soldiers();
607.  		return 2;
608.  	case MUSE_WAN_TELEPORTATION_SELF:
609.  		if ((mtmp->isshk && inhishop(mtmp))
610.  		       || mtmp->isgd || mtmp->ispriest) return 2;
611.  		m_flee(mtmp);
612.  		mzapmsg(mtmp, otmp, TRUE);
613.  		otmp->spe--;
614.  		how = WAN_TELEPORTATION;
615.  mon_tele:
616.  		if (tele_restrict(mtmp)) {	/* mysterious force... */
617.  		    if (vismon && how)		/* mentions 'teleport' */
618.  			makeknown(how);
619.  		    /* monster learns that teleportation isn't useful here */
620.  		    if (level.flags.noteleport)
621.  			mtmp->mtrapseen |= (1 << (TELEP_TRAP-1));
622.  		    return 2;
623.  		}
624.  		if ((
625.  #if 0
626.  			mon_has_amulet(mtmp) ||
627.  #endif
628.  			On_W_tower_level(&u.uz)) && !rn2(3)) {
629.  		    if (vismon)
630.  			pline("%s seems disoriented for a moment.",
631.  				Monnam(mtmp));
632.  		    return 2;
633.  		}
634.  		if (oseen && how) makeknown(how);
635.  		(void) rloc(mtmp, FALSE);
636.  		return 2;
637.  	case MUSE_WAN_TELEPORTATION:
638.  		zap_oseen = oseen;
639.  		mzapmsg(mtmp, otmp, FALSE);
640.  		otmp->spe--;
641.  		m_using = TRUE;
642.  		mbhit(mtmp,rn1(8,6),mbhitm,bhito,otmp);
643.  		/* monster learns that teleportation isn't useful here */
644.  		if (level.flags.noteleport)
645.  		    mtmp->mtrapseen |= (1 << (TELEP_TRAP-1));
646.  		m_using = FALSE;
647.  		return 2;
648.  	case MUSE_SCR_TELEPORTATION:
649.  	    {
650.  		int obj_is_cursed = otmp->cursed;
651.  
652.  		if (mtmp->isshk || mtmp->isgd || mtmp->ispriest) return 2;
653.  		m_flee(mtmp);
654.  		mreadmsg(mtmp, otmp);
655.  		m_useup(mtmp, otmp);	/* otmp might be free'ed */
656.  		how = SCR_TELEPORTATION;
657.  		if (obj_is_cursed || mtmp->mconf) {
658.  			int nlev;
659.  			d_level flev;
660.  
661.  			if (mon_has_amulet(mtmp) || In_endgame(&u.uz)) {
662.  			    if (vismon)
663.  				pline("%s seems very disoriented for a moment.",
664.  					Monnam(mtmp));
665.  			    return 2;
666.  			}
667.  			nlev = random_teleport_level();
668.  			if (nlev == depth(&u.uz)) {
669.  			    if (vismon)
670.  				pline("%s shudders for a moment.",
671.  								Monnam(mtmp));
672.  			    return 2;
673.  			}
674.  			get_level(&flev, nlev);
675.  			migrate_to_level(mtmp, ledger_no(&flev), MIGR_RANDOM,
676.  				(coord *)0);
677.  			if (oseen) makeknown(SCR_TELEPORTATION);
678.  		} else goto mon_tele;
679.  		return 2;
680.  	    }
681.  	case MUSE_WAN_DIGGING:
682.  	    {	struct trap *ttmp;
683.  
684.  		m_flee(mtmp);
685.  		mzapmsg(mtmp, otmp, FALSE);
686.  		otmp->spe--;
687.  		if (oseen) makeknown(WAN_DIGGING);
688.  		if (IS_FURNITURE(levl[mtmp->mx][mtmp->my].typ) ||
689.  		    IS_DRAWBRIDGE(levl[mtmp->mx][mtmp->my].typ) ||
690.  		    (is_drawbridge_wall(mtmp->mx, mtmp->my) >= 0) ||
691.  		    (sstairs.sx && sstairs.sx == mtmp->mx &&
692.  				   sstairs.sy == mtmp->my)) {
693.  			pline_The("digging ray is ineffective.");
694.  			return 2;
695.  		}
696.  		if (!Can_dig_down(&u.uz)) {
697.  		    if(canseemon(mtmp))
698.  			pline_The("%s here is too hard to dig in.",
699.  					surface(mtmp->mx, mtmp->my));
700.  		    return 2;
701.  		}
702.  		ttmp = maketrap(mtmp->mx, mtmp->my, HOLE);
703.  		if (!ttmp) return 2;
704.  		seetrap(ttmp);
705.  		if (vis) {
706.  		    pline("%s has made a hole in the %s.", Monnam(mtmp),
707.  				surface(mtmp->mx, mtmp->my));
708.  		    pline("%s %s through...", Monnam(mtmp),
709.  			  is_flyer(mtmp->data) ? "dives" : "falls");
710.  		} else if (flags.soundok)
711.  			You_hear("%s crash through the %s.", something,
712.  				surface(mtmp->mx, mtmp->my));
713.  		/* we made sure that there is a level for mtmp to go to */
714.  		migrate_to_level(mtmp, ledger_no(&u.uz) + 1,
715.  				 MIGR_RANDOM, (coord *)0);
716.  		return 2;
717.  	    }
718.  	case MUSE_WAN_CREATE_HORDE:
719.  	    {   coord cc;
720.  		struct permonst *pm=rndmonst();
721.  		int cnt = 1;
722.  		if (!enexto(&cc, mtmp->mx, mtmp->my, pm)) return 0;
723.  		mzapmsg(mtmp, otmp, FALSE);
724.  		otmp->spe--;
725.  		if (oseen) makeknown(WAN_CREATE_HORDE);
726.  		cnt = rnd(4) + 10;
727.  		while(cnt--) {
728.  			struct monst *mon;
729.  			if (!enexto(&cc, mtmp->mx, mtmp->my, pm)) continue;
730.  			mon = makemon(rndmonst(), cc.x, cc.y, NO_MM_FLAGS);
731.  			if (mon) newsym(mon->mx,mon->my);
732.  		}
733.  		return 2;
734.  	    }
735.  	case MUSE_WAN_CREATE_MONSTER:
736.  	    {	coord cc;
737.  		    /* pm: 0 => random, eel => aquatic, croc => amphibious */
738.  		struct permonst *pm = !is_pool(mtmp->mx, mtmp->my) ? 0 :
739.  			     &mons[u.uinwater ? PM_GIANT_EEL : PM_CROCODILE];
740.  		struct monst *mon;
741.  
742.  		if (!enexto(&cc, mtmp->mx, mtmp->my, pm)) return 0;
743.  		mzapmsg(mtmp, otmp, FALSE);
744.  		otmp->spe--;
745.  		mon = makemon((struct permonst *)0, cc.x, cc.y, NO_MM_FLAGS);
746.  		if (mon && canspotmon(mon) && oseen)
747.  		    makeknown(WAN_CREATE_MONSTER);
748.  		return 2;
749.  	    }
750.  	case MUSE_SCR_CREATE_MONSTER:
751.  	    {	coord cc;
752.  		struct permonst *pm = 0, *fish = 0;
753.  		int cnt = 1;
754.  		struct monst *mon;
755.  		boolean known = FALSE;
756.  
757.  		if (!rn2(73)) cnt += rnd(4);
758.  		if (mtmp->mconf || otmp->cursed) cnt += 12;
759.  		if (mtmp->mconf) pm = fish = &mons[PM_ACID_BLOB];
760.  		else if (is_pool(mtmp->mx, mtmp->my))
761.  		    fish = &mons[u.uinwater ? PM_GIANT_EEL : PM_CROCODILE];
762.  		mreadmsg(mtmp, otmp);
763.  		while(cnt--) {
764.  		    /* `fish' potentially gives bias towards water locations;
765.  		       `pm' is what to actually create (0 => random) */
766.  		    if (!enexto(&cc, mtmp->mx, mtmp->my, fish)) break;
767.  		    mon = makemon(pm, cc.x, cc.y, NO_MM_FLAGS);
768.  		    if (mon && canspotmon(mon)) known = TRUE;
769.  		}
770.  		/* The only case where we don't use oseen.  For wands, you
771.  		 * have to be able to see the monster zap the wand to know
772.  		 * what type it is.  For teleport scrolls, you have to see
773.  		 * the monster to know it teleported.
774.  		 */
775.  		if (known)
776.  		    makeknown(SCR_CREATE_MONSTER);
777.  		else if (!objects[SCR_CREATE_MONSTER].oc_name_known
778.  			&& !objects[SCR_CREATE_MONSTER].oc_uname)
779.  		    docall(otmp);
780.  		m_useup(mtmp, otmp);
781.  		return 2;
782.  	    }
783.  	case MUSE_TRAPDOOR:
784.  		/* trap doors on "bottom" levels of dungeons are rock-drop
785.  		 * trap doors, not holes in the floor.  We check here for
786.  		 * safety.
787.  		 */
788.  		if (Is_botlevel(&u.uz)) return 0;
789.  		m_flee(mtmp);
790.  		if (vis) {
791.  			struct trap *t;
792.  			t = t_at(trapx,trapy);
793.  			pline("%s %s into a %s!", Monnam(mtmp),
794.  			makeplural(locomotion(mtmp->data, "jump")),
795.  			t->ttyp == TRAPDOOR ? "trap door" : "hole");
796.  			if (levl[trapx][trapy].typ == SCORR) {
797.  			    levl[trapx][trapy].typ = CORR;
798.  			    unblock_point(trapx, trapy);
799.  			}
800.  			seetrap(t_at(trapx,trapy));
801.  		}
802.  
803.  		/*  don't use rloc_to() because worm tails must "move" */
804.  		remove_monster(mtmp->mx, mtmp->my);
805.  		newsym(mtmp->mx, mtmp->my);	/* update old location */
806.  		place_monster(mtmp, trapx, trapy);
807.  		if (mtmp->wormno) worm_move(mtmp);
808.  		newsym(trapx, trapy);
809.  
810.  		migrate_to_level(mtmp, ledger_no(&u.uz) + 1,
811.  				 MIGR_RANDOM, (coord *)0);
812.  		return 2;
813.  	case MUSE_UPSTAIRS:
814.  		/* Monsters without amulets escape the dungeon and are
815.  		 * gone for good when they leave up the up stairs.
816.  		 * Monsters with amulets would reach the endlevel,
817.  		 * which we cannot allow since that would leave the
818.  		 * player stranded.
819.  		 */
820.  		if (ledger_no(&u.uz) == 1) {
821.  			if (mon_has_special(mtmp))
822.  				return 0;
823.  			if (vismon)
824.  			    pline("%s escapes the dungeon!", Monnam(mtmp));
825.  			mongone(mtmp);
826.  			return 2;
827.  		}
828.  		m_flee(mtmp);
829.  		if (Inhell && mon_has_amulet(mtmp) && !rn2(4) &&
830.  			(dunlev(&u.uz) < dunlevs_in_dungeon(&u.uz) - 3)) {
831.  		    if (vismon) pline(
832.       "As %s climbs the stairs, a mysterious force momentarily surrounds %s...",
833.  				     mon_nam(mtmp), mhim(mtmp));
834.  		    /* simpler than for the player; this will usually be
835.  		       the Wizard and he'll immediately go right to the
836.  		       upstairs, so there's not much point in having any
837.  		       chance for a random position on the current level */
838.  		    migrate_to_level(mtmp, ledger_no(&u.uz) + 1,
839.  				     MIGR_RANDOM, (coord *)0);
840.  		} else {
841.  		    if (vismon) pline("%s escapes upstairs!", Monnam(mtmp));
842.  		    migrate_to_level(mtmp, ledger_no(&u.uz) - 1,
843.  				     MIGR_STAIRS_DOWN, (coord *)0);
844.  		}
845.  		return 2;
846.  	case MUSE_DOWNSTAIRS:
847.  		m_flee(mtmp);
848.  		if (vismon) pline("%s escapes downstairs!", Monnam(mtmp));
849.  		migrate_to_level(mtmp, ledger_no(&u.uz) + 1,
850.  				 MIGR_STAIRS_UP, (coord *)0);
851.  		return 2;
852.  	case MUSE_UP_LADDER:
853.  		m_flee(mtmp);
854.  		if (vismon) pline("%s escapes up the ladder!", Monnam(mtmp));
855.  		migrate_to_level(mtmp, ledger_no(&u.uz) - 1,
856.  				 MIGR_LADDER_DOWN, (coord *)0);
857.  		return 2;
858.  	case MUSE_DN_LADDER:
859.  		m_flee(mtmp);
860.  		if (vismon) pline("%s escapes down the ladder!", Monnam(mtmp));
861.  		migrate_to_level(mtmp, ledger_no(&u.uz) + 1,
862.  				 MIGR_LADDER_UP, (coord *)0);
863.  		return 2;
864.  	case MUSE_SSTAIRS:
865.  		m_flee(mtmp);
866.  		/* the stairs leading up from the 1st level are */
867.  		/* regular stairs, not sstairs.			*/
868.  		if (sstairs.up) {
869.  			if (vismon)
870.  			    pline("%s escapes upstairs!", Monnam(mtmp));
871.  			if(Inhell) {
872.  			    migrate_to_level(mtmp, ledger_no(&sstairs.tolev),
873.  					     MIGR_RANDOM, (coord *)0);
874.  			    return 2;
875.  			}
876.  		} else	if (vismon)
877.  		    pline("%s escapes downstairs!", Monnam(mtmp));
878.  		migrate_to_level(mtmp, ledger_no(&sstairs.tolev),
879.  				 MIGR_SSTAIRS, (coord *)0);
880.  		return 2;
881.  	case MUSE_TELEPORT_TRAP:
882.  		m_flee(mtmp);
883.  		if (vis) {
884.  			pline("%s %s onto a teleport trap!", Monnam(mtmp),
885.  				makeplural(locomotion(mtmp->data, "jump")));
886.  			if (levl[trapx][trapy].typ == SCORR) {
887.  			    levl[trapx][trapy].typ = CORR;
888.  			    unblock_point(trapx, trapy);
889.  			}
890.  			seetrap(t_at(trapx,trapy));
891.  		}
892.  		/*  don't use rloc_to() because worm tails must "move" */
893.  		remove_monster(mtmp->mx, mtmp->my);
894.  		newsym(mtmp->mx, mtmp->my);	/* update old location */
895.  		place_monster(mtmp, trapx, trapy);
896.  		if (mtmp->wormno) worm_move(mtmp);
897.  		newsym(trapx, trapy);
898.  
899.  		goto mon_tele;
900.  	/* [Tom] */
901.  	case MUSE_WAN_HEALING:
902.  		mzapmsg(mtmp, otmp, TRUE);
903.  		otmp->spe--;
904.  		i = d(5,2) + 5 * !!bcsign(otmp);
905.  		mtmp->mhp += i;
906.  		if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = ++mtmp->mhpmax;
907.  		if (!otmp->cursed) mtmp->mcansee = 1;
908.  		if (vismon) pline("%s begins to look better.", Monnam(mtmp));
909.  		if (oseen) makeknown(WAN_HEALING);
910.  		return 2;
911.  	case MUSE_WAN_EXTRA_HEALING:
912.  		mzapmsg(mtmp, otmp, TRUE);
913.  		otmp->spe--;
914.  		i = d(5,4) + 10 * !!bcsign(otmp);
915.  		mtmp->mhp += i;
916.  		if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = ++mtmp->mhpmax;
917.  		if (!otmp->cursed) mtmp->mcansee = 1;
918.  		if (vismon) pline("%s begins to look better.", Monnam(mtmp));
919.  		if (oseen) makeknown(WAN_EXTRA_HEALING);
920.  		return 2;
921.  	case MUSE_POT_HEALING:
922.  		mquaffmsg(mtmp, otmp);
923.  		i = d(6 + 2 * bcsign(otmp), 4);
924.  		mtmp->mhp += i;
925.  		if (mtmp->mhp > mtmp->mhpmax) mtmp->mhp = ++mtmp->mhpmax;
926.  		if (!otmp->cursed && !mtmp->mcansee) {
927.  			mtmp->mcansee = 1;
928.  			mtmp->mblinded = 0;
929.  			if (vismon) pline(mcsa, Monnam(mtmp));
930.  		}
931.  		if (vismon) pline("%s looks better.", Monnam(mtmp));
932.  		if (oseen) makeknown(POT_HEALING);
933.  		m_useup(mtmp, otmp);
934.  		return 2;
935.  	case MUSE_POT_EXTRA_HEALING:
936.  		mquaffmsg(mtmp, otmp);
937.  		i = d(6 + 2 * bcsign(otmp), 8);
938.  		mtmp->mhp += i;
939.  		if (mtmp->mhp > mtmp->mhpmax)
940.  			mtmp->mhp = (mtmp->mhpmax += (otmp->blessed ? 5 : 2));
941.  		if (!mtmp->mcansee) {
942.  			mtmp->mcansee = 1;
943.  			mtmp->mblinded = 0;
944.  			if (vismon) pline(mcsa, Monnam(mtmp));
945.  		}
946.  		if (vismon) pline("%s looks much better.", Monnam(mtmp));
947.  		if (oseen) makeknown(POT_EXTRA_HEALING);
948.  		m_useup(mtmp, otmp);
949.  		return 2;
950.  	case MUSE_POT_FULL_HEALING:
951.  		mquaffmsg(mtmp, otmp);
952.  		if (otmp->otyp == POT_SICKNESS) unbless(otmp); /* Pestilence */
953.  		mtmp->mhp = (mtmp->mhpmax += (otmp->blessed ? 8 : 4));
954.  		if (!mtmp->mcansee && otmp->otyp != POT_SICKNESS) {
955.  			mtmp->mcansee = 1;
956.  			mtmp->mblinded = 0;
957.  			if (vismon) pline(mcsa, Monnam(mtmp));
958.  		}
959.  		if (vismon) pline("%s looks completely healed.", Monnam(mtmp));
960.  		if (oseen) makeknown(otmp->otyp);
961.  		m_useup(mtmp, otmp);
962.  		return 2;
963.  	case MUSE_POT_VAMPIRE_BLOOD:
964.  		mquaffmsg(mtmp, otmp);
965.  		if (!otmp->cursed) {
966.  		    i = rnd(8) + rnd(2);
967.  		    mtmp->mhp += i;
968.  		    mtmp->mhpmax += i;
969.  		    if (vismon) pline("%s looks full of life.", Monnam(mtmp));
970.  		}
971.  		else if (vismon)
972.  		    pline("%s discards the congealed blood in disgust.", Monnam(mtmp));
973.  		if (oseen) makeknown(POT_VAMPIRE_BLOOD);
974.  		m_useup(mtmp, otmp);
975.  		return 2;
976.  	case MUSE_LIZARD_CORPSE:
977.  		/* not actually called for its unstoning effect */
978.  		mon_consume_unstone(mtmp, otmp, FALSE, FALSE);
979.  		return 2;
980.  	case 0: return 0; /* i.e. an exploded wand */
981.  	default: impossible("%s wanted to perform action %d?", Monnam(mtmp),
982.  			m.has_defense);
983.  		break;
984.  	}
985.  	return 0;
986.  #undef m_flee
987.  }
988.  
989.  int
990.  rnd_defensive_item(mtmp)
991.  struct monst *mtmp;
992.  {
993.  	struct permonst *pm = mtmp->data;
994.  	int difficulty = monstr[(monsndx(pm))];
995.  	int trycnt = 0;
996.  
997.  	if(is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data)
998.  			|| pm->mlet == S_GHOST
999.  # ifdef KOPS
1000. 			|| pm->mlet == S_KOP
1001. # endif
1002. 		) return 0;
1003.     try_again:
1004. 	switch (rn2(8 + (difficulty > 3) + (difficulty > 6) +
1005. 				(difficulty > 8))) {
1006. 		case 6: case 9:
1007. 			if (level.flags.noteleport && ++trycnt < 2)
1008. 			    goto try_again;
1009. 			if (!rn2(3)) return WAN_TELEPORTATION;
1010. 			/* else FALLTHRU */
1011. 		case 0: case 1:
1012. 			return SCR_TELEPORTATION;
1013. 		case 8: case 10:
1014. 			if (!rn2(3)) return WAN_CREATE_MONSTER;
1015. 			/* else FALLTHRU */
1016. 		case 2: return SCR_CREATE_MONSTER;
1017. 		case 3: return POT_HEALING;
1018. 		case 4: return POT_EXTRA_HEALING;
1019. 		case 5: return (mtmp->data != &mons[PM_PESTILENCE]) ?
1020. 				POT_FULL_HEALING : POT_SICKNESS;
1021. 		case 7: if (is_floater(pm) || mtmp->isshk || mtmp->isgd
1022. 						|| mtmp->ispriest
1023. 									)
1024. 				return 0;
1025. 			else
1026. 				return WAN_DIGGING;
1027. 	}
1028. 	/*NOTREACHED*/
1029. 	return 0;
1030. }
1031. 
1032. #define MUSE_WAN_DEATH 1
1033. #define MUSE_WAN_SLEEP 2
1034. #define MUSE_WAN_FIREBALL 3
1035. #define MUSE_WAN_FIRE 4
1036. #define MUSE_WAN_COLD 5
1037. #define MUSE_WAN_LIGHTNING 6
1038. #define MUSE_WAN_MAGIC_MISSILE 7
1039. #define MUSE_WAN_STRIKING 8
1040. #define MUSE_SCR_FIRE 9
1041. #define MUSE_POT_PARALYSIS 10
1042. #define MUSE_POT_BLINDNESS 11
1043. #define MUSE_POT_CONFUSION 12
1044. #define MUSE_POT_SLEEPING 13
1045. #define MUSE_POT_ACID 14
1046. #define MUSE_FROST_HORN 15
1047. #define MUSE_FIRE_HORN 16
1048. #define MUSE_WAN_DRAINING 17	/* KMH */
1049. /*#define MUSE_WAN_TELEPORTATION 18*/
1050. #define MUSE_SCR_EARTH 19
1051. #define MUSE_POT_AMNESIA 20
1052. #define MUSE_WAN_CANCELLATION 21	/* Lethe */
1053. 
1054. /* Select an offensive item/action for a monster.  Returns TRUE iff one is
1055.  * found.
1056.  */
1057. boolean
1058. find_offensive(mtmp)
1059. struct monst *mtmp;
1060. {
1061. 	register struct obj *obj;
1062. 	boolean ranged_stuff = lined_up(mtmp);
1063. 	boolean reflection_skip = (Reflecting && rn2(2));
1064. 	struct obj *helmet = which_armor(mtmp, W_ARMH);
1065. 
1066. 	m.offensive = (struct obj *)0;
1067. 	m.has_offense = 0;
1068. 	if (mtmp->mpeaceful || is_animal(mtmp->data) ||
1069. 				mindless(mtmp->data) || nohands(mtmp->data))
1070. 		return FALSE;
1071. 	if (u.uswallow) return FALSE;
1072. 	if (in_your_sanctuary(mtmp, 0, 0)) return FALSE;
1073. 	if (dmgtype(mtmp->data, AD_HEAL) && !uwep
1074. #ifdef TOURIST
1075. 	    && !uarmu
1076. #endif
1077. 	    && !uarm && !uarmh && !uarms && !uarmg && !uarmc && !uarmf)
1078. 		return FALSE;
1079. 
1080. 	if (!ranged_stuff) return FALSE;
1081. #define nomore(x) if(m.has_offense==x) continue;
1082. 	for(obj=mtmp->minvent; obj; obj=obj->nobj) {
1083. 		/* nomore(MUSE_WAN_DEATH); */
1084. 		if (!reflection_skip) {
1085. 		    if(obj->otyp == WAN_DEATH && obj->spe > 0) {
1086. 			m.offensive = obj;
1087. 			m.has_offense = MUSE_WAN_DEATH;
1088. 		    }
1089. 		    nomore(MUSE_WAN_SLEEP);
1090. 		    if(obj->otyp == WAN_SLEEP && obj->spe > 0 && multi >= 0) {
1091. 			m.offensive = obj;
1092. 			m.has_offense = MUSE_WAN_SLEEP;
1093. 		    }
1094. /*WAC fixed*/
1095. /* [Tom] doesn't work...*/
1096. 
1097. 		    nomore(MUSE_WAN_FIREBALL);                    
1098. 		    if(obj->otyp == WAN_FIREBALL && obj->spe > 0) {
1099. 			m.offensive = obj;
1100. 			m.has_offense = MUSE_WAN_FIREBALL;
1101.                     }
1102. 		    nomore(MUSE_WAN_FIRE);
1103. 		    if(obj->otyp == WAN_FIRE && obj->spe > 0) {
1104. 			m.offensive = obj;
1105. 			m.has_offense = MUSE_WAN_FIRE;
1106. 		    }
1107. 		    nomore(MUSE_FIRE_HORN);
1108. 		    if(obj->otyp == FIRE_HORN && obj->spe > 0) {
1109. 			m.offensive = obj;
1110. 			m.has_offense = MUSE_FIRE_HORN;
1111. 		    }
1112. 		    nomore(MUSE_WAN_COLD);
1113. 		    if(obj->otyp == WAN_COLD && obj->spe > 0) {
1114. 			m.offensive = obj;
1115. 			m.has_offense = MUSE_WAN_COLD;
1116. 		    }
1117. 		    nomore(MUSE_FROST_HORN);
1118. 		    if(obj->otyp == FROST_HORN && obj->spe > 0) {
1119. 			m.offensive = obj;
1120. 			m.has_offense = MUSE_FROST_HORN;
1121. 		    }
1122. 		    nomore(MUSE_WAN_LIGHTNING);
1123. 		    if(obj->otyp == WAN_LIGHTNING && obj->spe > 0) {
1124. 			m.offensive = obj;
1125. 			m.has_offense = MUSE_WAN_LIGHTNING;
1126. 		    }
1127. 		    nomore(MUSE_WAN_MAGIC_MISSILE);
1128. 		    if(obj->otyp == WAN_MAGIC_MISSILE && obj->spe > 0) {
1129. 			m.offensive = obj;
1130. 			m.has_offense = MUSE_WAN_MAGIC_MISSILE;
1131. 		    }
1132. 		}
1133. 		nomore(MUSE_WAN_DRAINING);
1134. 		if(obj->otyp == WAN_DRAINING && obj->spe > 0) {
1135. 			m.offensive = obj;
1136. 			m.has_offense = MUSE_WAN_DRAINING;
1137. 		}
1138. 		nomore(MUSE_WAN_STRIKING);
1139. 		if(obj->otyp == WAN_STRIKING && obj->spe > 0) {
1140. 			m.offensive = obj;
1141. 			m.has_offense = MUSE_WAN_STRIKING;
1142. 		}
1143. 		nomore(MUSE_POT_PARALYSIS);
1144. 		if(obj->otyp == POT_PARALYSIS && multi >= 0) {
1145. 			m.offensive = obj;
1146. 			m.has_offense = MUSE_POT_PARALYSIS;
1147. 		}
1148. 		nomore(MUSE_POT_BLINDNESS);
1149. 		if(obj->otyp == POT_BLINDNESS && !attacktype(mtmp->data, AT_GAZE)) {
1150. 			m.offensive = obj;
1151. 			m.has_offense = MUSE_POT_BLINDNESS;
1152. 		}
1153. 		nomore(MUSE_POT_CONFUSION);
1154. 		if(obj->otyp == POT_CONFUSION) {
1155. 			m.offensive = obj;
1156. 			m.has_offense = MUSE_POT_CONFUSION;
1157. 		}
1158. 		nomore(MUSE_POT_SLEEPING);
1159. 		if(obj->otyp == POT_SLEEPING) {
1160. 			m.offensive = obj;
1161. 			m.has_offense = MUSE_POT_SLEEPING;
1162. 		}
1163. 		/* Mik's Lethe patch - monsters use !oAmnesia */
1164. 		nomore(MUSE_POT_AMNESIA);
1165. 		if (obj->otyp == POT_AMNESIA) {
1166. 			m.offensive   = obj;
1167. 			m.has_offense = MUSE_POT_AMNESIA;
1168. 		}
1169. 		nomore(MUSE_POT_SLEEPING);
1170. 		if(obj->otyp == POT_SLEEPING) {
1171. 			m.offensive = obj;
1172. 			m.has_offense = MUSE_POT_SLEEPING;
1173. 		}
1174. 		/* KMH, balance patch -- monsters use potion of acid */
1175. 		nomore(MUSE_POT_ACID);
1176. 		if(obj->otyp == POT_ACID) {
1177. 			m.offensive = obj;
1178. 			m.has_offense = MUSE_POT_ACID;
1179. 		}
1180. 		/* we can safely put this scroll here since the locations that
1181. 		 * are in a 1 square radius are a subset of the locations that
1182. 		 * are in wand range
1183. 		 */
1184. 		nomore(MUSE_SCR_EARTH);
1185. 		if (obj->otyp == SCR_EARTH
1186. 		       && ((helmet && is_metallic(helmet)) ||
1187. 				mtmp->mconf || amorphous(mtmp->data) ||
1188. 				passes_walls(mtmp->data) ||
1189. 				noncorporeal(mtmp->data) ||
1190. 				unsolid(mtmp->data) || !rn2(10))
1191. 		       && dist2(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy) <= 2
1192. 		       && mtmp->mcansee && haseyes(mtmp->data)
1193. #ifdef REINCARNATION
1194. 		       && !Is_rogue_level(&u.uz)
1195. #endif
1196. 		       && (!In_endgame(&u.uz) || Is_earthlevel(&u.uz))) {
1197. 		    m.offensive = obj;
1198. 		    m.has_offense = MUSE_SCR_EARTH;
1199. 		}
1200. 		nomore(MUSE_WAN_CANCELLATION);
1201. 		if (obj->otyp == WAN_CANCELLATION && obj->spe > 0) {
1202. 			m.offensive   = obj;
1203. 			m.has_offense = MUSE_WAN_CANCELLATION;
1204. 		}
1205. #if 0
1206. 		nomore(MUSE_SCR_FIRE);
1207. 		if (obj->otyp == SCR_FIRE && resists_fire(mtmp)
1208. 		   && dist2(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy) <= 2
1209. 		   && mtmp->mcansee && haseyes(mtmp->data)) {
1210. 			m.offensive = obj;
1211. 			m.has_offense = MUSE_SCR_FIRE;
1212. 		}
1213. #endif
1214. 	}
1215. 	return((boolean)(!!m.has_offense));
1216. #undef nomore
1217. }
1218. 
1219. STATIC_PTR
1220. int
1221. mbhitm(mtmp, otmp)
1222. register struct monst *mtmp;
1223. register struct obj *otmp;
1224. {
1225. 	int tmp;
1226. 
1227. 	boolean reveal_invis = FALSE;
1228. 	if (mtmp != &youmonst) {
1229. 		mtmp->msleeping = 0;
1230. 		if (mtmp->m_ap_type) seemimic(mtmp);
1231. 	}
1232. 	switch(otmp->otyp) {
1233. 	case WAN_STRIKING:
1234. 		reveal_invis = TRUE;
1235. 		if (mtmp == &youmonst) {
1236. 			if (zap_oseen) makeknown(WAN_STRIKING);
1237. 			if (Antimagic) {
1238. 			    shieldeff(u.ux, u.uy);
1239. 			    pline("Boing!");
1240. 			} else if (rnd(20) < 10 + u.uac) {
1241. 			    pline_The("wand hits you!");
1242. 			    tmp = d(2,12);
1243. 			    if(Half_spell_damage) tmp = (tmp+1) / 2;
1244. 			    losehp(tmp, "wand", KILLED_BY_AN);
1245. 			} else pline_The("wand misses you.");
1246. 			stop_occupation();
1247. 			nomul(0);
1248. 		} else if (resists_magm(mtmp)) {
1249. 			shieldeff(mtmp->mx, mtmp->my);
1250. 			pline("Boing!");
1251. 		} else if (rnd(20) < 10+find_mac(mtmp)) {
1252. 			tmp = d(2,12);
1253. 			hit("wand", mtmp, exclam(tmp));
1254. 			(void) resist(mtmp, otmp->oclass, tmp, TELL);
1255. 			if (cansee(mtmp->mx, mtmp->my) && zap_oseen)
1256. 				makeknown(WAN_STRIKING);
1257. 		} else {
1258. 			miss("wand", mtmp);
1259. 			if (cansee(mtmp->mx, mtmp->my) && zap_oseen)
1260. 				makeknown(WAN_STRIKING);
1261. 		}
1262. 		break;
1263. 	case WAN_TELEPORTATION:
1264. 		if (mtmp == &youmonst) {
1265. 			if (zap_oseen) makeknown(WAN_TELEPORTATION);
1266. 			tele();
1267. 		} else {
1268. 			/* for consistency with zap.c, don't identify */
1269. 			if (mtmp->ispriest &&
1270. 				*in_rooms(mtmp->mx, mtmp->my, TEMPLE)) {
1271. 			    if (cansee(mtmp->mx, mtmp->my))
1272. 				pline("%s resists the magic!", Monnam(mtmp));
1273. 			    mtmp->msleeping = 0;
1274. 			    if(mtmp->m_ap_type) seemimic(mtmp);
1275. 			} else if (!tele_restrict(mtmp))
1276. 			    (void) rloc(mtmp, FALSE);
1277. 		}
1278. 		break;
1279. 	case WAN_CANCELLATION:
1280. 	case SPE_CANCELLATION:
1281. 		(void) cancel_monst(mtmp, otmp, FALSE, TRUE, FALSE);
1282. 		break;
1283. 	case WAN_DRAINING:	/* KMH */
1284. 		tmp = d(2,6);
1285. 		if (mtmp == &youmonst) {
1286. 			if (Drain_resistance) {
1287. 				shieldeff(u.ux, u.uy);
1288. 				pline("Boing!");
1289. 			} else
1290. 				losexp("life drainage", FALSE);
1291. 			if (zap_oseen)
1292. 				makeknown(WAN_DRAINING);
1293. 			stop_occupation();
1294. 			nomul(0);
1295. 			break;
1296. 		} else if (resists_drli(mtmp)) {
1297. 			shieldeff(mtmp->mx, mtmp->my);
1298. 			break;	/* skip makeknown */
1299. 		} else if (!resist(mtmp, otmp->oclass, tmp, NOTELL) &&
1300. 				mtmp->mhp > 0) {
1301. 			mtmp->mhpmax -= tmp;
1302. 			if (mtmp->mhpmax <= 0 || mtmp->m_lev <= 0)
1303. 				monkilled(mtmp, "", AD_DRLI);
1304. 			else {
1305. 				mtmp->m_lev--;
1306. 				if (canseemon(mtmp)) {
1307. 					pline("%s suddenly seems weaker!", Monnam(mtmp));
1308. 				}
1309. 			}
1310. 		}
1311. 		if (cansee(mtmp->mx, mtmp->my) && zap_oseen)
1312. 			makeknown(WAN_DRAINING);
1313. 		break;
1314. 	}
1315. 	if (reveal_invis) {
1316. 	    if (mtmp->mhp > 0 && cansee(bhitpos.x,bhitpos.y)
1317. 							&& !canspotmon(mtmp))
1318. 		map_invisible(bhitpos.x, bhitpos.y);
1319. 	}
1320. 	return 0;
1321. }
1322. 
1323. /* A modified bhit() for monsters.  Based on bhit() in zap.c.  Unlike
1324.  * buzz(), bhit() doesn't take into account the possibility of a monster
1325.  * zapping you, so we need a special function for it.  (Unless someone wants
1326.  * to merge the two functions...)
1327.  */
1328. STATIC_OVL void
1329. mbhit(mon,range,fhitm,fhito,obj)
1330. struct monst *mon;			/* monster shooting the wand */
1331. register int range;			/* direction and range */
1332. int FDECL((*fhitm),(MONST_P,OBJ_P));
1333. int FDECL((*fhito),(OBJ_P,OBJ_P));	/* fns called when mon/obj hit */
1334. struct obj *obj;			/* 2nd arg to fhitm/fhito */
1335. {
1336. 	register struct monst *mtmp;
1337. 	register struct obj *otmp;
1338. 	register uchar typ;
1339. 	int ddx, ddy;
1340. 
1341. 	bhitpos.x = mon->mx;
1342. 	bhitpos.y = mon->my;
1343. 	u.dx = ddx = sgn(mon->mux - mon->mx);
1344. 	u.dy = ddy = sgn(mon->muy - mon->my);
1345. 
1346. 	while(range-- > 0) {
1347. 		int x,y;
1348. 
1349. 		bhitpos.x += ddx;
1350. 		bhitpos.y += ddy;
1351. 		x = bhitpos.x; y = bhitpos.y;
1352. 
1353. 		if (!isok(x,y)) {
1354. 		    bhitpos.x -= ddx;
1355. 		    bhitpos.y -= ddy;
1356. 		    break;
1357. 		}
1358. 		if (find_drawbridge(&x,&y))
1359. 		    switch (obj->otyp) {
1360. 			case WAN_STRIKING:
1361. 			    destroy_drawbridge(x,y);
1362. 		    }
1363. 		if(bhitpos.x==u.ux && bhitpos.y==u.uy) {
1364. 			(*fhitm)(&youmonst, obj);
1365. 			range -= 3;
1366. 		} else if(MON_AT(bhitpos.x, bhitpos.y)){
1367. 			mtmp = m_at(bhitpos.x,bhitpos.y);
1368. 			if (cansee(bhitpos.x,bhitpos.y) && !canspotmon(mtmp))
1369. 			    map_invisible(bhitpos.x, bhitpos.y);
1370. 			(*fhitm)(mtmp, obj);
1371. 			range -= 3;
1372. 		}
1373. 		/* modified by GAN to hit all objects */
1374. 		if(fhito){
1375. 		    int hitanything = 0;
1376. 		    register struct obj *next_obj;
1377. 
1378. 		    for(otmp = level.objects[bhitpos.x][bhitpos.y];
1379. 							otmp; otmp = next_obj) {
1380. 			/* Fix for polymorph bug, Tim Wright */
1381. 			next_obj = otmp->nexthere;
1382. 			hitanything += (*fhito)(otmp, obj);
1383. 		    }
1384. 		    if(hitanything)	range--;
1385. 		}
1386. 		typ = levl[bhitpos.x][bhitpos.y].typ;
1387. 		if(IS_DOOR(typ) || typ == SDOOR) {
1388. 		    switch (obj->otyp) {
1389. 			/* note: monsters don't use opening or locking magic
1390. 			   at present, but keep these as placeholders */
1391. 			case WAN_OPENING:
1392. 			case WAN_LOCKING:
1393. 			case WAN_STRIKING:
1394. 			    if (doorlock(obj, bhitpos.x, bhitpos.y)) {
1395. 				makeknown(obj->otyp);
1396. 				/* if a shop door gets broken, add it to
1397. 				   the shk's fix list (no cost to player) */
1398. 				if (levl[bhitpos.x][bhitpos.y].doormask ==
1399. 					D_BROKEN &&
1400. 				    *in_rooms(bhitpos.x, bhitpos.y, SHOPBASE))
1401. 				    add_damage(bhitpos.x, bhitpos.y, 0L);
1402. 			    }
1403. 			    break;
1404. 		    }
1405. 		}
1406. 		if(!ZAP_POS(typ) || (IS_DOOR(typ) &&
1407. 		   (levl[bhitpos.x][bhitpos.y].doormask & (D_LOCKED | D_CLOSED)))
1408. 		  ) {
1409. 			bhitpos.x -= ddx;
1410. 			bhitpos.y -= ddy;
1411. 			break;
1412. 		}
1413. 	}
1414. }
1415. 
1416. /* Perform an offensive action for a monster.  Must be called immediately
1417.  * after find_offensive().  Return values are same as use_defensive().
1418.  */
1419. int
1420. use_offensive(mtmp)
1421. struct monst *mtmp;
1422. {
1423. 	int i;
1424. 	struct obj *otmp = m.offensive;
1425. 	boolean oseen;
1426. 
1427. 	/* offensive potions are not drunk, they're thrown */
1428. 	if (otmp->oclass != POTION_CLASS && (i = precheck(mtmp, otmp)) != 0)
1429. 		return i;
1430. 	oseen = otmp && canseemon(mtmp);
1431. 
1432. 	switch(m.has_offense) {
1433. 	case MUSE_WAN_DEATH:
1434. 	case MUSE_WAN_SLEEP:
1435. /*WAC reactivate*/
1436. 	case MUSE_WAN_FIREBALL:
1437. 	case MUSE_WAN_FIRE:
1438. 	case MUSE_WAN_COLD:
1439. 	case MUSE_WAN_LIGHTNING:
1440. 	case MUSE_WAN_MAGIC_MISSILE:
1441. 		mzapmsg(mtmp, otmp, FALSE);
1442. 		otmp->spe--;
1443. 		if (oseen) makeknown(otmp->otyp);
1444. 		m_using = TRUE;
1445. /*WAC Handled later
1446. 		if (otmp->otyp == WAN_FIREBALL) {
1447. 		    buzz((int) -10 - SPE_FIREBALL - SPE_MAGIC_MISSILE, rn2(2)+3,
1448. 		    mtmp->mx, mtmp->my,
1449. 		    sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my));
1450. 		}
1451. 		else {
1452. */
1453. 		buzz((int)(-30 - (otmp->otyp - WAN_MAGIC_MISSILE)),
1454. 			(otmp->otyp == WAN_MAGIC_MISSILE) ? 2 : 6,
1455. 			mtmp->mx, mtmp->my,
1456. 			sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my));
1457. 		m_using = FALSE;
1458. /*                }*/
1459. 		return (mtmp->mhp <= 0) ? 1 : 2;
1460. 	case MUSE_FIRE_HORN:
1461. 	case MUSE_FROST_HORN:
1462. 		if (oseen) {
1463. 			makeknown(otmp->otyp);
1464. 			pline("%s plays a %s!", Monnam(mtmp), xname(otmp));
1465. 		} else
1466. 			You_hear("a horn being played.");
1467. 		otmp->spe--;
1468. 		m_using = TRUE;
1469. 		buzz(-30 - ((otmp->otyp==FROST_HORN) ? AD_COLD-1 : AD_FIRE-1),
1470. 			rn1(6,6), mtmp->mx, mtmp->my,
1471. 			sgn(mtmp->mux-mtmp->mx), sgn(mtmp->muy-mtmp->my));
1472. 		m_using = FALSE;
1473. 		return (mtmp->mhp <= 0) ? 1 : 2;
1474. /*      case MUSE_WAN_TELEPORTATION:*/
1475. 	case MUSE_WAN_STRIKING:
1476. 	case MUSE_WAN_DRAINING:	/* KMH */
1477. 	case MUSE_WAN_CANCELLATION:  /* Lethe */
1478. 		zap_oseen = oseen;
1479. 		mzapmsg(mtmp, otmp, FALSE);
1480. 		otmp->spe--;
1481. 		m_using = TRUE;
1482. 		mbhit(mtmp,rn1(8,6),mbhitm,bhito,otmp);
1483. 		m_using = FALSE;
1484. 		return 2;
1485. 	case MUSE_SCR_EARTH:
1486. 	    {
1487. 		/* TODO: handle steeds */
1488. 	    	register int x, y;
1489. 		/* don't use monster fields after killing it */
1490. 		boolean confused = (mtmp->mconf ? TRUE : FALSE);
1491. 		int mmx = mtmp->mx, mmy = mtmp->my;
1492. 
1493. 		mreadmsg(mtmp, otmp);
1494. 	    	/* Identify the scroll */
1495. 		if (canspotmon(mtmp)) {
1496. 		    pline_The("%s rumbles %s %s!", ceiling(mtmp->mx, mtmp->my),
1497. 	    			otmp->blessed ? "around" : "above",
1498. 				mon_nam(mtmp));
1499. 		    if (oseen) makeknown(otmp->otyp);
1500. 		} else if (cansee(mtmp->mx, mtmp->my)) {
1501. 		    pline_The("%s rumbles in the middle of nowhere!",
1502. 			ceiling(mtmp->mx, mtmp->my));
1503. 		    if (mtmp->minvis)
1504. 			map_invisible(mtmp->mx, mtmp->my);
1505. 		    if (oseen) makeknown(otmp->otyp);
1506. 		}
1507. 
1508. 	    	/* Loop through the surrounding squares */
1509. 	    	for (x = mmx-1; x <= mmx+1; x++) {
1510. 	    	    for (y = mmy-1; y <= mmy+1; y++) {
1511. 	    	    	/* Is this a suitable spot? */
1512. 	    	    	if (isok(x, y) && !closed_door(x, y) &&
1513. 	    	    			!IS_ROCK(levl[x][y].typ) &&
1514. 	    	    			!IS_AIR(levl[x][y].typ) &&
1515. 	    	    			(((x == mmx) && (y == mmy)) ?
1516. 	    	    			    !otmp->blessed : !otmp->cursed) &&
1517. 					(x != u.ux || y != u.uy)) {
1518. 			    register struct obj *otmp2;
1519. 			    register struct monst *mtmp2;
1520. 
1521. 	    	    	    /* Make the object(s) */
1522. 	    	    	    otmp2 = mksobj(confused ? ROCK : BOULDER,
1523. 	    	    	    		FALSE, FALSE);
1524. 	    	    	    if (!otmp2) continue;  /* Shouldn't happen */
1525. 	    	    	    otmp2->quan = confused ? rn1(5,2) : 1;
1526. 	    	    	    otmp2->owt = weight(otmp2);
1527. 
1528. 	    	    	    /* Find the monster here (might be same as mtmp) */
1529. 	    	    	    mtmp2 = m_at(x, y);
1530. 	    	    	    if (mtmp2 && !amorphous(mtmp2->data) &&
1531. 	    	    	    		!passes_walls(mtmp2->data) &&
1532. 	    	    	    		!noncorporeal(mtmp2->data) &&
1533. 	    	    	    		!unsolid(mtmp2->data)) {
1534. 				struct obj *helmet = which_armor(mtmp2, W_ARMH);
1535. 				int mdmg;
1536. 
1537. 				if (cansee(mtmp2->mx, mtmp2->my)) {
1538. 				    pline("%s is hit by %s!", Monnam(mtmp2),
1539. 	    	    	    			doname(otmp2));
1540. 				    if (mtmp2->minvis && !canspotmon(mtmp2))
1541. 					map_invisible(mtmp2->mx, mtmp2->my);
1542. 				}
1543. 	    	    	    	mdmg = dmgval(otmp2, mtmp2) * otmp2->quan;
1544. 				if (helmet) {
1545. 				    if(is_metallic(helmet)) {
1546. 					if (canspotmon(mtmp2))
1547. 					    pline("Fortunately, %s is wearing a hard helmet.", mon_nam(mtmp2));
1548. 					else if (flags.soundok)
1549. 					    You_hear("a clanging sound.");
1550. 					if (mdmg > 2) mdmg = 2;
1551. 				    } else {
1552. 					if (canspotmon(mtmp2))
1553. 					    pline("%s's %s does not protect %s.",
1554. 						Monnam(mtmp2), xname(helmet),
1555. 						mhim(mtmp2));
1556. 				    }
1557. 				}
1558. 	    	    	    	mtmp2->mhp -= mdmg;
1559. 	    	    	    	if (mtmp2->mhp <= 0) {
1560. 				    pline("%s is killed.", Monnam(mtmp2));
1561. 	    	    	    	    mondied(mtmp2);
1562. 				}
1563. 	    	    	    }
1564. 	    	    	    /* Drop the rock/boulder to the floor */
1565. 	    	    	    if (!flooreffects(otmp2, x, y, "fall")) {
1566. 	    	    	    	place_object(otmp2, x, y);
1567. 	    	    	    	stackobj(otmp2);
1568. 	    	    	    	newsym(x, y);  /* map the rock */
1569. 	    	    	    }
1570. 	    	    	}
1571. 		    }
1572. 		}
1573. 		m_useup(mtmp, otmp);
1574. 		/* Attack the player */
1575. 		if (distmin(mmx, mmy, u.ux, u.uy) == 1 && !otmp->cursed) {
1576. 		    int dmg;
1577. 		    struct obj *otmp2;
1578. 
1579. 		    /* Okay, _you_ write this without repeating the code */
1580. 		    otmp2 = mksobj(confused ? ROCK : BOULDER,
1581. 				FALSE, FALSE);
1582. 		    if (!otmp2) goto xxx_noobj;  /* Shouldn't happen */
1583. 		    otmp2->quan = confused ? rn1(5,2) : 1;
1584. 		    otmp2->owt = weight(otmp2);
1585. 		    if (!amorphous(youmonst.data) &&
1586. 			    !Passes_walls &&
1587. 			    !noncorporeal(youmonst.data) &&
1588. 			    !unsolid(youmonst.data)) {
1589. 			You("are hit by %s!", doname(otmp2));
1590. 			dmg = dmgval(otmp2, &youmonst) * otmp2->quan;
1591. 			if (uarmh) {
1592. 			    if(is_metallic(uarmh)) {
1593. 				pline("Fortunately, you are wearing a hard helmet.");
1594. 				if (dmg > 2) dmg = 2;
1595. 			    } else if (flags.verbose) {
1596. 				Your("%s does not protect you.",
1597. 						xname(uarmh));
1598. 			    }
1599. 			}
1600. 		    } else
1601. 			dmg = 0;
1602. 		    if (!flooreffects(otmp2, u.ux, u.uy, "fall")) {
1603. 			place_object(otmp2, u.ux, u.uy);
1604. 			stackobj(otmp2);
1605. 			newsym(u.ux, u.uy);
1606. 		    }
1607. 		    if (dmg) losehp(dmg, "scroll of earth", KILLED_BY_AN);
1608. 		}
1609. 	    xxx_noobj:
1610. 
1611. 		return (mtmp->mhp <= 0) ? 1 : 2;
1612. 	    }
1613. #if 0
1614. 	case MUSE_SCR_FIRE:
1615. 	      {
1616. 		boolean vis = cansee(mtmp->mx, mtmp->my);
1617. 
1618. 		mreadmsg(mtmp, otmp);
1619. 		if (mtmp->mconf) {
1620. 			if (vis)
1621. 			    pline("Oh, what a pretty fire!");
1622. 		} else {
1623. 			struct monst *mtmp2;
1624. 			int num;
1625. 
1626. 			if (vis)
1627. 			    pline_The("scroll erupts in a tower of flame!");
1628. 			shieldeff(mtmp->mx, mtmp->my);
1629. 			pline("%s is uninjured.", Monnam(mtmp));
1630. 			(void) destroy_mitem(mtmp, SCROLL_CLASS, AD_FIRE);
1631. 			(void) destroy_mitem(mtmp, SPBOOK_CLASS, AD_FIRE);
1632. 			(void) destroy_mitem(mtmp, POTION_CLASS, AD_FIRE);
1633. 			num = (2*(rn1(3, 3) + 2 * bcsign(otmp)) + 1)/3;
1634. 			if (Slimed) {
1635. 			      Your("slimy parts are burned away!");
1636. 			      Slimed = 0;
1637. 			}
1638. 			if (Fire_resistance)
1639. 			    You("are not harmed.");
1640. 			burn_away_slime();
1641. 			if (Half_spell_damage) num = (num+1) / 2;
1642. 			else losehp(num, "scroll of fire", KILLED_BY_AN);
1643. 			for(mtmp2 = fmon; mtmp2; mtmp2 = mtmp2->nmon) {
1644. 			   if(DEADMONSTER(mtmp2)) continue;
1645. 			   if(mtmp == mtmp2) continue;
1646. 			   if(dist2(mtmp2->mx,mtmp2->my,mtmp->mx,mtmp->my) < 3){
1647. 				if (resists_fire(mtmp2)) continue;
1648. 				mtmp2->mhp -= num;
1649. 				if (resists_cold(mtmp2))
1650. 				    mtmp2->mhp -= 3*num;
1651. 				if(mtmp2->mhp < 1) {
1652. 				    mondied(mtmp2);
1653. 				    break;
1654. 				}
1655. 			    }
1656. 			}
1657. 		}
1658. 		return 2;
1659. 	      }
1660. #endif	/* 0 */
1661. 	case MUSE_POT_PARALYSIS:
1662. 	case MUSE_POT_BLINDNESS:
1663. 	case MUSE_POT_CONFUSION:
1664. 	case MUSE_POT_SLEEPING:
1665. 	case MUSE_POT_ACID:
1666. 	case MUSE_POT_AMNESIA:
1667. 		/* Note: this setting of dknown doesn't suffice.  A monster
1668. 		 * which is out of sight might throw and it hits something _in_
1669. 		 * sight, a problem not existing with wands because wand rays
1670. 		 * are not objects.  Also set dknown in mthrowu.c.
1671. 		 */
1672. 		if (cansee(mtmp->mx, mtmp->my)) {
1673. 			otmp->dknown = 1;
1674. 			pline("%s hurls %s!", Monnam(mtmp),
1675. 						singular(otmp, doname));
1676. 		}
1677. 		m_throw(mtmp, mtmp->mx, mtmp->my, sgn(mtmp->mux-mtmp->mx),
1678. 			sgn(mtmp->muy-mtmp->my),
1679. 			distmin(mtmp->mx,mtmp->my,mtmp->mux,mtmp->muy), otmp);
1680. 		return 2;
1681. 	case 0: return 0; /* i.e. an exploded wand */
1682. 	default: impossible("%s wanted to perform action %d?", Monnam(mtmp),
1683. 			m.has_offense);
1684. 		break;
1685. 	}
1686. 	return 0;
1687. }
1688. 
1689. int
1690. rnd_offensive_item(mtmp)
1691. struct monst *mtmp;
1692. {
1693. 	struct permonst *pm = mtmp->data;
1694. 	int difficulty = monstr[(monsndx(pm))];
1695. 
1696. 	if(is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data)
1697. 			|| pm->mlet == S_GHOST
1698. # ifdef KOPS
1699. 			|| pm->mlet == S_KOP
1700. # endif
1701. 		) return 0;
1702. 	if (difficulty > 7 && !rn2(35)) return WAN_DEATH;
1703. 	if (difficulty > 6 && !rn2(25)) return WAN_FIREBALL;
1704. 	switch (rn2(9 - (difficulty < 4) + 4 * (difficulty > 6))) {
1705. 
1706. 		case 0: {
1707. 		    struct obj *helmet = which_armor(mtmp, W_ARMH);
1708. 
1709. 		    if ((helmet && is_metallic(helmet)) || amorphous(pm) || passes_walls(pm) || noncorporeal(pm) || unsolid(pm))
1710. 			return SCR_EARTH;
1711. 		} /* fall through */
1712. 		case 1: return WAN_STRIKING;
1713. 		case 2: return POT_ACID;
1714. 		case 3: return POT_CONFUSION;
1715. 		case 4: return POT_BLINDNESS;
1716. 		case 5: return POT_SLEEPING;
1717. 		case 6: return POT_PARALYSIS;
1718. 		case 7: return WAN_MAGIC_MISSILE;
1719. 		case 8: return WAN_SLEEP;
1720. 		case 9: return WAN_FIRE;
1721. 		case 10: return WAN_COLD;
1722. 		case 11: return WAN_LIGHTNING;
1723. 		case 12: return WAN_DRAINING;
1724. 	}
1725. 	/*NOTREACHED*/
1726. 	return 0;
1727. }
1728. 
1729. #define MUSE_POT_GAIN_LEVEL 1
1730. #define MUSE_WAN_MAKE_INVISIBLE 2
1731. #define MUSE_POT_INVISIBILITY 3
1732. #define MUSE_POLY_TRAP 4
1733. #define MUSE_WAN_POLYMORPH 5
1734. #define MUSE_POT_SPEED 6
1735. #define MUSE_WAN_SPEED_MONSTER 7
1736. #define MUSE_BULLWHIP 8
1737. #define MUSE_POT_POLYMORPH 9
1738. 
1739. boolean
1740. find_misc(mtmp)
1741. struct monst *mtmp;
1742. {
1743. 	register struct obj *obj;
1744. 	struct permonst *mdat = mtmp->data;
1745. 	int x = mtmp->mx, y = mtmp->my;
1746. 	struct trap *t;
1747. 	int xx, yy;
1748. #ifdef STEED
1749. 	boolean immobile = (mdat->mmove == 0 || mtmp == u.usteed);
1750. #else
1751. 	boolean immobile = (mdat->mmove == 0);
1752. #endif
1753. 	boolean stuck = (mtmp == u.ustuck);
1754. 
1755. 	m.misc = (struct obj *)0;
1756. 	m.has_misc = 0;
1757. 	if (is_animal(mdat) || mindless(mdat))
1758. 		return 0;
1759. 	if (u.uswallow && stuck) return FALSE;
1760. 
1761. 	/* We arbitrarily limit to times when a player is nearby for the
1762. 	 * same reason as Junior Pac-Man doesn't have energizers eaten until
1763. 	 * you can see them...
1764. 	 */
1765. 	if(dist2(x, y, mtmp->mux, mtmp->muy) > 36)
1766. 		return FALSE;
1767. 
1768. 	if (!stuck && !immobile && !mtmp->cham && monstr[monsndx(mdat)] < 6) {
1769. 	  boolean ignore_boulders = (verysmall(mdat) ||
1770. 				     throws_rocks(mdat) ||
1771. 				     passes_walls(mdat));
1772. 	  for(xx = x-1; xx <= x+1; xx++)
1773. 	    for(yy = y-1; yy <= y+1; yy++)
1774. 		if (isok(xx,yy) && (xx != u.ux || yy != u.uy))
1775. 		    if (mdat != &mons[PM_GRID_BUG] || xx == x || yy == y)
1776. 			if (/* (xx==x && yy==y) || */ !level.monsters[xx][yy])
1777. 			    if ((t = t_at(xx, yy)) != 0 &&
1778. 			      (ignore_boulders || !sobj_at(BOULDER, xx, yy))
1779. 			      && !onscary(xx, yy, mtmp)) {
1780. 				if (t->ttyp == POLY_TRAP) {
1781. 				    trapx = xx;
1782. 				    trapy = yy;
1783. 				    m.has_misc = MUSE_POLY_TRAP;
1784. 				    return TRUE;
1785. 				}
1786. 			    }
1787. 	}
1788. 	if (nohands(mdat))
1789. 		return 0;
1790. 
1791. #define nomore(x) if(m.has_misc==x) continue;
1792. 	for(obj=mtmp->minvent; obj; obj=obj->nobj) {
1793. 		/* Monsters shouldn't recognize cursed items; this kludge is */
1794. 		/* necessary to prevent serious problems though... */
1795. 		if(obj->otyp == POT_GAIN_LEVEL && (!obj->cursed ||
1796. 			    (!mtmp->isgd && !mtmp->isshk && !mtmp->ispriest))) {
1797. 			m.misc = obj;
1798. 			m.has_misc = MUSE_POT_GAIN_LEVEL;
1799. 		}
1800. 		nomore(MUSE_BULLWHIP);
1801. /*  WAC kludge here so monsters don't attempt to grab cursed weapon */
1802. 		if(obj->otyp == BULLWHIP && (MON_WEP(mtmp) == obj) &&
1803. 		   distu(mtmp->mx,mtmp->my)==1 && uwep && !uwep->cursed &&
1804. 		   !mtmp->mpeaceful) {
1805. 			m.misc = obj;
1806. 			m.has_misc = MUSE_BULLWHIP;
1807. 		}
1808. 		/* Note: peaceful/tame monsters won't make themselves
1809. 		 * invisible unless you can see them.  Not really right, but...
1810. 		 */
1811. 		nomore(MUSE_WAN_MAKE_INVISIBLE);
1812. 		if(obj->otyp == WAN_MAKE_INVISIBLE && obj->spe > 0 &&
1813. 		    !mtmp->minvis && !mtmp->invis_blkd &&
1814. 		    (!mtmp->mpeaceful || See_invisible) &&
1815. 		    (!attacktype(mtmp->data, AT_GAZE) || mtmp->mcan)) {
1816. 			m.misc = obj;
1817. 			m.has_misc = MUSE_WAN_MAKE_INVISIBLE;
1818. 		}
1819. 		nomore(MUSE_POT_INVISIBILITY);
1820. 		if(obj->otyp == POT_INVISIBILITY &&
1821. 		    !mtmp->minvis && !mtmp->invis_blkd &&
1822. 		    (!mtmp->mpeaceful || See_invisible) &&
1823. 		    (!attacktype(mtmp->data, AT_GAZE) || mtmp->mcan)) {
1824. 			m.misc = obj;
1825. 			m.has_misc = MUSE_POT_INVISIBILITY;
1826. 		}
1827. 		nomore(MUSE_WAN_SPEED_MONSTER);
1828. 		if(obj->otyp == WAN_SPEED_MONSTER && obj->spe > 0
1829. 				&& mtmp->mspeed != MFAST && !mtmp->isgd) {
1830. 			m.misc = obj;
1831. 			m.has_misc = MUSE_WAN_SPEED_MONSTER;
1832. 		}
1833. 		nomore(MUSE_POT_SPEED);
1834. 		if(obj->otyp == POT_SPEED && mtmp->mspeed != MFAST
1835. 							&& !mtmp->isgd) {
1836. 			m.misc = obj;
1837. 			m.has_misc = MUSE_POT_SPEED;
1838. 		}
1839. 		nomore(MUSE_WAN_POLYMORPH);
1840. 		if(obj->otyp == WAN_POLYMORPH && obj->spe > 0 && !mtmp->cham
1841. 				&& monstr[monsndx(mdat)] < 6) {
1842. 			m.misc = obj;
1843. 			m.has_misc = MUSE_WAN_POLYMORPH;
1844. 		}
1845. 		nomore(MUSE_POT_POLYMORPH);
1846. 		if(obj->otyp == POT_POLYMORPH && !mtmp->cham
1847. 				&& monstr[monsndx(mdat)] < 6) {
1848. 			m.misc = obj;
1849. 			m.has_misc = MUSE_POT_POLYMORPH;
1850. 		}
1851. 	}
1852. 	return((boolean)(!!m.has_misc));
1853. #undef nomore
1854. }
1855. 
1856. #if 0
1857. /* type of monster to polymorph into; defaults to one suitable for the
1858.    current level rather than the totally arbitrary choice of newcham() */
1859. static struct permonst *
1860. muse_newcham_mon(mon)
1861. struct monst *mon;
1862. {
1863. 	struct obj *m_armr;
1864. 
1865. 	if ((m_armr = which_armor(mon, W_ARM)) != 0) {
1866. 	    if (Is_dragon_scales(m_armr))
1867. 		return Dragon_scales_to_pm(m_armr);
1868. 	    else if (Is_dragon_mail(m_armr))
1869. 		return Dragon_mail_to_pm(m_armr);
1870. 	}
1871. 	return rndmonst();
1872. }
1873. #endif
1874. 
1875. int
1876. use_misc(mtmp)
1877. struct monst *mtmp;
1878. {
1879. 	int i;
1880. 	struct obj *otmp = m.misc;
1881. 	boolean vis, vismon, oseen;
1882. 	char nambuf[BUFSZ];
1883. 
1884. 	if ((i = precheck(mtmp, otmp)) != 0) return i;
1885. 	vis = cansee(mtmp->mx, mtmp->my);
1886. 	vismon = canseemon(mtmp);
1887. 	oseen = otmp && vismon;
1888. 
1889. 	switch(m.has_misc) {
1890. 	case MUSE_POT_GAIN_LEVEL:
1891. 		mquaffmsg(mtmp, otmp);
1892. 		if (otmp->cursed) {
1893. 		    if (Can_rise_up(mtmp->mx, mtmp->my, &u.uz)) {
1894. 			register int tolev = depth(&u.uz)-1;
1895. 			d_level tolevel;
1896. 
1897. 			get_level(&tolevel, tolev);
1898. 			/* insurance against future changes... */
1899. 			if(on_level(&tolevel, &u.uz)) goto skipmsg;
1900. 			if (vismon) {
1901. 			    pline("%s rises up, through the %s!",
1902. 				  Monnam(mtmp), ceiling(mtmp->mx, mtmp->my));
1903. 			    if(!objects[POT_GAIN_LEVEL].oc_name_known
1904. 			      && !objects[POT_GAIN_LEVEL].oc_uname)
1905. 				docall(otmp);
1906. 			}
1907. 			m_useup(mtmp, otmp);
1908. 			migrate_to_level(mtmp, ledger_no(&tolevel),
1909. 					 MIGR_RANDOM, (coord *)0);
1910. 			return 2;
1911. 		    } else {
1912. skipmsg:
1913. 			if (vismon) {
1914. 			    pline("%s looks uneasy.", Monnam(mtmp));
1915. 			    if(!objects[POT_GAIN_LEVEL].oc_name_known
1916. 			      && !objects[POT_GAIN_LEVEL].oc_uname)
1917. 				docall(otmp);
1918. 			}
1919. 			m_useup(mtmp, otmp);
1920. 			return 2;
1921. 		    }
1922. 		}
1923. 		if (vismon) pline("%s seems more experienced.", Monnam(mtmp));
1924. 		if (oseen) makeknown(POT_GAIN_LEVEL);
1925. 		m_useup(mtmp, otmp);
1926. 		if (!grow_up(mtmp,(struct monst *)0)) return 1;
1927. 			/* grew into genocided monster */
1928. 		return 2;
1929. 	case MUSE_WAN_MAKE_INVISIBLE:
1930. 	case MUSE_POT_INVISIBILITY:
1931. 		if (otmp->otyp == WAN_MAKE_INVISIBLE) {
1932. 		    mzapmsg(mtmp, otmp, TRUE);
1933. 		    otmp->spe--;
1934. 		} else
1935. 		    mquaffmsg(mtmp, otmp);
1936. 		/* format monster's name before altering its visibility */
1937. 		Strcpy(nambuf, See_invisible ? Monnam(mtmp) : mon_nam(mtmp));
1938. 		mon_set_minvis(mtmp);
1939. 		if (vismon && mtmp->minvis) {	/* was seen, now invisible */
1940. 		    if (See_invisible)
1941. 			pline("%s body takes on a %s transparency.",
1942. 			      s_suffix(nambuf),
1943. 			      Hallucination ? "normal" : "strange");
1944. 		    else
1945. 			pline("Suddenly you cannot see %s.", nambuf);
1946. 		    if (oseen) makeknown(otmp->otyp);
1947. 		}
1948. 		if (otmp->otyp == POT_INVISIBILITY) {
1949. 		    if (otmp->cursed) you_aggravate(mtmp);
1950. 		    m_useup(mtmp, otmp);
1951. 		}
1952. 		return 2;
1953. 	case MUSE_WAN_SPEED_MONSTER:
1954. 		mzapmsg(mtmp, otmp, TRUE);
1955. 		otmp->spe--;
1956. 		mon_adjust_speed(mtmp, 1, otmp);
1957. 		return 2;
1958. 	case MUSE_POT_SPEED:
1959. 		mquaffmsg(mtmp, otmp);
1960. 		/* note difference in potion effect due to substantially
1961. 		   different methods of maintaining speed ratings:
1962. 		   player's character becomes "very fast" temporarily;
1963. 		   monster becomes "one stage faster" permanently */
1964. 		mon_adjust_speed(mtmp, 1, otmp);
1965. 		m_useup(mtmp, otmp);
1966. 		return 2;
1967. 	case MUSE_WAN_POLYMORPH:
1968. 		mzapmsg(mtmp, otmp, TRUE);
1969. 		otmp->spe--;
1970. #if 0
1971. 		(void) newcham(mtmp, muse_newcham_mon(), TRUE, vismon);
1972. #else
1973. 		(void) mon_poly(mtmp, FALSE, "%s changes!");
1974. #endif
1975. 		if (oseen) makeknown(WAN_POLYMORPH);
1976. 		return 2;
1977. 	case MUSE_POT_POLYMORPH:
1978. 		mquaffmsg(mtmp, otmp);
1979. #if 0
1980. 		if (vismon) pline("%s suddenly mutates!", Monnam(mtmp));
1981. 		(void) newcham(mtmp, muse_newcham_mon(mtmp), FALSE, vismon);
1982. #else
1983. 		(void) mon_poly(mtmp, FALSE, "%s suddenly mutates!");
1984. #endif
1985. 		if (oseen) makeknown(POT_POLYMORPH);
1986. 		m_useup(mtmp, otmp);
1987. 		return 2;
1988. 	case MUSE_POLY_TRAP:
1989. 		if (vismon)
1990. 		    pline("%s deliberately %s onto a polymorph trap!",
1991. 			Monnam(mtmp),
1992. 			makeplural(locomotion(mtmp->data, "jump")));
1993. 		if (vis) seetrap(t_at(trapx,trapy));
1994. 
1995. 		/*  don't use rloc() due to worms */
1996. 		remove_monster(mtmp->mx, mtmp->my);
1997. 		newsym(mtmp->mx, mtmp->my);
1998. 		place_monster(mtmp, trapx, trapy);
1999. 		if (mtmp->wormno) worm_move(mtmp);
2000. 		newsym(trapx, trapy);
2001. 
2002. #if 0
2003. 		(void) newcham(mtmp, (struct permonst *)0, FALSE, vismon);
2004. #else
2005. 		(void) mon_poly(mtmp, FALSE, "%s changes!");
2006. #endif
2007. 		return 2;
2008. 	case MUSE_BULLWHIP:
2009. 		/* attempt to disarm hero */
2010. 		if (uwep && !rn2(5)) {
2011. 		    const char *The_whip = vismon ? "The bullwhip" : "A whip";
2012. 		    int where_to = rn2(4);
2013. 		    struct obj *obj = uwep;
2014. 		    const char *hand;
2015. 		    char the_weapon[BUFSZ];
2016. 
2017. 		    Strcpy(the_weapon, the(xname(obj)));
2018. 		    hand = body_part(HAND);
2019. 		    if (bimanual(obj)) hand = makeplural(hand);
2020. 
2021. 		    if (vismon)
2022. 			pline("%s flicks a bullwhip towards your %s!",
2023. 			      Monnam(mtmp), hand);
2024. 		    if (obj->otyp == HEAVY_IRON_BALL) {
2025. 			pline("%s fails to wrap around %s.",
2026. 			      The_whip, the_weapon);
2027. 			return 1;
2028. 		    }
2029. 		    pline("%s wraps around %s you're wielding!",
2030. 			  The_whip, the_weapon);
2031. 		    if (welded(obj)) {
2032. 			pline("%s welded to your %s%c",
2033. 			      !is_plural(obj) ? "It is" : "They are",
2034. 			      hand, !obj->bknown ? '!' : '.');
2035. 			/* obj->bknown = 1; */ /* welded() takes care of this */
2036. 			where_to = 0;
2037. 		    }
2038. 		    if (!where_to) {
2039. 			pline_The("whip slips free.");  /* not `The_whip' */
2040. 			return 1;
2041. 		    } else if (where_to == 3 && hates_silver(mtmp->data) &&
2042. 			    objects[obj->otyp].oc_material == SILVER) {
2043. 			/* this monster won't want to catch a silver
2044. 			   weapon; drop it at hero's feet instead */
2045. 			where_to = 2;
2046. 		    }
2047. 		    freeinv(obj);
2048. 		    uwepgone();
2049. 		    switch (where_to) {
2050. 			case 1:		/* onto floor beneath mon */
2051. 			    pline("%s yanks %s from your %s!", Monnam(mtmp),
2052. 				  the_weapon, hand);
2053. 			    place_object(obj, mtmp->mx, mtmp->my);
2054. 			    break;
2055. 			case 2:		/* onto floor beneath you */
2056. 			    pline("%s yanks %s to the %s!", Monnam(mtmp),
2057. 				  the_weapon, surface(u.ux, u.uy));
2058. 			    dropy(obj);
2059. 			    break;
2060. 			case 3:		/* into mon's inventory */
2061. 			    pline("%s snatches %s!", Monnam(mtmp),
2062. 				  the_weapon);
2063. 			    (void) mpickobj(mtmp,obj);
2064. 			    break;
2065. 		    }
2066. 		    return 1;
2067. 		}
2068. 		return 0;
2069. 	case 0: return 0; /* i.e. an exploded wand */
2070. 	default: impossible("%s wanted to perform action %d?", Monnam(mtmp),
2071. 			m.has_misc);
2072. 		break;
2073. 	}
2074. 	return 0;
2075. }
2076. 
2077. STATIC_OVL void
2078. you_aggravate(mtmp)
2079. struct monst *mtmp;
2080. {
2081. 	pline("For some reason, %s presence is known to you.",
2082. 		s_suffix(noit_mon_nam(mtmp)));
2083. 	cls();
2084. #ifdef CLIPPING
2085. 	cliparound(mtmp->mx, mtmp->my);
2086. #endif
2087. 	show_glyph(mtmp->mx, mtmp->my, mon_to_glyph(mtmp));
2088. 	display_self();
2089. 	You_feel("aggravated at %s.", noit_mon_nam(mtmp));
2090. 	display_nhwindow(WIN_MAP, TRUE);
2091. 	docrt();
2092. 	if (unconscious()) {
2093. 		multi = -1;
2094. 		nomovemsg =
2095. 		      "Aggravated, you are jolted into full consciousness.";
2096. 	}
2097. 	newsym(mtmp->mx,mtmp->my);
2098. 	if (!canspotmon(mtmp))
2099. 	    map_invisible(mtmp->mx, mtmp->my);
2100. }
2101. 
2102. int
2103. rnd_misc_item(mtmp)
2104. struct monst *mtmp;
2105. {
2106. 	struct permonst *pm = mtmp->data;
2107. 	int difficulty = monstr[(monsndx(pm))];
2108. 
2109. 	if(is_animal(pm) || attacktype(pm, AT_EXPL) || mindless(mtmp->data)
2110. 			|| pm->mlet == S_GHOST
2111. # ifdef KOPS
2112. 			|| pm->mlet == S_KOP
2113. # endif
2114. 		) return 0;
2115. 	/* Unlike other rnd_item functions, we only allow _weak_ monsters
2116. 	 * to have this item; after all, the item will be used to strengthen
2117. 	 * the monster and strong monsters won't use it at all...
2118. 	 */
2119. 	if (difficulty < 6 && !rn2(30))
2120. 	    return rn2(6) ? POT_POLYMORPH : WAN_POLYMORPH;
2121. 
2122. 	if (!rn2(40) && !nonliving(pm)) return AMULET_OF_LIFE_SAVING;
2123. 
2124. 	switch (rn2(3)) {
2125. 		case 0:
2126. 			if (mtmp->isgd) return 0;
2127. 			return rn2(6) ? POT_SPEED : WAN_SPEED_MONSTER;
2128. 		case 1:
2129. 			if (mtmp->mpeaceful && !See_invisible) return 0;
2130. 			return rn2(6) ? POT_INVISIBILITY : WAN_MAKE_INVISIBLE;
2131. 		case 2:
2132. 			return POT_GAIN_LEVEL;
2133. 	}
2134. 	/*NOTREACHED*/
2135. 	return 0;
2136. }
2137. 
2138. boolean
2139. searches_for_item(mon, obj)
2140. struct monst *mon;
2141. struct obj *obj;
2142. {
2143. 	int typ = obj->otyp;
2144. 
2145. 	if (is_animal(mon->data) ||
2146. 		mindless(mon->data) ||
2147. 		mon->data == &mons[PM_GHOST])	/* don't loot bones piles */
2148. 	    return FALSE;
2149. 
2150. 	if (typ == WAN_MAKE_INVISIBLE || typ == POT_INVISIBILITY)
2151. 	    return (boolean)(!mon->minvis && !mon->invis_blkd && !attacktype(mon->data, AT_GAZE));
2152. 	if (typ == WAN_SPEED_MONSTER || typ == POT_SPEED)
2153. 	    return (boolean)(mon->mspeed != MFAST);
2154. 
2155. 	switch (obj->oclass) {
2156. 	case WAND_CLASS:
2157. 	    if (obj->spe <= 0)
2158. 		return FALSE;
2159. 	    if (typ == WAN_DIGGING)
2160. 		return (boolean)(!is_floater(mon->data));
2161. 	    if (typ == WAN_POLYMORPH)
2162. 		return (boolean)(monstr[monsndx(mon->data)] < 6);
2163. 	    if (objects[typ].oc_dir == RAY ||
2164. 		    typ == WAN_STRIKING ||
2165. 		    typ == WAN_TELEPORTATION ||
2166. 		    typ == WAN_CREATE_MONSTER ||
2167. 		    typ == WAN_CREATE_HORDE ||
2168. 		    typ == WAN_DRAINING	||
2169. 		    typ == WAN_HEALING ||
2170. 		    typ == WAN_EXTRA_HEALING ||
2171. 		    typ == WAN_CANCELLATION)
2172. 		return TRUE;
2173. 	    break;
2174. 	case POTION_CLASS:
2175. 	    if (typ == POT_VAMPIRE_BLOOD)
2176. 		return is_vampire(mon->data);
2177. 	    if (typ == POT_HEALING ||
2178. 		    typ == POT_EXTRA_HEALING ||
2179. 		    typ == POT_FULL_HEALING ||
2180. 		    typ == POT_POLYMORPH ||
2181. 		    typ == POT_GAIN_LEVEL ||
2182. 		    typ == POT_PARALYSIS ||
2183. 		    typ == POT_SLEEPING ||
2184. 		    typ == POT_ACID ||
2185. 		    typ == POT_CONFUSION ||
2186. 		    typ == POT_AMNESIA)
2187. 		return TRUE;
2188. 	    if (typ == POT_BLINDNESS && !attacktype(mon->data, AT_GAZE))
2189. 		return TRUE;
2190. 	    break;
2191. 	case SCROLL_CLASS:
2192. 	    if (typ == SCR_TELEPORTATION || typ == SCR_CREATE_MONSTER
2193. 		    || typ == SCR_EARTH)
2194. 		return TRUE;
2195. 	    break;
2196. 	case AMULET_CLASS:
2197. 	    if (typ == AMULET_OF_LIFE_SAVING)
2198. 		return (boolean)(!nonliving(mon->data));
2199. 	    if (typ == AMULET_OF_REFLECTION)
2200. 		return TRUE;
2201. 	    break;
2202. 	case TOOL_CLASS:
2203. 	    if (typ == PICK_AXE)
2204. 		return (boolean)needspick(mon->data);
2205. 	    if (typ == UNICORN_HORN)
2206. 		return (boolean)(!obj->cursed && !is_unicorn(mon->data));
2207. 	    if (typ == FROST_HORN || typ == FIRE_HORN)
2208. 		return (obj->spe > 0);
2209. 	    if (is_weptool(obj))
2210. 	    	return (boolean)likes_objs(mon->data);
2211. 	    break;
2212. 	case FOOD_CLASS:
2213. 	    if (typ == CORPSE)
2214. 		return (boolean)(((mon->misc_worn_check & W_ARMG) &&
2215. 				    touch_petrifies(&mons[obj->corpsenm])) ||
2216. 				(!resists_ston(mon) &&
2217. 				    (obj->corpsenm == PM_LIZARD ||
2218. 					(acidic(&mons[obj->corpsenm]) &&
2219. 					 obj->corpsenm != PM_GREEN_SLIME))));
2220. 	    if (typ == EGG)
2221. 		return (boolean)(touch_petrifies(&mons[obj->corpsenm]));
2222. 	    break;
2223. 	default:
2224. 	    break;
2225. 	}
2226. 
2227. 	return FALSE;
2228. }
2229. 
2230. boolean
2231. mon_reflects(mon,str)
2232. struct monst *mon;
2233. const char *str;
2234. {
2235. 	struct obj *orefl = which_armor(mon, W_ARMS);
2236. 
2237. 	if (orefl && orefl->otyp == SHIELD_OF_REFLECTION) {
2238. 	    if (str) {
2239. 		pline(str, s_suffix(mon_nam(mon)), "shield");
2240. 		makeknown(SHIELD_OF_REFLECTION);
2241. 	    }
2242. 	    return TRUE;
2243. 	} else if (arti_reflects(MON_WEP(mon))) {
2244. 	    /* due to wielded artifact weapon */
2245. 	    if (str)
2246. 		pline(str, s_suffix(mon_nam(mon)), "weapon");
2247. 	    return TRUE;
2248. 	} else if ((orefl = which_armor(mon, W_AMUL)) &&
2249. 				orefl->otyp == AMULET_OF_REFLECTION) {
2250. 	    if (str) {
2251. 		pline(str, s_suffix(mon_nam(mon)), "amulet");
2252. 		makeknown(AMULET_OF_REFLECTION);
2253. 	    }
2254. 	    return TRUE;
2255. 	} else if (mon->data == &mons[PM_NIGHTMARE]) {
2256. 	    pline(str,s_suffix(mon_nam(mon)),"horn");
2257. 	    return TRUE;
2258. 	} else if ((orefl = which_armor(mon, W_ARM)) &&
2259. 		(orefl->otyp == SILVER_DRAGON_SCALES || orefl->otyp == SILVER_DRAGON_SCALE_MAIL)) {
2260. 	    if (str)
2261. 		pline(str, s_suffix(mon_nam(mon)), "armor");
2262. 	    return TRUE;
2263. 	} else if (mon->data == &mons[PM_SILVER_DRAGON] ||
2264. 		mon->data == &mons[PM_CHROMATIC_DRAGON]) {
2265. 	    /* Silver dragons only reflect when mature; babies do not */
2266. 	    if (str)
2267. 		pline(str, s_suffix(mon_nam(mon)), "scales");
2268. 	    return TRUE;
2269. 	} else if (mon->data == &mons[PM_DIAMOND_GOLEM]
2270. 	         || mon->data == &mons[PM_SAPPHIRE_GOLEM]
2271. 	         || mon->data == &mons[PM_CRYSTAL_GOLEM]) {
2272. 	    /* Some of the higher golems have intrinsic reflection */
2273. 	    if (str)
2274. 		pline(str, s_suffix(mon_nam(mon)), "body");
2275. 	    return TRUE;
2276. 	}
2277. 	return FALSE;
2278. }
2279. 
2280. boolean
2281. ureflects (fmt, str)
2282. const char *fmt, *str;
2283. {
2284. 	/* Check from outermost to innermost objects */
2285. 	if (EReflecting & W_ARMS) {
2286. 	    if (fmt && str) {
2287. 	    	pline(fmt, str, "shield");
2288. 	    	makeknown(SHIELD_OF_REFLECTION);
2289. 	    }
2290. 	    return TRUE;
2291. 	} else if (EReflecting & W_WEP) {
2292. 	    /* Due to wielded artifact weapon */
2293. 	    if (fmt && str)
2294. 	    	pline(fmt, str, "weapon");
2295. 	    return TRUE;
2296. 	} else if (EReflecting & W_AMUL) {
2297. 	    if (fmt && str) {
2298. 	    	pline(fmt, str, "medallion");
2299. 	    	makeknown(AMULET_OF_REFLECTION);
2300. 	    }
2301. 	    return TRUE;
2302. 	} else if (EReflecting & W_ARM) {
2303. 	    if (fmt && str)
2304. 	    	pline(fmt, str, "armor");
2305. 	    return TRUE;
2306. 	} else if (youmonst.data == &mons[PM_SILVER_DRAGON]) {
2307. 	    if (fmt && str)
2308. 	    	pline(fmt, str, "scales");
2309. 	    return TRUE;
2310. 	} else if (youmonst.data == &mons[PM_DIAMOND_GOLEM]
2311. 	         || youmonst.data == &mons[PM_SAPPHIRE_GOLEM]
2312. 	         || youmonst.data == &mons[PM_CRYSTAL_GOLEM]) {
2313. 	    if (fmt && str)
2314. 	    	pline(fmt, str, "body");
2315. 	    return TRUE;
2316. 	}
2317. 	return FALSE;
2318. }
2319. 
2320. 
2321. /* TRUE if the monster ate something */
2322. boolean
2323. munstone(mon, by_you)
2324. struct monst *mon;
2325. boolean by_you;
2326. {
2327. 	struct obj *obj;
2328. 
2329. 	if (resists_ston(mon)) return FALSE;
2330. 	if (mon->meating || !mon->mcanmove || mon->msleeping) return FALSE;
2331. 
2332. 	for(obj = mon->minvent; obj; obj = obj->nobj) {
2333. 	    /* Monsters can also use potions of acid */
2334. 	    if ((obj->otyp == POT_ACID) || (obj->otyp == CORPSE &&
2335. 	    		(obj->corpsenm == PM_LIZARD || (acidic(&mons[obj->corpsenm]) && obj->corpsenm != PM_GREEN_SLIME)))) {
2336. 		mon_consume_unstone(mon, obj, by_you, TRUE);
2337. 		return TRUE;
2338. 	    }
2339. 	}
2340. 	return FALSE;
2341. }
2342. 
2343. STATIC_OVL void
2344. mon_consume_unstone(mon, obj, by_you, stoning)
2345. struct monst *mon;
2346. struct obj *obj;
2347. boolean by_you;
2348. boolean stoning;
2349. {
2350.     int nutrit = (obj->otyp == CORPSE) ? dog_nutrition(mon, obj) : 0;
2351.     /* also sets meating */
2352. 
2353.     /* give a "<mon> is slowing down" message and also remove
2354.        intrinsic speed (comparable to similar effect on the hero) */
2355.     mon_adjust_speed(mon, -3, (struct obj *)0);
2356. 
2357.     if (canseemon(mon)) {
2358. 	long save_quan = obj->quan;
2359. 
2360. 	obj->quan = 1L;
2361. 	pline("%s %ss %s.", Monnam(mon),
2362. 		    (obj->otyp == POT_ACID) ? "quaff" : "eat",
2363. 		    distant_name(obj,doname));
2364. 	obj->quan = save_quan;
2365.     } else if (flags.soundok)
2366. 	You_hear("%s.", (obj->otyp == POT_ACID) ? "drinking" : "chewing");
2367.     m_useup(mon, obj);
2368.     if (((obj->otyp == POT_ACID) || acidic(&mons[obj->corpsenm])) &&
2369. 		    !resists_acid(mon)) {
2370. 	mon->mhp -= rnd(15);
2371. 	pline("%s has a very bad case of stomach acid.",
2372. 	    Monnam(mon));
2373.     }
2374.     if (mon->mhp <= 0) {
2375. 	pline("%s dies!", Monnam(mon));
2376. 	if (by_you) xkilled(mon, 0);
2377. 	else mondead(mon);
2378. 	return;
2379.     }
2380.     if (stoning && canseemon(mon)) {
2381. 	if (Hallucination)
2382.     pline("What a pity - %s just ruined a future piece of art!",
2383. 	    mon_nam(mon));
2384. 	else
2385. 	    pline("%s seems limber!", Monnam(mon));
2386.     }
2387.     if (obj->otyp == CORPSE && obj->corpsenm == PM_LIZARD && mon->mconf) {
2388. 	mon->mconf = 0;
2389. 	if (canseemon(mon))
2390. 	    pline("%s seems steadier now.", Monnam(mon));
2391.     }
2392.     if (mon->mtame && !mon->isminion && nutrit > 0) {
2393. 	struct edog *edog = EDOG(mon);
2394. 
2395. 	if (edog->hungrytime < monstermoves) edog->hungrytime = monstermoves;
2396. 	edog->hungrytime += nutrit;
2397. 	mon->mconf = 0;
2398.     }
2399.     mon->mlstmv = monstermoves; /* it takes a turn */
2400. }
2401. 
2402. /*muse.c*/

Also on Fandom

Random Wiki