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

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

1.1       rubenllo    1: /*
                      2:  * Functions for dealing with potions
                      3:  *
                      4:  * @(#)potions.c       9.0     (rdk)    7/17/84
                      5:  *
                      6:  * Super-Rogue
                      7:  * Copyright (C) 1984 Robert D. Kindelberger
                      8:  * All rights reserved.
                      9:  *
                     10:  * Based on "Rogue: Exploring the Dungeons of Doom"
                     11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                     12:  * All rights reserved.
                     13:  *
                     14:  * See the file LICENSE.TXT for full copyright and licensing information.
                     15:  */
                     16:
                     17: #include <stdlib.h>
                     18: #include <string.h>
                     19: #include "rogue.h"
                     20: #include "rogue.ext"
                     21:
                     22: /*
                     23:  * quaff:
                     24:  *     Let the hero drink a potion
                     25:  */
                     26: void
                     27: quaff(void)
                     28: {
                     29:        reg struct object *obj;
                     30:        reg struct linked_list *item, *titem;
                     31:        reg struct thing *th;
                     32:        reg int wh;
                     33:        char buf[LINLEN];
                     34:        bool bless, curse;
                     35:
                     36:        /*
                     37:         * Make certain that it is somethings that we want to drink
                     38:         */
                     39:        if ((item = get_item("quaff", POTION)) == NULL)
                     40:                return;
                     41:        obj = OBJPTR(item);
                     42:        if (obj->o_type != POTION) {
                     43:                msg("That's undrinkable!");
                     44:                after = FALSE;
                     45:                return;
                     46:        }
                     47:        wh = obj->o_which;
                     48:        bless = o_on(obj, ISBLESS);
                     49:        curse = o_on(obj, ISCURSED);
                     50:        del_pack(item);         /* get rid of it */
                     51:
                     52:        /*
                     53:         * Calculate the effect it has on the poor guy.
                     54:         */
                     55:        switch(wh) {
                     56:        case P_CONFUSE:
                     57:                if (!bless) {
                     58:                        if (pl_on(ISINVINC))
                     59:                                msg("You remain level-headed.");
                     60:                        else {
                     61:                                chg_abil(WIS,-1,TRUE);          /* confuse his mind */
                     62:                                if (pl_off(ISHUH)) {
                     63:                                        msg("Wait, what's going on here. Huh? What? Who?");
                     64:                                        if (pl_on(ISHUH))
                     65:                                                lengthen(unconfuse,rnd(8)+HUHDURATION);
                     66:                                        else
                     67:                                                fuse(unconfuse,TRUE,rnd(8)+HUHDURATION);
                     68:                                        player.t_flags |= ISHUH;
                     69:                                }
                     70:                        }
                     71:                        p_know[P_CONFUSE] = TRUE;
                     72:                }
                     73:        when P_POISON:
                     74:                if (!bless) {
                     75:                        if (pl_off(ISINVINC) && !iswearing(R_SUSTSTR) &&
                     76:                          !iswearing(R_SUSAB)) {
                     77:                                chg_abil(CON,-1,TRUE);
                     78:                                chg_abil(STR,-(rnd(3)+1),TRUE);
                     79:                                msg("You feel very sick now.");
                     80:                        }
                     81:                        else
                     82:                                msg("You feel momentarily sick.");
                     83:                        p_know[P_POISON] = TRUE;
                     84:                }
                     85:        when P_HEALING:
                     86:                if (!curse) {
                     87:                        heal_self(4, TRUE);
                     88:                        msg("You begin to feel better.");
                     89:                        if (!iswearing(R_SLOW))
                     90:                                notslow(FALSE);
                     91:                        sight(FALSE);
                     92:                        p_know[P_HEALING] = TRUE;
                     93:                }
                     94:        when P_STRENGTH:
                     95:                if (!curse) {
                     96:                        msg("You feel stronger, now.  What bulging muscles!");
                     97:                        chg_abil(STR,1,TRUE);
                     98:                        p_know[P_STRENGTH] = TRUE;
                     99:                }
                    100:        when P_MFIND:
                    101:                /*
                    102:                 * Potion of monster detection - find all monsters
                    103:                 */
                    104:                if (mlist != NULL && !curse) {
                    105:                        dispmons();
                    106:                        mpos = 0;
                    107:                        msg("You begin to sense the presence of monsters--More--");
                    108:                        p_know[P_MFIND] = TRUE;
                    109:                        wait_for(cw,' ');
                    110:                        msg("");                /* clear line */
                    111:                }
                    112:                else
                    113:                        msg("You have a strange feeling for a moment, then it passes.");
                    114:        when P_TFIND:
                    115:                /*
                    116:                 * Potion of magic detection.  Show the potions and scrolls
                    117:                 */
                    118:                if (lvl_obj != NULL && !curse) {
                    119:                        struct linked_list *mobj;
                    120:                        struct object *tp;
                    121:                        bool show;
                    122:
                    123:                        show = FALSE;
                    124:                        wclear(hw);
                    125:                        for (mobj = lvl_obj; mobj != NULL; mobj = next(mobj)) {
                    126:                                tp = OBJPTR(mobj);
                    127:                                if (is_magic(tp)) {
                    128:                                        show = TRUE;
                    129:                                        mvwaddch(hw, tp->o_pos.y, tp->o_pos.x, MAGIC);
                    130:                                }
                    131:                        }
                    132:                        for(titem = mlist; titem != NULL; titem = next(titem)) {
                    133:                                reg struct linked_list *pitem;
                    134:
                    135:                                th = THINGPTR(titem);
                    136:                                for(pitem=th->t_pack;pitem!=NULL;pitem=next(pitem)) {
                    137:                                        if (is_magic(ldata(pitem))) {
                    138:                                                show = TRUE;
                    139:                                                mvwaddch(hw,th->t_pos.y, th->t_pos.x, MAGIC);
                    140:                                        }
                    141:                                }
                    142:                        }
                    143:                        if (show) {
                    144:                                msg("You begin to sense the presence of magic.");
                    145:                                overlay(hw,cw);
                    146:                                p_know[P_TFIND] = TRUE;
                    147:                                break;
                    148:                        }
                    149:                }
                    150:                msg("You have a strange feeling for a moment, then it passes.");
                    151:        when P_PARALYZE:
                    152:                if (!bless) {
                    153:                        if (pl_on(ISINVINC))
                    154:                                msg("You feel numb for a moment.");
                    155:                        else {
                    156:                                msg("You can't move.");
                    157:                                player.t_nocmd = HOLDTIME;
                    158:                        }
                    159:                        p_know[P_PARALYZE] = TRUE;
                    160:                }
                    161:        when P_SEEINVIS:
                    162:                if (!curse) {
                    163:                        int invlen = roll(40,20);
                    164:
                    165:                        msg("This potion tastes like %s juice.", fruit);
                    166:                        if (pl_off(CANSEE)) {
                    167:                                player.t_flags |= CANSEE;
                    168:                                fuse(unsee, TRUE, invlen);
                    169:                                light(&hero);
                    170:                        }
                    171:                        else
                    172:                                lengthen(unsee, invlen);
                    173:                        sight(FALSE);
                    174:                }
                    175:        when P_RAISE:
                    176:                if (!curse) {
                    177:                        msg("You suddenly feel much more skillful.");
                    178:                        p_know[P_RAISE] = TRUE;
                    179:                        chg_abil(DEX,1,TRUE);
                    180:                        chg_abil(WIS,1,TRUE);
                    181:                        chg_abil(CON,1,TRUE);
                    182:                        raise_level();
                    183:                }
                    184:        when P_XHEAL:
                    185:                if (!curse) {
                    186:                        heal_self(8, TRUE);
                    187:                        if (rnd(100) < 50)
                    188:                                chg_abil(CON,1,TRUE);
                    189:                        msg("You begin to feel much better.");
                    190:                        p_know[P_XHEAL] = TRUE;
                    191:                        if (!iswearing(R_SLOW))
                    192:                                notslow(FALSE);
                    193:                        unconfuse(FALSE);
                    194:                        extinguish(unconfuse);
                    195:                        sight(FALSE);
                    196:                }
                    197:        when P_HASTE:
                    198:                if (!curse) {
                    199:                        add_haste(TRUE);
                    200:                        p_know[P_HASTE] = TRUE;
                    201:                }
                    202:        when P_INVINC:
                    203:                if (!curse) {
                    204:                        int time = rnd(400) + 350;
                    205:
                    206:                        msg("You feel invincible.");
                    207:                        if (player.t_flags & ISINVINC)
                    208:                                lengthen(notinvinc,time);
                    209:                        else
                    210:                                fuse(notinvinc,TRUE,time);
                    211:                        player.t_flags |= ISINVINC;
                    212:                        p_know[P_INVINC] = TRUE;
                    213:                }
                    214:        when P_SMART:
                    215:                if (!curse) {
                    216:                        msg("You feel more perceptive.");
                    217:                        p_know[P_SMART] = TRUE;
                    218:                        chg_abil(WIS,1,TRUE);
                    219:                }
                    220:        when P_RESTORE:
                    221:                if (!curse) {
                    222:                        msg("Hey, this tastes great. You feel warm all over.");
                    223:                        him->s_re = max_stats.s_re;
                    224:                        him->s_ef = max_stats.s_re;
                    225:                        ringabil();                             /* add in rings */
                    226:                        updpack();                              /* update weight */
                    227:                        p_know[P_RESTORE] = TRUE;
                    228:                        extinguish(rchg_str);   /* kill restore in from ulodyte */
                    229:                }
                    230:        when P_BLIND:
                    231:                if (!bless) {
                    232:                        if (pl_on(ISINVINC))
                    233:                                msg("The light dims for a moment.");
                    234:                        else {
                    235:                                chg_abil(WIS,-1,TRUE);
                    236:                                msg("A cloak of darkness falls around you.");
                    237:                                if (pl_off(ISBLIND)) {
                    238:                                        player.t_flags |= ISBLIND;
                    239:                                        fuse(sight, TRUE, rnd(400) + 450);
                    240:                                        light(&hero);
                    241:                                }
                    242:                        }
                    243:                        p_know[P_BLIND] = TRUE;
                    244:                }
                    245:        when P_ETH:
                    246:                if (!curse) {
                    247:                        int ethlen = roll(40,20);
                    248:
                    249:                        msg("You feel more vaporous.");
                    250:                        if (pl_on(ISETHER))
                    251:                                lengthen(noteth,ethlen);
                    252:                        else
                    253:                                fuse(noteth,TRUE,ethlen);
                    254:                        player.t_flags |= ISETHER;
                    255:                        p_know[P_ETH] = TRUE;
                    256:                }
                    257:        when P_NOP:
                    258:                msg("This potion tastes extremely dull.");
                    259:        when P_DEX:
                    260:                if (!curse) {
                    261:                        chg_abil(DEX,1,TRUE);           /* increase dexterity */
                    262:                        p_know[P_DEX] = TRUE;
                    263:                        msg("You feel much more agile.");
                    264:                }
                    265:        when P_REGEN:
                    266:                if (!curse) {
                    267:                        int reglen = rnd(450) + 450;
                    268:
                    269:                        if (pl_on(ISREGEN))
                    270:                                lengthen(notregen, reglen);
                    271:                        else
                    272:                                fuse(notregen, TRUE, reglen);
                    273:                        player.t_flags |= ISREGEN;
                    274:                        msg("You feel yourself improved.");
                    275:                        p_know[P_REGEN] = TRUE;
                    276:                }
                    277:        when P_DECREP:
                    278:        case P_SUPHERO: {
                    279:                int howmuch = rnd(3) + 1;
                    280:
                    281:                if (wh == P_DECREP) {
                    282:                        if (!bless) {
                    283:                                if (iswearing(R_SUSAB) || pl_on(ISINVINC)) {
                    284:                                        msg("You feel momentarily woozy.");
                    285:                                        howmuch = 0;
                    286:                                }
                    287:                                else {
                    288:                                        msg("You feel crippled.");
                    289:                                        howmuch = -howmuch;
                    290:                                        if (!iswearing(R_SUSTSTR))
                    291:                                                chg_abil(STR,howmuch,TRUE);
                    292:                                }
                    293:                        }
                    294:                        else
                    295:                                howmuch = 0;
                    296:                }
                    297:                else {                  /* potion of superhero */
                    298:                        if (curse)
                    299:                                howmuch = 0;
                    300:                        msg("You feel invigorated.");
                    301:                        chg_abil(STR,howmuch,TRUE);
                    302:                }
                    303:                chg_abil(CON,howmuch,TRUE);
                    304:                chg_abil(DEX,howmuch,TRUE);
                    305:                chg_abil(WIS,howmuch,TRUE);             /* change abilities */
                    306:                p_know[wh] = TRUE;
                    307:        }
                    308:        otherwise:
                    309:                msg("What an odd tasting potion!");
                    310:                return;
                    311:        }
                    312:        nochange = FALSE;
                    313:        if (p_know[wh] && p_guess[wh]) {
                    314:                free(p_guess[wh]);
                    315:                p_guess[wh] = NULL;
                    316:        }
                    317:        else if(!p_know[wh] && p_guess[wh] == NULL) {
                    318:                strcpy(buf, p_colors[wh]);
                    319:                msg(callit);
                    320:                if (get_str(buf, cw) == NORM) {
                    321:                        p_guess[wh] = new(strlen(buf) + 1);
                    322:                        strcpy(p_guess[wh], buf);
                    323:                }
                    324:        }
                    325: }

CVSweb