]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/hack/hack.cmd.c
This commit was generated by cvs2svn to compensate for changes in r50894,
[FreeBSD/FreeBSD.git] / games / hack / hack.cmd.c
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 }