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