Home | History | Annotate | Line # | Download | only in battlestar
      1 /*	$NetBSD: command3.c,v 1.6 2021/05/02 12:50:43 rillig 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. Neither the name of the University nor the names of its contributors
     16  *    may be used to endorse or promote products derived from this software
     17  *    without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29  * SUCH DAMAGE.
     30  */
     31 
     32 #include <sys/cdefs.h>
     33 #ifndef lint
     34 #if 0
     35 static char sccsid[] = "@(#)com3.c	8.2 (Berkeley) 4/28/95";
     36 #else
     37 __RCSID("$NetBSD: command3.c,v 1.6 2021/05/02 12:50:43 rillig Exp $");
     38 #endif
     39 #endif				/* not lint */
     40 
     41 #include "extern.h"
     42 
     43 void
     44 dig(void)
     45 {
     46 	if (testbit(inven, SHOVEL)) {
     47 		puts("OK");
     48 		ourtime++;
     49 		switch (position) {
     50 		case 144:	/* copse near beach */
     51 			if (!notes[DUG]) {
     52 				setbit(location[position].objects, DEADWOOD);
     53 				setbit(location[position].objects, COMPASS);
     54 				setbit(location[position].objects, KNIFE);
     55 				setbit(location[position].objects, MACE);
     56 				notes[DUG] = 1;
     57 			}
     58 			break;
     59 
     60 		default:
     61 			puts("Nothing happens.");
     62 		}
     63 	} else
     64 		puts("You don't have a shovel.");
     65 }
     66 
     67 int
     68 jump(void)
     69 {
     70 	int     n;
     71 
     72 	switch (position) {
     73 	default:
     74 		puts("Nothing happens.");
     75 		return (-1);
     76 
     77 	case 242:
     78 		position = 133;
     79 		break;
     80 	case 214:
     81 	case 215:
     82 	case 162:
     83 	case 159:
     84 		position = 145;
     85 		break;
     86 	case 232:
     87 		position = FINAL;
     88 		break;
     89 	case 3:
     90 		position = 1;
     91 		break;
     92 	case 172:
     93 		position = 201;
     94 	}
     95 	puts("Ahhhhhhh...");
     96 	injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1;
     97 	for (n = 0; n < NUMOFOBJECTS; n++)
     98 		if (testbit(inven, n)) {
     99 			clearbit(inven, n);
    100 			setbit(location[position].objects, n);
    101 		}
    102 	carrying = 0;
    103 	encumber = 0;
    104 	return (0);
    105 }
    106 
    107 void
    108 bury(void)
    109 {
    110 	int     value;
    111 
    112 	if (testbit(inven, SHOVEL)) {
    113 		while (wordtype[++wordnumber] != OBJECT &&
    114 		    wordtype[wordnumber] != NOUNS && wordnumber < wordcount)
    115 			continue;
    116 		value = wordvalue[wordnumber];
    117 		if (wordtype[wordnumber] == NOUNS &&
    118 		    (testbit(location[position].objects, value) ||
    119 		    value == BODY))
    120 			switch (value) {
    121 			case BODY:
    122 				wordtype[wordnumber] = OBJECT;
    123 				if (testbit(inven, MAID) ||
    124 				    testbit(location[position].objects, MAID))
    125 					value = MAID;
    126 				if (testbit(inven, DEADWOOD) ||
    127 				    testbit(location[position].objects,
    128 					DEADWOOD))
    129 					value = DEADWOOD;
    130 				if (testbit(inven, DEADGOD) ||
    131 				    testbit(location[position].objects,
    132 					DEADGOD))
    133 					value = DEADGOD;
    134 				if (testbit(inven, DEADTIME) ||
    135 				    testbit(location[position].objects,
    136 					DEADTIME))
    137 					value = DEADTIME;
    138 				if (testbit(inven, DEADNATIVE) ||
    139 				    testbit(location[position].objects,
    140 					DEADNATIVE))
    141 					value = DEADNATIVE;
    142 				break;
    143 
    144 			case NATIVE:
    145 			case NORMGOD:
    146 				printf("She screams as you wrestle her into ");
    147 				puts("the hole.");
    148 				/* FALLTHROUGH */
    149 			case TIMER:
    150 				power += 7;
    151 				ego -= 10;
    152 				/* FALLTHROUGH */
    153 			case AMULET:
    154 			case MEDALION:
    155 			case TALISMAN:
    156 				wordtype[wordnumber] = OBJECT;
    157 				break;
    158 
    159 			default:
    160 				puts("Wha..?");
    161 			}
    162 		if (wordtype[wordnumber] == OBJECT && position > 88 &&
    163 		    (testbit(inven, value) ||
    164 		    testbit(location[position].objects, value))) {
    165 			puts("Buried.");
    166 			if (testbit(inven, value)) {
    167 				clearbit(inven, value);
    168 				carrying -= objwt[value];
    169 				encumber -= objcumber[value];
    170 			}
    171 			clearbit(location[position].objects, value);
    172 			switch (value) {
    173 			case MAID:
    174 			case DEADWOOD:
    175 			case DEADNATIVE:
    176 			case DEADTIME:
    177 			case DEADGOD:
    178 				ego += 2;
    179 				printf("The %s should rest easier now.\n",
    180 				    objsht[value]);
    181 			}
    182 		} else
    183 			puts("It doesn't seem to work.");
    184 	} else
    185 		puts("You aren't holding a shovel.");
    186 }
    187 
    188 void
    189 drink(void)
    190 {
    191 	int     n;
    192 
    193 	if (testbit(inven, POTION)) {
    194 		printf("The cool liquid runs down your throat but turns to ");
    195 		puts("fire and you choke.");
    196 		printf("The heat reaches your limbs and tingles your spirit.");
    197 		puts("  You feel like falling");
    198 		puts("asleep.");
    199 		clearbit(inven, POTION);
    200 		WEIGHT = MAXWEIGHT;
    201 		CUMBER = MAXCUMBER;
    202 		for (n = 0; n < NUMOFINJURIES; n++)
    203 			injuries[n] = 0;
    204 		ourtime++;
    205 		zzz();
    206 	} else
    207 		puts("I'm not thirsty.");
    208 }
    209 
    210 int
    211 shoot(void)
    212 {
    213 	int     firstnumber, value;
    214 
    215 	firstnumber = wordnumber;
    216 	if (!testbit(inven, LASER))
    217 		puts("You aren't holding a blaster.");
    218 	else {
    219 		wordnumber++;
    220 		while (wordnumber <= wordcount &&
    221 		    wordtype[wordnumber] == OBJECT) {
    222 			value = wordvalue[wordnumber];
    223 			printf("%s:\n", objsht[value]);
    224 			if (testbit(location[position].objects, value)) {
    225 				clearbit(location[position].objects, value);
    226 				ourtime++;
    227 				printf("The %s explode%s\n", objsht[value],
    228 				    (is_plural_object(value) ? "." : "s."));
    229 				if (value == BOMB)
    230 					die();
    231 			} else
    232 				printf("I don't see any %s around here.\n",
    233 				    objsht[value]);
    234 			if (wordnumber < wordcount - 1 &&
    235 			    wordvalue[++wordnumber] == AND)
    236 				wordnumber++;
    237 			else
    238 				return (firstnumber);
    239 		}
    240 		/* special cases with their own return()'s */
    241 
    242 		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
    243 			ourtime++;
    244 			switch (wordvalue[wordnumber]) {
    245 
    246 			case DOOR:
    247 				switch (position) {
    248 				case 189:
    249 				case 231:
    250 					puts("The door is unhinged.");
    251 					location[189].north = 231;
    252 					location[231].south = 189;
    253 					whichway(location[position]);
    254 					break;
    255 				case 30:
    256 					puts("The wooden door splinters.");
    257 					location[30].west = 25;
    258 					whichway(location[position]);
    259 					break;
    260 				case 31:
    261 					printf("The laser blast has no ");
    262 					puts("effect on the door.");
    263 					break;
    264 				case 20:
    265 					printf("The blast hits the door and ");
    266 					printf("it explodes into flame.  The ");
    267 					puts("magnesium burns");
    268 					printf("so rapidly that we have no ");
    269 					puts("chance to escape.");
    270 					die();
    271 				default:
    272 					puts("Nothing happens.");
    273 				}
    274 				break;
    275 
    276 			case NORMGOD:
    277 				if (testbit(location[position].objects,
    278 				    BATHGOD)) {
    279 					printf("The goddess is hit in the ");
    280 					printf("chest and splashes back ");
    281 					puts("against the rocks.");
    282 					printf("Dark blood oozes from the ");
    283 					printf("charred blast hole.  Her ");
    284 					puts("naked body floats in the");
    285 					puts("pools and then off downstream.");
    286 					clearbit(location[position].objects,
    287 					    BATHGOD);
    288 					setbit(location[180].objects, DEADGOD);
    289 					power += 5;
    290 					ego -= 10;
    291 					notes[JINXED]++;
    292 				} else
    293 					if (testbit(location[position].objects,
    294 					    NORMGOD)) {
    295 						printf("The blast catches ");
    296 						printf("the goddess in the ");
    297 						printf("stomach, knocking ");
    298 						puts("her to the ground.");
    299 						printf("She writhes in the ");
    300 						printf("dirt as the agony of ");
    301 						puts("death taunts her.");
    302 						puts("She has stopped moving.");
    303 						clearbit(location[position].objects, NORMGOD);
    304 						setbit(location[position].objects, DEADGOD);
    305 						power += 5;
    306 						ego -= 10;
    307 						notes[JINXED]++;
    308 						if (wintime)
    309 							live();
    310 						break;
    311 					} else {
    312 						printf("I don't see any ");
    313 						puts("goddess around here.");
    314 					}
    315 				break;
    316 
    317 			case TIMER:
    318 				if (testbit(location[position].objects,
    319 				    TIMER)) {
    320 					printf("The old man slumps over ");
    321 					puts("the bar.");
    322 					power++;
    323 					ego -= 2;
    324 					notes[JINXED]++;
    325 					clearbit(location[position].objects,
    326 					    TIMER);
    327 					setbit(location[position].objects,
    328 					    DEADTIME);
    329 				} else
    330 					puts("What old-timer?");
    331 				break;
    332 			case MAN:
    333 				if (testbit(location[position].objects, MAN)) {
    334 					printf("The man falls to the ground ");
    335 					printf("with blood pouring all over ");
    336 					puts("his white suit.");
    337 					puts("Your fantasy is over.");
    338 					die();
    339 				} else
    340 					puts("What man?");
    341 				break;
    342 			case NATIVE:
    343 				if (testbit(location[position].objects,
    344 				    NATIVE)) {
    345 					printf("The girl is blown backwards ");
    346 					printf("several feet and lies in a ");
    347 					puts("pool of blood.");
    348 					clearbit(location[position].objects,
    349 					    NATIVE);
    350 					setbit(location[position].objects,
    351 					    DEADNATIVE);
    352 					power += 5;
    353 					ego -= 2;
    354 					notes[JINXED]++;
    355 				} else
    356 					puts("There is no girl here.");
    357 				break;
    358 			case -1:
    359 				puts("Shoot what?");
    360 				break;
    361 
    362 			default:
    363 				printf("You can't shoot the %s.\n",
    364 				    objsht[wordvalue[wordnumber]]);
    365 			}
    366 		} else
    367 			puts("You must be a looney.");
    368 	}
    369 	return (firstnumber);
    370 }
    371