Source:NetHack 3.1.0/wield.c

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

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

1.   /*	SCCS Id: @(#)wield.c	3.1	92/12/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.   /* elven weapons vibrate warningly when enchanted beyond a limit */ 8.   #define is_elven_weapon(optr)	((optr)->otyp == ELVEN_ARROW\  9.    				|| (optr)->otyp == ELVEN_SPEAR\  10.   				|| (optr)->otyp == ELVEN_DAGGER\  11.   				|| (optr)->otyp == ELVEN_SHORT_SWORD\  12.   				|| (optr)->otyp == ELVEN_BROADSWORD\  13.   				|| (optr)->otyp == ELVEN_BOW) 14.   15.   /* Note: setuwep with a null obj, and uwepgone, are NOT the same! Sometimes 16.   * unwielding a weapon can kill you, and lifesaving will then put it back into 17.   * your hand. If lifesaving is permitted to do this, use 18.   * setwuep((struct obj *)0); otherwise use uwepgone. 19.   */  20.   void 21.  setuwep(obj) 22.  register struct obj *obj; 23.  {  24.   	setworn(obj, W_WEP); 25.  	/* Note: Explicitly wielding a pick-axe will not give a "bashing" 26.  	 * message. Wielding one via 'a'pplying it will. 27.  	 */  28.   	if (obj) 29.  		unweapon = ((obj->otyp >= BOW || obj->otyp <= BOOMERANG) &&  30.   			obj->otyp != PICK_AXE && obj->otyp != UNICORN_HORN); 31.  	else 32.  		unweapon = TRUE;	/* for "bare hands" message */ 33.  }  34.    35.   void 36.  uwepgone 37.  {  38.   	if (uwep) { 39.  		setnotworn(uwep); 40.  		unweapon = TRUE; 41.  	}  42.   }  43.    44.   static const char NEARDATA wield_objs[] = 45.  	{ ALL_CLASSES, ALLOW_NONE, WEAPON_CLASS, TOOL_CLASS, 0 }; 46.   47.   int 48.  dowield 49.  {  50.   	register struct obj *wep; 51.  	register int res = 0; 52.   53.   	multi = 0; 54.  #ifdef POLYSELF 55.  	if (cantwield(uasmon)) { 56.  		pline("Don't be ridiculous!"); 57.  		return(0); 58.  	}  59.   #endif 60.  	if (!(wep = getobj(wield_objs, "wield"))) /* nothing */; 61.  	else if (uwep == wep) 62.  		You("are already wielding that!"); 63.  	else if (welded(uwep)) 64.  		weldmsg(uwep, TRUE); 65.  	else if (wep == &zeroobj) { 66.  	    if (uwep == 0) 67.  		You("are already empty %s.", body_part(HANDED)); 68.  	    else  { 69.  	  	You("are empty %s.", body_part(HANDED)); 70.  	  	setuwep((struct obj *) 0); 71.  	  	res++; 72.  	    }  73.   	} else if (!uarmg &&  74.   #ifdef POLYSELF  75.   		   !resists_ston(uasmon) &&  76.   #endif  77.   		   (wep->otyp == CORPSE && wep->corpsenm == PM_COCKATRICE)) { 78.  	    /* Prevent wielding cockatrice when not wearing gloves --KAA */ 79.  	    You("wield the cockatrice corpse in your bare %s.",  80.   			makeplural(body_part(HAND))); 81.  # ifdef POLYSELF 82.  	    if (!(poly_when_stoned(uasmon) && polymon(PM_STONE_GOLEM))) 83.  # endif 84.  	    {  85.   		You("turn to stone..."); 86.  		killer_format = KILLED_BY; 87.  		killer="touching a cockatrice corpse"; 88.  		done(STONING); 89.  	    }  90.   	} else if (uarms && bimanual(wep)) 91.  	    You("cannot wield a two-handed %s while wearing a shield.",  92.   		is_sword(wep) ? "sword" :  93.   		    wep->otyp == BATTLE_AXE ? "axe" : "weapon"); 94.  	else if (wep->owornmask & (W_ARMOR | W_RING | W_AMUL | W_TOOL)) 95.  		You("cannot wield that!"); 96.  	else if (!wep->oartifact || touch_artifact(wep,&youmonst)) { 97.  		res++; 98.  		if (wep->cursed &&  99.   		    (wep->oclass == WEAPON_CLASS || 100. 		     wep->otyp == HEAVY_IRON_BALL || wep->otyp == PICK_AXE || 101. 		     wep->otyp == UNICORN_HORN || wep->otyp == TIN_OPENER)) { 102. 		    const char *tmp = xname(wep), *thestr = "The "; 103. 		    if (strncmp(tmp, thestr, 4) && !strncmp(The(tmp),thestr,4)) 104. 			tmp = thestr; 105. 		    else tmp = ""; 106. 		    pline("%s%s %s to your %s!",  107.  			tmp, aobjnam(wep, "weld"),  108.  			(wep->quan == 1L) ? "itself" : "themselves", /* a3 */  109.  			body_part(HAND)); 110. 		    wep->bknown = TRUE; 111. 		} else { 112. 			/* The message must be printed before setuwep (since  113.  			 * you might die and be revived from changing weapons), 114. 			 * and the message must be before the death message and 115. 			 * Lifesaved rewielding. Yet we want the message to 116. * say "weapon in hand", thus this kludge. 117. 			 */  118.  			long dummy = wep->owornmask; 119. 			wep->owornmask |= W_WEP; 120. 			prinv(NULL, wep, 0L); 121. 			wep->owornmask = dummy; 122. 		}  123.  		setuwep(wep); 124. 	}  125.  	return(res); 126. }  127.   128.  void 129. erode_weapon(acid_dmg) 130. boolean acid_dmg; 131. /* Rust weapon, or corrode it if acid damage is called for */ 132. {  133.  	if(!uwep || uwep->oclass != WEAPON_CLASS) return;	/* %% */ 134. 	if (uwep->greased) { 135. 		grease_protect(uwep,NULL,FALSE); 136. 	} else if(uwep->oerodeproof ||  137.  	   (acid_dmg ? !is_corrodeable(uwep) : !is_rustprone(uwep))) { 138. 		if (flags.verbose || !(uwep->oerodeproof && uwep->rknown)) 139. 		    Your("%s not affected.", aobjnam(uwep, "are")); 140. 		if (uwep->oerodeproof) uwep->rknown = TRUE; 141. 	} else if (uwep->oeroded < MAX_ERODE) { 142. 		Your("%s%s!", aobjnam(uwep, acid_dmg ? "corrode" : "rust"), 143.  		     uwep->oeroded+1 == MAX_ERODE ? " completely" :  144.  		     uwep->oeroded ? " further" : ""); 145. 		uwep->oeroded++; 146. 	} else 147. 		if (flags.verbose) 148. 		    Your("%s completely %s.",  149.  			 aobjnam(uwep, Blind ? "feel" : "look"), 150.  			 acid_dmg ? "corroded" : "rusty"); 151. }  152.   153.  int 154. chwepon(otmp, amount) 155. register struct obj *otmp; 156. register int amount; 157. {  158.  	register const char *color = Hallucination ? hcolor : 159. 				     (amount < 0) ? Black : blue; 160. 	register const char *xtime; 161.  162.  	if(!uwep || (uwep->oclass != WEAPON_CLASS && uwep->otyp != PICK_AXE 163. 			&& uwep->otyp != UNICORN_HORN)) { 164. 		char buf[36]; 165.  166.  		Sprintf(buf, "Your %s %s.", makeplural(body_part(HAND)),  167.  			(amount >= 0) ? "twitch" : "itch"); 168. 		strange_feeling(otmp, buf); 169. 		exercise(A_DEX, amount >= 0); 170. 		return(0); 171. 	}  172.   173.  	if(uwep->otyp == WORM_TOOTH && amount >= 0) { 174. 		uwep->otyp = CRYSKNIFE; 175. 		Your("weapon seems sharper now."); 176. 		uwep->cursed = 0; 177. 		return(1); 178. 	}  179.   180.  	if(uwep->otyp == CRYSKNIFE && amount < 0) { 181. 		uwep->otyp = WORM_TOOTH; 182. 		Your("weapon seems duller now."); 183. 		return(1); 184. 	}  185.   186.  	if (amount < 0 && uwep->oartifact && restrict_name(uwep, ONAME(uwep))) { 187. 	    if (!Blind) 188. 		Your("%s %s.", aobjnam(uwep, "faintly glow"), color); 189. 	    return(1); 190. 	}  191.  	/* there is a (soft) upper and lower limit to uwep->spe */ 192. 	if(((uwep->spe > 5 && amount >= 0) || (uwep->spe < -5 && amount < 0))  193.  								&& rn2(3)) { 194. 	    if (!Blind) 195. 	    Your("%s %s for a while and then evaporate%s.",  196.  		 aobjnam(uwep, "violently glow"), color,  197.  		 uwep->quan == 1L ? "s" : ""); 198. 	    else 199. 		Your("%s.", aobjnam(uwep, "evaporate")); 200.  201.  	    while(uwep)		/* let all of them disappear */ 202. 				/* note: uwep->quan = 1 is nogood if unpaid */ 203. 		useup(uwep); 204. 	    return(1); 205. 	}  206.  	if (!Blind) { 207. 	    xtime = (amount*amount == 1) ? "moment" : "while"; 208. 	    Your("%s %s for a %s.",  209.  		 aobjnam(uwep, amount == 0 ? "violently glow" : "glow"), 210.  		 color, xtime); 211. 	}  212.  	uwep->spe += amount; 213. 	if(amount > 0) uwep->cursed = 0; 214.  215.  	/*  216.  	 * Enchantment, which normally improves a weapon, has an  217. * addition adverse reaction on Magicbane whose effects are 218. 	 * spe dependent. Give an obscure clue here. 219. 	 */  220.  	if (uwep->oartifact == ART_MAGICBANE && uwep->spe >= 0) { 221. 		Your("right %s %sches!",  222.  			body_part(HAND),  223.  			(((amount > 1) && (uwep->spe > 1)) ? "flin" : "it")); 224. 	}  225.   226.  	/* an elven magic clue, cookie@keebler */ 227. 	if ((uwep->spe > 5)  228.  		&& (is_elven_weapon(uwep) || uwep->oartifact || !rn2(7))) 229. 	    Your("%s unexpectedly.",  230.  		aobjnam(uwep, "suddenly vibrate")); 231.  232.  	return(1); 233. }  234.   235.  int 236. welded(obj) 237. register struct obj *obj; 238. {  239.  	if (obj && obj == uwep && obj->cursed &&  240.  		  (obj->oclass == WEAPON_CLASS || 241. 		   obj->otyp == HEAVY_IRON_BALL || 242. 		   obj->otyp == TIN_OPENER || obj->otyp == PICK_AXE || 243. 		   obj->otyp == UNICORN_HORN)) 244. 	{  245.  		obj->bknown = TRUE; 246. 		return 1; 247. 	}  248.  	return 0; 249. }  250.   251.  /* The reason for "specific" is historical; some parts of the code used 252.  * the object name and others just used "weapon"/"sword". This function 253.  * replaced all of those. Which one we use is really arbitrary. 254.  */  255.  void 256. weldmsg(obj, specific) 257. register struct obj *obj; 258. boolean specific; 259. {  260.  	char buf[BUFSZ]; 261.  262.  	if (specific) { 263. 		long savewornmask = obj->owornmask; 264. 		obj->owornmask &= ~W_WEP; 265. 		Strcpy(buf, Doname2(obj)); 266. 		obj->owornmask = savewornmask; 267. 	} else 268. 		Sprintf(buf, "Your %s%s",  269.  			is_sword(obj) ? "sword" : "weapon",  270.  			plur(obj->quan)); 271. 	Strcat(buf, (obj->quan == 1L) ? " is" : " are"); 272. #ifdef POLYSELF 273. 	Sprintf(eos(buf), " welded to your %s!",  274.  		bimanual(obj) ? (const char *)makeplural(body_part(HAND)) : body_part(HAND)); 275. #else 276. 	Sprintf(eos(buf), " welded to your hand%s!",  277.  		bimanual(obj) ? "s" : ""); 278. #endif 279. 	pline(buf); 280. }  281.   282.  /*wield.c*/