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