Wikihack
Advertisement

Below is the full text to src/do_wear.c from NetHack 3.4.3. To link to a particular line, write [[do_wear.c#line123]], for example.

Top of file[]

1.    /*	SCCS Id: @(#)do_wear.c	3.4	2003/11/14	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #include "hack.h"
6.    
7.    #ifndef OVLB
8.    
9.    STATIC_DCL long takeoff_mask, taking_off;
10.   
11.   #else /* OVLB */
12.   
13.   STATIC_OVL NEARDATA long takeoff_mask = 0L;
14.   static NEARDATA long taking_off = 0L;
15.   
16.   static NEARDATA int todelay;
17.   static boolean cancelled_don = FALSE;
18.   
19.   static NEARDATA const char see_yourself[] = "see yourself";
20.   static NEARDATA const char unknown_type[] = "Unknown type of %s (%d)";
21.   static NEARDATA const char c_armor[]  = "armor",
22.   			   c_suit[]   = "suit",
23.   #ifdef TOURIST
24.   			   c_shirt[]  = "shirt",
25.   #endif
26.   			   c_cloak[]  = "cloak",
27.   			   c_gloves[] = "gloves",
28.   			   c_boots[]  = "boots",
29.   			   c_helmet[] = "helmet",
30.   			   c_shield[] = "shield",
31.   			   c_weapon[] = "weapon",
32.   			   c_sword[]  = "sword",
33.   			   c_axe[]    = "axe",
34.   			   c_that_[]  = "that";
35.   
36.   static NEARDATA const long takeoff_order[] = { WORN_BLINDF, W_WEP,
37.   	WORN_SHIELD, WORN_GLOVES, LEFT_RING, RIGHT_RING, WORN_CLOAK,
38.   	WORN_HELMET, WORN_AMUL, WORN_ARMOR,
39.   #ifdef TOURIST
40.   	WORN_SHIRT,
41.   #endif
42.   	WORN_BOOTS, W_SWAPWEP, W_QUIVER, 0L };
43.   
44.   STATIC_DCL void FDECL(on_msg, (struct obj *));
45.   STATIC_PTR int NDECL(Armor_on);
46.   STATIC_PTR int NDECL(Boots_on);
47.   STATIC_DCL int NDECL(Cloak_on);
48.   STATIC_PTR int NDECL(Helmet_on);
49.   STATIC_PTR int NDECL(Gloves_on);
50.   STATIC_PTR int NDECL(Shield_on);
51.   #ifdef TOURIST
52.   STATIC_PTR int NDECL(Shirt_on);
53.   #endif
54.   STATIC_DCL void NDECL(Amulet_on);
55.   STATIC_DCL void FDECL(Ring_off_or_gone, (struct obj *, BOOLEAN_P));
56.   STATIC_PTR int FDECL(select_off, (struct obj *));
57.   STATIC_DCL struct obj *NDECL(do_takeoff);
58.   STATIC_PTR int NDECL(take_off);
59.   STATIC_DCL int FDECL(menu_remarm, (int));
60.   STATIC_DCL void FDECL(already_wearing, (const char*));
61.   STATIC_DCL void FDECL(already_wearing2, (const char*, const char*));
62.   

off_msg[]

63.   void
64.   off_msg(otmp)
65.   register struct obj *otmp;
66.   {
67.   	if(flags.verbose)
68.   	    You("were wearing %s.", doname(otmp));
69.   }
70.   

on_msg[]

71.   /* for items that involve no delay */
72.   STATIC_OVL void
73.   on_msg(otmp)
74.   register struct obj *otmp;
75.   {
76.   	if (flags.verbose) {
77.   	    char how[BUFSZ];
78.   
79.   	    how[0] = '\0';
80.   	    if (otmp->otyp == TOWEL)
81.   		Sprintf(how, " around your %s", body_part(HEAD));
82.   	    You("are now wearing %s%s.",
83.   		obj_is_pname(otmp) ? the(xname(otmp)) : an(xname(otmp)),
84.   		how);
85.   	}
86.   }
87.   

Type_on/Type_off[]

88.   /*
89.    * The Type_on() functions should be called *after* setworn().
90.    * The Type_off() functions call setworn() themselves.
91.    */
92.   

Boots_on[]

93.   STATIC_PTR
94.   int
95.   Boots_on()
96.   {
97.       long oldprop =
98.   	u.uprops[objects[uarmf->otyp].oc_oprop].extrinsic & ~WORN_BOOTS;
99.   
100.      switch(uarmf->otyp) {
101.  	case LOW_BOOTS:
102.  	case IRON_SHOES:
103.  	case HIGH_BOOTS:
104.  	case JUMPING_BOOTS:
105.  	case KICKING_BOOTS:
106.  		break;
107.  	case WATER_WALKING_BOOTS:
108.  		if (u.uinwater) spoteffects(TRUE);
109.  		break;
110.  	case SPEED_BOOTS:
111.  		/* Speed boots are still better than intrinsic speed, */
112.  		/* though not better than potion speed */
113.  		if (!oldprop && !(HFast & TIMEOUT)) {
114.  			makeknown(uarmf->otyp);
115.  			You_feel("yourself speed up%s.",
116.  				(oldprop || HFast) ? " a bit more" : "");
117.  		}
118.  		break;
119.  	case ELVEN_BOOTS:
120.  		if (!oldprop && !HStealth && !BStealth) {
121.  			makeknown(uarmf->otyp);
122.  			You("walk very quietly.");
123.  		}
124.  		break;
125.  	case FUMBLE_BOOTS:
126.  		if (!oldprop && !(HFumbling & ~TIMEOUT))
127.  			incr_itimeout(&HFumbling, rnd(20));
128.  		break;
129.  	case LEVITATION_BOOTS:
130.  		if (!oldprop && !HLevitation) {
131.  			makeknown(uarmf->otyp);
132.  			float_up();
133.  			spoteffects(FALSE);
134.  		}
135.  		break;
136.  	default: impossible(unknown_type, c_boots, uarmf->otyp);
137.      }
138.      return 0;
139.  }
140.  

Boots_off[]

141.  int
142.  Boots_off()
143.  {
144.      int otyp = uarmf->otyp;
145.      long oldprop = u.uprops[objects[otyp].oc_oprop].extrinsic & ~WORN_BOOTS;
146.  
147.      takeoff_mask &= ~W_ARMF;
148.  	/* For levitation, float_down() returns if Levitation, so we
149.  	 * must do a setworn() _before_ the levitation case.
150.  	 */
151.      setworn((struct obj *)0, W_ARMF);
152.      switch (otyp) {
153.  	case SPEED_BOOTS:
154.  		if (!Very_fast && !cancelled_don) {
155.  			makeknown(otyp);
156.  			You_feel("yourself slow down%s.",
157.  				Fast ? " a bit" : "");
158.  		}
159.  		break;
160.  	case WATER_WALKING_BOOTS:
161.  		if (is_pool(u.ux,u.uy) && !Levitation && !Flying &&
162.  		    !is_clinger(youmonst.data) && !cancelled_don) {
163.  			makeknown(otyp);
164.  			/* make boots known in case you survive the drowning */
165.  			spoteffects(TRUE);
166.  		}
167.  		break;
168.  	case ELVEN_BOOTS:
169.  		if (!oldprop && !HStealth && !BStealth && !cancelled_don) {
170.  			makeknown(otyp);
171.  			You("sure are noisy.");
172.  		}
173.  		break;
174.  	case FUMBLE_BOOTS:
175.  		if (!oldprop && !(HFumbling & ~TIMEOUT))
176.  			HFumbling = EFumbling = 0;
177.  		break;
178.  	case LEVITATION_BOOTS:
179.  		if (!oldprop && !HLevitation && !cancelled_don) {
180.  			(void) float_down(0L, 0L);
181.  			makeknown(otyp);
182.  		}
183.  		break;
184.  	case LOW_BOOTS:
185.  	case IRON_SHOES:
186.  	case HIGH_BOOTS:
187.  	case JUMPING_BOOTS:
188.  	case KICKING_BOOTS:
189.  		break;
190.  	default: impossible(unknown_type, c_boots, otyp);
191.      }
192.      cancelled_don = FALSE;
193.      return 0;
194.  }
195.  

Cloak_on[]

196.  STATIC_OVL int
197.  Cloak_on()
198.  {
199.      long oldprop =
200.  	u.uprops[objects[uarmc->otyp].oc_oprop].extrinsic & ~WORN_CLOAK;
201.  
202.      switch(uarmc->otyp) {
203.  	case ELVEN_CLOAK:
204.  	case CLOAK_OF_PROTECTION:
205.  	case CLOAK_OF_DISPLACEMENT:
206.  		makeknown(uarmc->otyp);
207.  		break;
208.  	case ORCISH_CLOAK:
209.  	case DWARVISH_CLOAK:
210.  	case CLOAK_OF_MAGIC_RESISTANCE:
211.  	case ROBE:
212.  	case LEATHER_CLOAK:
213.  		break;
214.  	case MUMMY_WRAPPING:
215.  		/* Note: it's already being worn, so we have to cheat here. */
216.  		if ((HInvis || EInvis || pm_invisible(youmonst.data)) && !Blind) {
217.  		    newsym(u.ux,u.uy);
218.  		    You("can %s!",
219.  			See_invisible ? "no longer see through yourself"
220.  			: see_yourself);
221.  		}
222.  		break;
223.  	case CLOAK_OF_INVISIBILITY:
224.  		/* since cloak of invisibility was worn, we know mummy wrapping
225.  		   wasn't, so no need to check `oldprop' against blocked */
226.  		if (!oldprop && !HInvis && !Blind) {
227.  		    makeknown(uarmc->otyp);
228.  		    newsym(u.ux,u.uy);
229.  		    pline("Suddenly you can%s yourself.",
230.  			See_invisible ? " see through" : "not see");
231.  		}
232.  		break;
233.  	case OILSKIN_CLOAK:
234.  		pline("%s very tightly.", Tobjnam(uarmc, "fit"));
235.  		break;
236.  	/* Alchemy smock gives poison _and_ acid resistance */
237.  	case ALCHEMY_SMOCK:
238.  		EAcid_resistance |= WORN_CLOAK;
239.    		break;
240.  	default: impossible(unknown_type, c_cloak, uarmc->otyp);
241.      }
242.      return 0;
243.  }
244.  

Cloak_off[]

245.  int
246.  Cloak_off()
247.  {
248.      int otyp = uarmc->otyp;
249.      long oldprop = u.uprops[objects[otyp].oc_oprop].extrinsic & ~WORN_CLOAK;
250.  
251.      takeoff_mask &= ~W_ARMC;
252.  	/* For mummy wrapping, taking it off first resets `Invisible'. */
253.      setworn((struct obj *)0, W_ARMC);
254.      switch (otyp) {
255.  	case ELVEN_CLOAK:
256.  	case ORCISH_CLOAK:
257.  	case DWARVISH_CLOAK:
258.  	case CLOAK_OF_PROTECTION:
259.  	case CLOAK_OF_MAGIC_RESISTANCE:
260.  	case CLOAK_OF_DISPLACEMENT:
261.  	case OILSKIN_CLOAK:
262.  	case ROBE:
263.  	case LEATHER_CLOAK:
264.  		break;
265.  	case MUMMY_WRAPPING:
266.  		if (Invis && !Blind) {
267.  		    newsym(u.ux,u.uy);
268.  		    You("can %s.",
269.  			See_invisible ? "see through yourself"
270.  			: "no longer see yourself");
271.  		}
272.  		break;
273.  	case CLOAK_OF_INVISIBILITY:
274.  		if (!oldprop && !HInvis && !Blind) {
275.  		    makeknown(CLOAK_OF_INVISIBILITY);
276.  		    newsym(u.ux,u.uy);
277.  		    pline("Suddenly you can %s.",
278.  			See_invisible ? "no longer see through yourself"
279.  			: see_yourself);
280.  		}
281.  		break;
282.  	/* Alchemy smock gives poison _and_ acid resistance */
283.  	case ALCHEMY_SMOCK:
284.  		EAcid_resistance &= ~WORN_CLOAK;
285.    		break;
286.  	default: impossible(unknown_type, c_cloak, otyp);
287.      }
288.      return 0;
289.  }
290.  

Helmet_on[]

291.  STATIC_PTR
292.  int
293.  Helmet_on()
294.  {
295.      switch(uarmh->otyp) {
296.  	case FEDORA:
297.  	case HELMET:
298.  	case DENTED_POT:
299.  	case ELVEN_LEATHER_HELM:
300.  	case DWARVISH_IRON_HELM:
301.  	case ORCISH_HELM:
302.  	case HELM_OF_TELEPATHY:
303.  		break;
304.  	case HELM_OF_BRILLIANCE:
305.  		adj_abon(uarmh, uarmh->spe);
306.  		break;
307.  	case CORNUTHAUM:
308.  		/* people think marked wizards know what they're talking
309.  		 * about, but it takes trained arrogance to pull it off,
310.  		 * and the actual enchantment of the hat is irrelevant.
311.  		 */
312.  		ABON(A_CHA) += (Role_if(PM_WIZARD) ? 1 : -1);
313.  		flags.botl = 1;
314.  		makeknown(uarmh->otyp);
315.  		break;
316.  	case HELM_OF_OPPOSITE_ALIGNMENT:
317.  		if (u.ualign.type == A_NEUTRAL)
318.  		    u.ualign.type = rn2(2) ? A_CHAOTIC : A_LAWFUL;
319.  		else u.ualign.type = -(u.ualign.type);
320.  		u.ublessed = 0; /* lose your god's protection */
321.  	     /* makeknown(uarmh->otyp);   -- moved below, after xname() */
322.  		/*FALLTHRU*/
323.  	case DUNCE_CAP:
324.  		if (!uarmh->cursed) {
325.  		    if (Blind)
326.  			pline("%s for a moment.", Tobjnam(uarmh, "vibrate"));
327.  		    else
328.  			pline("%s %s for a moment.",
329.  			      Tobjnam(uarmh, "glow"), hcolor(NH_BLACK));
330.  		    curse(uarmh);
331.  		}
332.  		flags.botl = 1;		/* reveal new alignment or INT & WIS */
333.  		if (Hallucination) {
334.  		    pline("My brain hurts!"); /* Monty Python's Flying Circus */
335.  		} else if (uarmh->otyp == DUNCE_CAP) {
336.  		    You_feel("%s.",	/* track INT change; ignore WIS */
337.  		  ACURR(A_INT) <= (ABASE(A_INT) + ABON(A_INT) + ATEMP(A_INT)) ?
338.  			     "like sitting in a corner" : "giddy");
339.  		} else {
340.  		    Your("mind oscillates briefly.");
341.  		    makeknown(HELM_OF_OPPOSITE_ALIGNMENT);
342.  		}
343.  		break;
344.  	default: impossible(unknown_type, c_helmet, uarmh->otyp);
345.      }
346.      return 0;
347.  }
348.  

Helmet_off[]

349.  int
350.  Helmet_off()
351.  {
352.      takeoff_mask &= ~W_ARMH;
353.  
354.      switch(uarmh->otyp) {
355.  	case FEDORA:
356.  	case HELMET:
357.  	case DENTED_POT:
358.  	case ELVEN_LEATHER_HELM:
359.  	case DWARVISH_IRON_HELM:
360.  	case ORCISH_HELM:
361.  	    break;
362.  	case DUNCE_CAP:
363.  	    flags.botl = 1;
364.  	    break;
365.  	case CORNUTHAUM:
366.  	    if (!cancelled_don) {
367.  		ABON(A_CHA) += (Role_if(PM_WIZARD) ? -1 : 1);
368.  		flags.botl = 1;
369.  	    }
370.  	    break;
371.  	case HELM_OF_TELEPATHY:
372.  	    /* need to update ability before calling see_monsters() */
373.  	    setworn((struct obj *)0, W_ARMH);
374.  	    see_monsters();
375.  	    return 0;
376.  	case HELM_OF_BRILLIANCE:
377.  	    if (!cancelled_don) adj_abon(uarmh, -uarmh->spe);
378.  	    break;
379.  	case HELM_OF_OPPOSITE_ALIGNMENT:
380.  	    u.ualign.type = u.ualignbase[A_CURRENT];
381.  	    u.ublessed = 0; /* lose the other god's protection */
382.  	    flags.botl = 1;
383.  	    break;
384.  	default: impossible(unknown_type, c_helmet, uarmh->otyp);
385.      }
386.      setworn((struct obj *)0, W_ARMH);
387.      cancelled_don = FALSE;
388.      return 0;
389.  }
390.  

Gloves_on[]

391.  STATIC_PTR
392.  int
393.  Gloves_on()
394.  {
395.      long oldprop =
396.  	u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES;
397.  
398.      switch(uarmg->otyp) {
399.  	case LEATHER_GLOVES:
400.  		break;
401.  	case GAUNTLETS_OF_FUMBLING:
402.  		if (!oldprop && !(HFumbling & ~TIMEOUT))
403.  			incr_itimeout(&HFumbling, rnd(20));
404.  		break;
405.  	case GAUNTLETS_OF_POWER:
406.  		makeknown(uarmg->otyp);
407.  		flags.botl = 1; /* taken care of in attrib.c */
408.  		break;
409.  	case GAUNTLETS_OF_DEXTERITY:
410.  		adj_abon(uarmg, uarmg->spe);
411.  		break;
412.  	default: impossible(unknown_type, c_gloves, uarmg->otyp);
413.      }
414.      return 0;
415.  }
416.  

Gloves_off[]

417.  int
418.  Gloves_off()
419.  {
420.      long oldprop =
421.  	u.uprops[objects[uarmg->otyp].oc_oprop].extrinsic & ~WORN_GLOVES;
422.  
423.      takeoff_mask &= ~W_ARMG;
424.  
425.      switch(uarmg->otyp) {
426.  	case LEATHER_GLOVES:
427.  	    break;
428.  	case GAUNTLETS_OF_FUMBLING:
429.  	    if (!oldprop && !(HFumbling & ~TIMEOUT))
430.  		HFumbling = EFumbling = 0;
431.  	    break;
432.  	case GAUNTLETS_OF_POWER:
433.  	    makeknown(uarmg->otyp);
434.  	    flags.botl = 1; /* taken care of in attrib.c */
435.  	    break;
436.  	case GAUNTLETS_OF_DEXTERITY:
437.  	    if (!cancelled_don) adj_abon(uarmg, -uarmg->spe);
438.  	    break;
439.  	default: impossible(unknown_type, c_gloves, uarmg->otyp);
440.      }
441.      setworn((struct obj *)0, W_ARMG);
442.      cancelled_don = FALSE;
443.      (void) encumber_msg();		/* immediate feedback for GoP */
444.  
445.      /* Prevent wielding cockatrice when not wearing gloves */
446.      if (uwep && uwep->otyp == CORPSE &&
447.  		touch_petrifies(&mons[uwep->corpsenm])) {
448.  	char kbuf[BUFSZ];
449.  
450.  	You("wield the %s in your bare %s.",
451.  	    corpse_xname(uwep, TRUE), makeplural(body_part(HAND)));
452.  	Strcpy(kbuf, an(corpse_xname(uwep, TRUE)));
453.  	instapetrify(kbuf);
454.  	uwepgone();  /* life-saved still doesn't allow touching cockatrice */
455.      }
456.  
457.      /* KMH -- ...or your secondary weapon when you're wielding it */
458.      if (u.twoweap && uswapwep && uswapwep->otyp == CORPSE &&
459.  	touch_petrifies(&mons[uswapwep->corpsenm])) {
460.  	char kbuf[BUFSZ];
461.  
462.  	You("wield the %s in your bare %s.",
463.  	    corpse_xname(uswapwep, TRUE), body_part(HAND));
464.  
465.  	Strcpy(kbuf, an(corpse_xname(uswapwep, TRUE)));
466.  	instapetrify(kbuf);
467.  	uswapwepgone();	/* lifesaved still doesn't allow touching cockatrice */
468.      }
469.  
470.      return 0;
471.  }
472.  

Shield_on[]

473.  STATIC_OVL int
474.  Shield_on()
475.  {
476.  /*
477.      switch (uarms->otyp) {
478.  	case SMALL_SHIELD:
479.  	case ELVEN_SHIELD:
480.  	case URUK_HAI_SHIELD:
481.  	case ORCISH_SHIELD:
482.  	case DWARVISH_ROUNDSHIELD:
483.  	case LARGE_SHIELD:
484.  	case SHIELD_OF_REFLECTION:
485.  		break;
486.  	default: impossible(unknown_type, c_shield, uarms->otyp);
487.      }
488.  */
489.      return 0;
490.  }
491.  

Shield_off[]

492.  int
493.  Shield_off()
494.  {
495.      takeoff_mask &= ~W_ARMS;
496.  /*
497.      switch (uarms->otyp) {
498.  	case SMALL_SHIELD:
499.  	case ELVEN_SHIELD:
500.  	case URUK_HAI_SHIELD:
501.  	case ORCISH_SHIELD:
502.  	case DWARVISH_ROUNDSHIELD:
503.  	case LARGE_SHIELD:
504.  	case SHIELD_OF_REFLECTION:
505.  		break;
506.  	default: impossible(unknown_type, c_shield, uarms->otyp);
507.      }
508.  */
509.      setworn((struct obj *)0, W_ARMS);
510.      return 0;
511.  }
512.  

Shirt_on[]

513.  #ifdef TOURIST
514.  STATIC_OVL int
515.  Shirt_on()
516.  {
517.  /*
518.      switch (uarmu->otyp) {
519.  	case HAWAIIAN_SHIRT:
520.  	case T_SHIRT:
521.  		break;
522.  	default: impossible(unknown_type, c_shirt, uarmu->otyp);
523.      }
524.  */
525.      return 0;
526.  }
527.  

Shirt_off[]

528.  int
529.  Shirt_off()
530.  {
531.      takeoff_mask &= ~W_ARMU;
532.  /*
533.      switch (uarmu->otyp) {
534.  	case HAWAIIAN_SHIRT:
535.  	case T_SHIRT:
536.  		break;
537.  	default: impossible(unknown_type, c_shirt, uarmu->otyp);
538.      }
539.  */
540.      setworn((struct obj *)0, W_ARMU);
541.      return 0;
542.  }
543.  #endif	/*TOURIST*/
544.  

Armor_on[]

545.  /* This must be done in worn.c, because one of the possible intrinsics conferred
546.   * is fire resistance, and we have to immediately set HFire_resistance in worn.c
547.   * since worn.c will check it before returning.
548.   */
549.  STATIC_PTR
550.  int
551.  Armor_on()
552.  {
553.      return 0;
554.  }
555.  

Armor_off[]

556.  int
557.  Armor_off()
558.  {
559.      takeoff_mask &= ~W_ARM;
560.      setworn((struct obj *)0, W_ARM);
561.      cancelled_don = FALSE;
562.      return 0;
563.  }
564.  

Armor_gone[]

565.  /* The gone functions differ from the off functions in that if you die from
566.   * taking it off and have life saving, you still die.
567.   */
568.  int
569.  Armor_gone()
570.  {
571.      takeoff_mask &= ~W_ARM;
572.      setnotworn(uarm);
573.      cancelled_don = FALSE;
574.      return 0;
575.  }
576.  

Amulet_on[]

577.  STATIC_OVL void
578.  Amulet_on()
579.  {
580.      switch(uamul->otyp) {
581.  	case AMULET_OF_ESP:
582.  	case AMULET_OF_LIFE_SAVING:
583.  	case AMULET_VERSUS_POISON:
584.  	case AMULET_OF_REFLECTION:
585.  	case AMULET_OF_MAGICAL_BREATHING:
586.  	case FAKE_AMULET_OF_YENDOR:
587.  		break;
588.  	case AMULET_OF_UNCHANGING:
589.  		if (Slimed) {
590.  		    Slimed = 0;
591.  		    flags.botl = 1;
592.  		}
593.  		break;
594.  	case AMULET_OF_CHANGE:
595.  	    {
596.  		int orig_sex = poly_gender();
597.  
598.  		if (Unchanging) break;
599.  		change_sex();
600.  		/* Don't use same message as polymorph */
601.  		if (orig_sex != poly_gender()) {
602.  		    makeknown(AMULET_OF_CHANGE);
603.  		    You("are suddenly very %s!", flags.female ? "feminine"
604.  			: "masculine");
605.  		    flags.botl = 1;
606.  		} else
607.  		    /* already polymorphed into single-gender monster; only
608.  		       changed the character's base sex */
609.  		    You("don't feel like yourself.");
610.  		pline_The("amulet disintegrates!");
611.  		if (orig_sex == poly_gender() && uamul->dknown &&
612.  			!objects[AMULET_OF_CHANGE].oc_name_known &&
613.  			!objects[AMULET_OF_CHANGE].oc_uname)
614.  		    docall(uamul);
615.  		useup(uamul);
616.  		break;
617.  	    }
618.  	case AMULET_OF_STRANGULATION:
619.  		makeknown(AMULET_OF_STRANGULATION);
620.  		pline("It constricts your throat!");
621.  		Strangled = 6;
622.  		break;
623.  	case AMULET_OF_RESTFUL_SLEEP:
624.  		HSleeping = rnd(100);
625.  		break;
626.  	case AMULET_OF_YENDOR:
627.  		break;
628.      }
629.  }
630.  

Amulet_off[]

631.  void
632.  Amulet_off()
633.  {
634.      takeoff_mask &= ~W_AMUL;
635.  
636.      switch(uamul->otyp) {
637.  	case AMULET_OF_ESP:
638.  		/* need to update ability before calling see_monsters() */
639.  		setworn((struct obj *)0, W_AMUL);
640.  		see_monsters();
641.  		return;
642.  	case AMULET_OF_LIFE_SAVING:
643.  	case AMULET_VERSUS_POISON:
644.  	case AMULET_OF_REFLECTION:
645.  	case AMULET_OF_CHANGE:
646.  	case AMULET_OF_UNCHANGING:
647.  	case FAKE_AMULET_OF_YENDOR:
648.  		break;
649.  	case AMULET_OF_MAGICAL_BREATHING:
650.  		if (Underwater) {
651.  		    /* HMagical_breathing must be set off
652.  			before calling drown() */
653.  		    setworn((struct obj *)0, W_AMUL);
654.  		    if (!breathless(youmonst.data) && !amphibious(youmonst.data)
655.  						&& !Swimming) {
656.  			You("suddenly inhale an unhealthy amount of water!");
657.  		    	(void) drown();
658.  		    }
659.  		    return;
660.  		}
661.  		break;
662.  	case AMULET_OF_STRANGULATION:
663.  		if (Strangled) {
664.  			You("can breathe more easily!");
665.  			Strangled = 0;
666.  		}
667.  		break;
668.  	case AMULET_OF_RESTFUL_SLEEP:
669.  		setworn((struct obj *)0, W_AMUL);
670.  		if (!ESleeping)
671.  			HSleeping = 0;
672.  		return;
673.  	case AMULET_OF_YENDOR:
674.  		break;
675.      }
676.      setworn((struct obj *)0, W_AMUL);
677.      return;
678.  }
679.  

Ring_on[]

680.  void
681.  Ring_on(obj)
682.  register struct obj *obj;
683.  {
684.      long oldprop = u.uprops[objects[obj->otyp].oc_oprop].extrinsic;
685.      int old_attrib, which;
686.  
687.      if (obj == uwep) setuwep((struct obj *) 0);
688.      if (obj == uswapwep) setuswapwep((struct obj *) 0);
689.      if (obj == uquiver) setuqwep((struct obj *) 0);
690.  
691.      /* only mask out W_RING when we don't have both
692.         left and right rings of the same type */
693.      if ((oldprop & W_RING) != W_RING) oldprop &= ~W_RING;
694.  
695.      switch(obj->otyp){
696.  	case RIN_TELEPORTATION:
697.  	case RIN_REGENERATION:
698.  	case RIN_SEARCHING:
699.  	case RIN_STEALTH:
700.  	case RIN_HUNGER:
701.  	case RIN_AGGRAVATE_MONSTER:
702.  	case RIN_POISON_RESISTANCE:
703.  	case RIN_FIRE_RESISTANCE:
704.  	case RIN_COLD_RESISTANCE:
705.  	case RIN_SHOCK_RESISTANCE:
706.  	case RIN_CONFLICT:
707.  	case RIN_TELEPORT_CONTROL:
708.  	case RIN_POLYMORPH:
709.  	case RIN_POLYMORPH_CONTROL:
710.  	case RIN_FREE_ACTION:                
711.  	case RIN_SLOW_DIGESTION:
712.  	case RIN_SUSTAIN_ABILITY:
713.  	case MEAT_RING:
714.  		break;
715.  	case RIN_WARNING:
716.  		see_monsters();
717.  		break;
718.  	case RIN_SEE_INVISIBLE:
719.  		/* can now see invisible monsters */
720.  		set_mimic_blocking(); /* do special mimic handling */
721.  		see_monsters();
722.  #ifdef INVISIBLE_OBJECTS
723.  		see_objects();
724.  #endif
725.  
726.  		if (Invis && !oldprop && !HSee_invisible &&
727.  				!perceives(youmonst.data) && !Blind) {
728.  		    newsym(u.ux,u.uy);
729.  		    pline("Suddenly you are transparent, but there!");
730.  		    makeknown(RIN_SEE_INVISIBLE);
731.  		}
732.  		break;
733.  	case RIN_INVISIBILITY:
734.  		if (!oldprop && !HInvis && !BInvis && !Blind) {
735.  		    makeknown(RIN_INVISIBILITY);
736.  		    newsym(u.ux,u.uy);
737.  		    self_invis_message();
738.  		}
739.  		break;
740.  	case RIN_LEVITATION:
741.  		if (!oldprop && !HLevitation) {
742.  		    float_up();
743.  		    makeknown(RIN_LEVITATION);
744.  		    spoteffects(FALSE);	/* for sinks */
745.  		}
746.  		break;
747.  	case RIN_GAIN_STRENGTH:
748.  		which = A_STR;
749.  		goto adjust_attrib;
750.  	case RIN_GAIN_CONSTITUTION:
751.  		which = A_CON;
752.  		goto adjust_attrib;
753.  	case RIN_ADORNMENT:
754.  		which = A_CHA;
755.   adjust_attrib:
756.  		old_attrib = ACURR(which);
757.  		ABON(which) += obj->spe;
758.  		if (ACURR(which) != old_attrib ||
759.  			(objects[obj->otyp].oc_name_known &&
760.  			    old_attrib != 25 && old_attrib != 3)) {
761.  		    flags.botl = 1;
762.  		    makeknown(obj->otyp);
763.  		    obj->known = 1;
764.  		    update_inventory();
765.  		}
766.  		break;
767.  	case RIN_INCREASE_ACCURACY:	/* KMH */
768.  		u.uhitinc += obj->spe;
769.  		break;
770.  	case RIN_INCREASE_DAMAGE:
771.  		u.udaminc += obj->spe;
772.  		break;
773.  	case RIN_PROTECTION_FROM_SHAPE_CHAN:
774.  		rescham();
775.  		break;
776.  	case RIN_PROTECTION:
777.  		if (obj->spe || objects[RIN_PROTECTION].oc_name_known) {
778.  		    flags.botl = 1;
779.  		    makeknown(RIN_PROTECTION);
780.  		    obj->known = 1;
781.  		    update_inventory();
782.  		}
783.  		break;
784.      }
785.  }
786.  

Ring_off_or_gone[]

787.  STATIC_OVL void
788.  Ring_off_or_gone(obj,gone)
789.  register struct obj *obj;
790.  boolean gone;
791.  {
792.      long mask = (obj->owornmask & W_RING);
793.      int old_attrib, which;
794.  
795.      takeoff_mask &= ~mask;
796.      if(!(u.uprops[objects[obj->otyp].oc_oprop].extrinsic & mask))
797.  	impossible("Strange... I didn't know you had that ring.");
798.      if(gone) setnotworn(obj);
799.      else setworn((struct obj *)0, obj->owornmask);
800.  
801.      switch(obj->otyp) {
802.  	case RIN_TELEPORTATION:
803.  	case RIN_REGENERATION:
804.  	case RIN_SEARCHING:
805.  	case RIN_STEALTH:
806.  	case RIN_HUNGER:
807.  	case RIN_AGGRAVATE_MONSTER:
808.  	case RIN_POISON_RESISTANCE:
809.  	case RIN_FIRE_RESISTANCE:
810.  	case RIN_COLD_RESISTANCE:
811.  	case RIN_SHOCK_RESISTANCE:
812.  	case RIN_CONFLICT:
813.  	case RIN_TELEPORT_CONTROL:
814.  	case RIN_POLYMORPH:
815.  	case RIN_POLYMORPH_CONTROL:
816.  	case RIN_FREE_ACTION:                
817.  	case RIN_SLOW_DIGESTION:
818.  	case RIN_SUSTAIN_ABILITY:
819.  	case MEAT_RING:
820.  		break;
821.  	case RIN_WARNING:
822.  		see_monsters();
823.  		break;
824.  	case RIN_SEE_INVISIBLE:
825.  		/* Make invisible monsters go away */
826.  		if (!See_invisible) {
827.  		    set_mimic_blocking(); /* do special mimic handling */
828.  		    see_monsters();
829.  #ifdef INVISIBLE_OBJECTS                
830.  		    see_objects();
831.  #endif
832.  		}
833.  
834.  		if (Invisible && !Blind) {
835.  		    newsym(u.ux,u.uy);
836.  		    pline("Suddenly you cannot see yourself.");
837.  		    makeknown(RIN_SEE_INVISIBLE);
838.  		}
839.  		break;
840.  	case RIN_INVISIBILITY:
841.  		if (!Invis && !BInvis && !Blind) {
842.  		    newsym(u.ux,u.uy);
843.  		    Your("body seems to unfade%s.",
844.  			 See_invisible ? " completely" : "..");
845.  		    makeknown(RIN_INVISIBILITY);
846.  		}
847.  		break;
848.  	case RIN_LEVITATION:
849.  		(void) float_down(0L, 0L);
850.  		if (!Levitation) makeknown(RIN_LEVITATION);
851.  		break;
852.  	case RIN_GAIN_STRENGTH:
853.  		which = A_STR;
854.  		goto adjust_attrib;
855.  	case RIN_GAIN_CONSTITUTION:
856.  		which = A_CON;
857.  		goto adjust_attrib;
858.  	case RIN_ADORNMENT:
859.  		which = A_CHA;
860.   adjust_attrib:
861.  		old_attrib = ACURR(which);
862.  		ABON(which) -= obj->spe;
863.  		if (ACURR(which) != old_attrib) {
864.  		    flags.botl = 1;
865.  		    makeknown(obj->otyp);
866.  		    obj->known = 1;
867.  		    update_inventory();
868.  		}
869.  		break;
870.  	case RIN_INCREASE_ACCURACY:	/* KMH */
871.  		u.uhitinc -= obj->spe;
872.  		break;
873.  	case RIN_INCREASE_DAMAGE:
874.  		u.udaminc -= obj->spe;
875.  		break;
876.  	case RIN_PROTECTION:
877.  		/* might have forgotten it due to amnesia */
878.  		if (obj->spe) {
879.  		    flags.botl = 1;
880.  		    makeknown(RIN_PROTECTION);
881.  		    obj->known = 1;
882.  		    update_inventory();
883.  		}
884.  	case RIN_PROTECTION_FROM_SHAPE_CHAN:
885.  		/* If you're no longer protected, let the chameleons
886.  		 * change shape again -dgk
887.  		 */
888.  		restartcham();
889.  		break;
890.      }
891.  }
892.  

Ring_off[]

893.  void
894.  Ring_off(obj)
895.  struct obj *obj;
896.  {
897.  	Ring_off_or_gone(obj,FALSE);
898.  }
899.  

Ring_gone[]

900.  void
901.  Ring_gone(obj)
902.  struct obj *obj;
903.  {
904.  	Ring_off_or_gone(obj,TRUE);
905.  }
906.  

Blindf_on[]

907.  void
908.  Blindf_on(otmp)
909.  register struct obj *otmp;
910.  {
911.  	boolean already_blind = Blind, changed = FALSE;
912.  
913.  	if (otmp == uwep)
914.  	    setuwep((struct obj *) 0);
915.  	if (otmp == uswapwep)
916.  	    setuswapwep((struct obj *) 0);
917.  	if (otmp == uquiver)
918.  	    setuqwep((struct obj *) 0);
919.  	setworn(otmp, W_TOOL);
920.  	on_msg(otmp);
921.  
922.  	if (Blind && !already_blind) {
923.  	    changed = TRUE;
924.  	    if (flags.verbose) You_cant("see any more.");
925.  	    /* set ball&chain variables before the hero goes blind */
926.  	    if (Punished) set_bc(0);
927.  	} else if (already_blind && !Blind) {
928.  	    changed = TRUE;
929.  	    /* "You are now wearing the Eyes of the Overworld." */
930.  	    You("can see!");
931.  	}
932.  	if (changed) {
933.  	    /* blindness has just been toggled */
934.  	    if (Blind_telepat || Infravision) see_monsters();
935.  	    vision_full_recalc = 1;	/* recalc vision limits */
936.  	    flags.botl = 1;
937.  	}
938.  }
939.  

Blindf_off[]

940.  void
941.  Blindf_off(otmp)
942.  register struct obj *otmp;
943.  {
944.  	boolean was_blind = Blind, changed = FALSE;
945.  
946.  	takeoff_mask &= ~W_TOOL;
947.  	setworn((struct obj *)0, otmp->owornmask);
948.  	off_msg(otmp);
949.  
950.  	if (Blind) {
951.  	    if (was_blind) {
952.  		/* "still cannot see" makes no sense when removing lenses
953.  		   since they can't have been the cause of your blindness */
954.  		if (otmp->otyp != LENSES)
955.  		    You("still cannot see.");
956.  	    } else {
957.  		changed = TRUE;	/* !was_blind */
958.  		/* "You were wearing the Eyes of the Overworld." */
959.  		You_cant("see anything now!");
960.  		/* set ball&chain variables before the hero goes blind */
961.  		if (Punished) set_bc(0);
962.  	    }
963.  	} else if (was_blind) {
964.  	    changed = TRUE;	/* !Blind */
965.  	    You("can see again.");
966.  	}
967.  	if (changed) {
968.  	    /* blindness has just been toggled */
969.  	    if (Blind_telepat || Infravision) see_monsters();
970.  	    vision_full_recalc = 1;	/* recalc vision limits */
971.  	    flags.botl = 1;
972.  	}
973.  }
974.  

set_wear[]

975.  /* called in main to set intrinsics of worn start-up items */
976.  void
977.  set_wear()
978.  {
979.  #ifdef TOURIST
980.  	if (uarmu) (void) Shirt_on();
981.  #endif
982.  	if (uarm)  (void) Armor_on();
983.  	if (uarmc) (void) Cloak_on();
984.  	if (uarmf) (void) Boots_on();
985.  	if (uarmg) (void) Gloves_on();
986.  	if (uarmh) (void) Helmet_on();
987.  	if (uarms) (void) Shield_on();
988.  }
989.  

donning[]

990.  /* check whether the target object is currently being put on (or taken off) */
991.  boolean
992.  donning(otmp)		/* also checks for doffing */
993.  register struct obj *otmp;
994.  {
995.   /* long what = (occupation == take_off) ? taking_off : 0L; */
996.      long what = taking_off;	/* if nonzero, occupation is implied */
997.      boolean result = FALSE;
998.  
999.      if (otmp == uarm)
1000. 	result = (afternmv == Armor_on || afternmv == Armor_off ||
1001. 		  what == WORN_ARMOR);
1002. #ifdef TOURIST
1003.     else if (otmp == uarmu)
1004. 	result = (afternmv == Shirt_on || afternmv == Shirt_off ||
1005. 		  what == WORN_SHIRT);
1006. #endif
1007.     else if (otmp == uarmc)
1008. 	result = (afternmv == Cloak_on || afternmv == Cloak_off ||
1009. 		  what == WORN_CLOAK);
1010.     else if (otmp == uarmf)
1011. 	result = (afternmv == Boots_on || afternmv == Boots_off ||
1012. 		  what == WORN_BOOTS);
1013.     else if (otmp == uarmh)
1014. 	result = (afternmv == Helmet_on || afternmv == Helmet_off ||
1015. 		  what == WORN_HELMET);
1016.     else if (otmp == uarmg)
1017. 	result = (afternmv == Gloves_on || afternmv == Gloves_off ||
1018. 		  what == WORN_GLOVES);
1019.     else if (otmp == uarms)
1020. 	result = (afternmv == Shield_on || afternmv == Shield_off ||
1021. 		  what == WORN_SHIELD);
1022. 
1023.     return result;
1024. }
1025. 

cancel_don[]

1026. void
1027. cancel_don()
1028. {
1029. 	/* the piece of armor we were donning/doffing has vanished, so stop
1030. 	 * wasting time on it (and don't dereference it when donning would
1031. 	 * otherwise finish)
1032. 	 */
1033. 	cancelled_don = (afternmv == Boots_on || afternmv == Helmet_on ||
1034. 			 afternmv == Gloves_on || afternmv == Armor_on);
1035. 	afternmv = 0;
1036. 	nomovemsg = (char *)0;
1037. 	multi = 0;
1038. 	todelay = 0;
1039. 	taking_off = 0L;
1040. }
1041. 

dotakeoff[]

1042. static NEARDATA const char clothes[] = {ARMOR_CLASS, 0};
1043. static NEARDATA const char accessories[] = {RING_CLASS, AMULET_CLASS, TOOL_CLASS, FOOD_CLASS, 0};
1044. 
1045. /* the 'T' command */
1046. int
1047. dotakeoff()
1048. {
1049. 	register struct obj *otmp = (struct obj *)0;
1050. 	int armorpieces = 0;
1051. 
1052. #define MOREARM(x) if (x) { armorpieces++; otmp = x; }
1053. 	MOREARM(uarmh);
1054. 	MOREARM(uarms);
1055. 	MOREARM(uarmg);
1056. 	MOREARM(uarmf);
1057. 	if (uarmc) {
1058. 		armorpieces++;
1059. 		otmp = uarmc;
1060. 	} else if (uarm) {
1061. 		armorpieces++;
1062. 		otmp = uarm;
1063. #ifdef TOURIST
1064. 	} else if (uarmu) {
1065. 		armorpieces++;
1066. 		otmp = uarmu;
1067. #endif
1068. 	}
1069. 	if (!armorpieces) {
1070. 	     /* assert( GRAY_DRAGON_SCALES > YELLOW_DRAGON_SCALE_MAIL ); */
1071. 		if (uskin)
1072. 		    pline_The("%s merged with your skin!",
1073. 			      uskin->otyp >= GRAY_DRAGON_SCALES ?
1074. 				"dragon scales are" : "dragon scale mail is");
1075. 		else
1076. 		    pline("Not wearing any armor.%s", (iflags.cmdassist && 
1077. 				(uleft || uright || uamul || ublindf)) ?
1078. 			  "  Use 'R' command to remove accessories." : "");
1079. 		return 0;
1080. 	}
1081. 	if (armorpieces > 1)
1082. 		otmp = getobj(clothes, "take off");
1083. 	if (otmp == 0) return(0);
1084. 	if (!(otmp->owornmask & W_ARMOR)) {
1085. 		You("are not wearing that.");
1086. 		return(0);
1087. 	}
1088. 	/* note: the `uskin' case shouldn't be able to happen here; dragons
1089. 	   can't wear any armor so will end up with `armorpieces == 0' above */
1090. 	if (otmp == uskin || ((otmp == uarm) && uarmc)
1091. #ifdef TOURIST
1092. 			  || ((otmp == uarmu) && (uarmc || uarm))
1093. #endif
1094. 		) {
1095. 	    You_cant("take that off.");
1096. 	    return 0;
1097. 	}
1098. 
1099. 	reset_remarm();		/* clear takeoff_mask and taking_off */
1100. 	(void) select_off(otmp);
1101. 	if (!takeoff_mask) return 0;
1102. 	reset_remarm();		/* armoroff() doesn't use takeoff_mask */
1103. 
1104. 	(void) armoroff(otmp);
1105. 	return(1);
1106. }
1107. 

doremring[]

1108. /* the 'R' command */
1109. int
1110. doremring()
1111. {
1112. 	register struct obj *otmp = 0;
1113. 	int Accessories = 0;
1114. 
1115. #define MOREACC(x) if (x) { Accessories++; otmp = x; }
1116. 	MOREACC(uleft);
1117. 	MOREACC(uright);
1118. 	MOREACC(uamul);
1119. 	MOREACC(ublindf);
1120. 
1121. 	if(!Accessories) {
1122. 		pline("Not wearing any accessories.%s", (iflags.cmdassist &&
1123. 			    (uarm || uarmc ||
1124. #ifdef TOURIST
1125. 			     uarmu ||
1126. #endif
1127. 			     uarms || uarmh || uarmg || uarmf)) ?
1128. 		      "  Use 'T' command to take off armor." : "");
1129. 		return(0);
1130. 	}
1131. 	if (Accessories != 1) otmp = getobj(accessories, "remove");
1132. 	if(!otmp) return(0);
1133. 	if(!(otmp->owornmask & (W_RING | W_AMUL | W_TOOL))) {
1134. 		You("are not wearing that.");
1135. 		return(0);
1136. 	}
1137. 
1138. 	reset_remarm();		/* clear takeoff_mask and taking_off */
1139. 	(void) select_off(otmp);
1140. 	if (!takeoff_mask) return 0;
1141. 	reset_remarm();		/* not used by Ring_/Amulet_/Blindf_off() */
1142. 
1143. 	if (otmp == uright || otmp == uleft) {
1144. 		/* Sometimes we want to give the off_msg before removing and
1145. 		 * sometimes after; for instance, "you were wearing a moonstone
1146. 		 * ring (on right hand)" is desired but "you were wearing a
1147. 		 * square amulet (being worn)" is not because of the redundant
1148. 		 * "being worn".
1149. 		 */
1150. 		off_msg(otmp);
1151. 		Ring_off(otmp);
1152. 	} else if (otmp == uamul) {
1153. 		Amulet_off();
1154. 		off_msg(otmp);
1155. 	} else if (otmp == ublindf) {
1156. 		Blindf_off(otmp);	/* does its own off_msg */
1157. 	} else {
1158. 		impossible("removing strange accessory?");
1159. 	}
1160. 	return(1);
1161. }
1162. 

cursed[]

1163. /* Check if something worn is cursed _and_ unremovable. */
1164. int
1165. cursed(otmp)
1166. register struct obj *otmp;
1167. {
1168. 	/* Curses, like chickens, come home to roost. */
1169. 	if((otmp == uwep) ? welded(otmp) : (int)otmp->cursed) {
1170. 		You("can't.  %s cursed.",
1171. 			(is_boots(otmp) || is_gloves(otmp) || otmp->quan > 1L)
1172. 			? "They are" : "It is");
1173. 		otmp->bknown = TRUE;
1174. 		return(1);
1175. 	}
1176. 	return(0);
1177. }
1178. 

armoroff[]

1179. int
1180. armoroff(otmp)
1181. register struct obj *otmp;
1182. {
1183. 	register int delay = -objects[otmp->otyp].oc_delay;
1184. 
1185. 	if(cursed(otmp)) return(0);
1186. 	if(delay) {
1187. 		nomul(delay);
1188. 		if (is_helmet(otmp)) {
1189. 			nomovemsg = "You finish taking off your helmet.";
1190. 			afternmv = Helmet_off;
1191. 		     }
1192. 		else if (is_gloves(otmp)) {
1193. 			nomovemsg = "You finish taking off your gloves.";
1194. 			afternmv = Gloves_off;
1195. 		     }
1196. 		else if (is_boots(otmp)) {
1197. 			nomovemsg = "You finish taking off your boots.";
1198. 			afternmv = Boots_off;
1199. 		     }
1200. 		else {
1201. 			nomovemsg = "You finish taking off your suit.";
1202. 			afternmv = Armor_off;
1203. 		}
1204. 	} else {
1205. 		/* Be warned!  We want off_msg after removing the item to
1206. 		 * avoid "You were wearing ____ (being worn)."  However, an
1207. 		 * item which grants fire resistance might cause some trouble
1208. 		 * if removed in Hell and lifesaving puts it back on; in this
1209. 		 * case the message will be printed at the wrong time (after
1210. 		 * the messages saying you died and were lifesaved).  Luckily,
1211. 		 * no cloak, shield, or fast-removable armor grants fire
1212. 		 * resistance, so we can safely do the off_msg afterwards.
1213. 		 * Rings do grant fire resistance, but for rings we want the
1214. 		 * off_msg before removal anyway so there's no problem.  Take
1215. 		 * care in adding armors granting fire resistance; this code
1216. 		 * might need modification.
1217. 		 * 3.2 (actually 3.1 even): this comment is obsolete since
1218. 		 * fire resistance is not needed for Gehennom.
1219. 		 */
1220. 		if(is_cloak(otmp))
1221. 			(void) Cloak_off();
1222. 		else if(is_shield(otmp))
1223. 			(void) Shield_off();
1224. 		else setworn((struct obj *)0, otmp->owornmask & W_ARMOR);
1225. 		off_msg(otmp);
1226. 	}
1227. 	takeoff_mask = taking_off = 0L;
1228. 	return(1);
1229. }
1230. 

already_wearing[]

1231. STATIC_OVL void
1232. already_wearing(cc)
1233. const char *cc;
1234. {
1235. 	You("are already wearing %s%c", cc, (cc == c_that_) ? '!' : '.');
1236. }
1237. 

already_wearing2[]

1238. STATIC_OVL void
1239. already_wearing2(cc1, cc2)
1240. const char *cc1, *cc2;
1241. {
1242. 	You_cant("wear %s because you're wearing %s there already.", cc1, cc2);
1243. }
1244. 

canwearobj[]

1245. /*
1246.  * canwearobj checks to see whether the player can wear a piece of armor
1247.  *
1248.  * inputs: otmp (the piece of armor)
1249.  *         noisy (if TRUE give error messages, otherwise be quiet about it)
1250.  * output: mask (otmp's armor type)
1251.  */
1252. int
1253. canwearobj(otmp,mask,noisy)
1254. struct obj *otmp;
1255. long *mask;
1256. boolean noisy;
1257. {
1258.     int err = 0;
1259.     const char *which;
1260. 
1261.     which = is_cloak(otmp) ? c_cloak :
1262. #ifdef TOURIST
1263. 	    is_shirt(otmp) ? c_shirt :
1264. #endif
1265. 	    is_suit(otmp) ? c_suit : 0;
1266.     if (which && cantweararm(youmonst.data) &&
1267. 	    /* same exception for cloaks as used in m_dowear() */
1268. 	    (which != c_cloak || youmonst.data->msize != MZ_SMALL) &&
1269. 	    (racial_exception(&youmonst, otmp) < 1)) {
1270. 	if (noisy) pline_The("%s will not fit on your body.", which);
1271. 	return 0;
1272.     } else if (otmp->owornmask & W_ARMOR) {
1273. 	if (noisy) already_wearing(c_that_);
1274. 	return 0;
1275.     }
1276. 
1277.     if (welded(uwep) && bimanual(uwep) &&
1278. 	    (is_suit(otmp)
1279. #ifdef TOURIST
1280. 			|| is_shirt(otmp)
1281. #endif
1282. 	    )) {
1283. 	if (noisy)
1284. 	    You("cannot do that while holding your %s.",
1285. 		is_sword(uwep) ? c_sword : c_weapon);
1286. 	return 0;
1287.     }
1288. 
1289.     if (is_helmet(otmp)) {
1290. 	if (uarmh) {
1291. 	    if (noisy) already_wearing(an(c_helmet));
1292. 	    err++;
1293. 	} else if (Upolyd && has_horns(youmonst.data) && !is_flimsy(otmp)) {
1294. 	    /* (flimsy exception matches polyself handling) */
1295. 	    if (noisy)
1296. 		pline_The("%s won't fit over your horn%s.",
1297. 			  c_helmet, plur(num_horns(youmonst.data)));
1298. 	    err++;
1299. 	} else
1300. 	    *mask = W_ARMH;
1301.     } else if (is_shield(otmp)) {
1302. 	if (uarms) {
1303. 	    if (noisy) already_wearing(an(c_shield));
1304. 	    err++;
1305. 	} else if (uwep && bimanual(uwep)) {
1306. 	    if (noisy) 
1307. 		You("cannot wear a shield while wielding a two-handed %s.",
1308. 		    is_sword(uwep) ? c_sword :
1309. 		    (uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon);
1310. 	    err++;
1311. 	} else if (u.twoweap) {
1312. 	    if (noisy)
1313. 		You("cannot wear a shield while wielding two weapons.");
1314. 	    err++;
1315. 	} else
1316. 	    *mask = W_ARMS;
1317.     } else if (is_boots(otmp)) {
1318. 	if (uarmf) {
1319. 	    if (noisy) already_wearing(c_boots);
1320. 	    err++;
1321. 	} else if (Upolyd && slithy(youmonst.data)) {
1322. 	    if (noisy) You("have no feet...");	/* not body_part(FOOT) */
1323. 	    err++;
1324. 	} else if (Upolyd && youmonst.data->mlet == S_CENTAUR) {
1325. 	    /* break_armor() pushes boots off for centaurs,
1326. 	       so don't let dowear() put them back on... */
1327. 	    if (noisy) pline("You have too many hooves to wear %s.",
1328. 			     c_boots);	/* makeplural(body_part(FOOT)) yields
1329. 					   "rear hooves" which sounds odd */
1330. 	    err++;
1331. 	} else if (u.utrap && (u.utraptype == TT_BEARTRAP ||
1332. 				u.utraptype == TT_INFLOOR)) {
1333. 	    if (u.utraptype == TT_BEARTRAP) {
1334. 		if (noisy) Your("%s is trapped!", body_part(FOOT));
1335. 	    } else {
1336. 		if (noisy) Your("%s are stuck in the %s!",
1337. 				makeplural(body_part(FOOT)),
1338. 				surface(u.ux, u.uy));
1339. 	    }
1340. 	    err++;
1341. 	} else
1342. 	    *mask = W_ARMF;
1343.     } else if (is_gloves(otmp)) {
1344. 	if (uarmg) {
1345. 	    if (noisy) already_wearing(c_gloves);
1346. 	    err++;
1347. 	} else if (welded(uwep)) {
1348. 	    if (noisy) You("cannot wear gloves over your %s.",
1349. 			   is_sword(uwep) ? c_sword : c_weapon);
1350. 	    err++;
1351. 	} else
1352. 	    *mask = W_ARMG;
1353. #ifdef TOURIST
1354.     } else if (is_shirt(otmp)) {
1355. 	if (uarm || uarmc || uarmu) {
1356. 	    if (uarmu) {
1357. 		if (noisy) already_wearing(an(c_shirt));
1358. 	    } else {
1359. 		if (noisy) You_cant("wear that over your %s.",
1360. 			           (uarm && !uarmc) ? c_armor : cloak_simple_name(uarmc));
1361. 	    }
1362. 	    err++;
1363. 	} else
1364. 	    *mask = W_ARMU;
1365. #endif
1366.     } else if (is_cloak(otmp)) {
1367. 	if (uarmc) {
1368. 	    if (noisy) already_wearing(an(cloak_simple_name(uarmc)));
1369. 	    err++;
1370. 	} else
1371. 	    *mask = W_ARMC;
1372.     } else if (is_suit(otmp)) {
1373. 	if (uarmc) {
1374. 	    if (noisy) You("cannot wear armor over a %s.", cloak_simple_name(uarmc));
1375. 	    err++;
1376. 	} else if (uarm) {
1377. 	    if (noisy) already_wearing("some armor");
1378. 	    err++;
1379. 	} else
1380. 	    *mask = W_ARM;
1381.     } else {
1382. 	/* getobj can't do this after setting its allow_all flag; that
1383. 	   happens if you have armor for slots that are covered up or
1384. 	   extra armor for slots that are filled */
1385. 	if (noisy) silly_thing("wear", otmp);
1386. 	err++;
1387.     }
1388. /* Unnecessary since now only weapons and special items like pick-axes get
1389.  * welded to your hand, not armor
1390.     if (welded(otmp)) {
1391. 	if (!err++) {
1392. 	    if (noisy) weldmsg(otmp);
1393. 	}
1394.     }
1395.  */
1396.     return !err;
1397. }
1398. 

dowear[]

1399. /* the 'W' command */
1400. int
1401. dowear()
1402. {
1403. 	struct obj *otmp;
1404. 	int delay;
1405. 	long mask = 0;
1406. 
1407. 	/* cantweararm checks for suits of armor */
1408. 	/* verysmall or nohands checks for shields, gloves, etc... */
1409. 	if ((verysmall(youmonst.data) || nohands(youmonst.data))) {
1410. 		pline("Don't even bother.");
1411. 		return(0);
1412. 	}
1413. 
1414. 	otmp = getobj(clothes, "wear");
1415. 	if(!otmp) return(0);
1416. 
1417. 	if (!canwearobj(otmp,&mask,TRUE)) return(0);
1418. 
1419. 	if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
1420. 	    return 1;	/* costs a turn even though it didn't get worn */
1421. 
1422. 	if (otmp->otyp == HELM_OF_OPPOSITE_ALIGNMENT &&
1423. 			qstart_level.dnum == u.uz.dnum) {	/* in quest */
1424. 		if (u.ualignbase[A_CURRENT] == u.ualignbase[A_ORIGINAL])
1425. 			You("narrowly avoid losing all chance at your goal.");
1426. 		else	/* converted */
1427. 			You("are suddenly overcome with shame and change your mind.");
1428. 		u.ublessed = 0; /* lose your god's protection */
1429. 		makeknown(otmp->otyp);
1430. 		flags.botl = 1;
1431. 		return 1;
1432. 	}
1433. 
1434. 	otmp->known = TRUE;
1435. 	if(otmp == uwep)
1436. 		setuwep((struct obj *)0);
1437. 	if (otmp == uswapwep)
1438. 		setuswapwep((struct obj *) 0);
1439. 	if (otmp == uquiver)
1440. 		setuqwep((struct obj *) 0);
1441. 	setworn(otmp, mask);
1442. 	delay = -objects[otmp->otyp].oc_delay;
1443. 	if(delay){
1444. 		nomul(delay);
1445. 		if(is_boots(otmp)) afternmv = Boots_on;
1446. 		if(is_helmet(otmp)) afternmv = Helmet_on;
1447. 		if(is_gloves(otmp)) afternmv = Gloves_on;
1448. 		if(otmp == uarm) afternmv = Armor_on;
1449. 		nomovemsg = "You finish your dressing maneuver.";
1450. 	} else {
1451. 		if(is_cloak(otmp)) (void) Cloak_on();
1452. 		if (is_shield(otmp)) (void) Shield_on();
1453. #ifdef TOURIST
1454. 		if (is_shirt(otmp)) (void) Shirt_on();
1455. #endif
1456. 		on_msg(otmp);
1457. 	}
1458. 	takeoff_mask = taking_off = 0L;
1459. 	return(1);
1460. }
1461. 

doputon[]

1462. int
1463. doputon()
1464. {
1465. 	register struct obj *otmp;
1466. 	long mask = 0L;
1467. 
1468. 	if(uleft && uright && uamul && ublindf) {
1469. 		Your("%s%s are full, and you're already wearing an amulet and %s.",
1470. 			humanoid(youmonst.data) ? "ring-" : "",
1471. 			makeplural(body_part(FINGER)),
1472. 			ublindf->otyp==LENSES ? "some lenses" : "a blindfold");
1473. 		return(0);
1474. 	}
1475. 	otmp = getobj(accessories, "put on");
1476. 	if(!otmp) return(0);
1477. 	if(otmp->owornmask & (W_RING | W_AMUL | W_TOOL)) {
1478. 		already_wearing(c_that_);
1479. 		return(0);
1480. 	}
1481. 	if(welded(otmp)) {
1482. 		weldmsg(otmp);
1483. 		return(0);
1484. 	}
1485. 	if(otmp == uwep)
1486. 		setuwep((struct obj *)0);
1487. 	if(otmp == uswapwep)
1488. 		setuswapwep((struct obj *) 0);
1489. 	if(otmp == uquiver)
1490. 		setuqwep((struct obj *) 0);
1491. 	if(otmp->oclass == RING_CLASS || otmp->otyp == MEAT_RING) {
1492. 		if(nolimbs(youmonst.data)) {
1493. 			You("cannot make the ring stick to your body.");
1494. 			return(0);
1495. 		}
1496. 		if(uleft && uright){
1497. 			There("are no more %s%s to fill.",
1498. 				humanoid(youmonst.data) ? "ring-" : "",
1499. 				makeplural(body_part(FINGER)));
1500. 			return(0);
1501. 		}
1502. 		if(uleft) mask = RIGHT_RING;
1503. 		else if(uright) mask = LEFT_RING;
1504. 		else do {
1505. 			char qbuf[QBUFSZ];
1506. 			char answer;
1507. 
1508. 			Sprintf(qbuf, "Which %s%s, Right or Left?",
1509. 				humanoid(youmonst.data) ? "ring-" : "",
1510. 				body_part(FINGER));
1511. 			if(!(answer = yn_function(qbuf, "rl", '\0')))
1512. 				return(0);
1513. 			switch(answer){
1514. 			case 'l':
1515. 			case 'L':
1516. 				mask = LEFT_RING;
1517. 				break;
1518. 			case 'r':
1519. 			case 'R':
1520. 				mask = RIGHT_RING;
1521. 				break;
1522. 			}
1523. 		} while(!mask);
1524. 		if (uarmg && uarmg->cursed) {
1525. 			uarmg->bknown = TRUE;
1526. 		    You("cannot remove your gloves to put on the ring.");
1527. 			return(0);
1528. 		}
1529. 		if (welded(uwep) && bimanual(uwep)) {
1530. 			/* welded will set bknown */
1531. 	    You("cannot free your weapon hands to put on the ring.");
1532. 			return(0);
1533. 		}
1534. 		if (welded(uwep) && mask==RIGHT_RING) {
1535. 			/* welded will set bknown */
1536. 	    You("cannot free your weapon hand to put on the ring.");
1537. 			return(0);
1538. 		}
1539. 		if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
1540. 		    return 1; /* costs a turn even though it didn't get worn */
1541. 		setworn(otmp, mask);
1542. 		Ring_on(otmp);
1543. 	} else if (otmp->oclass == AMULET_CLASS) {
1544. 		if(uamul) {
1545. 			already_wearing("an amulet");
1546. 			return(0);
1547. 		}
1548. 		if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
1549. 		    return 1;
1550. 		setworn(otmp, W_AMUL);
1551. 		if (otmp->otyp == AMULET_OF_CHANGE) {
1552. 			Amulet_on();
1553. 			/* Don't do a prinv() since the amulet is now gone */
1554. 			return(1);
1555. 		}
1556. 		Amulet_on();
1557. 	} else {	/* it's a blindfold, towel, or lenses */
1558. 		if (ublindf) {
1559. 			if (ublindf->otyp == TOWEL)
1560. 				Your("%s is already covered by a towel.",
1561. 					body_part(FACE));
1562. 			else if (ublindf->otyp == BLINDFOLD) {
1563. 				if (otmp->otyp == LENSES)
1564. 					already_wearing2("lenses", "a blindfold");
1565. 				else
1566. 					already_wearing("a blindfold");
1567. 			} else if (ublindf->otyp == LENSES) {
1568. 				if (otmp->otyp == BLINDFOLD)
1569. 					already_wearing2("a blindfold", "some lenses");
1570. 				else
1571. 					already_wearing("some lenses");
1572. 			} else
1573. 				already_wearing(something); /* ??? */
1574. 			return(0);
1575. 		}
1576. 		if (otmp->otyp != BLINDFOLD && otmp->otyp != TOWEL && otmp->otyp != LENSES) {
1577. 			You_cant("wear that!");
1578. 			return(0);
1579. 		}
1580. 		if (otmp->oartifact && !touch_artifact(otmp, &youmonst))
1581. 		    return 1;
1582. 		Blindf_on(otmp);
1583. 		return(1);
1584. 	}
1585. 	if (is_worn(otmp))
1586. 	    prinv((char *)0, otmp, 0L);
1587. 	return(1);
1588. }
1589. 
1590. #endif /* OVLB */
1591. 

find_ac[]

1592. #ifdef OVL0
1593. 
1594. void
1595. find_ac()
1596. {
1597. 	int uac = mons[u.umonnum].ac;
1598. 
1599. 	if(uarm) uac -= ARM_BONUS(uarm);
1600. 	if(uarmc) uac -= ARM_BONUS(uarmc);
1601. 	if(uarmh) uac -= ARM_BONUS(uarmh);
1602. 	if(uarmf) uac -= ARM_BONUS(uarmf);
1603. 	if(uarms) uac -= ARM_BONUS(uarms);
1604. 	if(uarmg) uac -= ARM_BONUS(uarmg);
1605. #ifdef TOURIST
1606. 	if(uarmu) uac -= ARM_BONUS(uarmu);
1607. #endif
1608. 	if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe;
1609. 	if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe;
1610. 	if (HProtection & INTRINSIC) uac -= u.ublessed;
1611. 	uac -= u.uspellprot;
1612. 	if (uac < -128) uac = -128;	/* u.uac is an schar */
1613. 	if(uac != u.uac){
1614. 		u.uac = uac;
1615. 		flags.botl = 1;
1616. 	}
1617. }
1618. 
1619. #endif /* OVL0 */

glibr[]

1620. #ifdef OVLB
1621. 
1622. void
1623. glibr()
1624. {
1625. 	register struct obj *otmp;
1626. 	int xfl = 0;
1627. 	boolean leftfall, rightfall;
1628. 	const char *otherwep = 0;
1629. 
1630. 	leftfall = (uleft && !uleft->cursed &&
1631. 		    (!uwep || !welded(uwep) || !bimanual(uwep)));
1632. 	rightfall = (uright && !uright->cursed && (!welded(uwep)));
1633. 	if (!uarmg && (leftfall || rightfall) && !nolimbs(youmonst.data)) {
1634. 		/* changed so cursed rings don't fall off, GAN 10/30/86 */
1635. 		Your("%s off your %s.",
1636. 			(leftfall && rightfall) ? "rings slip" : "ring slips",
1637. 			(leftfall && rightfall) ? makeplural(body_part(FINGER)) :
1638. 			body_part(FINGER));
1639. 		xfl++;
1640. 		if (leftfall) {
1641. 			otmp = uleft;
1642. 			Ring_off(uleft);
1643. 			dropx(otmp);
1644. 		}
1645. 		if (rightfall) {
1646. 			otmp = uright;
1647. 			Ring_off(uright);
1648. 			dropx(otmp);
1649. 		}
1650. 	}
1651. 
1652. 	otmp = uswapwep;
1653. 	if (u.twoweap && otmp) {
1654. 		otherwep = is_sword(otmp) ? c_sword :
1655. 		    makesingular(oclass_names[(int)otmp->oclass]);
1656. 		Your("%s %sslips from your %s.",
1657. 			otherwep,
1658. 			xfl ? "also " : "",
1659. 			makeplural(body_part(HAND)));
1660. 		setuswapwep((struct obj *)0);
1661. 		xfl++;
1662. 		if (otmp->otyp != LOADSTONE || !otmp->cursed)
1663. 			dropx(otmp);
1664. 	}
1665. 	otmp = uwep;
1666. 	if (otmp && !welded(otmp)) {
1667. 		const char *thiswep;
1668. 
1669. 		/* nice wording if both weapons are the same type */
1670. 		thiswep = is_sword(otmp) ? c_sword :
1671. 		    makesingular(oclass_names[(int)otmp->oclass]);
1672. 		if (otherwep && strcmp(thiswep, otherwep)) otherwep = 0;
1673. 
1674. 		/* changed so cursed weapons don't fall, GAN 10/30/86 */
1675. 		Your("%s%s %sslips from your %s.",
1676. 			otherwep ? "other " : "", thiswep,
1677. 			xfl ? "also " : "",
1678. 			makeplural(body_part(HAND)));
1679. 		setuwep((struct obj *)0);
1680. 		if (otmp->otyp != LOADSTONE || !otmp->cursed)
1681. 			dropx(otmp);
1682. 	}
1683. }
1684. 

some_armor[]

1685. struct obj *
1686. some_armor(victim)
1687. struct monst *victim;
1688. {
1689. 	register struct obj *otmph, *otmp;
1690. 
1691. 	otmph = (victim == &youmonst) ? uarmc : which_armor(victim, W_ARMC);
1692. 	if (!otmph)
1693. 	    otmph = (victim == &youmonst) ? uarm : which_armor(victim, W_ARM);
1694. #ifdef TOURIST
1695. 	if (!otmph)
1696. 	    otmph = (victim == &youmonst) ? uarmu : which_armor(victim, W_ARMU);
1697. #endif
1698. 	
1699. 	otmp = (victim == &youmonst) ? uarmh : which_armor(victim, W_ARMH);
1700. 	if(otmp && (!otmph || !rn2(4))) otmph = otmp;
1701. 	otmp = (victim == &youmonst) ? uarmg : which_armor(victim, W_ARMG);
1702. 	if(otmp && (!otmph || !rn2(4))) otmph = otmp;
1703. 	otmp = (victim == &youmonst) ? uarmf : which_armor(victim, W_ARMF);
1704. 	if(otmp && (!otmph || !rn2(4))) otmph = otmp;
1705. 	otmp = (victim == &youmonst) ? uarms : which_armor(victim, W_ARMS);
1706. 	if(otmp && (!otmph || !rn2(4))) otmph = otmp;
1707. 	return(otmph);
1708. }
1709. 

erode_armor[]

1710. /* erode some arbitrary armor worn by the victim */
1711. void
1712. erode_armor(victim, acid_dmg)
1713. struct monst *victim;
1714. boolean acid_dmg;
1715. {
1716. 	struct obj *otmph = some_armor(victim);
1717. 
1718. 	if (otmph && (otmph != uarmf)) {
1719. 	    erode_obj(otmph, acid_dmg, FALSE);
1720. 	    if (carried(otmph)) update_inventory();
1721. 	}
1722. }
1723. 

stuck_ring[]

1724. /* used for praying to check and fix levitation trouble */
1725. struct obj *
1726. stuck_ring(ring, otyp)
1727. struct obj *ring;
1728. int otyp;
1729. {
1730.     if (ring != uleft && ring != uright) {
1731. 	impossible("stuck_ring: neither left nor right?");
1732. 	return (struct obj *)0;
1733.     }
1734. 
1735.     if (ring && ring->otyp == otyp) {
1736. 	/* reasons ring can't be removed match those checked by select_off();
1737. 	   limbless case has extra checks because ordinarily it's temporary */
1738. 	if (nolimbs(youmonst.data) &&
1739. 		uamul && uamul->otyp == AMULET_OF_UNCHANGING && uamul->cursed)
1740. 	    return uamul;
1741. 	if (welded(uwep) && (ring == uright || bimanual(uwep))) return uwep;
1742. 	if (uarmg && uarmg->cursed) return uarmg;
1743. 	if (ring->cursed) return ring;
1744.     }
1745.     /* either no ring or not right type or nothing prevents its removal */
1746.     return (struct obj *)0;
1747. }
1748. 

unchanger[]

1749. /* also for praying; find worn item that confers "Unchanging" attribute */
1750. struct obj *
1751. unchanger()
1752. {
1753.     if (uamul && uamul->otyp == AMULET_OF_UNCHANGING) return uamul;
1754.     return 0;
1755. }
1756. 

select_off[]

1757. /* occupation callback for 'A' */
1758. STATIC_PTR
1759. int
1760. select_off(otmp)
1761. register struct obj *otmp;
1762. {
1763. 	struct obj *why;
1764. 	char buf[BUFSZ];
1765. 
1766. 	if (!otmp) return 0;
1767. 	*buf = '\0';			/* lint suppresion */
1768. 
1769. 	/* special ring checks */
1770. 	if (otmp == uright || otmp == uleft) {
1771. 	    if (nolimbs(youmonst.data)) {
1772. 		pline_The("ring is stuck.");
1773. 		return 0;
1774. 	    }
1775. 	    why = 0;	/* the item which prevents ring removal */
1776. 	    if (welded(uwep) && (otmp == uright || bimanual(uwep))) {
1777. 		Sprintf(buf, "free a weapon %s", body_part(HAND));
1778. 		why = uwep;
1779. 	    } else if (uarmg && uarmg->cursed) {
1780. 		Sprintf(buf, "take off your %s", c_gloves);
1781. 		why = uarmg;
1782. 	    }
1783. 	    if (why) {
1784. 		You("cannot %s to remove the ring.", buf);
1785. 		why->bknown = TRUE;
1786. 		return 0;
1787. 	    }
1788. 	}
1789. 	/* special glove checks */
1790. 	if (otmp == uarmg) {
1791. 	    if (welded(uwep)) {
1792. 		You("are unable to take off your %s while wielding that %s.",
1793. 		    c_gloves, is_sword(uwep) ? c_sword : c_weapon);
1794. 		uwep->bknown = TRUE;
1795. 		return 0;
1796. 	    } else if (Glib) {
1797. 		You_cant("take off the slippery %s with your slippery %s.",
1798. 			 c_gloves, makeplural(body_part(FINGER)));
1799. 		return 0;
1800. 	    }
1801. 	}
1802. 	/* special boot checks */
1803. 	if (otmp == uarmf) {
1804. 	    if (u.utrap && u.utraptype == TT_BEARTRAP) {
1805. 		pline_The("bear trap prevents you from pulling your %s out.",
1806. 			  body_part(FOOT));
1807. 		return 0;
1808. 	    } else if (u.utrap && u.utraptype == TT_INFLOOR) {
1809. 		You("are stuck in the %s, and cannot pull your %s out.",
1810. 		    surface(u.ux, u.uy), makeplural(body_part(FOOT)));
1811. 		return 0;
1812. 	    }
1813. 	}
1814. 	/* special suit and shirt checks */
1815. 	if (otmp == uarm
1816. #ifdef TOURIST
1817. 			|| otmp == uarmu
1818. #endif
1819. 		) {
1820. 	    why = 0;	/* the item which prevents disrobing */
1821. 	    if (uarmc && uarmc->cursed) {
1822. 		Sprintf(buf, "remove your %s", cloak_simple_name(uarmc));
1823. 		why = uarmc;
1824. #ifdef TOURIST
1825. 	    } else if (otmp == uarmu && uarm && uarm->cursed) {
1826. 		Sprintf(buf, "remove your %s", c_suit);
1827. 		why = uarm;
1828. #endif
1829. 	    } else if (welded(uwep) && bimanual(uwep)) {
1830. 		Sprintf(buf, "release your %s",
1831. 			is_sword(uwep) ? c_sword :
1832. 			(uwep->otyp == BATTLE_AXE) ? c_axe : c_weapon);
1833. 		why = uwep;
1834. 	    }
1835. 	    if (why) {
1836. 		You("cannot %s to take off %s.", buf, the(xname(otmp)));
1837. 		why->bknown = TRUE;
1838. 		return 0;
1839. 	    }
1840. 	}
1841. 	/* basic curse check */
1842. 	if (otmp == uquiver || (otmp == uswapwep && !u.twoweap)) {
1843. 	    ;	/* some items can be removed even when cursed */
1844. 	} else {
1845. 	    /* otherwise, this is fundamental */
1846. 	    if (cursed(otmp)) return 0;
1847. 	}
1848. 
1849. 	if(otmp == uarm) takeoff_mask |= WORN_ARMOR;
1850. 	else if(otmp == uarmc) takeoff_mask |= WORN_CLOAK;
1851. 	else if(otmp == uarmf) takeoff_mask |= WORN_BOOTS;
1852. 	else if(otmp == uarmg) takeoff_mask |= WORN_GLOVES;
1853. 	else if(otmp == uarmh) takeoff_mask |= WORN_HELMET;
1854. 	else if(otmp == uarms) takeoff_mask |= WORN_SHIELD;
1855. #ifdef TOURIST
1856. 	else if(otmp == uarmu) takeoff_mask |= WORN_SHIRT;
1857. #endif
1858. 	else if(otmp == uleft) takeoff_mask |= LEFT_RING;
1859. 	else if(otmp == uright) takeoff_mask |= RIGHT_RING;
1860. 	else if(otmp == uamul) takeoff_mask |= WORN_AMUL;
1861. 	else if(otmp == ublindf) takeoff_mask |= WORN_BLINDF;
1862. 	else if(otmp == uwep) takeoff_mask |= W_WEP;
1863. 	else if(otmp == uswapwep) takeoff_mask |= W_SWAPWEP;
1864. 	else if(otmp == uquiver) takeoff_mask |= W_QUIVER;
1865. 
1866. 	else impossible("select_off: %s???", doname(otmp));
1867. 
1868. 	return(0);
1869. }
1870. 

do_takeoff[]

1871. STATIC_OVL struct obj *
1872. do_takeoff()
1873. {
1874. 	register struct obj *otmp = (struct obj *)0;
1875. 
1876. 	if (taking_off == W_WEP) {
1877. 	  if(!cursed(uwep)) {
1878. 	    setuwep((struct obj *) 0);
1879. 	    You("are empty %s.", body_part(HANDED));
1880. 	    u.twoweap = FALSE;
1881. 	  }
1882. 	} else if (taking_off == W_SWAPWEP) {
1883. 	  setuswapwep((struct obj *) 0);
1884. 	  You("no longer have a second weapon readied.");
1885. 	  u.twoweap = FALSE;
1886. 	} else if (taking_off == W_QUIVER) {
1887. 	  setuqwep((struct obj *) 0);
1888. 	  You("no longer have ammunition readied.");
1889. 	} else if (taking_off == WORN_ARMOR) {
1890. 	  otmp = uarm;
1891. 	  if(!cursed(otmp)) (void) Armor_off();
1892. 	} else if (taking_off == WORN_CLOAK) {
1893. 	  otmp = uarmc;
1894. 	  if(!cursed(otmp)) (void) Cloak_off();
1895. 	} else if (taking_off == WORN_BOOTS) {
1896. 	  otmp = uarmf;
1897. 	  if(!cursed(otmp)) (void) Boots_off();
1898. 	} else if (taking_off == WORN_GLOVES) {
1899. 	  otmp = uarmg;
1900. 	  if(!cursed(otmp)) (void) Gloves_off();
1901. 	} else if (taking_off == WORN_HELMET) {
1902. 	  otmp = uarmh;
1903. 	  if(!cursed(otmp)) (void) Helmet_off();
1904. 	} else if (taking_off == WORN_SHIELD) {
1905. 	  otmp = uarms;
1906. 	  if(!cursed(otmp)) (void) Shield_off();
1907. #ifdef TOURIST
1908. 	} else if (taking_off == WORN_SHIRT) {
1909. 	  otmp = uarmu;
1910. 	  if (!cursed(otmp)) (void) Shirt_off();
1911. #endif
1912. 	} else if (taking_off == WORN_AMUL) {
1913. 	  otmp = uamul;
1914. 	  if(!cursed(otmp)) Amulet_off();
1915. 	} else if (taking_off == LEFT_RING) {
1916. 	  otmp = uleft;
1917. 	  if(!cursed(otmp)) Ring_off(uleft);
1918. 	} else if (taking_off == RIGHT_RING) {
1919. 	  otmp = uright;
1920. 	  if(!cursed(otmp)) Ring_off(uright);
1921. 	} else if (taking_off == WORN_BLINDF) {
1922. 	  if (!cursed(ublindf)) Blindf_off(ublindf);
1923. 	} else impossible("do_takeoff: taking off %lx", taking_off);
1924. 
1925. 	return(otmp);
1926. }
1927. 

take_off[]

1928. static const char *disrobing = "";
1929. 
1930. STATIC_PTR
1931. int
1932. take_off()
1933. {
1934. 	register int i;
1935. 	register struct obj *otmp;
1936. 
1937. 	if (taking_off) {
1938. 	    if (todelay > 0) {
1939. 		todelay--;
1940. 		return(1);	/* still busy */
1941. 	    } else {
1942. 		if ((otmp = do_takeoff())) off_msg(otmp);
1943. 	    }
1944. 	    takeoff_mask &= ~taking_off;
1945. 	    taking_off = 0L;
1946. 	}
1947. 
1948. 	for(i = 0; takeoff_order[i]; i++)
1949. 	    if(takeoff_mask & takeoff_order[i]) {
1950. 		taking_off = takeoff_order[i];
1951. 		break;
1952. 	    }
1953. 
1954. 	otmp = (struct obj *) 0;
1955. 	todelay = 0;
1956. 
1957. 	if (taking_off == 0L) {
1958. 	  You("finish %s.", disrobing);
1959. 	  return 0;
1960. 	} else if (taking_off == W_WEP) {
1961. 	  todelay = 1;
1962. 	} else if (taking_off == W_SWAPWEP) {
1963. 	  todelay = 1;
1964. 	} else if (taking_off == W_QUIVER) {
1965. 	  todelay = 1;
1966. 	} else if (taking_off == WORN_ARMOR) {
1967. 	  otmp = uarm;
1968. 	  /* If a cloak is being worn, add the time to take it off and put
1969. 	   * it back on again.  Kludge alert! since that time is 0 for all
1970. 	   * known cloaks, add 1 so that it actually matters...
1971. 	   */
1972. 	  if (uarmc) todelay += 2 * objects[uarmc->otyp].oc_delay + 1;
1973. 	} else if (taking_off == WORN_CLOAK) {
1974. 	  otmp = uarmc;
1975. 	} else if (taking_off == WORN_BOOTS) {
1976. 	  otmp = uarmf;
1977. 	} else if (taking_off == WORN_GLOVES) {
1978. 	  otmp = uarmg;
1979. 	} else if (taking_off == WORN_HELMET) {
1980. 	  otmp = uarmh;
1981. 	} else if (taking_off == WORN_SHIELD) {
1982. 	  otmp = uarms;
1983. #ifdef TOURIST
1984. 	} else if (taking_off == WORN_SHIRT) {
1985. 	  otmp = uarmu;
1986. 	  /* add the time to take off and put back on armor and/or cloak */
1987. 	  if (uarm)  todelay += 2 * objects[uarm->otyp].oc_delay;
1988. 	  if (uarmc) todelay += 2 * objects[uarmc->otyp].oc_delay + 1;
1989. #endif
1990. 	} else if (taking_off == WORN_AMUL) {
1991. 	  todelay = 1;
1992. 	} else if (taking_off == LEFT_RING) {
1993. 	  todelay = 1;
1994. 	} else if (taking_off == RIGHT_RING) {
1995. 	  todelay = 1;
1996. 	} else if (taking_off == WORN_BLINDF) {
1997. 	  todelay = 2;
1998. 	} else {
1999. 	  impossible("take_off: taking off %lx", taking_off);
2000. 	  return 0;	/* force done */
2001. 	}
2002. 
2003. 	if (otmp) todelay += objects[otmp->otyp].oc_delay;
2004. 
2005. 	/* Since setting the occupation now starts the counter next move, that
2006. 	 * would always produce a delay 1 too big per item unless we subtract
2007. 	 * 1 here to account for it.
2008. 	 */
2009. 	if (todelay > 0) todelay--;
2010. 
2011. 	set_occupation(take_off, disrobing, 0);
2012. 	return(1);		/* get busy */
2013. }
2014. 

reset_remarm[]

2015. /* clear saved context to avoid inappropriate resumption of interrupted 'A' */
2016. void
2017. reset_remarm()
2018. {
2019. 	taking_off = takeoff_mask = 0L;
2020. 	disrobing = nul;
2021. }
2022. 

doddoremarm[]

2023. /* the 'A' command -- remove multiple worn items */
2024. int
2025. doddoremarm()
2026. {
2027.     int result = 0;
2028. 
2029.     if (taking_off || takeoff_mask) {
2030. 	You("continue %s.", disrobing);
2031. 	set_occupation(take_off, disrobing, 0);
2032. 	return 0;
2033.     } else if (!uwep && !uswapwep && !uquiver && !uamul && !ublindf &&
2034. 		!uleft && !uright && !wearing_armor()) {
2035. 	You("are not wearing anything.");
2036. 	return 0;
2037.     }
2038. 
2039.     add_valid_menu_class(0); /* reset */
2040.     if (flags.menu_style != MENU_TRADITIONAL ||
2041. 	    (result = ggetobj("take off", select_off, 0, FALSE, (unsigned *)0)) < -1)
2042. 	result = menu_remarm(result);
2043. 
2044.     if (takeoff_mask) {
2045. 	/* default activity for armor and/or accessories,
2046. 	   possibly combined with weapons */
2047. 	disrobing = "disrobing";
2048. 	/* specific activity when handling weapons only */
2049. 	if (!(takeoff_mask & ~(W_WEP|W_SWAPWEP|W_QUIVER)))
2050. 	    disrobing = "disarming";
2051. 	(void) take_off();
2052.     }
2053.     /* The time to perform the command is already completely accounted for
2054.      * in take_off(); if we return 1, that would add an extra turn to each
2055.      * disrobe.
2056.      */
2057.     return 0;
2058. }
2059. 

= menu_remarm[]

2060. STATIC_OVL int
2061. menu_remarm(retry)
2062. int retry;
2063. {
2064.     int n, i = 0;
2065.     menu_item *pick_list;
2066.     boolean all_worn_categories = TRUE;
2067. 
2068.     if (retry) {
2069. 	all_worn_categories = (retry == -2);
2070.     } else if (flags.menu_style == MENU_FULL) {
2071. 	all_worn_categories = FALSE;
2072. 	n = query_category("What type of things do you want to take off?",
2073. 			   invent, WORN_TYPES|ALL_TYPES, &pick_list, PICK_ANY);
2074. 	if (!n) return 0;
2075. 	for (i = 0; i < n; i++) {
2076. 	    if (pick_list[i].item.a_int == ALL_TYPES_SELECTED)
2077. 		all_worn_categories = TRUE;
2078. 	    else
2079. 		add_valid_menu_class(pick_list[i].item.a_int);
2080. 	}
2081. 	free((genericptr_t) pick_list);
2082.     } else if (flags.menu_style == MENU_COMBINATION) {
2083. 	all_worn_categories = FALSE;
2084. 	if (ggetobj("take off", select_off, 0, TRUE, (unsigned *)0) == -2)
2085. 	    all_worn_categories = TRUE;
2086.     }
2087. 
2088.     n = query_objlist("What do you want to take off?", invent,
2089. 			SIGNAL_NOMENU|USE_INVLET|INVORDER_SORT,
2090. 			&pick_list, PICK_ANY,
2091. 			all_worn_categories ? is_worn : is_worn_by_type);
2092.     if (n > 0) {
2093. 	for (i = 0; i < n; i++)
2094. 	    (void) select_off(pick_list[i].item.a_obj);
2095. 	free((genericptr_t) pick_list);
2096.     } else if (n < 0 && flags.menu_style != MENU_COMBINATION) {
2097. 	There("is nothing else you can remove or unwield.");
2098.     }
2099.     return 0;
2100. }
2101. 

destroy_arm[]

2102. /* hit by destroy armor scroll/black dragon breath/monster spell */
2103. int
2104. destroy_arm(atmp)
2105. register struct obj *atmp;
2106. {
2107. 	register struct obj *otmp;
2108. #define DESTROY_ARM(o) ((otmp = (o)) != 0 && \
2109. 			(!atmp || atmp == otmp) && \
2110. 			(!obj_resists(otmp, 0, 90)))
2111. 
2112. 	if (DESTROY_ARM(uarmc)) {
2113. 		if (donning(otmp)) cancel_don();
2114. 		Your("%s crumbles and turns to dust!",
2115. 		     cloak_simple_name(uarmc));
2116. 		(void) Cloak_off();
2117. 		useup(otmp);
2118. 	} else if (DESTROY_ARM(uarm)) {
2119. 		if (donning(otmp)) cancel_don();
2120. 		Your("armor turns to dust and falls to the %s!",
2121. 			surface(u.ux,u.uy));
2122. 		(void) Armor_gone();
2123. 		useup(otmp);
2124. #ifdef TOURIST
2125. 	} else if (DESTROY_ARM(uarmu)) {
2126. 		if (donning(otmp)) cancel_don();
2127. 		Your("shirt crumbles into tiny threads and falls apart!");
2128. 		(void) Shirt_off();
2129. 		useup(otmp);
2130. #endif
2131. 	} else if (DESTROY_ARM(uarmh)) {
2132. 		if (donning(otmp)) cancel_don();
2133. 		Your("helmet turns to dust and is blown away!");
2134. 		(void) Helmet_off();
2135. 		useup(otmp);
2136. 	} else if (DESTROY_ARM(uarmg)) {
2137. 		if (donning(otmp)) cancel_don();
2138. 		Your("gloves vanish!");
2139. 		(void) Gloves_off();
2140. 		useup(otmp);
2141. 		selftouch("You");
2142. 	} else if (DESTROY_ARM(uarmf)) {
2143. 		if (donning(otmp)) cancel_don();
2144. 		Your("boots disintegrate!");
2145. 		(void) Boots_off();
2146. 		useup(otmp);
2147. 	} else if (DESTROY_ARM(uarms)) {
2148. 		if (donning(otmp)) cancel_don();
2149. 		Your("shield crumbles away!");
2150. 		(void) Shield_off();
2151. 		useup(otmp);
2152. 	} else {
2153. 		return 0;		/* could not destroy anything */
2154. 	}
2155. 
2156. #undef DESTROY_ARM
2157. 	stop_occupation();
2158. 	return(1);
2159. }
2160. 

adj_abon[]

2161. void
2162. adj_abon(otmp, delta)
2163. register struct obj *otmp;
2164. register schar delta;
2165. {
2166. 	if (uarmg && uarmg == otmp && otmp->otyp == GAUNTLETS_OF_DEXTERITY) {
2167. 		if (delta) {
2168. 			makeknown(uarmg->otyp);
2169. 			ABON(A_DEX) += (delta);
2170. 		}
2171. 		flags.botl = 1;
2172. 	}
2173. 	if (uarmh && uarmh == otmp && otmp->otyp == HELM_OF_BRILLIANCE) {
2174. 		if (delta) {
2175. 			makeknown(uarmh->otyp);
2176. 			ABON(A_INT) += (delta);
2177. 			ABON(A_WIS) += (delta);
2178. 		}
2179. 		flags.botl = 1;
2180. 	}
2181. }
2182. 
2183. #endif /* OVLB */
2184. 
2185. /*do_wear.c*/
Advertisement