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

Annotation of early-roguelike/arogue7/potions.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * potions.c  -  Function(s) for dealing with potions
                      3:  *
                      4:  * Advanced Rogue
                      5:  * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T
                      6:  * All rights reserved.
                      7:  *
                      8:  * Based on "Rogue: Exploring the Dungeons of Doom"
                      9:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     10:  * All rights reserved.
                     11:  *
                     12:  * See the file LICENSE.TXT for full copyright and licensing information.
                     13:  */
                     14:
                     15: /*
                     16:  * Function(s) for dealing with potions
                     17:  */
                     18:
                     19: #include <stdlib.h>
                     20: #include "curses.h"
                     21: #include "rogue.h"
                     22:
                     23:
                     24: /*
                     25:  * add_abil is an array of functions used to change attributes.  It must be
                     26:  * ordered according to the attribute definitions in rogue.h.
                     27:  */
                     28:
                     29: void (*add_abil[NUMABILITIES])() = {
                     30:     add_intelligence, add_strength, add_wisdom, add_dexterity,
                     31:     add_constitution, add_charisma
                     32: };
                     33:
                     34: /*
                     35:  * res_abil is an array of functions used to change attributes.  It must be
                     36:  * ordered according to the attribute definitions in rogue.h.
                     37:  */
                     38:
                     39: void (*res_abil[NUMABILITIES])() = {
                     40:     res_intelligence, res_strength, res_wisdom, res_dexterity,
                     41:     res_constitution, res_charisma
                     42: };
                     43: 
                     44: /*
                     45:  * Increase player's constitution
                     46:  */
                     47:
                     48: void
                     49: add_constitution(int change)
                     50: {
                     51:     /* Do the potion */
                     52:     if (change < 0) {
                     53:        msg("You feel less healthy now.");
                     54:        pstats.s_const += change;
                     55:        if (pstats.s_const <= 0)
                     56:            death(D_CONSTITUTION);
                     57:     }
                     58:     else {
                     59:        msg("You feel healthier now.");
                     60:        pstats.s_const = min(pstats.s_const + change, 25);
                     61:     }
                     62:
                     63:     /* Adjust the maximum */
                     64:     if (max_stats.s_const < pstats.s_const)
                     65:        max_stats.s_const = pstats.s_const;
                     66: }
                     67: 
                     68: /*
                     69:  * Increase player's charisma
                     70:  */
                     71:
                     72: void
                     73: add_charisma(int change)
                     74: {
                     75:     /* Do the potion */
                     76:     if (change < 0) msg("You feel less attractive now.");
                     77:     else msg("You feel more attractive now.");
                     78:
                     79:     pstats.s_charisma += change;
                     80:     if (pstats.s_charisma > 25) pstats.s_charisma = 25;
                     81:     else if (pstats.s_charisma < 3) pstats.s_charisma = 3;
                     82:
                     83:     /* Adjust the maximum */
                     84:     if (max_stats.s_charisma < pstats.s_charisma)
                     85:        max_stats.s_charisma = pstats.s_charisma;
                     86: }
                     87: 
                     88: /*
                     89:  * Increase player's dexterity
                     90:  */
                     91:
                     92: void
                     93: add_dexterity(int change)
                     94: {
                     95:     int ring_str;      /* Value of ring strengths */
                     96:
                     97:     /* Undo any ring changes */
                     98:     ring_str = ring_value(R_ADDHIT);
                     99:     pstats.s_dext -= ring_str;
                    100:
                    101:     /* Now do the potion */
                    102:     if (change < 0) msg("You feel less dextrous now.");
                    103:     else msg("You feel more dextrous now.  Watch those hands!");
                    104:
                    105:     pstats.s_dext += change;
                    106:     if (pstats.s_dext > 25) pstats.s_dext = 25;
                    107:     else if (pstats.s_dext < 3) pstats.s_dext = 3;
                    108:
                    109:     /* Adjust the maximum */
                    110:     if (max_stats.s_dext < pstats.s_dext)
                    111:        max_stats.s_dext = pstats.s_dext;
                    112:
                    113:     /* Now put back the ring changes */
                    114:     if (ring_str)
                    115:        pstats.s_dext += ring_str;
                    116: }
                    117: 
                    118: /*
                    119:  * add_haste:
                    120:  *     add a haste to the player
                    121:  */
                    122:
                    123: void
                    124: add_haste(bool blessed)
                    125: {
                    126:     int hasttime;
                    127:
                    128:     if (player.t_ctype == C_MONK) { /* monks cannot be slowed or hasted */
                    129:        msg(nothing);
                    130:        return;
                    131:     }
                    132:
                    133:     if (blessed) hasttime = HASTETIME*2;
                    134:     else hasttime = HASTETIME;
                    135:
                    136:     if (on(player, ISSLOW)) { /* Is person slow? */
                    137:        extinguish(noslow);
                    138:        noslow();
                    139:
                    140:        if (blessed) hasttime = HASTETIME/2;
                    141:        else return;
                    142:     }
                    143:
                    144:     if (on(player, ISHASTE)) {
                    145:        msg("You faint from exhaustion.");
                    146:        player.t_no_move += movement(&player) * rnd(hasttime);
                    147:        player.t_action = A_FREEZE;
                    148:        lengthen(nohaste, roll(hasttime,hasttime));
                    149:     }
                    150:     else {
                    151:        msg("You feel yourself moving %sfaster.", blessed ? "much " : "");
                    152:        turn_on(player, ISHASTE);
                    153:        fuse(nohaste, NULL, roll(hasttime, hasttime), AFTER);
                    154:     }
                    155: }
                    156: 
                    157: /*
                    158:  * Increase player's intelligence
                    159:  */
                    160: void
                    161: add_intelligence(int change)
                    162: {
                    163:     int ring_str;      /* Value of ring strengths */
                    164:
                    165:     /* Undo any ring changes */
                    166:     ring_str = ring_value(R_ADDINTEL);
                    167:     pstats.s_intel -= ring_str;
                    168:
                    169:     /* Now do the potion */
                    170:     if (change < 0) msg("You feel slightly less intelligent now.");
                    171:     else msg("You feel more intelligent now.  What a mind!");
                    172:
                    173:     pstats.s_intel += change;
                    174:     if (pstats.s_intel > 25) pstats.s_intel = 25;
                    175:     else if (pstats.s_intel < 3) pstats.s_intel = 3;
                    176:
                    177:     /* Adjust the maximum */
                    178:     if (max_stats.s_intel < pstats.s_intel)
                    179:            max_stats.s_intel = pstats.s_intel;
                    180:
                    181:     /* Now put back the ring changes */
                    182:     if (ring_str)
                    183:        pstats.s_intel += ring_str;
                    184: }
                    185: 
                    186: /*
                    187:  * this routine makes the hero move slower
                    188:  */
                    189: void
                    190: add_slow(void)
                    191: {
                    192:     /* monks cannot be slowed or hasted */
                    193:     if (player.t_ctype == C_MONK || ISWEARING(R_FREEDOM)) {
                    194:        msg(nothing);
                    195:        return;
                    196:     }
                    197:
                    198:     if (on(player, ISHASTE)) { /* Already sped up */
                    199:        extinguish(nohaste);
                    200:        nohaste();
                    201:     }
                    202:     else {
                    203:        msg("You feel yourself moving %sslower.",
                    204:                on(player, ISSLOW) ? "even " : "");
                    205:        if (on(player, ISSLOW))
                    206:            lengthen(noslow, roll(HASTETIME,HASTETIME));
                    207:        else {
                    208:            turn_on(player, ISSLOW);
                    209:            fuse(noslow, NULL, roll(HASTETIME,HASTETIME), AFTER);
                    210:        }
                    211:     }
                    212: }
                    213: 
                    214: /*
                    215:  * Increase player's strength
                    216:  */
                    217:
                    218: void
                    219: add_strength(int change)
                    220: {
                    221:
                    222:     if (change < 0) {
                    223:        msg("You feel slightly weaker now.");
                    224:        chg_str(change);
                    225:     }
                    226:     else {
                    227:        msg("You feel stronger now.  What bulging muscles!");
                    228:        chg_str(change);
                    229:     }
                    230: }
                    231: 
                    232: /*
                    233:  * Increase player's wisdom
                    234:  */
                    235:
                    236: void
                    237: add_wisdom(int change)
                    238: {
                    239:     int ring_str;      /* Value of ring strengths */
                    240:
                    241:     /* Undo any ring changes */
                    242:     ring_str = ring_value(R_ADDWISDOM);
                    243:     pstats.s_wisdom -= ring_str;
                    244:
                    245:     /* Now do the potion */
                    246:     if (change < 0) msg("You feel slightly less wise now.");
                    247:     else msg("You feel wiser now.  What a sage!");
                    248:
                    249:     pstats.s_wisdom += change;
                    250:     if (pstats.s_wisdom > 25) pstats.s_wisdom = 25;
                    251:     else if (pstats.s_wisdom < 3) pstats.s_wisdom = 3;
                    252:
                    253:     /* Adjust the maximum */
                    254:     if (max_stats.s_wisdom < pstats.s_wisdom)
                    255:        max_stats.s_wisdom = pstats.s_wisdom;
                    256:
                    257:     /* Now put back the ring changes */
                    258:     if (ring_str)
                    259:        pstats.s_wisdom += ring_str;
                    260: }
                    261: 
                    262: void
                    263: quaff(int which, int kind, int flags, bool is_potion)
                    264: {
                    265:     register struct object *obj;
                    266:     register struct linked_list *item, *titem;
                    267:     register struct thing *th;
                    268:     bool cursed, blessed;
                    269:
                    270:     blessed = FALSE;
                    271:     cursed = FALSE;
                    272:     item = NULL;
                    273:
                    274:     if (which < 0) {   /* figure out which ourselves */
                    275:        /* This is a potion.  */
                    276:        if (player.t_action != C_QUAFF) {
                    277:            int units;
                    278:
                    279:            item = get_item(pack, "quaff", QUAFFABLE, FALSE, FALSE);
                    280:
                    281:            /*
                    282:             * Make certain that it is somethings that we want to drink
                    283:             */
                    284:            if (item == NULL)
                    285:                return;
                    286:
                    287:            /* How long does it take to quaff? */
                    288:            units = usage_time(item);
                    289:            if (units < 0) return;
                    290:
                    291:            player.t_using = item;      /* Remember what it is */
                    292:            player.t_no_move = units * movement(&player);
                    293:            if ((OBJPTR(item))->o_type == POTION) player.t_action = C_QUAFF;
                    294:            else player.t_action = C_USE;
                    295:            return;
                    296:        }
                    297:
                    298:        /* We have waited our time, let's quaff the potion */
                    299:        item = player.t_using;
                    300:        player.t_using = NULL;
                    301:        player.t_action = A_NIL;
                    302:
                    303:        obj = OBJPTR(item);
                    304:        /* remove it from the pack */
                    305:        inpack--;
                    306:        detach(pack, item);
                    307:
                    308:        flags = obj->o_flags;
                    309:        which = obj->o_which;
                    310:        kind = obj->o_kind;
                    311:     }
                    312:     cursed = flags & ISCURSED;
                    313:     blessed = flags & ISBLESSED;
                    314:
                    315:     switch(which) {
                    316:        case P_CLEAR:
                    317:            if (cursed) {
                    318:                confus_player();
                    319:            }
                    320:            else {
                    321:                if (blessed) {  /* Make player immune for the whole game */
                    322:                    extinguish(unclrhead);  /* If we have a fuse, put it out */
                    323:                    msg("A strong blue aura surrounds your head.");
                    324:                }
                    325:                else {  /* Just light a fuse for how long player is safe */
                    326:                    if (off(player, ISCLEAR)) {
                    327:                        fuse(unclrhead, NULL, CLRDURATION, AFTER);
                    328:                        msg("A faint blue aura surrounds your head.");
                    329:                    }
                    330:                    else {  /* If we have a fuse lengthen it, else we
                    331:                             * are permanently clear.
                    332:                             */
                    333:                        if (find_slot(unclrhead) == 0)
                    334:                            msg("Your blue aura continues to glow strongly.");
                    335:                        else {
                    336:                            lengthen(unclrhead, CLRDURATION);
                    337:                            msg("Your blue aura brightens for a moment.");
                    338:                        }
                    339:                    }
                    340:                }
                    341:                turn_on(player, ISCLEAR);
                    342:                /* If player is confused, unconfuse him */
                    343:                if (on(player, ISHUH)) {
                    344:                    extinguish(unconfuse);
                    345:                    unconfuse();
                    346:                }
                    347:            }
                    348:        when P_HEALING:
                    349:            if (cursed) {
                    350:                msg("You feel worse now.");
                    351:                pstats.s_hpt -= roll(pstats.s_lvl, char_class[player.t_ctype].hit_pts);
                    352:                if (pstats.s_hpt <= 0)
                    353:                    death(D_POISON);
                    354:            }
                    355:            else {
                    356:                if (blessed) {
                    357:                    pstats.s_hpt += roll(pstats.s_lvl+1, char_class[player.t_ctype].hit_pts);
                    358:                    if (pstats.s_hpt > max_stats.s_hpt)
                    359:                        pstats.s_hpt = ++max_stats.s_hpt;
                    360:                    if (on(player, ISHUH)) {
                    361:                        extinguish(unconfuse);
                    362:                        unconfuse();
                    363:                    }
                    364:                }
                    365:                else {
                    366:                    pstats.s_hpt += roll(pstats.s_lvl+1, char_class[player.t_ctype].hit_pts/2);
                    367:                    if (pstats.s_hpt > max_stats.s_hpt)
                    368:                        pstats.s_hpt = ++max_stats.s_hpt;
                    369:                }
                    370:                msg("You begin to feel %sbetter.",
                    371:                        blessed ? "much " : "");
                    372:                sight();
                    373:                if (is_potion) p_know[P_HEALING] = TRUE;
                    374:            }
                    375:        when P_ABIL:
                    376:            /* If it is cursed, we take a point away */
                    377:            if (cursed) {
                    378:                if (ISWEARING(R_SUSABILITY)) {
                    379:                    msg(nothing);
                    380:                    break;
                    381:                }
                    382:                else add_abil[kind](-1);
                    383:            }
                    384:
                    385:            /* Otherwise we add points */
                    386:            else add_abil[kind](blessed ? 3 : 1);
                    387:
                    388:            if (is_potion) p_know[P_ABIL] = TRUE;
                    389:        when P_MFIND:
                    390:            /*
                    391:             * Potion of monster detection, if there are monters, detect them
                    392:             */
                    393:            if (mlist != NULL)
                    394:            {
                    395:                register struct thing *tp;
                    396:                register struct linked_list *item;
                    397:
                    398:                msg("You begin to sense the presence of monsters.");
                    399:                wclear(hw);
                    400:                for (item=mlist; item!=NULL; item=next(item)) {
                    401:                    tp = THINGPTR(item);
                    402:                    if (on(*tp, NODETECT))
                    403:                        continue;
                    404:                    if (off(*tp, ISRUN))/* turn off only on sleeping ones */
                    405:                        turn_off(*tp, CANSURPRISE);
                    406:                    mvwaddch(hw, tp->t_pos.y, tp->t_pos.x,
                    407:                             monsters[tp->t_index].m_appear);
                    408:                }
                    409:                waddstr(msgw, morestr);
                    410:                clearok(msgw, FALSE);
                    411:                draw(msgw);
                    412:                wait_for(' ');
                    413:                msg("");
                    414:                overlay(hw, cw);
                    415:                draw(cw);
                    416:                if (is_potion) p_know[P_MFIND] = TRUE;
                    417:            }
                    418:            else
                    419:                msg("You have a strange feeling for a moment, then it passes.");
                    420:        when P_TFIND:
                    421:            /*
                    422:             * Potion of magic detection.  Show the potions and scrolls
                    423:             */
                    424:            {
                    425:                register struct linked_list *mobj;
                    426:                register struct object *tp;
                    427:                bool show;
                    428:
                    429:                show = FALSE;
                    430:                wclear(hw);
                    431:                for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) {
                    432:                    tp = OBJPTR(mobj);
                    433:                    if (is_magic(tp)) {
                    434:                        char mag_type=MAGIC;
                    435:
                    436:                        /* Mark cursed items or bad weapons */
                    437:                        if ((tp->o_flags & ISCURSED) ||
                    438:                            (tp->o_type == WEAPON &&
                    439:                             (tp->o_hplus < 0 || tp->o_dplus < 0)))
                    440:                                mag_type = CMAGIC;
                    441:                        else if ((tp->o_flags & ISBLESSED) ||
                    442:                                 (tp->o_type == WEAPON &&
                    443:                                  (tp->o_hplus > 0 || tp->o_dplus > 0)))
                    444:                                        mag_type = BMAGIC;
                    445:                        show = TRUE;
                    446:                        mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, mag_type);
                    447:                    }
                    448:                }
                    449:                for (titem = mlist; titem != NULL; titem = next(titem)) {
                    450:                    register struct linked_list *pitem;
                    451:
                    452:                    th = THINGPTR(titem);
                    453:                    if (on(*th, NODETECT)) continue;
                    454:                    for(pitem = th->t_pack; pitem != NULL; pitem = next(pitem)){
                    455:                        tp = OBJPTR(pitem);
                    456:                        if (is_magic(tp)) {
                    457:                            char mag_type=MAGIC;
                    458:
                    459:                            /* Mark cursed items or bad weapons */
                    460:                            if ((tp->o_flags & ISCURSED) ||
                    461:                                (tp->o_type == WEAPON &&
                    462:                                 (tp->o_hplus < 0 || tp->o_dplus < 0)))
                    463:                                    mag_type = CMAGIC;
                    464:                            else if ((tp->o_flags & ISBLESSED) ||
                    465:                                     (tp->o_type == WEAPON &&
                    466:                                      (tp->o_hplus > 0 || tp->o_dplus > 0)))
                    467:                                            mag_type = BMAGIC;
                    468:                            show = TRUE;
                    469:                            mvwaddch(hw, th->t_pos.y, th->t_pos.x, mag_type);
                    470:                        }
                    471:                    }
                    472:                }
                    473:                if (show) {
                    474:                    if (is_potion) p_know[P_TFIND] = TRUE;
                    475:                    msg("You sense the presence of magic on this level.");
                    476:                    waddstr(msgw, morestr);
                    477:                    clearok(msgw, FALSE);
                    478:                    draw(msgw);
                    479:                    wait_for(' ');
                    480:                    msg("");
                    481:                    overlay(hw,cw);
                    482:                    draw(cw);
                    483:                    break;
                    484:                }
                    485:                else
                    486:                    msg("You have a strange feeling for a moment, then it passes.");
                    487:            }
                    488:        when P_SEEINVIS:
                    489:            if (cursed) {
                    490:                if (!find_slot(sight))
                    491:                {
                    492:                    msg("A cloak of darkness falls around you.");
                    493:                    turn_on(player, ISBLIND);
                    494:                    fuse(sight, NULL, SEEDURATION, AFTER);
                    495:                    light(&hero);
                    496:                }
                    497:                else
                    498:                    lengthen(sight, SEEDURATION);
                    499:            }
                    500:            else {
                    501:                if (off(player, CANSEE)) {
                    502:                    turn_on(player, CANSEE);
                    503:                    msg("Your eyes begin to tingle.");
                    504:                    fuse(unsee, NULL, blessed ? SEEDURATION*3 :SEEDURATION, AFTER);
                    505:                    light(&hero);
                    506:                }
                    507:                else if (find_slot(unsee) != 0)
                    508:                    lengthen(unsee, blessed ? SEEDURATION*3 : SEEDURATION);
                    509:                sight();
                    510:            }
                    511:        when P_PHASE:
                    512:            if (cursed) {
                    513:                msg("You can't move.");
                    514:                player.t_no_move = movement(&player) * FREEZETIME;
                    515:                player.t_action = A_FREEZE;
                    516:            }
                    517:            else {
                    518:                int duration;
                    519:
                    520:                if (blessed) duration = 3;
                    521:                else duration = 1;
                    522:
                    523:                if (on(player, CANINWALL))
                    524:                    lengthen(unphase, duration*PHASEDURATION);
                    525:                else {
                    526:                    fuse(unphase, NULL, duration*PHASEDURATION, AFTER);
                    527:                    turn_on(player, CANINWALL);
                    528:                }
                    529:                msg("You feel %slight-headed!",
                    530:                    blessed ? "very " : "");
                    531:            }
                    532:        when P_FLY: {
                    533:            int duration;
                    534:            bool say_message;
                    535:
                    536:            say_message = TRUE;
                    537:
                    538:            if (blessed) duration = 3;
                    539:            else duration = 1;
                    540:
                    541:            if (on(player, ISFLY)) {
                    542:                if (find_slot(land))
                    543:                    lengthen(land, duration*FLYTIME);
                    544:                else {
                    545:                    msg("Nothing happens.");    /* Flying by cloak */
                    546:                    say_message = FALSE;
                    547:                }
                    548:            }
                    549:            else {
                    550:                fuse(land, NULL, duration*FLYTIME, AFTER);
                    551:                turn_on(player, ISFLY);
                    552:            }
                    553:            if (say_message) {
                    554:                if (is_potion) p_know[P_FLY] = TRUE;
                    555:                msg("You feel %slighter than air!", blessed ? "much " : "");
                    556:            }
                    557:        }
                    558:        when P_RAISE:
                    559:            if (cursed) lower_level(D_POTION);
                    560:            else {
                    561:                msg("You suddenly feel %smore skillful",
                    562:                        blessed ? "much " : "");
                    563:                p_know[P_RAISE] = TRUE;
                    564:                raise_level();
                    565:                if (blessed) raise_level();
                    566:            }
                    567:        when P_HASTE:
                    568:            if (cursed) {       /* Slow player down */
                    569:                add_slow();
                    570:            }
                    571:            else {
                    572:                add_haste(blessed);
                    573:                if (is_potion) p_know[P_HASTE] = TRUE;
                    574:            }
                    575:        when P_RESTORE: {
                    576:            register int i, howmuch, strength_tally;
                    577:
                    578:            msg("Hey, this tastes great.  It make you feel %swarm all over.",
                    579:                blessed ? "really " : "");
                    580:            howmuch = blessed ? 2 : 1;
                    581:
                    582:            for (i=0; i<NUMABILITIES; i++) {
                    583:                if (i == A_STRENGTH) {
                    584:                    if (lost_str) {
                    585:                        if (lost_str > howmuch) {
                    586:                            lost_str -= howmuch;
                    587:
                    588:                            /*
                    589:                             * Save the lost strength.  We have to set
                    590:                             * temporarilty set it to 0 so that res_strength
                    591:                             * will not restore it.
                    592:                             */
                    593:                            strength_tally = lost_str;
                    594:                            lost_str = 0;
                    595:                            res_strength(howmuch);
                    596:                            lost_str = strength_tally;
                    597:                        }
                    598:                        else {
                    599:                        lost_str = 0;
                    600:                            extinguish(res_strength);
                    601:                            res_strength(howmuch);
                    602:                        }
                    603:                    }
                    604:                    else res_strength(howmuch);
                    605:                }
                    606:                else res_abil[i](howmuch);
                    607:            }
                    608:        }
                    609:        when P_INVIS:
                    610:            if (off(player, ISINVIS)) {
                    611:                turn_on(player, ISINVIS);
                    612:                msg("You have a tingling feeling all over your body");
                    613:                fuse(appear, NULL, blessed ? GONETIME*3 : GONETIME, AFTER);
                    614:                PLAYER = IPLAYER;
                    615:                light(&hero);
                    616:            }
                    617:            else {
                    618:                if (find_slot(appear)) {
                    619:                    msg("Your tingling feeling surges.");
                    620:                    lengthen(appear, blessed ? GONETIME*3 : GONETIME);
                    621:                }
                    622:                else msg("Nothing happens.");   /* Using cloak */
                    623:            }
                    624:
                    625:        when P_FFIND:
                    626:            {
                    627:                register struct linked_list *nitem;
                    628:                register struct object *nobj;
                    629:                bool show;
                    630:
                    631:                show = FALSE;
                    632:                wclear(hw);
                    633:                for (nitem = lvl_obj; nitem != NULL; nitem = next(nitem)) {
                    634:                    nobj = OBJPTR(nitem);
                    635:                    if (nobj->o_type == FOOD) {
                    636:                        show = TRUE;
                    637:                        mvwaddch(hw, nobj->o_pos.y, nobj->o_pos.x, FOOD);
                    638:                    }
                    639:                }
                    640:                for (nitem = mlist; nitem != NULL; nitem = next(nitem)) {
                    641:                    register struct linked_list *pitem;
                    642:                    register struct thing *th;
                    643:
                    644:                    th = THINGPTR(nitem);
                    645:                    if (on(*th, NODETECT)) continue;
                    646:                    for(pitem = th->t_pack; pitem != NULL; pitem = next(pitem)){
                    647:                        nobj = OBJPTR(pitem);
                    648:                        if (nobj->o_type == FOOD) {
                    649:                            show = TRUE;
                    650:                            mvwaddch(hw, th->t_pos.y, th->t_pos.x, FOOD);
                    651:                        }
                    652:                    }
                    653:                }
                    654:                if (show) {
                    655:                    if (is_potion) p_know[P_FFIND] = TRUE;
                    656:                    msg("Your nose tingles.");
                    657:                    msg("You sense the presence of food on this level.");
                    658:                    waddstr(msgw, morestr);
                    659:                    clearok(msgw, FALSE);
                    660:                    draw(msgw);
                    661:                    wait_for(' ');
                    662:                    msg("");
                    663:                    overlay(hw,cw);
                    664:                    draw(cw);
                    665:                }
                    666:                else
                    667:                    msg("You have a strange feeling for a moment, then it passes.");
                    668:            }
                    669:
                    670:        when P_SKILL:
                    671:            if (cursed) {
                    672:                msg("You feel less skillful.");
                    673:
                    674:                /* Does he currently have an artifical skill? */
                    675:                if (!find_slot(unskill)) {      /* No skill */
                    676:                    pstats.s_lvladj = -2;
                    677:                    pstats.s_lvl += pstats.s_lvladj;
                    678:                    fuse(unskill, NULL, SKILLDURATION, AFTER);
                    679:                }
                    680:                else {  /* Has an artifical skill */
                    681:                    /* Is the skill beneficial? */
                    682:                    if (pstats.s_lvladj > 0) {
                    683:                        /* Decrease the previous skill advantage */
                    684:                        pstats.s_lvl -= 2;
                    685:                        pstats.s_lvladj -= 2;
                    686:
                    687:                        /* If there is now a negative skill, lengthen time */
                    688:                        if (pstats.s_lvladj < 0)
                    689:                            lengthen(unskill, SKILLDURATION);
                    690:
                    691:                        /* If there is no skill advantage, unfuse us */
                    692:                        else if (pstats.s_lvladj == 0) extinguish(unskill);
                    693:                    }
                    694:                    else {      /* Already bad */
                    695:                        /* Make it a little worse, and lengthen it */
                    696:                        pstats.s_lvl--;
                    697:                        pstats.s_lvladj--;
                    698:                        lengthen(unskill, SKILLDURATION);
                    699:                    }
                    700:                }
                    701:
                    702:                /* Is our level too low now? */
                    703:                if (pstats.s_lvl < 1) death(D_POTION);
                    704:            }
                    705:            else {
                    706:                int adjust;
                    707:
                    708:                msg("You feel more skillful.");
                    709:
                    710:                /* Get the adjustment */
                    711:                adjust = blessed ? 3 : 2;
                    712:
                    713:                /* Does he currently have an artifical skill? */
                    714:                if (!find_slot(unskill)) {
                    715:                    pstats.s_lvladj = adjust;
                    716:                    pstats.s_lvl += pstats.s_lvladj;
                    717:                    fuse(unskill, NULL,
                    718:                         blessed ? SKILLDURATION*2 : SKILLDURATION, AFTER);
                    719:                }
                    720:                else {  /* Has an artifical skill */
                    721:                    /* Is the skill detrimental? */
                    722:                    if (pstats.s_lvladj < 0) {
                    723:                        /* Decrease the previous skill advantage */
                    724:                        pstats.s_lvl += adjust;
                    725:                        pstats.s_lvladj += adjust;
                    726:
                    727:                        /* If there is now a positive skill, lengthen time */
                    728:                        if (pstats.s_lvladj < 0)
                    729:                            lengthen(unskill, SKILLDURATION);
                    730:
                    731:                        /* If there is no skill advantage, unfuse us */
                    732:                        else if (pstats.s_lvladj == 0) extinguish(unskill);
                    733:                    }
                    734:                    else {      /* Already good */
                    735:                        /*
                    736:                         * Make the skill the maximum of the current good
                    737:                         * skill and what the adjust would give him.
                    738:                         */
                    739:                        pstats.s_lvl -= pstats.s_lvladj;
                    740:                        pstats.s_lvladj = max(pstats.s_lvladj, adjust);
                    741:                        pstats.s_lvl += pstats.s_lvladj;
                    742:                        lengthen(unskill,
                    743:                                 blessed ? SKILLDURATION*2 : SKILLDURATION);
                    744:                    }
                    745:                }
                    746:            }
                    747:
                    748:        when P_FIRE: {
                    749:            int duration;
                    750:            bool say_message;
                    751:
                    752:            say_message = TRUE;
                    753:
                    754:            if (blessed) duration = 3;
                    755:            else duration = 1;
                    756:
                    757:            if (on(player, NOFIRE)) {
                    758:                if (find_slot(nofire))
                    759:                    lengthen(nofire, duration*FIRETIME);
                    760:                else {
                    761:                    msg("Nothing happens.");    /* has on a ring */
                    762:                    say_message = FALSE;
                    763:                }
                    764:            }
                    765:            else {
                    766:                fuse(nofire, NULL, duration*FIRETIME, AFTER);
                    767:                turn_on(player, NOFIRE);
                    768:            }
                    769:            if (say_message)  {
                    770:                if (is_potion) p_know[P_FIRE] = TRUE;
                    771:                msg("You feel %sfire resistant", blessed ? "very " : "");
                    772:            }
                    773:        }
                    774:        when P_COLD: {
                    775:            int duration;
                    776:            bool say_message;
                    777:
                    778:            say_message = TRUE;
                    779:
                    780:            if (blessed) duration = 3;
                    781:            else duration = 1;
                    782:
                    783:            if (on(player, NOCOLD)) {
                    784:                if (find_slot(nocold))
                    785:                    lengthen(nocold, duration*COLDTIME);
                    786:                else {
                    787:                    msg("Nothing happens.");    /* has on a ring */
                    788:                    say_message = FALSE;
                    789:                }
                    790:            }
                    791:            else {
                    792:                fuse(nocold, NULL, duration*COLDTIME, AFTER);
                    793:                turn_on(player, NOCOLD);
                    794:            }
                    795:            if (say_message)  {
                    796:                if (is_potion) p_know[P_COLD] = TRUE;
                    797:                msg("You feel %scold resistant", blessed ? "very " : "");
                    798:            }
                    799:        }
                    800:        when P_LIGHTNING: {
                    801:            int duration;
                    802:            bool say_message;
                    803:
                    804:            say_message = TRUE;
                    805:
                    806:            if (blessed) duration = 3;
                    807:            else duration = 1;
                    808:
                    809:            if (on(player, NOBOLT)) {
                    810:                if (find_slot(nobolt))
                    811:                    lengthen(nobolt, duration*BOLTTIME);
                    812:            }
                    813:            else {
                    814:                fuse(nobolt, NULL, duration*BOLTTIME, AFTER);
                    815:                turn_on(player, NOBOLT);
                    816:            }
                    817:            if (say_message)
                    818:                msg("Your skin turns %sblue!", blessed ? "very " : "");
                    819:        }
                    820:        when P_POISON:
                    821:            if (!save(VS_POISON, &player, -2)) {
                    822:                msg("You feel very sick now.");
                    823:                pstats.s_hpt /= 2;
                    824:                if (!ISWEARING(R_SUSABILITY))
                    825:                    pstats.s_const--;
                    826:            }
                    827:            else {
                    828:                msg("You feel sick now.");
                    829:                pstats.s_hpt -= (pstats.s_hpt / 4);
                    830:            }
                    831:            if (pstats.s_const <= 0 || pstats.s_hpt <= 0)
                    832:                death(D_POISON);
                    833:        otherwise:
                    834:            msg("What an odd tasting potion!");
                    835:            return;
                    836:     }
                    837:     status(FALSE);
                    838:     if (is_potion && item && p_know[which] && p_guess[which])
                    839:     {
                    840:        free(p_guess[which]);
                    841:        p_guess[which] = NULL;
                    842:     }
                    843:     else if (is_potion                 &&
                    844:             !p_know[which]             &&
                    845:             item                       &&
                    846:             askme                      &&
                    847:             (flags & ISKNOW) == 0      &&
                    848:             (flags & ISPOST) == 0      &&
                    849:             p_guess[which] == NULL) {
                    850:        nameitem(item, FALSE);
                    851:     }
                    852:     if (item != NULL) o_discard(item);
                    853:     updpack(TRUE, &player);
                    854: }
                    855:
                    856: 
                    857: /*
                    858:  * res_dexterity:
                    859:  *     Restore player's dexterity
                    860:  *     if called with zero the restore fully
                    861:  */
                    862:
                    863: void
                    864: res_dexterity(int howmuch)
                    865: {
                    866:     short save_max;
                    867:     int ring_str;
                    868:
                    869:     if (howmuch < 0) return;
                    870:
                    871:     /* Discount the ring value */
                    872:     ring_str = ring_value(R_ADDHIT);
                    873:     pstats.s_dext -= ring_str;
                    874:
                    875:     if (pstats.s_dext < max_stats.s_dext ) {
                    876:        if (howmuch == 0)
                    877:            pstats.s_dext = max_stats.s_dext;
                    878:        else
                    879:            pstats.s_dext = min(pstats.s_dext+howmuch, max_stats.s_dext);
                    880:     }
                    881:
                    882:     /* Redo the rings */
                    883:     if (ring_str) {
                    884:        save_max = max_stats.s_dext;
                    885:        pstats.s_dext += ring_str;
                    886:        max_stats.s_dext = save_max;
                    887:     }
                    888: }
                    889:
                    890: 
                    891: /*
                    892:  * res_intelligence:
                    893:  *     Restore player's intelligence
                    894:  */
                    895:
                    896: void
                    897: res_intelligence(int howmuch)
                    898: {
                    899:     short save_max;
                    900:     int ring_str;
                    901:
                    902:     if (howmuch <= 0) return;
                    903:
                    904:     /* Discount the ring value */
                    905:     ring_str = ring_value(R_ADDINTEL);
                    906:     pstats.s_intel -= ring_str;
                    907:
                    908:     pstats.s_intel = min(pstats.s_intel + howmuch, max_stats.s_intel);
                    909:
                    910:     /* Redo the rings */
                    911:     if (ring_str) {
                    912:        save_max = max_stats.s_intel;
                    913:        pstats.s_intel += ring_str;
                    914:        max_stats.s_intel = save_max;
                    915:     }
                    916: }
                    917: 
                    918: /*
                    919:  * res_wisdom:
                    920:  *     Restore player's wisdom
                    921:  */
                    922:
                    923: void
                    924: res_wisdom(int howmuch)
                    925: {
                    926:     short save_max;
                    927:     int ring_str;
                    928:
                    929:     if (howmuch <= 0) return;
                    930:
                    931:     /* Discount the ring value */
                    932:     ring_str = ring_value(R_ADDWISDOM);
                    933:     pstats.s_wisdom -= ring_str;
                    934:
                    935:     pstats.s_wisdom = min(pstats.s_wisdom + howmuch, max_stats.s_wisdom);
                    936:
                    937:     /* Redo the rings */
                    938:     if (ring_str) {
                    939:        save_max = max_stats.s_wisdom;
                    940:        pstats.s_wisdom += ring_str;
                    941:        max_stats.s_wisdom = save_max;
                    942:     }
                    943: }
                    944:
                    945: /*
                    946:  * res_constitution:
                    947:  *     Restore the players constitution.
                    948:  */
                    949:
                    950: void
                    951: res_constitution(int howmuch)
                    952: {
                    953:     if (howmuch > 0)
                    954:        pstats.s_const = min(pstats.s_const + howmuch, max_stats.s_const);
                    955: }
                    956:
                    957: /*
                    958:  * res_charisma:
                    959:  *     Restore the players charisma.
                    960:  */
                    961:
                    962: void
                    963: res_charisma(int howmuch)
                    964: {
                    965:     if (howmuch > 0)
                    966:        pstats.s_charisma =
                    967:            min(pstats.s_charisma + howmuch, max_stats.s_charisma);
                    968: }

CVSweb