Home | History | Annotate | Line # | Download | only in battlestar
command3.c revision 1.1
      1 /*	$NetBSD: command3.c,v 1.1 2001/10/19 03:06:11 tv 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[] = "@(#)com3.c	8.2 (Berkeley) 4/28/95";
     40 #else
     41 __RCSID("$NetBSD: command3.c,v 1.1 2001/10/19 03:06:11 tv Exp $");
     42 #endif
     43 #endif				/* not lint */
     44 
     45 #include "extern.h"
     46 
     47 void
     48 dig()
     49 {
     50 	if (testbit(inven, SHOVEL)) {
     51 		puts("OK");
     52 		ourtime++;
     53 		switch (position) {
     54 		case 144:	/* copse near beach */
     55 			if (!notes[DUG]) {
     56 				setbit(location[position].objects, DEADWOOD);
     57 				setbit(location[position].objects, COMPASS);
     58 				setbit(location[position].objects, KNIFE);
     59 				setbit(location[position].objects, MACE);
     60 				notes[DUG] = 1;
     61 			}
     62 			break;
     63 
     64 		default:
     65 			puts("Nothing happens.");
     66 		}
     67 	} else
     68 		puts("You don't have a shovel.");
     69 }
     70 
     71 int
     72 jump()
     73 {
     74 	int     n;
     75 
     76 	switch (position) {
     77 	default:
     78 		puts("Nothing happens.");
     79 		return (-1);
     80 
     81 	case 242:
     82 		position = 133;
     83 		break;
     84 	case 214:
     85 	case 215:
     86 	case 162:
     87 	case 159:
     88 		position = 145;
     89 		break;
     90 	case 232:
     91 		position = FINAL;
     92 		break;
     93 	case 3:
     94 		position = 1;
     95 		break;
     96 	case 172:
     97 		position = 201;
     98 	}
     99 	puts("Ahhhhhhh...");
    100 	injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
    101 	for (n = 0; n < NUMOFOBJECTS; n++)
    102 		if (testbit(inven, n)) {
    103 			clearbit(inven, n);
    104 			setbit(location[position].objects, n);
    105 		}
    106 	carrying = 0;
    107 	encumber = 0;
    108 	return (0);
    109 }
    110 
    111 void
    112 bury()
    113 {
    114 	int     value;
    115 
    116 	if (testbit(inven, SHOVEL)) {
    117 		while (wordtype[++wordnumber] != OBJECT && wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
    118 			continue;
    119 		value = wordvalue[wordnumber];
    120 		if (wordtype[wordnumber] == NOUNS && (testbit(location[position].objects, value) || value == BODY))
    121 			switch (value) {
    122 			case BODY:
    123 				wordtype[wordnumber] = OBJECT;
    124 				if (testbit(inven, MAID) || testbit(location[position].objects, MAID))
    125 					value = MAID;
    126 				if (testbit(inven, DEADWOOD) || testbit(location[position].objects, DEADWOOD))
    127 					value = DEADWOOD;
    128 				if (testbit(inven, DEADGOD) || testbit(location[position].objects, DEADGOD))
    129 					value = DEADGOD;
    130 				if (testbit(inven, DEADTIME) || testbit(location[position].objects, DEADTIME))
    131 					value = DEADTIME;
    132 				if (testbit(inven, DEADNATIVE) || testbit(location[position].objects, DEADNATIVE))
    133 					value = DEADNATIVE;
    134 				break;
    135 
    136 			case NATIVE:
    137 			case NORMGOD:
    138 				puts("She screams as you wrestle her into the hole.");
    139 			case TIMER:
    140 				power += 7;
    141 				ego -= 10;
    142 			case AMULET:
    143 			case MEDALION:
    144 			case TALISMAN:
    145 				wordtype[wordnumber] = OBJECT;
    146 				break;
    147 
    148 			default:
    149 				puts("Wha..?");
    150 			}
    151 		if (wordtype[wordnumber] == OBJECT && position > 88 && (testbit(inven, value) || testbit(location[position].objects, value))) {
    152 			puts("Buried.");
    153 			if (testbit(inven, value)) {
    154 				clearbit(inven, value);
    155 				carrying -= objwt[value];
    156 				encumber -= objcumber[value];
    157 			}
    158 			clearbit(location[position].objects, value);
    159 			switch (value) {
    160 			case MAID:
    161 			case DEADWOOD:
    162 			case DEADNATIVE:
    163 			case DEADTIME:
    164 			case DEADGOD:
    165 				ego += 2;
    166 				printf("The %s should rest easier now.\n", objsht[value]);
    167 			}
    168 		} else
    169 			puts("It doesn't seem to work.");
    170 	} else
    171 		puts("You aren't holding a shovel.");
    172 }
    173 
    174 void
    175 drink()
    176 {
    177 	int     n;
    178 
    179 	if (testbit(inven, POTION)) {
    180 		puts("The cool liquid runs down your throat but turns to fire and you choke.");
    181 		puts("The heat reaches your limbs and tingles your spirit.  You feel like falling");
    182 		puts("asleep.");
    183 		clearbit(inven, POTION);
    184 		WEIGHT = MAXWEIGHT;
    185 		CUMBER = MAXCUMBER;
    186 		for (n = 0; n < NUMOFINJURIES; n++)
    187 			injuries[n] = 0;
    188 		ourtime++;
    189 		zzz();
    190 	} else
    191 		puts("I'm not thirsty.");
    192 }
    193 
    194 int
    195 shoot()
    196 {
    197 	int     firstnumber, value;
    198 
    199 	firstnumber = wordnumber;
    200 	if (!testbit(inven, LASER))
    201 		puts("You aren't holding a blaster.");
    202 	else {
    203 		wordnumber++;
    204 		while (wordnumber <= wordcount && wordtype[wordnumber] == OBJECT) {
    205 			value = wordvalue[wordnumber];
    206 			printf("%s:\n", objsht[value]);
    207 			if (testbit(location[position].objects, value)) {
    208 				clearbit(location[position].objects, value);
    209 				ourtime++;
    210 				printf("The %s explode%s\n", objsht[value],
    211 				    (is_plural_object(value) ? "." : "s."));
    212 				if (value == BOMB)
    213 					die();
    214 			} else
    215 				printf("I don't see any %s around here.\n", objsht[value]);
    216 			if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
    217 				wordnumber++;
    218 			else
    219 				return (firstnumber);
    220 		}
    221 		/* special cases with their own return()'s */
    222 
    223 		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
    224 			ourtime++;
    225 			switch (wordvalue[wordnumber]) {
    226 
    227 			case DOOR:
    228 				switch (position) {
    229 				case 189:
    230 				case 231:
    231 					puts("The door is unhinged.");
    232 					location[189].north = 231;
    233 					location[231].south = 189;
    234 					whichway(location[position]);
    235 					break;
    236 				case 30:
    237 					puts("The wooden door splinters.");
    238 					location[30].west = 25;
    239 					whichway(location[position]);
    240 					break;
    241 				case 31:
    242 					puts("The laser blast has no effect on the door.");
    243 					break;
    244 				case 20:
    245 					puts("The blast hits the door and it explodes into flame.  The magnesium burns");
    246 					puts("so rapidly that we have no chance to escape.");
    247 					die();
    248 				default:
    249 					puts("Nothing happens.");
    250 				}
    251 				break;
    252 
    253 			case NORMGOD:
    254 				if (testbit(location[position].objects, BATHGOD)) {
    255 					puts("The goddess is hit in the chest and splashes back against the rocks.");
    256 					puts("Dark blood oozes from the charred blast hole.  Her naked body floats in the");
    257 					puts("pools and then off downstream.");
    258 					clearbit(location[position].objects, BATHGOD);
    259 					setbit(location[180].objects, DEADGOD);
    260 					power += 5;
    261 					ego -= 10;
    262 					notes[JINXED]++;
    263 				} else
    264 					if (testbit(location[position].objects, NORMGOD)) {
    265 						puts("The blast catches the goddess in the stomach, knocking her to the ground.");
    266 						puts("She writhes in the dirt as the agony of death taunts her.");
    267 						puts("She has stopped moving.");
    268 						clearbit(location[position].objects, NORMGOD);
    269 						setbit(location[position].objects, DEADGOD);
    270 						power += 5;
    271 						ego -= 10;
    272 						notes[JINXED]++;
    273 						if (wintime)
    274 							live();
    275 						break;
    276 					} else
    277 						puts("I don't see any goddess around here.");
    278 				break;
    279 
    280 			case TIMER:
    281 				if (testbit(location[position].objects, TIMER)) {
    282 					puts("The old man slumps over the bar.");
    283 					power++;
    284 					ego -= 2;
    285 					notes[JINXED]++;
    286 					clearbit(location[position].objects, TIMER);
    287 					setbit(location[position].objects, DEADTIME);
    288 				} else
    289 					puts("What old-timer?");
    290 				break;
    291 			case MAN:
    292 				if (testbit(location[position].objects, MAN)) {
    293 					puts("The man falls to the ground with blood pouring all over his white suit.");
    294 					puts("Your fantasy is over.");
    295 					die();
    296 				} else
    297 					puts("What man?");
    298 				break;
    299 			case NATIVE:
    300 				if (testbit(location[position].objects, NATIVE)) {
    301 					puts("The girl is blown backwards several feet and lies in a pool of blood.");
    302 					clearbit(location[position].objects, NATIVE);
    303 					setbit(location[position].objects, DEADNATIVE);
    304 					power += 5;
    305 					ego -= 2;
    306 					notes[JINXED]++;
    307 				} else
    308 					puts("There is no girl here.");
    309 				break;
    310 			case -1:
    311 				puts("Shoot what?");
    312 				break;
    313 
    314 			default:
    315 				printf("You can't shoot the %s.\n", objsht[wordvalue[wordnumber]]);
    316 			}
    317 		} else
    318 			puts("You must be a looney.");
    319 	}
    320 	return (firstnumber);
    321 }
    322