home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d190 / nethack.lha / NetHack / een.zoo / pray.c < prev    next >
C/C++ Source or Header  |  1988-07-24  |  14KB  |  534 lines

  1. /*    SCCS Id: @(#)pray.c     2.3     87/12/12
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include "hack.h"
  5.  
  6. extern char *nomovemsg;
  7. extern struct monst *mkmon_at();
  8. extern struct obj *mkobj_at();
  9.  
  10. #ifdef PRAYERS
  11. #ifdef THEOLOGY
  12.  
  13. #define TROUBLE_STONED 1
  14. #define TROUBLE_STARVING 2
  15. #define TROUBLE_SICK 3
  16. #define TROUBLE_HIT 4
  17.  
  18. #define TROUBLE_PUNISHED (-1)
  19. #define TROUBLE_CURSED_ITEMS (-2)
  20. #define TROUBLE_HUNGRY (-3)
  21. #define TROUBLE_HALLUCINATION (-4)
  22. #define TROUBLE_BLIND (-5)
  23. #define TROUBLE_POISONED (-6)
  24. #define TROUBLE_WOUNDED_LEGS (-7)
  25. #define TROUBLE_CONFUSED (-8)
  26.  
  27. /* We could force rehumanize of polyselfed people, but we can't tell
  28.    unintentional shape changes from the other kind. Oh well. */
  29.  
  30. /* Return 0 if nothing particular seems wrong, positive numbers for
  31.    serious trouble, and negative numbers for comparative annoyances. This
  32.    returns the worst problem. There may be others, and the gods may fix
  33.    more than one.
  34.  
  35. This could get as bizarre as noting surrounding opponents, (or hostile dogs),
  36. but that's really hard.
  37.  */
  38.  
  39.  
  40. in_trouble () {
  41.  
  42. /* Borrowed from eat.c */
  43.  
  44. #define SATIATED    0
  45. #define NOT_HUNGRY    1
  46. #define HUNGRY        2
  47. #define WEAK        3
  48. #define FAINTING    4
  49. #define FAINTED     5
  50. #define STARVED     6
  51.  
  52.   if (Stoned) return (TROUBLE_STONED);
  53.   if (u.uhs >= WEAK) return (TROUBLE_STARVING);
  54.   if (Sick) return (TROUBLE_SICK);
  55.   if (u.uhp < 5) return (TROUBLE_HIT);
  56.   if (Punished) return (TROUBLE_PUNISHED);
  57.   if (
  58.       (uarmh && uarmh->cursed)  /* helmet */
  59.       ||
  60.       (uarms && uarms->cursed)  /* shield */
  61.       ||
  62.       (uarmg && uarmg->cursed)  /* gloves */
  63.       ||
  64.       (uarm && uarm->cursed)    /* armor */
  65.       ||
  66.       (uarm2 && uarm2->cursed)  /* cloak */
  67.       ||
  68.       (uwep && (uwep->olet == WEAPON_SYM) && (uwep->cursed))
  69.       ||
  70.       (uleft && uleft->cursed)
  71.       ||
  72.       (uright && uright->cursed))
  73.     return (TROUBLE_CURSED_ITEMS);
  74.  
  75.   if (u.uhs >= HUNGRY) return (TROUBLE_HUNGRY);
  76.   if (Hallucination) return (TROUBLE_HALLUCINATION);
  77.   if (Blinded > 1) return (TROUBLE_BLIND); /* don't loop when fixing sets to 1 */
  78.   if (u.ustr < u.ustrmax) return (TROUBLE_POISONED);
  79.   if (Wounded_legs) return (TROUBLE_WOUNDED_LEGS);
  80.   if (Confusion) return (TROUBLE_CONFUSED);
  81.   return (0);
  82. }
  83.  
  84. fix_worst_trouble ()
  85. {
  86.   char *tmp, *hcolor();
  87.  
  88.   switch (in_trouble ()) {
  89.   case TROUBLE_STONED: pline ("You feel more limber."); Stoned = 0; break;
  90.   case TROUBLE_HUNGRY:
  91.   case TROUBLE_STARVING: pline ("Your stomach feels content."); init_uhunger (); break;
  92.   case TROUBLE_SICK: pline ("You feel better."); Sick = 0; break;
  93.   case TROUBLE_HIT:
  94.     pline("A %s glow surrounds you",
  95.       Hallucination ? hcolor () : "golden");
  96.     u.uhp = u.uhpmax += 5;
  97.     break;
  98.  
  99.  case TROUBLE_PUNISHED:
  100.    Punished = 0;
  101.    freeobj(uchain);
  102.    unpobj(uchain);
  103.    free((char *) uchain);
  104.    uball->spe = 0;
  105.    uball->owornmask &= ~W_BALL;
  106.    uchain = uball = (struct obj *) 0;
  107.    break;
  108.  
  109.  case TROUBLE_CURSED_ITEMS:
  110.     { struct obj *otmp;
  111.       char * what;
  112.       otmp = (struct obj *) 0;
  113.       what = (char *) 0;
  114.       if (uarmh && uarmh->cursed)       /* helmet */
  115.     otmp = uarmh;
  116.       else if (uarms && uarms->cursed) /* shield */
  117.     otmp = uarms;
  118.       else if (uarmg && uarmg->cursed) /* gloves */
  119.     otmp = uarmg;
  120.       else if (uarm && uarm->cursed) /* armor */
  121.     otmp = uarm;
  122.       else if (uarm2 && uarm2->cursed) /* cloak, probably */
  123.     otmp = uarm2;
  124.       else if (uleft && uleft->cursed) {
  125.     otmp = uleft;
  126.     what = "left hand";
  127.       }
  128.       else if (uright && uright->cursed) {
  129.     otmp = uright;
  130.     what = "right hand";
  131.       }
  132.       else if(uwep && (uwep->olet == WEAPON_SYM) && (uwep->cursed))
  133.     otmp = uwep;
  134.  
  135.       otmp->cursed = 0;
  136.       pline ("Your %s %s.", what ? what : aobjnam (otmp, "softly glow"),
  137.          Hallucination ? hcolor() : "amber");
  138.       break;
  139.     }
  140.  
  141.  case TROUBLE_HALLUCINATION:
  142.    pline ("Looks like you are back in kansas."); Hallucination = 0; break;
  143.  case TROUBLE_BLIND:
  144.     pline ("Your eyes feel better."); Blinded = 1; break;
  145.  case TROUBLE_POISONED:
  146.    pline("There's a tiger in your tank.");
  147.    if(u.ustr < u.ustrmax) {
  148.      u.ustr = u.ustrmax;
  149.      flags.botl = 1;
  150.    }
  151.    break;
  152.  case TROUBLE_WOUNDED_LEGS:
  153.    heal_legs ();
  154.    break;
  155.  case TROUBLE_CONFUSED:
  156.    HConfusion = 0;
  157.    break;
  158.  }
  159. }
  160.  
  161. #define CORPSE_I_TO_C(otyp)     (char) ((otyp >= DEAD_ACID_BLOB)\
  162.                     ?  'a' + (otyp - DEAD_ACID_BLOB)\
  163.                     :    '@' + (otyp - DEAD_HUMAN))
  164.  
  165. extern char POISONOUS[];
  166.  
  167. dosacrifice () {
  168.   register struct obj *otmp;
  169.   register struct objclass *ftmp;
  170.   int value;
  171.   char let;
  172.   char *hcolor ();
  173.  
  174.   otmp = getobj("%", "sacrifice");
  175.   if(!otmp) return(0);
  176.  
  177.   ftmp = &objects[otmp->otyp];
  178. #ifdef KAA
  179.   if(otmp->otyp == DEAD_DEMON) let='&';
  180.   else if (otmp->otyp == DEAD_GIANT) let='9';
  181.   else let = CORPSE_I_TO_C(otmp->otyp);
  182. #else
  183.   let = CORPSE_I_TO_C(otmp->otyp);
  184. #endif
  185.  
  186.   /* judge the food value by the nutrition, as well as some aging behavior */
  187.  
  188.   value = ftmp->nutrition;
  189.  
  190.   if (otmp->otyp >= CORPSE)
  191.     {
  192.       if (let != 'a' && (moves > otmp->age + 50))
  193.     value = 0;        /* old stuff */
  194.     }
  195.   else if(index(POISONOUS, let)) {
  196.     value = -10;        /* gods get annoyed */
  197.   }
  198.  
  199.  
  200.   if (value == 0)
  201.     {
  202.       pline ("Nothing happens.");
  203.       return (1);
  204.     }
  205.   if (value < 0) /* Gods don't like poision as an offering. */
  206.     {
  207. #ifdef HARD
  208.       u.ugangr++;
  209.       angrygods();
  210. #else
  211.       if (u.ugangr++)   angrygods();
  212.       else {            /* exactly one warning */
  213.     pline("A voice booms out: You have angered us,");
  214.     pline("Disturb us again at your own risk!");
  215.       }
  216. #endif
  217.     }
  218.   if (value > 0)
  219.     {
  220.       int saved_anger = u.ugangr;
  221.       int saved_cnt = u.ublesscnt;
  222.       int saved_luck = u.uluck;
  223.       /* OK, you get brownie points. */
  224.       if (Hallucination)
  225.     pline("Your sacrifice sprouts wings and a propeller and roars away!");
  226.       else pline("Your sacrifice is consumed in a burst of flame!");
  227.       if(u.ugangr)
  228.     {
  229.       u.ugangr -= ((value / 800) * 4);
  230.       if(u.ugangr < 0) u.ugangr = 0;
  231.       if(u.ugangr != saved_anger)
  232.         if (u.ugangr)
  233.           {
  234.         if (Hallucination) pline ("The gods seem %s.", hcolor ());
  235.         else pline("The gods seem slightly molified.");
  236.           }
  237.         else {
  238.           if (Hallucination) pline ("The gods seem cosmic (not a new fact).");
  239.           else pline ("The gods seem mollified.");
  240.         }
  241.       if ((int)u.uluck < 0) u.uluck = 0;
  242.     }
  243.       else if (u.ublesscnt > 0)
  244.     {
  245.       u.ublesscnt -= ((value / 800 /* a food ration */) * 300);
  246.       if(u.ublesscnt < 0) u.ublesscnt = 0;
  247.       if(u.ublesscnt != saved_cnt)
  248.         {
  249.           if ((int)u.uluck < 0) u.uluck = 0;
  250.           if (u.ublesscnt) {
  251.         if (Hallucination) pline ("You realize that the gods are not like you and I.");
  252.         else pline ("You have a hopeful feeling.");
  253.           }
  254.           else {
  255.         if (Hallucination) pline ("Overall, there is a smell of fried onions.");
  256.         else pline ("You have a feeling of reconciliation.");
  257.           }
  258.         }
  259.     }
  260.       else /* you were already in pretty good standing */
  261.     {
  262.       change_luck((value / 800) * LUCKMAX);
  263.       if (u.uluck != saved_luck)
  264.         {
  265.           if (Hallucination) pline ("You see crabgrass at your feet. A funny thing in a dungeon.");
  266.           else pline ("You see a four-leaf clover at your feet.");
  267.         }
  268.     }
  269.     }
  270.   useup(otmp);
  271.   return(1);
  272. }
  273. #endif
  274. #endif
  275.  
  276. dopray() {              /* M. Stephenson (1.0.3b) */
  277. #ifdef PRAYERS
  278. #ifdef THEOLOGY
  279.   int trouble = in_trouble ();
  280.   if ((!trouble && (u.ublesscnt > 0)) ||
  281.       ((trouble < 0) && (u.ublesscnt > 100)) /* minor difficulties */ ||
  282.       ((trouble > 0) && (u.ublesscnt > 200)) /* big trouble */
  283.       ) {
  284. #else
  285.     if (u.ublesscnt > 0)  {             /* disturbing the gods too much */
  286. #endif
  287.         u.ublesscnt += rnz(250);
  288.         change_luck(-3);
  289. #ifdef HARD
  290.         u.ugangr++;
  291.         angrygods();
  292. #else
  293.         if (u.ugangr++) angrygods();
  294.         else {            /* exactly one warning */
  295.             pline("A voice booms out: You have angered us,");
  296.             pline("Disturb us again at your own risk!");
  297.         }
  298. #endif
  299.     } else    if ((int)u.uluck < 0) angrygods();      /* a bad player */
  300.     else    pleased();                              /* or a good player */
  301. #endif
  302.     nomovemsg = "You finished your prayer.";
  303.     nomul(-3);
  304.     return(1);
  305. }
  306.  
  307. #ifdef PRAYERS
  308. angrygods() {
  309.     register int    tmp;
  310.  
  311.     pline ("You get the feeling the gods are angry...");
  312.     /* changed from tmp = u.ugangr + abs (u.uluck) -- rph */
  313.     tmp =  3*u.ugangr + (u.uluck > 0 ? -u.uluck/3 : -u.uluck);
  314.     tmp =  (tmp > 15 ? 15 : tmp);  /* lets be a little reasonable */
  315.     switch (tmp ? rn2(tmp): 0) {
  316.  
  317.         case 0:
  318.         case 1:    pline("but nothing appears to happen.");
  319.             break;
  320.         case 2:
  321.         case 3:    pline("A voice booms out: You are arrogant, mortal.");
  322.             pline("You must relearn your lessons!");
  323.             if (u.ulevel > 1)       losexp();
  324.             else  {
  325.                 u.uexp = 0;
  326.                 flags.botl = 1;
  327.             }
  328.             break;
  329.         case 4:
  330.         case 5:
  331.         case 6:    pline("A black glow surrounds you.");
  332.             rndcurse();
  333.             break;
  334.         case 7:
  335.         case 8:    pline("A voice booms out: You dare to call upon us?");
  336.             pline("Then, die mortal!");
  337.             mkmon_at('&', u.ux, u.uy);
  338.             break;
  339.  
  340.         default:    pline("Suddenly, a bolt of lightning strikes you!");
  341.             pline("You are fried to a crisp.");
  342.             killer = "pissed off deity";
  343.             done("died");
  344.             break;
  345.     }
  346.     u.ublesscnt = rnz(300);
  347.     return(0);
  348. }
  349.  
  350.  
  351.  
  352. pleased() {
  353.  
  354.     char    *tmp, *hcolor();
  355. #ifdef THEOLOGY
  356.     int trouble = in_trouble ();            /* what's your worst difficulty? */
  357.     int pat_on_head = 0;
  358. #endif
  359.     u.ugangr--;
  360.     if (u.ugangr < 0) u.ugangr = 0;
  361.     pline("You feel the gods are pleased.");
  362.  
  363. #ifdef THEOLOGY
  364.     /* depending on your luck, the gods will :
  365.        - fix your worst problem if its major.
  366.        - fix all your major problems.
  367.        - fix your worst problem if its minor.
  368.        - fix all of your problems.
  369.        - do you a gratuitous favor.
  370.  
  371.        if you make it to the the last category, you roll randomly again
  372.        to see what they do for you.
  373.  
  374.        If your luck is at least 0, then you are guaranteed rescued
  375.        from your worst major problem. */
  376.  
  377.     if (!trouble) pat_on_head = 1;
  378.     else
  379.       { int action = rn1(5,u.uluck+1);
  380.         if (action>=5) pat_on_head = 1;
  381.         if (action>=4) while (in_trouble ()) fix_worst_trouble ();
  382.         if (action<4 && action>=3) fix_worst_trouble ();
  383.         if (action<4 && action>=2) while (in_trouble () > 0) fix_worst_trouble ();
  384.         if (action==1 && trouble > 0) fix_worst_trouble ();
  385.         if (action==0) pline("but nothing seems to happen.");
  386.       };
  387.     if (pat_on_head)pline("The gods seem especially pleased ...");
  388.  
  389.      if (pat_on_head)
  390. #endif
  391.     switch(rn2((u.uluck + 6)/2))  {
  392.  
  393.         case 0:    pline("but nothing seems to happen.");
  394.             break;
  395.         case 1:
  396.             if(!uwep) {
  397.                 if(uleft && uleft->cursed) {
  398.                 pline("your left hand glows amber.");
  399.                 uleft->cursed = 0;
  400.                 } else if(uright && uright->cursed) {
  401.                 pline("your right hand glows amber.");
  402.                 uright->cursed = 0;
  403.                 } else    pline("but nothing seems to happen.");
  404.                 break;
  405.             }
  406. #ifdef KAA
  407.             if(uwep->olet == WEAPON_SYM) {
  408.                 if (uwep->cursed) {
  409.                 uwep->cursed=0;
  410.                 pline("Your %s %s.", aobjnam(uwep,"softly glow"),
  411.                 Hallucination ? hcolor() : "amber");
  412.                 } else if(uwep->otyp >= ARROW && uwep->otyp <= SPEAR) {
  413.                 uwep->dknown=1;
  414.                 tmp = Hallucination ? hcolor() : "light blue";
  415.                 pline("Your %s with a%s %s aura.", aobjnam(uwep,"softly glow"),
  416.                 index("aeiou",*tmp) ? "n" : "", tmp);
  417.                 }
  418.             } else
  419. #endif
  420.                 pline("but nothing seems to happen.");
  421.             break;
  422.         case 2:
  423.         case 3:
  424.             pline("A %s glow surrounds you",
  425.                   Hallucination ? hcolor() : "golden");
  426.             u.uhp = u.uhpmax += 5;
  427.             u.ustr = u.ustrmax;
  428.             if (u.uhunger < 900)    init_uhunger();
  429.             if (u.uluck < 0)        u.uluck = 0;
  430.             if (Blinded)            Blinded = 1;
  431.             flags.botl = 1;
  432.             break;
  433.         case 4:
  434.         case 5:    pline("A voice booms out: We are pleased with your progress,");
  435.             pline("and grant you the gift of");
  436.             if (!(HTelepat & INTRINSIC))  {
  437.                 HTelepat |= INTRINSIC;
  438.                 pline ("Telepathy,");
  439.             } else if (!(Fast & INTRINSIC))  {
  440.                 Fast |= INTRINSIC;
  441.                 pline ("Speed,");
  442.             } else if (!(Stealth & INTRINSIC))  {
  443.                 Stealth |= INTRINSIC;
  444.                 pline ("Stealth,");
  445.             } else {
  446.                 if (!(Protection & INTRINSIC))  {
  447.                 Protection |= INTRINSIC;
  448.                 if (!u.ublessed)  u.ublessed = rnd(3) + 1;
  449.                 } else u.ublessed++;
  450.                 pline ("our protection,");
  451.             }
  452.             pline ("Use it wisely in our names!");
  453.             break;
  454.  
  455.         case 6:    pline ("An object appears at your feet!");
  456. #ifdef SPELLS
  457.             mkobj_at('+', u.ux, u.uy);
  458. #else
  459.             mkobj_at('?', u.ux, u.uy);
  460. #endif
  461.             break;
  462.  
  463.         case 7:    pline("A voice booms out:  We crown thee...");
  464.             pline("The Hand of Elbereth!");
  465.             HInvis |= INTRINSIC;
  466.             HSee_invisible |= INTRINSIC;
  467.             HFire_resistance |= INTRINSIC;
  468.             HCold_resistance |= INTRINSIC;
  469.             HPoison_resistance |= INTRINSIC;
  470. #ifdef RPH
  471.             if(uwep && (uwep->otyp == LONG_SWORD))
  472.                 oname(uwep, "Excalibur");
  473. #endif
  474.             break;
  475.  
  476.         default:    impossible("Confused deity!");
  477.             break;
  478.     }
  479.     u.ublesscnt = rnz(350);
  480. #ifdef HARD
  481.     u.ublesscnt += (u.udemigod * rnz(1000));
  482. #endif
  483.     return(0);
  484. }
  485. #endif /* PRAYERS /**/
  486. #ifdef NEWCLASS
  487. doturn() {      /* Knights & Priest(esse)s only please */
  488.  
  489.     register struct monst *mtmp;
  490.     register int    xlev = 6;
  491.     extern char    pl_character[];
  492.  
  493.     if((pl_character[0] != 'P') &&
  494.        (pl_character[0] != 'K')) {
  495.  
  496.         pline("You don't know how to turn undead!");
  497.         return(0);
  498.     }
  499.     if (Inhell) {
  500.  
  501.         pline("Being in hell, your gods won't help you.");
  502.         aggravate();
  503.         return(0);
  504.     }
  505.     pline("Calling upon your gods, you chant an arcane formula.");
  506.     for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  507.         if(cansee(mtmp->mx,mtmp->my)) {
  508.         if(index(UNDEAD,mtmp->data->mlet) ||
  509.            ((mtmp->data->mlet == '&') && (u.ulevel > 10))) {
  510.  
  511.             if(Confusion) {
  512.             pline("Unfortunately, your voice falters.");
  513.             mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0;
  514.             } else if (! resist(mtmp, '+', 0, TELL))
  515.             switch (mtmp->data->mlet) {
  516.                 case 'V':   xlev += 2;
  517.                 case 'W':   xlev += 4;
  518.                 case 'Z':   if(u.ulevel >= xlev)  {
  519.                         if(!resist(mtmp, '+', 0, NOTELL)) {
  520.                         pline("You destroy the %s", monnam(mtmp));
  521.                         mondied(mtmp);
  522.                         } else    mtmp->mflee = 1;
  523.                     } else    mtmp->mflee = 1;
  524.                     break;
  525.                 default:    mtmp->mflee = 1;
  526.                     break;
  527.             }
  528.            }
  529.         }
  530.         nomul(-5);
  531.         return(1);
  532. }
  533. #endif /* NEWCLASS /**/
  534.