xref: /netbsd-src/games/battlestar/command3.c (revision 1182a44c59cae4d586117d55eca24b4b8b173211)
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
dig(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
jump(void)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
bury(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
drink(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
shoot(void)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