xref: /dragonfly/games/rogue/play.c (revision 0ca59c34)
1 /*-
2  * Copyright (c) 1988, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Timothy C. Stoehr.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  * @(#)play.c	8.1 (Berkeley) 5/31/93
33  * $FreeBSD: src/games/rogue/play.c,v 1.3 1999/11/30 03:49:26 billf Exp $
34  * $DragonFly: src/games/rogue/play.c,v 1.3 2006/09/02 19:31:07 pavalos Exp $
35  */
36 
37 /*
38  * play.c
39  *
40  * This source herein may be modified and/or distributed by anybody who
41  * so desires, with the following restrictions:
42  *    1.)  No portion of this notice shall be removed.
43  *    2.)  Credit shall not be taken for the creation of this source.
44  *    3.)  This code is not to be traded, sold, or used for personal
45  *         gain or profit.
46  *
47  */
48 
49 #include "rogue.h"
50 
51 boolean interrupted = 0;
52 const char *unknown_command = "unknown command";
53 
54 extern short party_room, bear_trap;
55 extern char hit_message[];
56 extern boolean wizard, trap_door;
57 
58 void
59 play_level(void)
60 {
61 	short ch;
62 	int count;
63 
64 	for (;;) {
65 		interrupted = 0;
66 		if (hit_message[0]) {
67 			message(hit_message, 1);
68 			hit_message[0] = 0;
69 		}
70 		if (trap_door) {
71 			trap_door = 0;
72 			return;
73 		}
74 		move(rogue.row, rogue.col);
75 		refresh();
76 
77 		ch = rgetchar();
78 CMCH:
79 		check_message();
80 		count = 0;
81 CH:
82 		switch(ch) {
83 		case '.':
84 			rest((count > 0) ? count : 1);
85 			break;
86 		case 's':
87 			search(((count > 0) ? count : 1), 0);
88 			break;
89 		case 'i':
90 			inventory(&rogue.pack, ALL_OBJECTS);
91 			break;
92 		case 'f':
93 			fight(0);
94 			break;
95 		case 'F':
96 			fight(1);
97 			break;
98 		case 'h':
99 		case 'j':
100 		case 'k':
101 		case 'l':
102 		case 'y':
103 		case 'u':
104 		case 'n':
105 		case 'b':
106 			one_move_rogue(ch, 1);
107 			break;
108 		case 'H':
109 		case 'J':
110 		case 'K':
111 		case 'L':
112 		case 'B':
113 		case 'Y':
114 		case 'U':
115 		case 'N':
116 		case '\010':
117 		case '\012':
118 		case '\013':
119 		case '\014':
120 		case '\031':
121 		case '\025':
122 		case '\016':
123 		case '\002':
124 			multiple_move_rogue(ch);
125 			break;
126 		case 'e':
127 			eat();
128 			break;
129 		case 'q':
130 			quaff();
131 			break;
132 		case 'r':
133 			read_scroll();
134 			break;
135 		case 'm':
136 			move_onto();
137 			break;
138 		case ',':
139 			kick_into_pack();
140 			break;
141 		case 'd':
142 			drop();
143 			break;
144 		case 'P':
145 			put_on_ring();
146 			break;
147 		case 'R':
148 			remove_ring();
149 			break;
150 		case '\020':
151 			do {
152 				remessage(count++);
153 				ch = rgetchar();
154 			} while (ch == '\020');
155 			goto CMCH;
156 			break;
157 		case '\027':
158 			wizardize();
159 			break;
160 		case '>':
161 			if (drop_check()) {
162 				return;
163 			}
164 			break;
165 		case '<':
166 			if (check_up()) {
167 				return;
168 			}
169 			break;
170 		case ')':
171 		case ']':
172 			inv_armor_weapon(ch == ')');
173 			break;
174 		case '=':
175 			inv_rings();
176 			break;
177 		case '^':
178 			id_trap();
179 			break;
180 		case '/':
181 			id_type();
182 			break;
183 		case '?':
184 			id_com();
185 			break;
186 		case '!':
187 			do_shell();
188 			break;
189 		case 'o':
190 			edit_opts();
191 			break;
192 		case 'I':
193 			single_inv(0);
194 			break;
195 		case 'T':
196 			take_off();
197 			break;
198 		case 'W':
199 			wear();
200 			break;
201 		case 'w':
202 			wield();
203 			break;
204 		case 'c':
205 			call_it();
206 			break;
207 		case 'z':
208 			zapp();
209 			break;
210 		case 't':
211 			throw();
212 			break;
213 		case 'v':
214 			message("rogue-clone: Version III. (Tim Stoehr was here), tektronix!zeus!tims", 0);
215 			break;
216 		case 'Q':
217 			quit(0);
218 		case '0':
219 		case '1':
220 		case '2':
221 		case '3':
222 		case '4':
223 		case '5':
224 		case '6':
225 		case '7':
226 		case '8':
227 		case '9':
228 			move(rogue.row, rogue.col);
229 			refresh();
230 			do {
231 				if (count < 100) {
232 					count = (10 * count) + (ch - '0');
233 				}
234 				ch = rgetchar();
235 			} while (is_digit(ch));
236 			if (ch != CANCEL) {
237 				goto CH;
238 			}
239 			break;
240 		case ' ':
241 			break;
242 		case '\011':
243 			if (wizard) {
244 				inventory(&level_objects, ALL_OBJECTS);
245 			} else {
246 				message(unknown_command, 0);
247 			}
248 			break;
249 		case '\023':
250 			if (wizard) {
251 				draw_magic_map();
252 			} else {
253 				message(unknown_command, 0);
254 			}
255 			break;
256 		case '\024':
257 			if (wizard) {
258 				show_traps();
259 			} else {
260 				message(unknown_command, 0);
261 			}
262 			break;
263 		case '\017':
264 			if (wizard) {
265 				show_objects();
266 			} else {
267 				message(unknown_command, 0);
268 			}
269 			break;
270 		case '\001':
271 			show_average_hp();
272 			break;
273 		case '\003':
274 			if (wizard) {
275 				c_object_for_wizard();
276 			} else {
277 				message(unknown_command, 0);
278 			}
279 			break;
280 		case '\015':
281 			if (wizard) {
282 				show_monsters();
283 			} else {
284 				message(unknown_command, 0);
285 			}
286 			break;
287 		case 'S':
288 			save_game();
289 			break;
290 		default:
291 			message(unknown_command, 0);
292 			break;
293 		}
294 	}
295 }
296