Source:NetHack 3.0.0/do wear.c

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