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

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

1.1     ! rubenllo    1: /*
        !             2:  * Read and execute the user commands
        !             3:  *
        !             4:  * Advanced Rogue
        !             5:  * Copyright (C) 1984, 1985 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 <string.h>
        !            18: #include <limits.h>
        !            19: #include <ctype.h>
        !            20: #include <signal.h>
        !            21: #include "rogue.h"
        !            22: #include "mach_dep.h"
        !            23:
        !            24: void help(void);
        !            25: void identify(void);
        !            26: void d_level(void);
        !            27: void u_level(void);
        !            28: void shell(void);
        !            29: void call(bool mark);
        !            30:
        !            31: /*
        !            32:  * command:
        !            33:  *     Process the user commands
        !            34:  */
        !            35:
        !            36: void
        !            37: command(void)
        !            38: {
        !            39:     register char ch;
        !            40:     register int ntimes = 1;                   /* Number of player moves */
        !            41:     static char countch, direction, newcount = FALSE;
        !            42:     struct linked_list *item;
        !            43:     bool an_after = FALSE;
        !            44:
        !            45:     if (on(player, ISHASTE)) {
        !            46:        ntimes++;
        !            47:        turns--;        /* correct for later */
        !            48:     }
        !            49:     if (on(player, ISSLOW) || on(player, ISDANCE)) {
        !            50:        if (player.t_turn != TRUE) {
        !            51:            ntimes--;
        !            52:            turns++;
        !            53:            an_after = TRUE;
        !            54:        }
        !            55:        player.t_turn ^= TRUE;
        !            56:     }
        !            57:
        !            58:     /*
        !            59:      * Let the daemons start up
        !            60:      */
        !            61:     do_daemons(BEFORE);
        !            62:     do_fuses(BEFORE);
        !            63:     while (ntimes-- > 0)
        !            64:     {
        !            65:        /* One more tick of the clock. */
        !            66:        if ((++turns % DAYLENGTH) == 0) {
        !            67:            daytime ^= TRUE;
        !            68:            if (levtype == OUTSIDE) {
        !            69:                if (daytime) msg("The sun rises above the horizon");
        !            70:                else msg("The sun sinks below the horizon");
        !            71:            }
        !            72:            light(&hero);
        !            73:        }
        !            74:
        !            75:        look(after, FALSE);
        !            76:        if (!running) door_stop = FALSE;
        !            77:        lastscore = purse;
        !            78:        wmove(cw, hero.y, hero.x);
        !            79:        if (!((running || count) && jump)) {
        !            80:            status(FALSE);
        !            81:            wmove(cw, hero.y, hero.x);
        !            82:            draw(cw);                   /* Draw screen */
        !            83:        }
        !            84:        take = 0;
        !            85:        after = TRUE;
        !            86:        /*
        !            87:         * Read command or continue run
        !            88:         */
        !            89:        if (!no_command)
        !            90:        {
        !            91:            if (running) {
        !            92:                /* If in a corridor or maze, if we are at a turn with only one
        !            93:                 * way to go, turn that way.
        !            94:                 */
        !            95:                if ((winat(hero.y, hero.x) == PASSAGE || levtype == MAZELEV) &&
        !            96:                    off(player, ISHUH) && (off(player, ISBLIND))) {
        !            97:                    int y, x;
        !            98:                    if (getdelta(runch, &y, &x) == TRUE) {
        !            99:                        corr_move(y, x);
        !           100:                    }
        !           101:                }
        !           102:                ch = runch;
        !           103:            }
        !           104:            else if (count) ch = countch;
        !           105:            else
        !           106:            {
        !           107:                ch = readchar();
        !           108:                if (mpos != 0 && !running)      /* Erase message if its there */
        !           109:                    msg("");
        !           110:            }
        !           111:        }
        !           112:        else ch = '.';
        !           113:        if (no_command)
        !           114:        {
        !           115:            if (--no_command == 0)
        !           116:                msg("You can move again.");
        !           117:        }
        !           118:        else
        !           119:        {
        !           120:            /*
        !           121:             * check for prefixes
        !           122:             */
        !           123:            if (isdigit(ch))
        !           124:            {
        !           125:                count = 0;
        !           126:                newcount = TRUE;
        !           127:                while (isdigit(ch))
        !           128:                {
        !           129:                    count = count * 10 + (ch - '0');
        !           130:                    if (count > 255)
        !           131:                        count = 255;
        !           132:                    ch = readchar();
        !           133:                }
        !           134:                countch = ch;
        !           135:                /*
        !           136:                 * turn off count for commands which don't make sense
        !           137:                 * to repeat
        !           138:                 */
        !           139:                switch (ch) {
        !           140:                    case 'h': case 'j': case 'k': case 'l':
        !           141:                    case 'y': case 'u': case 'b': case 'n':
        !           142:                    case 'H': case 'J': case 'K': case 'L':
        !           143:                    case 'Y': case 'U': case 'B': case 'N':
        !           144:                    case 'q': case 'r': case 's': case 'f':
        !           145:                    case 't': case 'C': case 'I': case '.':
        !           146:                    case 'z': case 'p':
        !           147:                        break;
        !           148:                    default:
        !           149:                        count = 0;
        !           150:                }
        !           151:            }
        !           152:
        !           153:            /* Save current direction */
        !           154:            if (!running) /* If running, it is already saved */
        !           155:            switch (ch) {
        !           156:                case 'h': case 'j': case 'k': case 'l':
        !           157:                case 'y': case 'u': case 'b': case 'n':
        !           158:                case 'H': case 'J': case 'K': case 'L':
        !           159:                case 'Y': case 'U': case 'B': case 'N':
        !           160:                    runch = tolower(ch);
        !           161:            }
        !           162:
        !           163:            /* Perform the action */
        !           164:            switch (ch) {
        !           165:                case 'f':
        !           166:                    if (!on(player, ISBLIND))
        !           167:                    {
        !           168:                        door_stop = TRUE;
        !           169:                        firstmove = TRUE;
        !           170:                    }
        !           171:                    if (count && !newcount)
        !           172:                        ch = direction;
        !           173:                    else
        !           174:                        ch = readchar();
        !           175:                    switch (ch)
        !           176:                    {
        !           177:                        case 'h': case 'j': case 'k': case 'l':
        !           178:                        case 'y': case 'u': case 'b': case 'n':
        !           179:                            ch = toupper(ch);
        !           180:                    }
        !           181:                    direction = ch;
        !           182:            }
        !           183:            newcount = FALSE;
        !           184:            /*
        !           185:             * execute a command
        !           186:             */
        !           187:            if (count && !running)
        !           188:                count--;
        !           189:            switch (ch)
        !           190:            {
        !           191:                case '!' : shell();
        !           192:                when 'h' : do_move(0, -1);
        !           193:                when 'j' : do_move(1, 0);
        !           194:                when 'k' : do_move(-1, 0);
        !           195:                when 'l' : do_move(0, 1);
        !           196:                when 'y' : do_move(-1, -1);
        !           197:                when 'u' : do_move(-1, 1);
        !           198:                when 'b' : do_move(1, -1);
        !           199:                when 'n' : do_move(1, 1);
        !           200:                when 'H' : do_run('h');
        !           201:                when 'J' : do_run('j');
        !           202:                when 'K' : do_run('k');
        !           203:                when 'L' : do_run('l');
        !           204:                when 'Y' : do_run('y');
        !           205:                when 'U' : do_run('u');
        !           206:                when 'B' : do_run('b');
        !           207:                when 'N' : do_run('n');
        !           208:                when 't':
        !           209:                    if((item=get_item(pack,"throw", ALL)) != NULL && get_dir())
        !           210:                        missile(delta.y, delta.x, item, &player);
        !           211:                    else
        !           212:                        after = FALSE;
        !           213:                when 'Q' : after = FALSE; quit(-1);
        !           214:                when 'i' : after = FALSE; inventory(pack, ALL);
        !           215:                when 'I' : after = FALSE; picky_inven();
        !           216:                when 'd' : drop(NULL);
        !           217:                when 'P' : grab(hero.y, hero.x);
        !           218:                when 'q' : quaff(-1, 0, TRUE);
        !           219:                when 'r' : read_scroll(-1, 0, TRUE);
        !           220:                when 'e' : eat();
        !           221:                when 'w' : wield();
        !           222:                when 'W' : wear();
        !           223:                when 'T' : take_off();
        !           224:                when 'o' : option();
        !           225:                when 'c' : call(FALSE);
        !           226:                when 'm' : call(TRUE);
        !           227:                when '>' : after = FALSE; d_level();
        !           228:                when '<' : after = FALSE; u_level();
        !           229:                when '?' : after = FALSE; help();
        !           230:                when '/' : after = FALSE; identify();
        !           231:                when CTRL('U') : use_mm(-1);
        !           232:                when CTRL('T') :
        !           233:                    if (get_dir()) steal();
        !           234:                    else after = FALSE;
        !           235:                when 'D' : dip_it();
        !           236:                when 'G' : gsense();
        !           237:                when '^' : set_trap(&player, hero.y, hero.x);
        !           238:                when 's' : search(FALSE, FALSE);
        !           239:                when 'z' : if (!do_zap(TRUE, 0, FALSE))
        !           240:                                after=FALSE;
        !           241:                when 'p' : pray();
        !           242:                when 'C' : cast();
        !           243:                when 'a' :
        !           244:                    if (get_dir())
        !           245:                        affect();
        !           246:                    else after = FALSE;
        !           247:                when 'v' : after = FALSE;
        !           248:                           msg("Advanced Rogue Version %s.",
        !           249:                                release);
        !           250:                when CTRL('L') : after = FALSE; clearok(curscr, TRUE);
        !           251:                                touchwin(cw); /* MMMMMMMMMM */
        !           252:                when CTRL('R') : after = FALSE; msg(huh);
        !           253:                when 'S' :
        !           254:                    after = FALSE;
        !           255:                    if (save_game())
        !           256:                    {
        !           257:                        wclear(cw);
        !           258:                        draw(cw);
        !           259:                        endwin();
        !           260:                        printf("\n");
        !           261:                        exit(0);
        !           262:                    }
        !           263:                when '.' : ;                    /* Rest command */
        !           264:                when ' ' : after = FALSE;       /* Do Nothing */
        !           265: #ifdef WIZARD
        !           266:                when CTRL('P') :
        !           267:                    after = FALSE;
        !           268:                    if (wizard)
        !           269:                    {
        !           270:                        wizard = FALSE;
        !           271:                        trader = 0;
        !           272:                        msg("Not wizard any more");
        !           273:                    }
        !           274:                    else
        !           275:                    {
        !           276:                        if (waswizard || passwd())
        !           277:                        {
        !           278:                            msg("Welcome, oh mighty wizard.");
        !           279:                            wizard = waswizard = TRUE;
        !           280:                        }
        !           281:                        else
        !           282:                            msg("Sorry");
        !           283:                    }
        !           284: #endif
        !           285:                when ESCAPE :   /* Escape */
        !           286:                    door_stop = FALSE;
        !           287:                    count = 0;
        !           288:                    after = FALSE;
        !           289:                when '#':
        !           290:                    if (levtype == POSTLEV)             /* buy something */
        !           291:                        buy_it();
        !           292:                    after = FALSE;
        !           293:                when '$':
        !           294:                    if (levtype == POSTLEV)             /* price something */
        !           295:                        price_it();
        !           296:                    after = FALSE;
        !           297:                when '%':
        !           298:                    if (levtype == POSTLEV)             /* sell something */
        !           299:                        sell_it();
        !           300:                    after = FALSE;
        !           301:                otherwise :
        !           302:                    after = FALSE;
        !           303: #ifdef WIZARD
        !           304:                    if (wizard) switch (ch)
        !           305:                    {
        !           306:                        case 'M' : create_obj(TRUE, 0, 0);
        !           307:                        when CTRL('W') : wanderer();
        !           308:                        when CTRL('I') : inventory(lvl_obj, ALL);
        !           309:                        when CTRL('Z') : whatis(NULL);
        !           310:                        when CTRL('D') : level++; new_level(NORMLEV);
        !           311:                        when CTRL('F') : overlay(stdscr,cw);
        !           312:                        when CTRL('X') : overlay(mw,cw);
        !           313:                        when CTRL('J') : teleport();
        !           314:                        when CTRL('E') : sprintf(outstring,"food left: %d\tfood level: %d",
        !           315:                                                food_left, foodlev);
        !           316:                                       msg(outstring);
        !           317:                        when CTRL('A') : activity();
        !           318:                        when CTRL('C') :
        !           319:                        {
        !           320:                            int tlev;
        !           321:                            prbuf[0] = '\0';
        !           322:                            msg("Which level? ");
        !           323:                            if(get_str(prbuf, msgw) == NORM) {
        !           324:                                tlev = atoi(prbuf);
        !           325:                                if(tlev < 1) {
        !           326:                                    mpos = 0;
        !           327:                                    msg("Illegal level.");
        !           328:                                }
        !           329:                                else if (tlev > 199) {
        !           330:                                        levtype = MAZELEV;
        !           331:                                        level = tlev - 200 + 1;
        !           332:                                }
        !           333:                                else if (tlev > 99) {
        !           334:                                        levtype = POSTLEV;
        !           335:                                        level = tlev - 100 + 1;
        !           336:                                }
        !           337:                                else {
        !           338:                                        levtype = NORMLEV;
        !           339:                                        level = tlev;
        !           340:                                }
        !           341:                                new_level(levtype);
        !           342:                            }
        !           343:                        }
        !           344:                        when CTRL('N') :
        !           345:                        {
        !           346:                            if ((item=get_item(pack, "charge", STICK)) != NULL){
        !           347:                                (OBJPTR(item))->o_charges=10000;
        !           348:                            }
        !           349:                        }
        !           350:                        when CTRL('H') :
        !           351:                        {
        !           352:                            register int i;
        !           353:                            register struct object *obj;
        !           354:
        !           355:                            for (i = 0; i < 9; i++)
        !           356:                                raise_level(TRUE);
        !           357:                            /*
        !           358:                             * Give the rogue a sword
        !           359:                             */
        !           360:                            if(cur_weapon==NULL || cur_weapon->o_type!=RELIC) {
        !           361:                                item = spec_item(WEAPON, TWOSWORD, 5, 5);
        !           362:                                add_pack(item, TRUE, NULL);
        !           363:                                cur_weapon = OBJPTR(item);
        !           364:                                cur_weapon->o_flags |= (ISKNOW | ISPROT);
        !           365:                            }
        !           366:                            /*
        !           367:                             * And his suit of armor
        !           368:                             */
        !           369:                            if (player.t_ctype == C_THIEF)
        !           370:                                item = spec_item(ARMOR, STUDDED_LEATHER, 10, 0);
        !           371:                            else
        !           372:                                item = spec_item(ARMOR, PLATE_ARMOR, 7, 0);
        !           373:                            obj = OBJPTR(item);
        !           374:                            obj->o_flags |= (ISKNOW | ISPROT);
        !           375:                            obj->o_weight = armors[PLATE_ARMOR].a_wght;
        !           376:                            cur_armor = obj;
        !           377:                            add_pack(item, TRUE, NULL);
        !           378:                            purse += 20000;
        !           379:                        }
        !           380:                        otherwise :
        !           381:                            msg("Illegal command '%s'.", unctrl(ch));
        !           382:                            count = 0;
        !           383:                    }
        !           384:                    else
        !           385: #endif
        !           386:                    {
        !           387:                        msg("Illegal command '%s'.", unctrl(ch));
        !           388:                        count = 0;
        !           389:                        after = FALSE;
        !           390:                    }
        !           391:            }
        !           392:            /*
        !           393:             * turn off flags if no longer needed
        !           394:             */
        !           395:            if (!running)
        !           396:                door_stop = FALSE;
        !           397:        }
        !           398:        /*
        !           399:         * If he ran into something to take, let him pick it up.
        !           400:         * unless its a trading post
        !           401:         */
        !           402:        if (auto_pickup && take != 0 && levtype != POSTLEV)
        !           403:            pick_up(take);
        !           404:        if (!running)
        !           405:            door_stop = FALSE;
        !           406:
        !           407:        /* If after is true, mark an_after as true so that if
        !           408:         * we are hasted, the first "after" will be noted.
        !           409:         * if after is FALSE then stay in this loop
        !           410:         */
        !           411:        if (after) an_after = TRUE;
        !           412:        else ntimes++;
        !           413:     }
        !           414:
        !           415:     /*
        !           416:      * Kick off the rest if the daemons and fuses
        !           417:      */
        !           418:     if (an_after)
        !           419:     {
        !           420:        /*
        !           421:         * If player is infested, take off a hit point
        !           422:         */
        !           423:        if (on(player, HASINFEST)) {
        !           424:            if ((pstats.s_hpt -= infest_dam) <= 0) death(D_INFESTATION);
        !           425:        }
        !           426:        /*
        !           427:         * if player has body rot then take off five hits
        !           428:         */
        !           429:        if (on(player, DOROT)) {
        !           430:             if ((pstats.s_hpt -= 5) <= 0) death(D_ROT);
        !           431:        }
        !           432:        do_daemons(AFTER);
        !           433:        do_fuses(AFTER);
        !           434:        if (!((running || count) && jump)) look(FALSE, FALSE);
        !           435:
        !           436:
        !           437:     }
        !           438:     t_free_list(monst_dead);
        !           439: }
        !           440:
        !           441: /*
        !           442:  * quit:
        !           443:  *     Have player make certain, then exit.
        !           444:  */
        !           445:
        !           446: void
        !           447: quit(int sig)
        !           448: {
        !           449:     NOOP(sig);
        !           450:
        !           451:     /*
        !           452:      * Reset the signal in case we got here via an interrupt
        !           453:      */
        !           454:     if (signal(SIGINT, &quit) != &quit)
        !           455:        mpos = 0;
        !           456:     msg("Really quit? ");
        !           457:     draw(cw);
        !           458:     if (readchar() == 'y')
        !           459:     {
        !           460:        clear();
        !           461:        move(LINES-1, 0);
        !           462:        draw(stdscr);
        !           463:        writelog(pstats.s_exp + (long) purse, CHICKEN, 0);
        !           464:        score(pstats.s_exp + (long) purse, CHICKEN, 0);
        !           465:        exit(0);
        !           466:     }
        !           467:     else
        !           468:     {
        !           469:        signal(SIGINT, quit);
        !           470:        wmove(cw, 0, 0);
        !           471:        wclrtoeol(cw);
        !           472:        status(FALSE);
        !           473:        draw(cw);
        !           474:        mpos = 0;
        !           475:        count = 0;
        !           476:        running = FALSE;
        !           477:     }
        !           478: }
        !           479:
        !           480: /*
        !           481:  * bugkill:
        !           482:  *     killed by a program bug instead of voluntarily.
        !           483:  */
        !           484:
        !           485: void
        !           486: bugkill(int sig)
        !           487: {
        !           488:     signal(sig, quit); /* If we get it again, give up */
        !           489:     death(D_SIGNAL);   /* Killed by a bug */
        !           490: }
        !           491:
        !           492:
        !           493: /*
        !           494:  * search:
        !           495:  *     Player gropes about him to find hidden things.
        !           496:  */
        !           497:
        !           498: void
        !           499: search(bool is_thief, bool door_chime)
        !           500: {
        !           501:     register int x, y;
        !           502:     register char ch,  /* The trap or door character */
        !           503:                 sch,   /* Trap or door character (as seen on screen) */
        !           504:                 mch;   /* Monster, if a monster is on the trap or door */
        !           505:     register struct linked_list *item;
        !           506:     register struct thing *mp; /* Status on surrounding monster */
        !           507:
        !           508:     /*
        !           509:      * Look all around the hero, if there is something hidden there,
        !           510:      * give him a chance to find it.  If its found, display it.
        !           511:      */
        !           512:     if (on(player, ISBLIND))
        !           513:        return;
        !           514:     for (x = hero.x - 1; x <= hero.x + 1; x++)
        !           515:        for (y = hero.y - 1; y <= hero.y + 1; y++)
        !           516:        {
        !           517:            if (y==hero.y && x==hero.x)
        !           518:                continue;
        !           519:
        !           520:            /* Mch and ch will be the same unless there is a monster here */
        !           521:            mch = CCHAR( winat(y, x) );
        !           522:            ch = CCHAR( mvwinch(stdscr, y, x) );
        !           523:            sch = CCHAR( mvwinch(cw, y, x) );   /* What's on the screen */
        !           524:
        !           525:            if (door_chime == FALSE && isatrap(ch)) {
        !           526:                    register struct trap *tp;
        !           527:
        !           528:                    /* Is there a monster on the trap? */
        !           529:                    if (mch != ch && (item = find_mons(y, x)) != NULL) {
        !           530:                        mp = THINGPTR(item);
        !           531:                        if (sch == mch) sch = mp->t_oldch;
        !           532:                    }
        !           533:                    else mp = NULL;
        !           534:
        !           535:                    /*
        !           536:                     * is this one found already?
        !           537:                     */
        !           538:                    if (isatrap(sch))
        !           539:                        continue;       /* give him chance for other traps */
        !           540:                    tp = trap_at(y, x);
        !           541:                    /*
        !           542:                     * if the thief set it then don't display it.
        !           543:                     * if its not a thief he has 50/50 shot
        !           544:                     */
        !           545:                    if((tp->tr_flags&ISTHIEFSET) || (!is_thief && rnd(100)>50))
        !           546:                        continue;       /* give him chance for other traps */
        !           547:                    tp->tr_flags |= ISFOUND;
        !           548:
        !           549:                    /* Let's update the screen */
        !           550:                    if (mp != NULL && CCHAR(mvwinch(cw, y, x)) == mch)
        !           551:                        mp->t_oldch = ch; /* Will change when monst moves */
        !           552:                    else mvwaddch(cw, y, x, ch);
        !           553:
        !           554:                    count = 0;
        !           555:                    running = FALSE;
        !           556:                    msg(tr_name(tp->tr_type));
        !           557:            }
        !           558:            else if (ch == SECRETDOOR) {
        !           559:                if (door_chime == TRUE || (!is_thief && rnd(100) < 20)) {
        !           560:                    /* Is there a monster on the door? */
        !           561:                    if (mch != ch && (item = find_mons(y, x)) != NULL) {
        !           562:                        mp = THINGPTR(item);
        !           563:
        !           564:                        /* Screen will change when monster moves */
        !           565:                        if (sch == mch) mp->t_oldch = ch;
        !           566:                    }
        !           567:                    mvaddch(y, x, DOOR);
        !           568:                    count = 0;
        !           569:                }
        !           570:            }
        !           571:        }
        !           572: }
        !           573:
        !           574:
        !           575: /*
        !           576:  * help:
        !           577:  *     Give single character help, or the whole mess if he wants it
        !           578:  */
        !           579:
        !           580: void
        !           581: help(void)
        !           582: {
        !           583:     register struct h_list *strp = helpstr;
        !           584: #ifdef WIZARD
        !           585:     struct h_list *wizp = wiz_help;
        !           586: #endif
        !           587:     register char helpch;
        !           588:     register int cnt;
        !           589:
        !           590:     msg("Character you want help for (* for all): ");
        !           591:     helpch = readchar();
        !           592:     mpos = 0;
        !           593:     /*
        !           594:      * If its not a *, print the right help string
        !           595:      * or an error if he typed a funny character.
        !           596:      */
        !           597:     if (helpch != '*') {
        !           598:        wmove(cw, 0, 0);
        !           599:        while (strp->h_ch) {
        !           600:            if (strp->h_ch == helpch) {
        !           601:                sprintf(outstring,"%s%s", unctrl(strp->h_ch), strp->h_desc);
        !           602:                msg(outstring);
        !           603:                return;
        !           604:            }
        !           605:            strp++;
        !           606:        }
        !           607: #ifdef WIZARD
        !           608:        if (wizard) {
        !           609:            while (wizp->h_ch) {
        !           610:                if (wizp->h_ch == helpch) {
        !           611:                    sprintf(outstring,"%s%s", unctrl(wizp->h_ch), wizp->h_desc);
        !           612:                    msg(outstring);
        !           613:                    return;
        !           614:                }
        !           615:                wizp++;
        !           616:            }
        !           617:        }
        !           618: #endif
        !           619:
        !           620:        msg("Unknown character '%s'", unctrl(helpch));
        !           621:        return;
        !           622:     }
        !           623:     /*
        !           624:      * Here we print help for everything.
        !           625:      * Then wait before we return to command mode
        !           626:      */
        !           627:     wclear(hw);
        !           628:     cnt = 0;
        !           629:     while (strp->h_ch) {
        !           630:        mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(strp->h_ch));
        !           631:        waddstr(hw, strp->h_desc);
        !           632:        strp++;
        !           633:        if (++cnt >= 46 && strp->h_ch) {
        !           634:            wmove(hw, LINES-1, 0);
        !           635:            wprintw(hw, morestr);
        !           636:            draw(hw);
        !           637:            wait_for(hw,' ');
        !           638:            wclear(hw);
        !           639:            cnt = 0;
        !           640:        }
        !           641:     }
        !           642: #ifdef WIZARD
        !           643:     if (wizard) {
        !           644:        while (wizp->h_ch) {
        !           645:            mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(wizp->h_ch));
        !           646:            waddstr(hw, wizp->h_desc);
        !           647:            wizp++;
        !           648:            if (++cnt >= 46 && wizp->h_ch) {
        !           649:                wmove(hw, LINES-1, 0);
        !           650:                wprintw(hw, morestr);
        !           651:                draw(hw);
        !           652:                wait_for(hw,' ');
        !           653:                wclear(hw);
        !           654:                cnt = 0;
        !           655:            }
        !           656:        }
        !           657:     }
        !           658: #endif
        !           659:     wmove(hw, LINES-1, 0);
        !           660:     wprintw(hw, spacemsg);
        !           661:     draw(hw);
        !           662:     wait_for(hw,' ');
        !           663:     wclear(hw);
        !           664:     draw(hw);
        !           665:     wmove(cw, 0, 0);
        !           666:     wclrtoeol(cw);
        !           667:     status(FALSE);
        !           668:     touchwin(cw);
        !           669: }
        !           670: /*
        !           671:  * identify:
        !           672:  *     Tell the player what a certain thing is.
        !           673:  */
        !           674:
        !           675: void
        !           676: identify(void)
        !           677: {
        !           678:     register char ch;
        !           679:     const char *str;
        !           680:
        !           681:     msg("What do you want identified? ");
        !           682:     ch = readchar();
        !           683:     mpos = 0;
        !           684:     if (ch == ESCAPE)
        !           685:     {
        !           686:        msg("");
        !           687:        return;
        !           688:     }
        !           689:     if (isalpha(ch))
        !           690:        str = monsters[id_monst(ch)].m_name;
        !           691:     else switch(ch)
        !           692:     {
        !           693:        case '|':
        !           694:        case '-':
        !           695:            str = (levtype == OUTSIDE) ? "boundary of sector"
        !           696:                                       : "wall of a room";
        !           697:        when GOLD:      str = "gold";
        !           698:        when STAIRS :   str = (levtype == OUTSIDE) ? "entrance to a dungeon"
        !           699:                                                   : "passage leading down";
        !           700:        when DOOR:      str = "door";
        !           701:        when FLOOR:     str = (levtype == OUTSIDE) ? "meadow" : "room floor";
        !           702:        when VPLAYER:   str = "the hero of the game ---> you";
        !           703:        when IPLAYER:   str = "you (but invisible)";
        !           704:        when PASSAGE:   str = "passage";
        !           705:        when POST:      str = "trading post";
        !           706:        when POOL:      str = (levtype == OUTSIDE) ? "lake"
        !           707:                                                   : "a shimmering pool";
        !           708:        when TRAPDOOR:  str = "trapdoor";
        !           709:        when ARROWTRAP: str = "arrow trap";
        !           710:        when SLEEPTRAP: str = "sleeping gas trap";
        !           711:        when BEARTRAP:  str = "bear trap";
        !           712:        when TELTRAP:   str = "teleport trap";
        !           713:        when DARTTRAP:  str = "dart trap";
        !           714:        when MAZETRAP:  str = "entrance to a maze";
        !           715:        when FOREST:    str = "forest";
        !           716:        when POTION:    str = "potion";
        !           717:        when SCROLL:    str = "scroll";
        !           718:        when FOOD:      str = "food";
        !           719:        when WEAPON:    str = "weapon";
        !           720:        when ' ' :      str = "solid rock";
        !           721:        when ARMOR:     str = "armor";
        !           722:        when MM:        str = "miscellaneous magic";
        !           723:        when RING:      str = "ring";
        !           724:        when STICK:     str = "wand or staff";
        !           725:        when SECRETDOOR:str = "secret door";
        !           726:        when RELIC:     str = "artifact";
        !           727:        otherwise:      str = "unknown character";
        !           728:     }
        !           729:     sprintf(outstring,"'%s' : %s", unctrl(ch), str);
        !           730:     msg(outstring);
        !           731: }
        !           732:
        !           733: /*
        !           734:  * d_level:
        !           735:  *     He wants to go down a level
        !           736:  */
        !           737:
        !           738: void
        !           739: d_level(void)
        !           740: {
        !           741:     bool no_phase=FALSE;
        !           742:
        !           743:
        !           744:     /* If we are at a top-level trading post, we probably can't go down */
        !           745:     if (levtype == POSTLEV && level == 0 && rnd(100) < 80) {
        !           746:        msg("I see no way down.");
        !           747:        return;
        !           748:     }
        !           749:
        !           750:     if (winat(hero.y, hero.x) != STAIRS) {
        !           751:        if (off(player, CANINWALL) ||   /* Must use stairs if can't phase */
        !           752:            (levtype == OUTSIDE && rnd(100) < 90)) {
        !           753:            msg("I see no way down.");
        !           754:            return;
        !           755:        }
        !           756:
        !           757:        /* Is there any dungeon left below? */
        !           758:        if (level >= nfloors) {
        !           759:            msg("There is only solid rock below.");
        !           760:            return;
        !           761:        }
        !           762:
        !           763:        extinguish(unphase);    /* Using phase to go down gets rid of it */
        !           764:        no_phase = TRUE;
        !           765:     }
        !           766:
        !           767:     /* Is this the bottom? */
        !           768:     if (level >= nfloors) {
        !           769:        msg("The stairway only goes up.");
        !           770:        return;
        !           771:     }
        !           772:
        !           773:     level++;
        !           774:     new_level(NORMLEV);
        !           775:     if (no_phase) unphase();
        !           776: }
        !           777:
        !           778: /*
        !           779:  * u_level:
        !           780:  *     He wants to go up a level
        !           781:  */
        !           782:
        !           783: void
        !           784: u_level(void)
        !           785: {
        !           786:     bool no_phase = FALSE;
        !           787:     register struct linked_list *item;
        !           788:     struct thing *tp;
        !           789:     struct object *obj;
        !           790:
        !           791:     if (winat(hero.y, hero.x) != STAIRS) {
        !           792:        if (off(player, CANINWALL)) {   /* Must use stairs if can't phase */
        !           793:            msg("I see no way up.");
        !           794:            return;
        !           795:        }
        !           796:
        !           797:        extinguish(unphase);
        !           798:        no_phase = TRUE;
        !           799:     }
        !           800:
        !           801:     if (level == 0) {
        !           802:        msg("The stairway only goes down.");
        !           803:        return;
        !           804:     }
        !           805:
        !           806:     /*
        !           807:      * does he have the item he was quested to get?
        !           808:      */
        !           809:     if (level == 1) {
        !           810:        for (item = pack; item != NULL; item = next(item)) {
        !           811:            obj = OBJPTR(item);
        !           812:            if (obj->o_type == RELIC && obj->o_which == quest_item)
        !           813:                total_winner();
        !           814:        }
        !           815:     }
        !           816:     /*
        !           817:      * check to see if he trapped a UNIQUE, If he did then put it back
        !           818:      * in the monster table for next time
        !           819:      */
        !           820:     for (item = tlist; item != NULL; item = next(item)) {
        !           821:        tp = THINGPTR(item);
        !           822:        if (on(*tp, ISUNIQUE))
        !           823:            monsters[tp->t_index].m_normal = TRUE;
        !           824:     }
        !           825:     t_free_list(tlist);        /* Monsters that fell below are long gone! */
        !           826:
        !           827:     if (levtype != POSTLEV) level--;
        !           828:     if (level > 0) new_level(NORMLEV);
        !           829:     else {
        !           830:        level = -1;     /* Indicate that we are new to the outside */
        !           831:        new_level(OUTSIDE);     /* Leaving the dungeon */
        !           832:        msg("You emerge into the %s", daytime ? "light" : "night");
        !           833:     }
        !           834:
        !           835:     if (no_phase) unphase();
        !           836: }
        !           837:
        !           838: /*
        !           839:  * Let him escape for a while
        !           840:  */
        !           841:
        !           842: void
        !           843: shell(void)
        !           844: {
        !           845:     /*
        !           846:      * Set the terminal back to original mode
        !           847:      */
        !           848:     wclear(hw);
        !           849:     wmove(hw, LINES-1, 0);
        !           850:     draw(hw);
        !           851:     endwin();
        !           852:     in_shell = TRUE;
        !           853:     fflush(stdout);
        !           854:
        !           855:     md_shellescape();
        !           856:
        !           857:     printf(retstr);
        !           858:     fflush(stdout);
        !           859:     nonl();
        !           860:     noecho();
        !           861:     raw();
        !           862:     keypad(cw,1);
        !           863:     in_shell = FALSE;
        !           864:     wait_for(hw,'\n');
        !           865:     clearok(cw, TRUE);
        !           866:     touchwin(cw);
        !           867:     wmove(cw,0,0);
        !           868:     draw(cw);
        !           869: }
        !           870:
        !           871: /*
        !           872:  * allow a user to call a potion, scroll, or ring something
        !           873:  */
        !           874: void
        !           875: call(bool mark)
        !           876: {
        !           877:     register struct object *obj;
        !           878:     register struct linked_list *item;
        !           879:     register char **guess = NULL, *elsewise = NULL;
        !           880:     register bool *know;
        !           881:
        !           882:     if (mark) item = get_item(pack, "mark", ALL);
        !           883:     else item = get_item(pack, "call", CALLABLE);
        !           884:     /*
        !           885:      * Make certain that it is somethings that we want to wear
        !           886:      */
        !           887:     if (item == NULL)
        !           888:        return;
        !           889:     obj = OBJPTR(item);
        !           890:     switch (obj->o_type)
        !           891:     {
        !           892:        case RING:
        !           893:            guess = r_guess;
        !           894:            know = r_know;
        !           895:            elsewise = (r_guess[obj->o_which] != NULL ?
        !           896:                        r_guess[obj->o_which] : r_stones[obj->o_which]);
        !           897:        when POTION:
        !           898:            guess = p_guess;
        !           899:            know = p_know;
        !           900:            elsewise = (p_guess[obj->o_which] != NULL ?
        !           901:                        p_guess[obj->o_which] : p_colors[obj->o_which]);
        !           902:        when SCROLL:
        !           903:            guess = s_guess;
        !           904:            know = s_know;
        !           905:            elsewise = (s_guess[obj->o_which] != NULL ?
        !           906:                        s_guess[obj->o_which] : s_names[obj->o_which]);
        !           907:        when STICK:
        !           908:            guess = ws_guess;
        !           909:            know = ws_know;
        !           910:            elsewise = (ws_guess[obj->o_which] != NULL ?
        !           911:                        ws_guess[obj->o_which] : ws_made[obj->o_which]);
        !           912:        when MM:
        !           913:            guess = m_guess;
        !           914:            know = m_know;
        !           915:            elsewise = (m_guess[obj->o_which] != NULL ?
        !           916:                        m_guess[obj->o_which] : "nothing");
        !           917:        otherwise:
        !           918:            if (!mark) {
        !           919:                msg("You can't call that anything.");
        !           920:                return;
        !           921:            }
        !           922:            else know = (bool *) 0;
        !           923:     }
        !           924:     if ((obj->o_flags & ISPOST)        || (know && know[obj->o_which]) && !mark) {
        !           925:        msg("That has already been identified.");
        !           926:        return;
        !           927:     }
        !           928:     if (mark) {
        !           929:        if (obj->o_mark[0]) {
        !           930:            addmsg(terse ? "M" : "Was m");
        !           931:            msg("arked \"%s\"", obj->o_mark);
        !           932:        }
        !           933:        msg(terse ? "Mark it: " : "What do you want to mark it? ");
        !           934:        prbuf[0] = '\0';
        !           935:     }
        !           936:     else {
        !           937:        addmsg(terse ? "C" : "Was c");
        !           938:        msg("alled \"%s\"", elsewise);
        !           939:        msg(terse ? "Call it: " : "What do you want to call it? ");
        !           940:        if (guess[obj->o_which] != NULL)
        !           941:            free(guess[obj->o_which]);
        !           942:        strcpy(prbuf, elsewise);
        !           943:     }
        !           944:     if (get_str(prbuf, msgw) == NORM) {
        !           945:        if (mark) {
        !           946:            strncpy(obj->o_mark, prbuf, MARKLEN-1);
        !           947:            obj->o_mark[MARKLEN-1] = '\0';
        !           948:        }
        !           949:        else {
        !           950:            guess[obj->o_which] = new((unsigned int) strlen(prbuf) + 1);
        !           951:            strcpy(guess[obj->o_which], prbuf);
        !           952:        }
        !           953:     }
        !           954: }

CVSweb