Fandom

Wikihack

Source:NetHack 3.0.0/wield.c

2,034pages on
this wiki
Add New Page
Talk0

Ad blocker interference detected!


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

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

Below is the full text to wield.c from the source code of NetHack 3.0.0. To link to a particular line, write [[NetHack 3.0.0/wield.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.
1.    /*	SCCS Id: @(#)wield.c	3.0	87/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.    /* Note: setuwep() with a null obj, and uwepgone(), are NOT the same!  Sometimes
8.     * unwielding a weapon can kill you, and lifesaving will then put it back into
9.     * your hand.  If lifesaving is permitted to do this, use
10.    * setwuep((struct obj *)0); otherwise use uwepgone().
11.    * (The second function should probably be #ifdef NAMED_ITEMS since only then
12.    * may unwielding a weapon kill you, but...)
13.    */
14.   void
15.   setuwep(obj)
16.   register struct obj *obj;
17.   {
18.   	setworn(obj, W_WEP);
19.   	if (!obj) unweapon = TRUE;	/* for "bare hands" message */
20.   }
21.   
22.   void
23.   uwepgone()
24.   {
25.   	if (uwep) {
26.   		setnotworn(uwep);
27.   		unweapon = TRUE;
28.   	}
29.   }
30.   
31.   static const char wield_objs[] = { '#', '-', WEAPON_SYM, 0 };
32.   
33.   int
34.   dowield()
35.   {
36.   	register struct obj *wep;
37.   	register int res = 0;
38.   
39.   	multi = 0;
40.   #ifdef POLYSELF
41.   	if (cantwield(uasmon)) {
42.   		pline("Don't be ridiculous!");
43.   		return(0);
44.   	}
45.   #endif
46.   	if(!(wep = getobj(wield_objs, "wield"))) /* nothing */;
47.   	else if(uwep == wep)
48.   		You("are already wielding that!");
49.   	else if(welded(uwep))
50.   		weldmsg(uwep, TRUE);
51.   	else if(wep == &zeroobj) {
52.   	    if(uwep == 0)
53.   		You("are already empty %s.", body_part(HANDED));
54.   	    else  {
55.   	  	You("are empty %s.", body_part(HANDED));
56.   	  	setuwep((struct obj *) 0);
57.   	  	res++;
58.   	    }
59.   	} else if(!uarmg &&
60.   #ifdef POLYSELF
61.   		!resists_ston(uasmon) &&
62.   #endif
63.   		(wep->otyp == CORPSE && wep->corpsenm == PM_COCKATRICE)) {
64.   	    /* Prevent wielding cockatrice when not wearing gloves --KAA */
65.   	    You("wield the cockatrice corpse in your bare %s.",
66.   			makeplural(body_part(HAND)));
67.   	    You("turn to stone...");
68.   	    killer="cockatrice corpse";
69.   	    done("stoned");
70.   	} else if(uarms && bimanual(wep))
71.   	    You("cannot wield a two-handed %s and hold a shield.",
72.   		 is_sword(wep) ? "sword" : "weapon");
73.   	else if(wep->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL))
74.   		You("cannot wield that!");
75.   	else {
76.   		res++;
77.   		if(wep->cursed && (wep->olet == WEAPON_SYM ||
78.   			wep->otyp == HEAVY_IRON_BALL || wep->otyp == PICK_AXE ||
79.   			wep->otyp == TIN_OPENER)) {
80.   		    pline("The %s %s to your %s!",
81.   			aobjnam(wep, "weld"),
82.   			(wep->quan == 1) ? "itself" : "themselves", /* a3 */
83.   			body_part(HAND));
84.   		    wep->bknown = 1;
85.   		} else {
86.   			/* The message must be printed before setuwep (since
87.   			 * you might die and be revived from changing weapons),
88.   			 * and the message must be before the death message and
89.   			 * Lifesaved rewielding.  Yet we want the message to say
90.   			 * "weapon in hand", thus this kludge.
91.   			 */
92.   			long dummy = wep->owornmask;
93.   			wep->owornmask |= W_WEP;
94.   			prinv(wep);
95.   			wep->owornmask = dummy;
96.   		}
97.   		setuwep(wep);
98.   	}
99.   	if(res && uwep)
100.  		unweapon = (uwep->otyp >= BOW || uwep->otyp <= BOOMERANG) ?
101.  		TRUE : FALSE;
102.  	return(res);
103.  }
104.  
105.  void
106.  corrode_weapon(){
107.  	if(!uwep || uwep->olet != WEAPON_SYM) return;	/* %% */
108.  	if(uwep->rustfree || objects[uwep->otyp].oc_material != METAL)
109.  		Your("%s not affected.", aobjnam(uwep, "are"));
110.  	else if (uwep->spe > -6) {
111.  		Your("%s!", aobjnam(uwep, "corrode"));
112.  		uwep->spe--;
113.  	} else	Your("%s quite rusted now.", aobjnam(uwep, "look"));
114.  }
115.  
116.  int
117.  chwepon(otmp, amount)
118.  register struct obj *otmp;
119.  register int amount;
120.  {
121.  	register const char *color = Hallucination ? hcolor() :
122.  				     (amount < 0) ? black : blue;
123.  	register char *xtime;
124.  
125.  	if(!uwep || (uwep->olet != WEAPON_SYM && uwep->otyp != PICK_AXE)) {
126.  		char buf[36];
127.  
128.  		Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)),
129.  			(amount > 0) ? "twitch" : "itch");
130.  		strange_feeling(otmp, buf);
131.  		return(0);
132.  	}
133.  
134.  #ifdef WORM
135.  	if(uwep->otyp == WORM_TOOTH && amount > 0) {
136.  		uwep->otyp = CRYSKNIFE;
137.  		Your("weapon seems sharper now.");
138.  		uwep->cursed = 0;
139.  		return(1);
140.  	}
141.  
142.  	if(uwep->otyp == CRYSKNIFE && amount < 0) {
143.  		uwep->otyp = WORM_TOOTH;
144.  		Your("weapon looks duller now.");
145.  		return(1);
146.  	}
147.  #endif
148.  #ifdef NAMED_ITEMS
149.  	if(is_artifact(uwep) && restr_name(uwep, ONAME(uwep)) &&
150.  		amount<0) {
151.  	    if (!Blind)
152.  		Your("%s faintly %s.", aobjnam(uwep, "glow"), color);
153.  	    return(1);
154.  	}
155.  #endif
156.  	/* there is a (soft) upper and lower limit to uwep->spe */
157.  	if(abs(uwep->spe) > 5 && rn2(3)) {
158.  	    if (!Blind)
159.  	    Your("%s violently %s for a while and then evaporate%s.",
160.  		aobjnam(uwep,"glow"), color, uwep->quan == 1 ? "s" : "");
161.  	    else
162.  		Your("%s.", aobjnam(uwep, "evaporate"));
163.  
164.  	    while(uwep)		/* let all of them disappear */
165.  				/* note: uwep->quan = 1 is nogood if unpaid */
166.  		useup(uwep);
167.  	    return(1);
168.  	}
169.  	if (!Blind) {
170.  	    xtime = (amount*amount == 1) ? "moment" : "while";
171.  	    Your("%s %s for a %s.",
172.  		  aobjnam(uwep, "glow"), color, xtime);
173.  	}
174.  	uwep->spe += amount;
175.  	if(amount > 0) uwep->cursed = 0;
176.  	return(1);
177.  }
178.  
179.  int
180.  welded(obj)
181.  register struct obj *obj;
182.  {
183.  	if (obj && obj == uwep && obj->cursed &&
184.  		  (obj->olet == WEAPON_SYM || obj->otyp == HEAVY_IRON_BALL ||
185.  		   obj->otyp == TIN_OPENER || obj->otyp == PICK_AXE))
186.  	{
187.  		obj->bknown = 1;
188.  		return 1;
189.  	}
190.  	return 0;
191.  }
192.  
193.  /* The reason for "specific" is historical; some parts of the code used
194.   * the object name and others just used "weapon"/"sword".  This function
195.   * replaced all of those.  Which one we use is really arbitrary.
196.   */
197.  void
198.  weldmsg(obj, specific)
199.  register struct obj *obj;
200.  boolean specific;
201.  {
202.  	char buf[BUFSZ];
203.  
204.  	if (specific) {
205.  		long savewornmask = obj->owornmask;
206.  		obj->owornmask &= ~W_WEP;
207.  		Strcpy(buf, Doname2(obj));
208.  		obj->owornmask = savewornmask;
209.  	} else
210.  		Sprintf(buf, "Your %s%s",
211.  			is_sword(obj) ? "sword" : "weapon",
212.  			((obj->quan > 1) ? "s" : ""));
213.  	Strcat(buf, (obj->quan==1) ? " is" : " are");
214.  #ifdef POLYSELF
215.  	Sprintf(eos(buf), " welded to your %s!",
216.  		bimanual(obj) ? makeplural(body_part(HAND)) : body_part(HAND));
217.  #else
218.  	Sprintf(eos(buf), " welded to your hand%s!",
219.  		bimanual(obj) ? "s" : "");
220.  #endif
221.  	pline(buf);
222.  }

Also on Fandom

Random Wiki