home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / nethack2.3 / part06 / read.c < prev    next >
C/C++ Source or Header  |  1988-10-17  |  17KB  |  701 lines

  1. /*    SCCS Id: @(#)read.c    2.3    88/01/21
  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. #ifdef SHIRT
  683.     } else if(uarmu) {
  684.         pline("Your shirt crumbles into tiny threads and falls apart!");
  685.         useup(uarmu);
  686. #endif
  687.     } else if(uarmh) {
  688.         pline("Your helmet turns to dust and is blown away!");
  689.         useup(uarmh);
  690.     } else if(uarmg) {
  691.         pline("Your gloves vanish!");
  692.         useup(uarmg);
  693.         selftouch("You");
  694.     } else if(uarms) {
  695.         pline("Your shield crumbles away!");
  696.         useup(uarms);
  697.     } else  return(0);        /* could not destroy anything */
  698.  
  699.     return(1);
  700. }
  701.