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

Annotation of early-roguelike/arogue7/misc.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * misc.c - routines dealing specifically with miscellaneous magic
        !             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: #include "curses.h"
        !            16: #include <stdlib.h>
        !            17: #include <ctype.h>
        !            18: #include <string.h>
        !            19: #include "rogue.h"
        !            20: #ifdef PC7300
        !            21: #include "menu.h"
        !            22: #endif
        !            23:
        !            24: /*
        !            25:  * routines dealing specifically with miscellaneous magic
        !            26:  */
        !            27:
        !            28: /*
        !            29:  * changeclass:
        !            30:  *     Change the player's class to the specified one.
        !            31:  */
        !            32:
        !            33: void
        !            34: changeclass(int newclass)
        !            35: {
        !            36:     if (newclass == player.t_ctype) {
        !            37:        msg("You feel more skillful.");
        !            38:        raise_level();
        !            39:     }
        !            40:     else {
        !            41:        /*
        !            42:         * reset his class and then use check_level to reset hit
        !            43:         * points and the right level for his exp pts
        !            44:         * drop exp pts by 10%
        !            45:         */
        !            46:        long save;
        !            47:
        !            48:        msg("You feel like a whole new person!");
        !            49:
        !            50:        /*
        !            51:         * if he becomes a thief he has to have leather armor
        !            52:         */
        !            53:        if ((newclass == C_THIEF || newclass == C_ASSASIN)      &&
        !            54:            cur_armor != NULL                                   &&
        !            55:            cur_armor->o_which != LEATHER                       &&
        !            56:            cur_armor->o_which != STUDDED_LEATHER )
        !            57:                cur_armor->o_which = STUDDED_LEATHER;
        !            58:        /*
        !            59:         * if he becomes a monk he can't wear armor
        !            60:         */
        !            61:        if (newclass == C_MONK && cur_armor != NULL) {
        !            62:                cur_armor->o_ac = armors[cur_armor->o_which].a_class -
        !            63:                                  cur_armor->o_ac;
        !            64:                cur_armor->o_type = MM;
        !            65:                cur_armor->o_which = MM_PROTECT;
        !            66:                cur_armor->o_flags &= ~(ISPROT | ISKNOW | ISMETAL);
        !            67:                cur_misc[WEAR_CLOAK] = cur_armor;
        !            68:                cur_armor = NULL;
        !            69:        }
        !            70:        /*
        !            71:         * if he used to be a spell caster of some sort, kill the fuse
        !            72:         */
        !            73:        if (player.t_ctype == C_MAGICIAN || player.t_ctype == C_RANGER)
        !            74:                extinguish(spell_recovery);
        !            75:        if (player.t_ctype == C_DRUID || player.t_ctype == C_RANGER)
        !            76:                extinguish(chant_recovery);
        !            77:        if ((player.t_ctype == C_CLERIC || player.t_ctype == C_PALADIN) &&
        !            78:             !cur_relic[HEIL_ANKH])
        !            79:                extinguish(prayer_recovery);
        !            80:        /*
        !            81:         * if he becomes a spell caster of some kind, give him a fuse
        !            82:         */
        !            83:        if (newclass == C_MAGICIAN || newclass == C_RANGER)
        !            84:                fuse(spell_recovery, NULL, SPELLTIME, AFTER);
        !            85:        if (newclass == C_DRUID || newclass == C_RANGER)
        !            86:                fuse(chant_recovery, NULL, SPELLTIME, AFTER);
        !            87:        if ((newclass==C_CLERIC || newclass==C_PALADIN) && !cur_misc[HEIL_ANKH])
        !            88:                fuse(prayer_recovery, NULL, SPELLTIME, AFTER);
        !            89:        /*
        !            90:         * if he's changing from a fighter then may have to change
        !            91:         * his sword since only fighter can use two-handed
        !            92:         * and bastard swords
        !            93:         */
        !            94:        if ((player.t_ctype == C_FIGHTER        ||
        !            95:             player.t_ctype == C_RANGER         ||
        !            96:             player.t_ctype == C_PALADIN)               &&
        !            97:            cur_weapon != NULL                          &&
        !            98:            cur_weapon->o_type == WEAPON                &&
        !            99:           (cur_weapon->o_which== BASWORD       ||
        !           100:            cur_weapon->o_which== TWOSWORD )            &&
        !           101:           !(newclass == C_FIGHTER              ||
        !           102:             newclass == C_RANGER               ||
        !           103:             newclass == C_PALADIN)                     &&
        !           104:           !(newclass == C_ASSASIN              &&
        !           105:             cur_weapon->o_which == BASWORD))
        !           106:                cur_weapon->o_which = SWORD;
        !           107:
        !           108:        /*
        !           109:         * if he was a thief then take out the trap_look() daemon
        !           110:         */
        !           111:        if (player.t_ctype == C_THIEF ||
        !           112:            player.t_ctype == C_MONK  ||
        !           113:            player.t_ctype == C_ASSASIN)
        !           114:            kill_daemon(trap_look);
        !           115:
        !           116:        /*
        !           117:         * if he becomes a thief then add the trap_look() daemon
        !           118:         */
        !           119:        if (newclass == C_THIEF || newclass == C_ASSASIN || newclass == C_MONK)
        !           120:            start_daemon(trap_look, NULL, AFTER);
        !           121:        char_type = player.t_ctype = newclass;
        !           122:        save = pstats.s_hpt;
        !           123:        max_stats.s_hpt = pstats.s_hpt = 0;
        !           124:        max_stats.s_lvl = pstats.s_lvl = 0;
        !           125:        max_stats.s_lvladj = pstats.s_lvladj = 0;
        !           126:        max_stats.s_exp = pstats.s_exp -= pstats.s_exp/10;
        !           127:        check_level();
        !           128:        if (pstats.s_hpt > save) /* don't add to current hits */
        !           129:            pstats.s_hpt = save;
        !           130:     }
        !           131: }
        !           132: 
        !           133: /*
        !           134:  * Use the relic that our monster is wielding.
        !           135:  */
        !           136: void
        !           137: m_use_relic(struct thing *monster)
        !           138: {
        !           139:     register struct object *obj;
        !           140:
        !           141:     /* Make sure we really have it */
        !           142:     if (monster->t_using) obj = OBJPTR(monster->t_using);
        !           143:     else {
        !           144:        debug("Relic not set!");
        !           145:        monster->t_action = A_NIL;
        !           146:        return;
        !           147:     }
        !           148:
        !           149:     /* Now let's see what we're using */
        !           150:     if (obj->o_type == RELIC) switch (obj->o_which) {
        !           151:        case MING_STAFF: {
        !           152:            static struct object missile = {
        !           153:              MISSILE, {0,0}, "", 0, "", "0d4 " , NULL, 0, WS_MISSILE, 100, 1
        !           154:            };
        !           155:
        !           156:            debug("Firing Ming's staff");
        !           157:            sprintf(missile.o_hurldmg, "%dd4", monster->t_stats.s_lvl);
        !           158:            do_motion(&missile,
        !           159:                       monster->t_newpos.y, monster->t_newpos.x, monster);
        !           160:            hit_monster(unc(missile.o_pos), &missile, monster);
        !           161:            monster->t_artifact = monster->t_artifact * 4 / 5;
        !           162:        }
        !           163:        when EMORI_CLOAK:
        !           164:            debug("stunning with Emori's cloak");
        !           165:            do_zap(monster, obj, &monster->t_newpos, WS_PARALYZE, 0);
        !           166:            obj->o_charges = 0;
        !           167:
        !           168:        when ASMO_ROD: {
        !           169:            char *name;
        !           170:
        !           171:            switch (rnd(3)) { /* Select a function */
        !           172:                case 0:    name = "lightning bolt";
        !           173:                when 1:    name = "flame";
        !           174:                otherwise: name = "ice";
        !           175:            }
        !           176:            shoot_bolt( monster,
        !           177:                        monster->t_pos,
        !           178:                        monster->t_newpos,
        !           179:                        FALSE,
        !           180:                        monster->t_index,
        !           181:                        name,
        !           182:                        roll(monster->t_stats.s_lvl,6));
        !           183:            monster->t_artifact /= 2;
        !           184:        }
        !           185:        when BRIAN_MANDOLIN:
        !           186:            /* Make sure the defendant is still around */
        !           187:            if (DISTANCE(monster->t_pos.y, monster->t_pos.x,
        !           188:                         hero.y, hero.x) < 25) {
        !           189:                if (!save(VS_MAGIC, &player, -4) &&
        !           190:                    !ISWEARING(R_ALERT)) {
        !           191:                    msg("Some beautiful music enthralls you.");
        !           192:                    player.t_no_move += movement(&player) * FREEZETIME;
        !           193:                    player.t_action = A_FREEZE;
        !           194:                    monster->t_artifact = monster->t_artifact * 2 / 3;
        !           195:                }
        !           196:                else {
        !           197:                    msg("You wince at a sour note.");
        !           198:                    monster->t_artifact /= 3;
        !           199:                }
        !           200:            }
        !           201:        when GERYON_HORN:
        !           202:            /* Make sure the defendant is still around */
        !           203:            if (DISTANCE(monster->t_pos.y, monster->t_pos.x,
        !           204:                         hero.y, hero.x) < 25) {
        !           205:                if (!ISWEARING(R_HEROISM) &&
        !           206:                    !save(VS_MAGIC, &player, -4)) {
        !           207:                        turn_on(player, ISFLEE);
        !           208:                        player.t_dest = &monster->t_pos;
        !           209:                        msg("A shrill blast terrifies you.");
        !           210:                        monster->t_artifact = monster->t_artifact * 3 / 4;
        !           211:                }
        !           212:                else  {
        !           213:                    msg("A shrill blast sends chills up your spine.");
        !           214:                    monster->t_artifact /= 3;
        !           215:                }
        !           216:            }
        !           217:
        !           218:        otherwise:
        !           219:            /* Unknown RELIC! */
        !           220:            debug("Unknown wielded relic %d", obj->o_which);
        !           221:     }
        !           222:     else debug("Declared relic is %d", obj->o_type);
        !           223:
        !           224:     turn_off(*monster, CANSURPRISE);
        !           225:     /* Reset the monsters actions */
        !           226:     monster->t_action = A_NIL;
        !           227:     monster->t_using = NULL;
        !           228: }
        !           229:  
        !           230: /*
        !           231:  * add something to the contents of something else
        !           232:  * bag: the holder of the items
        !           233:  * item: the item to put inside
        !           234:  */
        !           235: void
        !           236: put_contents(struct object *bag, struct linked_list *item)
        !           237: {
        !           238:     register struct linked_list *titem;
        !           239:     register struct object *tobj;
        !           240:
        !           241:     bag->o_ac++;
        !           242:     tobj = OBJPTR(item);
        !           243:     for (titem = bag->contents; titem != NULL; titem = next(titem)) {
        !           244:        if ((OBJPTR(titem))->o_which == tobj->o_which)
        !           245:            break;
        !           246:     }
        !           247:     if (titem == NULL) {       /* if not a duplicate put at beginning */
        !           248:        attach(bag->contents, item);
        !           249:     }
        !           250:     else {
        !           251:        item->l_prev = titem;
        !           252:        item->l_next = titem->l_next;
        !           253:        if (next(titem) != NULL)
        !           254:            (titem->l_next)->l_prev = item;
        !           255:        titem->l_next = item;
        !           256:     }
        !           257: }
        !           258: 
        !           259: /*
        !           260:  * remove something from something else
        !           261:  * bag: the holder of the items
        !           262:  */
        !           263: void
        !           264: take_contents(struct object *bag, struct linked_list *item)
        !           265: {
        !           266:
        !           267:     if (bag->o_ac <= 0) {
        !           268:        msg("Nothing to take out");
        !           269:        return;
        !           270:     }
        !           271:     bag->o_ac--;
        !           272:     detach(bag->contents, item);
        !           273:     if (!add_pack(item, FALSE, NULL))
        !           274:        put_contents(bag, item);
        !           275: }
        !           276:
        !           277: 
        !           278: void
        !           279: do_bag(struct linked_list *item)
        !           280: {
        !           281:
        !           282:     register struct linked_list *titem = NULL;
        !           283:     register struct object *obj, *tobj;
        !           284:     bool doit = TRUE;
        !           285:
        !           286:     obj = OBJPTR(item);
        !           287:     while (doit) {
        !           288:        msg("What do you want to do? (* for a list): ");
        !           289:        mpos = 0;
        !           290:        switch (readchar()) {
        !           291:            case EOF:
        !           292:            case ESCAPE:
        !           293:                msg ("");
        !           294:                doit = FALSE;
        !           295:            when '1':
        !           296:                inventory(obj->contents, ALL);
        !           297:
        !           298:            when '2':
        !           299:                if (obj->o_ac >= MAXCONTENTS) {
        !           300:                    msg("the %s is full", m_magic[obj->o_which].mi_name);
        !           301:                    break;
        !           302:                }
        !           303:                switch (obj->o_which) {
        !           304:                case MM_BEAKER:
        !           305:                    titem = get_item(pack, "put in", POTION, FALSE, FALSE);
        !           306:                when MM_BOOK:
        !           307:                    titem = get_item(pack, "put in", SCROLL, FALSE, FALSE);
        !           308:                }
        !           309:                if (titem == NULL)
        !           310:                    break;
        !           311:                detach(pack, titem);
        !           312:                inpack--;
        !           313:                put_contents(obj, titem);
        !           314:
        !           315:            when '3':
        !           316:                titem = get_item(obj->contents,"take out",ALL,FALSE,FALSE);
        !           317:                if (titem == NULL)
        !           318:                    break;
        !           319:                take_contents(obj, titem);
        !           320:
        !           321:            when '4':
        !           322:                switch (obj->o_which) {
        !           323:                case MM_BEAKER:
        !           324:                    titem = get_item(obj->contents,"quaff",ALL,FALSE,FALSE);
        !           325:                    if (titem == NULL)
        !           326:                        break;
        !           327:                    tobj = OBJPTR(titem);
        !           328:                    obj->o_ac--;
        !           329:                    detach(obj->contents, titem);
        !           330:                    quaff(tobj->o_which,
        !           331:                          tobj->o_kind,
        !           332:                          tobj->o_flags,
        !           333:                          TRUE);
        !           334:                    if (p_know[tobj->o_which] && p_guess[tobj->o_which])
        !           335:                    {
        !           336:                        free(p_guess[tobj->o_which]);
        !           337:                        p_guess[tobj->o_which] = NULL;
        !           338:                    }
        !           339:                    else if (!p_know[tobj->o_which]             &&
        !           340:                             askme                              &&
        !           341:                             (tobj->o_flags & ISKNOW) == 0      &&
        !           342:                             (tobj->o_flags & ISPOST) == 0      &&
        !           343:                             p_guess[tobj->o_which] == NULL) {
        !           344:                        nameitem(titem, FALSE);
        !           345:                    }
        !           346:                    o_discard(titem);
        !           347:                when MM_BOOK:
        !           348:                    if (on(player, ISBLIND)) {
        !           349:                        msg("You can't see to read anything");
        !           350:                        break;
        !           351:                    }
        !           352:                    titem = get_item(obj->contents,"read",ALL,FALSE,FALSE);
        !           353:                    if (titem == NULL)
        !           354:                        break;
        !           355:                    tobj = OBJPTR(titem);
        !           356:                    obj->o_ac--;
        !           357:                    detach(obj->contents, titem);
        !           358:                    read_scroll(tobj->o_which,
        !           359:                                tobj->o_flags & (ISCURSED|ISBLESSED),
        !           360:                                TRUE);
        !           361:                    if (s_know[tobj->o_which] && s_guess[tobj->o_which])
        !           362:                    {
        !           363:                        free(s_guess[tobj->o_which]);
        !           364:                        s_guess[tobj->o_which] = NULL;
        !           365:                    }
        !           366:                    else if (!s_know[tobj->o_which]             &&
        !           367:                             askme                              &&
        !           368:                             (tobj->o_flags & ISKNOW) == 0      &&
        !           369:                             (tobj->o_flags & ISPOST) == 0      &&
        !           370:                             s_guess[tobj->o_which] == NULL) {
        !           371:                        nameitem(titem, FALSE);
        !           372:                    }
        !           373:                    o_discard(titem);
        !           374:                }
        !           375:                doit = FALSE;
        !           376:
        !           377:            otherwise:
        !           378:                wclear(hw);
        !           379:                touchwin(hw);
        !           380:                mvwaddstr(hw,0,0,"The following operations are available:");
        !           381:                mvwaddstr(hw,2,0,"[1]\tInventory\n");
        !           382:                wprintw(hw,"[2]\tPut something in the %s\n",
        !           383:                        m_magic[obj->o_which].mi_name);
        !           384:                wprintw(hw,"[3]\tTake something out of the %s\n",
        !           385:                        m_magic[obj->o_which].mi_name);
        !           386:                switch(obj->o_which) {
        !           387:                    case MM_BEAKER: waddstr(hw,"[4]\tQuaff a potion\n");
        !           388:                    when MM_BOOK:   waddstr(hw,"[4]\tRead a scroll\n");
        !           389:                }
        !           390:                waddstr(hw,"[ESC]\tLeave this menu\n");
        !           391:                mvwaddstr(hw, lines-1, 0, spacemsg);
        !           392:                draw(hw);
        !           393:                wait_for (' ');
        !           394:                clearok(cw, TRUE);
        !           395:                touchwin(cw);
        !           396:        }
        !           397:     }
        !           398: }
        !           399: 
        !           400: /* who: Kind of monster to panic (all if who is NULL) */
        !           401: void
        !           402: do_panic(int who)
        !           403: {
        !           404:     register int x,y;
        !           405:     register struct linked_list *mon, *item;
        !           406:     register struct thing *th;
        !           407:
        !           408:     for (x = hero.x-2; x <= hero.x+2; x++) {
        !           409:        for (y = hero.y-2; y <= hero.y+2; y++) {
        !           410:            if (y < 1 || x < 0 || y > lines - 3  || x > cols - 1)
        !           411:                continue;
        !           412:            if (isalpha(mvwinch(mw, y, x))) {
        !           413:                if ((mon = find_mons(y, x)) != NULL) {
        !           414:                    th = THINGPTR(mon);
        !           415:
        !           416:                    /* Is this the right kind of monster to panic? */
        !           417:                    if (who && th->t_index != who) continue;
        !           418:
        !           419:                    if (who ||
        !           420:                        (!on(*th, ISUNDEAD) && !save(VS_MAGIC, th, 0) && off(*th, WASTURNED))) {
        !           421:                        msg("%s %s.", prname(monster_name(th), TRUE),
        !           422:                            terse ? "panics" : "turns to run in panic");
        !           423:
        !           424:                        turn_on(*th, ISFLEE);
        !           425:                        turn_on(*th, WASTURNED);
        !           426:                        turn_off(*th, CANSURPRISE);
        !           427:
        !           428:                        /* Disrupt what it was doing */
        !           429:                        dsrpt_monster(th, TRUE, TRUE);
        !           430:
        !           431:                        /* If monster was suffocating, stop it */
        !           432:                        if (on(*th, DIDSUFFOCATE)) {
        !           433:                            turn_off(*th, DIDSUFFOCATE);
        !           434:                            extinguish(suffocate);
        !           435:                        }
        !           436:
        !           437:                        /* If monster held us, stop it */
        !           438:                        if (on(*th, DIDHOLD) && (--hold_count == 0))
        !           439:                                turn_off(player, ISHELD);
        !           440:                        turn_off(*th, DIDHOLD);
        !           441:
        !           442:                        /*
        !           443:                         * if he has something he might drop it
        !           444:                         */
        !           445:                        if ((item = th->t_pack) != NULL         &&
        !           446:                            (OBJPTR(item))->o_type != RELIC     &&
        !           447:                            rnd(100) < 50) {
        !           448:                                detach(th->t_pack, item);
        !           449:                                fall(item, FALSE);
        !           450:                        }
        !           451:
        !           452:                        /* It is okay to turn tail */
        !           453:                        th->t_oldpos = th->t_pos;
        !           454:                    }
        !           455:                    runto(th, &hero);
        !           456:                }
        !           457:            }
        !           458:        }
        !           459:     }
        !           460: }
        !           461: 
        !           462: /*
        !           463:  * print miscellaneous magic bonuses
        !           464:  */
        !           465: char *
        !           466: misc_name(struct object *obj)
        !           467: {
        !           468:     static char buf[LINELEN];
        !           469:     char buf1[LINELEN];
        !           470:
        !           471:     buf[0] = '\0';
        !           472:     buf1[0] = '\0';
        !           473:     if (!(obj->o_flags & ISKNOW))
        !           474:        return (m_magic[obj->o_which].mi_name);
        !           475:     switch (obj->o_which) {
        !           476:        case MM_BRACERS:
        !           477:        case MM_PROTECT:
        !           478:            strcat(buf, num(obj->o_ac, 0));
        !           479:            strcat(buf, " ");
        !           480:     }
        !           481:     switch (obj->o_which) {
        !           482:        case MM_G_OGRE:
        !           483:        case MM_G_DEXTERITY:
        !           484:        case MM_JEWEL:
        !           485:        case MM_STRANGLE:
        !           486:        case MM_R_POWERLESS:
        !           487:        case MM_DANCE:
        !           488:            if (obj->o_flags & ISCURSED)
        !           489:                strcat(buf, "cursed ");
        !           490:     }
        !           491:     strcat(buf, m_magic[obj->o_which].mi_name);
        !           492:     switch (obj->o_which) {
        !           493:        case MM_JUG:
        !           494:            if (obj->o_ac == JUG_EMPTY)
        !           495:                strcat(buf1, " [empty]");
        !           496:            else if (p_know[obj->o_ac])
        !           497:                sprintf(buf1, " [containing a potion of %s (%s)]",
        !           498:                        p_magic[obj->o_ac].mi_name,
        !           499:                        p_colors[obj->o_ac]);
        !           500:            else sprintf(buf1, " [containing a%s %s liquid]",
        !           501:                        vowelstr(p_colors[obj->o_ac]),
        !           502:                        p_colors[obj->o_ac]);
        !           503:        when MM_BEAKER:
        !           504:        case MM_BOOK: {
        !           505:            sprintf(buf1, " [containing %d]", obj->o_ac);
        !           506:        }
        !           507:        when MM_OPEN:
        !           508:        case MM_HUNGER:
        !           509:            sprintf(buf1, " [%d ring%s]", obj->o_charges,
        !           510:                          obj->o_charges == 1 ? "" : "s");
        !           511:        when MM_DRUMS:
        !           512:            sprintf(buf1, " [%d beat%s]", obj->o_charges,
        !           513:                          obj->o_charges == 1 ? "" : "s");
        !           514:        when MM_DISAPPEAR:
        !           515:        case MM_CHOKE:
        !           516:            sprintf(buf1, " [%d pinch%s]", obj->o_charges,
        !           517:                          obj->o_charges == 1 ? "" : "es");
        !           518:        when MM_KEOGHTOM:
        !           519:            sprintf(buf1, " [%d application%s]", obj->o_charges,
        !           520:                          obj->o_charges == 1 ? "" : "s");
        !           521:        when MM_SKILLS:
        !           522:            sprintf(buf1, " [%s]", char_class[obj->o_ac].name);
        !           523:     }
        !           524:     strcat (buf, buf1);
        !           525:     return buf;
        !           526: }
        !           527: 
        !           528: void
        !           529: use_emori(void)
        !           530: {
        !           531:     char selection;    /* Cloak function */
        !           532:     int state = 0;     /* Menu state */
        !           533:
        !           534:     msg("What do you want to do? (* for a list): ");
        !           535:     do {
        !           536:        selection = tolower(readchar());
        !           537:        switch (selection) {
        !           538:            case '*':
        !           539:              if (state != 1) {
        !           540:                wclear(hw);
        !           541:                touchwin(hw);
        !           542:                mvwaddstr(hw, 2, 0,  "[1] Fly\n[2] Stop flying\n");
        !           543:                waddstr(hw,          "[3] Turn invisible\n[4] Turn Visible\n");
        !           544:                mvwaddstr(hw, 0, 0, "What do you want to do? ");
        !           545:                draw(hw);
        !           546:                state = 1;      /* Now in prompt window */
        !           547:              }
        !           548:              break;
        !           549:
        !           550:            case ESCAPE:
        !           551:                if (state == 1) {
        !           552:                    clearok(cw, TRUE); /* Set up for redraw */
        !           553:                    touchwin(cw);
        !           554:                }
        !           555:                msg("");
        !           556:
        !           557:                after = FALSE;
        !           558:                return;
        !           559:
        !           560:            when '1':
        !           561:            case '2':
        !           562:            case '3':
        !           563:            case '4':
        !           564:                if (state == 1) {       /* In prompt window */
        !           565:                    clearok(cw, TRUE); /* Set up for redraw */
        !           566:                    touchwin(cw);
        !           567:                }
        !           568:
        !           569:                msg("");
        !           570:
        !           571:                state = 2;      /* Finished */
        !           572:                break;
        !           573:
        !           574:            default:
        !           575:                if (state == 1) {       /* In the prompt window */
        !           576:                    mvwaddstr(hw, 0, 0,
        !           577:                                "Please enter a selection between 1 and 4:  ");
        !           578:                    draw(hw);
        !           579:                }
        !           580:                else {  /* Normal window */
        !           581:                    mpos = 0;
        !           582:                    msg("Please enter a selection between 1 and 4:  ");
        !           583:                }
        !           584:        }
        !           585:     } while (state != 2);
        !           586:
        !           587:     /* We now must have a selection between 1 and 4 */
        !           588:     switch (selection) {
        !           589:        case '1':       /* Fly */
        !           590:            if (on(player, ISFLY)) {
        !           591:                extinguish(land);       /* Extinguish in case of potion */
        !           592:                msg("%slready flying.", terse ? "A" : "You are a");
        !           593:            }
        !           594:            else {
        !           595:                msg("You feel lighter than air!");
        !           596:                turn_on(player, ISFLY);
        !           597:            }
        !           598:        when '2':       /* Stop flying */
        !           599:            if (off(player, ISFLY))
        !           600:                msg("%sot flying.", terse ? "N" : "You are n");
        !           601:            else {
        !           602:                if (find_slot(land))
        !           603:                    msg("%sot flying by the cloak.",
        !           604:                        terse ? "N" : "You are n");
        !           605:                else land();
        !           606:            }
        !           607:        when '3':       /* Turn invisible */
        !           608:            if (off(player, ISINVIS)) {
        !           609:                turn_on(player, ISINVIS);
        !           610:                msg("You have a tingling feeling all over your body");
        !           611:                PLAYER = IPLAYER;
        !           612:                light(&hero);
        !           613:            }
        !           614:            else {
        !           615:                extinguish(appear);     /* Extinguish in case of potion */
        !           616:                extinguish(dust_appear);/* dust of disappearance        */
        !           617:                msg("%slready invisible.", terse ? "A" : "You are a");
        !           618:            }
        !           619:        when '4':       /* Turn visible */
        !           620:            if (off(player, ISINVIS))
        !           621:                msg("%sot invisible.", terse ? "N" : "You are n");
        !           622:            else {
        !           623:                if (find_slot(appear) || find_slot(dust_appear))
        !           624:                    msg("%sot invisible by the cloak.",
        !           625:                        terse ? "N" : "You are n");
        !           626:                else appear();
        !           627:            }
        !           628:     }
        !           629: }
        !           630: 
        !           631: #ifdef PC7300
        !           632: static menu_t Display;                         /* The menu structure */
        !           633: static mitem_t Dispitems[MAXQUILL+1];          /* Info for each line */
        !           634: static char Displines[MAXQUILL+1][LINELEN+1];  /* The lines themselves */
        !           635: #endif
        !           636: /*
        !           637:  * try to write a scroll with the quill of Nagrom
        !           638:  */
        !           639: void
        !           640: use_quill(struct object *obj)
        !           641: {
        !           642:     struct linked_list *item;
        !           643:     register int       i,
        !           644:                        scroll_ability;
        !           645:     int                        which_scroll,
        !           646:                        curlen,
        !           647:                        maxlen,
        !           648:                        dummy;
        !           649:     bool               nohw = FALSE;
        !           650:
        !           651:     i = which_scroll = 0;
        !           652:     scroll_ability = obj->o_charges;
        !           653:
        !           654:     /* Prompt for scrolls */
        !           655:     msg("Which scroll are you writing? (* for list): ");
        !           656:
        !           657:     which_scroll = (int) (readchar() - 'a');
        !           658:     if (which_scroll == (int) ESCAPE - (int) 'a') {
        !           659:        mpos = 0;
        !           660:        msg("");
        !           661:        after = FALSE;
        !           662:        return;
        !           663:     }
        !           664:     if (which_scroll >= 0 && which_scroll < MAXQUILL) nohw = TRUE;
        !           665:
        !           666:     else if (slow_invent) {
        !           667:        register char c;
        !           668:
        !           669:        nohw = TRUE;
        !           670:        do {
        !           671:            for (i=0; i<MAXQUILL; i++) {
        !           672:                msg("");
        !           673:                mvwaddch(msgw, 0, 0, '[');
        !           674:                waddch(msgw, (char) ((int) 'a' + i));
        !           675:                waddstr(msgw, "] A scroll of ");
        !           676:                waddstr(msgw, s_magic[quill_scrolls[i].s_which].mi_name);
        !           677:                waddstr(msgw, morestr);
        !           678:                clearok(msgw, FALSE);
        !           679:                draw(msgw);
        !           680:                do {
        !           681:                    c = readchar();
        !           682:                } while (c != ' ' && c != ESCAPE);
        !           683:                if (c == ESCAPE)
        !           684:                    break;
        !           685:            }
        !           686:            msg("");
        !           687:            mvwaddstr(msgw, 0, 0, "Which scroll are you writing? ");
        !           688:            clearok(msgw, FALSE);
        !           689:            draw(msgw);
        !           690:
        !           691:            which_scroll = (int) (readchar() - 'a');
        !           692:        } while (which_scroll != (int) (ESCAPE - 'a') &&
        !           693:                 (which_scroll < 0 || which_scroll >= MAXQUILL));
        !           694:
        !           695:        if (which_scroll == (int) (ESCAPE - 'a')) {
        !           696:            mpos = 0;
        !           697:            msg("");
        !           698:            after = FALSE;
        !           699:            return;
        !           700:        }
        !           701:     }
        !           702:     else {
        !           703:        /* Now display the possible scrolls */
        !           704:        wclear(hw);
        !           705:        touchwin(hw);
        !           706:        mvwaddstr(hw, 2, 0, "   Cost            Scroll");
        !           707:        mvwaddstr(hw, 3, 0,
        !           708:                "-----------------------------------------------");
        !           709:        maxlen = 47;    /* Maximum width of header */
        !           710:
        !           711:        for (i=0; i<MAXQUILL; i++) {
        !           712:            wmove(hw, i+4, 0);
        !           713:            sprintf(prbuf, "[%c]        %3d     A scroll of %s",
        !           714:                    (char) ((int) 'a' + i),
        !           715:                    quill_scrolls[i].s_cost,
        !           716:                    s_magic[quill_scrolls[i].s_which].mi_name);
        !           717: #ifdef PC7300
        !           718:            /* Put it into the PC menu display */
        !           719:            strcpy(Displines[i], prbuf);
        !           720:            Dispitems[i].mi_name = Displines[i];
        !           721:            Dispitems[i].mi_flags = 0;
        !           722:            Dispitems[i].mi_val = i;
        !           723: #endif
        !           724:            waddstr(hw, prbuf);
        !           725:
        !           726:            /* Get the length of the line */
        !           727:            getyx(hw, dummy, curlen);
        !           728:            if (maxlen < curlen) maxlen = curlen;
        !           729:        }
        !           730:
        !           731:        sprintf(prbuf, "[Current scroll power = %d]", scroll_ability);
        !           732:        mvwaddstr(hw, 0, 0, prbuf);
        !           733:        waddstr(hw, " Which scroll are you writing? ");
        !           734:        getyx(hw, dummy, curlen);
        !           735:        if (maxlen < curlen) maxlen = curlen;
        !           736:
        !           737: #ifdef PC7300
        !           738:        /* Place an end marker for the items */
        !           739:        Dispitems[MAXQUILL].mi_name = 0;
        !           740:
        !           741:        /* Design prompts */
        !           742:        sprintf(prbuf, "Current scroll power is %d", scroll_ability);
        !           743:
        !           744:        /* Set up the main menu structure */
        !           745:        Display.m_label = prbuf;
        !           746:        Display.m_title = "     Cost            Scroll";
        !           747:        Display.m_prompt = "Select a scroll or press Cancl to continue.";
        !           748:        Display.m_curptr = '\0';
        !           749:        Display.m_markptr = '\0';
        !           750:        Display.m_flags = M_ASISTITLE;
        !           751:        Display.m_selcnt = 1;
        !           752:        Display.m_items = Dispitems;
        !           753:        Display.m_curi = 0;
        !           754:
        !           755:        /*
        !           756:         * Try to display the menu.  If we don't have a local terminal,
        !           757:         * the call will fail and we will just continue with the
        !           758:         * normal mode.
        !           759:         */
        !           760:        if (menu(&Display) >= 0) {
        !           761:            if (Display.m_selcnt == 0) {
        !           762:                /* Menu was cancelled */
        !           763:                after = FALSE;
        !           764:                return FALSE;   /* all done if abort */
        !           765:            }
        !           766:            else which_scroll = (int) Display.m_curi->mi_val;
        !           767:            goto got_scroll;
        !           768:        }
        !           769: #endif
        !           770:        /* Should we overlay? */
        !           771:        if (menu_overlay && MAXQUILL + 3 < lines / 2) {
        !           772:            over_win(cw, hw, MAXQUILL + 5, maxlen + 3, 0, curlen, '\0');
        !           773:        }
        !           774:        else draw(hw);
        !           775:     }
        !           776:
        !           777:     if (!nohw) {
        !           778:        which_scroll = (int) (readchar() - 'a');
        !           779:        while (which_scroll < 0 || which_scroll >= MAXQUILL) {
        !           780:            if (which_scroll == (int) ESCAPE - (int) 'a') {
        !           781:                after = FALSE;
        !           782:
        !           783:                /* Restore the screen */
        !           784:                touchwin(cw);
        !           785:                if (MAXQUILL + 3 < lines / 2) clearok(cw, FALSE);
        !           786:                else {
        !           787:                    msg("");
        !           788:                    clearok(cw, TRUE);
        !           789:                }
        !           790:                return;
        !           791:            }
        !           792:            wmove(hw, 0, 0);
        !           793:            wclrtoeol(hw);
        !           794:            waddstr(hw, "Please enter one of the listed scrolls. ");
        !           795:            getyx(hw, dummy, curlen);
        !           796:            if (maxlen < curlen) maxlen = curlen;
        !           797:
        !           798:            /* Should we overlay? */
        !           799:            if (menu_overlay && MAXQUILL + 3 < lines / 2) {
        !           800:                over_win(cw, hw, MAXQUILL + 5, maxlen + 3,
        !           801:                            0, curlen, '\0');
        !           802:            }
        !           803:            else draw(hw);
        !           804:
        !           805:            which_scroll = (int) (readchar() - 'a');
        !           806:        }
        !           807:     }
        !           808:
        !           809:     /* Now restore the screen if we have to */
        !           810:     if (!nohw) {
        !           811:        touchwin(cw);
        !           812:        if (MAXQUILL + 3 < lines / 2) clearok(cw, FALSE);
        !           813:        else {
        !           814:            msg("");
        !           815:            clearok(cw, TRUE);
        !           816:        }
        !           817:     }
        !           818:     else msg("");
        !           819:
        !           820:
        !           821: #ifdef PC7300
        !           822: got_scroll:
        !           823: #endif
        !           824:     /* We've waited our required time. */
        !           825:     player.t_using = NULL;
        !           826:     player.t_action = A_NIL;
        !           827:
        !           828:     if (quill_scrolls[which_scroll].s_cost > scroll_ability) {
        !           829:        msg("Your attempt fails.");
        !           830:        return;
        !           831:     }
        !           832:
        !           833:     obj->o_charges -= quill_scrolls[which_scroll].s_cost;
        !           834:     item = spec_item(SCROLL, quill_scrolls[which_scroll].s_which, 0, 0);
        !           835:     if (add_pack(item, FALSE, NULL) == FALSE) {
        !           836:        (OBJPTR(item))->o_pos = hero;
        !           837:        fall(item, TRUE);
        !           838:     }
        !           839: }
        !           840: 
        !           841: void
        !           842: use_mm(int which)
        !           843: {
        !           844:     register struct object *obj = NULL;
        !           845:     register struct linked_list *item = NULL;
        !           846:     bool cursed, blessed, is_mm;
        !           847:
        !           848:     cursed = FALSE;
        !           849:     is_mm = FALSE;
        !           850:
        !           851:     if (which < 0) {   /* A real miscellaneous magic item  */
        !           852:        /* This is miscellaneous magic.  It takes 3 movement periods to use */
        !           853:        if (player.t_action != C_USE) {
        !           854:            int units;  /* Number of movement units for the item */
        !           855:
        !           856:            item = get_item(pack, "use", USEABLE, FALSE, FALSE);
        !           857:
        !           858:            /*
        !           859:             * Make certain that it is a micellaneous magic item
        !           860:             */
        !           861:            if (item == NULL)
        !           862:                return;
        !           863:
        !           864:            units = usage_time(item);
        !           865:            if (units < 0) return;
        !           866:
        !           867:            player.t_using = item;      /* Remember what it is */
        !           868:            player.t_action = C_USE;    /* We are quaffing */
        !           869:            player.t_no_move = units * movement(&player);
        !           870:            return;
        !           871:        }
        !           872:
        !           873:        /* We have waited our time, let's use the item */
        !           874:        item = player.t_using;
        !           875:        player.t_using = NULL;
        !           876:        player.t_action = A_NIL;
        !           877:
        !           878:        is_mm = TRUE;
        !           879:
        !           880:        obj = OBJPTR(item);
        !           881:        cursed = (obj->o_flags & ISCURSED) != 0;
        !           882:        blessed = (obj->o_flags & ISBLESSED) != 0;
        !           883:        which = obj->o_which;
        !           884:     }
        !           885:
        !           886:     if (obj->o_type == POTION) {               /* An potion */
        !           887:        is_mm = FALSE;
        !           888:        inpack--;
        !           889:        detach (pack, item);
        !           890:        switch (obj->o_which) {
        !           891:            case P_POISON:
        !           892:                if (cur_weapon) {
        !           893:                    if (cur_weapon->o_type == RELIC) {
        !           894:                        msg("The poison burns off %s",
        !           895:                            inv_name(cur_weapon,FALSE));
        !           896:                    }
        !           897:                    else {
        !           898:                        cur_weapon->o_flags |= ISPOISON;
        !           899:                        msg("Your weapon has %s gooey stuff on it",
        !           900:                            p_colors[cur_weapon->o_which]);
        !           901:                    }
        !           902:                }
        !           903:                else
        !           904:                    msg("The poison pours on the floor and disappears!");
        !           905:        }
        !           906:        o_discard(item);
        !           907:     }
        !           908:     else if (obj->o_type == RELIC) {           /* An artifact */
        !           909:        is_mm = FALSE;
        !           910:        switch (obj->o_which) {
        !           911:            case EMORI_CLOAK:
        !           912:                use_emori();
        !           913:            when QUILL_NAGROM:
        !           914:                use_quill(obj);
        !           915:            when BRIAN_MANDOLIN:
        !           916:                /* Put monsters around us to sleep */
        !           917:                read_scroll(S_HOLD, 0, FALSE);
        !           918:            when GERYON_HORN:
        !           919:                /* Chase close monsters away */
        !           920:                msg("The horn blasts a shrill tone.");
        !           921:                do_panic(0);
        !           922:            when HEIL_ANKH:
        !           923:            case YENDOR_AMULET:
        !           924:            case STONEBONES_AMULET:
        !           925:                /* Nothing happens by this mode */
        !           926:                msg("Nothing happens.");
        !           927:            when EYE_VECNA:
        !           928:                msg("The pain subsides...");
        !           929:            when SURTUR_RING:
        !           930:                /* Panic fire giants */
        !           931:                do_panic(findmindex("fire giant"));
        !           932:        }
        !           933:     }
        !           934:     else switch (which) {              /* Miscellaneous Magic */
        !           935:        /*
        !           936:         * the jug of alchemy manufactures potions when you drink
        !           937:         * the potion it will make another after a while
        !           938:         */
        !           939:        case MM_JUG:
        !           940:            if (obj->o_ac == JUG_EMPTY) {
        !           941:                msg("The jug is empty");
        !           942:                break;
        !           943:            }
        !           944:            quaff (obj->o_ac, 0, 0, FALSE);
        !           945:            obj->o_ac = JUG_EMPTY;
        !           946:            fuse (alchemy, obj, ALCHEMYTIME, AFTER);
        !           947:            if (!(obj->o_flags & ISKNOW))
        !           948:                whatis(item);
        !           949:
        !           950:        /*
        !           951:         * the beaker of plentiful potions is used to hold potions
        !           952:         * the book of infinite spells is used to hold scrolls
        !           953:         */
        !           954:        when MM_BEAKER:
        !           955:        case MM_BOOK:
        !           956:            do_bag(item);
        !           957:
        !           958:        /*
        !           959:         * the chime of opening opens up secret doors
        !           960:         */
        !           961:        when MM_OPEN:
        !           962:        {
        !           963:            register struct linked_list *exit;
        !           964:            register struct room *rp;
        !           965:            register coord *cp;
        !           966:
        !           967:            if (obj->o_charges <= 0) {
        !           968:                msg("The chime is cracked!");
        !           969:                break;
        !           970:            }
        !           971:            obj->o_charges--;
        !           972:            msg("chime... chime... hime... ime... me... e...");
        !           973:            if ((rp = roomin(&hero)) == NULL) {
        !           974:                search(FALSE, TRUE); /* Non-failing search for door */
        !           975:                break;
        !           976:            }
        !           977:            for (exit = rp->r_exit; exit != NULL; exit = next(exit)) {
        !           978:                cp = DOORPTR(exit);
        !           979:                if (winat(cp->y, cp->x) == SECRETDOOR) {
        !           980:                    mvaddch (cp->y, cp->x, DOOR);
        !           981:                    if (cansee (cp->y, cp->x))
        !           982:                        mvwaddch(cw, cp->y, cp->x, DOOR);
        !           983:                }
        !           984:            }
        !           985:        }
        !           986:
        !           987:        /*
        !           988:         * the chime of hunger just makes the hero hungry
        !           989:         */
        !           990:        when MM_HUNGER:
        !           991:            if (obj->o_charges <= 0) {
        !           992:                msg("The chime is cracked!");
        !           993:                break;
        !           994:            }
        !           995:            obj->o_charges--;
        !           996:            if (food_left >= MORETIME + 5) {
        !           997:                food_left = MORETIME + 5;
        !           998:                msg(terse? "Getting hungry" : "You are starting to get hungry");
        !           999:                hungry_state = F_HUNGRY;
        !          1000:            }
        !          1001:            aggravate(TRUE, TRUE);
        !          1002:
        !          1003:        /*
        !          1004:         * the drums of panic make all creatures within two squares run
        !          1005:         * from the hero in panic unless they save or they are mindless
        !          1006:         * undead
        !          1007:         */
        !          1008:        when MM_DRUMS:
        !          1009:            if (obj->o_charges <= 0) {
        !          1010:                msg("The drum is broken!");
        !          1011:                break;
        !          1012:            }
        !          1013:            obj->o_charges--;
        !          1014:            do_panic(0);
        !          1015:        /*
        !          1016:         * dust of disappearance makes the player invisible for a while
        !          1017:         */
        !          1018:        when MM_DISAPPEAR:
        !          1019:            m_know[MM_DISAPPEAR] = TRUE;
        !          1020:            if (obj->o_charges <= 0) {
        !          1021:                msg("No more dust!");
        !          1022:                break;
        !          1023:            }
        !          1024:            obj->o_charges--;
        !          1025:            msg("aaAAACHOOOooo. Cough. Cough. Sneeze. Sneeze.");
        !          1026:            if (!find_slot(dust_appear)) {
        !          1027:                turn_on(player, ISINVIS);
        !          1028:                fuse(dust_appear, NULL, DUSTTIME, AFTER);
        !          1029:                PLAYER = IPLAYER;
        !          1030:                light(&hero);
        !          1031:            }
        !          1032:            else lengthen(dust_appear, DUSTTIME);
        !          1033:
        !          1034:        /*
        !          1035:         * dust of choking and sneezing can kill the hero if he misses
        !          1036:         * the save
        !          1037:         */
        !          1038:        when MM_CHOKE:
        !          1039:            m_know[MM_CHOKE] = TRUE;
        !          1040:            if (obj->o_charges <= 0) {
        !          1041:                msg("No more dust!");
        !          1042:                break;
        !          1043:            }
        !          1044:            obj->o_charges--;
        !          1045:            msg("aaAAACHOOOooo. Cough. Cough. Sneeze. Sneeze.");
        !          1046:            if (!cur_relic[SURTUR_RING] && !save(VS_POISON, &player, 0)) {
        !          1047:                msg ("You choke to death!!! --More--");
        !          1048:                pstats.s_hpt = -1; /* in case he hangs up the phone */
        !          1049:                wait_for(' ');
        !          1050:                death(D_CHOKE);
        !          1051:            }
        !          1052:            else {
        !          1053:                msg("You begin to cough and choke uncontrollably");
        !          1054:                if (find_slot(unchoke))
        !          1055:                    lengthen(unchoke, DUSTTIME);
        !          1056:                else
        !          1057:                    fuse(unchoke, NULL, DUSTTIME, AFTER);
        !          1058:                turn_on(player, ISHUH);
        !          1059:                turn_on(player, ISBLIND);
        !          1060:                light(&hero);
        !          1061:            }
        !          1062:
        !          1063:        when MM_KEOGHTOM:
        !          1064:            /*
        !          1065:             * this is a very powerful healing ointment
        !          1066:             * but it takes a while to put on...
        !          1067:             */
        !          1068:            obj->o_charges--;
        !          1069:            if (on(player, HASDISEASE)) {
        !          1070:                extinguish(cure_disease);
        !          1071:                cure_disease();
        !          1072:                msg(terse ? "You feel yourself improving."
        !          1073:                          : "You begin to feel yourself improving again.");
        !          1074:            }
        !          1075:            if (on(player, HASINFEST)) {
        !          1076:                turn_off(player, HASINFEST);
        !          1077:                infest_dam = 0;
        !          1078:                msg(terse ? "You feel yourself improving."
        !          1079:                          : "You begin to feel yourself improving again.");
        !          1080:            }
        !          1081:            if (on(player, DOROT)) {
        !          1082:                msg("You feel your skin returning to normal.");
        !          1083:                turn_off(player, DOROT);
        !          1084:            }
        !          1085:            pstats.s_hpt += roll(pstats.s_lvl, 6);
        !          1086:            if (pstats.s_hpt > max_stats.s_hpt)
        !          1087:                pstats.s_hpt = max_stats.s_hpt;
        !          1088:            sight();
        !          1089:            msg("You begin to feel much better.");
        !          1090:
        !          1091:        /*
        !          1092:         * The book has a character class associated with it.
        !          1093:         * if your class matches that of the book, it will raise your
        !          1094:         * level by one. If your class does not match the one of the book,
        !          1095:         * it change your class to that of book.
        !          1096:         * Note that it takes a while to read.
        !          1097:         */
        !          1098:        when MM_SKILLS:
        !          1099:            detach (pack, item);
        !          1100:            inpack--;
        !          1101:            changeclass(obj->o_ac);
        !          1102:
        !          1103:        otherwise:
        !          1104:            msg("What a strange magic item you have!");
        !          1105:     }
        !          1106:     status(FALSE);
        !          1107:     if (is_mm && m_know[which] && m_guess[which]) {
        !          1108:        free(m_guess[which]);
        !          1109:        m_guess[which] = NULL;
        !          1110:     }
        !          1111:     else if (is_mm &&
        !          1112:             !m_know[which] &&
        !          1113:             askme &&
        !          1114:             (obj->o_flags & ISKNOW) == 0 &&
        !          1115:             m_guess[which] == NULL) {
        !          1116:        nameitem(item, FALSE);
        !          1117:     }
        !          1118:     if (item != NULL && which == MM_SKILLS)
        !          1119:        o_discard(item);
        !          1120:     updpack(TRUE, &player);
        !          1121: }
        !          1122: 
        !          1123: /*
        !          1124:  * usage_time:
        !          1125:  *     Return how long it takes to use an item.  For now we only give time
        !          1126:  *     for MM, RELIC, SCROLL, and POTION items.
        !          1127:  */
        !          1128:
        !          1129: int
        !          1130: usage_time(struct linked_list *item)
        !          1131: {
        !          1132:     register struct object *obj;
        !          1133:     register int units = -1;
        !          1134:
        !          1135:     obj = OBJPTR(item);
        !          1136:     switch (obj->o_type) {
        !          1137:        case SCROLL:    units = 4;
        !          1138:        when POTION:    units = 3;
        !          1139:        when RELIC:                     /* An artifact */
        !          1140:            switch (obj->o_which) {
        !          1141:                case QUILL_NAGROM:      units = 2;
        !          1142:                when EMORI_CLOAK:       units = 2;
        !          1143:                when BRIAN_MANDOLIN:units = 4;
        !          1144:                when GERYON_HORN:       units = 3;
        !          1145:                when HEIL_ANKH:
        !          1146:                case YENDOR_AMULET:
        !          1147:                case STONEBONES_AMULET:
        !          1148:                                    units = 2;
        !          1149:                when EYE_VECNA:
        !          1150:                    /* Do some effects right away! */
        !          1151:                    units = 6;
        !          1152:
        !          1153:                    /* The eye will do nothing other than give a headache */
        !          1154:                    pstats.s_hpt -= 35;
        !          1155:                    msg("You feel a sudden shooting pain in your eye!");
        !          1156:                    if (pstats.s_hpt < 0) {
        !          1157:                        msg ("The pain is too much for you! -- More --");
        !          1158:                        wait_for(' ');
        !          1159:                        death(D_RELIC);
        !          1160:                    }
        !          1161:                when SURTUR_RING:
        !          1162:                    units = 3;
        !          1163:                    msg("Your nose tickles a bit.");
        !          1164:            }
        !          1165:        when MM:
        !          1166:            switch (obj->o_which) {     /* Miscellaneous Magic */
        !          1167:                case MM_JUG:
        !          1168:                    if (obj->o_ac == JUG_EMPTY) {
        !          1169:                        msg("The jug is empty");
        !          1170:                        return (-1);
        !          1171:                    }
        !          1172:                    units = 3;
        !          1173:                when MM_BEAKER:
        !          1174:                case MM_BOOK:
        !          1175:                    /* This is a strange case because it can go forever */
        !          1176:                    units = 1;
        !          1177:                when MM_OPEN:
        !          1178:                case MM_HUNGER:
        !          1179:                    /* Chimes */
        !          1180:                    units = 3;
        !          1181:                when MM_DRUMS:
        !          1182:                    units = 3;
        !          1183:                when MM_DISAPPEAR:
        !          1184:                case MM_CHOKE:
        !          1185:                    /* Dust */
        !          1186:                    units = 3;
        !          1187:                when MM_KEOGHTOM:
        !          1188:                    /* Ointment */
        !          1189:                    if (obj->o_charges <= 0) {
        !          1190:                        msg("The jar is empty!");
        !          1191:                        return (-1);
        !          1192:                    }
        !          1193:                    units = 5;
        !          1194:                when MM_SKILLS:
        !          1195:                    /* A whole book! */
        !          1196:                    units = 15;
        !          1197:                otherwise:
        !          1198:                    /* What is it? */
        !          1199:                    units = -1;
        !          1200:            }
        !          1201:        otherwise:      units = -1;
        !          1202:     }
        !          1203:
        !          1204:     return (units);
        !          1205: }

CVSweb