Source:NetHack 2.3e/do wear.c

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

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

1.   /*	SCCS Id: @(#)do_wear.c	2.3	88/01/21 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.     4.    #include   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.  }