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

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

1.1     ! rubenllo    1: /*
        !             2:  * Read and execute the user commands
        !             3:  *
        !             4:  * @(#)command.c       4.73 (Berkeley) 08/06/83
        !             5:  *
        !             6:  * Rogue: Exploring the Dungeons of Doom
        !             7:  * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            11:  */
        !            12:
        !            13: #include <stdlib.h>
        !            14: #include <string.h>
        !            15: #include <curses.h>
        !            16: #include <ctype.h>
        !            17: #include "rogue.h"
        !            18:
        !            19: /*
        !            20:  * command:
        !            21:  *     Process the user commands
        !            22:  */
        !            23: void
        !            24: command(void)
        !            25: {
        !            26:     int ch;
        !            27:     int ntimes = 1;                    /* Number of player moves */
        !            28:     int *fp;
        !            29:     THING *mp;
        !            30:     static int countch, direction, newcount = FALSE;
        !            31:
        !            32:     if (on(player, ISHASTE))
        !            33:        ntimes++;
        !            34:     /*
        !            35:      * Let the daemons start up
        !            36:      */
        !            37:     do_daemons(BEFORE);
        !            38:     do_fuses(BEFORE);
        !            39:     while (ntimes--)
        !            40:     {
        !            41:        again = FALSE;
        !            42:        if (has_hit)
        !            43:        {
        !            44:            endmsg();
        !            45:            has_hit = FALSE;
        !            46:        }
        !            47:        /*
        !            48:         * these are illegal things for the player to be, so if any are
        !            49:         * set, someone's been poking in memeory
        !            50:         */
        !            51:        if (on(player, ISSLOW|ISGREED|ISINVIS|ISREGEN|ISTARGET))
        !            52:            exit(1);
        !            53:
        !            54:        look(TRUE);
        !            55:        if (!running)
        !            56:            door_stop = FALSE;
        !            57:        status();
        !            58:        lastscore = purse;
        !            59:        move(hero.y, hero.x);
        !            60:        if (!((running || count) && jump))
        !            61:            refresh();                  /* Draw screen */
        !            62:        take = 0;
        !            63:        after = TRUE;
        !            64:        /*
        !            65:         * Read command or continue run
        !            66:         */
        !            67: #ifdef MASTER
        !            68:        if (wizard)
        !            69:            noscore = TRUE;
        !            70: #endif
        !            71:        if (!no_command)
        !            72:        {
        !            73:            if (running || to_death)
        !            74:                ch = runch;
        !            75:            else if (count)
        !            76:                ch = countch;
        !            77:            else
        !            78:            {
        !            79:                ch = readchar();
        !            80:                move_on = FALSE;
        !            81:                if (mpos != 0)          /* Erase message if its there */
        !            82:                {
        !            83:                    if (ch != '.')
        !            84:                        msg("");
        !            85:                }
        !            86:            }
        !            87:        }
        !            88:        else
        !            89:            ch = '.';
        !            90:        if (no_command)
        !            91:        {
        !            92:            if (--no_command == 0)
        !            93:            {
        !            94:                msg("you can move again");
        !            95:            }
        !            96:        }
        !            97:        else
        !            98:        {
        !            99:            /*
        !           100:             * check for prefixes
        !           101:             */
        !           102:            newcount = FALSE;
        !           103:            if (isdigit(ch))
        !           104:            {
        !           105:                count = 0;
        !           106:                newcount = TRUE;
        !           107:                while (isdigit(ch))
        !           108:                {
        !           109:                    count = count * 10 + (ch - '0');
        !           110:                    if (count > 255)
        !           111:                        count = 255;
        !           112:                    ch = readchar();
        !           113:                }
        !           114:                countch = ch;
        !           115:                /*
        !           116:                 * turn off count for commands which don't make sense
        !           117:                 * to repeat
        !           118:                 */
        !           119:                switch (ch)
        !           120:                {
        !           121:                    case CTRL('B'): case CTRL('H'): case CTRL('J'):
        !           122:                    case CTRL('K'): case CTRL('L'): case CTRL('N'):
        !           123:                    case CTRL('U'): case CTRL('Y'):
        !           124:                    case '.': case 'a': case 'b': case 'h': case 'j':
        !           125:                    case 'k': case 'l': case 'm': case 'n': case 'q':
        !           126:                    case 'r': case 's': case 't': case 'u': case 'y':
        !           127:                    case 'z': case 'B': case 'C': case 'H': case 'I':
        !           128:                    case 'J': case 'K': case 'L': case 'N': case 'U':
        !           129:                    case 'Y':
        !           130: #ifdef MASTER
        !           131:                    case CTRL('D'): case CTRL('A'):
        !           132: #endif
        !           133:                        break;
        !           134:                    default:
        !           135:                        count = 0;
        !           136:                }
        !           137:            }
        !           138:            /*
        !           139:             * execute a command
        !           140:             */
        !           141:            if (count && !running)
        !           142:                count--;
        !           143:            if (ch != 'a' && ch != ESCAPE && !(running || count || to_death))
        !           144:            {
        !           145:                l_last_comm = last_comm;
        !           146:                l_last_dir = last_dir;
        !           147:                l_last_pick = last_pick;
        !           148:                last_comm = ch;
        !           149:                last_dir = '\0';
        !           150:                last_pick = NULL;
        !           151:            }
        !           152: over:
        !           153:            switch (ch)
        !           154:            {
        !           155:                case ',': {
        !           156:                    THING *obj = NULL;
        !           157:                    int found = 0;
        !           158:                    for (obj = lvl_obj; obj != NULL; obj = next(obj))
        !           159:                        {
        !           160:                            if (obj->o_pos.y == hero.y && obj->o_pos.x == hero.x)
        !           161:                            {
        !           162:                                found=1;
        !           163:                                break;
        !           164:                            }
        !           165:                        }
        !           166:
        !           167:                    if (found) {
        !           168:                        if (levit_check())
        !           169:                            ;
        !           170:                        else
        !           171:                            pick_up(obj->o_type);
        !           172:                    }
        !           173:                    else {
        !           174:                        if (!terse)
        !           175:                            addmsg("there is ");
        !           176:                        addmsg("nothing here");
        !           177:                         if (!terse)
        !           178:                             addmsg(" to pick up");
        !           179:                         endmsg();
        !           180:                    }
        !           181:                }
        !           182:                when '!': shell();
        !           183:                when 'h': do_move(0, -1);
        !           184:                when 'j': do_move(1, 0);
        !           185:                when 'k': do_move(-1, 0);
        !           186:                when 'l': do_move(0, 1);
        !           187:                when 'y': do_move(-1, -1);
        !           188:                when 'u': do_move(-1, 1);
        !           189:                when 'b': do_move(1, -1);
        !           190:                when 'n': do_move(1, 1);
        !           191:                when 'H': do_run('h');
        !           192:                when 'J': do_run('j');
        !           193:                when 'K': do_run('k');
        !           194:                when 'L': do_run('l');
        !           195:                when 'Y': do_run('y');
        !           196:                when 'U': do_run('u');
        !           197:                when 'B': do_run('b');
        !           198:                when 'N': do_run('n');
        !           199:                when CTRL('H'): case CTRL('J'): case CTRL('K'): case CTRL('L'):
        !           200:                case CTRL('Y'): case CTRL('U'): case CTRL('B'): case CTRL('N'):
        !           201:                {
        !           202:                    if (!on(player, ISBLIND))
        !           203:                    {
        !           204:                        door_stop = TRUE;
        !           205:                        firstmove = TRUE;
        !           206:                    }
        !           207:                    if (count && !newcount)
        !           208:                        ch = direction;
        !           209:                    else
        !           210:                    {
        !           211:                        ch += ('A' - CTRL('A'));
        !           212:                        direction = ch;
        !           213:                    }
        !           214:                    goto over;
        !           215:                }
        !           216:                when 'F':
        !           217:                    kamikaze = TRUE;
        !           218:                    /* FALLTHROUGH */
        !           219:                case 'f':
        !           220:                    if (!get_dir())
        !           221:                    {
        !           222:                        after = FALSE;
        !           223:                        break;
        !           224:                    }
        !           225:                    delta.y += hero.y;
        !           226:                    delta.x += hero.x;
        !           227:                    if ( ((mp = moat(delta.y, delta.x)) == NULL)
        !           228:                        || ((!see_monst(mp)) && !on(player, SEEMONST)))
        !           229:                    {
        !           230:                        if (!terse)
        !           231:                            addmsg("I see ");
        !           232:                        msg("no monster there");
        !           233:                        after = FALSE;
        !           234:                    }
        !           235:                    else if (diag_ok(&hero, &delta))
        !           236:                    {
        !           237:                        to_death = TRUE;
        !           238:                        max_hit = 0;
        !           239:                        mp->t_flags |= ISTARGET;
        !           240:                        runch = ch = dir_ch;
        !           241:                        goto over;
        !           242:                    }
        !           243:                when 't':
        !           244:                    if (!get_dir())
        !           245:                        after = FALSE;
        !           246:                    else
        !           247:                        missile(delta.y, delta.x);
        !           248:                when 'a':
        !           249:                    if (last_comm == '\0')
        !           250:                    {
        !           251:                        msg("you haven't typed a command yet");
        !           252:                        after = FALSE;
        !           253:                    }
        !           254:                    else
        !           255:                    {
        !           256:                        ch = last_comm;
        !           257:                        again = TRUE;
        !           258:                        goto over;
        !           259:                    }
        !           260:                when 'q': quaff();
        !           261:                when 'Q':
        !           262:                    after = FALSE;
        !           263:                    q_comm = TRUE;
        !           264:                    quit(0);
        !           265:                    q_comm = FALSE;
        !           266:                when 'i': after = FALSE; inventory(pack, 0);
        !           267:                when 'I': after = FALSE; picky_inven();
        !           268:                when 'd': drop();
        !           269:                when 'r': read_scroll();
        !           270:                when 'e': eat();
        !           271:                when 'w': wield();
        !           272:                when 'W': wear();
        !           273:                when 'T': take_off();
        !           274:                when 'P': ring_on();
        !           275:                when 'R': ring_off();
        !           276:                when 'o': option(); after = FALSE;
        !           277:                when 'c': call(); after = FALSE;
        !           278:                when '>': after = FALSE; d_level();
        !           279:                when '<': after = FALSE; u_level();
        !           280:                when '?': after = FALSE; help();
        !           281:                when '/': after = FALSE; identify();
        !           282:                when 's': search();
        !           283:                when 'z':
        !           284:                    if (get_dir())
        !           285:                        do_zap();
        !           286:                    else
        !           287:                        after = FALSE;
        !           288:                when 'D': after = FALSE; discovered();
        !           289:                when CTRL('P'): after = FALSE; msg(huh);
        !           290:                when CTRL('R'):
        !           291:                    after = FALSE;
        !           292:                    clearok(curscr,TRUE);
        !           293:                    wrefresh(curscr);
        !           294:                when 'v':
        !           295:                    after = FALSE;
        !           296:                    msg("version %s. (mctesq was here)", release);
        !           297:                when 'S':
        !           298:                    after = FALSE;
        !           299:                    save_game();
        !           300:                when '.': ;                     /* Rest command */
        !           301:                when ' ': after = FALSE;        /* "Legal" illegal command */
        !           302:                when '^':
        !           303:                    after = FALSE;
        !           304:                    if (get_dir()) {
        !           305:                        delta.y += hero.y;
        !           306:                        delta.x += hero.x;
        !           307:                        fp = &flat(delta.y, delta.x);
        !           308:                         if (!terse)
        !           309:                             addmsg("You have found ");
        !           310:                        if (chat(delta.y, delta.x) != TRAP)
        !           311:                            msg("no trap there");
        !           312:                        else if (on(player, ISHALU))
        !           313:                            msg(tr_name[rnd(NTRAPS)]);
        !           314:                        else {
        !           315:                            msg(tr_name[*fp & F_TMASK]);
        !           316:                            *fp |= F_SEEN;
        !           317:                        }
        !           318:                    }
        !           319: #ifdef MASTER
        !           320:                when '+':
        !           321:                    after = FALSE;
        !           322:                    if (wizard)
        !           323:                    {
        !           324:                        wizard = FALSE;
        !           325:                        turn_see(TRUE);
        !           326:                        msg("not wizard any more");
        !           327:                    }
        !           328:                    else
        !           329:                    {
        !           330:                        wizard = passwd();
        !           331:                        if (wizard)
        !           332:                        {
        !           333:                            noscore = TRUE;
        !           334:                            turn_see(FALSE);
        !           335:                            msg("you are suddenly as smart as Ken Arnold in dungeon #%d", dnum);
        !           336:                        }
        !           337:                        else
        !           338:                            msg("sorry");
        !           339:                    }
        !           340: #endif
        !           341:                when ESCAPE:    /* Escape */
        !           342:                    door_stop = FALSE;
        !           343:                    count = 0;
        !           344:                    after = FALSE;
        !           345:                    again = FALSE;
        !           346:                when 'm':
        !           347:                    move_on = TRUE;
        !           348:                    if (!get_dir())
        !           349:                        after = FALSE;
        !           350:                    else
        !           351:                    {
        !           352:                        ch = dir_ch;
        !           353:                        countch = dir_ch;
        !           354:                        goto over;
        !           355:                    }
        !           356:                when ')': current(cur_weapon, "wielding", NULL);
        !           357:                when ']': current(cur_armor, "wearing", NULL);
        !           358:                when '=':
        !           359:                    current(cur_ring[LEFT], "wearing",
        !           360:                                            terse ? "(L)" : "on left hand");
        !           361:                    current(cur_ring[RIGHT], "wearing",
        !           362:                                            terse ? "(R)" : "on right hand");
        !           363:                when '@':
        !           364:                    stat_msg = TRUE;
        !           365:                    status();
        !           366:                    stat_msg = FALSE;
        !           367:                    after = FALSE;
        !           368:                otherwise:
        !           369:                    after = FALSE;
        !           370: #ifdef MASTER
        !           371:                    if (wizard) switch (ch)
        !           372:                    {
        !           373:                        case '|': msg("@ %d,%d", hero.y, hero.x);
        !           374:                        when 'C': create_obj();
        !           375:                        when '$': msg("inpack = %d", inpack);
        !           376:                        when CTRL('G'): inventory(lvl_obj, 0);
        !           377:                        when CTRL('W'): whatis(FALSE, 0);
        !           378:                        when CTRL('D'): level++; new_level();
        !           379:                        when CTRL('A'): level--; new_level();
        !           380:                        when CTRL('F'): show_map();
        !           381:                        when CTRL('T'): teleport();
        !           382:                        when CTRL('E'): msg("food left: %d", food_left);
        !           383:                        when CTRL('Q'): add_pass();
        !           384:                        when CTRL('X'): turn_see(on(player, SEEMONST));
        !           385:                        when '~':
        !           386:                        {
        !           387:                            THING *item;
        !           388:
        !           389:                            if ((item = get_item("charge", STICK)) != NULL)
        !           390:                                item->o_charges = 10000;
        !           391:                        }
        !           392:                        when CTRL('I'):
        !           393:                        {
        !           394:                            int i;
        !           395:                            THING *obj;
        !           396:
        !           397:                            for (i = 0; i < 9; i++)
        !           398:                                raise_level();
        !           399:                            /*
        !           400:                             * Give him a sword (+1,+1)
        !           401:                             */
        !           402:                            obj = new_item();
        !           403:                            init_weapon(obj, TWOSWORD);
        !           404:                            obj->o_hplus = 1;
        !           405:                            obj->o_dplus = 1;
        !           406:                            add_pack(obj, TRUE);
        !           407:                            cur_weapon = obj;
        !           408:                            /*
        !           409:                             * And his suit of armor
        !           410:                             */
        !           411:                            obj = new_item();
        !           412:                            obj->o_type = ARMOR;
        !           413:                            obj->o_which = PLATE_MAIL;
        !           414:                            obj->o_arm = -5;
        !           415:                            obj->o_flags |= ISKNOW;
        !           416:                            obj->o_count = 1;
        !           417:                            obj->o_group = 0;
        !           418:                            cur_armor = obj;
        !           419:                            add_pack(obj, TRUE);
        !           420:                        }
        !           421:                        when '*' :
        !           422:                            pr_list();
        !           423:                        otherwise:
        !           424:                            illcom(ch);
        !           425:                    }
        !           426:                    else
        !           427: #endif
        !           428:                        illcom(ch);
        !           429:            }
        !           430:            /*
        !           431:             * turn off flags if no longer needed
        !           432:             */
        !           433:            if (!running)
        !           434:                door_stop = FALSE;
        !           435:        }
        !           436:        /*
        !           437:         * If he ran into something to take, let him pick it up.
        !           438:         */
        !           439:        if (take != 0)
        !           440:            pick_up(take);
        !           441:        if (!running)
        !           442:            door_stop = FALSE;
        !           443:        if (!after)
        !           444:            ntimes++;
        !           445:     }
        !           446:     do_daemons(AFTER);
        !           447:     do_fuses(AFTER);
        !           448:     if (ISRING(LEFT, R_SEARCH))
        !           449:        search();
        !           450:     else if (ISRING(LEFT, R_TELEPORT) && rnd(50) == 0)
        !           451:        teleport();
        !           452:     if (ISRING(RIGHT, R_SEARCH))
        !           453:        search();
        !           454:     else if (ISRING(RIGHT, R_TELEPORT) && rnd(50) == 0)
        !           455:        teleport();
        !           456: }
        !           457:
        !           458: /*
        !           459:  * illcom:
        !           460:  *     What to do with an illegal command
        !           461:  */
        !           462: void
        !           463: illcom(int ch)
        !           464: {
        !           465:     save_msg = FALSE;
        !           466:     count = 0;
        !           467:     msg("illegal command '%s'", unctrl(ch));
        !           468:     save_msg = TRUE;
        !           469: }
        !           470:
        !           471: /*
        !           472:  * search:
        !           473:  *     player gropes about him to find hidden things.
        !           474:  */
        !           475: void
        !           476: search(void)
        !           477: {
        !           478:     int y, x;
        !           479:     int *fp;
        !           480:     int ey, ex;
        !           481:     int probinc;
        !           482:     int found;
        !           483:
        !           484:     ey = hero.y + 1;
        !           485:     ex = hero.x + 1;
        !           486:     probinc = (on(player, ISHALU) ? 3 : 0);
        !           487:     probinc += (on(player, ISBLIND) ? 2 : 0);
        !           488:     found = FALSE;
        !           489:     for (y = hero.y - 1; y <= ey; y++)
        !           490:        for (x = hero.x - 1; x <= ex; x++)
        !           491:        {
        !           492:            if (y == hero.y && x == hero.x)
        !           493:                continue;
        !           494:            fp = &flat(y, x);
        !           495:            if (!(*fp & F_REAL))
        !           496:                switch (chat(y, x))
        !           497:                {
        !           498:                    case '|':
        !           499:                    case '-':
        !           500:                        if (rnd(5 + probinc) != 0)
        !           501:                            break;
        !           502:                        chat(y, x) = DOOR;
        !           503:                         msg("a secret door");
        !           504: foundone:
        !           505:                        found = TRUE;
        !           506:                        *fp |= F_REAL;
        !           507:                        count = FALSE;
        !           508:                        running = FALSE;
        !           509:                        break;
        !           510:                    case FLOOR:
        !           511:                        if (rnd(2 + probinc) != 0)
        !           512:                            break;
        !           513:                        chat(y, x) = TRAP;
        !           514:                        if (!terse)
        !           515:                            addmsg("you found ");
        !           516:                        if (on(player, ISHALU))
        !           517:                            msg(tr_name[rnd(NTRAPS)]);
        !           518:                        else {
        !           519:                            msg(tr_name[*fp & F_TMASK]);
        !           520:                            *fp |= F_SEEN;
        !           521:                        }
        !           522:                        goto foundone;
        !           523:                        break;
        !           524:                    case ' ':
        !           525:                        if (rnd(3 + probinc) != 0)
        !           526:                            break;
        !           527:                        chat(y, x) = PASSAGE;
        !           528:                        goto foundone;
        !           529:                }
        !           530:        }
        !           531:     if (found)
        !           532:        look(FALSE);
        !           533: }
        !           534:
        !           535: /*
        !           536:  * help:
        !           537:  *     Give single character help, or the whole mess if he wants it
        !           538:  */
        !           539: void
        !           540: help(void)
        !           541: {
        !           542:     const struct h_list *strp;
        !           543:     int helpch;
        !           544:     int numprint, cnt;
        !           545:     msg("character you want help for (* for all): ");
        !           546:     helpch = readchar();
        !           547:     mpos = 0;
        !           548:     /*
        !           549:      * If its not a *, print the right help string
        !           550:      * or an error if he typed a funny character.
        !           551:      */
        !           552:     if (helpch != '*')
        !           553:     {
        !           554:        move(0, 0);
        !           555:        for (strp = helpstr; strp->h_desc != NULL; strp++)
        !           556:            if (strp->h_ch == helpch)
        !           557:            {
        !           558:                lower_msg = TRUE;
        !           559:                msg("%s%s", unctrl(strp->h_ch), strp->h_desc);
        !           560:                lower_msg = FALSE;
        !           561:                return;
        !           562:            }
        !           563:        msg("unknown character '%s'", unctrl(helpch));
        !           564:        return;
        !           565:     }
        !           566:     /*
        !           567:      * Here we print help for everything.
        !           568:      * Then wait before we return to command mode
        !           569:      */
        !           570:     numprint = 0;
        !           571:     for (strp = helpstr; strp->h_desc != NULL; strp++)
        !           572:        if (strp->h_print)
        !           573:            numprint++;
        !           574:     if (numprint & 01)         /* round odd numbers up */
        !           575:        numprint++;
        !           576:     numprint /= 2;
        !           577:     if (numprint > LINES - 1)
        !           578:        numprint = LINES - 1;
        !           579:
        !           580:     wclear(hw);
        !           581:     cnt = 0;
        !           582:     for (strp = helpstr; strp->h_desc != NULL; strp++)
        !           583:        if (strp->h_print)
        !           584:        {
        !           585:            wmove(hw, cnt % numprint, cnt >= numprint ? COLS / 2 : 0);
        !           586:            if (strp->h_ch)
        !           587:                waddstr(hw, unctrl(strp->h_ch));
        !           588:            waddstr(hw, strp->h_desc);
        !           589:            if (++cnt >= numprint * 2)
        !           590:                break;
        !           591:        }
        !           592:     wmove(hw, LINES - 1, 0);
        !           593:     waddstr(hw, "--Press space to continue--");
        !           594:     wrefresh(hw);
        !           595:     wait_for(hw, ' ');
        !           596:     clearok(stdscr, TRUE);
        !           597: /*
        !           598:     refresh();
        !           599: */
        !           600:     msg("");
        !           601:     touchwin(stdscr);
        !           602:     wrefresh(stdscr);
        !           603: }
        !           604:
        !           605: /*
        !           606:  * identify:
        !           607:  *     Tell the player what a certain thing is.
        !           608:  */
        !           609: void
        !           610: identify(void)
        !           611: {
        !           612:     int ch;
        !           613:     const struct h_list *hp;
        !           614:     const char *str;
        !           615:     const struct h_list ident_list[] = {
        !           616:        {'|',           "wall of a room",               FALSE},
        !           617:        {'-',           "wall of a room",               FALSE},
        !           618:        {GOLD,          "gold",                         FALSE},
        !           619:        {STAIRS,        "a staircase",                  FALSE},
        !           620:        {DOOR,          "door",                         FALSE},
        !           621:        {FLOOR,         "room floor",                   FALSE},
        !           622:        {PLAYER,        "you",                          FALSE},
        !           623:        {PASSAGE,       "passage",                      FALSE},
        !           624:        {TRAP,          "trap",                         FALSE},
        !           625:        {POTION,        "potion",                       FALSE},
        !           626:        {SCROLL,        "scroll",                       FALSE},
        !           627:        {FOOD,          "food",                         FALSE},
        !           628:        {WEAPON,        "weapon",                       FALSE},
        !           629:        {' ',           "solid rock",                   FALSE},
        !           630:        {ARMOR,         "armor",                        FALSE},
        !           631:        {AMULET,        "the Amulet of Yendor",         FALSE},
        !           632:        {RING,          "ring",                         FALSE},
        !           633:        {STICK,         "wand or staff",                FALSE},
        !           634:        {'\0'}
        !           635:     };
        !           636:
        !           637:     msg("what do you want identified? ");
        !           638:     ch = readchar();
        !           639:     mpos = 0;
        !           640:     if (ch == ESCAPE)
        !           641:     {
        !           642:        msg("");
        !           643:        return;
        !           644:     }
        !           645:     if (isupper(ch))
        !           646:        str = monsters[ch-'A'].m_name;
        !           647:     else
        !           648:     {
        !           649:        str = "unknown character";
        !           650:        for (hp = ident_list; hp->h_ch != '\0'; hp++)
        !           651:            if (hp->h_ch == ch)
        !           652:            {
        !           653:                str = hp->h_desc;
        !           654:                break;
        !           655:            }
        !           656:     }
        !           657:     msg("'%s': %s", unctrl(ch), str);
        !           658: }
        !           659:
        !           660: /*
        !           661:  * d_level:
        !           662:  *     He wants to go down a level
        !           663:  */
        !           664: void
        !           665: d_level(void)
        !           666: {
        !           667:     if (levit_check())
        !           668:        return;
        !           669:     if (chat(hero.y, hero.x) != STAIRS)
        !           670:        msg("I see no way down");
        !           671:     else
        !           672:     {
        !           673:        level++;
        !           674:        seenstairs = FALSE;
        !           675:        new_level();
        !           676:     }
        !           677: }
        !           678:
        !           679: /*
        !           680:  * u_level:
        !           681:  *     He wants to go up a level
        !           682:  */
        !           683: void
        !           684: u_level(void)
        !           685: {
        !           686:     if (levit_check())
        !           687:        return;
        !           688:     if (chat(hero.y, hero.x) == STAIRS)
        !           689:        if (amulet)
        !           690:        {
        !           691:            level--;
        !           692:            if (level == 0)
        !           693:                total_winner();
        !           694:            new_level();
        !           695:            msg("you feel a wrenching sensation in your gut");
        !           696:        }
        !           697:        else
        !           698:            msg("your way is magically blocked");
        !           699:     else
        !           700:        msg("I see no way up");
        !           701: }
        !           702:
        !           703: /*
        !           704:  * levit_check:
        !           705:  *     Check to see if she's levitating, and if she is, print an
        !           706:  *     appropriate message.
        !           707:  */
        !           708: int
        !           709: levit_check(void)
        !           710: {
        !           711:     if (!on(player, ISLEVIT))
        !           712:        return FALSE;
        !           713:     msg("You can't.  You're floating off the ground!");
        !           714:     return TRUE;
        !           715: }
        !           716:
        !           717: /*
        !           718:  * call:
        !           719:  *     Allow a user to call a potion, scroll, or ring something
        !           720:  */
        !           721: void
        !           722: call(void)
        !           723: {
        !           724:     THING *obj;
        !           725:     struct obj_info *op = NULL;
        !           726:     char **guess;
        !           727:     const char *elsewise = NULL;
        !           728:     int *know;
        !           729:
        !           730:     obj = get_item("call", CALLABLE);
        !           731:     /*
        !           732:      * Make certain that it is somethings that we want to wear
        !           733:      */
        !           734:     if (obj == NULL)
        !           735:        return;
        !           736:     switch (obj->o_type)
        !           737:     {
        !           738:        case RING:
        !           739:            op = &ring_info[obj->o_which];
        !           740:            elsewise = r_stones[obj->o_which];
        !           741:            goto norm;
        !           742:        when POTION:
        !           743:            op = &pot_info[obj->o_which];
        !           744:            elsewise = p_colors[obj->o_which];
        !           745:            goto norm;
        !           746:        when SCROLL:
        !           747:            op = &scr_info[obj->o_which];
        !           748:            elsewise = s_names[obj->o_which];
        !           749:            goto norm;
        !           750:        when STICK:
        !           751:            op = &ws_info[obj->o_which];
        !           752:            elsewise = ws_made[obj->o_which];
        !           753: norm:
        !           754:            know = &op->oi_know;
        !           755:            guess = &op->oi_guess;
        !           756:            if (*guess != NULL)
        !           757:                elsewise = *guess;
        !           758:        when FOOD:
        !           759:            msg("you can't call that anything");
        !           760:            return;
        !           761:        otherwise:
        !           762:            guess = &obj->o_label;
        !           763:            know = NULL;
        !           764:            elsewise = obj->o_label;
        !           765:     }
        !           766:     if (know != NULL && *know)
        !           767:     {
        !           768:        msg("that has already been identified");
        !           769:        return;
        !           770:     }
        !           771:     if (elsewise != NULL && elsewise == *guess)
        !           772:     {
        !           773:        if (!terse)
        !           774:            addmsg("Was ");
        !           775:        msg("called \"%s\"", elsewise);
        !           776:     }
        !           777:     if (terse)
        !           778:        msg("call it: ");
        !           779:     else
        !           780:        msg("what do you want to call it? ");
        !           781:
        !           782:     if (elsewise == NULL)
        !           783:        strcpy(prbuf, "");
        !           784:     else
        !           785:        strcpy(prbuf, elsewise);
        !           786:     if (get_str(prbuf, stdscr) == NORM)
        !           787:     {
        !           788:        if (*guess != NULL)
        !           789:            free(*guess);
        !           790:        *guess = malloc(strlen(prbuf) + 1);
        !           791:        if (*guess != NULL)
        !           792:                strcpy(*guess, prbuf);
        !           793:     }
        !           794:
        !           795:     msg("");
        !           796: }
        !           797:
        !           798: /*
        !           799:  * current:
        !           800:  *     Print the current weapon/armor
        !           801:  */
        !           802: void
        !           803: current(const THING *cur, const char *how, const char *where)
        !           804: {
        !           805:     after = FALSE;
        !           806:     if (cur != NULL)
        !           807:     {
        !           808:        if (!terse)
        !           809:            addmsg("you are %s (", how);
        !           810:        inv_describe = FALSE;
        !           811:        addmsg("%c) %s", cur->o_packch, inv_name(cur, TRUE));
        !           812:        inv_describe = TRUE;
        !           813:        if (where)
        !           814:            addmsg(" %s", where);
        !           815:        endmsg();
        !           816:     }
        !           817:     else
        !           818:     {
        !           819:        if (!terse)
        !           820:            addmsg("you are ");
        !           821:        addmsg("%s nothing", how);
        !           822:        if (where)
        !           823:            addmsg(" %s", where);
        !           824:        endmsg();
        !           825:     }
        !           826: }

CVSweb