xref: /386bsd/usr/src/games/battlestar/cypher.c (revision a2142627)
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[] = "@(#)cypher.c	5.3 (Berkeley) 6/1/90";
36 #endif /* not lint */
37 
38 #include "externs.h"
39 
cypher()40 cypher()
41 {
42 	register int n;
43 	int junk;
44 	int lflag = -1;
45 	char buffer[10];
46 
47 	while (wordtype[wordnumber] == ADJS)
48 		wordnumber++;
49 	while (wordnumber <= wordcount) {
50 		switch(wordvalue[wordnumber]) {
51 
52 			case UP:
53 				if (location[position].access || wiz || tempwiz) {
54 					if (!location[position].access)
55 						puts("Zap!  A gust of wind lifts you up.");
56 					if (!move(location[position].up, AHEAD))
57 						return(-1);
58 				} else {
59 					puts("There is no way up");
60 					return(-1);
61 				}
62 				lflag = 0;
63 				break;
64 
65 			 case DOWN:
66 				if (!move(location[position].down, AHEAD))
67 					return(-1);
68 				lflag = 0;
69 				break;
70 
71 			 case LEFT:
72 				if (!move(left, LEFT))
73 					return(-1);
74 				lflag = 0;
75 				break;
76 
77 			 case RIGHT:
78 				if (!move(right, RIGHT))
79 					return(-1);
80 				lflag = 0;
81 				break;
82 
83 			 case AHEAD:
84 				if (!move(ahead, AHEAD))
85 					return(-1);
86 				lflag = 0;
87 				break;
88 
89 			 case BACK:
90 				if (!move(back, BACK))
91 					return(-1);
92 				lflag = 0;
93 				break;
94 
95 			 case SHOOT:
96 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
97 					for (n=0; n < NUMOFOBJECTS; n++)
98 						if (testbit(location[position].objects,n) && *objsht[n]){
99 							wordvalue[wordnumber+1] = n;
100 							wordnumber = shoot();
101 						}
102 				wordnumber++;
103 				wordnumber++;
104 				}
105 				else
106 					shoot();
107 				break;
108 
109 			 case TAKE:
110 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
111 					for (n=0; n < NUMOFOBJECTS; n++)
112 						if (testbit(location[position].objects,n) && *objsht[n]){
113 							wordvalue[wordnumber+1] = n;
114 							wordnumber = take(location[position].objects);
115 						}
116 				wordnumber++;
117 				wordnumber++;
118 				}
119 				else
120 					take(location[position].objects);
121 				break;
122 
123 			 case DROP:
124 
125 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
126 					for (n=0; n < NUMOFOBJECTS; n++)
127 						if (testbit(inven,n)){
128 							wordvalue[wordnumber+1] = n;
129 							wordnumber = drop("Dropped");
130 						}
131 				wordnumber++;
132 				wordnumber++;
133 				}
134 				else
135 					drop("Dropped");
136 				break;
137 
138 
139 			 case KICK:
140 			 case THROW:
141 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
142 					for (n=0; n < NUMOFOBJECTS; n++)
143 						if (testbit(inven,n) ||
144 						  testbit(location[position].objects, n) && *objsht[n]){
145 							wordvalue[wordnumber+1] = n;
146 							wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
147 						}
148 					wordnumber += 2;
149 				} else
150 					throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
151 				break;
152 
153 			 case TAKEOFF:
154 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
155 					for (n=0; n < NUMOFOBJECTS; n++)
156 						if (testbit(wear,n)){
157 							wordvalue[wordnumber+1] = n;
158 							wordnumber = takeoff();
159 						}
160 					wordnumber += 2;
161 				}
162 				else
163 					takeoff();
164 				break;
165 
166 
167 			 case DRAW:
168 
169 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
170 					for (n=0; n < NUMOFOBJECTS; n++)
171 						if (testbit(wear,n)){
172 							wordvalue[wordnumber+1] = n;
173 							wordnumber = draw();
174 						}
175 					wordnumber += 2;
176 				}
177 				else
178 					draw();
179 				break;
180 
181 
182 			 case PUTON:
183 
184 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
185 					for (n=0; n < NUMOFOBJECTS; n++)
186 						if (testbit(location[position].objects,n) && *objsht[n]){
187 							wordvalue[wordnumber+1] = n;
188 							wordnumber = puton();
189 						}
190 					wordnumber += 2;
191 				}
192 				else
193 					puton();
194 				break;
195 
196 			 case WEARIT:
197 
198 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
199 					for (n=0; n < NUMOFOBJECTS; n++)
200 						if (testbit(inven,n)){
201 							wordvalue[wordnumber+1] = n;
202 							wordnumber = wearit();
203 						}
204 					wordnumber += 2;
205 				}
206 				else
207 					wearit();
208 				break;
209 
210 
211 			 case EAT:
212 
213 				if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){
214 					for (n=0; n < NUMOFOBJECTS; n++)
215 						if (testbit(inven,n)){
216 							wordvalue[wordnumber+1] = n;
217 							wordnumber = eat();
218 						}
219 					wordnumber += 2;
220 				}
221 				else
222 					eat();
223 				break;
224 
225 
226 			case PUT:
227 				put();
228 				break;
229 
230 
231 			case INVEN:
232 				if (ucard(inven)){
233 					puts("You are holding:\n");
234 					for (n=0; n < NUMOFOBJECTS; n++)
235 						if (testbit(inven,n))
236 							printf("\t%s\n", objsht[n]);
237 					printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."),(WEIGHT ? carrying*100/WEIGHT : -1));
238 					printf("Your arms are %d%% full.\n",encumber*100/CUMBER);
239 				}
240 				else
241 					puts("You aren't carrying anything.");
242 
243 				if (ucard(wear)){
244 					puts("\nYou are wearing:\n");
245 					for (n=0; n < NUMOFOBJECTS; n++)
246 						if (testbit(wear,n))
247 							printf("\t%s\n", objsht[n]);
248 				}
249 				else
250 					puts("\nYou are stark naked.");
251 				if (card(injuries,NUMOFINJURIES)){
252 					puts("\nYou have suffered:\n");
253 					for (n=0; n < NUMOFINJURIES; n++)
254 						if (injuries[n])
255 							printf("\t%s\n",ouch[n]);
256 					printf("\nYou can still carry up to %d kilogram%s\n",WEIGHT,(WEIGHT == 1 ? "." : "s."));
257 				}
258 				else
259 					puts("\nYou are in perfect health.");
260 				break;
261 
262 			case USE:
263 				lflag = use();
264 				break;
265 
266 			case LOOK:
267 				if (!notes[CANTSEE] || testbit(inven,LAMPON) || testbit(location[position].objects,LAMPON) || matchlight){
268 					beenthere[position] = 2;
269 					writedes();
270 					printobjs();
271 					if (matchlight){
272 						puts("\nYour match splutters out.");
273 						matchlight = 0;
274 					}
275 				} else
276 					puts("I can't see anything.");
277 				return(-1);
278 				break;
279 
280 			 case SU:
281 			 if (wiz || tempwiz){
282 				printf("\nRoom (was %d) = ", position);
283 				fgets(buffer,10,stdin);
284 				if (*buffer != '\n')
285 					sscanf(buffer,"%d", &position);
286 				printf("Time (was %d) = ",time);
287 				fgets(buffer,10,stdin);
288 				if (*buffer != '\n')
289 					sscanf(buffer,"%d", &time);
290 				printf("Fuel (was %d) = ",fuel);
291 				fgets(buffer,10,stdin);
292 				if (*buffer != '\n')
293 					sscanf(buffer,"%d", &fuel);
294 				printf("Torps (was %d) = ",torps);
295 				fgets(buffer,10,stdin);
296 				if (*buffer != '\n')
297 					sscanf(buffer,"%d", &torps);
298 				printf("CUMBER (was %d) = ",CUMBER);
299 				fgets(buffer,10,stdin);
300 				if (*buffer != '\n')
301 					sscanf(buffer,"%d", &CUMBER);
302 				printf("WEIGHT (was %d) = ",WEIGHT);
303 				fgets(buffer,10,stdin);
304 				if (*buffer != '\n')
305 					sscanf(buffer,"%d",&WEIGHT);
306 				printf("Clock (was %d) = ",clock);
307 				fgets(buffer,10,stdin);
308 				if (*buffer != '\n')
309 					sscanf(buffer,"%d",&clock);
310 				printf("Wizard (was %d, %d) = ",wiz, tempwiz);
311 				fgets(buffer,10,stdin);
312 				if (*buffer != '\n'){
313 					sscanf(buffer,"%d",&junk);
314 					if (!junk)
315 						tempwiz = wiz = 0;
316 				}
317 				printf("\nDONE.\n");
318 				return(0);
319 			 }
320 			 else
321 				 puts("You aren't a wizard.");
322 			 break;
323 
324 			 case SCORE:
325 				printf("\tPLEASURE\tPOWER\t\tEGO\n");
326 				printf("\t%3d\t\t%3d\t\t%3d\n\n",pleasure,power,ego);
327 				printf("This gives you the rating of %s in %d turns.\n",rate(),time);
328 				printf("You have visited %d out of %d rooms this run (%d%%).\n",card(beenthere,NUMOFROOMS),NUMOFROOMS,card(beenthere,NUMOFROOMS)*100/NUMOFROOMS);
329 				break;
330 
331 			 case KNIFE:
332 			 case KILL:
333 				murder();
334 				break;
335 
336 			 case UNDRESS:
337 			 case RAVAGE:
338 				ravage();
339 				break;
340 
341 			 case SAVE:
342 				save();
343 				break;
344 
345 			 case FOLLOW:
346 				lflag = follow();
347 				break;
348 
349 			 case GIVE:
350 				give();
351 				break;
352 
353 			 case KISS:
354 				kiss();
355 				break;
356 
357 			 case LOVE:
358 				 love();
359 				 break;
360 
361 			 case RIDE:
362 				lflag = ride();
363 				break;
364 
365 			 case DRIVE:
366 				lflag = drive();
367 				break;
368 
369 			 case LIGHT:
370 				 light();
371 				 break;
372 
373 			 case LAUNCH:
374 				if (!launch())
375 					return(-1);
376 				else
377 					lflag = 0;
378 				break;
379 
380 			case LANDIT:
381 				if (!land())
382 					return(-1);
383 				else
384 					lflag = 0;
385 				break;
386 
387 			case TIME:
388 				chime();
389 				break;
390 
391 			 case SLEEP:
392 				zzz();
393 				break;
394 
395 			 case DIG:
396 				dig();
397 				break;
398 
399 			 case JUMP:
400 				lflag = jump();
401 				break;
402 
403 			 case BURY:
404 				bury();
405 				break;
406 
407 			 case SWIM:
408 				puts("Surf's up!");
409 				break;
410 
411 			 case DRINK:
412 				drink();
413 				break;
414 
415 			 case QUIT:
416 				die();
417 
418 			 default:
419 				puts("How's that?");
420 				return(-1);
421 				break;
422 
423 
424 		}
425 		if (wordnumber < wordcount && *words[wordnumber++] == ',')
426 			continue;
427 		else return(lflag);
428        }
429        return(lflag);
430 }
431