Home | History | Annotate | Line # | Download | only in battlestar
cypher.c revision 1.7
      1 /*	$NetBSD: cypher.c,v 1.7 1998/08/24 00:25:32 hubertf Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1983, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. All advertising materials mentioning features or use of this software
     16  *    must display the following acknowledgement:
     17  *	This product includes software developed by the University of
     18  *	California, Berkeley and its contributors.
     19  * 4. Neither the name of the University nor the names of its contributors
     20  *    may be used to endorse or promote products derived from this software
     21  *    without specific prior written permission.
     22  *
     23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33  * SUCH DAMAGE.
     34  */
     35 
     36 #include <sys/cdefs.h>
     37 #ifndef lint
     38 #if 0
     39 static char sccsid[] = "@(#)cypher.c	8.2 (Berkeley) 4/28/95";
     40 #else
     41 __RCSID("$NetBSD: cypher.c,v 1.7 1998/08/24 00:25:32 hubertf Exp $");
     42 #endif
     43 #endif				/* not lint */
     44 
     45 #include "extern.h"
     46 
     47 int
     48 cypher()
     49 {
     50 	int     n;
     51 	int     junk;
     52 	int     lflag = -1;
     53 	char    buffer[10];
     54 
     55 	while (wordtype[wordnumber] == ADJS)
     56 		wordnumber++;
     57 	while (wordnumber <= wordcount) {
     58 		switch (wordvalue[wordnumber]) {
     59 
     60 		case UP:
     61 			if (location[position].access || wiz || tempwiz) {
     62 				if (!location[position].access)
     63 					puts("Zap!  A gust of wind lifts you up.");
     64 				if (!move(location[position].up, AHEAD))
     65 					return (-1);
     66 			} else {
     67 				puts("There is no way up");
     68 				return (-1);
     69 			}
     70 			lflag = 0;
     71 			break;
     72 
     73 		case DOWN:
     74 			if (!move(location[position].down, AHEAD))
     75 				return (-1);
     76 			lflag = 0;
     77 			break;
     78 
     79 		case LEFT:
     80 			if (!move(left, LEFT))
     81 				return (-1);
     82 			lflag = 0;
     83 			break;
     84 
     85 		case RIGHT:
     86 			if (!move(right, RIGHT))
     87 				return (-1);
     88 			lflag = 0;
     89 			break;
     90 
     91 		case AHEAD:
     92 			if (!move(ahead, AHEAD))
     93 				return (-1);
     94 			lflag = 0;
     95 			break;
     96 
     97 		case BACK:
     98 			if (!move(back, BACK))
     99 				return (-1);
    100 			lflag = 0;
    101 			break;
    102 
    103 		case SHOOT:
    104 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    105 				for (n = 0; n < NUMOFOBJECTS; n++)
    106 					if (testbit(location[position].objects, n) && objsht[n]) {
    107 						wordvalue[wordnumber + 1] = n;
    108 						wordnumber = shoot();
    109 					}
    110 				wordnumber++;
    111 				wordnumber++;
    112 			} else
    113 				shoot();
    114 			break;
    115 
    116 		case TAKE:
    117 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    118 				for (n = 0; n < NUMOFOBJECTS; n++)
    119 					if (testbit(location[position].objects, n) && objsht[n]) {
    120 						wordvalue[wordnumber + 1] = n;
    121 						wordnumber = take(location[position].objects);
    122 					}
    123 				wordnumber++;
    124 				wordnumber++;
    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 			} else
    140 				drop("Dropped");
    141 			break;
    142 
    143 
    144 		case KICK:
    145 		case THROW:
    146 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    147 				for (n = 0; n < NUMOFOBJECTS; n++)
    148 					if (testbit(inven, n) ||
    149 					    (testbit(location[position].objects, n) && objsht[n])) {
    150 						wordvalue[wordnumber + 1] = n;
    151 						wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
    152 					}
    153 				wordnumber += 2;
    154 			} else
    155 				throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
    156 			break;
    157 
    158 		case TAKEOFF:
    159 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    160 				for (n = 0; n < NUMOFOBJECTS; n++)
    161 					if (testbit(wear, n)) {
    162 						wordvalue[wordnumber + 1] = n;
    163 						wordnumber = takeoff();
    164 					}
    165 				wordnumber += 2;
    166 			} else
    167 				takeoff();
    168 			break;
    169 
    170 
    171 		case DRAW:
    172 
    173 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    174 				for (n = 0; n < NUMOFOBJECTS; n++)
    175 					if (testbit(wear, n)) {
    176 						wordvalue[wordnumber + 1] = n;
    177 						wordnumber = draw();
    178 					}
    179 				wordnumber += 2;
    180 			} else
    181 				draw();
    182 			break;
    183 
    184 
    185 		case PUTON:
    186 
    187 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    188 				for (n = 0; n < NUMOFOBJECTS; n++)
    189 					if (testbit(location[position].objects, n) && objsht[n]) {
    190 						wordvalue[wordnumber + 1] = n;
    191 						wordnumber = puton();
    192 					}
    193 				wordnumber += 2;
    194 			} else
    195 				puton();
    196 			break;
    197 
    198 		case WEARIT:
    199 
    200 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    201 				for (n = 0; n < NUMOFOBJECTS; n++)
    202 					if (testbit(inven, n)) {
    203 						wordvalue[wordnumber + 1] = n;
    204 						wordnumber = wearit();
    205 					}
    206 				wordnumber += 2;
    207 			} else
    208 				wearit();
    209 			break;
    210 
    211 
    212 		case EAT:
    213 
    214 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    215 				for (n = 0; n < NUMOFOBJECTS; n++)
    216 					if (testbit(inven, n)) {
    217 						wordvalue[wordnumber + 1] = n;
    218 						wordnumber = eat();
    219 					}
    220 				wordnumber += 2;
    221 			} else
    222 				eat();
    223 			break;
    224 
    225 
    226 		case PUT:
    227 			put();
    228 			break;
    229 
    230 
    231 		case INVEN:
    232 			if (ucard(inven)) {
    233 				puts("You are holding:\n");
    234 				for (n = 0; n < NUMOFOBJECTS; n++)
    235 					if (testbit(inven, n))
    236 						printf("\t%s\n", objsht[n]);
    237 				printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."), (WEIGHT ? carrying * 100 / WEIGHT : -1));
    238 				printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER);
    239 			} else
    240 				puts("You aren't carrying anything.");
    241 
    242 			if (ucard(wear)) {
    243 				puts("\nYou are wearing:\n");
    244 				for (n = 0; n < NUMOFOBJECTS; n++)
    245 					if (testbit(wear, n))
    246 						printf("\t%s\n", objsht[n]);
    247 			} else
    248 				puts("\nYou are stark naked.");
    249 			if (card(injuries, NUMOFINJURIES)) {
    250 				puts("\nYou have suffered:\n");
    251 				for (n = 0; n < NUMOFINJURIES; n++)
    252 					if (injuries[n])
    253 						printf("\t%s\n", ouch[n]);
    254 				printf("\nYou can still carry up to %d kilogram%s\n", WEIGHT, (WEIGHT == 1 ? "." : "s."));
    255 			} else
    256 				puts("\nYou are in perfect health.");
    257 			break;
    258 
    259 		case USE:
    260 			lflag = use();
    261 			break;
    262 
    263 		case LOOK:
    264 			if (!notes[CANTSEE] || testbit(inven, LAMPON) ||
    265 			    testbit(location[position].objects, LAMPON)
    266 			    || matchlight) {
    267 				beenthere[position] = 2;
    268 				writedes();
    269 				printobjs();
    270 				if (matchlight) {
    271 					puts("\nYour match splutters out.");
    272 					matchlight = 0;
    273 				}
    274 			} else
    275 				puts("I can't see anything.");
    276 			return (-1);
    277 			break;
    278 
    279 		case SU:
    280 			if (wiz || tempwiz) {
    281 				printf("\nRoom (was %d) = ", position);
    282 				fgets(buffer, 10, stdin);
    283 				if (*buffer != '\n')
    284 					sscanf(buffer, "%d", &position);
    285 				printf("Time (was %d) = ", ourtime);
    286 				fgets(buffer, 10, stdin);
    287 				if (*buffer != '\n')
    288 					sscanf(buffer, "%d", &ourtime);
    289 				printf("Fuel (was %d) = ", fuel);
    290 				fgets(buffer, 10, stdin);
    291 				if (*buffer != '\n')
    292 					sscanf(buffer, "%d", &fuel);
    293 				printf("Torps (was %d) = ", torps);
    294 				fgets(buffer, 10, stdin);
    295 				if (*buffer != '\n')
    296 					sscanf(buffer, "%d", &torps);
    297 				printf("CUMBER (was %d) = ", CUMBER);
    298 				fgets(buffer, 10, stdin);
    299 				if (*buffer != '\n')
    300 					sscanf(buffer, "%d", &CUMBER);
    301 				printf("WEIGHT (was %d) = ", WEIGHT);
    302 				fgets(buffer, 10, stdin);
    303 				if (*buffer != '\n')
    304 					sscanf(buffer, "%d", &WEIGHT);
    305 				printf("Clock (was %d) = ", ourclock);
    306 				fgets(buffer, 10, stdin);
    307 				if (*buffer != '\n')
    308 					sscanf(buffer, "%d", &ourclock);
    309 				printf("Wizard (was %d, %d) = ", wiz, tempwiz);
    310 				fgets(buffer, 10, stdin);
    311 				if (*buffer != '\n') {
    312 					sscanf(buffer, "%d", &junk);
    313 					if (!junk)
    314 						tempwiz = wiz = 0;
    315 				}
    316 				printf("\nDONE.\n");
    317 				return (0);
    318 			} else
    319 				puts("You aren't a wizard.");
    320 			break;
    321 
    322 		case SCORE:
    323 			printf("\tPLEASURE\tPOWER\t\tEGO\n");
    324 			printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego);
    325 			printf("This gives you the rating of %s in %d turns.\n", rate(), ourtime);
    326 			printf("You have visited %d out of %d rooms this run (%d%%).\n", card(beenthere, NUMOFROOMS), NUMOFROOMS, 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();
    415 
    416 		default:
    417 			puts("How's that?");
    418 			return (-1);
    419 			break;
    420 
    421 
    422 		}
    423 		if (wordnumber < wordcount && *words[wordnumber++] == ',')
    424 			continue;
    425 		else
    426 			return (lflag);
    427 	}
    428 	return (lflag);
    429 }
    430