Annotation of 43BSDTahoe/games/hack/hack.cmd.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: /* hack.cmd.c - version 1.0.3 */
                      3: 
                      4: #include       "hack.h"
                      5: #include       "def.func_tab.h"
                      6: 
                      7: int doredraw(),doredotopl(),dodrop(),dodrink(),doread(),dosearch(),dopickup(),
                      8: doversion(),doweararm(),dowearring(),doremarm(),doremring(),dopay(),doapply(),
                      9: dosave(),dowield(),ddoinv(),dozap(),ddocall(),dowhatis(),doengrave(),dotele(),
                     10: dohelp(),doeat(),doddrop(),do_mname(),doidtrap(),doprwep(),doprarm(),
                     11: doprring(),doprgold(),dodiscovered(),dotypeinv(),dolook(),doset(),
                     12: doup(), dodown(), done1(), donull(), dothrow(), doextcmd(), dodip(), dopray();
                     13: #ifdef SHELL
                     14: int dosh();
                     15: #endif SHELL
                     16: #ifdef SUSPEND
                     17: int dosuspend();
                     18: #endif SUSPEND
                     19: 
                     20: struct func_tab cmdlist[]={
                     21:        '\020', doredotopl,
                     22:        '\022', doredraw,
                     23:        '\024', dotele,
                     24: #ifdef SUSPEND
                     25:        '\032', dosuspend,
                     26: #endif SUSPEND
                     27:        'a', doapply,
                     28: /*     'A' : UNUSED */
                     29: /*     'b', 'B' : go sw */
                     30:        'c', ddocall,
                     31:        'C', do_mname,
                     32:        'd', dodrop,
                     33:        'D', doddrop,
                     34:        'e', doeat,
                     35:        'E', doengrave,
                     36: /*     'f', 'F' : multiple go (might become 'fight') */
                     37: /*     'g', 'G' : UNUSED */
                     38: /*     'h', 'H' : go west */
                     39:        'I', dotypeinv,         /* Robert Viduya */
                     40:        'i', ddoinv,
                     41: /*     'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N' : move commands */
                     42: /*     'o', doopen,    */
                     43:        'O', doset,
                     44:        'p', dopay,
                     45:        'P', dowearring,
                     46:        'q', dodrink,
                     47:        'Q', done1,
                     48:        'r', doread,
                     49:        'R', doremring,
                     50:        's', dosearch,
                     51:        'S', dosave,
                     52:        't', dothrow,
                     53:        'T', doremarm,
                     54: /*     'u', 'U' : go ne */
                     55:        'v', doversion,
                     56: /*     'V' : UNUSED */
                     57:        'w', dowield,
                     58:        'W', doweararm,
                     59: /*     'x', 'X' : UNUSED */
                     60: /*     'y', 'Y' : go nw */
                     61:        'z', dozap,
                     62: /*     'Z' : UNUSED */
                     63:        '<', doup,
                     64:        '>', dodown,
                     65:        '/', dowhatis,
                     66:        '?', dohelp,
                     67: #ifdef SHELL
                     68:        '!', dosh,
                     69: #endif SHELL
                     70:        '.', donull,
                     71:        ' ', donull,
                     72:        ',', dopickup,
                     73:        ':', dolook,
                     74:        '^', doidtrap,
                     75:        '\\', dodiscovered,             /* Robert Viduya */
                     76:         WEAPON_SYM,  doprwep,
                     77:         ARMOR_SYM,  doprarm,
                     78:         RING_SYM,  doprring,
                     79:        '$', doprgold,
                     80:        '#', doextcmd,
                     81:        0,0,0
                     82: };
                     83: 
                     84: struct ext_func_tab extcmdlist[] = {
                     85:        "dip", dodip,
                     86:        "pray", dopray,
                     87:        (char *) 0, donull
                     88: };
                     89: 
                     90: extern char *parse(), lowc(), unctrl(), quitchars[];
                     91: 
                     92: rhack(cmd)
                     93: register char *cmd;
                     94: {
                     95:        register struct func_tab *tlist = cmdlist;
                     96:        boolean firsttime = FALSE;
                     97:        register res;
                     98: 
                     99:        if(!cmd) {
                    100:                firsttime = TRUE;
                    101:                flags.nopick = 0;
                    102:                cmd = parse();
                    103:        }
                    104:        if(!*cmd || (*cmd & 0377) == 0377 ||
                    105:           (flags.no_rest_on_space && *cmd == ' ')){
                    106:                bell();
                    107:                flags.move = 0;
                    108:                return;         /* probably we just had an interrupt */
                    109:        }
                    110:        if(movecmd(*cmd)) {
                    111:        walk:
                    112:                if(multi) flags.mv = 1;
                    113:                domove();
                    114:                return;
                    115:        }
                    116:        if(movecmd(lowc(*cmd))) {
                    117:                flags.run = 1;
                    118:        rush:
                    119:                if(firsttime){
                    120:                        if(!multi) multi = COLNO;
                    121:                        u.last_str_turn = 0;
                    122:                }
                    123:                flags.mv = 1;
                    124: #ifdef QUEST
                    125:                if(flags.run >= 4) finddir();
                    126:                if(firsttime){
                    127:                        u.ux0 = u.ux + u.dx;
                    128:                        u.uy0 = u.uy + u.dy;
                    129:                }
                    130: #endif QUEST
                    131:                domove();
                    132:                return;
                    133:        }
                    134:        if((*cmd == 'f' && movecmd(cmd[1])) || movecmd(unctrl(*cmd))) {
                    135:                flags.run = 2;
                    136:                goto rush;
                    137:        }
                    138:        if(*cmd == 'F' && movecmd(lowc(cmd[1]))) {
                    139:                flags.run = 3;
                    140:                goto rush;
                    141:        }
                    142:        if(*cmd == 'm' && movecmd(cmd[1])) {
                    143:                flags.run = 0;
                    144:                flags.nopick = 1;
                    145:                goto walk;
                    146:        }
                    147:        if(*cmd == 'M' && movecmd(lowc(cmd[1]))) {
                    148:                flags.run = 1;
                    149:                flags.nopick = 1;
                    150:                goto rush;
                    151:        }
                    152: #ifdef QUEST
                    153:        if(*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) {
                    154:                flags.run = 4;
                    155:                if(*cmd == 'F') flags.run += 2;
                    156:                if(cmd[2] == '-') flags.run += 1;
                    157:                goto rush;
                    158:        }
                    159: #endif QUEST
                    160:        while(tlist->f_char) {
                    161:                if(*cmd == tlist->f_char){
                    162:                        res = (*(tlist->f_funct))();
                    163:                        if(!res) {
                    164:                                flags.move = 0;
                    165:                                multi = 0;
                    166:                        }
                    167:                        return;
                    168:                }
                    169:                tlist++;
                    170:        }
                    171:        { char expcmd[10];
                    172:          register char *cp = expcmd;
                    173:          while(*cmd && cp-expcmd < sizeof(expcmd)-2) {
                    174:                if(*cmd >= 040 && *cmd < 0177)
                    175:                        *cp++ = *cmd++;
                    176:                else {
                    177:                        *cp++ = '^';
                    178:                        *cp++ = *cmd++ ^ 0100;
                    179:                }
                    180:          }
                    181:          *cp++ = 0;
                    182:          pline("Unknown command '%s'.", expcmd);
                    183:        }
                    184:        multi = flags.move = 0;
                    185: }
                    186: 
                    187: doextcmd()     /* here after # - now read a full-word command */
                    188: {
                    189:        char buf[BUFSZ];
                    190:        register struct ext_func_tab *efp = extcmdlist;
                    191: 
                    192:        pline("# ");
                    193:        getlin(buf);
                    194:        clrlin();
                    195:        if(buf[0] == '\033')
                    196:                return(0);
                    197:        while(efp->ef_txt) {
                    198:                if(!strcmp(efp->ef_txt, buf))
                    199:                        return((*(efp->ef_funct))());
                    200:                efp++;
                    201:        }
                    202:        pline("%s: unknown command.", buf);
                    203:        return(0);
                    204: }
                    205: 
                    206: char
                    207: lowc(sym)
                    208: char sym;
                    209: {
                    210:     return( (sym >= 'A' && sym <= 'Z') ? sym+'a'-'A' : sym );
                    211: }
                    212: 
                    213: char
                    214: unctrl(sym)
                    215: char sym;
                    216: {
                    217:     return( (sym >= ('A' & 037) && sym <= ('Z' & 037)) ? sym + 0140 : sym );
                    218: }
                    219: 
                    220: /* 'rogue'-like direction commands */
                    221: char sdir[] = "hykulnjb><";
                    222: schar xdir[10] = { -1,-1, 0, 1, 1, 1, 0,-1, 0, 0 };
                    223: schar ydir[10] = {  0,-1,-1,-1, 0, 1, 1, 1, 0, 0 };
                    224: schar zdir[10] = {  0, 0, 0, 0, 0, 0, 0, 0, 1,-1 };
                    225: 
                    226: movecmd(sym)   /* also sets u.dz, but returns false for <> */
                    227: char sym;
                    228: {
                    229:        register char *dp;
                    230: 
                    231:        u.dz = 0;
                    232:        if(!(dp = index(sdir, sym))) return(0);
                    233:        u.dx = xdir[dp-sdir];
                    234:        u.dy = ydir[dp-sdir];
                    235:        u.dz = zdir[dp-sdir];
                    236:        return(!u.dz);
                    237: }
                    238: 
                    239: getdir(s)
                    240: boolean s;
                    241: {
                    242:        char dirsym;
                    243: 
                    244:        if(s) pline("In what direction?");
                    245:        dirsym = readchar();
                    246:        if(!movecmd(dirsym) && !u.dz) {
                    247:                if(!index(quitchars, dirsym))
                    248:                        pline("What a strange direction!");
                    249:                return(0);
                    250:        }
                    251:        if(Confusion && !u.dz)
                    252:                confdir();
                    253:        return(1);
                    254: }
                    255: 
                    256: confdir()
                    257: {
                    258:        register x = rn2(8);
                    259:        u.dx = xdir[x];
                    260:        u.dy = ydir[x];
                    261: }
                    262: 
                    263: #ifdef QUEST
                    264: finddir(){
                    265: register int i, ui = u.di;
                    266:        for(i = 0; i <= 8; i++){
                    267:                if(flags.run & 1) ui++; else ui += 7;
                    268:                ui %= 8;
                    269:                if(i == 8){
                    270:                        pline("Not near a wall.");
                    271:                        flags.move = multi = 0;
                    272:                        return(0);
                    273:                }
                    274:                if(!isroom(u.ux+xdir[ui], u.uy+ydir[ui]))
                    275:                        break;
                    276:        }
                    277:        for(i = 0; i <= 8; i++){
                    278:                if(flags.run & 1) ui += 7; else ui++;
                    279:                ui %= 8;
                    280:                if(i == 8){
                    281:                        pline("Not near a room.");
                    282:                        flags.move = multi = 0;
                    283:                        return(0);
                    284:                }
                    285:                if(isroom(u.ux+xdir[ui], u.uy+ydir[ui]))
                    286:                        break;
                    287:        }
                    288:        u.di = ui;
                    289:        u.dx = xdir[ui];
                    290:        u.dy = ydir[ui];
                    291: }
                    292: 
                    293: isroom(x,y)  register x,y; {           /* what about POOL? */
                    294:        return(isok(x,y) && (levl[x][y].typ == ROOM ||
                    295:                                (levl[x][y].typ >= LDOOR && flags.run >= 6)));
                    296: }
                    297: #endif QUEST
                    298: 
                    299: isok(x,y) register x,y; {
                    300:        /* x corresponds to curx, so x==1 is the first column. Ach. %% */
                    301:        return(x >= 1 && x <= COLNO-1 && y >= 0 && y <= ROWNO-1);
                    302: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.