xref: /dragonfly/games/rogue/play.c (revision c03f08f3)
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.3 2006/09/02 19:31:07 pavalos 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 void
63 play_level(void)
64 {
65 	short ch;
66 	int count;
67 
68 	for (;;) {
69 		interrupted = 0;
70 		if (hit_message[0]) {
71 			message(hit_message, 1);
72 			hit_message[0] = 0;
73 		}
74 		if (trap_door) {
75 			trap_door = 0;
76 			return;
77 		}
78 		move(rogue.row, rogue.col);
79 		refresh();
80 
81 		ch = rgetchar();
82 CMCH:
83 		check_message();
84 		count = 0;
85 CH:
86 		switch(ch) {
87 		case '.':
88 			rest((count > 0) ? count : 1);
89 			break;
90 		case 's':
91 			search(((count > 0) ? count : 1), 0);
92 			break;
93 		case 'i':
94 			inventory(&rogue.pack, ALL_OBJECTS);
95 			break;
96 		case 'f':
97 			fight(0);
98 			break;
99 		case 'F':
100 			fight(1);
101 			break;
102 		case 'h':
103 		case 'j':
104 		case 'k':
105 		case 'l':
106 		case 'y':
107 		case 'u':
108 		case 'n':
109 		case 'b':
110 			one_move_rogue(ch, 1);
111 			break;
112 		case 'H':
113 		case 'J':
114 		case 'K':
115 		case 'L':
116 		case 'B':
117 		case 'Y':
118 		case 'U':
119 		case 'N':
120 		case '\010':
121 		case '\012':
122 		case '\013':
123 		case '\014':
124 		case '\031':
125 		case '\025':
126 		case '\016':
127 		case '\002':
128 			multiple_move_rogue(ch);
129 			break;
130 		case 'e':
131 			eat();
132 			break;
133 		case 'q':
134 			quaff();
135 			break;
136 		case 'r':
137 			read_scroll();
138 			break;
139 		case 'm':
140 			move_onto();
141 			break;
142 		case ',':
143 			kick_into_pack();
144 			break;
145 		case 'd':
146 			drop();
147 			break;
148 		case 'P':
149 			put_on_ring();
150 			break;
151 		case 'R':
152 			remove_ring();
153 			break;
154 		case '\020':
155 			do {
156 				remessage(count++);
157 				ch = rgetchar();
158 			} while (ch == '\020');
159 			goto CMCH;
160 			break;
161 		case '\027':
162 			wizardize();
163 			break;
164 		case '>':
165 			if (drop_check()) {
166 				return;
167 			}
168 			break;
169 		case '<':
170 			if (check_up()) {
171 				return;
172 			}
173 			break;
174 		case ')':
175 		case ']':
176 			inv_armor_weapon(ch == ')');
177 			break;
178 		case '=':
179 			inv_rings();
180 			break;
181 		case '^':
182 			id_trap();
183 			break;
184 		case '/':
185 			id_type();
186 			break;
187 		case '?':
188 			id_com();
189 			break;
190 		case '!':
191 			do_shell();
192 			break;
193 		case 'o':
194 			edit_opts();
195 			break;
196 		case 'I':
197 			single_inv(0);
198 			break;
199 		case 'T':
200 			take_off();
201 			break;
202 		case 'W':
203 			wear();
204 			break;
205 		case 'w':
206 			wield();
207 			break;
208 		case 'c':
209 			call_it();
210 			break;
211 		case 'z':
212 			zapp();
213 			break;
214 		case 't':
215 			throw();
216 			break;
217 		case 'v':
218 			message("rogue-clone: Version III. (Tim Stoehr was here), tektronix!zeus!tims", 0);
219 			break;
220 		case 'Q':
221 			quit(0);
222 		case '0':
223 		case '1':
224 		case '2':
225 		case '3':
226 		case '4':
227 		case '5':
228 		case '6':
229 		case '7':
230 		case '8':
231 		case '9':
232 			move(rogue.row, rogue.col);
233 			refresh();
234 			do {
235 				if (count < 100) {
236 					count = (10 * count) + (ch - '0');
237 				}
238 				ch = rgetchar();
239 			} while (is_digit(ch));
240 			if (ch != CANCEL) {
241 				goto CH;
242 			}
243 			break;
244 		case ' ':
245 			break;
246 		case '\011':
247 			if (wizard) {
248 				inventory(&level_objects, ALL_OBJECTS);
249 			} else {
250 				message(unknown_command, 0);
251 			}
252 			break;
253 		case '\023':
254 			if (wizard) {
255 				draw_magic_map();
256 			} else {
257 				message(unknown_command, 0);
258 			}
259 			break;
260 		case '\024':
261 			if (wizard) {
262 				show_traps();
263 			} else {
264 				message(unknown_command, 0);
265 			}
266 			break;
267 		case '\017':
268 			if (wizard) {
269 				show_objects();
270 			} else {
271 				message(unknown_command, 0);
272 			}
273 			break;
274 		case '\001':
275 			show_average_hp();
276 			break;
277 		case '\003':
278 			if (wizard) {
279 				c_object_for_wizard();
280 			} else {
281 				message(unknown_command, 0);
282 			}
283 			break;
284 		case '\015':
285 			if (wizard) {
286 				show_monsters();
287 			} else {
288 				message(unknown_command, 0);
289 			}
290 			break;
291 		case 'S':
292 			save_game();
293 			break;
294 		default:
295 			message(unknown_command, 0);
296 			break;
297 		}
298 	}
299 }
300