Source:NetHack 3.1.0/do wear.c

From NetHackWiki
(Redirected from NetHack 3.1.0/do wear.c)
Jump to navigation Jump to search

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

Warning! This is the source code from an old release. For the latest release, see Source code

The NetHack General Public License applies to screenshots, source code and other content from NetHack.

This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.

1.    /*	SCCS Id: @(#)do_wear.c	3.1	92/12/13	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
5.    #include "hack.h"
6.    
7.    #ifdef OVLB
8.    
9.    static int NEARDATA todelay;
10.   
11.   #endif /*OVLB */
12.   
13.   #ifndef OVLB
14.   
15.   STATIC_DCL long takeoff_mask, taking_off;
16.   
17.   #else /* OVLB */
18.   
19.   STATIC_OVL long NEARDATA takeoff_mask = 0L, NEARDATA taking_off = 0L;
20.   
21.   static const long NEARDATA takeoff_order[] = { WORN_BLINDF, 1L, /* weapon */
22.   	WORN_SHIELD, WORN_GLOVES, LEFT_RING, RIGHT_RING, WORN_CLOAK,
23.   	WORN_HELMET, WORN_AMUL, WORN_ARMOR,
24.   #ifdef TOURIST
25.   	WORN_SHIRT,
26.   #endif
27.   	WORN_BOOTS, 0L };
28.   
29.   static void FDECL(on_msg, (struct obj *));
30.   STATIC_PTR int NDECL(Armor_on);
31.   STATIC_PTR int NDECL(Boots_on);
32.   static int NDECL(Cloak_on);
33.   STATIC_PTR int NDECL(Helmet_on);
34.   STATIC_PTR int NDECL(Gloves_on);
35.   static void NDECL(Amulet_on);
36.   static void FDECL(Ring_off_or_gone, (struct obj *, BOOLEAN_P));
37.   STATIC_PTR int FDECL(select_off, (struct obj *));
38.   static struct obj *NDECL(do_takeoff);
39.   STATIC_PTR int NDECL(take_off);
40.   static void FDECL(already_wearing, (const char*));
41.   
42.   void
43.   off_msg(otmp) register struct obj *otmp; {
44.   	if(flags.verbose)
45.   	    You("were wearing %s.", doname(otmp));
46.   }
47.   
48.   /* for items that involve no delay */
49.   static void
50.   on_msg(otmp)
51.   register struct obj *otmp;
52.   {
53.   	if(flags.verbose)
54.   	    You("are now wearing %s.",
55.   		obj_is_pname(otmp) ? the(xname(otmp)) : an(xname(otmp)));
56.   }
57.   
58.   #endif /* OVLB */
59.   #ifdef OVL2
60.   
61.   boolean
62.   is_boots(otmp) register struct obj *otmp; {
63.   	return(otmp->otyp >= LOW_BOOTS &&
64.   		otmp->otyp <= LEVITATION_BOOTS);
65.   }
66.   
67.   boolean
68.   is_helmet(otmp) register struct obj *otmp; {
69.   	return(otmp->otyp >= ELVEN_LEATHER_HELM &&
70.   		otmp->otyp <= HELM_OF_TELEPATHY);
71.   }
72.   
73.   #endif /* OVLB */
74.   #ifdef OVL2
75.   
76.   boolean
77.   is_gloves(otmp) register struct obj *otmp; {
78.   	return(otmp->otyp >= LEATHER_GLOVES &&
79.   		otmp->otyp <= GAUNTLETS_OF_DEXTERITY);
80.   }
81.   
82.   #endif /* OVL2 */
83.   #ifdef OVLB
84.   
85.   boolean
86.   is_cloak(otmp) register struct obj *otmp; {
87.   	return(otmp->otyp >= MUMMY_WRAPPING &&
88.   		otmp->otyp <= CLOAK_OF_DISPLACEMENT);
89.   }
90.   
91.   boolean
92.   is_shield(otmp) register struct obj *otmp; {
93.   	return(otmp->otyp >= SMALL_SHIELD &&
94.   		otmp->otyp <= SHIELD_OF_REFLECTION);
95.   }
96.   
97.   /*
98.    * The Type_on() functions should be called *after* setworn().
99.    * The Type_off() functions call setworn() themselves.
100.   */
101.  
102.  STATIC_PTR
103.  int
104.  Boots_on() {
105.      long oldprop = u.uprops[objects[uarmf->otyp].oc_oprop].p_flgs & ~WORN_BOOTS;
106.  
107.      switch(uarmf->otyp) {
108.  	case LOW_BOOTS:
109.  	case IRON_SHOES:
110.  	case HIGH_BOOTS:
111.  	case JUMPING_BOOTS:
112.  		break;
113.  	case WATER_WALKING_BOOTS:
114.  		if (u.uinwater) spoteffects();
115.  		break;
116.  	case SPEED_BOOTS:
117.  		/* Speed boots are still better than intrinsic speed, */
118.  		/* though not better than potion speed */
119.  		if (!(oldprop & TIMEOUT)) {
120.  			makeknown(uarmf->otyp);
121.  			You("feel yourself speed up%s.",
122.  				oldprop ? " a bit more" : "");
123.  		}
124.  		break;
125.  	case ELVEN_BOOTS:
126.  		if (!oldprop) {
127.  			makeknown(uarmf->otyp);
128.  			You("walk very quietly.");
129.  		}
130.  		break;
131.  	case FUMBLE_BOOTS:
132.  		if (!(oldprop & ~TIMEOUT))
133.  			Fumbling += rnd(20);
134.  		break;
135.  	case LEVITATION_BOOTS:
136.  		if (!oldprop) {
137.  			makeknown(uarmf->otyp);
138.  			float_up();
139.  		}
140.  		break;
141.  	default: impossible("Unknown type of boots (%d)", uarmf->otyp);
142.      }
143.      return 0;
144.  }
145.  
146.  int
147.  Boots_off() {
148.      register struct obj *obj = uarmf;
149.  	/* For levitation, float_down() returns if Levitation, so we
150.  	 * must do a setworn() _before_ the levitation case.
151.  	 */
152.      long oldprop = u.uprops[objects[uarmf->otyp].oc_oprop].p_flgs & ~WORN_BOOTS;
153.  
154.      setworn((struct obj *)0, W_ARMF);
155.      switch(obj->otyp) {
156.  	case SPEED_BOOTS:
157.  		if (!(oldprop & TIMEOUT)) {
158.  			makeknown(obj->otyp);
159.  			You("feel yourself slow down%s.",
160.  				oldprop ? " a bit" : "");
161.  		}
162.  		break;
163.  	case WATER_WALKING_BOOTS:
164.  		if(is_pool(u.ux,u.uy) && !Levitation
165.  #ifdef POLYSELF
166.  		    && !is_flyer(uasmon) && !is_clinger(uasmon)
167.  #endif
168.  		    ) {
169.  			makeknown(obj->otyp);
170.  			/* make boots known in case you survive the drowning */
171.  			spoteffects();
172.  		}
173.  		break;
174.  	case ELVEN_BOOTS:
175.  		if (!oldprop) {
176.  			makeknown(obj->otyp);
177.  			You("sure are noisy.");
178.  		}
179.  		break;
180.  	case FUMBLE_BOOTS:
181.  		if (!(oldprop & ~TIMEOUT))
182.  			Fumbling = 0;
183.  		break;
184.  	case LEVITATION_BOOTS:
185.  		if (!oldprop) {
186.  			(void) float_down();
187.  			makeknown(obj->otyp);
188.  		}
189.  		break;
190.  	case LOW_BOOTS:
191.  	case IRON_SHOES:
192.  	case HIGH_BOOTS:
193.  	case JUMPING_BOOTS:
194.  		break;
195.  	default: impossible("Unknown type of boots (%d)", obj->otyp);
196.      }
197.      return 0;
198.  }
199.  
200.  static int
201.  Cloak_on() {
202.      long oldprop = u.uprops[objects[uarmc->otyp].oc_oprop].p_flgs & ~WORN_CLOAK;
203.  
204.      switch(uarmc->otyp) {
205.  	case ELVEN_CLOAK:
206.  	case CLOAK_OF_PROTECTION:
207.  	case CLOAK_OF_DISPLACEMENT:
208.  		makeknown(uarmc->otyp);
209.  		break;
210.  	case MUMMY_WRAPPING:
211.  	case ORCISH_CLOAK:
212.  	case DWARVISH_CLOAK:
213.  	case CLOAK_OF_MAGIC_RESISTANCE:
214.  		break;
215.  	case CLOAK_OF_INVISIBILITY:
216.  		if (!oldprop && !See_invisible && !Blind) {
217.  			makeknown(uarmc->otyp);
218.  			newsym(u.ux,u.uy);
219.  			pline("Suddenly you cannot see yourself.");
220.  		}
221.  		break;
222.  	case OILSKIN_CLOAK:
223.  		pline("The %s fits very tightly.",xname(uarmc));
224.  		break;
225.  	default: impossible("Unknown type of cloak (%d)", uarmc->otyp);
226.      }
227.      return 0;
228.  }
229.  
230.  int
231.  Cloak_off() {
232.      long oldprop = u.uprops[objects[uarmc->otyp].oc_oprop].p_flgs & ~WORN_CLOAK;
233.  
234.      switch(uarmc->otyp) {
235.  	case MUMMY_WRAPPING:
236.  	case ELVEN_CLOAK:
237.  	case ORCISH_CLOAK:
238.  	case DWARVISH_CLOAK:
239.  	case CLOAK_OF_PROTECTION:
240.  	case CLOAK_OF_MAGIC_RESISTANCE:
241.  	case CLOAK_OF_DISPLACEMENT:
242.  	case OILSKIN_CLOAK:
243.  		break;
244.  	case CLOAK_OF_INVISIBILITY:
245.  		if (!oldprop && !See_invisible && !Blind) {
246.  			makeknown(uarmc->otyp);
247.  			setworn((struct obj *)0, W_ARMC);
248.  			newsym(u.ux,u.uy);
249.  			pline("Suddenly you can see yourself.");
250.  			return 0;
251.  		}
252.  		break;
253.  	default: impossible("Unknown type of cloak (%d)", uarmc->otyp);
254.      }
255.      setworn((struct obj *)0, W_ARMC);
256.      return 0;
257.  }
258.  
259.  STATIC_PTR
260.  int
261.  Helmet_on()
262.  {
263.      switch(uarmh->otyp) {
264.  	case FEDORA:
265.  	case HELMET:
266.  	case DENTED_POT:
267.  	case ELVEN_LEATHER_HELM:
268.  	case DWARVISH_IRON_HELM:
269.  	case ORCISH_HELM:
270.  	case HELM_OF_TELEPATHY:
271.  		break;
272.  	case HELM_OF_BRILLIANCE:
273.  		if (uarmh->spe) {
274.  			ABON(A_INT) += uarmh->spe;
275.  			ABON(A_WIS) += uarmh->spe;
276.  			flags.botl = 1;
277.  			makeknown(uarmh->otyp);
278.  		}
279.  		break;
280.  	case HELM_OF_OPPOSITE_ALIGNMENT:
281.  		if (u.ualign.type == A_NEUTRAL)
282.  		    u.ualign.type = rn2(2) ? A_CHAOTIC : A_LAWFUL;
283.  		else u.ualign.type = -(u.ualign.type);
284.  		makeknown(uarmh->otyp);
285.  		flags.botl = 1;
286.  		break;
287.  	default: impossible("Unknown type of helm (%d)", uarmh->otyp);
288.      }
289.      return 0;
290.  }
291.  
292.  int
293.  Helmet_off()
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.  		break;
303.  	case HELM_OF_TELEPATHY:
304.  		/* need to update ability before calling see_monsters() */
305.  		setworn((struct obj *)0, W_ARMH);
306.  		see_monsters();
307.  		return 0;
308.  	case HELM_OF_BRILLIANCE:
309.  		if (uarmh->spe) {
310.  			ABON(A_INT) -= uarmh->spe;
311.  			ABON(A_WIS) -= uarmh->spe;
312.  			flags.botl = 1;
313.  		}
314.  		break;
315.  	case HELM_OF_OPPOSITE_ALIGNMENT:
316.  		u.ualign.type = u.ualignbase[0];
317.  		flags.botl = 1;
318.  		break;
319.  	default: impossible("Unknown type of helm (%d)", uarmh->otyp);
320.      }
321.      setworn((struct obj *)0, W_ARMH);
322.      return 0;
323.  }
324.  
325.  STATIC_PTR
326.  int
327.  Gloves_on() {
328.      long oldprop =
329.  	u.uprops[objects[uarmg->otyp].oc_oprop].p_flgs & ~(WORN_GLOVES | TIMEOUT);
330.  
331.      switch(uarmg->otyp) {
332.  	case LEATHER_GLOVES:
333.  		break;
334.  	case GAUNTLETS_OF_FUMBLING:
335.  		if (!oldprop)
336.  			Fumbling += rnd(20);
337.  		break;
338.  	case GAUNTLETS_OF_POWER:
339.  		makeknown(uarmg->otyp);
340.  		flags.botl = 1; /* taken care of in attrib.c */
341.  		break;
342.  	case GAUNTLETS_OF_DEXTERITY:
343.  		if (uarmg->spe) makeknown(uarmg->otyp);
344.  		ABON(A_DEX) += uarmg->spe;
345.  		flags.botl = 1;
346.  		break;
347.  	default: impossible("Unknown type of gloves (%d)", uarmg->otyp);
348.      }
349.      return 0;
350.  }
351.  
352.  int
353.  Gloves_off() {
354.      long oldprop =
355.  	u.uprops[objects[uarmg->otyp].oc_oprop].p_flgs & ~(WORN_GLOVES | TIMEOUT);
356.  
357.      switch(uarmg->otyp) {
358.  	case LEATHER_GLOVES:
359.  		break;
360.  	case GAUNTLETS_OF_FUMBLING:
361.  		if (!oldprop)
362.  			Fumbling = 0;
363.  		break;
364.  	case GAUNTLETS_OF_POWER:
365.  		makeknown(uarmg->otyp);
366.  		flags.botl = 1; /* taken care of in attrib.c */
367.  		break;
368.  	case GAUNTLETS_OF_DEXTERITY:
369.  		if (uarmg->spe) makeknown(uarmg->otyp);
370.  		ABON(A_DEX) -= uarmg->spe;
371.  		flags.botl = 1;
372.  		break;
373.  	default: impossible("Unknown type of gloves (%d)", uarmg->otyp);
374.      }
375.      setworn((struct obj *)0, W_ARMG);
376.      if (uwep && uwep->otyp == CORPSE && uwep->corpsenm == PM_COCKATRICE
377.  #ifdef POLYSELF
378.  	    && !(poly_when_stoned(uasmon) && polymon(PM_STONE_GOLEM))
379.  #endif
380.  							) {
381.  	/* Prevent wielding cockatrice when not wearing gloves */
382.  	You("wield the cockatrice corpse in your bare %s.",
383.  	    makeplural(body_part(HAND)));
384.  	You("turn to stone...");
385.  	killer_format = KILLED_BY_AN;
386.  	killer = "cockatrice corpse";
387.  	done(STONING);
388.      }
389.      return 0;
390.  }
391.  
392.  /*
393.  static int
394.  Shield_on() {
395.      switch(uarms->otyp) {
396.  	case SMALL_SHIELD:
397.  	case ELVEN_SHIELD:
398.  	case URUK_HAI_SHIELD:
399.  	case ORCISH_SHIELD:
400.  	case DWARVISH_ROUNDSHIELD:
401.  	case LARGE_SHIELD:
402.  	case SHIELD_OF_REFLECTION:
403.  		break;
404.  	default: impossible("Unknown type of shield (%d)", uarms->otyp);
405.      }
406.      return 0;
407.  }
408.  */
409.  
410.  int
411.  Shield_off() {
412.  /*
413.      switch(uarms->otyp) {
414.  	case SMALL_SHIELD:
415.  	case ELVEN_SHIELD:
416.  	case URUK_HAI_SHIELD:
417.  	case ORCISH_SHIELD:
418.  	case DWARVISH_ROUNDSHIELD:
419.  	case LARGE_SHIELD:
420.  	case SHIELD_OF_REFLECTION:
421.  		break;
422.  	default: impossible("Unknown type of shield (%d)", uarms->otyp);
423.      }
424.  */
425.      setworn((struct obj *)0, W_ARMS);
426.      return 0;
427.  }
428.  
429.  /* This must be done in worn.c, because one of the possible intrinsics conferred
430.   * is fire resistance, and we have to immediately set HFire_resistance in worn.c
431.   * since worn.c will check it before returning.
432.   */
433.  STATIC_PTR
434.  int
435.  Armor_on()
436.  {
437.      return 0;
438.  }
439.  
440.  int
441.  Armor_off()
442.  {
443.      setworn((struct obj *)0, W_ARM);
444.      return 0;
445.  }
446.  
447.  /* The gone functions differ from the off functions in that if you die from
448.   * taking it off and have life saving, you still die.
449.   */
450.  int
451.  Armor_gone()
452.  {
453.      setnotworn(uarm);
454.      return 0;
455.  }
456.  
457.  static void
458.  Amulet_on()
459.  {
460.      switch(uamul->otyp) {
461.  	case AMULET_OF_ESP:
462.  	case AMULET_OF_LIFE_SAVING:
463.  	case AMULET_VERSUS_POISON:
464.  	case AMULET_OF_REFLECTION:
465.  	case AMULET_OF_MAGICAL_BREATHING:
466.  	case FAKE_AMULET_OF_YENDOR:
467.  		break;
468.  	case AMULET_OF_CHANGE:
469.  		makeknown(AMULET_OF_CHANGE);
470.  		change_sex();
471.  		/* Don't use same message as polymorph */
472.  		You("are suddenly very %s!", flags.female ? "feminine"
473.  			: "masculine");
474.  		flags.botl = 1;
475.  		pline("The amulet disintegrates!");
476.  		useup(uamul);
477.  		break;
478.  	case AMULET_OF_STRANGULATION:
479.  		makeknown(AMULET_OF_STRANGULATION);
480.  		pline("It constricts your throat!");
481.  		Strangled = 6;
482.  		break;
483.  	case AMULET_OF_RESTFUL_SLEEP:
484.  		Sleeping = rnd(100);
485.  		break;
486.  	case AMULET_OF_YENDOR:
487.  		break;
488.      }
489.  }
490.  
491.  void
492.  Amulet_off()
493.  {
494.      switch(uamul->otyp) {
495.  	case AMULET_OF_ESP:
496.  		/* need to update ability before calling see_monsters() */
497.  		setworn((struct obj *)0, W_AMUL);
498.  		see_monsters();
499.  		return;
500.  	case AMULET_OF_LIFE_SAVING:
501.  	case AMULET_VERSUS_POISON:
502.  	case AMULET_OF_REFLECTION:
503.  	case FAKE_AMULET_OF_YENDOR:
504.  		break;
505.  	case AMULET_OF_MAGICAL_BREATHING:
506.  		if (Underwater) {
507.  			You("suddenly inhale an unhealthy amount of water!");
508.  			/* Magical_breathing has to be set
509.  			   off before calling drown() */
510.  			setworn((struct obj *)0, W_AMUL);
511.  			(void) drown();
512.  			return;
513.  		}
514.  		break;
515.  	case AMULET_OF_CHANGE:
516.  		impossible("Wearing an amulet of change?");
517.  		break;
518.  	case AMULET_OF_STRANGULATION:
519.  		if (Strangled) {
520.  			You("can breathe more easily!");
521.  			Strangled = 0;
522.  		}
523.  		break;
524.  	case AMULET_OF_RESTFUL_SLEEP:
525.  		Sleeping = 0;
526.  		break;
527.  	case AMULET_OF_YENDOR:
528.  		break;
529.      }
530.      setworn((struct obj *)0, W_AMUL);
531.  }
532.  
533.  void
534.  Ring_on(obj)
535.  register struct obj *obj;
536.  {
537.      long oldprop = u.uprops[objects[obj->otyp].oc_oprop].p_flgs & ~W_RING;
538.  
539.      /* might put on two rings of the same type */
540.      if((u.uprops[objects[obj->otyp].oc_oprop].p_flgs & W_RING) == W_RING)
541.  	oldprop = 1;
542.  
543.      switch(obj->otyp){
544.  	case RIN_TELEPORTATION:
545.  	case RIN_REGENERATION:
546.  	case RIN_SEARCHING:
547.  	case RIN_STEALTH:
548.  	case RIN_HUNGER:
549.  	case RIN_AGGRAVATE_MONSTER:
550.  	case RIN_POISON_RESISTANCE:
551.  	case RIN_FIRE_RESISTANCE:
552.  	case RIN_COLD_RESISTANCE:
553.  	case RIN_SHOCK_RESISTANCE:
554.  	case RIN_CONFLICT:
555.  	case RIN_WARNING:
556.  	case RIN_TELEPORT_CONTROL:
557.  #ifdef POLYSELF
558.  	case RIN_POLYMORPH:
559.  	case RIN_POLYMORPH_CONTROL:
560.  #endif
561.  		break;
562.  	case RIN_SEE_INVISIBLE:
563.  		/* can now see invisible monsters */
564.  		set_mimic_blocking(); /* do special mimic handling */
565.  		see_monsters();
566.  
567.  		if (Invis && !oldprop
568.  #ifdef POLYSELF
569.  				&& !perceives(uasmon)
570.  #endif
571.  							&& !Blind) {
572.  			newsym(u.ux,u.uy);
573.  			pline("Suddenly you can see yourself.");
574.  			makeknown(RIN_SEE_INVISIBLE);
575.  		}
576.  		break;
577.  	case RIN_INVISIBILITY:
578.  		if (!oldprop && !See_invisible && !Blind) {
579.  			makeknown(RIN_INVISIBILITY);
580.  			newsym(u.ux,u.uy);
581.  			Your("body takes on a %s transparency...",
582.  				Hallucination ? "normal" : "strange");
583.  		}
584.  		break;
585.  	case RIN_ADORNMENT:
586.  		ABON(A_CHA) += obj->spe;
587.  		flags.botl = 1;
588.  		if (obj->spe || objects[RIN_ADORNMENT].oc_name_known) {
589.  			makeknown(RIN_ADORNMENT);
590.  			obj->known = TRUE;
591.  		}
592.  		break;
593.  	case RIN_LEVITATION:
594.  		if(!oldprop) {
595.  			float_up();
596.  			makeknown(RIN_LEVITATION);
597.  			obj->known = TRUE;
598.  		}
599.  		break;
600.  	case RIN_GAIN_STRENGTH:
601.  		ABON(A_STR) += obj->spe;
602.  		flags.botl = 1;
603.  		if (obj->spe || objects[RIN_GAIN_STRENGTH].oc_name_known) {
604.  			makeknown(RIN_GAIN_STRENGTH);
605.  			obj->known = TRUE;
606.  		}
607.  		break;
608.  	case RIN_INCREASE_DAMAGE:
609.  		u.udaminc += obj->spe;
610.  		break;
611.  	case RIN_PROTECTION_FROM_SHAPE_CHAN:
612.  		rescham();
613.  		break;
614.  	case RIN_PROTECTION:
615.  		flags.botl = 1;
616.  		if (obj->spe || objects[RIN_PROTECTION].oc_name_known) {
617.  			makeknown(RIN_PROTECTION);
618.  			obj->known = TRUE;
619.  		}
620.  		break;
621.      }
622.  }
623.  
624.  static void
625.  Ring_off_or_gone(obj,gone)
626.  register struct obj *obj;
627.  boolean gone;
628.  {
629.      register long mask = obj->owornmask & W_RING;
630.  
631.      if(!(u.uprops[objects[obj->otyp].oc_oprop].p_flgs & mask))
632.  	impossible("Strange... I didn't know you had that ring.");
633.      if(gone) setnotworn(obj);
634.      else setworn((struct obj *)0, obj->owornmask);
635.      switch(obj->otyp) {
636.  	case RIN_TELEPORTATION:
637.  	case RIN_REGENERATION:
638.  	case RIN_SEARCHING:
639.  	case RIN_STEALTH:
640.  	case RIN_HUNGER:
641.  	case RIN_AGGRAVATE_MONSTER:
642.  	case RIN_POISON_RESISTANCE:
643.  	case RIN_FIRE_RESISTANCE:
644.  	case RIN_COLD_RESISTANCE:
645.  	case RIN_SHOCK_RESISTANCE:
646.  	case RIN_CONFLICT:
647.  	case RIN_WARNING:
648.  	case RIN_TELEPORT_CONTROL:
649.  #ifdef POLYSELF
650.  	case RIN_POLYMORPH:
651.  	case RIN_POLYMORPH_CONTROL:
652.  #endif
653.  		break;
654.  	case RIN_SEE_INVISIBLE:
655.  		/* Make invisible monsters go away */
656.  		if (!See_invisible) {
657.  		    set_mimic_blocking(); /* do special mimic handling */
658.  		    see_monsters();
659.  		}
660.  
661.  		if (Invisible && !Blind) {
662.  			newsym(u.ux,u.uy);
663.  			pline("Suddenly you cannot see yourself.");
664.  			makeknown(RIN_SEE_INVISIBLE);
665.  		}
666.  		break;
667.  	case RIN_INVISIBILITY:
668.  		if (!(Invisible & ~W_RING) && !See_invisible && !Blind) {
669.  			newsym(u.ux,u.uy);
670.  			Your("body seems to unfade...");
671.  			makeknown(RIN_INVISIBILITY);
672.  		}
673.  		break;
674.  	case RIN_ADORNMENT:
675.  		ABON(A_CHA) -= obj->spe;
676.  		flags.botl = 1;
677.  		break;
678.  	case RIN_LEVITATION:
679.  		(void) float_down();
680.  		if (!Levitation) makeknown(RIN_LEVITATION);
681.  		break;
682.  	case RIN_GAIN_STRENGTH:
683.  		ABON(A_STR) -= obj->spe;
684.  		flags.botl = 1;
685.  		break;
686.  	case RIN_INCREASE_DAMAGE:
687.  		u.udaminc -= obj->spe;
688.  		break;
689.  	case RIN_PROTECTION_FROM_SHAPE_CHAN:
690.  		/* If you're no longer protected, let the chameleons
691.  		 * change shape again -dgk
692.  		 */
693.  		restartcham();
694.  		break;
695.      }
696.  }
697.  
698.  void
699.  Ring_off(obj)
700.  struct obj *obj;
701.  {
702.  	Ring_off_or_gone(obj,FALSE);
703.  }
704.  
705.  void
706.  Ring_gone(obj)
707.  struct obj *obj;
708.  {
709.  	Ring_off_or_gone(obj,TRUE);
710.  }
711.  
712.  void
713.  Blindf_on(otmp)
714.  register struct obj *otmp;
715.  {
716.  	long already_blinded = Blinded;
717.  	setworn(otmp, W_TOOL);
718.  	if (otmp->otyp == TOWEL && flags.verbose)
719.  	    You("wrap %s around your %s.", an(xname(otmp)), body_part(HEAD));
720.  	on_msg(otmp);
721.  	if (!already_blinded) {
722.  	    if (Punished) set_bc(0);	/* Set ball&chain variables before */
723.  					/* the hero goes blind.		   */
724.  	    if (Telepat) see_monsters();/* sense monsters */
725.  	    vision_full_recalc = 1;	/* recalc vision limits */
726.  	    flags.botl = 1;
727.  	}
728.  }
729.  
730.  void
731.  Blindf_off(otmp)
732.  register struct obj *otmp;
733.  {
734.  	setworn((struct obj *)0, otmp->owornmask);
735.  	off_msg(otmp);
736.  	if (!Blinded) {
737.  	    if (Telepat) see_monsters();/* no longer sense monsters */
738.  	    vision_full_recalc = 1;	/* recalc vision limits */
739.  	    flags.botl = 1;
740.  	} else
741.  	    You("still cannot see.");
742.  }
743.  
744.  /* called in main to set intrinsics of worn start-up items */
745.  void
746.  set_wear() {
747.  	if (uarm)  (void) Armor_on();
748.  	if (uarmc) (void) Cloak_on();
749.  	if (uarmf) (void) Boots_on();
750.  	if (uarmg) (void) Gloves_on();
751.  	if (uarmh) (void) Helmet_on();
752.  /*	if (uarms) (void) Shield_on(); */
753.  }
754.  
755.  boolean
756.  donning(otmp)
757.  register struct obj *otmp;
758.  {
759.      return (otmp == uarmf && (afternmv == Boots_on || afternmv == Boots_off))
760.  	|| (otmp == uarmh && (afternmv == Helmet_on || afternmv == Helmet_off))
761.  	|| (otmp == uarmg && (afternmv == Gloves_on || afternmv == Gloves_off))
762.  	|| (otmp == uarm && (afternmv == Armor_on || afternmv == Armor_off));
763.  }
764.  
765.  void
766.  cancel_don()
767.  {
768.  	/* the piece of armor we were donning/doffing has vanished, so stop
769.  	 * wasting time on it (and don't dereference it when donning would
770.  	 * otherwise finish)
771.  	 */
772.  	afternmv = 0;
773.  	nomovemsg = NULL;
774.  	multi = 0;
775.  }
776.  
777.  static const char NEARDATA clothes[] = {ARMOR_CLASS, 0};
778.  static const char NEARDATA accessories[] = {RING_CLASS, AMULET_CLASS, TOOL_CLASS, 0};
779.  
780.  int
781.  dotakeoff()
782.  {
783.  	register struct obj *otmp = (struct obj *)0;
784.  	int armorpieces = 0;
785.  
786.  #define MOREARM(x) if (x) { armorpieces++; otmp = x; }
787.  	MOREARM(uarmh);
788.  	MOREARM(uarms);
789.  	MOREARM(uarmg);
790.  	MOREARM(uarmf);
791.  	if (uarmc) {
792.  		armorpieces++;
793.  		otmp = uarmc;
794.  	} else if (uarm) {
795.  		armorpieces++;
796.  		otmp = uarm;
797.  #ifdef TOURIST
798.  	} else if (uarmu) {
799.  		armorpieces++;
800.  		otmp = uarmu;
801.  #endif
802.  	}
803.  	if (!armorpieces) {
804.  #ifdef POLYSELF
805.  		if (uskin)
806.  		    pline("The dragon scale mail is merged with your skin!");
807.  		else
808.  #endif
809.  		    pline("Not wearing any armor.");
810.  		return 0;
811.  	}
812.  	if (armorpieces > 1)
813.  		otmp = getobj(clothes, "take off");
814.  	if (otmp == 0) return(0);
815.  	if (!(otmp->owornmask & W_ARMOR)) {
816.  		You("are not wearing that.");
817.  		return(0);
818.  	}
819.  	if (((otmp == uarm) && (uarmc))
820.  #ifdef TOURIST
821.  				|| ((otmp == uarmu) && (uarmc || uarm))
822.  #endif
823.  								) {
824.  		You("can't take that off.");
825.  		return(0);
826.  	}
827.  	if(otmp == uarmg && welded(uwep)) {
828.      You("seem unable to take off the gloves while holding your %s.",
829.  	  is_sword(uwep) ? "sword" : "weapon");
830.  		uwep->bknown = TRUE;
831.  		return(0);
832.  	}
833.  	if(otmp == uarmg && Glib) {
834.      You("can't remove the slippery gloves with your slippery fingers.");
835.  		return(0);
836.  	}
837.  	if(otmp == uarmf && u.utrap && (u.utraptype == TT_BEARTRAP ||
838.  					u.utraptype == TT_INFLOOR)) { /* -3. */
839.  	    if(u.utraptype == TT_BEARTRAP)
840.  		pline("The bear trap prevents you from pulling your %s out.",
841.  		      body_part(FOOT));
842.  	    else
843.  		You("are stuck in the floor, and cannot pull your %s out.",
844.  		     makeplural(body_part(FOOT)));
845.  		return(0);
846.  	}
847.  	reset_remarm();			/* since you may change ordering */
848.  	(void) armoroff(otmp);
849.  	return(1);
850.  }
851.  
852.  int
853.  doremring() {
854.  #ifdef GCC_WARN
855.  	register struct obj *otmp = (struct obj *)0;
856.  		/* suppress "may be used uninitialized" warning */
857.  #else
858.  	register struct obj *otmp;
859.  #endif
860.  	int Accessories = 0;
861.  
862.  #define MOREACC(x) if (x) { Accessories++; otmp = x; }
863.  	MOREACC(uleft);
864.  	MOREACC(uright);
865.  	MOREACC(uamul);
866.  	MOREACC(ublindf);
867.  
868.  	if(!Accessories) {
869.  		pline("Not wearing any accessories.");
870.  		return(0);
871.  	}
872.  	if (Accessories != 1) otmp = getobj(accessories, "take off");
873.  	if(!otmp) return(0);
874.  	if(!(otmp->owornmask & (W_RING | W_AMUL | W_TOOL))) {
875.  		You("are not wearing that.");
876.  		return(0);
877.  	}
878.  	if(cursed(otmp)) return(0);
879.  	if(otmp->oclass == RING_CLASS) {
880.  #ifdef POLYSELF
881.  		if (nolimbs(uasmon)) {
882.  			pline("It seems to be stuck.");
883.  			return(0);
884.  		}
885.  #endif
886.  		if (uarmg && uarmg->cursed) {
887.  			uarmg->bknown = TRUE;
888.  You("seem unable to remove your ring without taking off your gloves.");
889.  			return(0);
890.  		}
891.  		if (welded(uwep) && bimanual(uwep)) {
892.  			uwep->bknown = TRUE;
893.  You("seem unable to remove the ring while your hands hold your %s.",
894.  				is_sword(uwep) ? "sword" : "weapon");
895.  			return(0);
896.  		}
897.  		if (welded(uwep) && otmp==uright) {
898.  			uwep->bknown = TRUE;
899.  You("seem unable to remove the ring while your right hand holds your %s.",
900.  				is_sword(uwep) ? "sword" : "weapon");
901.  			return(0);
902.  		}
903.  		/* Sometimes we want to give the off_msg before removing and
904.  		 * sometimes after; for instance, "you were wearing a moonstone
905.  		 * ring (on right hand)" is desired but "you were wearing a
906.  		 * square amulet (being worn)" is not because of the redundant
907.  		 * "being worn".
908.  		 */
909.  		off_msg(otmp);
910.  		Ring_off(otmp);
911.  	} else if(otmp->oclass == AMULET_CLASS) {
912.  		Amulet_off();
913.  		off_msg(otmp);
914.  	} else Blindf_off(otmp); /* does its own off_msg */
915.  	return(1);
916.  }
917.  
918.  int
919.  cursed(otmp) register struct obj *otmp; {
920.  	/* Curses, like chickens, come home to roost. */
921.  	if(otmp->cursed){
922.  		You("can't.  %s to be cursed.",
923.  			(is_boots(otmp) || is_gloves(otmp) || otmp->quan > 1L)
924.  			? "They seem" : "It seems");
925.  		otmp->bknown = TRUE;
926.  		return(1);
927.  	}
928.  	return(0);
929.  }
930.  
931.  int
932.  armoroff(otmp) register struct obj *otmp; {
933.  	register int delay = -objects[otmp->otyp].oc_delay;
934.  
935.  	if(cursed(otmp)) return(0);
936.  	if(delay) {
937.  		nomul(delay);
938.  		if (is_helmet(otmp)) {
939.  			nomovemsg = "You finish taking off your helmet.";
940.  			afternmv = Helmet_off;
941.  		     }
942.  		else if (is_gloves(otmp)) {
943.  			nomovemsg = "You finish taking off your gloves.";
944.  			afternmv = Gloves_off;
945.  		     }
946.  		else if (is_boots(otmp)) {
947.  			nomovemsg = "You finish taking off your boots.";
948.  			afternmv = Boots_off;
949.  		     }
950.  		else {
951.  			nomovemsg = "You finish taking off your suit.";
952.  			afternmv = Armor_off;
953.  		}
954.  	} else {
955.  		/* Be warned!  We want off_msg after removing the item to
956.  		 * avoid "You were wearing ____ (being worn)."  However, an
957.  		 * item which grants fire resistance might cause some trouble
958.  		 * if removed in Hell and lifesaving puts it back on; in this
959.  		 * case the message will be printed at the wrong time (after
960.  		 * the messages saying you died and were lifesaved).  Luckily,
961.  		 * no cloak, shield, or fast-removable armor grants fire
962.  		 * resistance, so we can safely do the off_msg afterwards.
963.  		 * Rings do grant fire resistance, but for rings we want the
964.  		 * off_msg before removal anyway so there's no problem.  Take
965.  		 * care in adding armors granting fire resistance; this code
966.  		 * might need modification.
967.  		 */
968.  		if(is_cloak(otmp))
969.  			(void) Cloak_off();
970.  		else if(is_shield(otmp))
971.  			(void) Shield_off();
972.  		else setworn((struct obj *)0, otmp->owornmask & W_ARMOR);
973.  		off_msg(otmp);
974.  	}
975.  	takeoff_mask = taking_off = 0L;
976.  	return(1);
977.  }
978.  
979.  static void
980.  already_wearing(cc)
981.  const char *cc;
982.  {
983.  	You("are already wearing %s", cc);
984.  }
985.  
986.  int
987.  dowear()
988.  {
989.  	register struct obj *otmp;
990.  	register int delay;
991.  	register int err = 0;
992.  	long mask = 0;
993.  
994.  #ifdef POLYSELF
995.  	/* cantweararm checks for suits of armor */
996.  	/* verysmall or nohands checks for shields, gloves, etc... */
997.  	if ((verysmall(uasmon) || nohands(uasmon))) {
998.  		pline("Don't even bother.");
999.  		return(0);
1000. 	}
1001. #endif
1002. 	otmp = getobj(clothes, "wear");
1003. 	if(!otmp) return(0);
1004. #ifdef POLYSELF
1005. 	if (cantweararm(uasmon) && !is_shield(otmp) &&
1006. 			!is_helmet(otmp) && !is_gloves(otmp) &&
1007. 			!is_boots(otmp)) {
1008. 		pline("The %s will not fit on your body.",
1009. 			is_cloak(otmp) ? "cloak" :
1010. # ifdef TOURIST
1011. 			otmp->otyp == HAWAIIAN_SHIRT ? "shirt" :
1012. # endif
1013. 			"suit");
1014. 		return(0);
1015. 	}
1016. #endif
1017. 	if(otmp->owornmask & W_ARMOR) {
1018. 		already_wearing("that!");
1019. 		return(0);
1020. 	}
1021. 	if(is_helmet(otmp)) {
1022. 		if(uarmh) {
1023. 			already_wearing("a helmet.");
1024. 			err++;
1025. 		} else
1026. 			mask = W_ARMH;
1027. 	} else if(is_shield(otmp)){
1028. 		if(uarms) {
1029. 			already_wearing("a shield.");
1030. 			err++;
1031. 		}
1032. 		if(uwep && bimanual(uwep)) {
1033. 		    You("cannot wear a shield while wielding a two-handed %s.",
1034. 			is_sword(uwep) ? "sword" :
1035. 				uwep->otyp == BATTLE_AXE ? "axe" : "weapon");
1036. 			err++;
1037. 		}
1038. 		if(!err) mask = W_ARMS;
1039. 	} else if(is_boots(otmp)) {
1040. 		   if(uarmf) {
1041. 			already_wearing("boots.");
1042. 			err++;
1043. 		   } if (u.utrap && (u.utraptype == TT_BEARTRAP ||
1044. 				     u.utraptype == TT_INFLOOR)) {
1045. 		       if (u.utraptype == TT_BEARTRAP)
1046. 			   Your("%s is trapped!", body_part(FOOT));
1047. 		       else
1048. 			   Your("%s are stuck in the floor!",
1049. 				makeplural(body_part(FOOT)));
1050. 		       err++;
1051. 		   } else
1052. 			mask = W_ARMF;
1053. 	} else if(is_gloves(otmp)) {
1054. 		if(uarmg) {
1055. 			already_wearing("gloves.");
1056. 			err++;
1057. 		} else
1058. 		if (welded(uwep)) {
1059. 			You("cannot wear gloves over your %s.",
1060. 			      is_sword(uwep) ? "sword" : "weapon");
1061. 			err++;
1062. 		} else
1063. 			mask = W_ARMG;
1064. #ifdef TOURIST
1065. 	} else if( otmp->otyp == HAWAIIAN_SHIRT ) {
1066. 		if (uarm || uarmc || uarmu) {
1067. 			if(uarmu)
1068. 			   already_wearing("a shirt.");
1069. 			else
1070. 			   You("can't wear that over your %s.",
1071. 				 (uarm && !uarmc) ? "armor" : "cloak");
1072. 			err++;
1073. 		} else
1074. 			mask = W_ARMU;
1075. #endif
1076. 	} else if(is_cloak(otmp)) {
1077. 		if(uarmc) {
1078. 			already_wearing("a cloak.");
1079. 			err++;
1080. 		} else
1081. 			mask = W_ARMC;
1082. 	} else {
1083. 		if(uarmc) {
1084. 			You("cannot wear armor over a cloak.");
1085. 			err++;
1086. 		} else if(uarm) {
1087. 			already_wearing("some armor.");
1088. 			err++;
1089. 		}
1090. 		if(!err) mask = W_ARM;
1091. 	}
1092. /* Unnecessary since now only weapons and special items like pick-axes get
1093.  * welded to your hand, not armor
1094. 	if(welded(otmp)) {
1095. 		if(!err++)
1096. 			weldmsg(otmp, FALSE);
1097. 	}
1098.  */
1099. 	if(err) return(0);
1100. 
1101. 	otmp->known = TRUE;
1102. 	if(otmp == uwep)
1103. 		setuwep((struct obj *)0);
1104. 	setworn(otmp, mask);
1105. 	delay = -objects[otmp->otyp].oc_delay;
1106. 	if(delay){
1107. 		nomul(delay);
1108. 		if(is_boots(otmp)) afternmv = Boots_on;
1109. 		if(is_helmet(otmp)) afternmv = Helmet_on;
1110. 		if(is_gloves(otmp)) afternmv = Gloves_on;
1111. 		if(otmp == uarm) afternmv = Armor_on;
1112. 		nomovemsg = "You finish your dressing maneuver.";
1113. 	} else {
1114. 		if(is_cloak(otmp)) (void) Cloak_on();
1115. /*		if(is_shield(otmp)) (void) Shield_on(); */
1116. 		on_msg(otmp);
1117. 	}
1118. 	takeoff_mask = taking_off = 0L;
1119. 	return(1);
1120. }
1121. 
1122. int
1123. doputon() {
1124. 	register struct obj *otmp;
1125. 	long mask = 0L;
1126. 
1127. 	if(uleft && uright && uamul && ublindf) {
1128. #ifdef POLYSELF
1129. 		Your("%s%s are full, and you're already wearing an amulet and a blindfold.",
1130. 			humanoid(uasmon) ? "ring-" : "",
1131. 			makeplural(body_part(FINGER)));
1132. #else
1133. 		Your("ring-fingers are full, and you're already wearing an amulet and a blindfold.");
1134. #endif
1135. 		return(0);
1136. 	}
1137. 	otmp = getobj(accessories, "wear");
1138. 	if(!otmp) return(0);
1139. 	if(otmp->owornmask & (W_RING | W_AMUL | W_TOOL)) {
1140. 		already_wearing("that!");
1141. 		return(0);
1142. 	}
1143. 	if(welded(otmp)) {
1144. 		weldmsg(otmp, TRUE);
1145. 		return(0);
1146. 	}
1147. 	if(otmp == uwep)
1148. 		setuwep((struct obj *)0);
1149. 	if(otmp->oclass == RING_CLASS) {
1150. #ifdef POLYSELF
1151. 		if(nolimbs(uasmon)) {
1152. 			You("cannot make the ring stick to your body.");
1153. 			return(0);
1154. 		}
1155. #endif
1156. 		if(uleft && uright){
1157. #ifdef POLYSELF
1158. 			pline("There are no more %s%s to fill.",
1159. 				humanoid(uasmon) ? "ring-" : "",
1160. 				makeplural(body_part(FINGER)));
1161. #else
1162. 			pline("There are no more ring-fingers to fill.");
1163. #endif
1164. 			return(0);
1165. 		}
1166. 		if(uleft) mask = RIGHT_RING;
1167. 		else if(uright) mask = LEFT_RING;
1168. 		else do {
1169. 			char qbuf[QBUFSZ];
1170. 			char answer;
1171. 
1172. #ifdef POLYSELF
1173. 			Sprintf(qbuf, "What %s%s, Right or Left?",
1174. 				humanoid(uasmon) ? "ring-" : "",
1175. 				body_part(FINGER));
1176. #else
1177. 			Strcpy(qbuf, "What ring-finger, Right or Left?");
1178. #endif
1179. 			if(!(answer = yn_function(qbuf, "rl", '\0')))
1180. 				return(0);
1181. 			switch(answer){
1182. 			case 'l':
1183. 			case 'L':
1184. 				mask = LEFT_RING;
1185. 				break;
1186. 			case 'r':
1187. 			case 'R':
1188. 				mask = RIGHT_RING;
1189. 				break;
1190. 			}
1191. 		} while(!mask);
1192. 		if (uarmg && uarmg->cursed) {
1193. 			uarmg->bknown = TRUE;
1194. 		    You("cannot remove your gloves to put on the ring.");
1195. 			return(0);
1196. 		}
1197. 		if (welded(uwep) && bimanual(uwep)) {
1198. 			/* welded will set bknown */
1199. 	    You("cannot free your weapon hands to put on the ring.");
1200. 			return(0);
1201. 		}
1202. 		if (welded(uwep) && mask==RIGHT_RING) {
1203. 			/* welded will set bknown */
1204. 	    You("cannot free your weapon hand to put on the ring.");
1205. 			return(0);
1206. 		}
1207. 		setworn(otmp, mask);
1208. 		Ring_on(otmp);
1209. 	} else if (otmp->oclass == AMULET_CLASS) {
1210. 		if(uamul) {
1211. 			already_wearing("an amulet.");
1212. 			return(0);
1213. 		}
1214. 		setworn(otmp, W_AMUL);
1215. 		if (otmp->otyp == AMULET_OF_CHANGE) {
1216. 			Amulet_on();
1217. 			/* Don't do a prinv() since the amulet is now gone */
1218. 			return(1);
1219. 		}
1220. 		Amulet_on();
1221. 	} else {	/* it's a blindfold */
1222. 		if (ublindf) {
1223. 			if (ublindf->otyp == TOWEL)
1224. 				Your("%s is already covered by a towel.",
1225. 					body_part(FACE));
1226. 			else
1227. 				already_wearing("a blindfold.");
1228. 			return(0);
1229. 		}
1230. 		if (otmp->otyp != BLINDFOLD && otmp->otyp != TOWEL) {
1231. 			You("can't wear that!");
1232. 			return(0);
1233. 		}
1234. 		Blindf_on(otmp);
1235. 		return(1);
1236. 	}
1237. 	prinv(NULL, otmp, 0L);
1238. 	return(1);
1239. }
1240. 
1241. #endif /* OVLB */
1242. 
1243. #ifdef OVL0
1244. 
1245. void
1246. find_ac() {
1247. 	register int uac = 10;
1248. #ifdef POLYSELF
1249. 	if (u.mtimedone) uac = mons[u.umonnum].ac;
1250. #endif
1251. 	if(uarm) uac -= ARM_BONUS(uarm);
1252. 	if(uarmc) uac -= ARM_BONUS(uarmc);
1253. 	if(uarmh) uac -= ARM_BONUS(uarmh);
1254. 	if(uarmf) uac -= ARM_BONUS(uarmf);
1255. 	if(uarms) uac -= ARM_BONUS(uarms);
1256. 	if(uarmg) uac -= ARM_BONUS(uarmg);
1257. #ifdef TOURIST
1258. 	if(uarmu) uac -= ARM_BONUS(uarmu);
1259. #endif
1260. 	if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe;
1261. 	if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe;
1262. 	if (Protection & INTRINSIC) uac -= u.ublessed;
1263. 	if(uac != u.uac){
1264. 		u.uac = uac;
1265. 		flags.botl = 1;
1266. 	}
1267. }
1268. 
1269. #endif /* OVL0 */
1270. #ifdef OVLB
1271. 
1272. void
1273. glibr()
1274. {
1275. 	register struct obj *otmp;
1276. 	int xfl = 0;
1277. 	boolean leftfall, rightfall;
1278. 
1279. 	leftfall = (uleft && !uleft->cursed &&
1280. 		    (!uwep || !welded(uwep) || !bimanual(uwep)));
1281. 	rightfall = (uright && !uright->cursed && (!welded(uwep)));
1282. 	if(!uarmg) if(leftfall || rightfall)
1283. #ifdef POLYSELF
1284. 				if(!nolimbs(uasmon))
1285. #endif
1286. 						{
1287. 		/* changed so cursed rings don't fall off, GAN 10/30/86 */
1288. 		Your("%s off your %s.",
1289. 			(leftfall && rightfall) ? "rings slip" : "ring slips",
1290. 			makeplural(body_part(FINGER)));
1291. 		xfl++;
1292. 		if(leftfall) {
1293. 			otmp = uleft;
1294. 			Ring_off(uleft);
1295. 			dropx(otmp);
1296. 		}
1297. 		if(rightfall) {
1298. 			otmp = uright;
1299. 			Ring_off(uright);
1300. 			dropx(otmp);
1301. 		}
1302. 	}
1303. 	otmp = uwep;
1304. 	if (otmp && !welded(otmp)) {
1305. 		/* changed so cursed weapons don't fall, GAN 10/30/86 */
1306. 		Your("%s %sslips from your %s.",
1307. 			is_sword(otmp) ? "sword" :
1308. 				makesingular(oclass_names[otmp->oclass]),
1309. 			xfl ? "also " : "",
1310. 			makeplural(body_part(HAND)));
1311. 		setuwep((struct obj *)0);
1312. 		dropx(otmp);
1313. 	}
1314. }
1315. 
1316. struct obj *
1317. some_armor(){
1318. register struct obj *otmph = (uarmc ? uarmc : uarm);
1319. 	if(uarmh && (!otmph || !rn2(4))) otmph = uarmh;
1320. 	if(uarmg && (!otmph || !rn2(4))) otmph = uarmg;
1321. 	if(uarmf && (!otmph || !rn2(4))) otmph = uarmf;
1322. 	if(uarms && (!otmph || !rn2(4))) otmph = uarms;
1323. #ifdef TOURIST
1324. 	if(!uarm && !uarmc && uarmu && (!otmph || !rn2(4))) otmph = uarmu;
1325. #endif
1326. 	return(otmph);
1327. }
1328. 
1329. void
1330. erode_armor(acid_dmg)
1331. boolean acid_dmg;
1332. {
1333. register struct obj *otmph = some_armor();
1334. 
1335. 	if (otmph && otmph != uarmf) {
1336. 	    if (otmph->greased) {
1337. 		grease_protect(otmph,NULL,FALSE);
1338. 		return;
1339. 	    }
1340. 	    if (otmph->oerodeproof ||
1341. 		(acid_dmg ? !is_corrodeable(otmph) : !is_rustprone(otmph))) {
1342. 		if (flags.verbose || !(otmph->oerodeproof && otmph->rknown))
1343. 			Your("%s not affected.", aobjnam(otmph, "are"));
1344. 		if (otmph->oerodeproof) otmph->rknown = TRUE;
1345. 		return;
1346. 	    }
1347. 	    if (otmph->oeroded < MAX_ERODE) {
1348. 		Your("%s%s!", aobjnam(otmph, acid_dmg ? "corrode" : "rust"),
1349. 			otmph->oeroded+1 == MAX_ERODE ? " completely" :
1350. 			otmph->oeroded ? " further" : "");
1351. 		otmph->oeroded++;
1352. 		return;
1353. 	    }
1354. 	    if (flags.verbose)
1355. 		Your("%s completely %s.",
1356. 		     aobjnam(otmph, Blind ? "feel" : "look"),
1357. 		     acid_dmg ? "corroded" : "rusty");
1358. 	}
1359. }
1360. 
1361. STATIC_PTR
1362. int
1363. select_off(otmp)
1364. register struct obj *otmp;
1365. {
1366. 	if(!otmp) return(0);
1367. 	if(cursed(otmp)) return(0);
1368. #ifdef POLYSELF
1369. 	if(otmp->oclass==RING_CLASS && nolimbs(uasmon)) return(0);
1370. #endif
1371. 	if(welded(uwep) && (otmp==uarmg || otmp==uright || (otmp==uleft
1372. 			&& bimanual(uwep))))
1373. 		return(0);
1374. 	if(uarmg && uarmg->cursed && (otmp==uright || otmp==uleft)) {
1375. 		uarmg->bknown = TRUE;
1376. 		return(0);
1377. 	}
1378. 	if(otmp == uarmf && u.utrap && (u.utraptype == TT_BEARTRAP ||
1379. 					u.utraptype == TT_INFLOOR)) {
1380. 		return (0);
1381. 	}
1382. 	if((otmp==uarm
1383. #ifdef TOURIST
1384. 			|| otmp==uarmu
1385. #endif
1386. 					) && uarmc && uarmc->cursed) {
1387. 		uarmc->bknown = TRUE;
1388. 		return(0);
1389. 	}
1390. #ifdef TOURIST
1391. 	if(otmp==uarmu && uarm && uarm->cursed) {
1392. 		uarm->bknown = TRUE;
1393. 		return(0);
1394. 	}
1395. #endif
1396. 
1397. 	if(otmp == uarm) takeoff_mask |= WORN_ARMOR;
1398. 	else if(otmp == uarmc) takeoff_mask |= WORN_CLOAK;
1399. 	else if(otmp == uarmf) takeoff_mask |= WORN_BOOTS;
1400. 	else if(otmp == uarmg) takeoff_mask |= WORN_GLOVES;
1401. 	else if(otmp == uarmh) takeoff_mask |= WORN_HELMET;
1402. 	else if(otmp == uarms) takeoff_mask |= WORN_SHIELD;
1403. #ifdef TOURIST
1404. 	else if(otmp == uarmu) takeoff_mask |= WORN_SHIRT;
1405. #endif
1406. 	else if(otmp == uleft) takeoff_mask |= LEFT_RING;
1407. 	else if(otmp == uright) takeoff_mask |= RIGHT_RING;
1408. 	else if(otmp == uamul) takeoff_mask |= WORN_AMUL;
1409. 	else if(otmp == ublindf) takeoff_mask |= WORN_BLINDF;
1410. 	else if(otmp == uwep) takeoff_mask |= 1L;	/* WIELDED_WEAPON */
1411. 
1412. 	else impossible("select_off: %s???", doname(otmp));
1413. 
1414. 	return(0);
1415. }
1416. 
1417. static struct obj *
1418. do_takeoff() {
1419. 
1420. 	register struct obj *otmp = (struct obj *)0;
1421. 
1422. 	if (taking_off == 1L) { /* weapon */
1423. 	  if(!cursed(uwep)) {
1424. 	    setuwep((struct obj *) 0);
1425. 	    You("are empty %s.", body_part(HANDED));
1426. 	  }
1427. 	} else if (taking_off ==  WORN_ARMOR) {
1428. 	  otmp = uarm;
1429. 	  if(!cursed(otmp)) (void) Armor_off();
1430. 	} else if (taking_off == WORN_CLOAK) {
1431. 	  otmp = uarmc;
1432. 	  if(!cursed(otmp)) (void) Cloak_off();
1433. 	} else if (taking_off == WORN_BOOTS) {
1434. 	  otmp = uarmf;
1435. 	  if(!cursed(otmp)) (void) Boots_off();
1436. 	} else if (taking_off == WORN_GLOVES) {
1437. 	  otmp = uarmg;
1438. 	  if(!cursed(otmp)) (void) Gloves_off();
1439. 	} else if (taking_off == WORN_HELMET) {
1440. 	  otmp = uarmh;
1441. 	  if(!cursed(otmp)) (void) Helmet_off();
1442. 	} else if (taking_off == WORN_SHIELD) {
1443. 	  otmp = uarms;
1444. 	  if(!cursed(otmp)) (void) Shield_off();
1445. #ifdef TOURIST
1446. 	} else if (taking_off == WORN_SHIRT) {
1447. 	  otmp = uarmu;
1448. 	  if(!cursed(otmp))
1449. 	    setworn((struct obj *)0, uarmu->owornmask & W_ARMOR);
1450. #endif
1451. 	} else if (taking_off == WORN_AMUL) {
1452. 	  otmp = uamul;
1453. 	  if(!cursed(otmp)) Amulet_off();
1454. 	} else if (taking_off == LEFT_RING) {
1455. 	  otmp = uleft;
1456. 	  if(!cursed(otmp)) Ring_off(uleft);
1457. 	} else if (taking_off == RIGHT_RING) {
1458. 	  otmp = uright;
1459. 	  if(!cursed(otmp)) Ring_off(uright);
1460. 	} else if (taking_off == WORN_BLINDF) {
1461. 	  if(!cursed(ublindf)) {
1462. 	    setworn((struct obj *)0, ublindf->owornmask);
1463. 	    if(!Blinded) make_blinded(1L,FALSE); /* See on next move */
1464. 	    else	 You("still cannot see.");
1465. 	  }
1466. 	} else impossible("do_takeoff: taking off %lx", taking_off);
1467. 
1468. 	return(otmp);
1469. }
1470. 
1471. STATIC_PTR
1472. int
1473. take_off() {
1474. 
1475. 	register int i;
1476. 	register struct obj *otmp;
1477. 
1478. 	if(taking_off) {
1479. 	    if(todelay > 0) {
1480. 
1481. 		todelay--;
1482. 		return(1);	/* still busy */
1483. 	    } else if((otmp = do_takeoff())) off_msg(otmp);
1484. 
1485. 	    takeoff_mask &= ~taking_off;
1486. 	    taking_off = 0L;
1487. 	}
1488. 
1489. 	for(i = 0; takeoff_order[i]; i++)
1490. 	    if(takeoff_mask & takeoff_order[i]) {
1491. 
1492. 		taking_off = takeoff_order[i];
1493. 		break;
1494. 	    }
1495. 
1496. 	otmp = (struct obj *) 0;
1497. 
1498. 	if (taking_off == 0L) {
1499. 	  You("finish disrobing.");
1500. 	  return 0;
1501. 	} else if (taking_off == 1L) {
1502. 	  todelay = 1;
1503. 	} else if (taking_off == WORN_ARMOR) {
1504. 	  otmp = uarm;
1505. 	} else if (taking_off == WORN_CLOAK) {
1506. 	  otmp = uarmc;
1507. 	} else if (taking_off == WORN_BOOTS) {
1508. 	  otmp = uarmf;
1509. 	} else if (taking_off == WORN_GLOVES) {
1510. 	  otmp = uarmg;
1511. 	} else if (taking_off == WORN_HELMET) {
1512. 	  otmp = uarmh;
1513. 	} else if (taking_off == WORN_SHIELD) {
1514. 	  otmp = uarms;
1515. #ifdef TOURIST
1516. 	} else if (taking_off == WORN_SHIRT) {
1517. 	  otmp = uarmu;
1518. #endif
1519. 	} else if (taking_off == WORN_AMUL) {
1520. 	  todelay = 1;
1521. 	} else if (taking_off == LEFT_RING) {
1522. 	  todelay = 1;
1523. 	} else if (taking_off == RIGHT_RING) {
1524. 	  todelay = 1;
1525. 	} else if (taking_off == WORN_BLINDF) {
1526. 	  todelay = 2;
1527. 	} else {
1528. 	  impossible("take_off: taking off %lx", taking_off);
1529. 	  return 0;	/* force done */
1530. 	}
1531. 
1532. 	if(otmp) todelay = objects[otmp->otyp].oc_delay;
1533. 	set_occupation(take_off, "disrobing", 0);
1534. 	return(1);		/* get busy */
1535. }
1536. 
1537. #endif /* OVLB */
1538. #ifdef OVL1
1539. 
1540. void
1541. reset_remarm() { taking_off = takeoff_mask =0L; }
1542. 
1543. #endif /* OVL1 */
1544. #ifdef OVLB
1545. 
1546. int
1547. doddoremarm() {
1548. 
1549. 	if(taking_off || takeoff_mask) {
1550. 
1551. 	    You("continue disrobing.");
1552. 	    set_occupation(take_off, "disrobing", 0);
1553. 	    return(take_off());
1554. 	}
1555. 
1556. 	(void) ggetobj("take off", select_off, 0);
1557. 	if(takeoff_mask) return(take_off());
1558. 	else		 return(0);
1559. }
1560. 
1561. int
1562. destroy_arm(atmp)
1563. register struct obj *atmp;
1564. {
1565. 	register struct obj *otmp;
1566. 
1567. 	if((otmp = uarmc) && (!atmp || atmp == uarmc)) {
1568. 		Your("cloak crumbles and turns to dust!");
1569. 		(void) Cloak_off();
1570. 		useup(otmp);
1571. 	} else if((otmp = uarm) && (!atmp || atmp == uarm)) {
1572. 		/* may be disintegrated by spell or dragon breath... */
1573. 		if (donning(otmp)) cancel_don();
1574. 		Your("armor turns to dust and falls to the floor!");
1575. 		(void) Armor_gone();
1576. 		useup(otmp);
1577. #ifdef TOURIST
1578. 	} else if((otmp = uarmu) && (!atmp || atmp == uarmu)) {
1579. 		Your("shirt crumbles into tiny threads and falls apart!");
1580. 		useup(otmp);
1581. #endif
1582. 	} else if((otmp = uarmh) && (!atmp || atmp == uarmh)) {
1583. 		if (donning(otmp)) cancel_don();
1584. 		Your("helmet turns to dust and is blown away!");
1585. 		(void) Helmet_off();
1586. 		useup(otmp);
1587. 	} else if((otmp = uarmg) && (!atmp || atmp == uarmg)) {
1588. 		if (donning(otmp)) cancel_don();
1589. 		Your("gloves vanish!");
1590. 		(void) Gloves_off();
1591. 		useup(otmp);
1592. 		selftouch("You");
1593. 	} else if((otmp = uarmf) && (!atmp || atmp == uarmf)) {
1594. 		if (donning(otmp)) cancel_don();
1595. 		Your("boots disintegrate!");
1596. 		(void) Boots_off();
1597. 		useup(otmp);
1598. 	} else if((otmp =uarms) && (!atmp || atmp == uarms)) {
1599. 		Your("shield crumbles away!");
1600. 		(void) Shield_off();
1601. 		useup(otmp);
1602. 	} else	return(0);		/* could not destroy anything */
1603. 
1604. 	return(1);
1605. }
1606. 
1607. void
1608. adj_abon(otmp, delta)
1609. register struct obj *otmp;
1610. register schar delta;
1611. {
1612. 	if (uarmg && otmp->otyp == GAUNTLETS_OF_DEXTERITY) {
1613. 		ABON(A_DEX) += (delta);
1614. 		flags.botl = 1;
1615. 	}
1616. 	if (uarmh && otmp->otyp == HELM_OF_BRILLIANCE) {
1617. 		ABON(A_INT) += (delta);
1618. 		ABON(A_WIS) += (delta);
1619. 		flags.botl = 1;
1620. 	}
1621. }
1622. 
1623. #endif /* OVLB */
1624. 
1625. /*do_wear.c*/