Home | History | Annotate | Line # | Download | only in battlestar
cypher.c revision 1.8
      1 /*	$NetBSD: cypher.c,v 1.8 1999/03/25 16:46:08 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.8 1999/03/25 16:46:08 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 						/* Some objects (type NOUNS)
    122 						 * have special treatment in
    123 						 * take().  For these we
    124 						 * must set the type to NOUNS.
    125 						 * However for SWORD and BODY
    126 						 * all it does is find which
    127 						 * of many objects is meant,
    128 						 * so we need do nothing here.
    129 						 * BATHGOD must become
    130 						 * NORMGOD as well.  NOUNS
    131 						 * with no special case
    132 						 * must be included here to
    133 						 * get the right error.  DOOR
    134 						 * cannot occur as an object
    135 						 * so need not be included.  */
    136 						switch(n) {
    137 						case BATHGOD:
    138 							wordvalue[wordnumber + 1] = NORMGOD;
    139 						case NORMGOD:
    140 						case AMULET:
    141 						case MEDALION:
    142 						case TALISMAN:
    143 						case MAN:
    144 						case TIMER:
    145 						case NATIVE:
    146 							wordtype[wordnumber + 1] = NOUNS;
    147 							break;
    148 						default:
    149 							wordtype[wordnumber + 1] = OBJECT;
    150 						}
    151 						wordnumber = take(location[position].objects);
    152 					}
    153 				wordnumber++;
    154 				wordnumber++;
    155 			} else
    156 				take(location[position].objects);
    157 			break;
    158 
    159 		case DROP:
    160 
    161 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    162 				for (n = 0; n < NUMOFOBJECTS; n++)
    163 					if (testbit(inven, n)) {
    164 						wordvalue[wordnumber + 1] = n;
    165 						wordnumber = drop("Dropped");
    166 					}
    167 				wordnumber++;
    168 				wordnumber++;
    169 			} else
    170 				drop("Dropped");
    171 			break;
    172 
    173 
    174 		case KICK:
    175 		case THROW:
    176 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    177 				for (n = 0; n < NUMOFOBJECTS; n++)
    178 					if (testbit(inven, n) ||
    179 					    (testbit(location[position].objects, n) && objsht[n])) {
    180 						wordvalue[wordnumber + 1] = n;
    181 						wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
    182 					}
    183 				wordnumber += 2;
    184 			} else
    185 				throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
    186 			break;
    187 
    188 		case TAKEOFF:
    189 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    190 				for (n = 0; n < NUMOFOBJECTS; n++)
    191 					if (testbit(wear, n)) {
    192 						wordvalue[wordnumber + 1] = n;
    193 						wordnumber = takeoff();
    194 					}
    195 				wordnumber += 2;
    196 			} else
    197 				takeoff();
    198 			break;
    199 
    200 
    201 		case DRAW:
    202 
    203 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    204 				for (n = 0; n < NUMOFOBJECTS; n++)
    205 					if (testbit(wear, n)) {
    206 						wordvalue[wordnumber + 1] = n;
    207 						wordnumber = draw();
    208 					}
    209 				wordnumber += 2;
    210 			} else
    211 				draw();
    212 			break;
    213 
    214 
    215 		case PUTON:
    216 
    217 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    218 				for (n = 0; n < NUMOFOBJECTS; n++)
    219 					if (testbit(location[position].objects, n) && objsht[n]) {
    220 						wordvalue[wordnumber + 1] = n;
    221 						wordnumber = puton();
    222 					}
    223 				wordnumber += 2;
    224 			} else
    225 				puton();
    226 			break;
    227 
    228 		case WEARIT:
    229 
    230 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    231 				for (n = 0; n < NUMOFOBJECTS; n++)
    232 					if (testbit(inven, n)) {
    233 						wordvalue[wordnumber + 1] = n;
    234 						wordnumber = wearit();
    235 					}
    236 				wordnumber += 2;
    237 			} else
    238 				wearit();
    239 			break;
    240 
    241 
    242 		case EAT:
    243 
    244 			if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
    245 				for (n = 0; n < NUMOFOBJECTS; n++)
    246 					if (testbit(inven, n)) {
    247 						wordvalue[wordnumber + 1] = n;
    248 						wordnumber = eat();
    249 					}
    250 				wordnumber += 2;
    251 			} else
    252 				eat();
    253 			break;
    254 
    255 
    256 		case PUT:
    257 			put();
    258 			break;
    259 
    260 
    261 		case INVEN:
    262 			if (ucard(inven)) {
    263 				puts("You are holding:\n");
    264 				for (n = 0; n < NUMOFOBJECTS; n++)
    265 					if (testbit(inven, n))
    266 						printf("\t%s\n", objsht[n]);
    267 				printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."), (WEIGHT ? carrying * 100 / WEIGHT : -1));
    268 				printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER);
    269 			} else
    270 				puts("You aren't carrying anything.");
    271 
    272 			if (ucard(wear)) {
    273 				puts("\nYou are wearing:\n");
    274 				for (n = 0; n < NUMOFOBJECTS; n++)
    275 					if (testbit(wear, n))
    276 						printf("\t%s\n", objsht[n]);
    277 			} else
    278 				puts("\nYou are stark naked.");
    279 			if (card(injuries, NUMOFINJURIES)) {
    280 				puts("\nYou have suffered:\n");
    281 				for (n = 0; n < NUMOFINJURIES; n++)
    282 					if (injuries[n])
    283 						printf("\t%s\n", ouch[n]);
    284 				printf("\nYou can still carry up to %d kilogram%s\n", WEIGHT, (WEIGHT == 1 ? "." : "s."));
    285 			} else
    286 				puts("\nYou are in perfect health.");
    287 			break;
    288 
    289 		case USE:
    290 			lflag = use();
    291 			break;
    292 
    293 		case LOOK:
    294 			if (!notes[CANTSEE] || testbit(inven, LAMPON) ||
    295 			    testbit(location[position].objects, LAMPON)
    296 			    || matchlight) {
    297 				beenthere[position] = 2;
    298 				writedes();
    299 				printobjs();
    300 				if (matchlight) {
    301 					puts("\nYour match splutters out.");
    302 					matchlight = 0;
    303 				}
    304 			} else
    305 				puts("I can't see anything.");
    306 			return (-1);
    307 			break;
    308 
    309 		case SU:
    310 			if (wiz || tempwiz) {
    311 				printf("\nRoom (was %d) = ", position);
    312 				fgets(buffer, 10, stdin);
    313 				if (*buffer != '\n')
    314 					sscanf(buffer, "%d", &position);
    315 				printf("Time (was %d) = ", ourtime);
    316 				fgets(buffer, 10, stdin);
    317 				if (*buffer != '\n')
    318 					sscanf(buffer, "%d", &ourtime);
    319 				printf("Fuel (was %d) = ", fuel);
    320 				fgets(buffer, 10, stdin);
    321 				if (*buffer != '\n')
    322 					sscanf(buffer, "%d", &fuel);
    323 				printf("Torps (was %d) = ", torps);
    324 				fgets(buffer, 10, stdin);
    325 				if (*buffer != '\n')
    326 					sscanf(buffer, "%d", &torps);
    327 				printf("CUMBER (was %d) = ", CUMBER);
    328 				fgets(buffer, 10, stdin);
    329 				if (*buffer != '\n')
    330 					sscanf(buffer, "%d", &CUMBER);
    331 				printf("WEIGHT (was %d) = ", WEIGHT);
    332 				fgets(buffer, 10, stdin);
    333 				if (*buffer != '\n')
    334 					sscanf(buffer, "%d", &WEIGHT);
    335 				printf("Clock (was %d) = ", ourclock);
    336 				fgets(buffer, 10, stdin);
    337 				if (*buffer != '\n')
    338 					sscanf(buffer, "%d", &ourclock);
    339 				printf("Wizard (was %d, %d) = ", wiz, tempwiz);
    340 				fgets(buffer, 10, stdin);
    341 				if (*buffer != '\n') {
    342 					sscanf(buffer, "%d", &junk);
    343 					if (!junk)
    344 						tempwiz = wiz = 0;
    345 				}
    346 				printf("\nDONE.\n");
    347 				return (0);
    348 			} else
    349 				puts("You aren't a wizard.");
    350 			break;
    351 
    352 		case SCORE:
    353 			printf("\tPLEASURE\tPOWER\t\tEGO\n");
    354 			printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego);
    355 			printf("This gives you the rating of %s in %d turns.\n", rate(), ourtime);
    356 			printf("You have visited %d out of %d rooms this run (%d%%).\n", card(beenthere, NUMOFROOMS), NUMOFROOMS, card(beenthere, NUMOFROOMS) * 100 / NUMOFROOMS);
    357 			break;
    358 
    359 		case KNIFE:
    360 		case KILL:
    361 			murder();
    362 			break;
    363 
    364 		case UNDRESS:
    365 		case RAVAGE:
    366 			ravage();
    367 			break;
    368 
    369 		case SAVE:
    370 			save();
    371 			break;
    372 
    373 		case FOLLOW:
    374 			lflag = follow();
    375 			break;
    376 
    377 		case GIVE:
    378 			give();
    379 			break;
    380 
    381 		case KISS:
    382 			kiss();
    383 			break;
    384 
    385 		case LOVE:
    386 			love();
    387 			break;
    388 
    389 		case RIDE:
    390 			lflag = ride();
    391 			break;
    392 
    393 		case DRIVE:
    394 			lflag = drive();
    395 			break;
    396 
    397 		case LIGHT:
    398 			light();
    399 			break;
    400 
    401 		case LAUNCH:
    402 			if (!launch())
    403 				return (-1);
    404 			else
    405 				lflag = 0;
    406 			break;
    407 
    408 		case LANDIT:
    409 			if (!land())
    410 				return (-1);
    411 			else
    412 				lflag = 0;
    413 			break;
    414 
    415 		case TIME:
    416 			chime();
    417 			break;
    418 
    419 		case SLEEP:
    420 			zzz();
    421 			break;
    422 
    423 		case DIG:
    424 			dig();
    425 			break;
    426 
    427 		case JUMP:
    428 			lflag = jump();
    429 			break;
    430 
    431 		case BURY:
    432 			bury();
    433 			break;
    434 
    435 		case SWIM:
    436 			puts("Surf's up!");
    437 			break;
    438 
    439 		case DRINK:
    440 			drink();
    441 			break;
    442 
    443 		case QUIT:
    444 			die();
    445 
    446 		default:
    447 			puts("How's that?");
    448 			return (-1);
    449 			break;
    450 
    451 
    452 		}
    453 		if (wordnumber < wordcount && *words[wordnumber++] == ',')
    454 			continue;
    455 		else
    456 			return (lflag);
    457 	}
    458 	return (lflag);
    459 }
    460