cypher.c revision 1.8 1 /* $NetBSD: cypher.c,v 1.8 1999/03/25 16:46:08 hubertf Exp $ */
2
3 /*
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #include <sys/cdefs.h>
37 #ifndef lint
38 #if 0
39 static char sccsid[] = "@(#)cypher.c 8.2 (Berkeley) 4/28/95";
40 #else
41 __RCSID("$NetBSD: cypher.c,v 1.8 1999/03/25 16:46:08 hubertf Exp $");
42 #endif
43 #endif /* not lint */
44
45 #include "extern.h"
46
47 int
48 cypher()
49 {
50 int n;
51 int junk;
52 int lflag = -1;
53 char buffer[10];
54
55 while (wordtype[wordnumber] == ADJS)
56 wordnumber++;
57 while (wordnumber <= wordcount) {
58 switch (wordvalue[wordnumber]) {
59
60 case UP:
61 if (location[position].access || wiz || tempwiz) {
62 if (!location[position].access)
63 puts("Zap! A gust of wind lifts you up.");
64 if (!move(location[position].up, AHEAD))
65 return (-1);
66 } else {
67 puts("There is no way up");
68 return (-1);
69 }
70 lflag = 0;
71 break;
72
73 case DOWN:
74 if (!move(location[position].down, AHEAD))
75 return (-1);
76 lflag = 0;
77 break;
78
79 case LEFT:
80 if (!move(left, LEFT))
81 return (-1);
82 lflag = 0;
83 break;
84
85 case RIGHT:
86 if (!move(right, RIGHT))
87 return (-1);
88 lflag = 0;
89 break;
90
91 case AHEAD:
92 if (!move(ahead, AHEAD))
93 return (-1);
94 lflag = 0;
95 break;
96
97 case BACK:
98 if (!move(back, BACK))
99 return (-1);
100 lflag = 0;
101 break;
102
103 case SHOOT:
104 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
105 for (n = 0; n < NUMOFOBJECTS; n++)
106 if (testbit(location[position].objects, n) && objsht[n]) {
107 wordvalue[wordnumber + 1] = n;
108 wordnumber = shoot();
109 }
110 wordnumber++;
111 wordnumber++;
112 } else
113 shoot();
114 break;
115
116 case TAKE:
117 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
118 for (n = 0; n < NUMOFOBJECTS; n++)
119 if (testbit(location[position].objects, n) && objsht[n]) {
120 wordvalue[wordnumber + 1] = n;
121 /* Some objects (type NOUNS)
122 * have special treatment in
123 * take(). For these we
124 * must set the type to NOUNS.
125 * However for SWORD and BODY
126 * all it does is find which
127 * of many objects is meant,
128 * so we need do nothing here.
129 * BATHGOD must become
130 * NORMGOD as well. NOUNS
131 * with no special case
132 * must be included here to
133 * get the right error. DOOR
134 * cannot occur as an object
135 * so need not be included. */
136 switch(n) {
137 case BATHGOD:
138 wordvalue[wordnumber + 1] = NORMGOD;
139 case NORMGOD:
140 case AMULET:
141 case MEDALION:
142 case TALISMAN:
143 case MAN:
144 case TIMER:
145 case NATIVE:
146 wordtype[wordnumber + 1] = NOUNS;
147 break;
148 default:
149 wordtype[wordnumber + 1] = OBJECT;
150 }
151 wordnumber = take(location[position].objects);
152 }
153 wordnumber++;
154 wordnumber++;
155 } else
156 take(location[position].objects);
157 break;
158
159 case DROP:
160
161 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
162 for (n = 0; n < NUMOFOBJECTS; n++)
163 if (testbit(inven, n)) {
164 wordvalue[wordnumber + 1] = n;
165 wordnumber = drop("Dropped");
166 }
167 wordnumber++;
168 wordnumber++;
169 } else
170 drop("Dropped");
171 break;
172
173
174 case KICK:
175 case THROW:
176 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
177 for (n = 0; n < NUMOFOBJECTS; n++)
178 if (testbit(inven, n) ||
179 (testbit(location[position].objects, n) && objsht[n])) {
180 wordvalue[wordnumber + 1] = n;
181 wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
182 }
183 wordnumber += 2;
184 } else
185 throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
186 break;
187
188 case TAKEOFF:
189 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
190 for (n = 0; n < NUMOFOBJECTS; n++)
191 if (testbit(wear, n)) {
192 wordvalue[wordnumber + 1] = n;
193 wordnumber = takeoff();
194 }
195 wordnumber += 2;
196 } else
197 takeoff();
198 break;
199
200
201 case DRAW:
202
203 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
204 for (n = 0; n < NUMOFOBJECTS; n++)
205 if (testbit(wear, n)) {
206 wordvalue[wordnumber + 1] = n;
207 wordnumber = draw();
208 }
209 wordnumber += 2;
210 } else
211 draw();
212 break;
213
214
215 case PUTON:
216
217 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
218 for (n = 0; n < NUMOFOBJECTS; n++)
219 if (testbit(location[position].objects, n) && objsht[n]) {
220 wordvalue[wordnumber + 1] = n;
221 wordnumber = puton();
222 }
223 wordnumber += 2;
224 } else
225 puton();
226 break;
227
228 case WEARIT:
229
230 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
231 for (n = 0; n < NUMOFOBJECTS; n++)
232 if (testbit(inven, n)) {
233 wordvalue[wordnumber + 1] = n;
234 wordnumber = wearit();
235 }
236 wordnumber += 2;
237 } else
238 wearit();
239 break;
240
241
242 case EAT:
243
244 if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
245 for (n = 0; n < NUMOFOBJECTS; n++)
246 if (testbit(inven, n)) {
247 wordvalue[wordnumber + 1] = n;
248 wordnumber = eat();
249 }
250 wordnumber += 2;
251 } else
252 eat();
253 break;
254
255
256 case PUT:
257 put();
258 break;
259
260
261 case INVEN:
262 if (ucard(inven)) {
263 puts("You are holding:\n");
264 for (n = 0; n < NUMOFOBJECTS; n++)
265 if (testbit(inven, n))
266 printf("\t%s\n", objsht[n]);
267 printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."), (WEIGHT ? carrying * 100 / WEIGHT : -1));
268 printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER);
269 } else
270 puts("You aren't carrying anything.");
271
272 if (ucard(wear)) {
273 puts("\nYou are wearing:\n");
274 for (n = 0; n < NUMOFOBJECTS; n++)
275 if (testbit(wear, n))
276 printf("\t%s\n", objsht[n]);
277 } else
278 puts("\nYou are stark naked.");
279 if (card(injuries, NUMOFINJURIES)) {
280 puts("\nYou have suffered:\n");
281 for (n = 0; n < NUMOFINJURIES; n++)
282 if (injuries[n])
283 printf("\t%s\n", ouch[n]);
284 printf("\nYou can still carry up to %d kilogram%s\n", WEIGHT, (WEIGHT == 1 ? "." : "s."));
285 } else
286 puts("\nYou are in perfect health.");
287 break;
288
289 case USE:
290 lflag = use();
291 break;
292
293 case LOOK:
294 if (!notes[CANTSEE] || testbit(inven, LAMPON) ||
295 testbit(location[position].objects, LAMPON)
296 || matchlight) {
297 beenthere[position] = 2;
298 writedes();
299 printobjs();
300 if (matchlight) {
301 puts("\nYour match splutters out.");
302 matchlight = 0;
303 }
304 } else
305 puts("I can't see anything.");
306 return (-1);
307 break;
308
309 case SU:
310 if (wiz || tempwiz) {
311 printf("\nRoom (was %d) = ", position);
312 fgets(buffer, 10, stdin);
313 if (*buffer != '\n')
314 sscanf(buffer, "%d", &position);
315 printf("Time (was %d) = ", ourtime);
316 fgets(buffer, 10, stdin);
317 if (*buffer != '\n')
318 sscanf(buffer, "%d", &ourtime);
319 printf("Fuel (was %d) = ", fuel);
320 fgets(buffer, 10, stdin);
321 if (*buffer != '\n')
322 sscanf(buffer, "%d", &fuel);
323 printf("Torps (was %d) = ", torps);
324 fgets(buffer, 10, stdin);
325 if (*buffer != '\n')
326 sscanf(buffer, "%d", &torps);
327 printf("CUMBER (was %d) = ", CUMBER);
328 fgets(buffer, 10, stdin);
329 if (*buffer != '\n')
330 sscanf(buffer, "%d", &CUMBER);
331 printf("WEIGHT (was %d) = ", WEIGHT);
332 fgets(buffer, 10, stdin);
333 if (*buffer != '\n')
334 sscanf(buffer, "%d", &WEIGHT);
335 printf("Clock (was %d) = ", ourclock);
336 fgets(buffer, 10, stdin);
337 if (*buffer != '\n')
338 sscanf(buffer, "%d", &ourclock);
339 printf("Wizard (was %d, %d) = ", wiz, tempwiz);
340 fgets(buffer, 10, stdin);
341 if (*buffer != '\n') {
342 sscanf(buffer, "%d", &junk);
343 if (!junk)
344 tempwiz = wiz = 0;
345 }
346 printf("\nDONE.\n");
347 return (0);
348 } else
349 puts("You aren't a wizard.");
350 break;
351
352 case SCORE:
353 printf("\tPLEASURE\tPOWER\t\tEGO\n");
354 printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego);
355 printf("This gives you the rating of %s in %d turns.\n", rate(), ourtime);
356 printf("You have visited %d out of %d rooms this run (%d%%).\n", card(beenthere, NUMOFROOMS), NUMOFROOMS, card(beenthere, NUMOFROOMS) * 100 / NUMOFROOMS);
357 break;
358
359 case KNIFE:
360 case KILL:
361 murder();
362 break;
363
364 case UNDRESS:
365 case RAVAGE:
366 ravage();
367 break;
368
369 case SAVE:
370 save();
371 break;
372
373 case FOLLOW:
374 lflag = follow();
375 break;
376
377 case GIVE:
378 give();
379 break;
380
381 case KISS:
382 kiss();
383 break;
384
385 case LOVE:
386 love();
387 break;
388
389 case RIDE:
390 lflag = ride();
391 break;
392
393 case DRIVE:
394 lflag = drive();
395 break;
396
397 case LIGHT:
398 light();
399 break;
400
401 case LAUNCH:
402 if (!launch())
403 return (-1);
404 else
405 lflag = 0;
406 break;
407
408 case LANDIT:
409 if (!land())
410 return (-1);
411 else
412 lflag = 0;
413 break;
414
415 case TIME:
416 chime();
417 break;
418
419 case SLEEP:
420 zzz();
421 break;
422
423 case DIG:
424 dig();
425 break;
426
427 case JUMP:
428 lflag = jump();
429 break;
430
431 case BURY:
432 bury();
433 break;
434
435 case SWIM:
436 puts("Surf's up!");
437 break;
438
439 case DRINK:
440 drink();
441 break;
442
443 case QUIT:
444 die();
445
446 default:
447 puts("How's that?");
448 return (-1);
449 break;
450
451
452 }
453 if (wordnumber < wordcount && *words[wordnumber++] == ',')
454 continue;
455 else
456 return (lflag);
457 }
458 return (lflag);
459 }
460