Merge branch 'vendor/OPENRESOLV' with the following changes:
[dragonfly.git] / games / battlestar / cypher.c
CommitLineData
6693db17 1/*-
984263bc
MD
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.
6693db17 13 * 3. Neither the name of the University nor the names of its contributors
984263bc
MD
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.
1de703da
MD
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 $
5c7cac79 31 * $DragonFly: src/games/battlestar/cypher.c,v 1.3 2006/08/08 16:47:20 pavalos Exp $
984263bc
MD
32 */
33
984263bc
MD
34#include "externs.h"
35
36int
5c7cac79 37cypher(void)
984263bc
MD
38{
39 int n;
40 int junk;
6693db17 41 int lflag;
984263bc
MD
42 char buffer[10];
43
6693db17 44 lflag = -1;
984263bc
MD
45 while (wordtype[wordnumber] == ADJS)
46 wordnumber++;
47 while (wordnumber <= wordcount) {
6693db17
SW
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 }
984263bc
MD
101 wordnumber++;
102 wordnumber++;
6693db17
SW
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 }
984263bc
MD
117 wordnumber++;
118 wordnumber++;
6693db17
SW
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 }
984263bc
MD
131 wordnumber++;
132 wordnumber++;
6693db17
SW
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 }
984263bc 148 }
6693db17
SW
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();
984263bc 188 }
6693db17
SW
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;
984263bc 275
6693db17
SW
276 case SU:
277 if (wiz || tempwiz) {
984263bc 278 printf("\nRoom (was %d) = ", position);
6693db17 279 fgets(buffer, 10, stdin);
984263bc 280 if (*buffer != '\n')
6693db17
SW
281 sscanf(buffer, "%d", &position);
282 printf("Time (was %d) = ", gtime);
283 fgets(buffer, 10, stdin);
984263bc 284 if (*buffer != '\n')
6693db17
SW
285 sscanf(buffer, "%d", &gtime);
286 printf("Fuel (was %d) = ", fuel);
287 fgets(buffer, 10, stdin);
984263bc 288 if (*buffer != '\n')
6693db17
SW
289 sscanf(buffer, "%d", &fuel);
290 printf("Torps (was %d) = ", torps);
291 fgets(buffer, 10, stdin);
984263bc 292 if (*buffer != '\n')
6693db17
SW
293 sscanf(buffer, "%d", &torps);
294 printf("CUMBER (was %d) = ", CUMBER);
295 fgets(buffer, 10, stdin);
984263bc 296 if (*buffer != '\n')
6693db17
SW
297 sscanf(buffer, "%d", &CUMBER);
298 printf("WEIGHT (was %d) = ", WEIGHT);
299 fgets(buffer, 10, stdin);
984263bc 300 if (*buffer != '\n')
6693db17
SW
301 sscanf(buffer, "%d", &WEIGHT);
302 printf("Clock (was %d) = ", gclock);
303 fgets(buffer, 10, stdin);
984263bc 304 if (*buffer != '\n')
6693db17
SW
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);
984263bc
MD
310 if (!junk)
311 tempwiz = wiz = 0;
312 }
313 printf("\nDONE.\n");
6693db17
SW
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;
984263bc 412
6693db17
SW
413 case QUIT:
414 die(0);
984263bc 415
6693db17
SW
416 default:
417 puts("How's that?");
418 return (-1);
419 break;
984263bc
MD
420 }
421 if (wordnumber < wordcount && *words[wordnumber++] == ',')
422 continue;
6693db17
SW
423 else
424 return (lflag);
425 }
426 return (lflag);
984263bc 427}