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