xref: /netbsd/games/battlestar/command3.c (revision 6550d01e)
1 /*	$NetBSD: command3.c,v 1.3 2005/07/01 06:04:54 jmc 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.3 2005/07/01 06:04:54 jmc 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 			case TIMER:
149 				power += 7;
150 				ego -= 10;
151 			case AMULET:
152 			case MEDALION:
153 			case TALISMAN:
154 				wordtype[wordnumber] = OBJECT;
155 				break;
156 
157 			default:
158 				puts("Wha..?");
159 			}
160 		if (wordtype[wordnumber] == OBJECT && position > 88 &&
161 		    (testbit(inven, value) ||
162 		    testbit(location[position].objects, value))) {
163 			puts("Buried.");
164 			if (testbit(inven, value)) {
165 				clearbit(inven, value);
166 				carrying -= objwt[value];
167 				encumber -= objcumber[value];
168 			}
169 			clearbit(location[position].objects, value);
170 			switch (value) {
171 			case MAID:
172 			case DEADWOOD:
173 			case DEADNATIVE:
174 			case DEADTIME:
175 			case DEADGOD:
176 				ego += 2;
177 				printf("The %s should rest easier now.\n",
178 				    objsht[value]);
179 			}
180 		} else
181 			puts("It doesn't seem to work.");
182 	} else
183 		puts("You aren't holding a shovel.");
184 }
185 
186 void
187 drink(void)
188 {
189 	int     n;
190 
191 	if (testbit(inven, POTION)) {
192 		printf("The cool liquid runs down your throat but turns to ");
193 		puts("fire and you choke.");
194 		printf("The heat reaches your limbs and tingles your spirit.");
195 		puts("  You feel like falling");
196 		puts("asleep.");
197 		clearbit(inven, POTION);
198 		WEIGHT = MAXWEIGHT;
199 		CUMBER = MAXCUMBER;
200 		for (n = 0; n < NUMOFINJURIES; n++)
201 			injuries[n] = 0;
202 		ourtime++;
203 		zzz();
204 	} else
205 		puts("I'm not thirsty.");
206 }
207 
208 int
209 shoot(void)
210 {
211 	int     firstnumber, value;
212 
213 	firstnumber = wordnumber;
214 	if (!testbit(inven, LASER))
215 		puts("You aren't holding a blaster.");
216 	else {
217 		wordnumber++;
218 		while (wordnumber <= wordcount &&
219 		    wordtype[wordnumber] == OBJECT) {
220 			value = wordvalue[wordnumber];
221 			printf("%s:\n", objsht[value]);
222 			if (testbit(location[position].objects, value)) {
223 				clearbit(location[position].objects, value);
224 				ourtime++;
225 				printf("The %s explode%s\n", objsht[value],
226 				    (is_plural_object(value) ? "." : "s."));
227 				if (value == BOMB)
228 					die();
229 			} else
230 				printf("I don't see any %s around here.\n",
231 				    objsht[value]);
232 			if (wordnumber < wordcount - 1 &&
233 			    wordvalue[++wordnumber] == AND)
234 				wordnumber++;
235 			else
236 				return (firstnumber);
237 		}
238 		/* special cases with their own return()'s */
239 
240 		if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) {
241 			ourtime++;
242 			switch (wordvalue[wordnumber]) {
243 
244 			case DOOR:
245 				switch (position) {
246 				case 189:
247 				case 231:
248 					puts("The door is unhinged.");
249 					location[189].north = 231;
250 					location[231].south = 189;
251 					whichway(location[position]);
252 					break;
253 				case 30:
254 					puts("The wooden door splinters.");
255 					location[30].west = 25;
256 					whichway(location[position]);
257 					break;
258 				case 31:
259 					printf("The laser blast has no ");
260 					puts("effect on the door.");
261 					break;
262 				case 20:
263 					printf("The blast hits the door and ");
264 					printf("it explodes into flame.  The ");
265 					puts("magnesium burns");
266 					printf("so rapidly that we have no ");
267 					puts("chance to escape.");
268 					die();
269 				default:
270 					puts("Nothing happens.");
271 				}
272 				break;
273 
274 			case NORMGOD:
275 				if (testbit(location[position].objects,
276 				    BATHGOD)) {
277 					printf("The goddess is hit in the ");
278 					printf("chest and splashes back ");
279 					puts("against the rocks.");
280 					printf("Dark blood oozes from the ");
281 					printf("charred blast hole.  Her ");
282 					puts("naked body floats in the");
283 					puts("pools and then off downstream.");
284 					clearbit(location[position].objects,
285 					    BATHGOD);
286 					setbit(location[180].objects, DEADGOD);
287 					power += 5;
288 					ego -= 10;
289 					notes[JINXED]++;
290 				} else
291 					if (testbit(location[position].objects,
292 					    NORMGOD)) {
293 						printf("The blast catches ");
294 						printf("the goddess in the ");
295 						printf("stomach, knocking ");
296 						puts("her to the ground.");
297 						printf("She writhes in the ");
298 						printf("dirt as the agony of ");
299 						puts("death taunts her.");
300 						puts("She has stopped moving.");
301 						clearbit(location[position].objects, NORMGOD);
302 						setbit(location[position].objects, DEADGOD);
303 						power += 5;
304 						ego -= 10;
305 						notes[JINXED]++;
306 						if (wintime)
307 							live();
308 						break;
309 					} else
310 						printf("I don't see any ");
311 						puts("goddess around here.");
312 				break;
313 
314 			case TIMER:
315 				if (testbit(location[position].objects,
316 				    TIMER)) {
317 					printf("The old man slumps over ");
318 					puts("the bar.");
319 					power++;
320 					ego -= 2;
321 					notes[JINXED]++;
322 					clearbit(location[position].objects,
323 					    TIMER);
324 					setbit(location[position].objects,
325 					    DEADTIME);
326 				} else
327 					puts("What old-timer?");
328 				break;
329 			case MAN:
330 				if (testbit(location[position].objects, MAN)) {
331 					printf("The man falls to the ground ");
332 					printf("with blood pouring all over ");
333 					puts("his white suit.");
334 					puts("Your fantasy is over.");
335 					die();
336 				} else
337 					puts("What man?");
338 				break;
339 			case NATIVE:
340 				if (testbit(location[position].objects,
341 				    NATIVE)) {
342 					printf("The girl is blown backwards ");
343 					printf("several feet and lies in a ");
344 					puts("pool of blood.");
345 					clearbit(location[position].objects,
346 					    NATIVE);
347 					setbit(location[position].objects,
348 					    DEADNATIVE);
349 					power += 5;
350 					ego -= 2;
351 					notes[JINXED]++;
352 				} else
353 					puts("There is no girl here.");
354 				break;
355 			case -1:
356 				puts("Shoot what?");
357 				break;
358 
359 			default:
360 				printf("You can't shoot the %s.\n",
361 				    objsht[wordvalue[wordnumber]]);
362 			}
363 		} else
364 			puts("You must be a looney.");
365 	}
366 	return (firstnumber);
367 }
368