Merge from vendor branch CVS:
[dragonfly.git] / games / rogue / play.c
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 }