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

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

1.1     ! rubenllo    1: /*
        !             2:  * Read and execute the user commands
        !             3:  *
        !             4:  * @(#)command.c       9.0     (rdk)    7/17/84
        !             5:  *
        !             6:  * Super-Rogue
        !             7:  * Copyright (C) 1984 Robert D. Kindelberger
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !            11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            12:  * All rights reserved.
        !            13:  *
        !            14:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            15:  */
        !            16:
        !            17: #include <ctype.h>
        !            18: #include <signal.h>
        !            19: #include <stdlib.h>
        !            20: #include <string.h>
        !            21: #include <limits.h>
        !            22: #include "rogue.h"
        !            23: #include "rogue.ext"
        !            24: #ifdef __DJGPP__
        !            25: #include <process.h>
        !            26: #elif defined(_WIN32)
        !            27: #include <process.h>
        !            28: #else
        !            29: #include <unistd.h>
        !            30: #endif
        !            31:
        !            32: void search(void);
        !            33: void help(void);
        !            34: void d_level(void);
        !            35: void u_level(void);
        !            36: void shell(void);
        !            37: void call(void);
        !            38:
        !            39: /*
        !            40:  * command:
        !            41:  *     Process the user commands
        !            42:  */
        !            43: void
        !            44: command(void)
        !            45: {
        !            46:        reg char ch;
        !            47:        reg int ntimes = 1;             /* Number of player moves */
        !            48:        static char countch, direction, newcount = FALSE;
        !            49:
        !            50:        if (pl_on(ISHASTE))
        !            51:                ntimes++;
        !            52:        /*
        !            53:         * Let the daemons start up
        !            54:         */
        !            55:        while (ntimes-- > 0) {
        !            56:                do_daemons(BEFORE);
        !            57:                look(TRUE);
        !            58:                if (!running)
        !            59:                        door_stop = FALSE;
        !            60:                lastscore = purse;
        !            61:                wmove(cw, hero.y, hero.x);
        !            62:                if (!(running || count))
        !            63:                        draw(cw);                       /* Draw screen */
        !            64:                take = 0;
        !            65:                after = TRUE;
        !            66:                /*
        !            67:                 * Read command or continue run
        !            68:                 */
        !            69:                if (wizard)
        !            70:                        waswizard = TRUE;
        !            71:                if (player.t_nocmd <= 0) {
        !            72:                        player.t_nocmd = 0;
        !            73:                        if (running)
        !            74:                                ch = runch;
        !            75:                        else if (count)
        !            76:                                ch = countch;
        !            77:                        else {
        !            78:                                ch = readchar();
        !            79:                                if (mpos != 0 && !running) /* Erase message if its there */
        !            80:                                        msg("");
        !            81:                        }
        !            82:                }
        !            83:                else
        !            84:                        ch = '.';
        !            85:                if (player.t_nocmd > 0) {
        !            86:                        if (--player.t_nocmd <= 0)
        !            87:                                msg("You can move again.");
        !            88:                }
        !            89:                else {
        !            90:                        /*
        !            91:                         * check for prefixes
        !            92:                         */
        !            93:                        if (isdigit(ch)) {
        !            94:                                count = 0;
        !            95:                                newcount = TRUE;
        !            96:                                while (isdigit(ch)) {
        !            97:                                        count = count * 10 + (ch - '0');
        !            98:                                        ch = readchar();
        !            99:                                }
        !           100:                                countch = ch;
        !           101:                                /*
        !           102:                                 * turn off count for commands which don't make sense
        !           103:                                 * to repeat
        !           104:                                 */
        !           105:                                switch (ch) {
        !           106:                                        case 'h': case 'j': case 'k': case 'l':
        !           107:                                        case 'y': case 'u': case 'b': case 'n':
        !           108:                                        case 'H': case 'J': case 'K': case 'L':
        !           109:                                        case 'Y': case 'U': case 'B': case 'N':
        !           110:                                        case 'q': case 'r': case 's': case 'f':
        !           111:                                        case 't': case 'C': case 'I': case '.':
        !           112:                                        case 'z': case 'p':
        !           113:                                                break;
        !           114:                                        default:
        !           115:                                                count = 0;
        !           116:                                }
        !           117:                        }
        !           118:                        switch (ch) {
        !           119:                        case 'f':
        !           120:                        case 'g':
        !           121:                                if (pl_off(ISBLIND)) {
        !           122:                                        door_stop = TRUE;
        !           123:                                        firstmove = TRUE;
        !           124:                                }
        !           125:                                if (count && !newcount)
        !           126:                                        ch = direction;
        !           127:                                else
        !           128:                                        ch = readchar();
        !           129:                                switch (ch) {
        !           130:                                        case 'h': case 'j': case 'k': case 'l':
        !           131:                                        case 'y': case 'u': case 'b': case 'n':
        !           132:                                                ch = toupper(ch);
        !           133:                                }
        !           134:                                direction = ch;
        !           135:                        }
        !           136:                        newcount = FALSE;
        !           137:                        /*
        !           138:                         * execute a command
        !           139:                         */
        !           140:                        if (count && !running)
        !           141:                                count--;
        !           142:                        switch (ch) {
        !           143:                                case '!' : shell(); after = FALSE;
        !           144:                                when 'h' : do_move(0, -1);
        !           145:                                when 'j' : do_move(1, 0);
        !           146:                                when 'k' : do_move(-1, 0);
        !           147:                                when 'l' : do_move(0, 1);
        !           148:                                when 'y' : do_move(-1, -1);
        !           149:                                when 'u' : do_move(-1, 1);
        !           150:                                when 'b' : do_move(1, -1);
        !           151:                                when 'n' : do_move(1, 1);
        !           152:                                when 'H' : do_run('h');
        !           153:                                when 'J' : do_run('j');
        !           154:                                when 'K' : do_run('k');
        !           155:                                when 'L' : do_run('l');
        !           156:                                when 'Y' : do_run('y');
        !           157:                                when 'U' : do_run('u');
        !           158:                                when 'B' : do_run('b');
        !           159:                                when 'N' : do_run('n');
        !           160:                                when 't':
        !           161:                                        if (!get_dir())
        !           162:                                                after = FALSE;
        !           163:                                        else
        !           164:                                                missile(delta.y, delta.x);
        !           165:                                when 'Q' : after = FALSE; quit(-1);
        !           166:                                when 'i' : after = FALSE; inventory(pack, 0);
        !           167:                                when 'I' : after = FALSE; picky_inven();
        !           168:                                when 'd' : drop(NULL);
        !           169:                                when 'q' : quaff();
        !           170:                                when 'r' : read_scroll();
        !           171:                                when 'e' : eat();
        !           172:                                when 'w' : wield();
        !           173:                                when 'W' : wear();
        !           174:                                when 'T' : take_off();
        !           175:                                when 'P' : ring_on();
        !           176:                                when 'R' : ring_off();
        !           177:                                when 'O' : option();
        !           178:                                when 'c' : call();
        !           179:                                when '>' : after = FALSE; d_level();
        !           180:                                when '<' : after = FALSE; u_level();
        !           181:                                when '?' : after = FALSE; help();
        !           182:                                when '/' : after = FALSE; identify(0);
        !           183:                                when 's' : search();
        !           184:                                when 'z' : do_zap(FALSE);
        !           185:                                when 'p':
        !           186:                                        if (get_dir())
        !           187:                                                do_zap(TRUE);
        !           188:                                        else
        !           189:                                                after = FALSE;
        !           190:                                when 'v': after = FALSE; msg("Super Rogue version %s.",release);
        !           191:                                when 'D': dip_it();
        !           192:                                when CTRL('L') : after = FALSE; restscr(cw);
        !           193:                                when CTRL('R') : after = FALSE; msg(huh);
        !           194:                                when 'a': after = FALSE; dispmax();
        !           195:                                when '@' : if (author())
        !           196:                                        msg("Hero @ %d,%d : Stairs @ %d,%d",hero.y,hero.x,stairs.y,stairs.x);
        !           197:                                when 'S' :
        !           198:                                        after = FALSE;
        !           199:                                        if (save_game()) {
        !           200:                                                wclear(cw);
        !           201:                                                draw(cw);
        !           202:                                                endwin();
        !           203:                                                byebye(0);
        !           204:                                        }
        !           205:                                when '.' : ;                            /* Rest command */
        !           206:                                when ' ' : after = FALSE;       /* do nothing */
        !           207:                                when '=' :
        !           208:                                        if (author()) {
        !           209:                                                activity();
        !           210:                                                after = FALSE;
        !           211:                                        }
        !           212: #ifdef WIZARD
        !           213:                                when CTRL('P') :
        !           214:                                        after = FALSE;
        !           215:                                        if (wizard) {
        !           216:                                                wizard = FALSE;
        !           217:                                                msg("Not wizard any more");
        !           218:                                        }
        !           219:                                        else {
        !           220:                                                wizard = passwd();
        !           221:                                                if (wizard) {
        !           222:                                                        msg("Welcome back, Bob!!!!!");
        !           223:                                                        waswizard = TRUE;
        !           224:                                                }
        !           225:                                                else
        !           226:                                                        msg("Sorry");
        !           227:                                        }
        !           228: #endif
        !           229:                                when ESCAPE :   /* Escape */
        !           230:                                        door_stop = FALSE;
        !           231:                                        count = 0;
        !           232:                                        after = FALSE;
        !           233:                                when '#':
        !           234:                                        if (levtype == POSTLEV)         /* buy something */
        !           235:                                                buy_it();
        !           236:                                        after = FALSE;
        !           237:                                when '$':
        !           238:                                        if (levtype == POSTLEV)         /* price something */
        !           239:                                                price_it();
        !           240:                                        after = FALSE;
        !           241:                                when '%':
        !           242:                                        if (levtype == POSTLEV)         /* sell something */
        !           243:                                                sell_it();
        !           244:                                        after = FALSE;
        !           245:                                otherwise :
        !           246:                                        after = FALSE;
        !           247:                                        if (wizard) switch (ch) {
        !           248:                                        case CTRL('A') : ;
        !           249:                                        when 'C'     :  create_obj(FALSE);
        !           250:                                        when CTRL('I') :        inventory(lvl_obj, 1);
        !           251:                                        when CTRL('W') :        whatis(NULL);
        !           252:                                        when CTRL('D') :        level++; new_level(NORMLEV);
        !           253:                                        when CTRL('U') :        if (level > 1) level--; new_level(NORMLEV);
        !           254:                                        when CTRL('F') :        displevl();
        !           255:                                        when CTRL('X') :        dispmons();
        !           256:                                        when CTRL('T') :        teleport(rndspot,&player);
        !           257:                                        when CTRL('E') :        msg("food left: %d", food_left);
        !           258:                                        when CTRL('O') :        add_pass();
        !           259:                                        when 'M' : {
        !           260:                                                int tlev, whichlev;
        !           261:                                                prbuf[0] = '\0';
        !           262:                                                msg("Which level? ");
        !           263:                                                if (get_str(prbuf,cw) == NORM) {
        !           264:                                                        whichlev = NORMLEV;
        !           265:                                                        tlev = atoi(prbuf);
        !           266:                                                        if (tlev < 1)
        !           267:                                                                level = 1;
        !           268:                                                        if (tlev >= 200) {
        !           269:                                                                tlev -= 199;
        !           270:                                                                whichlev = MAZELEV;
        !           271:                                                        }
        !           272:                                                        else if (tlev >= 100) {
        !           273:                                                                tlev -= 99;
        !           274:                                                                whichlev = POSTLEV;
        !           275:                                                        }
        !           276:                                                        level = tlev;
        !           277:                                                        new_level(whichlev);
        !           278:                                                }
        !           279:                                        }
        !           280:                                        when CTRL('N') : {
        !           281:                                                struct linked_list *item;
        !           282:
        !           283:                                                item = get_item("charge", STICK);
        !           284:                                                if (item != NULL) {
        !           285:                                                        (OBJPTR(item))->o_charges = 10000;
        !           286:                                                        msg("");
        !           287:                                                }
        !           288:                                        }
        !           289:                                        when CTRL('H') : {
        !           290:                                                int i;
        !           291:                                                struct linked_list *item;
        !           292:                                                struct object *obj;
        !           293:
        !           294:                                                him->s_exp = e_levels[him->s_lvl + 7] + 1;
        !           295:                                                check_level();
        !           296:                                                /*
        !           297:                                                 * Give the rogue a very good sword
        !           298:                                                 */
        !           299:                                                item = new_thing(FALSE, WEAPON, TWOSWORD);
        !           300:                                                obj = OBJPTR(item);
        !           301:                                                obj->o_hplus = 3;
        !           302:                                                obj->o_dplus = 3;
        !           303:                                                obj->o_flags = ISKNOW;
        !           304:                                                i = add_pack(item, TRUE);
        !           305:                                                if (i)
        !           306:                                                        cur_weapon = obj;
        !           307:                                                else
        !           308:                                                        discard(item);
        !           309:                                                /*
        !           310:                                                 * And his suit of armor
        !           311:                                                 */
        !           312:                                                item = new_thing(FALSE, ARMOR, PLATEARMOR);
        !           313:                                                obj = OBJPTR(item);
        !           314:                                                obj->o_ac = -8;
        !           315:                                                obj->o_flags = ISKNOW;
        !           316:                                                i = add_pack(item, TRUE);
        !           317:                                                if (i)
        !           318:                                                        cur_armor = obj;
        !           319:                                                else
        !           320:                                                        discard(item);
        !           321:                                                nochange = FALSE;
        !           322:                                        }
        !           323:                                        otherwise:
        !           324:                                                msg(illegal, unctrl(ch));
        !           325:                                                count = 0;
        !           326:                                }
        !           327:                                else {
        !           328:                                        msg(illegal, unctrl(ch));
        !           329:                                        count = 0;
        !           330:                                }
        !           331:                        }
        !           332:                        /*
        !           333:                         * turn off flags if no longer needed
        !           334:                         */
        !           335:                        if (!running)
        !           336:                                door_stop = FALSE;
        !           337:                }
        !           338:                /*
        !           339:                 * If he ran into something to take, let the
        !           340:                 * hero pick it up if not in a trading post.
        !           341:                 */
        !           342:                if (take != 0 && levtype != POSTLEV)
        !           343:                        pick_up(take);
        !           344:                if (!running)
        !           345:                        door_stop = FALSE;
        !           346:        }
        !           347:        /*
        !           348:         * Kick off the rest if the daemons and fuses
        !           349:         */
        !           350:        if (after) {
        !           351:                int  j;
        !           352:
        !           353:                look(FALSE);
        !           354:                do_daemons(AFTER);
        !           355:                do_fuses();
        !           356:                if (pl_on(ISSLOW))
        !           357:                        waste_time();
        !           358:                for (j = LEFT; j <= RIGHT; j++) {
        !           359:                        if (cur_ring[j] != NULL) {
        !           360:                                if (cur_ring[j]->o_which == R_SEARCH)
        !           361:                                        search();
        !           362:                                else if (cur_ring[j]->o_which == R_TELEPORT)
        !           363:                                        if (rnd(100) < 5)
        !           364:                                                teleport(rndspot, &player);
        !           365:                        }
        !           366:                }
        !           367:        }
        !           368: }
        !           369:
        !           370:
        !           371: /*
        !           372:  * quit:
        !           373:  *     Have player make certain, then exit.
        !           374:  */
        !           375: void
        !           376: quit(int a)
        !           377: {
        !           378:        reg char ch, good;
        !           379:        /*
        !           380:         * Reset the signal in case we got here via an interrupt
        !           381:         */
        !           382: #ifdef SIGINT
        !           383:        if (signal(SIGINT, quit) != quit)
        !           384:                mpos = 0;
        !           385: #endif
        !           386:        msg("Really quit? [y/n/s]");
        !           387: /*     ch = tolower(readchar());*/
        !           388:        ch = readchar();
        !           389:        if (ch == 'y') {
        !           390:                clear();
        !           391:                move(LINES-1, 0);
        !           392:                refresh();
        !           393:                writelog(purse, CHICKEN, 0);
        !           394:                score(purse, CHICKEN, 0);
        !           395:                printf("[Press return to exit]\n");
        !           396:                fflush(NULL);
        !           397:                getchar();
        !           398:                byebye(0);
        !           399:        }
        !           400:        else if (ch == 's') {
        !           401:                good = save_game();
        !           402:                if (good) {
        !           403:                        wclear(cw);
        !           404:                        draw(cw);
        !           405:                        endwin();
        !           406:                        byebye(0);
        !           407:                }
        !           408:        }
        !           409:        else {
        !           410: #ifdef SIGINT
        !           411:                signal(SIGINT, quit);
        !           412: #endif
        !           413:                wmove(cw, 0, 0);
        !           414:                wclrtoeol(cw);
        !           415:                draw(cw);
        !           416:                mpos = 0;
        !           417:                count = 0;
        !           418:                nochange = FALSE;
        !           419:        }
        !           420: }
        !           421:
        !           422: /*
        !           423:  * search:
        !           424:  *     Player gropes about him to find hidden things.
        !           425:  */
        !           426:
        !           427: void
        !           428: search(void)
        !           429: {
        !           430:        reg int x, y;
        !           431:        reg char ch;
        !           432:
        !           433:        /*
        !           434:         * Look all around the hero, if there is something hidden there,
        !           435:         * give him a chance to find it.  If its found, display it.
        !           436:         */
        !           437:        if (pl_on(ISBLIND))
        !           438:                return;
        !           439:        for (x = hero.x - 1; x <= hero.x + 1; x++) {
        !           440:                for (y = hero.y - 1; y <= hero.y + 1; y++) {
        !           441:                        ch = winat(y, x);
        !           442:                        if (isatrap(ch)) {              /* see if its a trap */
        !           443:                                reg struct trap *tp;
        !           444:
        !           445:                                if ((tp = trap_at(y, x)) == NULL)
        !           446:                                        break;
        !           447:                                if (tp->tr_flags & ISFOUND)
        !           448:                                        break;          /* no message if its seen */
        !           449:                                if (mvwinch(cw, y, x) == ch)
        !           450:                                        break;
        !           451:                                if (rnd(100) > (him->s_lvl * 9 + herowis() * 5))
        !           452:                                         break;
        !           453:                                tp->tr_flags |= ISFOUND;
        !           454:                                mvwaddch(cw, y, x, tp->tr_type);
        !           455:                                count = 0;
        !           456:                                running = FALSE;
        !           457:                                msg(tr_name(tp->tr_type));
        !           458:                        }
        !           459:                        else if(ch == SECRETDOOR) {
        !           460:                                if (rnd(100) < (him->s_lvl * 4 + herowis() * 5)) {
        !           461:                                        mvaddch(y, x, DOOR);
        !           462:                                        count = 0;
        !           463:                                }
        !           464:                        }
        !           465:                }
        !           466:        }
        !           467: }
        !           468:
        !           469: /*
        !           470:  * help:
        !           471:  *     Give single character help, or the whole mess if he wants it
        !           472:  */
        !           473: void
        !           474: help(void)
        !           475: {
        !           476:        extern struct h_list helpstr[];
        !           477:        reg struct h_list *strp;
        !           478:        reg char helpch;
        !           479:        reg int cnt;
        !           480:
        !           481:        strp = &helpstr[0];
        !           482:        msg("Character you want help for (* for all): ");
        !           483:        helpch = readchar();
        !           484:        mpos = 0;
        !           485:        /*
        !           486:         * If its not a *, print the right help string
        !           487:         * or an error if he typed a funny character.
        !           488:         */
        !           489:        if (helpch != '*') {
        !           490:                wmove(cw, 0, 0);
        !           491:                while (strp->h_ch) {
        !           492:                        if (strp->h_ch == helpch) {
        !           493:                                msg("%s%s", unctrl(strp->h_ch), strp->h_desc);
        !           494:                                break;
        !           495:                        }
        !           496:                        strp++;
        !           497:                }
        !           498:                if (strp->h_ch != helpch)
        !           499:                        msg("Unknown character '%s'", unctrl(helpch));
        !           500:                return;
        !           501:        }
        !           502:        /*
        !           503:         * Here we print help for everything.
        !           504:         * Then wait before we return to command mode
        !           505:         */
        !           506:        wclear(hw);
        !           507:        cnt = 0;
        !           508:        while (strp->h_ch) {
        !           509:                mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrl(strp->h_ch));
        !           510:                waddstr(hw, strp->h_desc);
        !           511:                cnt++;
        !           512:                strp++;
        !           513:        }
        !           514:        wmove(hw, LINES-1, 0);
        !           515:        wprintw(hw,spacemsg);
        !           516:        draw(hw);
        !           517:        wait_for(hw,' ');
        !           518:        wclear(hw);
        !           519:        draw(hw);
        !           520:        wmove(cw, 0, 0);
        !           521:        wclrtoeol(cw);
        !           522:        touchwin(cw);
        !           523:        nochange = FALSE;
        !           524: }
        !           525:
        !           526:
        !           527: /*
        !           528:  * identify:
        !           529:  *     Tell the player what a certain thing is.
        !           530:  */
        !           531: char *
        !           532: identify(int what)
        !           533: {
        !           534:        reg char ch, *str;
        !           535:
        !           536:        if (what == 0) {
        !           537:                msg("What do you want identified? ");
        !           538:                ch = readchar();
        !           539:                mpos = 0;
        !           540:                if (ch == ESCAPE) {
        !           541:                        msg("");
        !           542:                        return NULL;
        !           543:                }
        !           544:        }
        !           545:        else
        !           546:                ch = what;
        !           547:        if (isalpha(ch))
        !           548:                str = monsters[midx(ch)].m_name;
        !           549:        else {
        !           550:                switch(ch) {
        !           551:                        case '|':
        !           552:                        case '-':       str = "the wall of a room";
        !           553:                        when GOLD:      str = "gold";
        !           554:                        when STAIRS:    str = "passage leading up/down";
        !           555:                        when DOOR:      str = "door";
        !           556:                        when FLOOR:     str = "room floor";
        !           557:                        when PLAYER:    str = "you";
        !           558:                        when PASSAGE:   str = "passage";
        !           559:                        when POST:      str = "trading post";
        !           560:                        when MAZETRAP:  str = "maze trap";
        !           561:                        when TRAPDOOR:  str = "trapdoor";
        !           562:                        when ARROWTRAP: str = "arrow trap";
        !           563:                        when SLEEPTRAP: str = "sleeping gas trap";
        !           564:                        when BEARTRAP:  str = "bear trap";
        !           565:                        when TELTRAP:   str = "teleport trap";
        !           566:                        when DARTTRAP:  str = "dart trap";
        !           567:                        when POOL:      str = "magic pool";
        !           568:                        when POTION:    str = "potion";
        !           569:                        when SCROLL:    str = "scroll";
        !           570:                        when FOOD:      str = "food";
        !           571:                        when WEAPON:    str = "weapon";
        !           572:                        when ' ' :      str = "solid rock";
        !           573:                        when ARMOR:     str = "armor";
        !           574:                        when AMULET:    str = "The Amulet of Yendor";
        !           575:                        when RING:      str = "ring";
        !           576:                        when STICK:     str = "wand or staff";
        !           577:                        otherwise:
        !           578:                                if (what == 0)
        !           579:                                        str = "unknown character";
        !           580:                                else
        !           581:                                        str = "a magical ghost";
        !           582:                }
        !           583:        }
        !           584:        if (what == 0)
        !           585:                msg("'%s' : %s", unctrl(ch), str);
        !           586:        return str;
        !           587: }
        !           588:
        !           589: /*
        !           590:  * d_level:
        !           591:  *     He wants to go down a level
        !           592:  */
        !           593: void
        !           594: d_level(void)
        !           595: {
        !           596:        if (winat(hero.y, hero.x) != STAIRS)
        !           597:                msg("I see no way down.");
        !           598:        else {
        !           599:                if (pl_on(ISHELD)) {
        !           600:                        msg("You are being held.");
        !           601:                        return;
        !           602:                }
        !           603:                level++;
        !           604:                new_level(NORMLEV);
        !           605:        }
        !           606: }
        !           607:
        !           608: /*
        !           609:  * u_level:
        !           610:  *     He wants to go up a level
        !           611:  */
        !           612: void
        !           613: u_level(void)
        !           614: {
        !           615:        if (winat(hero.y, hero.x) == STAIRS)  {
        !           616:                if (pl_on(ISHELD)) {
        !           617:                        msg("You are being held.");
        !           618:                        return;
        !           619:                }
        !           620:                else {                          /* player not held here */
        !           621:                        if (amulet) {
        !           622:                                level--;
        !           623:                                if (level == 0)
        !           624:                                        total_winner();
        !           625:                                new_level(NORMLEV);
        !           626:                                msg("You feel a wrenching sensation in your gut.");
        !           627:                                return;
        !           628:                        }
        !           629:                }
        !           630:        }
        !           631:        msg("I see no way up.");
        !           632: }
        !           633:
        !           634:
        !           635: /*
        !           636:  * Let him escape for a while
        !           637:  */
        !           638: void
        !           639: shell(void)
        !           640: {
        !           641:        reg int pid;
        !           642:        reg char *sh;
        !           643:        int ret_status;
        !           644:
        !           645:        /*
        !           646:         * Set the terminal back to original mode
        !           647:         */
        !           648:        sh = getenv("SHELL");
        !           649:        wclear(hw);
        !           650:        wmove(hw, LINES-1, 0);
        !           651:        draw(hw);
        !           652:        endwin();
        !           653:        in_shell = TRUE;
        !           654:        fflush(stdout);
        !           655:        /*
        !           656:         * Fork and do a shell
        !           657:         */
        !           658:        md_shellescape();
        !           659:        printf("\n%s", retstr);
        !           660:        fflush(stdout);
        !           661:        nonl();
        !           662:        noecho();
        !           663:        crmode();
        !           664:        in_shell = FALSE;
        !           665:        wait_for(cw, '\n');
        !           666:        restscr(cw);
        !           667: }
        !           668:
        !           669:
        !           670: /*
        !           671:  * call:
        !           672:  *     Allow a user to call a potion, scroll, or ring something
        !           673:  */
        !           674: void
        !           675: call(void)
        !           676: {
        !           677:        reg struct object *obj;
        !           678:        reg struct linked_list *item;
        !           679:        reg char **guess, *elsewise;
        !           680:        int wh;
        !           681:
        !           682:        if ((item = get_item("call", 0)) == NULL)
        !           683:                return;
        !           684:        obj = OBJPTR(item);
        !           685:        wh = obj->o_which;
        !           686:        switch (obj->o_type) {
        !           687:        case RING:
        !           688:                guess = r_guess;
        !           689:                elsewise = (r_guess[wh] != NULL ? r_guess[wh] : r_stones[wh]);
        !           690:        when POTION:
        !           691:                guess = p_guess;
        !           692:                elsewise = (p_guess[wh] != NULL ? p_guess[wh] : p_colors[wh]);
        !           693:        when SCROLL:
        !           694:                guess = s_guess;
        !           695:                elsewise = (s_guess[wh] != NULL ? s_guess[wh] : s_names[wh]);
        !           696:        when STICK:
        !           697:                guess = ws_guess;
        !           698:                elsewise =(ws_guess[wh] != NULL ?
        !           699:                        ws_guess[wh] : ws_stuff[wh].ws_made);
        !           700:        otherwise:
        !           701:                msg("You can't call %ss anything",obj->o_typname);
        !           702:                return;
        !           703:        }
        !           704:        msg("Was called \"%s\"", elsewise);
        !           705:        msg(callit);
        !           706:        if (guess[wh] != NULL)
        !           707:                free(guess[wh]);
        !           708:        strcpy(prbuf, elsewise);
        !           709:        if (get_str(prbuf, cw) == NORM) {
        !           710:                guess[wh] = new(strlen(prbuf) + 1);
        !           711:                strcpy(guess[wh], prbuf);
        !           712:        }
        !           713: }

CVSweb