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