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

Annotation of early-roguelike/rogue4/command.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * Read and execute the user commands
                      3:  *
                      4:  * @(#)command.c       4.31 (Berkeley) 4/6/82
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
                      8:  * All rights reserved.
                      9:  *
                     10:  * See the file LICENSE.TXT for full copyright and licensing information.
                     11:  */
                     12:
                     13: #include <stdlib.h>
                     14: #include <curses.h>
                     15: #include <ctype.h>
                     16: #include <stdlib.h>
                     17: #include <string.h>
                     18: #include "rogue.h"
                     19:
                     20: char countch, direction, newcount = FALSE;
                     21:
                     22: void call(void);
                     23: void d_level(void);
                     24: void help(void);
                     25: void identify(void);
                     26: void illcom(char ch);
                     27: void search(void);
                     28: void u_level(void);
                     29:
                     30: #ifdef WIZARD
                     31: extern void add_pass(void);
                     32: extern void create_obj(void);
                     33: extern bool passwd(void);
                     34: extern void show_map(void);
                     35: #endif
                     36:
                     37: /*
                     38:  * command:
                     39:  *     Process the user commands
                     40:  */
                     41: void
                     42: command(void)
                     43: {
                     44:     register char ch;
                     45:     register int ntimes = 1;                   /* Number of player moves */
                     46:
                     47:     if (on(player, ISHASTE))
                     48:        ntimes++;
                     49:     /*
                     50:      * Let the daemons start up
                     51:      */
                     52:     do_daemons(BEFORE);
                     53:     do_fuses(BEFORE);
                     54:     while (ntimes--)
                     55:     {
                     56:        /*
                     57:         * these are illegal things for the player to be, so if any are
                     58:         * set, someone's been poking in memeory
                     59:         */
                     60:        if (on(player, ISSLOW|ISCANC|ISGREED|ISINVIS|ISMEAN|ISREGEN))
                     61:            auto_save(-1);
                     62:
                     63:        look(TRUE);
                     64:        if (!running)
                     65:            door_stop = FALSE;
                     66:        status();
                     67:        lastscore = purse;
                     68:        move(hero.y, hero.x);
                     69:        if (!((running || count) && jump))
                     70:            refresh();                  /* Draw screen */
                     71:        take = 0;
                     72:        after = TRUE;
                     73:        /*
                     74:         * Read command or continue run
                     75:         */
                     76: #ifdef WIZARD
                     77:        if (wizard)
                     78:            noscore = TRUE;
                     79: #endif
                     80:        if (!no_command)
                     81:        {
                     82:            if (running) ch = runch;
                     83:            else if (count) ch = countch;
                     84:            else
                     85:            {
                     86:                ch = readchar();
                     87:                if (mpos != 0 && !running)      /* Erase message if its there */
                     88:                    msg("");
                     89:            }
                     90:        }
                     91:        else
                     92:            ch = '.';
                     93:        if (no_command)
                     94:        {
                     95:            if (--no_command == 0)
                     96:            {
                     97:                msg("you can move again");
                     98:            }
                     99:        }
                    100:        else
                    101:        {
                    102:            /*
                    103:             * check for prefixes
                    104:             */
                    105:            if (isdigit(ch))
                    106:            {
                    107:                count = 0;
                    108:                newcount = TRUE;
                    109:                while (isdigit(ch))
                    110:                {
                    111:                    count = count * 10 + (ch - '0');
                    112:                    ch = readchar();
                    113:                }
                    114:                countch = ch;
                    115:                /*
                    116:                 * turn off count for commands which don't make sense
                    117:                 * to repeat
                    118:                 */
                    119:                switch (ch) {
                    120:                    case 'h': case 'j': case 'k': case 'l':
                    121:                    case 'y': case 'u': case 'b': case 'n':
                    122:                    case 'H': case 'J': case 'K': case 'L':
                    123:                    case 'Y': case 'U': case 'B': case 'N':
                    124:                    case 'q': case 'r': case 's': case 'f':
                    125:                    case 't': case 'C': case 'I': case '.':
                    126:                    case 'z':
                    127: #ifdef WIZARD
                    128:                    case CTRL('D'): case CTRL('U'):
                    129: #endif
                    130:                        break;
                    131:                    default:
                    132:                        count = 0;
                    133:                }
                    134:            }
                    135:            switch (ch)
                    136:            {
                    137:                case 'f':
                    138:                    if (!on(player, ISBLIND))
                    139:                    {
                    140:                        door_stop = TRUE;
                    141:                        firstmove = TRUE;
                    142:                    }
                    143:                    if (count && !newcount)
                    144:                        ch = direction;
                    145:                    else
                    146:                        ch = readchar();
                    147:                    switch (ch)
                    148:                    {
                    149:                        case 'h': case 'j': case 'k': case 'l':
                    150:                        case 'y': case 'u': case 'b': case 'n':
                    151:                            ch = toupper(ch);
                    152:                    }
                    153:                    direction = ch;
                    154:            }
                    155:            newcount = FALSE;
                    156:            /*
                    157:             * execute a command
                    158:             */
                    159:            if (count && !running)
                    160:                count--;
                    161:            switch (ch)
                    162:            {
                    163:                case '!' : shell();
                    164:                when 'h' : do_move(0, -1);
                    165:                when 'j' : do_move(1, 0);
                    166:                when 'k' : do_move(-1, 0);
                    167:                when 'l' : do_move(0, 1);
                    168:                when 'y' : do_move(-1, -1);
                    169:                when 'u' : do_move(-1, 1);
                    170:                when 'b' : do_move(1, -1);
                    171:                when 'n' : do_move(1, 1);
                    172:                when 'H' : do_run('h');
                    173:                when 'J' : do_run('j');
                    174:                when 'K' : do_run('k');
                    175:                when 'L' : do_run('l');
                    176:                when 'Y' : do_run('y');
                    177:                when 'U' : do_run('u');
                    178:                when 'B' : do_run('b');
                    179:                when 'N' : do_run('n');
                    180:                when 't':
                    181:                    if (!get_dir())
                    182:                        after = FALSE;
                    183:                    else
                    184:                        missile(delta.y, delta.x);
                    185:                when 'Q' : after = FALSE; quit(-1);
                    186:                when 'i' : after = FALSE; inventory(pack, 0);
                    187:                when 'I' : after = FALSE; picky_inven();
                    188:                when 'd' : drop();
                    189:                when 'q' : quaff();
                    190:                when 'r' : read_scroll();
                    191:                when 'e' : eat();
                    192:                when 'w' : wield();
                    193:                when 'W' : wear();
                    194:                when 'T' : take_off();
                    195:                when 'P' : ring_on();
                    196:                when 'R' : ring_off();
                    197:                when 'o' : option(); after = FALSE;
                    198:                when 'c' : call(); after = FALSE;
                    199:                when '>' : after = FALSE; d_level();
                    200:                when '<' : after = FALSE; u_level();
                    201:                when '?' : after = FALSE; help();
                    202:                when '/' : after = FALSE; identify();
                    203:                when 's' : search();
                    204:                when 'z':
                    205:                    if (get_dir())
                    206:                        do_zap();
                    207:                    else
                    208:                        after = FALSE;
                    209:                when 'D': after = FALSE; discovered();
                    210:                when CTRL('R') : after = FALSE; msg(huh);
                    211:                when CTRL('L') :
                    212:                    after = FALSE;
                    213:                    clearok(curscr,TRUE);
                    214:                    wrefresh(curscr);
                    215:                when 'v' :
                    216:                    after = FALSE;
                    217:                    msg("rogue version %s. (mctesq was here)", release);
                    218:                when 'S' :
                    219:                    after = FALSE;
                    220:                    if (save_game())
                    221:                    {
                    222:                        move(LINES-1, 0);
                    223:                        clrtoeol();
                    224:                        refresh();
                    225:                        endwin();
                    226:                         printf("See you soon, %s!\n", whoami);
                    227:                        exit(0);
                    228:                    }
                    229:                when '.' : ;                    /* Rest command */
                    230:                when ' ' : after = FALSE;       /* "Legal" illegal command */
                    231:                when '^' :
                    232:                    after = FALSE;
                    233:                    if (get_dir()) {
                    234:                        delta.y += hero.y;
                    235:                        delta.x += hero.x;
                    236:                        if (chat(delta.y, delta.x) != TRAP)
                    237:                            msg("no trap there");
                    238:                        else
                    239:                            msg(tr_name(flat(delta.y, delta.x) & F_TMASK));
                    240:                    }
                    241: #ifdef WIZARD
                    242:                when CTRL('P') :
                    243:                    after = FALSE;
                    244:                    if (wizard)
                    245:                    {
                    246:                        wizard = FALSE;
                    247:                        turn_see(TRUE);
                    248:                        msg("not wizard any more");
                    249:                    }
                    250:                    else
                    251:                    {
                    252:                        if (wizard = passwd())
                    253:                        {
                    254:                            noscore = TRUE;
                    255:                            turn_see(FALSE);
                    256:                            msg("you are suddenly as smart as Ken Arnold in dungeon #%d", dnum);
                    257:                        }
                    258:                        else
                    259:                            msg("sorry");
                    260:                    }
                    261: #endif
                    262:                when ESCAPE :   /* Escape */
                    263:                    door_stop = FALSE;
                    264:                    count = 0;
                    265:                    after = FALSE;
                    266:                otherwise :
                    267:                    after = FALSE;
                    268: #ifdef WIZARD
                    269:                    if (wizard) switch (ch)
                    270:                    {
                    271:                        case '@' : msg("@ %d,%d", hero.y, hero.x);
                    272:                        when 'C' : create_obj();
                    273:                        when CTRL('I') : inventory(lvl_obj, 0);
                    274:                        when CTRL('W') : whatis(FALSE);
                    275:                        when CTRL('D') : level++; new_level();
                    276:                        when CTRL('U') : if (level > 1) level--; new_level();
                    277:                        when CTRL('F') : show_map();
                    278:                        when CTRL('T') : teleport();
                    279:                        when CTRL('E') : msg("food left: %d", food_left);
                    280:                        when CTRL('A') : msg("%d things in your pack", inpack);
                    281:                        when CTRL('K') : add_pass();
                    282:                        when CTRL('X') : turn_see(on(player, SEEMONST));
                    283:                        when CTRL('N') :
                    284:                        {
                    285:                            register THING *item;
                    286:
                    287:                            if ((item = get_item("charge", STICK)) != NULL)
                    288:                                item->o_charges = 10000;
                    289:                        }
                    290:                        when CTRL('H') :
                    291:                        {
                    292:                            register int i;
                    293:                            register THING *obj;
                    294:
                    295:                            for (i = 0; i < 9; i++)
                    296:                                raise_level();
                    297:                            /*
                    298:                             * Give the rogue a sword (+1,+1)
                    299:                             */
                    300:                            obj = new_item();
                    301:                            obj->o_type = WEAPON;
                    302:                            obj->o_which = TWOSWORD;
                    303:                            init_weapon(obj, SWORD);
                    304:                            obj->o_hplus = 1;
                    305:                            obj->o_dplus = 1;
                    306:                            obj->o_count = 1;
                    307:                            obj->o_group = 0;
                    308:                            add_pack(obj, TRUE);
                    309:                            cur_weapon = obj;
                    310:                            /*
                    311:                             * And his suit of armor
                    312:                             */
                    313:                            obj = new_item();
                    314:                            obj->o_type = ARMOR;
                    315:                            obj->o_which = PLATE_MAIL;
                    316:                            obj->o_ac = -5;
                    317:                            obj->o_flags |= ISKNOW;
                    318:                            obj->o_count = 1;
                    319:                            obj->o_group = 0;
                    320:                            cur_armor = obj;
                    321:                            add_pack(obj, TRUE);
                    322:                        }
                    323:                        otherwise :
                    324:                            illcom(ch);
                    325:                    }
                    326:                    else
                    327: #endif
                    328:                        illcom(ch);
                    329:            }
                    330:            /*
                    331:             * turn off flags if no longer needed
                    332:             */
                    333:            if (!running)
                    334:                door_stop = FALSE;
                    335:        }
                    336:        /*
                    337:         * If he ran into something to take, let him pick it up.
                    338:         */
                    339:        if (take != 0)
                    340:            pick_up(take);
                    341:        if (!running)
                    342:            door_stop = FALSE;
                    343:        if (!after)
                    344:            ntimes++;
                    345:     }
                    346:     do_daemons(AFTER);
                    347:     do_fuses(AFTER);
                    348:     if (ISRING(LEFT, R_SEARCH))
                    349:        search();
                    350:     else if (ISRING(LEFT, R_TELEPORT) && rnd(50) == 0)
                    351:        teleport();
                    352:     if (ISRING(RIGHT, R_SEARCH))
                    353:        search();
                    354:     else if (ISRING(RIGHT, R_TELEPORT) && rnd(50) == 0)
                    355:        teleport();
                    356: }
                    357:
                    358: /*
                    359:  * illcom:
                    360:  *     What to do with an illegal command
                    361:  */
                    362: void
                    363: illcom(char ch)
                    364: {
                    365:     save_msg = FALSE;
                    366:     count = 0;
                    367:     msg("illegal command '%s'", unctrol(ch));
                    368:     save_msg = TRUE;
                    369: }
                    370:
                    371: /*
                    372:  * search:
                    373:  *     Player gropes about him to find hidden things.
                    374:  */
                    375: void
                    376: search(void)
                    377: {
                    378:     register int y, x;
                    379:     register char *fp;
                    380:     register int ey, ex;
                    381:
                    382:     if (on(player, ISBLIND))
                    383:        return;
                    384:     ey = hero.y + 1;
                    385:     ex = hero.x + 1;
                    386:     for (y = hero.y - 1; y <= ey; y++)
                    387:        for (x = hero.x - 1; x <= ex; x++)
                    388:        {
                    389:            if (y == hero.y && x == hero.x)
                    390:                continue;
                    391:            fp = &flat(y, x);
                    392:            if (!(*fp & F_REAL))
                    393:                switch (chat(y, x))
                    394:                {
                    395:                    case '|':
                    396:                    case '-':
                    397:                        if (rnd(5) != 0)
                    398:                            break;
                    399:                        chat(y, x) = DOOR;
                    400:                        *fp |= F_REAL;
                    401:                        count = running = FALSE;
                    402:                        break;
                    403:                    case FLOOR:
                    404:                        if (rnd(2) != 0)
                    405:                            break;
                    406:                        chat(y, x) = TRAP;
                    407:                        *fp |= F_REAL;
                    408:                        count = running = FALSE;
                    409:                        msg("%s", tr_name(*fp & F_TMASK));
                    410:                        break;
                    411:                }
                    412:        }
                    413: }
                    414:
                    415: /*
                    416:  * help:
                    417:  *     Give single character help, or the whole mess if he wants it
                    418:  */
                    419: void
                    420: help(void)
                    421: {
                    422:     register const struct h_list *strp = helpstr;
                    423:     register char helpch;
                    424:     register int cnt;
                    425:
                    426:     msg("character you want help for (* for all): ");
                    427:     helpch = readchar();
                    428:     mpos = 0;
                    429:     /*
                    430:      * If its not a *, print the right help string
                    431:      * or an error if he typed a funny character.
                    432:      */
                    433:     if (helpch != '*')
                    434:     {
                    435:        move(0, 0);
                    436:        while (strp->h_ch)
                    437:        {
                    438:            if (strp->h_ch == helpch)
                    439:            {
                    440:                msg("%s%s", unctrol(strp->h_ch), strp->h_desc);
                    441:                break;
                    442:            }
                    443:            strp++;
                    444:        }
                    445:        if (strp->h_ch != helpch)
                    446:            msg("unknown character '%s'", unctrol(helpch));
                    447:        return;
                    448:     }
                    449:     /*
                    450:      * Here we print help for everything.
                    451:      * Then wait before we return to command mode
                    452:      */
                    453:     wclear(hw);
                    454:     cnt = 0;
                    455:     while (strp->h_ch)
                    456:     {
                    457:        mvwaddstr(hw, cnt % 23, cnt > 22 ? 40 : 0, unctrol(strp->h_ch));
                    458:        waddstr(hw, strp->h_desc);
                    459:        cnt++;
                    460:        strp++;
                    461:     }
                    462:     wmove(hw, LINES-1, 0);
                    463:     wprintw(hw, "--Press space to continue--");
                    464:     wrefresh(hw);
                    465:     w_wait_for(hw,' ');
                    466:     wmove(stdscr, 0, 0);
                    467:     wclrtoeol(stdscr);
                    468:     touchwin(stdscr);
                    469:     clearok(stdscr, TRUE);
                    470:     refresh();
                    471: }
                    472:
                    473: /*
                    474:  * identify:
                    475:  *     Tell the player what a certain thing is.
                    476:  */
                    477: void
                    478: identify(void)
                    479: {
                    480:     register char ch;
                    481:     register const char *str;
                    482:
                    483:     msg("what do you want identified? ");
                    484:     ch = readchar();
                    485:     mpos = 0;
                    486:     if (ch == ESCAPE)
                    487:     {
                    488:        msg("");
                    489:        return;
                    490:     }
                    491:     if (isupper(ch))
                    492:        str = monsters[ch-'A'].m_name;
                    493:     else switch (ch)
                    494:     {
                    495:        case '|':
                    496:        case '-':
                    497:            str = "wall of a room";
                    498:        when GOLD: str = "gold";
                    499:        when STAIRS : str = "a staircase";
                    500:        when DOOR: str = "door";
                    501:        when FLOOR: str = "room floor";
                    502:        when PLAYER: str = "you";
                    503:        when PASSAGE: str = "passage";
                    504:        when TRAP: str = "trap";
                    505:        when POTION: str = "potion";
                    506:        when SCROLL: str = "scroll";
                    507:        when FOOD: str = "food";
                    508:        when WEAPON: str = "weapon";
                    509:        when ' ' : str = "solid rock";
                    510:        when ARMOR: str = "armor";
                    511:        when AMULET: str = "the Amulet of Yendor";
                    512:        when RING: str = "ring";
                    513:        when STICK: str = "wand or staff";
                    514:        otherwise: str = "unknown character";
                    515:     }
                    516:     msg("'%s': %s", unctrol(ch), str);
                    517: }
                    518:
                    519: /*
                    520:  * d_level:
                    521:  *     He wants to go down a level
                    522:  */
                    523: void
                    524: d_level(void)
                    525: {
                    526:     if (chat(hero.y, hero.x) != STAIRS)
                    527:        msg("I see no way down");
                    528:     else
                    529:     {
                    530:        level++;
                    531:        new_level();
                    532:     }
                    533: }
                    534:
                    535: /*
                    536:  * u_level:
                    537:  *     He wants to go up a level
                    538:  */
                    539: void
                    540: u_level(void)
                    541: {
                    542:     if (chat(hero.y, hero.x) == STAIRS)
                    543:        if (amulet)
                    544:        {
                    545:            level--;
                    546:            if (level == 0)
                    547:                total_winner();
                    548:            new_level();
                    549:            msg("you feel a wrenching sensation in your gut");
                    550:        }
                    551:        else
                    552:            msg("your way is magically blocked");
                    553:     else
                    554:        msg("I see no way up");
                    555: }
                    556:
                    557: /*
                    558:  * call:
                    559:  *     Allow a user to call a potion, scroll, or ring something
                    560:  */
                    561: void
                    562: call(void)
                    563: {
                    564:     register THING *obj;
                    565:     register char **guess;
                    566:     const char *elsewise;
                    567:     register bool *know;
                    568:
                    569:     obj = get_item("call", CALLABLE);
                    570:     /*
                    571:      * Make certain that it is somethings that we want to wear
                    572:      */
                    573:     if (obj == NULL)
                    574:        return;
                    575:     switch (obj->o_type)
                    576:     {
                    577:        case RING:
                    578:            guess = r_guess;
                    579:            know = r_know;
                    580:            elsewise = (r_guess[obj->o_which] != NULL ?
                    581:                        r_guess[obj->o_which] : r_stones[obj->o_which]);
                    582:        when POTION:
                    583:            guess = p_guess;
                    584:            know = p_know;
                    585:            elsewise = (p_guess[obj->o_which] != NULL ?
                    586:                        p_guess[obj->o_which] : p_colors[obj->o_which]);
                    587:        when SCROLL:
                    588:            guess = s_guess;
                    589:            know = s_know;
                    590:            elsewise = (s_guess[obj->o_which] != NULL ?
                    591:                        s_guess[obj->o_which] : s_names[obj->o_which]);
                    592:        when STICK:
                    593:            guess = ws_guess;
                    594:            know = ws_know;
                    595:            elsewise = (ws_guess[obj->o_which] != NULL ?
                    596:                        ws_guess[obj->o_which] : ws_made[obj->o_which]);
                    597:        otherwise:
                    598:            msg("you can't call that anything");
                    599:            return;
                    600:     }
                    601:     if (know[obj->o_which])
                    602:     {
                    603:        msg("that has already been identified");
                    604:        return;
                    605:     }
                    606:     if (!terse)
                    607:        addmsg("Was ");
                    608:     msg("called \"%s\"", elsewise);
                    609:     if (terse)
                    610:        msg("call it: ");
                    611:     else
                    612:        msg("what do you want to call it? ");
                    613:     if (guess[obj->o_which] != NULL)
                    614:        free(guess[obj->o_which]);
                    615:     strcpy(prbuf, elsewise);
                    616:     if (get_str(prbuf, stdscr) == NORM)
                    617:     {
                    618:        guess[obj->o_which] = malloc((unsigned int) strlen(prbuf) + 1);
                    619:        strcpy(guess[obj->o_which], prbuf);
                    620:     }
                    621: }

CVSweb