1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64: #include <sys/cdefs.h>
65: #ifndef lint
66: __RCSID("$NetBSD: hack.cmd.c,v 1.7 2003/04/02 18:36:35 jsm Exp $");
67: #endif
68:
69: #include "hack.h"
70: #include "extern.h"
71: #include "def.func_tab.h"
72:
73: const struct func_tab cmdlist[] = {
74: { '\020', doredotopl },
75: { '\022', doredraw },
76: { '\024', dotele },
77: #ifdef SUSPEND
78: { '\032', dosuspend },
79: #endif
80: { 'a', doapply },
81:
82:
83: { 'c', ddocall },
84: { 'C', do_mname },
85: { 'd', dodrop },
86: { 'D', doddrop },
87: { 'e', doeat },
88: { 'E', doengrave },
89:
90:
91:
92: { 'I', dotypeinv },
93: { 'i', ddoinv },
94:
95:
96: { 'O', doset },
97: { 'p', dopay },
98: { 'P', dowearring },
99: { 'q', dodrink },
100: { 'Q', dodone },
101: { 'r', doread },
102: { 'R', doremring },
103: { 's', dosearch },
104: { 'S', dosave },
105: { 't', dothrow },
106: { 'T', doremarm },
107:
108: { 'v', doversion },
109:
110: { 'w', dowield },
111: { 'W', doweararm },
112:
113:
114: { 'z', dozap },
115:
116: { '<', doup },
117: { '>', dodown },
118: { '/', dowhatis },
119: { '?', dohelp },
120: #ifdef SHELL
121: { '!', dosh },
122: #endif
123: { '.', donull },
124: { ' ', donull },
125: { ',', dopickup },
126: { ':', dolook },
127: { '^', doidtrap },
128: { '\\', dodiscovered },
129: { WEAPON_SYM, doprwep },
130: { ARMOR_SYM, doprarm },
131: { RING_SYM, doprring },
132: { '$', doprgold },
133: { '#', doextcmd },
134: { 0, 0 }
135: };
136:
137: const struct ext_func_tab extcmdlist[] = {
138: { "dip", dodip },
139: { "pray", dopray },
140: { (char *) 0, donull }
141: };
142:
143: void
144: rhack(cmd)
145: const char *cmd;
146: {
147: const struct func_tab *tlist = cmdlist;
148: boolean firsttime = FALSE;
149: int res;
150:
151: if (!cmd) {
152: firsttime = TRUE;
153: flags.nopick = 0;
154: cmd = parse();
155: }
156: if (!*cmd || (*cmd & 0377) == 0377 ||
157: (flags.no_rest_on_space && *cmd == ' ')) {
158: bell();
159: flags.move = 0;
160: return;
161: }
162: if (movecmd(*cmd)) {
163: walk:
164: if (multi)
165: flags.mv = 1;
166: domove();
167: return;
168: }
169: if (movecmd(lowc(*cmd))) {
170: flags.run = 1;
171: rush:
172: if (firsttime) {
173: if (!multi)
174: multi = COLNO;
175: u.last_str_turn = 0;
176: }
177: flags.mv = 1;
178: #ifdef QUEST
179: if (flags.run >= 4)
180: finddir();
181: if (firsttime) {
182: u.ux0 = u.ux + u.dx;
183: u.uy0 = u.uy + u.dy;
184: }
185: #endif
186: domove();
187: return;
188: }
189: if ((*cmd == 'f' && movecmd(cmd[1])) || movecmd(unctrl(*cmd))) {
190: flags.run = 2;
191: goto rush;
192: }
193: if (*cmd == 'F' && movecmd(lowc(cmd[1]))) {
194: flags.run = 3;
195: goto rush;
196: }
197: if (*cmd == 'm' && movecmd(cmd[1])) {
198: flags.run = 0;
199: flags.nopick = 1;
200: goto walk;
201: }
202: if (*cmd == 'M' && movecmd(lowc(cmd[1]))) {
203: flags.run = 1;
204: flags.nopick = 1;
205: goto rush;
206: }
207: #ifdef QUEST
208: if (*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) {
209: flags.run = 4;
210: if (*cmd == 'F')
211: flags.run += 2;
212: if (cmd[2] == '-')
213: flags.run += 1;
214: goto rush;
215: }
216: #endif
217: while (tlist->f_char) {
218: if (*cmd == tlist->f_char) {
219: res = (*(tlist->f_funct)) ();
220: if (!res) {
221: flags.move = 0;
222: multi = 0;
223: }
224: return;
225: }
226: tlist++;
227: }
228: {
229: char expcmd[10];
230: char *cp = expcmd;
231: while (*cmd && cp - expcmd < (int)sizeof(expcmd) - 2) {
232: if (*cmd >= 040 && *cmd < 0177)
233: *cp++ = *cmd++;
234: else {
235: *cp++ = '^';
236: *cp++ = *cmd++ ^ 0100;
237: }
238: }
239: *cp++ = 0;
240: pline("Unknown command '%s'.", expcmd);
241: }
242: multi = flags.move = 0;
243: }
244:
245: int
246: doextcmd()
247: {
248:
249: char buf[BUFSZ];
250: const struct ext_func_tab *efp = extcmdlist;
251:
252: pline("# ");
253: getlin(buf);
254: clrlin();
255: if (buf[0] == '\033')
256: return (0);
257: while (efp->ef_txt) {
258: if (!strcmp(efp->ef_txt, buf))
259: return ((*(efp->ef_funct)) ());
260: efp++;
261: }
262: pline("%s: unknown command.", buf);
263: return (0);
264: }
265:
266: char
267: lowc(sym)
268: char sym;
269: {
270: return ((sym >= 'A' && sym <= 'Z') ? sym + 'a' - 'A' : sym);
271: }
272:
273: char
274: unctrl(sym)
275: char sym;
276: {
277: return ((sym >= ('A' & 037) && sym <= ('Z' & 037)) ? sym + 0140 : sym);
278: }
279:
280:
281: char sdir[] = "hykulnjb><";
282: schar xdir[10] = {-1, -1, 0, 1, 1, 1, 0, -1, 0, 0};
283: schar ydir[10] = {0, -1, -1, -1, 0, 1, 1, 1, 0, 0};
284: schar zdir[10] = {0, 0, 0, 0, 0, 0, 0, 0, 1, -1};
285:
286: int
287: movecmd(sym)
288: char sym;
289: {
290: char *dp;
291:
292: u.dz = 0;
293: if (!(dp = strchr(sdir, sym)))
294: return (0);
295: u.dx = xdir[dp - sdir];
296: u.dy = ydir[dp - sdir];
297: u.dz = zdir[dp - sdir];
298: return (!u.dz);
299: }
300:
301: int
302: getdir(s)
303: boolean s;
304: {
305: char dirsym;
306:
307: if (s)
308: pline("In what direction?");
309: dirsym = readchar();
310: if (!movecmd(dirsym) && !u.dz) {
311: if (!strchr(quitchars, dirsym))
312: pline("What a strange direction!");
313: return (0);
314: }
315: if (Confusion && !u.dz)
316: confdir();
317: return (1);
318: }
319:
320: void
321: confdir()
322: {
323: int x = rn2(8);
324: u.dx = xdir[x];
325: u.dy = ydir[x];
326: }
327:
328: #ifdef QUEST
329: int
330: finddir()
331: {
332: int i, ui = u.di;
333: for (i = 0; i <= 8; i++) {
334: if (flags.run & 1)
335: ui++;
336: else
337: ui += 7;
338: ui %= 8;
339: if (i == 8) {
340: pline("Not near a wall.");
341: flags.move = multi = 0;
342: return (0);
343: }
344: if (!isroom(u.ux + xdir[ui], u.uy + ydir[ui]))
345: break;
346: }
347: for (i = 0; i <= 8; i++) {
348: if (flags.run & 1)
349: ui += 7;
350: else
351: ui++;
352: ui %= 8;
353: if (i == 8) {
354: pline("Not near a room.");
355: flags.move = multi = 0;
356: return (0);
357: }
358: if (isroom(u.ux + xdir[ui], u.uy + ydir[ui]))
359: break;
360: }
361: u.di = ui;
362: u.dx = xdir[ui];
363: u.dy = ydir[ui];
364: return 0;
365: }
366:
367: int
368: isroom(x, y)
369: int x, y;
370: {
371: return (isok(x, y) && (levl[x][y].typ == ROOM ||
372: (levl[x][y].typ >= LDOOR && flags.run >= 6)));
373: }
374: #endif
375:
376: int
377: isok(x, y)
378: int x, y;
379: {
380:
381: return (x >= 1 && x <= COLNO - 1 && y >= 0 && y <= ROWNO - 1);
382: }