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