[BACK]Return to potions.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / urogue

Annotation of early-roguelike/urogue/potions.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     potions.c - Functions for dealing with potions
        !             3:
        !             4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
        !             5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
        !            10:     All rights reserved.
        !            11:
        !            12:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: #include <string.h>
        !            20: #include <stdlib.h>
        !            21: #include "rogue.h"
        !            22:
        !            23: /*
        !            24:     quaff - drink a potion (or effect a potion-like spell)
        !            25:
        !            26:     quaffer: who does it
        !            27:     which:   which P_POTION (-1 means ask from pack)
        !            28:     flags:   ISBLESSED, ISCURSED
        !            29: */
        !            30:
        !            31: void
        !            32: quaff(struct thing *quaffer, int which, int flags)
        !            33: {
        !            34:     struct object   *obj;
        !            35:     struct thing    *th;
        !            36:     struct stats    *curp = &(quaffer->t_stats);
        !            37:     struct stats    *maxp = &(quaffer->maxstats);
        !            38:     int    blessed = flags & ISBLESSED;
        !            39:     int    cursed = flags & ISCURSED;
        !            40:     int    is_potion = (which < 0 ? TRUE : FALSE);
        !            41:
        !            42:     struct linked_list  *item, *titem;
        !            43:     char    buf[2 * LINELEN];
        !            44:
        !            45:     if (quaffer != &player)
        !            46:     {
        !            47:         monquaff(quaffer, which, flags);
        !            48:         return;
        !            49:     }
        !            50:
        !            51:     if (is_potion)      /* A regular potion */
        !            52:     {
        !            53:         if ((item = get_item("quaff", POTION)) == NULL)
        !            54:             return;
        !            55:
        !            56:         obj = OBJPTR(item);
        !            57:
        !            58:         if (obj->o_type != POTION)
        !            59:         {
        !            60:             msg("You can't drink that!");
        !            61:             return;
        !            62:         }
        !            63:
        !            64:         /* Calculate its effect */
        !            65:
        !            66:         flags = obj->o_flags;
        !            67:         cursed = obj->o_flags & ISCURSED;
        !            68:         blessed = obj->o_flags & ISBLESSED;
        !            69:         which = obj->o_which;
        !            70:
        !            71:         /* remove it from the pack */
        !            72:
        !            73:         rem_pack(obj);
        !            74:         discard(item);
        !            75:         updpack();
        !            76:     }
        !            77:
        !            78:     switch(which)
        !            79:     {
        !            80:         case P_CLEAR:
        !            81:             if (cursed)
        !            82:             {
        !            83:                 if (off(player, ISCLEAR))
        !            84:                 {
        !            85:                     msg("Wait, what's going on here. Huh? What? Who?");
        !            86:
        !            87:                     if (on(player, ISHUH))
        !            88:                         lengthen_fuse(FUSE_UNCONFUSE, rnd(8) + HUHDURATION);
        !            89:                     else
        !            90:                         light_fuse(FUSE_UNCONFUSE, 0, rnd(8) + HUHDURATION, AFTER);
        !            91:
        !            92:                     turn_on(player, ISHUH);
        !            93:                 }
        !            94:                 else
        !            95:                     msg("You feel dizzy for a moment, but it passes.");
        !            96:             }
        !            97:             else
        !            98:             {
        !            99:                 if (blessed) /* Make player immune for the whole game */
        !           100:                 {
        !           101:                     extinguish_fuse(FUSE_UNCLRHEAD);  /* If we have a fuse, put it out */
        !           102:                     msg("A strong blue aura surrounds your head.");
        !           103:                 }
        !           104:                 else  /* Just light a fuse for how long player is safe */
        !           105:                 {
        !           106:                     if (off(player, ISCLEAR))
        !           107:                     {
        !           108:                         light_fuse(FUSE_UNCLRHEAD, 0, CLRDURATION, AFTER);
        !           109:                         msg("A faint blue aura surrounds your head.");
        !           110:                     }
        !           111:                     else  /* If have fuse lengthen, else permanently clear */
        !           112:                     {
        !           113:                         if (find_slot(FUSE_UNCLRHEAD,FUSE) == NULL)
        !           114:                             msg("Your blue aura continues to glow strongly.");
        !           115:                         else
        !           116:                         {
        !           117:                             lengthen_fuse(FUSE_UNCLRHEAD, CLRDURATION);
        !           118:                             msg("Your blue aura brightens for a moment.");
        !           119:                         }
        !           120:                     }
        !           121:                 }
        !           122:
        !           123:                 turn_on(player, ISCLEAR);
        !           124:
        !           125:                 /* If player is confused, unconfuse him */
        !           126:
        !           127:                 if (on(player, ISHUH))
        !           128:                 {
        !           129:                     extinguish_fuse(FUSE_UNCONFUSE);
        !           130:                     unconfuse(NULL);
        !           131:                 }
        !           132:             }
        !           133:             break;
        !           134:
        !           135:         case P_HEALING:
        !           136:             if (cursed)
        !           137:             {
        !           138:                 if (player.t_ctype != C_PALADIN
        !           139:                     && !(player.t_ctype == C_NINJA
        !           140:                     && curp->s_lvl > 12)
        !           141:                     && !save(VS_POISON))
        !           142:                 {
        !           143:                     feel_message();
        !           144:                     curp->s_hpt /= 2;
        !           145:                     curp->s_power /= 2;
        !           146:
        !           147:                     if ((curp->s_hpt -= 1) <= 0)
        !           148:                     {
        !           149:                         death(D_POISON);
        !           150:                         return;
        !           151:                     }
        !           152:                 }
        !           153:                 else
        !           154:                     msg("You feel momentarily sick.");
        !           155:             }
        !           156:             else
        !           157:             {
        !           158:                 int nsides = (blessed ? 8 : 4);
        !           159:                 int hpt_gain = roll(curp->s_lvl, nsides);
        !           160:                 int power_gain = roll(curp->s_lvl, nsides);
        !           161:
        !           162:                 if (blessed && on(player, ISHUH))
        !           163:                 {
        !           164:                     extinguish_fuse(FUSE_UNCONFUSE);
        !           165:                     unconfuse(NULL);
        !           166:                 }
        !           167:
        !           168:                 curp->s_hpt = min(curp->s_hpt + hpt_gain, maxp->s_hpt);
        !           169:
        !           170:                 if (is_potion)  /* Do not bump power or maximums if spell */
        !           171:                 {
        !           172:                     know_items[TYP_POTION][P_HEALING] = TRUE;
        !           173:                     curp->s_power = min(curp->s_power + power_gain, maxp->s_power);
        !           174:
        !           175:                     if (maxp->s_hpt == curp->s_hpt)
        !           176:                         maxp->s_hpt = curp->s_hpt += roll(1, nsides);
        !           177:
        !           178:                     if (maxp->s_power == curp->s_power)
        !           179:                         maxp->s_power = curp->s_power += roll(1, nsides);
        !           180:                 }
        !           181:
        !           182:                 msg("You begin to feel %sbetter.", blessed ? "much " : "");
        !           183:
        !           184:                 if (off(player, PERMBLIND))
        !           185:                     sight(NULL);
        !           186:             }
        !           187:             break;
        !           188:
        !           189:         case P_GAINABIL:
        !           190:         {
        !           191:             int   ctype;
        !           192:
        !           193:             if (!is_potion || pstats.s_arm <= 0)
        !           194:                 feel_message();
        !           195:             else
        !           196:             {
        !           197:                 if (blessed)    /* add to all attributes */
        !           198:                 {
        !           199:                     add_intelligence(FALSE);
        !           200:                     add_dexterity(FALSE);
        !           201:                     add_strength(FALSE);
        !           202:                     add_wisdom(FALSE);
        !           203:                     add_const(FALSE);
        !           204:                 }
        !           205:                 else
        !           206:                 {
        !           207:                     if (rnd(100) < 70)
        !           208:                     /* probably change own ability */
        !           209:                         ctype = player.t_ctype;
        !           210:                     else
        !           211:                         switch(rnd(4))
        !           212:                         {
        !           213:                             case 0: ctype = C_FIGHTER;  break;
        !           214:                             case 1: ctype = C_MAGICIAN; break;
        !           215:                             case 2: ctype = C_CLERIC;   break;
        !           216:                             case 3: ctype = C_THIEF;    break;
        !           217:                         }
        !           218:                     switch (ctype)
        !           219:                     {
        !           220:                         case C_FIGHTER:add_strength(cursed);        break;
        !           221:                         case C_PALADIN:add_strength(cursed);        break;
        !           222:                         case C_RANGER:add_strength(cursed);         break;
        !           223:                         case C_MAGICIAN:add_intelligence(cursed);   break;
        !           224:                         case C_ILLUSION:add_intelligence(cursed);   break;
        !           225:                         case C_CLERIC:add_wisdom(cursed);           break;
        !           226:                         case C_DRUID:add_wisdom(cursed);            break;
        !           227:                         case C_THIEF:add_dexterity(cursed);         break;
        !           228:                         case C_ASSASIN:add_dexterity(cursed);       break;
        !           229:                         case C_NINJA:add_dexterity(cursed);         break;
        !           230:                         default: msg("You're a strange type!");     break;
        !           231:                     }
        !           232:                 }
        !           233:
        !           234:                 if (rnd(100) < 10)
        !           235:                     add_const(cursed);
        !           236:
        !           237:                 if (rnd(100) < 60)
        !           238:                     curp->s_arm += (cursed ? 1 : -1);
        !           239:
        !           240:                 if (!cursed)
        !           241:                     know_items[TYP_POTION][P_GAINABIL] = TRUE;
        !           242:             }
        !           243:         }
        !           244:         break;
        !           245:
        !           246:         case P_MONSTDET:
        !           247:
        !           248:             /*
        !           249:              * Potion of monster detection, if there are monsters,
        !           250:              * detect them
        !           251:              */
        !           252:
        !           253:             if (is_potion)
        !           254:                 know_items[TYP_POTION][P_MONSTDET] = TRUE;
        !           255:
        !           256:             if (cursed)
        !           257:             {
        !           258:                 int nm = roll(3, 6);
        !           259:                 int i;
        !           260:                 char    ch;
        !           261:                 struct room *rp;
        !           262:                 coord   pos;
        !           263:
        !           264:                 msg("You begin to sense the presence of monsters.");
        !           265:                 wclear(hw);
        !           266:
        !           267:                 for (i = 1; i < nm; i++)
        !           268:                 {
        !           269:                     rp = &rooms[rnd_room()];
        !           270:                     rnd_pos(rp, &pos);
        !           271:
        !           272:                     if (rnd(2))
        !           273:                         ch = 'a' + ucrnd(26);
        !           274:                     else
        !           275:                         ch = 'A' + ucrnd(26);
        !           276:
        !           277:                     mvwaddch(hw, pos.y, pos.x, ch);
        !           278:                 }
        !           279:                 waddstr(cw, morestr);
        !           280:                 overlay(hw, cw);
        !           281:                 wrefresh(cw);
        !           282:                 wait_for(' ');
        !           283:                 msg("");
        !           284:             }
        !           285:             else if (mlist != NULL)
        !           286:             {
        !           287:                 msg("You begin to sense the presence of monsters.");
        !           288:                 waddstr(cw, morestr);
        !           289:                 overlay(mw, cw);
        !           290:                 wrefresh(cw);
        !           291:                 wait_for(' ');
        !           292:                 msg("");
        !           293:
        !           294:                 if (blessed)
        !           295:                     turn_on(player, BLESSMONS);
        !           296:             }
        !           297:             else
        !           298:                 nothing_message(flags);
        !           299:             break;
        !           300:
        !           301:         case P_TREASDET:
        !           302:
        !           303:             /* Potion of magic detection.  Show the potions and scrolls */
        !           304:
        !           305:             if (cursed)
        !           306:             {
        !           307:                 int nm = roll(3, 3);
        !           308:                 int i;
        !           309:                 char    ch;
        !           310:                 struct room *rp;
        !           311:                 coord   pos;
        !           312:
        !           313:                 msg("You sense the presence of magic on this level.");
        !           314:                 wclear(hw);
        !           315:
        !           316:                 for (i = 1; i < nm; i++)
        !           317:                 {
        !           318:                     rp = &rooms[rnd_room()];
        !           319:                     rnd_pos(rp, &pos);
        !           320:
        !           321:                     if (rnd(9) == 0)
        !           322:                         ch = BMAGIC;
        !           323:                     else if (rnd(9) == 0)
        !           324:                         ch = CMAGIC;
        !           325:                     else
        !           326:                         ch = MAGIC;
        !           327:
        !           328:                     mvwaddch(hw, pos.y, pos.x, ch);
        !           329:                 }
        !           330:                 waddstr(cw, morestr);
        !           331:
        !           332:                 overlay(hw, cw);
        !           333:                 wrefresh(cw);
        !           334:                 wait_for(' ');
        !           335:                 msg("");
        !           336:
        !           337:                 if (is_potion)
        !           338:                     know_items[TYP_POTION][P_TREASDET] = TRUE;
        !           339:
        !           340:                 break;
        !           341:             }
        !           342:
        !           343:             if (blessed)
        !           344:                 turn_on(player, BLESSMAGIC);
        !           345:
        !           346:             if (lvl_obj != NULL)
        !           347:             {
        !           348:                 struct linked_list  *mobj;
        !           349:                 struct object   *tp;
        !           350:                 int showit;
        !           351:
        !           352:                 showit = FALSE;
        !           353:                 wclear(hw);
        !           354:
        !           355:                 for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj))
        !           356:                 {
        !           357:                     tp = OBJPTR(mobj);
        !           358:
        !           359:                     if (is_magic(tp))
        !           360:                     {
        !           361:                         char    mag_type = MAGIC;
        !           362:
        !           363:                         if (blessed)
        !           364:                             if (tp->o_flags & ISCURSED)
        !           365:                                 mag_type = CMAGIC;
        !           366:                             else if (tp->o_flags & ISBLESSED)
        !           367:                                 mag_type = BMAGIC;
        !           368:
        !           369:                         showit = TRUE;
        !           370:                         mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, mag_type);
        !           371:                     }
        !           372:                 }
        !           373:
        !           374:                 for (titem = mlist; titem != NULL; titem = next(titem))
        !           375:                 {
        !           376:                     struct linked_list  *pitem;
        !           377:
        !           378:                     th = THINGPTR(titem);
        !           379:
        !           380:                     for (pitem = th->t_pack; pitem != NULL; pitem = next(pitem))
        !           381:                     {
        !           382:                         if (is_magic(OBJPTR(pitem)))
        !           383:                         {
        !           384:                             showit = TRUE;
        !           385:                             mvwaddch(hw, th->t_pos.y, th->t_pos.x,MAGIC);
        !           386:                         }
        !           387:                     }
        !           388:                 }
        !           389:
        !           390:                 if (showit)
        !           391:                 {
        !           392:                     msg("You sense the presence of magic on this level.");
        !           393:
        !           394:                     if (is_potion)
        !           395:                         know_items[TYP_POTION][P_TREASDET] = TRUE;
        !           396:
        !           397:                     waddstr(cw, morestr);
        !           398:                     overlay(hw, cw);
        !           399:                     wrefresh(cw);
        !           400:                     wait_for(' ');
        !           401:                     msg("");
        !           402:                     break;
        !           403:                 }
        !           404:             }
        !           405:             nothing_message(flags);
        !           406:             break;
        !           407:
        !           408:         case P_SEEINVIS:
        !           409:             if (cursed)
        !           410:             {
        !           411:                 if (off(player, ISBLIND) && !is_wearing(R_SEEINVIS))
        !           412:                 {
        !           413:                     msg("A cloak of darkness falls around you.");
        !           414:                     turn_on(player, ISBLIND);
        !           415:                     light_fuse(FUSE_SIGHT, 0, SEEDURATION, AFTER);
        !           416:                     look(FALSE);
        !           417:                 }
        !           418:                 else
        !           419:                     msg("Your eyes stop tingling for a moment.");
        !           420:             }
        !           421:             else if (off(player, PERMBLIND))
        !           422:             {
        !           423:                 if (is_potion)
        !           424:                     know_items[TYP_POTION][P_SEEINVIS] = TRUE;
        !           425:
        !           426:                 if (off(player, CANSEE))
        !           427:                 {
        !           428:                     turn_on(player, CANSEE);
        !           429:                     msg("Your eyes begin to tingle.");
        !           430:                     light_fuse(FUSE_UNSEE, 0, blessed ? SEEDURATION * 3 : SEEDURATION, AFTER);
        !           431:                     light(&hero);
        !           432:                 }
        !           433:                 else if (find_slot(FUSE_UNSEE,FUSE) != NULL)
        !           434:                 {
        !           435:                     nothing_message(ISNORMAL);
        !           436:                     lengthen_fuse(FUSE_UNSEE, blessed ? SEEDURATION * 3 : SEEDURATION);
        !           437:                 }
        !           438:                 sight(NULL);
        !           439:             }
        !           440:             break;
        !           441:
        !           442:         case P_PHASE:
        !           443:
        !           444:             if (cursed)
        !           445:             {
        !           446:                 msg("You can't move.");
        !           447:                 no_command = HOLDTIME;
        !           448:             }
        !           449:             else
        !           450:             {
        !           451:                 short   duration = (blessed ? 3 : 1);
        !           452:
        !           453:                 if (is_potion)
        !           454:                     know_items[TYP_POTION][P_PHASE] = TRUE;
        !           455:
        !           456:                 if (on(player, CANINWALL))
        !           457:                     lengthen_fuse(FUSE_UNPHASE, duration * PHASEDURATION);
        !           458:                 else
        !           459:                 {
        !           460:                     light_fuse(FUSE_UNPHASE, 0, duration * PHASEDURATION, AFTER);
        !           461:                     turn_on(player, CANINWALL);
        !           462:                 }
        !           463:                 msg("You feel %slight-headed!", blessed ? "very " : "");
        !           464:             }
        !           465:             break;
        !           466:
        !           467:         case P_RAISELEVEL:
        !           468:
        !           469:             if (cursed || (!is_potion && pstats.s_lvl > 20))
        !           470:                 lower_level(D_POTION);
        !           471:             else
        !           472:             {
        !           473:                 msg("You suddenly feel %smore skillful.", blessed ? "much " : "");
        !           474:                 know_items[TYP_POTION][P_RAISELEVEL] = TRUE;
        !           475:                 raise_level();
        !           476:
        !           477:                 if (blessed)
        !           478:                     raise_level();
        !           479:             }
        !           480:             break;
        !           481:
        !           482:         case P_HASTE:
        !           483:             if (cursed)     /* Slow player down */
        !           484:             {
        !           485:                 if (on(player, ISHASTE))
        !           486:                 {
        !           487:                     extinguish_fuse(FUSE_NOHASTE);
        !           488:                     nohaste(NULL);
        !           489:                 }
        !           490:                 else
        !           491:                 {
        !           492:                     msg("You feel yourself moving %sslower.",
        !           493:                         on(player, ISSLOW) ? "even " : "");
        !           494:
        !           495:                     if (on(player, ISSLOW))
        !           496:                         lengthen_fuse(FUSE_NOSLOW, rnd(4) + 4);
        !           497:                     else if (!is_wearing(R_FREEDOM))
        !           498:                     {
        !           499:                         turn_on(player, ISSLOW);
        !           500:                         player.t_turn = TRUE;
        !           501:                         light_fuse(FUSE_NOSLOW, 0, rnd(4) + 4, AFTER);
        !           502:                     }
        !           503:                 }
        !           504:             }
        !           505:             else
        !           506:             {
        !           507:                 if (off(player, ISSLOW))
        !           508:                     msg("You feel yourself moving %sfaster.",
        !           509:                         blessed ? "much " : "");
        !           510:
        !           511:                 add_haste(blessed);
        !           512:
        !           513:                 if (is_potion)
        !           514:                     know_items[TYP_POTION][P_HASTE] = TRUE;
        !           515:             }
        !           516:             break;
        !           517:
        !           518:         case P_RESTORE:
        !           519:         {
        !           520:             int i;
        !           521:
        !           522:             msg("You are surrounded by an orange mist.");
        !           523:
        !           524:             if (is_potion)
        !           525:                 know_items[TYP_POTION][P_RESTORE] = TRUE;
        !           526:
        !           527:             if (lost_str)
        !           528:             {
        !           529:                 for (i = 0; i < lost_str; i++)
        !           530:                     extinguish_fuse(FUSE_RES_STRENGTH);
        !           531:
        !           532:                 lost_str = 0;
        !           533:             }
        !           534:             res_strength(NULL);
        !           535:
        !           536:             if (lost_dext)
        !           537:             {
        !           538:                 for (i = 0; i < lost_dext; i++)
        !           539:                     extinguish_fuse(FUSE_UNITCH);
        !           540:
        !           541:                 lost_dext = 0;
        !           542:             }
        !           543:
        !           544:             res_dexterity();
        !           545:             res_wisdom();
        !           546:             res_intelligence();
        !           547:             curp->s_const = maxp->s_const;
        !           548:         }
        !           549:         break;
        !           550:
        !           551:         case P_INVIS:
        !           552:
        !           553:             if (cursed)
        !           554:             {
        !           555:                 msg("You feel very noticable.");
        !           556:                 quaff(&player, P_SHIELD, ISCURSED);
        !           557:             }
        !           558:             else if (off(player, ISINVIS))
        !           559:             {
        !           560:                 turn_on(player, ISINVIS);
        !           561:
        !           562:                 if (on(player, ISDISGUISE))
        !           563:                 {
        !           564:                     turn_off(player, ISDISGUISE);
        !           565:                     extinguish_fuse(FUSE_UNDISGUISE);
        !           566:                     msg("Your skin feels itchy for a moment.");
        !           567:                 }
        !           568:                 msg("You have a tingling feeling all over your body.");
        !           569:                 light_fuse(FUSE_APPEAR, 0, blessed ? WANDERTIME * 3 : WANDERTIME, AFTER);
        !           570:                 PLAYER = IPLAYER;
        !           571:                 light(&hero);
        !           572:
        !           573:                 if (is_potion)
        !           574:                     know_items[TYP_POTION][P_INVIS] = TRUE;
        !           575:             }
        !           576:             else
        !           577:                 lengthen_fuse(FUSE_APPEAR, blessed ? WANDERTIME * 3 : WANDERTIME);
        !           578:
        !           579:             break;
        !           580:
        !           581:         case P_SMELL:
        !           582:
        !           583:             if (cursed)
        !           584:             {
        !           585:                 if (on(player, CANSCENT))
        !           586:                 {
        !           587:                     turn_off(player, CANSCENT);
        !           588:                     extinguish_fuse(FUSE_UNSCENT);
        !           589:                     msg("You no longer smell monsters around you.");
        !           590:                 }
        !           591:                 else if (on(player, ISUNSMELL))
        !           592:                 {
        !           593:                     lengthen_fuse(FUSE_UNSCENT, PHASEDURATION);
        !           594:                     msg("You feel your nose tingle.");
        !           595:                 }
        !           596:                 else
        !           597:                 {
        !           598:                     turn_on(player, ISUNSMELL);
        !           599:                     light_fuse(FUSE_SCENT, 0, PHASEDURATION, AFTER);
        !           600:                     msg("You can't smell anything now.");
        !           601:                 }
        !           602:             }
        !           603:             else
        !           604:             {
        !           605:                 short   duration = (blessed ? 3 : 1);
        !           606:
        !           607:                 if (is_potion)
        !           608:                     know_items[TYP_POTION][P_SMELL] = TRUE;
        !           609:
        !           610:                 if (on(player, CANSCENT))
        !           611:                     lengthen_fuse(FUSE_UNSCENT, duration * PHASEDURATION);
        !           612:                 else
        !           613:                 {
        !           614:                     light_fuse(FUSE_UNSCENT, 0, duration * PHASEDURATION, AFTER);
        !           615:                     turn_on(player, CANSCENT);
        !           616:                 }
        !           617:                 msg("You begin to smell monsters all around you.");
        !           618:             }
        !           619:             break;
        !           620:
        !           621:         case P_HEAR:
        !           622:
        !           623:             if (cursed)
        !           624:             {
        !           625:                 if (on(player, CANHEAR))
        !           626:                 {
        !           627:                     turn_off(player, CANHEAR);
        !           628:                     extinguish_fuse(FUSE_HEAR);
        !           629:                     msg("You no longer hear monsters around you.");
        !           630:                 }
        !           631:                 else if (on(player, ISDEAF))
        !           632:                 {
        !           633:                     lengthen_fuse(FUSE_HEAR, PHASEDURATION);
        !           634:                     msg("You feel your ears burn.");
        !           635:                 }
        !           636:                 else
        !           637:                 {
        !           638:                     light_fuse(FUSE_HEAR, 0, PHASEDURATION, AFTER);
        !           639:                     turn_on(player, ISDEAF);
        !           640:                     msg("You are surrounded by a sudden silence.");
        !           641:                 }
        !           642:             }
        !           643:             else
        !           644:             {
        !           645:                 short   duration = (blessed ? 3 : 1);
        !           646:
        !           647:                 if (is_potion)
        !           648:                     know_items[TYP_POTION][P_HEAR] = TRUE;
        !           649:
        !           650:                 if (on(player, CANHEAR))
        !           651:                     lengthen_fuse(FUSE_UNHEAR, duration * PHASEDURATION);
        !           652:                 else
        !           653:                 {
        !           654:                     light_fuse(FUSE_UNHEAR, 0, duration * PHASEDURATION, AFTER);
        !           655:                     turn_on(player, CANHEAR);
        !           656:                 }
        !           657:                 msg("You begin to hear monsters all around you.");
        !           658:             }
        !           659:             break;
        !           660:
        !           661:         case P_SHERO:
        !           662:             if (cursed)
        !           663:             {
        !           664:                 if (on(player, SUPERHERO))
        !           665:                 {
        !           666:                     msg("You feel ordinary again.");
        !           667:                     turn_off(player, SUPERHERO);
        !           668:                     extinguish_fuse(FUSE_UNSHERO);
        !           669:                     extinguish_fuse(FUSE_UNBHERO);
        !           670:                 }
        !           671:                 else if (on(player, ISUNHERO))
        !           672:                 {
        !           673:                     msg("Your feeling of vulnerability increases.");
        !           674:                     lengthen_fuse(FUSE_SHERO, 5 + rnd(5));
        !           675:                 }
        !           676:                 else
        !           677:                 {
        !           678:                     msg("You feel suddenly vulnerable.");
        !           679:
        !           680:                     if (curp->s_hpt == 1)
        !           681:                     {
        !           682:                         death(D_POTION);
        !           683:                         return;
        !           684:                     }
        !           685:
        !           686:                     curp->s_hpt /= 2;
        !           687:                     chg_str(-2, FALSE, TRUE);
        !           688:                     chg_dext(-2, FALSE, TRUE);
        !           689:                     no_command = 3 + rnd(HEROTIME);
        !           690:                     turn_on(player, ISUNHERO);
        !           691:                     light_fuse(FUSE_SHERO, 0, HEROTIME + rnd(HEROTIME), AFTER);
        !           692:                 }
        !           693:             }
        !           694:             else
        !           695:             {
        !           696:                 if (on(player, ISFLEE))
        !           697:                 {
        !           698:                     turn_off(player, ISFLEE);
        !           699:                     msg("You regain your composure.");
        !           700:                 }
        !           701:
        !           702:                 if (on(player, ISUNHERO))
        !           703:                 {
        !           704:                     extinguish_fuse(FUSE_SHERO);
        !           705:                     shero(NULL);
        !           706:                 }
        !           707:                 else if (on(player, SUPERHERO))
        !           708:                 {
        !           709:                     if (find_slot(FUSE_UNBHERO,FUSE))
        !           710:                         lengthen_fuse(FUSE_UNBHERO, HEROTIME+2*rnd(HEROTIME));
        !           711:                     else if (find_slot(FUSE_UNSHERO,FUSE) && !blessed)
        !           712:                         lengthen_fuse(FUSE_UNSHERO,HEROTIME+2*rnd(HEROTIME));
        !           713:                     else
        !           714:                     {
        !           715:                         extinguish_fuse(FUSE_UNSHERO);
        !           716:                         unshero(NULL);
        !           717:                         light_fuse(FUSE_UNBHERO,0, 2 * (HEROTIME + rnd(HEROTIME)), AFTER);
        !           718:                     }
        !           719:                     msg("Your feeling of invulnerablity grows stronger.");
        !           720:                 }
        !           721:                 else
        !           722:                 {
        !           723:                     turn_on(player, SUPERHERO);
        !           724:                     chg_str(10, FALSE, FALSE);
        !           725:                     chg_dext(5, FALSE, FALSE);
        !           726:                     quaff(quaffer, P_HASTE, ISBLESSED);
        !           727:                     quaff(quaffer, P_CLEAR, ISNORMAL);
        !           728:
        !           729:                     if (blessed)
        !           730:                     {
        !           731:                         light_fuse(FUSE_UNBHERO, 0, HEROTIME + rnd(HEROTIME), AFTER);
        !           732:                         msg("You suddenly feel invincible.");
        !           733:                     }
        !           734:                     else
        !           735:                     {
        !           736:                         light_fuse(FUSE_UNSHERO, 0, HEROTIME + rnd(HEROTIME), AFTER);
        !           737:                         msg("You suddenly feel invulnerable.");
        !           738:                     }
        !           739:
        !           740:                     if (is_potion)
        !           741:                         know_items[TYP_POTION][P_SHERO] = TRUE;
        !           742:                 }
        !           743:             }
        !           744:             break;
        !           745:
        !           746:         case P_DISGUISE:
        !           747:             if (off(player, ISDISGUISE) && off(player, ISINVIS))
        !           748:             {
        !           749:                 turn_on(player, ISDISGUISE);
        !           750:                 msg("Your body shimmers a moment and then changes.");
        !           751:                 light_fuse(FUSE_UNDISGUISE, 0, blessed ? GONETIME * 3 : GONETIME, AFTER);
        !           752:
        !           753:                 if (rnd(2))
        !           754:                     PLAYER = 'a' + ucrnd(26);
        !           755:                 else
        !           756:                     PLAYER = 'A' + ucrnd(26);
        !           757:
        !           758:                 light(&hero);
        !           759:
        !           760:                 if (is_potion)
        !           761:                     know_items[TYP_POTION][P_DISGUISE] = TRUE;
        !           762:             }
        !           763:             else if (off(player, ISINVIS))
        !           764:                 lengthen_fuse(FUSE_UNDISGUISE,blessed?GONETIME * 3 : GONETIME);
        !           765:             else
        !           766:                 msg("You have an itchy feeling under your skin.");
        !           767:
        !           768:             break;
        !           769:
        !           770:         case P_FIRERESIST:
        !           771:             if (cursed)
        !           772:             {
        !           773:                 if (!is_wearing(R_FIRERESIST))
        !           774:                 {
        !           775:                     msg("Your teeth start clattering.");
        !           776:
        !           777:                     if (on(player, ISHASTE))
        !           778:                     {
        !           779:                         extinguish_fuse(FUSE_NOHASTE);
        !           780:                         nohaste(NULL);
        !           781:                     }
        !           782:                     else
        !           783:                     {
        !           784:                         msg("You feel yourself moving %sslower.",
        !           785:                             on(player, ISSLOW) ? "even "  : "");
        !           786:
        !           787:                         if (on(player, ISSLOW))
        !           788:                             lengthen_fuse(FUSE_NOSLOW, rnd(4) + 4);
        !           789:                         else if (!is_wearing(R_FREEDOM))
        !           790:                         {
        !           791:                             turn_on(player, ISSLOW);
        !           792:                             player.t_turn = TRUE;
        !           793:                             light_fuse(FUSE_NOSLOW, 0, rnd(4) + 4, AFTER);
        !           794:                         }
        !           795:                     }
        !           796:                 }
        !           797:                 else
        !           798:                     msg("You feel a brief chill.");
        !           799:             }
        !           800:             else
        !           801:             {
        !           802:                 if (is_potion)
        !           803:                     know_items[TYP_POTION][P_FIRERESIST] = TRUE;
        !           804:
        !           805:                 if (blessed)
        !           806:                 {
        !           807:                     extinguish_fuse(FUSE_UNHOT);
        !           808:                     msg("You feel a strong continuous warm glow.");
        !           809:                 }
        !           810:                 else
        !           811:                 {
        !           812:                     if (off(player, NOFIRE))
        !           813:                     {
        !           814:                         light_fuse(FUSE_UNHOT, 0, PHASEDURATION, AFTER);
        !           815:                         msg("You feel a warm glow.");
        !           816:                     }
        !           817:                     else
        !           818:                     {
        !           819:                         if (find_slot(FUSE_UNHOT,FUSE) == NULL)
        !           820:                             msg("Your warm glow continues.");
        !           821:                         else
        !           822:                         {
        !           823:                             lengthen_fuse(FUSE_UNHOT, PHASEDURATION);
        !           824:                             msg("Your feel a hot flush.");
        !           825:                         }
        !           826:                     }
        !           827:                 }
        !           828:
        !           829:                 turn_on(player, NOFIRE);
        !           830:
        !           831:                 if (on(player, NOCOLD))
        !           832:                 {
        !           833:                     turn_off(player, NOCOLD);
        !           834:                     extinguish_fuse(FUSE_UNCOLD);
        !           835:                 }
        !           836:             }
        !           837:             break;
        !           838:
        !           839:         case P_COLDRESIST:
        !           840:             if (cursed)
        !           841:             {
        !           842:                 if (!is_wearing(R_COLDRESIST))
        !           843:                 {
        !           844:                     msg("Your feel feverishly hot.");
        !           845:
        !           846:                     if (on(player, ISHASTE))
        !           847:                     {
        !           848:                         extinguish_fuse(FUSE_NOHASTE);
        !           849:                         nohaste(NULL);
        !           850:                     }
        !           851:                     else
        !           852:                     {
        !           853:                         msg("You feel yourself moving %sslower.",
        !           854:                             on(player, ISSLOW)  ? "even " : "");
        !           855:
        !           856:                         if (on(player, ISSLOW))
        !           857:                             lengthen_fuse(FUSE_NOSLOW, rnd(4) + 4);
        !           858:                         else if (!is_wearing(R_FREEDOM))
        !           859:                         {
        !           860:                             turn_on(player, ISSLOW);
        !           861:                             player.t_turn = TRUE;
        !           862:                             light_fuse(FUSE_NOSLOW, 0, rnd(4) + 4, AFTER);
        !           863:                         }
        !           864:                     }
        !           865:                 }
        !           866:                 else
        !           867:                     msg("You feel a brief touch of heat rash.");
        !           868:             }
        !           869:             else
        !           870:             {
        !           871:                 if (is_potion)
        !           872:                     know_items[TYP_POTION][P_COLDRESIST] = TRUE;
        !           873:
        !           874:                 if (blessed)
        !           875:                 {
        !           876:                     extinguish_fuse(FUSE_UNCOLD);
        !           877:                     msg("You feel a strong continuous cool breeze.");
        !           878:                 }
        !           879:                 else
        !           880:                 {
        !           881:                     if (off(player, NOCOLD))
        !           882:                     {
        !           883:                         light_fuse(FUSE_UNCOLD, 0, PHASEDURATION, AFTER);
        !           884:                         msg("You feel a cool breeze.");
        !           885:                     }
        !           886:                     else
        !           887:                     {
        !           888:                         if (find_slot(FUSE_UNCOLD,FUSE) == NULL)
        !           889:                             msg("Your cool feeling continues.");
        !           890:                         else
        !           891:                         {
        !           892:                             lengthen_fuse(FUSE_UNCOLD, PHASEDURATION);
        !           893:                             msg("The cool breeze blows more strongly.");
        !           894:                         }
        !           895:                     }
        !           896:                 }
        !           897:
        !           898:                 turn_on(player, NOCOLD);
        !           899:
        !           900:                 if (on(player, NOFIRE))
        !           901:                 {
        !           902:                     extinguish_fuse(FUSE_UNHOT);
        !           903:                     turn_off(player, NOFIRE);
        !           904:                 }
        !           905:             }
        !           906:             break;
        !           907:
        !           908:         case P_HASOXYGEN:
        !           909:             if (cursed)
        !           910:             {
        !           911:                 if (!is_wearing(R_BREATHE))
        !           912:                 {
        !           913:                     msg("You can't breathe.");
        !           914:                     no_command = HOLDTIME;
        !           915:                 }
        !           916:                 else
        !           917:                 {
        !           918:                     msg("You feel a momentary shortness of breath.");
        !           919:                 }
        !           920:             }
        !           921:             else
        !           922:             {
        !           923:                 short   duration = (blessed ? 3 : 1);
        !           924:
        !           925:                 if (is_potion)
        !           926:                     know_items[TYP_POTION][P_HASOXYGEN] = TRUE;
        !           927:
        !           928:                 if (on(player, HASOXYGEN))
        !           929:                     lengthen_fuse(FUSE_UNBREATHE, duration * PHASEDURATION);
        !           930:                 else
        !           931:                 {
        !           932:                     light_fuse(FUSE_UNBREATHE, 0, duration * PHASEDURATION, AFTER);
        !           933:                     turn_on(player, HASOXYGEN);
        !           934:                 }
        !           935:
        !           936:                 if (!is_wearing(R_BREATHE))
        !           937:                     msg("The air seems %sless polluted.",
        !           938:                         blessed ? "much " : "");
        !           939:             }
        !           940:             break;
        !           941:
        !           942:         case P_LEVITATION:
        !           943:             if (cursed)
        !           944:             {
        !           945:                 msg("You can't move.");
        !           946:                 no_command = HOLDTIME;
        !           947:             }
        !           948:             else
        !           949:             {
        !           950:                 short   duration = (blessed ? 3 : 1);
        !           951:
        !           952:                 if (is_potion)
        !           953:                     know_items[TYP_POTION][P_LEVITATION] = TRUE;
        !           954:
        !           955:                 if (on(player, CANFLY))
        !           956:                     lengthen_fuse(FUSE_UNFLY, duration * WANDERTIME);
        !           957:                 else
        !           958:                 {
        !           959:                     light_fuse(FUSE_UNFLY, 0, duration * WANDERTIME, AFTER);
        !           960:                     turn_on(player, CANFLY);
        !           961:                 }
        !           962:
        !           963:                 if (!is_wearing(R_LEVITATION))
        !           964:                     msg("You %sbegin to float in the air!",
        !           965:                         blessed ? "quickly " : "");
        !           966:             }
        !           967:             break;
        !           968:
        !           969:         case P_REGENERATE:
        !           970:             if (cursed)
        !           971:             {
        !           972:                 quaff(quaffer, P_HEALING, ISCURSED);
        !           973:                 quaff(quaffer, P_HASTE, ISCURSED);
        !           974:             }
        !           975:             else
        !           976:             {
        !           977:                 short   duration = (blessed ? 3 : 1) * HUHDURATION;
        !           978:
        !           979:                 if (is_potion)
        !           980:                     know_items[TYP_POTION][P_REGENERATE] = TRUE;
        !           981:
        !           982:                 if (on(player, SUPEREAT))
        !           983:                     lengthen_fuse(FUSE_UNSUPEREAT, duration);
        !           984:                 else
        !           985:                 {
        !           986:                     light_fuse(FUSE_UNSUPEREAT, 0, duration, AFTER);
        !           987:                     turn_on(player, SUPEREAT);
        !           988:                 }
        !           989:
        !           990:                 if (on(player, ISREGEN))
        !           991:                     lengthen_fuse(FUSE_UNREGEN, duration);
        !           992:                 else
        !           993:                 {
        !           994:                     light_fuse(FUSE_UNREGEN, 0, duration, AFTER);
        !           995:                     turn_on(player, ISREGEN);
        !           996:                 }
        !           997:
        !           998:                 if (!is_wearing(R_REGEN))
        !           999:                     msg("You feel %shealthier!", blessed ? "much " : "");
        !          1000:             }
        !          1001:
        !          1002:         case P_SHIELD:
        !          1003:         {
        !          1004:             int adjustment = 0;
        !          1005:
        !          1006:             if (on(player, HASSHIELD))      /* cancel old spell */
        !          1007:             {
        !          1008:                 extinguish_fuse(FUSE_UNSHIELD);
        !          1009:                 unshield(NULL);
        !          1010:             }
        !          1011:
        !          1012:             if (cursed)
        !          1013:                 adjustment = 2;
        !          1014:             else if (blessed)
        !          1015:             {
        !          1016:                 msg("Your skin feels very rigid.");
        !          1017:
        !          1018:                 switch (player.t_ctype)
        !          1019:                 {
        !          1020:                     case C_FIGHTER:
        !          1021:                     case C_PALADIN:
        !          1022:                     case C_RANGER:
        !          1023:                         adjustment = -3;
        !          1024:                         break;
        !          1025:                     default:
        !          1026:                         adjustment = -5;
        !          1027:                 }
        !          1028:             }
        !          1029:             else
        !          1030:             {
        !          1031:                 msg("Your skin hardens.");
        !          1032:                 adjustment = -2;
        !          1033:             }
        !          1034:
        !          1035:             pstats.s_arm += adjustment;
        !          1036:             pstats.s_acmod += adjustment;
        !          1037:             turn_on(player, HASSHIELD);
        !          1038:             light_fuse(FUSE_UNSHIELD,0,(blessed ? 3 : 1) * SEEDURATION, AFTER);
        !          1039:
        !          1040:             if (is_potion)
        !          1041:                 know_items[TYP_POTION][P_SHIELD] = TRUE;
        !          1042:         }
        !          1043:         break;
        !          1044:
        !          1045:         case P_TRUESEE:
        !          1046:             if (cursed)
        !          1047:             {
        !          1048:                 turn_on(player, PERMBLIND);
        !          1049:
        !          1050:                 if (on(player, ISBLIND))
        !          1051:                 {
        !          1052:                     msg("The gloom around you thickens.");
        !          1053:                     lengthen_fuse(FUSE_SIGHT, SEEDURATION);
        !          1054:                 }
        !          1055:                 else
        !          1056:                 {
        !          1057:                     msg("A mantle of darkness falls around you.");
        !          1058:                     turn_on(player, ISBLIND);
        !          1059:                     light_fuse(FUSE_SIGHT, 0, SEEDURATION, AFTER);
        !          1060:                     look(FALSE);
        !          1061:                 }
        !          1062:                 look(FALSE);
        !          1063:             }
        !          1064:             else if (on(player, PERMBLIND))
        !          1065:             {
        !          1066:                 if (blessed || is_potion)
        !          1067:                 {
        !          1068:                     turn_off(player, PERMBLIND);
        !          1069:                     sight(NULL);
        !          1070:                     goto let_there_be_light;
        !          1071:                 }
        !          1072:                 else
        !          1073:                     nothing_message(ISBLESSED);
        !          1074:             }
        !          1075:             else
        !          1076:     let_there_be_light:
        !          1077:                 if (off(player, CANSEE))
        !          1078:                 {
        !          1079:                     turn_on(player, CANSEE);
        !          1080:                     msg("You feel especially perceptive.");
        !          1081:                     light_fuse(FUSE_UNTRUESEE, 0, blessed ? SEEDURATION * 3
        !          1082:                         : SEEDURATION, AFTER);
        !          1083:                     light(&hero);
        !          1084:                 }
        !          1085:                 else if (find_slot(FUSE_UNSEE,FUSE) != NULL)
        !          1086:                 {
        !          1087:                     nothing_message(ISNORMAL);
        !          1088:                     lengthen_fuse(FUSE_UNTRUESEE, blessed ? SEEDURATION * 3
        !          1089:                         : SEEDURATION);
        !          1090:                 }
        !          1091:
        !          1092:             break;
        !          1093:
        !          1094:         default:
        !          1095:             msg("What an odd tasting potion!");
        !          1096:             return;
        !          1097:     }
        !          1098:
        !          1099:     status(FALSE);
        !          1100:
        !          1101:     if (is_potion)
        !          1102:     {
        !          1103:         if (!cursed && know_items[TYP_POTION][which] &&
        !          1104:             guess_items[TYP_POTION][which])
        !          1105:         {
        !          1106:             ur_free(guess_items[TYP_POTION][which]);
        !          1107:             guess_items[TYP_POTION][which] = NULL;
        !          1108:         }
        !          1109:         else if (askme && !know_items[TYP_POTION][which] &&
        !          1110:             guess_items[TYP_POTION][which] == NULL)
        !          1111:         {
        !          1112:             msg(terse ? "Call it: " :  "What do you want to call it? ");
        !          1113:
        !          1114:             if (get_string(buf, cw) == NORM)
        !          1115:             {
        !          1116:                 guess_items[TYP_POTION][which] =
        !          1117:                     new_alloc(strlen(buf) + 1);
        !          1118:                 strcpy(guess_items[TYP_POTION][which], buf);
        !          1119:             }
        !          1120:         }
        !          1121:         food_left += (blessed ? rnd(100) : (cursed ? -rnd(100) : rnd(50)));
        !          1122:     }
        !          1123: }
        !          1124:
        !          1125: /*
        !          1126:     lower_level()
        !          1127:         Lower a level of experience
        !          1128: */
        !          1129:
        !          1130: void
        !          1131: lower_level(int who)
        !          1132: {
        !          1133:     int fewer, nsides = 0, i;
        !          1134:
        !          1135:     if (--pstats.s_lvl == 0)
        !          1136:     {
        !          1137:         death(who); /* All levels gone */
        !          1138:         return;
        !          1139:     }
        !          1140:
        !          1141:     msg("You suddenly feel less skillful.");
        !          1142:     pstats.s_exp = 1L;
        !          1143:     init_exp();
        !          1144:
        !          1145:     for (i = 2; i <= pstats.s_lvl; i++)
        !          1146:     {
        !          1147:         if (max_stats.s_exp < 0x3fffffffL)  /* 2^30 - 1 */
        !          1148:             max_stats.s_exp *= 2L;  /* twice as many for next */
        !          1149:     }
        !          1150:
        !          1151:     switch (player.t_ctype)
        !          1152:     {
        !          1153:         case C_FIGHTER: nsides = 12;break;
        !          1154:         case C_PALADIN: nsides = 12;break;
        !          1155:         case C_RANGER: nsides = 12; break;
        !          1156:         case C_MAGICIAN: nsides = 4;break;
        !          1157:         case C_ILLUSION: nsides = 4;break;
        !          1158:         case C_CLERIC: nsides = 8;  break;
        !          1159:         case C_DRUID: nsides = 8;   break;
        !          1160:         case C_THIEF: nsides = 6;   break;
        !          1161:         case C_ASSASIN: nsides = 6; break;
        !          1162:         case C_NINJA: nsides = 6;   break;
        !          1163:     }
        !          1164:
        !          1165:     fewer = max(1, roll(1, 16 - nsides) + int_wis_bonus());
        !          1166:     pstats.s_power -= fewer;
        !          1167:     max_stats.s_power -= fewer;
        !          1168:
        !          1169:     fewer = max(1, roll(1, nsides) + const_bonus());
        !          1170:     pstats.s_hpt -= fewer;
        !          1171:     max_stats.s_hpt -= fewer;
        !          1172:
        !          1173:     if (pstats.s_hpt < 1)
        !          1174:         pstats.s_hpt = 1;
        !          1175:
        !          1176:     if (max_stats.s_hpt < 1)
        !          1177:     {
        !          1178:         death(who);
        !          1179:         return;
        !          1180:     }
        !          1181: }
        !          1182:
        !          1183: void
        !          1184: res_dexterity(void)
        !          1185: {
        !          1186:     if (lost_dext)
        !          1187:     {
        !          1188:         chg_dext(lost_dext, FALSE, FALSE);
        !          1189:         lost_dext = 0;
        !          1190:     }
        !          1191:     else
        !          1192:     {
        !          1193:         pstats.s_dext = max_stats.s_dext + ring_value(R_ADDHIT) +
        !          1194:             (on(player, POWERDEXT) ? 10 : 0) +
        !          1195:             (on(player, SUPERHERO) ? 5 : 0);
        !          1196:     }
        !          1197:
        !          1198: }
        !          1199:
        !          1200:
        !          1201: /*
        !          1202:     res_wisdom()
        !          1203:         Restore player's wisdom
        !          1204: */
        !          1205:
        !          1206: void
        !          1207: res_wisdom(void)
        !          1208: {
        !          1209:     int ring_str;
        !          1210:
        !          1211:     /* Discount the ring value */
        !          1212:
        !          1213:     ring_str = ring_value(R_ADDWISDOM) + (on(player, POWERWISDOM) ? 10 : 0);
        !          1214:     pstats.s_wisdom -= ring_str;
        !          1215:
        !          1216:     if (pstats.s_wisdom < max_stats.s_wisdom)
        !          1217:         pstats.s_wisdom = max_stats.s_wisdom;
        !          1218:
        !          1219:     /* Redo the rings */
        !          1220:
        !          1221:     pstats.s_wisdom += ring_str;
        !          1222: }
        !          1223:
        !          1224: /*
        !          1225:     res_intelligence()
        !          1226:         Restore player's intelligence
        !          1227: */
        !          1228:
        !          1229: void
        !          1230: res_intelligence(void)
        !          1231: {
        !          1232:     int ring_str;
        !          1233:
        !          1234:     /* Discount the ring value */
        !          1235:
        !          1236:     ring_str = ring_value(R_ADDINTEL) + (on(player, POWERINTEL) ? 10 : 0);
        !          1237:     pstats.s_intel -= ring_str;
        !          1238:
        !          1239:     if (pstats.s_intel < max_stats.s_intel)
        !          1240:         pstats.s_intel = max_stats.s_intel;
        !          1241:
        !          1242:     /* Redo the rings */
        !          1243:
        !          1244:     pstats.s_intel += ring_str;
        !          1245: }
        !          1246:
        !          1247:
        !          1248: /*
        !          1249:     add_strength()
        !          1250:         Increase player's strength
        !          1251: */
        !          1252:
        !          1253: void
        !          1254: add_strength(int cursed)
        !          1255: {
        !          1256:
        !          1257:     if (cursed)
        !          1258:     {
        !          1259:         msg("You feel slightly weaker now.");
        !          1260:         chg_str(-1, FALSE, FALSE);
        !          1261:     }
        !          1262:     else
        !          1263:     {
        !          1264:         msg("You feel stronger now.  What bulging muscles!");
        !          1265:
        !          1266:         if (lost_str != 0)
        !          1267:         {
        !          1268:             lost_str--;
        !          1269:             chg_str(1, FALSE, FALSE);
        !          1270:         }
        !          1271:         else
        !          1272:             chg_str(1, TRUE, FALSE);
        !          1273:     }
        !          1274: }
        !          1275:
        !          1276:
        !          1277: /*
        !          1278:     add_intelligence()
        !          1279:         Increase player's intelligence
        !          1280: */
        !          1281:
        !          1282: void
        !          1283: add_intelligence(int cursed)
        !          1284: {
        !          1285:     int ring_str;   /* Value of ring strengths */
        !          1286:
        !          1287:     /* Undo any ring changes */
        !          1288:
        !          1289:     ring_str = ring_value(R_ADDINTEL) + (on(player, POWERINTEL) ? 10 : 0);
        !          1290:     pstats.s_intel -= ring_str;
        !          1291:
        !          1292:     /* Now do the potion */
        !          1293:
        !          1294:     if (cursed)
        !          1295:     {
        !          1296:         msg("You feel slightly less intelligent now.");
        !          1297:         pstats.s_intel = max(pstats.s_intel - 1, 3);
        !          1298:     }
        !          1299:     else
        !          1300:     {
        !          1301:         msg("You feel more intelligent now.  What a mind!");
        !          1302:         pstats.s_intel = min(pstats.s_intel + 1, 25);
        !          1303:     }
        !          1304:
        !          1305:     /* Adjust the maximum */
        !          1306:
        !          1307:     if (max_stats.s_intel < pstats.s_intel)
        !          1308:         max_stats.s_intel = pstats.s_intel;
        !          1309:
        !          1310:     /* Now put back the ring changes */
        !          1311:     pstats.s_intel += ring_str;
        !          1312: }
        !          1313:
        !          1314:
        !          1315: /*
        !          1316:     add_wisdom()
        !          1317:         Increase player's wisdom
        !          1318: */
        !          1319:
        !          1320: void
        !          1321: add_wisdom(int cursed)
        !          1322: {
        !          1323:     int ring_str;   /* Value of ring strengths */
        !          1324:
        !          1325:     /* Undo any ring changes */
        !          1326:
        !          1327:     ring_str = ring_value(R_ADDWISDOM) + (on(player, POWERWISDOM) ? 10 : 0);
        !          1328:     pstats.s_wisdom -= ring_str;
        !          1329:
        !          1330:     /* Now do the potion */
        !          1331:
        !          1332:     if (cursed)
        !          1333:     {
        !          1334:         msg("You feel slightly less wise now.");
        !          1335:         pstats.s_wisdom = max(pstats.s_wisdom - 1, 3);
        !          1336:     }
        !          1337:     else
        !          1338:     {
        !          1339:         msg("You feel wiser now.  What a sage!");
        !          1340:         pstats.s_wisdom = min(pstats.s_wisdom + 1, 25);
        !          1341:     }
        !          1342:
        !          1343:     /* Adjust the maximum */
        !          1344:
        !          1345:     if (max_stats.s_wisdom < pstats.s_wisdom)
        !          1346:         max_stats.s_wisdom = pstats.s_wisdom;
        !          1347:
        !          1348:     /* Now put back the ring changes */
        !          1349:     pstats.s_wisdom += ring_str;
        !          1350: }
        !          1351:
        !          1352:
        !          1353: /*
        !          1354:     add_dexterity()
        !          1355:         Increase player's dexterity
        !          1356: */
        !          1357:
        !          1358: void
        !          1359: add_dexterity(int cursed)
        !          1360: {
        !          1361:     /* Now do the potion */
        !          1362:
        !          1363:     if (cursed)
        !          1364:     {
        !          1365:         msg("You feel less dextrous now.");
        !          1366:         chg_dext(-1, FALSE, TRUE);
        !          1367:     }
        !          1368:     else
        !          1369:     {
        !          1370:         msg("You feel more dextrous now.  Watch those hands!");
        !          1371:
        !          1372:         if (lost_dext != 0)
        !          1373:         {
        !          1374:             lost_dext--;
        !          1375:             chg_dext(1, FALSE, FALSE);
        !          1376:         }
        !          1377:         else
        !          1378:             chg_dext(1, TRUE, FALSE);
        !          1379:     }
        !          1380: }
        !          1381:
        !          1382:
        !          1383: /*
        !          1384:     Increase player's constitution
        !          1385: */
        !          1386:
        !          1387: void
        !          1388: add_const(int cursed)
        !          1389: {
        !          1390:     /* Do the potion */
        !          1391:
        !          1392:     if (cursed)
        !          1393:     {
        !          1394:         msg("You feel slightly less healthy now.");
        !          1395:         pstats.s_const = max(pstats.s_const - 1, 3) +
        !          1396:             (on(player, POWERCONST) ? 10 : 0);
        !          1397:     }
        !          1398:     else
        !          1399:     {
        !          1400:         msg("You feel healthier now.");
        !          1401:         pstats.s_const = min(pstats.s_const + 1, 25) +
        !          1402:             (on(player, POWERCONST) ? 10 : 0);
        !          1403:     }
        !          1404:
        !          1405:     /* Adjust the maximum */
        !          1406:
        !          1407:     if (max_stats.s_const < pstats.s_const - (on(player, POWERCONST) ? 10 : 0))
        !          1408:         max_stats.s_const = pstats.s_const;
        !          1409: }
        !          1410:
        !          1411: /*
        !          1412:     monquaff()
        !          1413:         monster gets the effect
        !          1414: */
        !          1415:
        !          1416: void
        !          1417: monquaff(struct thing *quaffer, int which, int flags)
        !          1418: {
        !          1419:     struct stats *curp = &(quaffer->t_stats);
        !          1420:     struct stats *maxp = &(quaffer->maxstats);
        !          1421:     int blessed = flags & ISBLESSED;
        !          1422:     int cursed = flags & ISCURSED;
        !          1423:
        !          1424:     switch(which)
        !          1425:     {
        !          1426:         case P_SEEINVIS:
        !          1427:             if (cursed)
        !          1428:                 turn_on(*quaffer, ISHUH);
        !          1429:             else
        !          1430:                 turn_on(*quaffer, CANSEE);
        !          1431:             break;
        !          1432:
        !          1433:         case P_GAINABIL:
        !          1434:             if (cursed)
        !          1435:                 curp->s_intel /= 2;
        !          1436:             else
        !          1437:                 curp->s_power = maxp->s_power;
        !          1438:             break;
        !          1439:
        !          1440:         case P_CLEAR:
        !          1441:             if (cursed)
        !          1442:                 turn_on(*quaffer, ISHUH);
        !          1443:             else
        !          1444:                 turn_on(*quaffer, ISHUH);
        !          1445:             break;
        !          1446:
        !          1447:         case P_HEALING:
        !          1448:             if (cursed)
        !          1449:             {
        !          1450:                 curp->s_hpt /= 2;
        !          1451:                 curp->s_power /= 2;
        !          1452:             }
        !          1453:             else
        !          1454:             {
        !          1455:                 int nsides = (blessed ? 8 : 4);
        !          1456:                 int hpt_gain = roll(curp->s_lvl, nsides);
        !          1457:                 int power_gain = roll(curp->s_lvl, nsides);
        !          1458:
        !          1459:                 curp->s_hpt = min(curp->s_hpt + hpt_gain, maxp->s_hpt);
        !          1460:                 curp->s_power = min(curp->s_power + power_gain, maxp->s_power);
        !          1461:             }
        !          1462:             break;
        !          1463:
        !          1464:         case  P_HASTE:
        !          1465:             if (cursed)
        !          1466:             {
        !          1467:                 if (on(*quaffer, ISHASTE))
        !          1468:                     turn_off(*quaffer, ISHASTE);
        !          1469:                 else
        !          1470:                     turn_on(*quaffer, ISSLOW);
        !          1471:             }
        !          1472:             else
        !          1473:                 turn_on(*quaffer, ISHASTE);
        !          1474:             break;
        !          1475:
        !          1476:         case P_INVIS:
        !          1477:             turn_on(*quaffer, ISINVIS);
        !          1478:
        !          1479:             if (cansee(quaffer->t_pos.y, quaffer->t_pos.x))
        !          1480:                 seemsg("The monster dissappears!");
        !          1481:
        !          1482:             break;
        !          1483:
        !          1484:         case P_REGENERATE:
        !          1485:             if (cursed)
        !          1486:             {
        !          1487:                 quaff(quaffer, P_HEALING, ISCURSED);
        !          1488:                 quaff(quaffer, P_HASTE, ISCURSED);
        !          1489:             }
        !          1490:             else
        !          1491:                 turn_on(*quaffer, ISREGEN);
        !          1492:             break;
        !          1493:
        !          1494:         case P_SHERO:
        !          1495:             if (on(*quaffer, ISFLEE))
        !          1496:                 turn_off(*quaffer, ISFLEE);
        !          1497:             else
        !          1498:             {
        !          1499:                 turn_on(*quaffer, SUPERHERO);
        !          1500:                 quaff(quaffer, P_HASTE, ISBLESSED);
        !          1501:                 quaff(quaffer, P_CLEAR, ISNORMAL);
        !          1502:             }
        !          1503:             break;
        !          1504:
        !          1505:         case P_PHASE:
        !          1506:             if (cursed)
        !          1507:                 quaffer->t_no_move += HOLDTIME;
        !          1508:             else
        !          1509:                 turn_on(*quaffer, CANINWALL);
        !          1510:             break;
        !          1511:
        !          1512:         default:
        !          1513:             debug("'%s' is a strange potion for a monster to quaff!",
        !          1514:                 p_magic[which].mi_name);
        !          1515:     }
        !          1516: }

CVSweb