Source:NetHack 1.4f/read.c

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

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

1.   /*	SCCS Id: @(#)read.c	1.4	87/08/08 2.   /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3.    /* hack.read.c - version 1.0.3 */ 4.    5.    #include "hack.h"  6. 7.   extern struct monst *makemon; 8.   extern struct permonst pm_eel; 9.   extern struct obj *mkobj_at; 10.  char *hcolor; 11.  boolean	known; 12.  int identify; 13.   14.   doread { 15.  	register struct obj *scroll; 16.  	register boolean confused = (Confusion != 0); 17.   18.   	known = FALSE; 19.  	scroll = getobj("#-?", "read");	/*  "#-" added by GAN 10/22/86 */ 20.  	if(!scroll) return(0); 21.  	  22.   	/* below added to allow reading of fortune cookies */ 23.  	if(scroll->otyp ==FORTUNE_COOKIE) { 24.  		if(Blind) { 25.  			pline("This cookie has a scrap of paper inside!"); 26.  			pline("What a pity, that you cannot read it!"); 27.  		} else 28.  			outrumor; 29.  		useup(scroll); 30.  		return(1); 31.  	}  else 32.  		if(scroll->olet != SCROLL_SYM) { 33.  			pline("That is a silly thing to read."); 34.  			return(0); 35.  		}  36.    37.   	if(!scroll->dknown && Blind) { 38.  	    pline("Being blind, you cannot read the formula on the scroll."); 39.  	    return(0); 40.  	}  41.   	if(Blind) 42.  	  pline("As you pronounce the formula on it, the scroll disappears."); 43.  	else 44.  	  pline("As you read the scroll, it disappears."); 45.  	if(confused) 46.  	  if (Hallucination) 47.  	      pline("Being so trippy, you screw up ... "); 48.  	  else 49.  	      pline("Being confused, you mispronounce the magic words ... "); 50.   51.   	if(!seffects(scroll))  { 52.  		if(!objects[scroll->otyp].oc_name_known) { 53.  		    if(known && !confused) { 54.  			objects[scroll->otyp].oc_name_known = 1; 55.  			more_experienced(0,10); 56.  		    } else if(!objects[scroll->otyp].oc_uname) 57.  			docall(scroll); 58.  		}  59.   #ifdef MARKER 60.  		if(!(scroll->otyp == SCR_BLANK_PAPER) || confused) 61.  #endif 62.  			useup(scroll); 63.  	}  64.   	return(1); 65.  }  66.    67.   seffects(sobj) 68.  	register struct obj	*sobj; 69.  {  70.   	extern struct obj *some_armor; 71.  	register boolean confused = (Confusion != 0); 72.   73.   	switch(sobj->otyp) { 74.  #ifdef MAIL 75.  	case SCR_MAIL: 76.  		readmail(/* scroll */); 77.  		break; 78.  #endif 79.  	case SCR_ENCHANT_ARMOR: 80.  	    {  81.   		register struct obj *otmp = some_armor; 82.  		if(!otmp) { 83.  			strange_feeling(sobj,"Your skin glows then fades."); 84.  			return(1); 85.  		}  86.   		if(confused) { 87.  			pline("Your %s is covered by a shimmering %s %s!",  88.   				objects[otmp->otyp].oc_name, Hallucination ? hcolor :  89.   				"gold", (otmp->otyp == SHIELD ? "layer" : "shield")); 90.  			otmp->rustfree = 1; 91.  			break; 92.  		}  93.   #ifdef KAA 94.  		if(otmp->spe > (otmp->otyp == ELFIN_CHAIN_MAIL ? 5 : 3) 95.   				&& rn2(otmp->spe)) { 96.  #else 97.  		if(otmp->spe > 3 && rn2(otmp->spe)) { 98.  #endif 99.  		pline("Your %s glows violently %s for a while, then evaporates.",  100.  			objects[otmp->otyp].oc_name,  101.  			Hallucination ? hcolor : "green"); 102. 			useup(otmp); 103. 			break; 104. 		}  105.  		pline("Your %s glows %s for a moment.",  106.  			objects[otmp->otyp].oc_name,  107.  			Hallucination ? hcolor : "green"); 108. 		otmp->cursed = 0; 109. 		otmp->spe++; 110. 		break; 111. 	    }  112.  	case SCR_DESTROY_ARMOR: 113. 		if(confused) { 114. 			register struct obj *otmp = some_armor; 115. 			if(!otmp) { 116. 				strange_feeling(sobj,"Your bones itch."); 117. 				return(1); 118. 			}  119.  			pline("Your %s glows %s for a moment.",  120.  				objects[otmp->otyp].oc_name,  121.  				Hallucination ? hcolor : "purple"); 122. 			otmp->rustfree = 0; 123. 			break; 124. 		}  125.  		if(!destroy_arm) { 126. 			strange_feeling(sobj,"Your skin itches."); 127. 			return(1); 128. 		}  129.  		break; 130. 	case SCR_CONFUSE_MONSTER: 131. #ifdef SPELLS 132. 	case SPE_CONFUSE_MONSTER: 133. #endif 134. 		if(u.usym != '@') { 135. 			pline("You feel confused."); 136. 			HConfusion += rnd(100); 137. 		} else  if(confused) { 138. 			pline("Your hands begin to glow %s.",  139.  			Hallucination ? hcolor : "purple"); 140. 			HConfusion += rnd(100); 141. 		} else { 142. 			pline("Your hands begin to glow %s.",  143.  			Hallucination ? hcolor : "blue"); 144. 			u.umconf = 1; 145. 		}  146.  		break; 147. 	case SCR_SCARE_MONSTER: 148. #ifdef SPELLS 149. 	case SPE_CAUSE_FEAR: 150. #endif 151. 	    {	register int ct = 0; 152. 		register struct monst *mtmp; 153.  154.  		for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 155. 		    if(cansee(mtmp->mx,mtmp->my)) { 156. 			if(confused) 157. 			    mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0; 158. 			else 159. 			    if (! resist(mtmp, sobj->olet, 0, NOTELL)) 160. 				mtmp->mflee = 1; 161. 			ct++; 162. 		    }  163.  		if(!ct) 164. 		    pline("You hear %s in the distance.",  165.  			  (confused) ? "sad wailing" : "maniacal laughter"); 166. #ifdef KAA 167. # ifdef SPELLS 168. 		    else if(sobj->otyp == SCR_SCARE_MONSTER) 169. # endif 170. 			pline ("You hear %s close by.",  171.  			       (confused) ? "sad wailing" : "maniacal laughter"); 172. #endif 173. 		break; 174. 	    }  175.  	case SCR_BLANK_PAPER: 176. 		if(confused) 177. 		    pline("You see strange patterns on this scroll."); 178. 		else  { 179. 		    pline("This scroll seems to be blank."); 180. #ifdef MARKER 181. 		    pline("No, wait..."); 182. 		    known = TRUE; 183. #endif 184. 		}  185.  		break; 186. 	case SCR_REMOVE_CURSE: 187. #ifdef SPELLS 188. 	case SPE_REMOVE_CURSE: 189. #endif 190. 	    {	register struct obj *obj; 191. 		if(confused) 192. 		    if (Hallucination) 193. 			pline("You feel the power of the Force against you!"); 194. 		    else 195. 			pline("You feel like you need some help."); 196. 		else 197. 		    if (Hallucination) 198. 			pline("You feel in touch with the Universal Oneness."); 199. 		    else 200. 			pline("You feel like someone is helping you."); 201. 		for(obj = invent; obj ; obj = obj->nobj) 202. 			if(obj->owornmask) 203. 				obj->cursed = confused; 204. 		if(Punished && !confused) { 205. 			Punished = 0; 206. 			freeobj(uchain); 207. 			unpobj(uchain); 208. 			free((char *) uchain); 209. 			uball->spe = 0; 210. 			uball->owornmask &= ~W_BALL; 211. 			uchain = uball = (struct obj *) 0; 212. 		}  213.  		break; 214. 	    }  215.  	case SCR_CREATE_MONSTER: 216. #ifdef SPELLS 217. 	case SPE_CREATE_MONSTER: 218. #endif 219. 	    {	register int cnt = 1; 220.  221.  		if(!rn2(73)) cnt += rnd(4); 222. 		if(confused) cnt += 12; 223. 		while(cnt--) 224. #ifdef WIZARD 225. 			if(wizard)  { 226. 				char buf[BUFSZ], cmlet; 227. 				struct permonst *crmonst; 228. 				  229.  				do { 230. 					pline("What monster to create? "); 231. 					getlin(buf); 232. 				} while(strlen(buf) != 1); 233. 				cmlet = buf[0]; 234. 				for(crmonst = mons; crmonst->mlet != cmlet &&  235.  					crmonst != PM_EEL; crmonst++) ; 236. 				(void) makemon(crmonst, u.ux, u.uy); 237. 			} else 238. #endif /* WIZARD /**/ 239. 				(void) makemon(confused ? PM_ACID_BLOB :  240.  					(struct permonst *) 0, u.ux, u.uy); 241. 		break; 242. 	    }  243.  	case SCR_ENCHANT_WEAPON: 244. 		if(uwep && uwep->olet == WEAPON_SYM && confused) { 245. 		/* olet check added 10/25/86 GAN */ 246. 			pline("Your %s covered by a shimmering %s shield!",  247.  				aobjnam(uwep, "are"),  248.  				Hallucination ? hcolor : "gold"); 249. 			uwep->rustfree = 1; 250. 		} else 251. 			if(!chwepon(sobj, 1))		/* tests for !uwep */ 252. 				return(1); 253. 		break; 254. 	case SCR_DAMAGE_WEAPON: 255. 		if(uwep && uwep->olet == WEAPON_SYM && confused) { 256. 		/* olet check added 10/25/86 GAN */ 257. 			pline("Your %s %s for a moment.",  258.  				aobjnam(uwep,"glow"),  259.  				Hallucination ? hcolor : "purple"); 260. 			uwep->rustfree = 0; 261. 		} else 262. 			if(!chwepon(sobj, -1))	/* tests for !uwep */ 263. 				return(1); 264. 		break; 265. 	case SCR_TAMING: 266. #ifdef SPELLS 267. 	case SPE_CHARM_MONSTER: 268. #endif 269. 	    {	register int i,j; 270. 		register int bd = confused ? 5 : 1; 271.  		register struct monst *mtmp; 272.  273.  		for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++) 274. 		if(mtmp = m_at(u.ux+i, u.uy+j)) 275. 		    if(!resist(mtmp, sobj->olet, 0, NOTELL)) 276. 			(void) tamedog(mtmp, (struct obj *) 0); 277. 		break; 278. 	    }  279.  	case SCR_GENOCIDE: 280. 		pline("You have found a scroll of genocide!"); 281. #ifdef SPELLS 282. 	case SPE_GENOCIDE: 283. #endif 284. 		known = TRUE; 285. 		do_genocide; 286. 		break; 287. 	case SCR_LIGHT: 288. 		if(!Blind) known = TRUE; 289. 		litroom(!confused); 290. 		break; 291. 	case SCR_TELEPORTATION: 292. 		if(confused) 293. 			level_tele; 294. 		else { 295. #ifdef QUEST 296. 			register int oux = u.ux, ouy = u.uy; 297. 			tele; 298. 			if(dist(oux, ouy) > 100) known = TRUE; 299. #else 300. 			register int uroom = inroom(u.ux, u.uy); 301. 			tele; 302. 			if(uroom != inroom(u.ux, u.uy)) known = TRUE; 303. #endif 304. 			if(Teleport_control) 305. 				known = TRUE; 306. 		}  307.  		break; 308. 	case SCR_GOLD_DETECTION: 309. 	    /* Unfortunately this code has become slightly less elegant, 310. 	       now that gold and traps no longer are of the same type. */ 311.  	    if(confused) { 312. 		register struct trap *ttmp; 313.  314.  		if(!ftrap) { 315. 			strange_feeling(sobj, "Your toes stop itching."); 316. 			return(1); 317. 		} else { 318. 			for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) 319. 				if(ttmp->tx != u.ux || ttmp->ty != u.uy) 320. 					goto outtrapmap; 321. 			/* only under me - no separate display required */ 322. 			pline("Your toes itch!"); 323. 			break; 324. 		outtrapmap: 325. 			cls; 326. 			for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) 327. 				at(ttmp->tx, ttmp->ty, Hallucination ? rndobjsym : GOLD_SYM); 328. 			prme; 329. 			pline("You feel very greedy!"); 330. 		}  331.  	    } else { 332. 		register struct gold *gtmp; 333.  334.  		if(!fgold) { 335. 			strange_feeling(sobj, "You feel materially poor."); 336. 			return(1); 337. 		} else { 338. 			known = TRUE; 339. 			for(gtmp = fgold; gtmp; gtmp = gtmp->ngold) 340. 				if(gtmp->gx != u.ux || gtmp->gy != u.uy) 341. 					goto outgoldmap; 342. 			/* only under me - no separate display required */ 343. 			pline("You notice some gold between your feet."); 344. 			break; 345. 		outgoldmap: 346. 			cls; 347. 			for(gtmp = fgold; gtmp; gtmp = gtmp->ngold) 348. 				at(gtmp->gx, gtmp->gy, Hallucination ? rndobjsym : GOLD_SYM); 349. 			prme; 350. 			pline("You feel very greedy, and sense gold!"); 351. 		}  352.  	    }  353.  		/* common sequel */ 354. 		more; 355. 		docrt; 356. 		break; 357. 	case SCR_FOOD_DETECTION: 358. #ifdef SPELLS 359. 	case SPE_DETECT_FOOD: 360. #endif 361. 	    {	register ct = 0, ctu = 0; 362. 		register struct obj *obj; 363. 		register char foodsym = confused ? POTION_SYM : FOOD_SYM; 364.  365.  		for(obj = fobj; obj; obj = obj->nobj) 366. 			if(obj->olet == foodsym) { 367. 				if(obj->ox == u.ux && obj->oy == u.uy) ctu++; 368. 				else ct++; 369. 			}  370.  		if(!ct && !ctu) { 371. 			strange_feeling(sobj,"Your nose twitches."); 372. 			return(1); 373. 		} else if(!ct) { 374. 			known = TRUE; 375. 			pline("You smell %s close nearby.",  376.  				confused ? "something" : "food"); 377. 			  378.  		} else { 379. 			known = TRUE; 380. 			cls; 381. 			for(obj = fobj; obj; obj = obj->nobj) 382. 			    if(obj->olet == foodsym) 383. 				at(obj->ox, obj->oy, Hallucination ? rndobjsym :  384.  				 FOOD_SYM); 385. 			prme; 386. 			pline("Your nose tingles and you smell %s!",  387.  				confused ? "something" : "food"); 388. 			more; 389. 			docrt; 390. 		}  391.  		break; 392. 	    }  393.  	case SCR_IDENTIFY: 394. 		/* known = TRUE; */ 395. 		if(confused) 396. 			pline("You identify this as an identify scroll."); 397. 		else 398. 			pline("This is an identify scroll."); 399. 		useup(sobj); 400. 		objects[SCR_IDENTIFY].oc_name_known = 1; 401. #ifdef SPELLS 402. 	case SPE_IDENTIFY: 403. #endif 404. 		if(!confused) 405. 		    while(!ggetobj("identify", identify, rn2(5) ? 1 : rn2(5)) && invent); 406. 		return(1); 407. 	case SCR_MAGIC_MAPPING: 408. 		known = TRUE; 409. 		pline("On this scroll %s a map!", confused ? "was" : "is"); 410. #ifdef SPELLS 411. 	case SPE_MAGIC_MAPPING: 412. #endif 413. 		do_mapping; 414. 		break; 415. 	case SCR_AMNESIA: 416. 	    {	register int zx, zy; 417.  418.  		known = TRUE; 419. 		for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++) 420. 		    if(!confused || rn2(7)) 421. 			if(!cansee(zx,zy)) 422. 			    levl[zx][zy].seen = 0; 423. 		docrt; 424. 		pline("Who was that Maude person anyway?"); 425. #ifdef SPELLS 426. 		losespells; 427. #endif 428. 		break; 429. 	    }  430.  	case SCR_FIRE: 431. 	    {	register int num; 432. 		register struct monst *mtmp; 433.  434.  /*  435.   * Note: This case was modified 11/4/86 by DKC to eliminate the problem with 436.  * reading a scroll of fire while confused or resistant to fire. Formerly, 437.  * the code failed to initialize the variable "num" in these cases, resulting 438.  * in monsters being hit for a possibly large (and possibly negative) damage. 439.  * The actions taken now are: 440.  * 				If the player is fire resistant, monsters 441.  * take the normal damage (1-6 except for Y's and F's), and the player is  442. * unaffected. 443.  */  444.  		known = TRUE; 445. 		if(confused) { 446. 		    if(Fire_resistance) 447. 			pline("Oh look, what a pretty fire in your hands."); 448. 		    else { 449. 			pline("The scroll catches fire and you burn your hands."); 450. 			losehp(1, "scroll of fire"); 451. 		    }  452.  		    break; 453. 		}  454.  		pline("The scroll erupts in a tower of flame!"); 455. 		num = rnd(6); 456. 		if(Fire_resistance) 457. 			pline("You are uninjured."); 458. 		else { 459. 			u.uhpmax -= num; 460. 			losehp(num, "scroll of fire"); 461. 		}  462.  		num = (2*num + 1)/3; 463. 		for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 464. 		    if(dist(mtmp->mx,mtmp->my) < 3) { 465. 			mtmp->mhp -= num;		/* No saving throw! */ 466.  			if(index("FY", mtmp->data->mlet)) 467. 			    mtmp->mhp -= 3*num;	/* this might well kill 'F's */ 468. 			if(mtmp->mhp < 1) { 469. 			    killed(mtmp); 470. 			    break;		/* primitive */ 471. 			}  472.  		    }  473.  		}  474.  		break; 475. 	    }  476.  	case SCR_PUNISHMENT: 477. 		known = TRUE; 478. 		if(confused) { 479. 			pline("You feel guilty."); 480. 			break; 481. 		}  482.  		pline("You are being punished for your misbehaviour!"); 483. 		if(Punished){ 484. 			pline("Your iron ball gets heavier."); 485. 			uball->owt += 15; 486. 			break; 487. 		}  488.  		Punished = INTRINSIC; 489. 		setworn(mkobj_at(CHAIN_SYM, u.ux, u.uy), W_CHAIN); 490. 		setworn(mkobj_at(BALL_SYM, u.ux, u.uy), W_BALL); 491. 		uball->spe = 1;		/* special ball (see save) */ 492. 		break; 493. 	default: 494. 		impossible("What weird effect is this? (%u)", sobj->otyp); 495. 	}  496.  	return(0); 497. }  498.   499.  identify(otmp)		/* also called by newmail */ 500. register struct obj *otmp; 501. {  502.  	objects[otmp->otyp].oc_name_known = 1; 503. #ifdef KAA 504. 	otmp->known = 1; 505. 	if (otmp->olet != WEAPON_SYM) otmp->dknown = 1; 506. /* Now, the dknown field is special for weapons, indicating blessing. */ 507.  #else 508. 	otmp->known = otmp->dknown = 1; 509. #endif 510. 	prinv(otmp); 511. 	return(1); 512. }  513.   514.  litroom(on) 515. register boolean on; 516. {  517.  	register num,zx,zy; 518.  519.  	/* first produce the text (provided he is not blind) */ 520. 	if(Blind) goto do_it; 521. 	if(!on) { 522. 		if(u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR ||  523.  		    !levl[u.ux][u.uy].lit) { 524. 			pline("It seems even darker in here than before."); 525. 			return; 526. 		} else 527. 			pline("It suddenly becomes dark in here."); 528. 	} else { 529. 		if(u.uswallow){ 530. 			pline("%s's stomach is lit.", Monnam(u.ustuck)); 531. 			return; 532. 		}  533.  		if(!xdnstair){ 534. 			pline("Nothing Happens."); 535. 			return; 536. 		}  537.  #ifdef QUEST 538. 		pline("The cave lights up around you, then fades."); 539. 		return; 540. #else 541. 		if(levl[u.ux][u.uy].typ == CORR) { 542. 		    pline("The corridor lights up around you, then fades."); 543. 		    return; 544. 		} else if(levl[u.ux][u.uy].lit) { 545. 		    pline("The light here seems better now."); 546. 		    return; 547. 		} else 548. 		    pline("The room is lit."); 549. #endif 550. 	}  551.   552.  do_it: 553. #ifdef QUEST 554. 	return; 555. #else 556. 	if(levl[u.ux][u.uy].lit == on) 557. 		return; 558. 	if(levl[u.ux][u.uy].typ == DOOR) { 559. 		if(IS_ROOM(levl[u.ux][u.uy+1].typ)) zy = u.uy+1; 560. 		else if(IS_ROOM(levl[u.ux][u.uy-1].typ)) zy = u.uy-1; 561. 		else zy = u.uy; 562. 		if(IS_ROOM(levl[u.ux+1][u.uy].typ)) zx = u.ux+1; 563. 		else if(IS_ROOM(levl[u.ux-1][u.uy].typ)) zx = u.ux-1; 564. 		else zx = u.ux; 565. 	} else { 566. 		zx = u.ux; 567. 		zy = u.uy; 568. 	}  569.  	for(seelx = u.ux; (num = levl[seelx-1][zy].typ) != CORR && num != 0;  570.  		seelx--); 571. 	for(seehx = u.ux; (num = levl[seehx+1][zy].typ) != CORR && num != 0;  572.  		seehx++); 573. 	for(seely = u.uy; (num = levl[zx][seely-1].typ) != CORR && num != 0;  574.  		seely--); 575. 	for(seehy = u.uy; (num = levl[zx][seehy+1].typ) != CORR && num != 0;  576.  		seehy++); 577. 	for(zy = seely; zy <= seehy; zy++) 578. 		for(zx = seelx; zx <= seehx; zx++) { 579. 			levl[zx][zy].lit = on; 580. 			if(!Blind && dist(zx,zy) > 2) 581. 				if(on) prl(zx,zy); else nosee(zx,zy); 582. 		}  583.  	if(!on) seehx = 0; 584. #endif 585. }  586.   587.  /* Test whether we may genocide all monsters with symbol  ch  */ 588. monstersym(ch)				/* arnold@ucsfcgl */ 589. register char ch; 590. {  591.  	register struct permonst *mp; 592.  593.  	/*  594.  	 * can't genocide certain monsters 595. 	 */  596.  	if (index("12 &:", ch))	return FALSE; 597.  598.  	if (ch == pm_eel.mlet)	return TRUE; 599. 	for (mp = mons; mp < &mons[CMNUM+2]; mp++) 600. 		if (mp->mlet == ch) return TRUE; 601.  602.  	return FALSE; 603. }  604.   605.  do_genocide { 606. 	extern char genocided[], fut_geno[]; 607. 	char buf[BUFSZ]; 608. 	register struct monst *mtmp, *mtmp2; 609.  610.  	if(Confusion != 0)  *buf = u.usym; 611. 	else do { 612. 	    pline("What monster do you want to genocide (Type the letter)? "); 613. 	    getlin(buf); 614. 	}  615.   616.  	while(strlen(buf) != 1 || !monstersym(*buf)); 617.  618.  	if(!index(fut_geno, *buf))  charcat(fut_geno, *buf); 619. 	if(!index(genocided, *buf)) charcat(genocided, *buf); 620. 	else { 621. 		pline("Such monsters do not exist in this world."); 622. 		return; 623. 	}  624.  	for(mtmp = fmon; mtmp; mtmp = mtmp2){ 625. 		mtmp2 = mtmp->nmon; 626. 		if(mtmp->data->mlet == *buf) 627. 			mondead(mtmp); 628. 	}  629.  	pline("Wiped out all %c's.", Hallucination ? '@' : *buf); 630. 	/* Scare the hallucinating player */ 631. 	if(*buf == '@') { 632. 		u.uhp = -1; 633. 		killer = "scroll of genocide"; 634. 	/* A polymorphed character will die as soon as he is rehumanized. */ 635.  		if(u.usym != '@')	pline("You feel dead inside."); 636. 		else			done("died"); 637. 	}  638.  #ifdef KAA 639. 	else if (*buf==u.usym) rehumanize; 640. #endif 641. }  642.   643.  do_mapping 644. {  645.  	register struct rm *lev; 646. 	register int num, zx, zy; 647.  648.  	for(zy = 0; zy < ROWNO; zy++) 649. 	    for(zx = 0; zx < COLNO; zx++) { 650.  651.  		if((Confusion != 0) && rn2(7)) continue; 652. 		lev = &(levl[zx][zy]); 653. 		if((num = lev->typ) == 0)	continue; 654.  655.  		if(num == SCORR) { 656. 			lev->typ = CORR; 657. 			lev->scrsym = CORR_SYM; 658. 		} else	if(num == SDOOR) { 659. 			lev->typ = DOOR; 660. 			lev->scrsym = DOOR_SYM; 661. 		/* do sth in doors ? */ 662.  		} else if(lev->seen) continue; 663. #ifndef QUEST 664. 		if(num != ROOM) 665. #endif 666. 		{  667.  			lev->seen = lev->new = 1; 668. 			if(lev->scrsym == STONE_SYM || !lev->scrsym) 669. 				newsym(zx,zy); 670. 			else	on_scr(zx,zy); 671. 		}  672.  	    }  673.  }  674.   675.  destroy_arm { 676.  677.  	if(uarm) { 678. 		pline("Your armor turns to dust and falls to the floor!"); 679. 		useup(uarm); 680. 	} else if(uarmh) { 681. 		pline("Your helmet turns to dust and is blown away!"); 682. 		useup(uarmh); 683. 	} else if(uarmg) { 684. 		pline("Your gloves vanish!"); 685. 		useup(uarmg); 686. 		selftouch("You"); 687. 	} else if(uarms) { 688. 		pline("Your shield crumbles away!"); 689. 		useup(uarms); 690. 	} else  return(0);		/* could not destroy anything */ 691.  692.  	return(1); 693. }