Annotation of 43BSDTahoe/games/hack/hack.potion.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: /* hack.potion.c - version 1.0.3 */
                      3: 
                      4: #include "hack.h"
                      5: extern int float_down();
                      6: extern char *nomovemsg;
                      7: extern struct monst youmonst;
                      8: extern struct monst *makemon();
                      9: 
                     10: dodrink() {
                     11:        register struct obj *otmp,*objs;
                     12:        register struct monst *mtmp;
                     13:        register int unkn = 0, nothing = 0;
                     14: 
                     15:        otmp = getobj("!", "drink");
                     16:        if(!otmp) return(0);
                     17:        if(!strcmp(objects[otmp->otyp].oc_descr, "smoky") && !rn2(13)) {
                     18:                ghost_from_bottle();
                     19:                goto use_it;
                     20:        }
                     21:        switch(otmp->otyp){
                     22:        case POT_RESTORE_STRENGTH:
                     23:                unkn++;
                     24:                pline("Wow!  This makes you feel great!");
                     25:                if(u.ustr < u.ustrmax) {
                     26:                        u.ustr = u.ustrmax;
                     27:                        flags.botl = 1;
                     28:                }
                     29:                break;
                     30:        case POT_BOOZE:
                     31:                unkn++;
                     32:                pline("Ooph!  This tastes like liquid fire!");
                     33:                Confusion += d(3,8);
                     34:                /* the whiskey makes us feel better */
                     35:                if(u.uhp < u.uhpmax) losehp(-1, "bottle of whiskey");
                     36:                if(!rn2(4)) {
                     37:                        pline("You pass out.");
                     38:                        multi = -rnd(15);
                     39:                        nomovemsg = "You awake with a headache.";
                     40:                }
                     41:                break;
                     42:        case POT_INVISIBILITY:
                     43:                if(Invis || See_invisible)
                     44:                  nothing++;
                     45:                else {
                     46:                  if(!Blind)
                     47:                    pline("Gee!  All of a sudden, you can't see yourself.");
                     48:                  else
                     49:                    pline("You feel rather airy."), unkn++;
                     50:                  newsym(u.ux,u.uy);
                     51:                }
                     52:                Invis += rn1(15,31);
                     53:                break;
                     54:        case POT_FRUIT_JUICE:
                     55:                pline("This tastes like fruit juice.");
                     56:                lesshungry(20);
                     57:                break;
                     58:        case POT_HEALING:
                     59:                pline("You begin to feel better.");
                     60:                flags.botl = 1;
                     61:                u.uhp += rnd(10);
                     62:                if(u.uhp > u.uhpmax)
                     63:                        u.uhp = ++u.uhpmax;
                     64:                if(Blind) Blind = 1;    /* see on next move */
                     65:                if(Sick) Sick = 0;
                     66:                break;
                     67:        case POT_PARALYSIS:
                     68:                if(Levitation)
                     69:                        pline("You are motionlessly suspended.");
                     70:                else
                     71:                        pline("Your feet are frozen to the floor!");
                     72:                nomul(-(rn1(10,25)));
                     73:                break;
                     74:        case POT_MONSTER_DETECTION:
                     75:                if(!fmon) {
                     76:                        strange_feeling(otmp, "You feel threatened.");
                     77:                        return(1);
                     78:                } else {
                     79:                        cls();
                     80:                        for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
                     81:                                if(mtmp->mx > 0)
                     82:                                at(mtmp->mx,mtmp->my,mtmp->data->mlet);
                     83:                        prme();
                     84:                        pline("You sense the presence of monsters.");
                     85:                        more();
                     86:                        docrt();
                     87:                }
                     88:                break;
                     89:        case POT_OBJECT_DETECTION:
                     90:                if(!fobj) {
                     91:                        strange_feeling(otmp, "You feel a pull downward.");
                     92:                        return(1);
                     93:                } else {
                     94:                    for(objs = fobj; objs; objs = objs->nobj)
                     95:                        if(objs->ox != u.ux || objs->oy != u.uy)
                     96:                                goto outobjmap;
                     97:                    pline("You sense the presence of objects close nearby.");
                     98:                    break;
                     99:                outobjmap:
                    100:                        cls();
                    101:                        for(objs = fobj; objs; objs = objs->nobj)
                    102:                                at(objs->ox,objs->oy,objs->olet);
                    103:                        prme();
                    104:                        pline("You sense the presence of objects.");
                    105:                        more();
                    106:                        docrt();
                    107:                }
                    108:                break;
                    109:        case POT_SICKNESS:
                    110:                pline("Yech! This stuff tastes like poison.");
                    111:                if(Poison_resistance)
                    112:     pline("(But in fact it was biologically contaminated orange juice.)");
                    113:                losestr(rn1(4,3));
                    114:                losehp(rnd(10), "contaminated potion");
                    115:                break;
                    116:        case POT_CONFUSION:
                    117:                if(!Confusion)
                    118:                        pline("Huh, What?  Where am I?");
                    119:                else
                    120:                        nothing++;
                    121:                Confusion += rn1(7,16);
                    122:                break;
                    123:        case POT_GAIN_STRENGTH:
                    124:                pline("Wow do you feel strong!");
                    125:                if(u.ustr >= 118) break;        /* > 118 is impossible */
                    126:                if(u.ustr > 17) u.ustr += rnd(118-u.ustr);
                    127:                else u.ustr++;
                    128:                if(u.ustr > u.ustrmax) u.ustrmax = u.ustr;
                    129:                flags.botl = 1;
                    130:                break;
                    131:        case POT_SPEED:
                    132:                if(Wounded_legs) {
                    133:                        heal_legs();
                    134:                        unkn++;
                    135:                        break;
                    136:                }
                    137:                if(!(Fast & ~INTRINSIC))
                    138:                        pline("You are suddenly moving much faster.");
                    139:                else
                    140:                        pline("Your legs get new energy."), unkn++;
                    141:                Fast += rn1(10,100);
                    142:                break;
                    143:        case POT_BLINDNESS:
                    144:                if(!Blind)
                    145:                        pline("A cloud of darkness falls upon you.");
                    146:                else
                    147:                        nothing++;
                    148:                Blind += rn1(100,250);
                    149:                seeoff(0);
                    150:                break;
                    151:        case POT_GAIN_LEVEL: 
                    152:                pluslvl();
                    153:                break;
                    154:        case POT_EXTRA_HEALING:
                    155:                pline("You feel much better.");
                    156:                flags.botl = 1;
                    157:                u.uhp += d(2,20)+1;
                    158:                if(u.uhp > u.uhpmax)
                    159:                        u.uhp = (u.uhpmax += 2);
                    160:                if(Blind) Blind = 1;
                    161:                if(Sick) Sick = 0;
                    162:                break;
                    163:        case POT_LEVITATION:
                    164:                if(!Levitation)
                    165:                        float_up();
                    166:                else
                    167:                        nothing++;
                    168:                Levitation += rnd(100);
                    169:                u.uprops[PROP(RIN_LEVITATION)].p_tofn = float_down;
                    170:                break;
                    171:        default:
                    172:                impossible("What a funny potion! (%u)", otmp->otyp);
                    173:                return(0);
                    174:        }
                    175:        if(nothing) {
                    176:            unkn++;
                    177:            pline("You have a peculiar feeling for a moment, then it passes.");
                    178:        }
                    179:        if(otmp->dknown && !objects[otmp->otyp].oc_name_known) {
                    180:                if(!unkn) {
                    181:                        objects[otmp->otyp].oc_name_known = 1;
                    182:                        more_experienced(0,10);
                    183:                } else if(!objects[otmp->otyp].oc_uname)
                    184:                        docall(otmp);
                    185:        }
                    186: use_it:
                    187:        useup(otmp);
                    188:        return(1);
                    189: }
                    190: 
                    191: pluslvl()
                    192: {
                    193:        register num;
                    194: 
                    195:        pline("You feel more experienced.");
                    196:        num = rnd(10);
                    197:        u.uhpmax += num;
                    198:        u.uhp += num;
                    199:        if(u.ulevel < 14) {
                    200:                extern long newuexp();
                    201: 
                    202:                u.uexp = newuexp()+1;
                    203:                pline("Welcome to experience level %u.", ++u.ulevel);
                    204:        }
                    205:        flags.botl = 1;
                    206: }
                    207: 
                    208: strange_feeling(obj,txt)
                    209: register struct obj *obj;
                    210: register char *txt;
                    211: {
                    212:        if(flags.beginner)
                    213:            pline("You have a strange feeling for a moment, then it passes.");
                    214:        else
                    215:            pline(txt);
                    216:        if(!objects[obj->otyp].oc_name_known && !objects[obj->otyp].oc_uname)
                    217:                docall(obj);
                    218:        useup(obj);
                    219: }
                    220: 
                    221: char *bottlenames[] = {
                    222:        "bottle", "phial", "flagon", "carafe", "flask", "jar", "vial"
                    223: };
                    224: 
                    225: potionhit(mon, obj)
                    226: register struct monst *mon;
                    227: register struct obj *obj;
                    228: {
                    229:        extern char *xname();
                    230:        register char *botlnam = bottlenames[rn2(SIZE(bottlenames))];
                    231:        boolean uclose, isyou = (mon == &youmonst);
                    232: 
                    233:        if(isyou) {
                    234:                uclose = TRUE;
                    235:                pline("The %s crashes on your head and breaks into shivers.",
                    236:                        botlnam);
                    237:                losehp(rnd(2), "thrown potion");
                    238:        } else {
                    239:                uclose = (dist(mon->mx,mon->my) < 3);
                    240:                /* perhaps 'E' and 'a' have no head? */
                    241:                pline("The %s crashes on %s's head and breaks into shivers.",
                    242:                        botlnam, monnam(mon));
                    243:                if(rn2(5) && mon->mhp > 1)
                    244:                        mon->mhp--;
                    245:        }
                    246:        pline("The %s evaporates.", xname(obj));
                    247: 
                    248:        if(!isyou && !rn2(3)) switch(obj->otyp) {
                    249: 
                    250:        case POT_RESTORE_STRENGTH:
                    251:        case POT_GAIN_STRENGTH:
                    252:        case POT_HEALING:
                    253:        case POT_EXTRA_HEALING:
                    254:                if(mon->mhp < mon->mhpmax) {
                    255:                        mon->mhp = mon->mhpmax;
                    256:                        pline("%s looks sound and hale again!", Monnam(mon));
                    257:                }
                    258:                break;
                    259:        case POT_SICKNESS:
                    260:                if(mon->mhpmax > 3)
                    261:                        mon->mhpmax /= 2;
                    262:                if(mon->mhp > 2)
                    263:                        mon->mhp /= 2;
                    264:                break;
                    265:        case POT_CONFUSION:
                    266:        case POT_BOOZE:
                    267:                mon->mconf = 1;
                    268:                break;
                    269:        case POT_INVISIBILITY:
                    270:                unpmon(mon);
                    271:                mon->minvis = 1;
                    272:                pmon(mon);
                    273:                break;
                    274:        case POT_PARALYSIS:
                    275:                mon->mfroz = 1;
                    276:                break;
                    277:        case POT_SPEED:
                    278:                mon->mspeed = MFAST;
                    279:                break;
                    280:        case POT_BLINDNESS:
                    281:                mon->mblinded |= 64 + rn2(64);
                    282:                break;
                    283: /*     
                    284:        case POT_GAIN_LEVEL:
                    285:        case POT_LEVITATION:
                    286:        case POT_FRUIT_JUICE:
                    287:        case POT_MONSTER_DETECTION:
                    288:        case POT_OBJECT_DETECTION:
                    289:                break;
                    290: */
                    291:        }
                    292:        if(uclose && rn2(5))
                    293:                potionbreathe(obj);
                    294:        obfree(obj, Null(obj));
                    295: }
                    296: 
                    297: potionbreathe(obj)
                    298: register struct obj *obj;
                    299: {
                    300:        switch(obj->otyp) {
                    301:        case POT_RESTORE_STRENGTH:
                    302:        case POT_GAIN_STRENGTH:
                    303:                if(u.ustr < u.ustrmax) u.ustr++, flags.botl = 1;
                    304:                break;
                    305:        case POT_HEALING:
                    306:        case POT_EXTRA_HEALING:
                    307:                if(u.uhp < u.uhpmax) u.uhp++, flags.botl = 1;
                    308:                break;
                    309:        case POT_SICKNESS:
                    310:                if(u.uhp <= 5) u.uhp = 1; else u.uhp -= 5;
                    311:                flags.botl = 1;
                    312:                break;
                    313:        case POT_CONFUSION:
                    314:        case POT_BOOZE:
                    315:                if(!Confusion)
                    316:                        pline("You feel somewhat dizzy.");
                    317:                Confusion += rnd(5);
                    318:                break;
                    319:        case POT_INVISIBILITY:
                    320:                pline("For an instant you couldn't see your right hand.");
                    321:                break;
                    322:        case POT_PARALYSIS:
                    323:                pline("Something seems to be holding you.");
                    324:                nomul(-rnd(5));
                    325:                break;
                    326:        case POT_SPEED:
                    327:                Fast += rnd(5);
                    328:                pline("Your knees seem more flexible now.");
                    329:                break;
                    330:        case POT_BLINDNESS:
                    331:                if(!Blind) pline("It suddenly gets dark.");
                    332:                Blind += rnd(5);
                    333:                seeoff(0);
                    334:                break;
                    335: /*     
                    336:        case POT_GAIN_LEVEL:
                    337:        case POT_LEVITATION:
                    338:        case POT_FRUIT_JUICE:
                    339:        case POT_MONSTER_DETECTION:
                    340:        case POT_OBJECT_DETECTION:
                    341:                break;
                    342: */
                    343:        }
                    344:        /* note: no obfree() */
                    345: }
                    346: 
                    347: /*
                    348:  * -- rudimentary -- to do this correctly requires much more work
                    349:  * -- all sharp weapons get one or more qualities derived from the potions
                    350:  * -- texts on scrolls may be (partially) wiped out; do they become blank?
                    351:  * --   or does their effect change, like under Confusion?
                    352:  * -- all objects may be made invisible by POT_INVISIBILITY
                    353:  * -- If the flask is small, can one dip a large object? Does it magically
                    354:  * --   become a jug? Etc.
                    355:  */
                    356: dodip(){
                    357:        register struct obj *potion, *obj;
                    358: 
                    359:        if(!(obj = getobj("#", "dip")))
                    360:                return(0);
                    361:        if(!(potion = getobj("!", "dip into")))
                    362:                return(0);
                    363:        pline("Interesting...");
                    364:        if(obj->otyp == ARROW || obj->otyp == DART ||
                    365:           obj->otyp == CROSSBOW_BOLT) {
                    366:                if(potion->otyp == POT_SICKNESS) {
                    367:                        useup(potion);
                    368:                        if(obj->spe < 7) obj->spe++;    /* %% */
                    369:                }
                    370:        }
                    371:        return(1);
                    372: }
                    373: 
                    374: ghost_from_bottle(){
                    375:        extern struct permonst pm_ghost;
                    376:        register struct monst *mtmp;
                    377: 
                    378:        if(!(mtmp = makemon(PM_GHOST,u.ux,u.uy))){
                    379:                pline("This bottle turns out to be empty.");
                    380:                return;
                    381:        }
                    382:        mnexto(mtmp);
                    383:        pline("As you open the bottle, an enormous ghost emerges!");
                    384:        pline("You are frightened to death, and unable to move.");
                    385:        nomul(-3);
                    386: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.