Source:NetHack 2.3e/do wear.c

From NetHackWiki
Jump to navigation Jump to search

Below is the full text to do_wear.c from the source code of NetHack 2.3e.

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

Screenshots and source code from Hack are used under the CWI license.

1.    /*	SCCS Id: @(#)do_wear.c	2.3	88/01/21
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    
4.    #include <stdio.h>
5.    #include "hack.h"
6.    extern char *nomovemsg;
7.    extern char quitchars[];
8.    extern char *Doname();
9.    
10.   off_msg(otmp) register struct obj *otmp; {
11.   	pline("You were wearing %s.", doname(otmp));
12.   }
13.   
14.   doremarm() {
15.   	register struct obj *otmp;
16.   	if(!uarm && !uarmh && !uarms && !uarmg
17.   #ifdef SHIRT
18.              && !uarmu
19.   #endif
20.           ) {
21.   		pline("Not wearing any armor.");
22.   		return(0);
23.   	}
24.   #ifdef SHIRT
25.           otmp = (!uarmh && !uarms && !uarmg) ? (uarm ? uarm : uarmu) :
26.                   (!uarm && !uarms && !uarmg && !uarmu) ? uarmh :
27.                   (!uarm && !uarmh && !uarmg && !uarmu) ? uarms :
28.                   (!uarm && !uarmh && !uarms && !uarmu) ? uarmg :
29.   #else
30.   	otmp = (!uarmh && !uarms && !uarmg) ? uarm :
31.   		(!uarms && !uarm && !uarmg) ? uarmh :
32.   		(!uarmh && !uarm && !uarmg) ? uarms :
33.   		(!uarmh && !uarm && !uarms) ? uarmg :
34.   #endif
35.   		getobj("[", "take off");
36.   	if(!otmp) return(0);
37.   	if(!(otmp->owornmask & (W_ARMOR - W_ARM2))) {
38.   		pline("You can't take that off.");
39.   		return(0);
40.   	}
41.   	if( otmp == uarmg && uwep && uwep->cursed ) {	/* myers@uwmacc */
42.    pline("You seem not able to take off the gloves while holding your weapon.");
43.   		return(0);
44.   	}
45.   	(void) armoroff(otmp);
46.   	return(1);
47.   }
48.   
49.   doremring() {
50.   	if(!uleft && !uright){
51.   		pline("Not wearing any ring.");
52.   		return(0);
53.   	}
54.   	if(!uleft)
55.   		return(dorr(uright));
56.   	if(!uright)
57.   		return(dorr(uleft));
58.   	if(uleft && uright) while(1) {
59.   		char answer;
60.   
61.   		pline("What ring, Right or Left? [ rl?]");
62.   		if(index(quitchars, (answer = readchar())))
63.   			return(0);
64.   		switch(answer) {
65.   		case 'l':
66.   		case 'L':
67.   			return(dorr(uleft));
68.   		case 'r':
69.   		case 'R':
70.   			return(dorr(uright));
71.   		case '?':
72.   			(void) doprring();
73.   			/* might look at morc here %% */
74.   		}
75.   	}
76.   	/* NOTREACHED */
77.   #ifdef LINT
78.   	return(0);
79.   #endif
80.   }
81.   
82.   dorr(otmp) register struct obj *otmp; {
83.   	if(cursed(otmp)) return(0);
84.   	ringoff(otmp);
85.   	off_msg(otmp);
86.   	return(1);
87.   }
88.   
89.   cursed(otmp) register struct obj *otmp; {
90.   	if(otmp->cursed){
91.   		pline("You can't. It appears to be cursed.");
92.   		return(1);
93.   	}
94.   	return(0);
95.   }
96.   
97.   armoroff(otmp) register struct obj *otmp; {
98.   register int delay = -objects[otmp->otyp].oc_delay;
99.   	if(cursed(otmp)) return(0);
100.  	setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
101.  	if(delay) {
102.  		nomul(delay);
103.  		switch(otmp->otyp) {
104.  		case HELMET:
105.  			nomovemsg = "You finished taking off your helmet.";
106.  			break;
107.  		case PAIR_OF_GLOVES:
108.  			nomovemsg = "You finished taking off your gloves.";
109.  			break;
110.  		default:
111.  			nomovemsg = "You finished taking off your suit.";
112.  		}
113.  	} else {
114.  		off_msg(otmp);
115.  	}
116.  	return(1);
117.  }
118.  
119.  doweararm() {
120.  	register struct obj *otmp;
121.  	register int delay;
122.  	register int err = 0;
123.  	long mask = 0;
124.  
125.  #ifdef KAA
126.  	if(!index("@enozCGHIKLNOTUVWXYZ&",u.usym)) {
127.  		pline("Don't even bother.");
128.  		return(0);
129.  	}
130.  #endif
131.  	otmp = getobj("[", "wear");
132.  	if(!otmp) return(0);
133.  	if(otmp->owornmask & W_ARMOR) {
134.  		pline("You are already wearing that!");
135.  		return(0);
136.  	}
137.  	if(otmp->otyp == HELMET){
138.  		if(uarmh) {
139.  			pline("You are already wearing a helmet.");
140.  			err++;
141.  		} else
142.  			mask = W_ARMH;
143.  	} else if(otmp->otyp == SHIELD){
144.  		if(uarms) pline("You are already wearing a shield."), err++;
145.  		if(uwep && uwep->otyp == TWO_HANDED_SWORD)
146.  	pline("You cannot wear a shield and wield a two handed sword."), err++;
147.  		if(!err) mask = W_ARMS;
148.  	} else if(otmp->otyp == PAIR_OF_GLOVES) {
149.  		if(uarmg) {
150.  			pline("You are already wearing gloves.");
151.  			err++;
152.  		} else
153.  		if(uwep && uwep->cursed) {
154.  			pline("You cannot wear gloves over your weapon.");
155.  			err++;
156.  		} else
157.  			mask = W_ARMG;
158.  #ifdef SHIRT
159.  	} else if( otmp->otyp == HAWAIIAN_SHIRT ) {
160.  # ifdef KAA
161.                  if(cantweararm(u.usym)) {
162.                          pline("You can't wear a shirt!");
163.                          return(0);
164.                  }
165.  # endif
166.                  if (uarm || uarmu) {
167.                          if(!uarm) /* then uarmu */
168.                             pline("You are already wearing a shirt.");
169.                          else
170.                             pline("You can't wear that over your %s.",
171.                                   uarm->otyp != ELVEN_CLOAK ? "armor" : "cloak" );
172.                          err++;
173.                  } else
174.                          mask = W_ARMU;
175.  #endif
176.  	} else {
177.  #ifdef KAA
178.  		if(cantweararm(u.usym)) {
179.  			pline("You can't wear armor!");
180.  			return(0);
181.  		}
182.  #endif
183.  		if(uarm) {
184.  			if(otmp->otyp != ELVEN_CLOAK || uarm2) {
185.  				pline("You are already wearing some armor.");
186.  				err++;
187.  			}
188.  		}
189.  		if(!err) mask = W_ARM;
190.  	}
191.  	if(welded(otmp)) {
192.  		if(!err++)
193.  			pline("%s is welded to your hand.", Doname(uwep));
194.  	}
195.  	if(err) return(0);
196.  	setworn(otmp, mask);
197.  	if(otmp == uwep)
198.  		setuwep((struct obj *) 0);
199.  	delay = -objects[otmp->otyp].oc_delay;
200.  	if(delay){
201.  		nomul(delay);
202.  		nomovemsg = "You finished your dressing maneuvre.";
203.  	}
204.  	otmp->known = 1;
205.  	return(1);
206.  }
207.  
208.  dowearring() {
209.  	register struct obj *otmp;
210.  	long mask = 0;
211.  	long oldprop;
212.  
213.  	if(uleft && uright){
214.  		pline("There are no more ring-fingers to fill.");
215.  		return(0);
216.  	}
217.  	otmp = getobj("=", "wear");
218.  	if(!otmp) return(0);
219.  	if(otmp->owornmask & W_RING) {
220.  		pline("You are already wearing that!");
221.  		return(0);
222.  	}
223.  	if(otmp == uleft || otmp == uright) {
224.  		pline("You are already wearing that.");
225.  		return(0);
226.  	}
227.  	if(welded(otmp)) {
228.  		pline("%s is welded to your hand.", Doname(uwep));
229.  		return(0);
230.  	}
231.  	if(uleft) mask = RIGHT_RING;
232.  	else if(uright) mask = LEFT_RING;
233.  	else do {
234.  		char answer;
235.  
236.  		pline("What ring-finger, Right or Left? ");
237.  		if(index(quitchars, (answer = readchar())))
238.  			return(0);
239.  		switch(answer){
240.  		case 'l':
241.  		case 'L':
242.  			mask = LEFT_RING;
243.  			break;
244.  		case 'r':
245.  		case 'R':
246.  			mask = RIGHT_RING;
247.  			break;
248.  		}
249.  	} while(!mask);
250.  	setworn(otmp, mask);
251.  	if(otmp == uwep)
252.  		setuwep((struct obj *) 0);
253.  	oldprop = u.uprops[PROP(otmp->otyp)].p_flgs;
254.  	u.uprops[PROP(otmp->otyp)].p_flgs |= mask;
255.  	switch(otmp->otyp){
256.  	case RIN_LEVITATION:
257.  		if(!oldprop) float_up();
258.  		break;
259.  	case RIN_GAIN_STRENGTH:
260.  		u.ustr += otmp->spe;
261.  		u.ustrmax += otmp->spe;
262.  		if(u.ustr > 118) u.ustr = 118;
263.  		if(u.ustrmax > 118) u.ustrmax = 118;
264.  		flags.botl = 1;
265.  		break;
266.  	case RIN_INCREASE_DAMAGE:
267.  		u.udaminc += otmp->spe;
268.  		break;
269.  	case RIN_PROTECTION_FROM_SHAPE_CHAN:
270.  		rescham();
271.  		break;
272.  	}
273.  	prinv(otmp);
274.  	return(1);
275.  }
276.  
277.  ringoff(obj)
278.  register struct obj *obj;
279.  {
280.  register long mask;
281.  	mask = obj->owornmask & W_RING;
282.  	setworn((struct obj *) 0, obj->owornmask);
283.  	if(!(u.uprops[PROP(obj->otyp)].p_flgs & mask))
284.  		impossible("Strange... I didn't know you had that ring.");
285.  	u.uprops[PROP(obj->otyp)].p_flgs &= ~mask;
286.  	switch(obj->otyp) {
287.  	case RIN_FIRE_RESISTANCE:
288.  		/* Bad luck if the player is in hell... --jgm */
289.  		if (!Fire_resistance && dlevel >= 30) {
290.  			pline("The flames of Hell burn you to a crisp.");
291.  			killer = "stupidity in hell";
292.  			done("burned");
293.  		}
294.  		break;
295.  	case RIN_LEVITATION:
296.  		if(!Levitation) {	/* no longer floating */
297.  			float_down();
298.  		}
299.  		break;
300.  	case RIN_GAIN_STRENGTH:
301.  		u.ustr -= obj->spe;
302.  		u.ustrmax -= obj->spe;
303.  		if(u.ustr > 118) u.ustr = 118;
304.  		if(u.ustrmax > 118) u.ustrmax = 118;
305.  		flags.botl = 1;
306.  		break;
307.  	case RIN_INCREASE_DAMAGE:
308.  		u.udaminc -= obj->spe;
309.  		break;
310.  	case RIN_PROTECTION_FROM_SHAPE_CHAN:
311.  #ifdef DGKMOD
312.  		/* If you're no longer protected, let the chameleons
313.  		 * change shape again -dgk
314.  		 */
315.  		restartcham();
316.  #endif /* DGKMOD /**/
317.  		break;
318.  	}
319.  }
320.  
321.  find_ac(){
322.  register int uac = 10;
323.  #ifdef KAA
324.  	if (u.mtimedone) uac = mons[u.umonnum].ac;
325.  #endif
326.  	if(uarm) uac -= ARM_BONUS(uarm);
327.  	if(uarm2) uac -= ARM_BONUS(uarm2);
328.  	if(uarmh) uac -= ARM_BONUS(uarmh);
329.  	if(uarms) uac -= ARM_BONUS(uarms);
330.  	if(uarmg) uac -= ARM_BONUS(uarmg);
331.  	if(uarmu) uac -= ARM_BONUS(uarmu);
332.  	if(uleft && uleft->otyp == RIN_PROTECTION) uac -= uleft->spe;
333.  	if(uright && uright->otyp == RIN_PROTECTION) uac -= uright->spe;
334.  #ifdef PRAYERS
335.  	if (Protection & INTRINSIC) uac -= u.ublessed;
336.  #endif
337.  	if(uac != u.uac){
338.  		u.uac = uac;
339.  		flags.botl = 1;
340.  	}
341.  }
342.  
343.  glibr(){
344.  register struct obj *otmp;
345.  int xfl = 0;
346.  	if(!uarmg) if(uleft || uright) {
347.  		/* Note: at present also cursed rings fall off */
348.  		/* changed 10/30/86 by GAN */
349.  		pline("Your %s off your fingers.",
350.  #ifdef HARD
351.  			((uleft && !uleft->cursed) && (uright && !uright->cursed)) ? "rings slip" : "ring slips");
352.  #else
353.  			(uleft && uright) ? "rings slip" : "ring slips");
354.  #endif
355.  		xfl++;
356.  		if((otmp = uleft) != Null(obj)){
357.  			ringoff(uleft);
358.  			dropx(otmp);
359.  		}
360.  		if((otmp = uright) != Null(obj)){
361.  			ringoff(uright);
362.  			dropx(otmp);
363.  		}
364.  	}
365.  	if(((otmp = uwep) != Null(obj))
366.  #ifdef HARD
367.  	   && !otmp->cursed
368.  #endif
369.  	) {
370.  		/* Note: at present also cursed weapons fall */
371.  		/* changed 10/30/86 by GAN */
372.  		setuwep((struct obj *) 0);
373.  		dropx(otmp);
374.  		pline("Your weapon %sslips from your hands.",
375.  			xfl ? "also " : "");
376.  	}
377.  }
378.  
379.  struct obj *
380.  some_armor(){
381.  register struct obj *otmph = uarm;
382.  	if(uarmh && (!otmph || !rn2(4))) otmph = uarmh;
383.  	if(uarmg && (!otmph || !rn2(4))) otmph = uarmg;
384.  	if(uarms && (!otmph || !rn2(4))) otmph = uarms;
385.  	if(!uarm && uarmu && (!otmph || !rn2(4))) otmph = uarmu;
386.  	return(otmph);
387.  }
388.  
389.  corrode_armor(){
390.  register struct obj *otmph = some_armor();
391.  	if(otmph){
392.  		if(otmph->rustfree ||
393.  		   otmph->otyp == CRYSTAL_PLATE_MAIL ||
394.  		   otmph->otyp == ELVEN_CLOAK ||
395.  #ifdef SHIRT
396.  		   otmph->otyp == HAWAIIAN_SHIRT ||
397.  #endif
398.  		   otmph->otyp == LEATHER_ARMOR ||
399.  		   otmph->otyp == STUDDED_LEATHER_ARMOR) {
400.  			pline("Your %s not affected!",
401.  				aobjnam(otmph, "are"));
402.  			return;
403.  		}
404.  		pline("Your %s!", aobjnam(otmph, "corrode"));
405.  		otmph->spe--;
406.  	}
407.  }
408.  
409.  static
410.  remarm(obj) register struct obj *obj; {
411.  	if(!obj || obj->olet != '[')
412.  		return(0);
413.  	(void) marmoroff(obj);
414.  	return(1);
415.  }
416.  
417.  static
418.  marmoroff(otmp) register struct obj *otmp; {
419.  register int delay = -objects[otmp->otyp].oc_delay;
420.  	if(cursed(otmp)) return(0);
421.  	setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
422.  	if(delay)
423.  		nomul(delay);
424.  	off_msg(otmp);
425.  	nomovemsg = "You finished taking off your armor.";
426.  	return(1);
427.  }
428.  
429.  doddoremarm() {
430.  	return(ggetobj("take off",remarm,0));
431.  }