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