Source:NetHack 2.2a/read.c

From NetHackWiki
Jump to navigation Jump to search

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

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

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

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