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

Annotation of early-roguelike/rogue5/things.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * Contains functions for dealing with things like potions, scrolls,
        !             3:  * and other items.
        !             4:  *
        !             5:  * @(#)things.c        4.53 (Berkeley) 02/05/99
        !             6:  *
        !             7:  * Rogue: Exploring the Dungeons of Doom
        !             8:  * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
        !             9:  * All rights reserved.
        !            10:  *
        !            11:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            12:  */
        !            13:
        !            14: #include <stdlib.h>
        !            15: #include <curses.h>
        !            16: #include <string.h>
        !            17: #include <ctype.h>
        !            18: #include "rogue.h"
        !            19:
        !            20: /*
        !            21:  * inv_name:
        !            22:  *     Return the name of something as it would appear in an
        !            23:  *     inventory.
        !            24:  */
        !            25: char *
        !            26: inv_name(const THING *obj, int drop)
        !            27: {
        !            28:     char *pb;
        !            29:     struct obj_info *op;
        !            30:     const char *sp;
        !            31:     int which;
        !            32:
        !            33:     pb = prbuf;
        !            34:     which = obj->o_which;
        !            35:     switch (obj->o_type)
        !            36:     {
        !            37:         case POTION:
        !            38:            nameit(obj, "potion", p_colors[which], &pot_info[which], nullstr);
        !            39:        when RING:
        !            40:            nameit(obj, "ring", r_stones[which], &ring_info[which], ring_num);
        !            41:        when STICK:
        !            42:            nameit(obj, ws_type[which], ws_made[which], &ws_info[which], charge_str);
        !            43:        when SCROLL:
        !            44:            if (obj->o_count == 1)
        !            45:            {
        !            46:                strcpy(pb, "A scroll ");
        !            47:                pb = &prbuf[9];
        !            48:            }
        !            49:            else
        !            50:            {
        !            51:                sprintf(pb, "%d scrolls ", obj->o_count);
        !            52:                pb = &prbuf[strlen(prbuf)];
        !            53:            }
        !            54:            op = &scr_info[which];
        !            55:            if (op->oi_know)
        !            56:                sprintf(pb, "of %s", op->oi_name);
        !            57:            else if (op->oi_guess)
        !            58:                sprintf(pb, "called %s", op->oi_guess);
        !            59:            else
        !            60:                sprintf(pb, "titled '%s'", s_names[which]);
        !            61:        when FOOD:
        !            62:            if (which == 1)
        !            63:                if (obj->o_count == 1)
        !            64:                    sprintf(pb, "A%s %s", vowelstr(fruit), fruit);
        !            65:                else
        !            66:                    sprintf(pb, "%d %ss", obj->o_count, fruit);
        !            67:            else
        !            68:                if (obj->o_count == 1)
        !            69:                    strcpy(pb, "Some food");
        !            70:                else
        !            71:                    sprintf(pb, "%d rations of food", obj->o_count);
        !            72:        when WEAPON:
        !            73:            sp = weap_info[which].oi_name;
        !            74:            if (obj->o_count > 1)
        !            75:                sprintf(pb, "%d ", obj->o_count);
        !            76:            else
        !            77:                sprintf(pb, "A%s ", vowelstr(sp));
        !            78:            pb = &prbuf[strlen(prbuf)];
        !            79:            if (obj->o_flags & ISKNOW)
        !            80:                sprintf(pb, "%s %s", num(obj->o_hplus,obj->o_dplus,WEAPON), sp);
        !            81:            else
        !            82:                sprintf(pb, "%s", sp);
        !            83:            if (obj->o_count > 1)
        !            84:                strcat(pb, "s");
        !            85:            if (obj->o_label != NULL)
        !            86:            {
        !            87:                pb = &prbuf[strlen(prbuf)];
        !            88:                sprintf(pb, " called %s", obj->o_label);
        !            89:            }
        !            90:        when ARMOR:
        !            91:            sp = arm_info[which].oi_name;
        !            92:            if (obj->o_flags & ISKNOW)
        !            93:            {
        !            94:                sprintf(pb, "%s %s [",
        !            95:                    num(a_class[which] - obj->o_arm, 0, ARMOR), sp);
        !            96:                if (!terse)
        !            97:                    strcat(pb, "protection ");
        !            98:                pb = &prbuf[strlen(prbuf)];
        !            99:                sprintf(pb, "%d]", 10 - obj->o_arm);
        !           100:            }
        !           101:            else
        !           102:                sprintf(pb, "%s", sp);
        !           103:            if (obj->o_label != NULL)
        !           104:            {
        !           105:                pb = &prbuf[strlen(prbuf)];
        !           106:                sprintf(pb, " called %s", obj->o_label);
        !           107:            }
        !           108:        when AMULET:
        !           109:            strcpy(pb, "The Amulet of Yendor");
        !           110:        when GOLD:
        !           111:            sprintf(prbuf, "%d Gold pieces", obj->o_goldval);
        !           112: #ifdef MASTER
        !           113:        otherwise:
        !           114:            debug("Picked up something funny %s", unctrl(obj->o_type));
        !           115:            sprintf(pb, "Something bizarre %s", unctrl(obj->o_type));
        !           116: #endif
        !           117:     }
        !           118:     if (inv_describe)
        !           119:     {
        !           120:        if (obj == cur_armor)
        !           121:            strcat(pb, " (being worn)");
        !           122:        if (obj == cur_weapon)
        !           123:            strcat(pb, " (weapon in hand)");
        !           124:        if (obj == cur_ring[LEFT])
        !           125:            strcat(pb, " (on left hand)");
        !           126:        else if (obj == cur_ring[RIGHT])
        !           127:            strcat(pb, " (on right hand)");
        !           128:     }
        !           129:     if (drop && isupper((int)prbuf[0]))
        !           130:        prbuf[0] = (char) tolower(prbuf[0]);
        !           131:     else if (!drop && islower((int)*prbuf))
        !           132:        *prbuf = (char) toupper(*prbuf);
        !           133:     prbuf[MAXSTR-1] = '\0';
        !           134:     return prbuf;
        !           135: }
        !           136:
        !           137: /*
        !           138:  * drop:
        !           139:  *     Put something down
        !           140:  */
        !           141:
        !           142: void
        !           143: drop(void)
        !           144: {
        !           145:     int ch;
        !           146:     THING *obj;
        !           147:
        !           148:     ch = chat(hero.y, hero.x);
        !           149:     if (ch != FLOOR && ch != PASSAGE)
        !           150:     {
        !           151:        after = FALSE;
        !           152:        msg("there is something there already");
        !           153:        return;
        !           154:     }
        !           155:     if ((obj = get_item("drop", 0)) == NULL)
        !           156:        return;
        !           157:     if (!dropcheck(obj))
        !           158:        return;
        !           159:     obj = leave_pack(obj, TRUE, !ISMULT(obj->o_type));
        !           160:     /*
        !           161:      * Link it into the level object list
        !           162:      */
        !           163:     attach(lvl_obj, obj);
        !           164:     chat(hero.y, hero.x) = obj->o_type;
        !           165:     flat(hero.y, hero.x) |= F_DROPPED;
        !           166:     obj->o_pos = hero;
        !           167:     if (obj->o_type == AMULET)
        !           168:        amulet = FALSE;
        !           169:     msg("dropped %s", inv_name(obj, TRUE));
        !           170: }
        !           171:
        !           172: /*
        !           173:  * dropcheck:
        !           174:  *     Do special checks for dropping or unweilding|unwearing|unringing
        !           175:  */
        !           176: int
        !           177: dropcheck(const THING *obj)
        !           178: {
        !           179:     if (obj == NULL)
        !           180:        return TRUE;
        !           181:     if (obj != cur_armor && obj != cur_weapon
        !           182:        && obj != cur_ring[LEFT] && obj != cur_ring[RIGHT])
        !           183:            return TRUE;
        !           184:     if (obj->o_flags & ISCURSED)
        !           185:     {
        !           186:        msg("you can't.  It appears to be cursed");
        !           187:        return FALSE;
        !           188:     }
        !           189:     if (obj == cur_weapon)
        !           190:        cur_weapon = NULL;
        !           191:     else if (obj == cur_armor)
        !           192:     {
        !           193:        waste_time();
        !           194:        cur_armor = NULL;
        !           195:     }
        !           196:     else
        !           197:     {
        !           198:        cur_ring[obj == cur_ring[LEFT] ? LEFT : RIGHT] = NULL;
        !           199:        switch (obj->o_which)
        !           200:        {
        !           201:            case R_ADDSTR:
        !           202:                chg_str(-obj->o_arm);
        !           203:                break;
        !           204:            case R_SEEINVIS:
        !           205:                unsee();
        !           206:                extinguish(unsee);
        !           207:                break;
        !           208:        }
        !           209:     }
        !           210:     return TRUE;
        !           211: }
        !           212:
        !           213: /*
        !           214:  * new_thing:
        !           215:  *     Return a new thing
        !           216:  */
        !           217: THING *
        !           218: new_thing(void)
        !           219: {
        !           220:     THING *cur;
        !           221:     int r;
        !           222:
        !           223:     cur = new_item();
        !           224:     cur->o_hplus = 0;
        !           225:     cur->o_dplus = 0;
        !           226:     strncpy(cur->o_damage, "0x0", sizeof(cur->o_damage));
        !           227:     strncpy(cur->o_hurldmg, "0x0", sizeof(cur->o_hurldmg));
        !           228:     cur->o_arm = 11;
        !           229:     cur->o_count = 1;
        !           230:     cur->o_group = 0;
        !           231:     cur->o_flags = 0;
        !           232:     /*
        !           233:      * Decide what kind of object it will be
        !           234:      * If we haven't had food for a while, let it be food.
        !           235:      */
        !           236:     switch (no_food > 3 ? 2 : pick_one(things, NUMTHINGS))
        !           237:     {
        !           238:        case 0:
        !           239:            cur->o_type = POTION;
        !           240:            cur->o_which = pick_one(pot_info, MAXPOTIONS);
        !           241:        when 1:
        !           242:            cur->o_type = SCROLL;
        !           243:            cur->o_which = pick_one(scr_info, MAXSCROLLS);
        !           244:        when 2:
        !           245:            cur->o_type = FOOD;
        !           246:            no_food = 0;
        !           247:            if (rnd(10) != 0)
        !           248:                cur->o_which = 0;
        !           249:            else
        !           250:                cur->o_which = 1;
        !           251:        when 3:
        !           252:            init_weapon(cur, pick_one(weap_info, MAXWEAPONS));
        !           253:            if ((r = rnd(100)) < 10)
        !           254:            {
        !           255:                cur->o_flags |= ISCURSED;
        !           256:                cur->o_hplus -= rnd(3) + 1;
        !           257:            }
        !           258:            else if (r < 15)
        !           259:                cur->o_hplus += rnd(3) + 1;
        !           260:        when 4:
        !           261:            cur->o_type = ARMOR;
        !           262:            cur->o_which = pick_one(arm_info, MAXARMORS);
        !           263:            cur->o_arm = a_class[cur->o_which];
        !           264:            if ((r = rnd(100)) < 20)
        !           265:            {
        !           266:                cur->o_flags |= ISCURSED;
        !           267:                cur->o_arm += rnd(3) + 1;
        !           268:            }
        !           269:            else if (r < 28)
        !           270:                cur->o_arm -= rnd(3) + 1;
        !           271:        when 5:
        !           272:            cur->o_type = RING;
        !           273:            cur->o_which = pick_one(ring_info, MAXRINGS);
        !           274:            switch (cur->o_which)
        !           275:            {
        !           276:                case R_ADDSTR:
        !           277:                case R_PROTECT:
        !           278:                case R_ADDHIT:
        !           279:                case R_ADDDAM:
        !           280:                    if ((cur->o_arm = rnd(3)) == 0)
        !           281:                    {
        !           282:                        cur->o_arm = -1;
        !           283:                        cur->o_flags |= ISCURSED;
        !           284:                    }
        !           285:                when R_AGGR:
        !           286:                case R_TELEPORT:
        !           287:                    cur->o_flags |= ISCURSED;
        !           288:            }
        !           289:        when 6:
        !           290:            cur->o_type = STICK;
        !           291:            cur->o_which = pick_one(ws_info, MAXSTICKS);
        !           292:            fix_stick(cur);
        !           293: #ifdef MASTER
        !           294:        otherwise:
        !           295:            debug("Picked a bad kind of object");
        !           296:            wait_for(stdscr, ' ');
        !           297: #endif
        !           298:     }
        !           299:     return cur;
        !           300: }
        !           301:
        !           302: /*
        !           303:  * pick_one:
        !           304:  *     Pick an item out of a list of nitems possible objects
        !           305:  */
        !           306: int
        !           307: pick_one(const struct obj_info *info, int nitems)
        !           308: {
        !           309:     const struct obj_info *end;
        !           310:     const struct obj_info *start;
        !           311:     int i;
        !           312:
        !           313:     start = info;
        !           314:     for (end = &info[nitems], i = rnd(100); info < end; info++)
        !           315:        if (i < info->oi_prob)
        !           316:            break;
        !           317:     if (info == end)
        !           318:     {
        !           319: #ifdef MASTER
        !           320:        if (wizard)
        !           321:        {
        !           322:            msg("bad pick_one: %d from %d items", i, nitems);
        !           323:            for (info = start; info < end; info++)
        !           324:                msg("%s: %d%%", info->oi_name, info->oi_prob);
        !           325:        }
        !           326: #endif
        !           327:        info = start;
        !           328:     }
        !           329:     return (int)(info - start);
        !           330: }
        !           331:
        !           332: /*
        !           333:  * discovered:
        !           334:  *     list what the player has discovered in this game of a certain type
        !           335:  */
        !           336: static int line_cnt = 0;
        !           337:
        !           338: static int newpage = FALSE;
        !           339:
        !           340: static const char *lastfmt, *lastarg;
        !           341:
        !           342:
        !           343: void
        !           344: discovered(void)
        !           345: {
        !           346:     int ch;
        !           347:     int disc_list;
        !           348:
        !           349:     do {
        !           350:        disc_list = FALSE;
        !           351:        if (!terse)
        !           352:            addmsg("for ");
        !           353:        addmsg("what type");
        !           354:        if (!terse)
        !           355:            addmsg(" of object do you want a list");
        !           356:        msg("? (* for all)");
        !           357:        ch = readchar();
        !           358:        switch (ch)
        !           359:        {
        !           360:            case ESCAPE:
        !           361:                msg("");
        !           362:                return;
        !           363:            case POTION:
        !           364:            case SCROLL:
        !           365:            case RING:
        !           366:            case STICK:
        !           367:            case '*':
        !           368:                disc_list = TRUE;
        !           369:                break;
        !           370:            default:
        !           371:                if (terse)
        !           372:                    msg("Not a type");
        !           373:                else
        !           374:                    msg("Please type one of %c%c%c%c (ESCAPE to quit)", POTION, SCROLL, RING, STICK);
        !           375:        }
        !           376:     } while (!disc_list);
        !           377:     if (ch == '*')
        !           378:     {
        !           379:        print_disc(POTION);
        !           380:        add_line("", NULL);
        !           381:        print_disc(SCROLL);
        !           382:        add_line("", NULL);
        !           383:        print_disc(RING);
        !           384:        add_line("", NULL);
        !           385:        print_disc(STICK);
        !           386:        end_line();
        !           387:     }
        !           388:     else
        !           389:     {
        !           390:        print_disc(ch);
        !           391:        end_line();
        !           392:     }
        !           393: }
        !           394:
        !           395: /*
        !           396:  * print_disc:
        !           397:  *     Print what we've discovered of type 'type'
        !           398:  */
        !           399:
        !           400: #define MAX4(a,b,c,d)  (a > b ? (a > c ? (a > d ? a : d) : (c > d ? c : d)) : (b > c ? (b > d ? b : d) : (c > d ? c : d)))
        !           401:
        !           402:
        !           403: void
        !           404: print_disc(int type)
        !           405: {
        !           406:     struct obj_info *info = NULL;
        !           407:     int i, maxnum = 0, num_found;
        !           408:     THING obj;
        !           409:     int order[MAX4(MAXSCROLLS, MAXPOTIONS, MAXRINGS, MAXSTICKS)];
        !           410:
        !           411:     switch (type)
        !           412:     {
        !           413:        case SCROLL:
        !           414:            maxnum = MAXSCROLLS;
        !           415:            info = scr_info;
        !           416:            break;
        !           417:        case POTION:
        !           418:            maxnum = MAXPOTIONS;
        !           419:            info = pot_info;
        !           420:            break;
        !           421:        case RING:
        !           422:            maxnum = MAXRINGS;
        !           423:            info = ring_info;
        !           424:            break;
        !           425:        case STICK:
        !           426:            maxnum = MAXSTICKS;
        !           427:            info = ws_info;
        !           428:            break;
        !           429:     }
        !           430:     set_order(order, maxnum);
        !           431:     obj.o_count = 1;
        !           432:     obj.o_flags = 0;
        !           433:     num_found = 0;
        !           434:     for (i = 0; i < maxnum; i++)
        !           435:        if (info[order[i]].oi_know || info[order[i]].oi_guess)
        !           436:        {
        !           437:            obj.o_type = type;
        !           438:            obj.o_which = order[i];
        !           439:            add_line("%s", inv_name(&obj, FALSE));
        !           440:            num_found++;
        !           441:        }
        !           442:     if (num_found == 0)
        !           443:        add_line(nothing(type), NULL);
        !           444: }
        !           445:
        !           446: /*
        !           447:  * set_order:
        !           448:  *     Set up order for list
        !           449:  */
        !           450:
        !           451: void
        !           452: set_order(int *order, int numthings)
        !           453: {
        !           454:     int i, r, t;
        !           455:
        !           456:     for (i = 0; i< numthings; i++)
        !           457:        order[i] = i;
        !           458:
        !           459:     for (i = numthings; i > 0; i--)
        !           460:     {
        !           461:        r = rnd(i);
        !           462:        t = order[i - 1];
        !           463:        order[i - 1] = order[r];
        !           464:        order[r] = t;
        !           465:     }
        !           466: }
        !           467:
        !           468: /*
        !           469:  * add_line:
        !           470:  *     Add a line to the list of discoveries
        !           471:  */
        !           472: /* VARARGS1 */
        !           473: int
        !           474: add_line(const char *fmt, const char *arg)
        !           475: {
        !           476:     WINDOW *tw, *sw;
        !           477:     int x, y;
        !           478:     char *prompt = "--Press space to continue--";
        !           479:     static int maxlen = -1;
        !           480:
        !           481:     if (line_cnt == 0)
        !           482:     {
        !           483:            wclear(hw);
        !           484:            if (inv_type == INV_SLOW)
        !           485:                mpos = 0;
        !           486:     }
        !           487:     if (inv_type == INV_SLOW)
        !           488:     {
        !           489:        if (fmt != NULL && *fmt != '\0')
        !           490:            if (msg(fmt, arg) == ESCAPE)
        !           491:                return ESCAPE;
        !           492:        line_cnt++;
        !           493:     }
        !           494:     else
        !           495:     {
        !           496:        if (maxlen < 0)
        !           497:            maxlen = (int) strlen(prompt);
        !           498:        if (line_cnt >= LINES - 1 || fmt == NULL)
        !           499:        {
        !           500:            if (inv_type == INV_OVER && fmt == NULL && !newpage)
        !           501:            {
        !           502:                msg("");
        !           503:                refresh();
        !           504:                tw = newwin(line_cnt + 1, maxlen + 2, 0, COLS - maxlen - 3);
        !           505:                sw = subwin(tw, line_cnt + 1, maxlen + 1, 0, COLS - maxlen - 2);
        !           506:                 for (y = 0; y <= line_cnt; y++)
        !           507:                 {
        !           508:                     wmove(sw, y, 0);
        !           509:                     for (x = 0; x <= maxlen; x++)
        !           510:                         waddch(sw, mvwinch(hw, y, x));
        !           511:                 }
        !           512:                wmove(tw, line_cnt, 1);
        !           513:                waddstr(tw, prompt);
        !           514:                /*
        !           515:                 * if there are lines below, use 'em
        !           516:                 */
        !           517:                if (LINES > NUMLINES)
        !           518:                {
        !           519:                    if (NUMLINES + line_cnt > LINES)
        !           520:                        mvwin(tw, LINES - (line_cnt + 1), COLS - maxlen - 3);
        !           521:                    else
        !           522:                        mvwin(tw, NUMLINES, 0);
        !           523:                }
        !           524:                touchwin(tw);
        !           525:                wrefresh(tw);
        !           526:                wait_for(tw, ' ');
        !           527:                 if (md_hasclreol())
        !           528:                {
        !           529:                    werase(tw);
        !           530:                    leaveok(tw, TRUE);
        !           531:                    wrefresh(tw);
        !           532:                }
        !           533:                delwin(tw);
        !           534:                touchwin(stdscr);
        !           535:            }
        !           536:            else
        !           537:            {
        !           538:                wmove(hw, LINES - 1, 0);
        !           539:                waddstr(hw, prompt);
        !           540:                wrefresh(hw);
        !           541:                wait_for(hw, ' ');
        !           542:                clearok(curscr, TRUE);
        !           543:                wclear(hw);
        !           544:                touchwin(stdscr);
        !           545:            }
        !           546:            newpage = TRUE;
        !           547:            line_cnt = 0;
        !           548:            maxlen = (int) strlen(prompt);
        !           549:        }
        !           550:        if (fmt != NULL && !(line_cnt == 0 && *fmt == '\0'))
        !           551:        {
        !           552:            mvwprintw(hw, line_cnt++, 0, fmt, arg);
        !           553:            getyx(hw, y, x);
        !           554:            if (maxlen < x)
        !           555:                maxlen = x;
        !           556:            lastfmt = fmt;
        !           557:            lastarg = arg;
        !           558:        }
        !           559:     }
        !           560:     return ~ESCAPE;
        !           561: }
        !           562:
        !           563: /*
        !           564:  * end_line:
        !           565:  *     End the list of lines
        !           566:  */
        !           567:
        !           568: void
        !           569: end_line(void)
        !           570: {
        !           571:     if (inv_type != INV_SLOW)
        !           572:     {
        !           573:        if (line_cnt == 1 && !newpage)
        !           574:        {
        !           575:            mpos = 0;
        !           576:            msg(lastfmt, lastarg);
        !           577:        }
        !           578:        else
        !           579:        {
        !           580:            add_line(NULL, NULL);
        !           581:            msg("");
        !           582:        }
        !           583:     }
        !           584:     line_cnt = 0;
        !           585:     newpage = FALSE;
        !           586: }
        !           587:
        !           588: /*
        !           589:  * nothing:
        !           590:  *     Set up prbuf so that message for "nothing found" is there
        !           591:  */
        !           592: const char *
        !           593: nothing(int type)
        !           594: {
        !           595:     char *sp, *tystr = NULL;
        !           596:
        !           597:     if (terse)
        !           598:        sprintf(prbuf, "Nothing");
        !           599:     else
        !           600:        sprintf(prbuf, "Haven't discovered anything");
        !           601:     if (type != '*')
        !           602:     {
        !           603:        sp = &prbuf[strlen(prbuf)];
        !           604:        switch (type)
        !           605:        {
        !           606:            case POTION: tystr = "potion";
        !           607:            when SCROLL: tystr = "scroll";
        !           608:            when RING: tystr = "ring";
        !           609:            when STICK: tystr = "stick";
        !           610:        }
        !           611:        sprintf(sp, " about any %ss", tystr);
        !           612:     }
        !           613:     return prbuf;
        !           614: }
        !           615:
        !           616: /*
        !           617:  * nameit:
        !           618:  *     Give the proper name to a potion, stick, or ring
        !           619:  */
        !           620:
        !           621: void
        !           622: nameit(const THING *obj, const char *type, const char *which, const struct obj_info *op,
        !           623:     const char *(*prfunc)(const THING *))
        !           624: {
        !           625:     char *pb;
        !           626:
        !           627:     if (op->oi_know || op->oi_guess)
        !           628:     {
        !           629:        if (obj->o_count == 1)
        !           630:            sprintf(prbuf, "A %s ", type);
        !           631:        else
        !           632:            sprintf(prbuf, "%d %ss ", obj->o_count, type);
        !           633:        pb = &prbuf[strlen(prbuf)];
        !           634:        if (op->oi_know)
        !           635:            sprintf(pb, "of %s%s(%s)", op->oi_name, (*prfunc)(obj), which);
        !           636:        else if (op->oi_guess)
        !           637:            sprintf(pb, "called %s%s(%s)", op->oi_guess, (*prfunc)(obj), which);
        !           638:     }
        !           639:     else if (obj->o_count == 1)
        !           640:        sprintf(prbuf, "A%s %s %s", vowelstr(which), which, type);
        !           641:     else
        !           642:        sprintf(prbuf, "%d %s %ss", obj->o_count, which, type);
        !           643: }
        !           644:
        !           645: /*
        !           646:  * nullstr:
        !           647:  *     Return a pointer to a null-length string
        !           648:  */
        !           649: const char *
        !           650: nullstr(const THING *ignored)
        !           651: {
        !           652:     NOOP(ignored);
        !           653:     return "";
        !           654: }
        !           655:
        !           656: # ifdef        MASTER
        !           657: /*
        !           658:  * pr_list:
        !           659:  *     List possible potions, scrolls, etc. for wizard.
        !           660:  */
        !           661:
        !           662: void
        !           663: pr_list(void)
        !           664: {
        !           665:     int ch;
        !           666:
        !           667:     if (!terse)
        !           668:        addmsg("for ");
        !           669:     addmsg("what type");
        !           670:     if (!terse)
        !           671:        addmsg(" of object do you want a list");
        !           672:     msg("? ");
        !           673:     ch = readchar();
        !           674:        msg("");
        !           675:     switch (ch)
        !           676:     {
        !           677:        case POTION:
        !           678:            pr_spec(pot_info, MAXPOTIONS);
        !           679:        when SCROLL:
        !           680:            pr_spec(scr_info, MAXSCROLLS);
        !           681:        when RING:
        !           682:            pr_spec(ring_info, MAXRINGS);
        !           683:        when STICK:
        !           684:            pr_spec(ws_info, MAXSTICKS);
        !           685:        when ARMOR:
        !           686:            pr_spec(arm_info, MAXARMORS);
        !           687:        when WEAPON:
        !           688:            pr_spec(weap_info, MAXWEAPONS);
        !           689:        otherwise:
        !           690:            return;
        !           691:     }
        !           692: }
        !           693:
        !           694: /*
        !           695:  * pr_spec:
        !           696:  *     Print specific list of possible items to choose from
        !           697:  */
        !           698:
        !           699: void
        !           700: pr_spec(const struct obj_info *info, int nitems)
        !           701: {
        !           702:     const struct obj_info *endp;
        !           703:     int i, lastprob;
        !           704:
        !           705:     endp = &info[nitems];
        !           706:     lastprob = 0;
        !           707:     for (i = '0'; info < endp; i++)
        !           708:     {
        !           709:        if (i == '9' + 1)
        !           710:            i = 'a';
        !           711:        sprintf(prbuf, "%c: %%s (%d%%%%)", i, info->oi_prob - lastprob);
        !           712:        lastprob = info->oi_prob;
        !           713:        add_line(prbuf, info->oi_name);
        !           714:        info++;
        !           715:     }
        !           716:     end_line();
        !           717: }
        !           718: # endif        /* MASTER */

CVSweb