comparison rogue4/command.c @ 12:9535a08ddc39

Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
author edwarj4
date Sat, 24 Oct 2009 16:52:52 +0000
parents
children 4967c46f1320
comparison
equal deleted inserted replaced
11:949d558c2162 12:9535a08ddc39
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 /*
23 * command:
24 * Process the user commands
25 */
26 command()
27 {
28 register char ch;
29 register int ntimes = 1; /* Number of player moves */
30 char *unctrol();
31
32 if (on(player, ISHASTE))
33 ntimes++;
34 /*
35 * Let the daemons start up
36 */
37 do_daemons(BEFORE);
38 do_fuses(BEFORE);
39 while (ntimes--)
40 {
41 /*
42 * these are illegal things for the player to be, so if any are
43 * set, someone's been poking in memeory
44 */
45 if (on(player, ISSLOW|ISCANC|ISGREED|ISINVIS|ISMEAN|ISREGEN))
46 auto_save(-1);
47
48 look(TRUE);
49 if (!running)
50 door_stop = FALSE;
51 status();
52 lastscore = purse;
53 move(hero.y, hero.x);
54 if (!((running || count) && jump))
55 refresh(); /* Draw screen */
56 take = 0;
57 after = TRUE;
58 /*
59 * Read command or continue run
60 */
61 #ifdef WIZARD
62 if (wizard)
63 noscore = TRUE;
64 #endif
65 if (!no_command)
66 {
67 if (running) ch = runch;
68 else if (count) ch = countch;
69 else
70 {
71 ch = readchar();
72 if (mpos != 0 && !running) /* Erase message if its there */
73 msg("");
74 }
75 }
76 else
77 ch = '.';
78 if (no_command)
79 {
80 if (--no_command == 0)
81 {
82 player.t_flags |= ISRUN;
83 msg("you can move again");
84 }
85 }
86 else
87 {
88 /*
89 * check for prefixes
90 */
91 if (isdigit(ch))
92 {
93 count = 0;
94 newcount = TRUE;
95 while (isdigit(ch))
96 {
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':
113 #ifdef WIZARD
114 case CTRL('D'): case CTRL('U'):
115 #endif
116 break;
117 default:
118 count = 0;
119 }
120 }
121 switch (ch)
122 {
123 case 'f':
124 if (!on(player, ISBLIND))
125 {
126 door_stop = TRUE;
127 firstmove = TRUE;
128 }
129 if (count && !newcount)
130 ch = direction;
131 else
132 ch = readchar();
133 switch (ch)
134 {
135 case 'h': case 'j': case 'k': case 'l':
136 case 'y': case 'u': case 'b': case 'n':
137 ch = toupper(ch);
138 }
139 direction = ch;
140 }
141 newcount = FALSE;
142 /*
143 * execute a command
144 */
145 if (count && !running)
146 count--;
147 switch (ch)
148 {
149 case '!' : shell();
150 when 'h' : do_move(0, -1);
151 when 'j' : do_move(1, 0);
152 when 'k' : do_move(-1, 0);
153 when 'l' : do_move(0, 1);
154 when 'y' : do_move(-1, -1);
155 when 'u' : do_move(-1, 1);
156 when 'b' : do_move(1, -1);
157 when 'n' : do_move(1, 1);
158 when 'H' : do_run('h');
159 when 'J' : do_run('j');
160 when 'K' : do_run('k');
161 when 'L' : do_run('l');
162 when 'Y' : do_run('y');
163 when 'U' : do_run('u');
164 when 'B' : do_run('b');
165 when 'N' : do_run('n');
166 when 't':
167 if (!get_dir())
168 after = FALSE;
169 else
170 missile(delta.y, delta.x);
171 when 'Q' : after = FALSE; quit(-1);
172 when 'i' : after = FALSE; inventory(pack, 0);
173 when 'I' : after = FALSE; picky_inven();
174 when 'd' : drop();
175 when 'q' : quaff();
176 when 'r' : read_scroll();
177 when 'e' : eat();
178 when 'w' : wield();
179 when 'W' : wear();
180 when 'T' : take_off();
181 when 'P' : ring_on();
182 when 'R' : ring_off();
183 when 'o' : option(); after = FALSE;
184 when 'c' : call(); after = FALSE;
185 when '>' : after = FALSE; d_level();
186 when '<' : after = FALSE; u_level();
187 when '?' : after = FALSE; help();
188 when '/' : after = FALSE; identify();
189 when 's' : search();
190 when 'z':
191 if (get_dir())
192 do_zap();
193 else
194 after = FALSE;
195 when 'D': after = FALSE; discovered();
196 when CTRL('R') : after = FALSE; msg(huh);
197 when CTRL('L') :
198 after = FALSE;
199 clearok(curscr,TRUE);
200 wrefresh(curscr);
201 when 'v' :
202 after = FALSE;
203 msg("rogue version %s. (mctesq was here)", release);
204 when 'S' :
205 after = FALSE;
206 if (save_game())
207 {
208 move(LINES-1, 0);
209 clrtoeol();
210 refresh();
211 endwin();
212 exit(0);
213 }
214 when '.' : ; /* Rest command */
215 when ' ' : after = FALSE; /* "Legal" illegal command */
216 when '^' :
217 after = FALSE;
218 if (get_dir()) {
219 delta.y += hero.y;
220 delta.x += hero.x;
221 if (chat(delta.y, delta.x) != TRAP)
222 msg("no trap there");
223 else
224 msg(tr_name(flat(delta.y, delta.x) & F_TMASK));
225 }
226 #ifdef WIZARD
227 when CTRL('P') :
228 after = FALSE;
229 if (wizard)
230 {
231 wizard = FALSE;
232 turn_see(TRUE);
233 msg("not wizard any more");
234 }
235 else
236 {
237 if (wizard = passwd())
238 {
239 noscore = TRUE;
240 turn_see(FALSE);
241 msg("you are suddenly as smart as Ken Arnold in dungeon #%d", dnum);
242 }
243 else
244 msg("sorry");
245 }
246 #endif
247 when ESCAPE : /* Escape */
248 door_stop = FALSE;
249 count = 0;
250 after = FALSE;
251 otherwise :
252 after = FALSE;
253 #ifdef WIZARD
254 if (wizard) switch (ch)
255 {
256 case '@' : msg("@ %d,%d", hero.y, hero.x);
257 when 'C' : create_obj();
258 when CTRL('I') : inventory(lvl_obj, 0);
259 when CTRL('W') : whatis(FALSE);
260 when CTRL('D') : level++; new_level();
261 when CTRL('U') : if (level > 1) level--; new_level();
262 when CTRL('F') : show_map();
263 when CTRL('T') : teleport();
264 when CTRL('E') : msg("food left: %d", food_left);
265 when CTRL('A') : msg("%d things in your pack", inpack);
266 when CTRL('K') : add_pass();
267 when CTRL('X') : turn_see(on(player, SEEMONST));
268 when CTRL('N') :
269 {
270 register THING *item;
271
272 if ((item = get_item("charge", STICK)) != NULL)
273 item->o_charges = 10000;
274 }
275 when CTRL('H') :
276 {
277 register int i;
278 register THING *obj;
279
280 for (i = 0; i < 9; i++)
281 raise_level();
282 /*
283 * Give the rogue a sword (+1,+1)
284 */
285 obj = new_item();
286 obj->o_type = WEAPON;
287 obj->o_which = TWOSWORD;
288 init_weapon(obj, SWORD);
289 obj->o_hplus = 1;
290 obj->o_dplus = 1;
291 obj->o_count = 1;
292 obj->o_group = 0;
293 add_pack(obj, TRUE);
294 cur_weapon = obj;
295 /*
296 * And his suit of armor
297 */
298 obj = new_item();
299 obj->o_type = ARMOR;
300 obj->o_which = PLATE_MAIL;
301 obj->o_ac = -5;
302 obj->o_flags |= ISKNOW;
303 obj->o_count = 1;
304 obj->o_group = 0;
305 cur_armor = obj;
306 add_pack(obj, TRUE);
307 }
308 otherwise :
309 illcom(ch);
310 }
311 else
312 #endif
313 illcom(ch);
314 }
315 /*
316 * turn off flags if no longer needed
317 */
318 if (!running)
319 door_stop = FALSE;
320 }
321 /*
322 * If he ran into something to take, let him pick it up.
323 */
324 if (take != 0)
325 pick_up(take);
326 if (!running)
327 door_stop = FALSE;
328 if (!after)
329 ntimes++;
330 }
331 do_daemons(AFTER);
332 do_fuses(AFTER);
333 if (ISRING(LEFT, R_SEARCH))
334 search();
335 else if (ISRING(LEFT, R_TELEPORT) && rnd(50) == 0)
336 teleport();
337 if (ISRING(RIGHT, R_SEARCH))
338 search();
339 else if (ISRING(RIGHT, R_TELEPORT) && rnd(50) == 0)
340 teleport();
341 }
342
343 /*
344 * illcom:
345 * What to do with an illegal command
346 */
347 illcom(ch)
348 char ch;
349 {
350 save_msg = FALSE;
351 count = 0;
352 msg("illegal command '%s'", unctrol(ch));
353 save_msg = TRUE;
354 }
355
356 /*
357 * search:
358 * Player gropes about him to find hidden things.
359 */
360 search()
361 {
362 register int y, x;
363 register char *fp;
364 register int ey, ex;
365
366 if (on(player, ISBLIND))
367 return;
368 ey = hero.y + 1;
369 ex = hero.x + 1;
370 for (y = hero.y - 1; y <= ey; y++)
371 for (x = hero.x - 1; x <= ex; x++)
372 {
373 if (y == hero.y && x == hero.x)
374 continue;
375 fp = &flat(y, x);
376 if (!(*fp & F_REAL))
377 switch (chat(y, x))
378 {
379 case '|':
380 case '-':
381 if (rnd(5) != 0)
382 break;
383 chat(y, x) = DOOR;
384 *fp |= F_REAL;
385 count = running = FALSE;